From 3308de49adfdb2a55c646e6b675da998f2c36900 Mon Sep 17 00:00:00 2001 From: eunhhu Date: Mon, 28 Sep 2026 19:42:27 +0100 Subject: Remember each sender's secret beside the node's key: no X25519 at restart A listener lets a quiet sender's secret go with its active state, so a node started again made one X25519 for every sender that came back (169 us on this Pi, most of a wake's CPU): asymmetric work in proportion to the links, which design 011 counts as a reason to design again. The secret is now remembered in a file beside the key (KEY.links, 0600, begun again for another node's key): a place of 64 bytes a sender in the order allowed, mapped, so a sender at rest takes no memory for it. A place is the first 28 bytes of the sender's key, a check (FNV-1a of the key and the secret) and the secret, written secret first and key last; a place whose check fails is made again. The UDP link checks see a receiver started again make no X25519. --- tests/check.py | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) (limited to 'tests/check.py') diff --git a/tests/check.py b/tests/check.py index e46622b..7be32d7 100644 --- a/tests/check.py +++ b/tests/check.py @@ -784,7 +784,9 @@ def server_links_udp(aup, pure, work, netem=None): delays, loses and reorders packets meanwhile. The receiver takes its senders from a file (--senders, the sender among a thousand others) and lets a sender's keys and streams go after 400 ms of quiet - (--link-idle-ms): the order after a longer pause arrives all the same.""" + (--link-idle-ms): the order after a longer pause arrives all the same. + Started again, it makes no X25519: the secret is remembered beside its + key (KEY.links).""" import select import signal import socket @@ -903,11 +905,14 @@ def server_links_udp(aup, pure, work, netem=None): _, error = process.communicate(timeout=30) assert process.returncode == 0, error[-1000:] stats[name] = [json.loads(line) for line in error.decode().splitlines() if line.startswith('{"active"')][-1] + # The receiver, started again, remembered the sender's secret: no X25519 for it. assert stats['b']['listener_swept'] >= 1 and stats['b']['listener_woken'] >= 2, stats['b'] + assert stats['b']['listener_remembered'] == stats['b']['listener_woken'], stats['b'] return {'orders': sent, 'acknowledged_total': sum(acknowledged), 'packets_after_restart': stats['a']['link_packets'], 'resent_after_restart': stats['a']['link_resent'], 'lost_after_restart': stats['a']['link_lost'], 'received_after_restart': stats['b']['listener_received'], - 'woken_after_restart': stats['b']['listener_woken'], 'swept_after_restart': stats['b']['listener_swept']} + 'woken_after_restart': stats['b']['listener_woken'], 'swept_after_restart': stats['b']['listener_swept'], + 'remembered_after_restart': stats['b']['listener_remembered']} def server_links_udp_lossy(aup, pure, work): -- cgit v1.2.3