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()