openoperator / helpers /crypto.py
OpenOperator Deployer
Deploy source revision ef73a4b421f2d1ececca20f99c9118f4621c5e28
6918275
Raw History Blame Contribute Delete
1.89 kB
import hashlib
import hmac
from cryptography.hazmat.primitives.asymmetric import rsa, padding
from cryptography.hazmat.primitives import serialization, hashes
import os
def hash_data(data: str, password: str):
return hmac.new(password.encode(), data.encode(), hashlib.sha256).hexdigest()
def verify_data(data: str, hash: str, password: str):
return hash_data(data, password) == hash
def _generate_private_key():
return rsa.generate_private_key(
public_exponent=65537,
key_size=2048,
)
def _generate_public_key(private_key: rsa.RSAPrivateKey):
return (
private_key.public_key()
.public_bytes(
encoding=serialization.Encoding.PEM,
format=serialization.PublicFormat.SubjectPublicKeyInfo,
)
.hex()
)
def _decode_public_key(public_key: str) -> rsa.RSAPublicKey:
# Decode hex string back to bytes
pem_bytes = bytes.fromhex(public_key)
# Load the PEM public key
key = serialization.load_pem_public_key(pem_bytes)
if not isinstance(key, rsa.RSAPublicKey):
raise TypeError("The provided key is not an RSAPublicKey")
return key
def encrypt_data(data: str, public_key_pem: str):
return _encrypt_data(data.encode("utf-8"), _decode_public_key(public_key_pem))
def _encrypt_data(data: bytes, public_key: rsa.RSAPublicKey):
b = public_key.encrypt(
data,
padding.OAEP(
mgf=padding.MGF1(algorithm=hashes.SHA256()),
algorithm=hashes.SHA256(),
label=None,
),
)
return b.hex()
def decrypt_data(data: str, private_key: rsa.RSAPrivateKey):
b = private_key.decrypt(
bytes.fromhex(data),
padding.OAEP(
mgf=padding.MGF1(algorithm=hashes.SHA256()),
algorithm=hashes.SHA256(),
label=None,
),
)
return b.decode("utf-8")