|
|
@@ -33,7 +33,7 @@ class ApiCryptoTests(unittest.TestCase):
|
|
|
plain = api_crypto.decrypt_json(cipher, key)
|
|
|
self.assertEqual(plain, payload)
|
|
|
|
|
|
- def test_encrypt_decrypt_roundtrip_cbc(self):
|
|
|
+ def test_decrypt_rejects_tampered_gcm_ciphertext(self):
|
|
|
key = api_crypto.derive_key(
|
|
|
fixed_secret="fixed-secret",
|
|
|
user_id="u1",
|
|
|
@@ -41,9 +41,13 @@ class ApiCryptoTests(unittest.TestCase):
|
|
|
nonce="nonce-2",
|
|
|
)
|
|
|
payload = {"list": [1, 2, 3], "ok": True}
|
|
|
- cipher = api_crypto.encrypt_json(payload, key, alg="cbc")
|
|
|
- plain = api_crypto.decrypt_json(cipher, key, alg="cbc")
|
|
|
- self.assertEqual(plain, payload)
|
|
|
+ cipher = api_crypto.encrypt_json(payload, key)
|
|
|
+ raw = bytearray(api_crypto._b64url_decode(cipher))
|
|
|
+ raw[-1] ^= 1
|
|
|
+ tampered = api_crypto._b64url_encode(bytes(raw))
|
|
|
+
|
|
|
+ with self.assertRaises(api_crypto.ApiCryptoError):
|
|
|
+ api_crypto.decrypt_json(tampered, key)
|
|
|
|
|
|
|
|
|
if __name__ == "__main__":
|