diff --git a/app/main.py b/app/main.py index a30d205..29e5c95 100644 --- a/app/main.py +++ b/app/main.py @@ -4,10 +4,9 @@ from calendar import timegm from contextlib import asynccontextmanager from datetime import datetime, timedelta, UTC from hashlib import sha256 -from json import loads as json_loads +from json import loads as json_loads, dumps as json_dumps from os import getenv as env from os.path import join, dirname, isfile -from random import randbytes from uuid import uuid4 from dateutil.relativedelta import relativedelta @@ -728,7 +727,8 @@ async def leasing_v1_lessor(request: Request): logger.debug(response) - signature = f'b\'{randbytes(256).hex()}\'' + signature = INSTANCE_KEY_RSA.generate_signature(json_dumps(response).encode('utf-8')) + signature = f'b\'{signature.hex()}\'' return JSONr(response, headers={'access-control-expose-headers': 'X-NLS-Signature', 'X-NLS-Signature': signature}) @@ -780,7 +780,8 @@ async def leasing_v1_lease_renew(request: Request, lease_ref: str): Lease.renew(db, entity, expires, cur_time) - signature = f'b\'{randbytes(256).hex()}\'' + signature = INSTANCE_KEY_RSA.generate_signature(json_dumps(response).encode('utf-8')) + signature = f'b\'{signature.hex()}\'' return JSONr(response, headers={'access-control-expose-headers': 'X-NLS-Signature', 'X-NLS-Signature': signature}) diff --git a/app/util.py b/app/util.py index a8288de..c5b0187 100644 --- a/app/util.py +++ b/app/util.py @@ -1,7 +1,9 @@ import logging - +from json import loads as json_loads from cryptography.hazmat.primitives import serialization +from cryptography.hazmat.primitives.asymmetric.padding import PKCS1v15 from cryptography.hazmat.primitives.asymmetric.rsa import RSAPrivateKey, RSAPublicKey, generate_private_key +from cryptography.hazmat.primitives.hashes import SHA256 from cryptography.hazmat.primitives.serialization import load_pem_private_key, load_pem_public_key from cryptography.x509 import load_pem_x509_certificate, Certificate @@ -40,6 +42,9 @@ class PrivateKey: ) return PublicKey(data=data) + def generate_signature(self, data: bytes) -> bytes: + return self.__key.sign(data, PKCS1v15(), SHA256()) + @staticmethod def generate(public_exponent: int = 65537, key_size: int = 2048) -> "PrivateKey": log = logging.getLogger(__name__)