Metadata-Version: 2.1
Name: sberbank-async-cryptography
Version: 1.0.0
Summary: Python implementation of Sberbank signature verification (using async cryptography).
Home-page: https://github.com/egorgvo/sberbank_callback_async_cryptography
Author: Egor Gvo
Author-email: work.egvo@ya.ru
License: MIT
Platform: UNKNOWN
Classifier: License :: OSI Approved :: MIT License
Classifier: Programming Language :: Python :: 3
Description-Content-Type: text/markdown
Requires-Dist: pycryptodomex (==3.9.8)
Requires-Dist: cryptography (==3.0)

# Sberbank signature verification using async cryptography

The code of keys generation and message signing and signature verification is universal, 
it is not only Sberbank-compatible. You can use it for your own purposes. 
However there is a `sberbank_tools` module that consist sberbank-specific functions.

The repo is open for pull requests. The author will be glad to hear some good feedback from you.

## Python version

Python version that has been used while coding is 3.8. Other versions has not been tested but they might work.

## Installation

```bash
pip install -i sberbank_callback_async_cryptography
```

## Flask example

```python
import os
from dotenv import load_dotenv

from flask import request
from flask_restful import Resource
from sb_async_cryptography.sberbank_tools import verify_signature, params_get_checksum
from sb_async_cryptography.signature import public_key_import_from_x509_certificate_file

load_dotenv()
SBERBANK_PUBLIC_KEY_FILE = os.getenv('SBERBANK_PUBLIC_KEY_FILE')
pub_key = public_key_import_from_x509_certificate_file(SBERBANK_PUBLIC_KEY_FILE)


class Notification(Resource):

    def get(self):
        """Status change notification from Sberbank"""
        params = request.args
        signature = params_get_checksum(params)
        if not verify_signature(pub_key, signature, params):
            return {"errors": "Signature verification failed."}, 400

        # some other code here
```

## FastAPI example

```python
import os
from dotenv import load_dotenv

from fastapi import Request
from sb_async_cryptography.sberbank_tools import verify_signature, params_get_checksum
from sb_async_cryptography.signature import public_key_import_from_x509_certificate_file
from starlette.responses import JSONResponse

load_dotenv()
SBERBANK_PUBLIC_KEY_FILE = os.getenv('SBERBANK_PUBLIC_KEY_FILE')
pub_key = public_key_import_from_x509_certificate_file(SBERBANK_PUBLIC_KEY_FILE)


async def notification(request: Request):
    """Status change notification from Sberbank"""
    params = dict(request.query_params)
    signature = params_get_checksum(params)
    if not verify_signature(pub_key, signature, params):
        return JSONResponse(status_code=400, content={"errors": "Signature verification failed."})

    # some other code here
```


