mirror of
https://github.com/slackhq/nebula.git
synced 2026-11-15 15:16:52 +01:00
Document remembering answered msg1s and crossing attempts
This commit is contained in:
1 parent
5edcaefa33
commit
19578b3b6b
1 file changed
+13
-3
+13
-3
@@ -174,6 +174,10 @@ flynn/noise) before this can merge.
|
||||
- **Lost confirmation.** A msg3 fragment for a v3 tunnel the responder already completed means the
|
||||
initiator is still waiting, so the responder confirms again, at most once per retry interval and
|
||||
only to the tunnel's own remote, never to the fragment's source.
|
||||
- **Crossing attempts.** The initiator's classical attempt can reach the responder, which
|
||||
completes it at once, while the hybrid handshake still waits for msg3. If the initiator got the
|
||||
hybrid msg2 first it has committed to hybrid and sends msg3, so the responder takes the hybrid
|
||||
tunnel even though the classical one is newer, rather than rejecting it as too old.
|
||||
- **A failed attempt.** A post-quantum attempt can fail fatally where the classical one would not,
|
||||
for example a v3 certificate from a CA the initiator trusts only in its v2 form. The failed
|
||||
attempt is dropped and the handshake continues classical. With `require` the handshake ends.
|
||||
@@ -278,9 +282,15 @@ Implemented in `handshake/fragment` (`Sender`, `Assembly`, and the capped `Table
|
||||
however many repair symbols arrive.
|
||||
- When K symbols are present the message is decoded and handed to the handshake `Machine`
|
||||
as a synthetic `[header | message]`. The Machine never sees fragments.
|
||||
- A completed entry is forgotten immediately. A late duplicate fragment starts a new entry
|
||||
and, once enough arrive, reconstructs the same message again; the handshake layer's
|
||||
duplicate detection recognises it.
|
||||
- A completed message the responder answered is remembered without its symbols, outside the
|
||||
memory and per-source caps, for the idle timeout: which symbol indexes it has seen, and its
|
||||
hash. Fragments still trailing the attempt that completed it are counted and dropped. Once as
|
||||
many new symbols as it has data symbols arrive, which only a retry offers, it is reported as a
|
||||
repeat and the cached response is resent. Without this, the repair fragments trailing a msg1
|
||||
whose data fragments already completed it open an entry that for K above the repair count can
|
||||
never complete, and back to back handshakes from one source run into its quota (seen on real
|
||||
hosts: the fifth hybrid handshake within 3 s fell back to classical). A message that decoded
|
||||
but was not answered is forgotten, and the next attempt rebuilds it.
|
||||
- If Noise rejects a decoded message, the entry is discarded and the next attempt
|
||||
supplies fresh symbols. (Possible refinement: keep a few spare symbols so an injected
|
||||
bad symbol can be identified by re-encoding instead of waiting for a retry.)
|
||||
|
||||
Reference in new issue
Block a user