"""Tests for i2p_crypto ElGamal — 2048-bit encryption/decryption.""" import pytest class TestElGamalEngine: def test_encrypt_decrypt_roundtrip(self): from i2p_crypto.elgamal import ElGamalEngine pub, priv = ElGamalEngine.generate_keypair() data = b"Hello, ElGamal!" ct = ElGamalEngine.encrypt(data, pub) assert len(ct) == 514 pt = ElGamalEngine.decrypt(ct, priv) assert pt == data def test_encrypt_decrypt_empty(self): from i2p_crypto.elgamal import ElGamalEngine pub, priv = ElGamalEngine.generate_keypair() ct = ElGamalEngine.encrypt(b"", pub) pt = ElGamalEngine.decrypt(ct, priv) assert pt == b"" def test_encrypt_decrypt_max_size(self): from i2p_crypto.elgamal import ElGamalEngine, MAX_CLEARTEXT pub, priv = ElGamalEngine.generate_keypair() data = b"X" * MAX_CLEARTEXT ct = ElGamalEngine.encrypt(data, pub) pt = ElGamalEngine.decrypt(ct, priv) assert pt == data def test_reject_oversized_data(self): from i2p_crypto.elgamal import ElGamalEngine, MAX_CLEARTEXT pub, _ = ElGamalEngine.generate_keypair() with pytest.raises(ValueError): ElGamalEngine.encrypt(b"X" * (MAX_CLEARTEXT + 1), pub) def test_ciphertext_size(self): from i2p_crypto.elgamal import ElGamalEngine, CIPHERTEXT_SIZE pub, _ = ElGamalEngine.generate_keypair() ct = ElGamalEngine.encrypt(b"test", pub) assert len(ct) == CIPHERTEXT_SIZE def test_wrong_key_fails(self): from i2p_crypto.elgamal import ElGamalEngine pub1, priv1 = ElGamalEngine.generate_keypair() _, priv2 = ElGamalEngine.generate_keypair() ct = ElGamalEngine.encrypt(b"secret", pub1) pt = ElGamalEngine.decrypt(ct, priv2) assert pt is None # Hash mismatch def test_corrupted_ciphertext_fails(self): from i2p_crypto.elgamal import ElGamalEngine pub, priv = ElGamalEngine.generate_keypair() ct = bytearray(ElGamalEngine.encrypt(b"test", pub)) ct[100] ^= 0xFF pt = ElGamalEngine.decrypt(bytes(ct), priv) assert pt is None def test_wrong_size_ciphertext(self): from i2p_crypto.elgamal import ElGamalEngine _, priv = ElGamalEngine.generate_keypair() assert ElGamalEngine.decrypt(b"too short", priv) is None def test_randomized_ciphertext(self): """Same plaintext should produce different ciphertext each time.""" from i2p_crypto.elgamal import ElGamalEngine pub, _ = ElGamalEngine.generate_keypair() ct1 = ElGamalEngine.encrypt(b"same", pub) ct2 = ElGamalEngine.encrypt(b"same", pub) assert ct1 != ct2 def test_key_sizes(self): from i2p_crypto.elgamal import ElGamalEngine pub, priv = ElGamalEngine.generate_keypair() assert len(pub) == 256 assert len(priv) == 256 def test_various_data_sizes(self): from i2p_crypto.elgamal import ElGamalEngine pub, priv = ElGamalEngine.generate_keypair() for size in [1, 10, 50, 100, 200, 222]: data = bytes(range(size % 256)) * (size // 256 + 1) data = data[:size] ct = ElGamalEngine.encrypt(data, pub) pt = ElGamalEngine.decrypt(ct, priv) assert pt == data, f"Failed for size {size}"