Saba-python/tests/test_symmetric_crypto.py
2026-03-27 19:20:38 +03:30

52 lines
1.6 KiB
Python

import hashlib
import unittest
import unicodedata
from cryptography.hazmat.primitives.ciphers.aead import AESGCM
from secure_sms.core.security import SymmetricCryptoService, b64u_encode
def _encrypt_for_key_text(message: str, key_text: str) -> str:
key = hashlib.sha256(key_text.encode("utf-8")).digest()
nonce = bytes(range(12))
ciphertext = AESGCM(key).encrypt(nonce, message.encode("utf-8"), None)
return b64u_encode(nonce + ciphertext)
class SymmetricCryptoInteropTests(unittest.TestCase):
def setUp(self):
self.service = SymmetricCryptoService()
def test_encrypts_new_hex_transport(self):
payload = self.service.encrypt_symmetric("hex transport", "shared-key-123")
self.assertTrue(payload.startswith("h1:"))
self.assertEqual(
self.service.decrypt_symmetric(payload, "shared-key-123"),
"hex transport",
)
def test_decrypts_flutter_style_payload(self):
key = " shared-key-123 "
payload = _encrypt_for_key_text("hello from flutter", key.strip())
self.assertEqual(
self.service.decrypt_symmetric(payload, key),
"hello from flutter",
)
def test_decrypts_legacy_python_nfc_payload(self):
raw_key = "Cafe\u0301-123"
legacy_python_key = unicodedata.normalize("NFC", raw_key.strip())
payload = _encrypt_for_key_text("legacy payload", legacy_python_key)
self.assertEqual(
self.service.decrypt_symmetric(payload, raw_key),
"legacy payload",
)
if __name__ == "__main__":
unittest.main()