from __future__ import annotations import base64 import hashlib from cryptography.fernet import Fernet, InvalidToken def make_fernet(encryption_key: str) -> Fernet: digest = hashlib.sha256(encryption_key.encode("utf-8")).digest() key = base64.urlsafe_b64encode(digest) return Fernet(key) def encrypt_token(encryption_key: str, plaintext: str) -> str: return make_fernet(encryption_key).encrypt(plaintext.encode("utf-8")).decode("ascii") def decrypt_token(encryption_key: str, ciphertext: str) -> str | None: try: return make_fernet(encryption_key).decrypt(ciphertext.encode("ascii")).decode("utf-8") except InvalidToken: return None