"""Tests for AES padding and SessionTagManager.""" import os from i2p_crypto.garlic_crypto import ( apply_aes_padding, verify_aes_padding, SessionTagManager, ) def test_aes_padding_roundtrip(): payload = b"Hello, I2P garlic!" padded = apply_aes_padding(payload) assert len(padded) % 16 == 0 recovered = verify_aes_padding(padded) assert recovered == payload def test_aes_padding_empty(): padded = apply_aes_padding(b"") assert len(padded) % 16 == 0 assert verify_aes_padding(padded) == b"" def test_aes_padding_checksum_mismatch(): padded = bytearray(apply_aes_padding(b"data")) # Corrupt last byte (part of checksum) padded[-1] ^= 0xFF assert verify_aes_padding(bytes(padded)) is None def test_aes_padding_large_payload(): payload = os.urandom(1000) padded = apply_aes_padding(payload) assert len(padded) % 16 == 0 assert verify_aes_padding(padded) == payload def test_tag_bundle_generation(): stm = SessionTagManager() key = os.urandom(32) tags = stm.generate_tag_bundle(key, count=5) assert len(tags) == 5 assert stm.remaining_tags(key) == 5 def test_tag_consumption(): stm = SessionTagManager() key = os.urandom(32) stm.generate_tag_bundle(key, count=3) tag1 = stm.consume_tag(key) assert tag1 is not None assert len(tag1) == 32 assert stm.remaining_tags(key) == 2 def test_tag_consume_empty(): stm = SessionTagManager() key = os.urandom(32) assert stm.consume_tag(key) is None def test_tag_receive_and_consume(): stm = SessionTagManager() key = os.urandom(32) tags = [os.urandom(32) for _ in range(3)] stm.receive_tags(key, tags) assert stm.remaining_tags(key) == 3 consumed = stm.consume_tag(key) assert consumed == tags[0] def test_tag_replenishment_threshold(): stm = SessionTagManager() key = os.urandom(32) assert stm.should_replenish(key) is True # 0 tags stm.generate_tag_bundle(key, count=15) assert stm.should_replenish(key) is False # 15 tags > 10 def test_max_tags_limit(): stm = SessionTagManager(max_tags_per_session=10) key = os.urandom(32) stm.generate_tag_bundle(key, count=15) assert stm.remaining_tags(key) == 10 # capped at max