43 lines
1.4 KiB
Python
43 lines
1.4 KiB
Python
"""ACK-hash stability across retry rebuilds.
|
|
|
|
The retry scheduler must be able to recompute the expected ACK CRC using the
|
|
same plaintext (ts + attempt byte + text) that the receiver will compute against.
|
|
"""
|
|
|
|
from __future__ import annotations
|
|
|
|
from orac.crypto import build_peer_plaintext
|
|
from orac.meshcore import compute_ack_hash
|
|
|
|
|
|
def test_ack_hash_stable_for_same_inputs() -> None:
|
|
ts = 1700000000
|
|
pt1 = build_peer_plaintext("hello", ts=ts, attempt=0)
|
|
pt2 = build_peer_plaintext("hello", ts=ts, attempt=0)
|
|
sender = b"\x11" * 32
|
|
assert compute_ack_hash(pt1, sender) == compute_ack_hash(pt2, sender)
|
|
|
|
|
|
def test_ack_hash_changes_with_attempt_byte() -> None:
|
|
ts = 1700000000
|
|
pt0 = build_peer_plaintext("hello", ts=ts, attempt=0)
|
|
pt1 = build_peer_plaintext("hello", ts=ts, attempt=1)
|
|
sender = b"\x22" * 32
|
|
assert compute_ack_hash(pt0, sender) != compute_ack_hash(pt1, sender)
|
|
|
|
|
|
def test_ack_hash_changes_with_text() -> None:
|
|
ts = 1700000000
|
|
sender = b"\x33" * 32
|
|
a = compute_ack_hash(build_peer_plaintext("hello", ts=ts, attempt=0), sender)
|
|
b = compute_ack_hash(build_peer_plaintext("world", ts=ts, attempt=0), sender)
|
|
assert a != b
|
|
|
|
|
|
def test_ack_hash_changes_with_sender() -> None:
|
|
ts = 1700000000
|
|
pt = build_peer_plaintext("hello", ts=ts, attempt=0)
|
|
a = compute_ack_hash(pt, b"\x44" * 32)
|
|
b = compute_ack_hash(pt, b"\x55" * 32)
|
|
assert a != b
|