puncture/tests/test_puncture_manager.py

90 lines
2.9 KiB
Python

from puncture.key_manager import (
PATH_BITS,
PuncturableKeyManager,
provider_id_to_prefix,
tag_to_binary_path,
)
def test_mapping_and_derivation_roundtrip() -> None:
manager = PuncturableKeyManager(master_seed=b"\x11" * 32)
path = tag_to_binary_path(42, 123)
key = manager.get_key_for_tag(path)
assert key is not None
assert len(key) == 32
def test_scenario_a_provider_42_then_puncture() -> None:
manager = PuncturableKeyManager(master_seed=b"\x22" * 32)
path = tag_to_binary_path(42, 999)
key_before = manager.get_key_for_tag(path)
assert key_before is not None
punctured = manager.puncture(path)
assert punctured is True
assert manager.get_key_for_tag(path) is None
def test_non_target_paths_still_accessible_after_puncture() -> None:
manager = PuncturableKeyManager(master_seed=b"\x33" * 32)
target = tag_to_binary_path(42, 12345)
other = tag_to_binary_path(42, 12346)
other_before = manager.get_key_for_tag(other)
manager.puncture(target)
other_after = manager.get_key_for_tag(other)
assert manager.get_key_for_tag(target) is None
assert other_before == other_after
def test_minimal_copath_replacement_from_root() -> None:
manager = PuncturableKeyManager(master_seed=b"\x44" * 32)
path = tag_to_binary_path(1, 1)
assert manager.active_node_count == 1
manager.puncture(path)
# Remove root (1) and add one sibling node per level (32).
assert manager.active_node_count == PATH_BITS
def test_scenario_b_seized_state_cannot_recover_punctured() -> None:
manager = PuncturableKeyManager(master_seed=b"\x55" * 32)
punctured = tag_to_binary_path(42, 2024)
control = tag_to_binary_path(42, 2025)
control_before = manager.get_key_for_tag(control)
manager.puncture(punctured)
seized = PuncturableKeyManager.from_state(manager.export_state())
assert seized.get_key_for_tag(punctured) is None
assert seized.get_key_for_tag(control) == control_before
def test_provider_puncture_blocks_all_provider_keys() -> None:
manager = PuncturableKeyManager(master_seed=b"\x66" * 32)
p42_a = tag_to_binary_path(42, 100)
p42_b = tag_to_binary_path(42, 101)
p41 = tag_to_binary_path(41, 100)
p41_before = manager.get_key_for_tag(p41)
assert manager.puncture_provider(42) is True
assert manager.get_key_for_tag(p42_a) is None
assert manager.get_key_for_tag(p42_b) is None
assert manager.get_key_for_tag(p41) == p41_before
def test_prefix_puncture_log_replay() -> None:
seed = b"\x77" * 32
source = PuncturableKeyManager(master_seed=seed)
target = PuncturableKeyManager(master_seed=seed)
provider_prefix = provider_id_to_prefix(42)
source.puncture_prefix(provider_prefix)
applied = target.apply_puncture_log(source.puncture_log())
assert applied == 1
assert target.get_key_for_tag(tag_to_binary_path(42, 1234)) is None