52 lines
1.6 KiB
Python
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()
|