You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Material change: verify_fingerprint_either_epoch now derives
fingerprints against BOTH current AND previous session keys
unconditionally during the rekey grace window, combining the
constant-time compares with bitwise `|` on bool (not
short-circuiting ||). Closes a timing distinguisher the reviewer
flagged: the alpha.2 "try current, fall back on mismatch" logic
leaked which key-epoch signed the consent via verify-path latency
(one HKDF on match, two on mismatch). The extra HKDF call is only
paid during the grace window.
SPEC §12.3.1 rekey interaction now requires this behavior
normatively. Same subsection gains a "design-evolution" note
surfacing the shift from an earlier "bind to initial key" plan to
the shipped "bind to current key, both-key probe on verify" —
rationale: no wire-level representation of "initial"; preserving
it fights Zeroize; grace window bounds probe cost the same way it
bounds AEAD-verify.
Documentation tightening:
- §12.6 LegacyBypass bluntly flagged as intentional compatibility
mode. A LegacyBypass session silently discards valid consent
ceremonies by design; security-sensitive deployments MUST NOT
use it. Deployments landing on it by accident are strictly less
secure than deployments that opt into ceremony mode.
- Appendix A vectors 07/08 relabeled draft-03 (stale "draft-02"
caption — they were regenerated at draft-03 canonical bytes
in 0.2.0-alpha.1 already).
- plans/REVIEW_DELTA_DRAFT_03.md updated per reviewer feedback:
- "No other wire changes" reassurance near the top.
- 2.2 BE-request_id defense rewritten from "mixed-convention
mistake-reduction" to "domain-separated deterministic
encoding, not a semantic property of big-endian."
- 2.3 marked RESOLVED in alpha.3; narrowed to a reviewer-
confirmation question.
- 2.6 narrowed from open-ended coherence check to specific
"are there missing timing-channel sinks?" question.
- One-line rekey-design-evolution callout in §1.
No wire-format change. No API break. Peers on alpha.2 and
alpha.3 interoperate at the wire level.
106 tests green. Clippy clean (--all-features and
--no-default-features). `cargo package` unchanged in structure.
| 07 |`consent_request`| draft-03 ConsentRequest signed with deterministic Ed25519 seed; includes the mandatory `session_fingerprint`. |
1312
+
| 08 |`consent_response`| draft-03 ConsentResponse approving vector 07; distinct responder seed; shares the same `session_fingerprint` as 07. |
1272
1313
| 09 |`consent_revocation`| draft-03 ConsentRevocation signed by vector 08's responder; shares the session_fingerprint of 07 + 08. |
1273
1314
| 10 |`revocation_before_approval`| draft-03 event-sequence fixture: `ConsentViolation::RevocationBeforeApproval` from `AwaitingRequest` AND from `Requested`. |
1274
1315
| 11 |`contradictory_response`| draft-03 event-sequence fixture: `ConsentViolation::ContradictoryResponse` in both directions (prior=true→new=false and prior=false→new=true). |
0 commit comments