π Wave-32 β welcome_encrypted_group_info_aead + proposal_ref_collision (sub-tracker)
Anchor: ΟΒ² + Οβ»Β² = 3
Sub-tracker for the Wave-32 of the trios-chat protocol β two fresh
threat-model lanes following the W7..W31 canonical cadence.
1. Background
Wave-31 (PR #771,
merged 756cf35) closed KeyPackage init_key reuse + External PSK
identifier provenance, bringing the threat coverage to 60
categories / 288 Coq Qed / ~528 tests. Two uncovered MLS surfaces
remain right under the existing W31 ones:
- Welcome encrypted_group_info AEAD envelope (RFC 9420 Β§12.4.3)
β a hostile sender can publish a Welcome whose
encrypted_group_info AEAD envelope carries a non-12-byte
nonce, a sub-tag ciphertext, a foreign group_id, a stale
epoch, a previously-used (group_id, epoch, nonce) triple
(catastrophic AEAD nonce-misuse), or the all-zero AEAD nonce.
- ProposalRef collision (RFC 9420 Β§12.1.1) β a hostile member
can inject a Proposal carrying a non-canonical proposal_ref
length, an empty proposal_id, a proposal_ref never
provisioned in the local commit ledger, a foreign group_id,
a stale epoch, a replayed (group_id, epoch, proposal_ref)
triple, or the all-zero proposal_ref.
Both are MLS hazards independently observable from existing
material; both fit the standard rule-shape of W12..W31.
2. Hypothesis (Gate G1 β Popper)
H = "the W32 validators reject every malformed (WelcomeAeadEnvelope,
view) / (ProposalReference, view) pair listed in Β§3" is false iff
there exists an input in the falsification witness corpus that
returns Ok(()) despite violating one of the rules per lane.
Refutation observable: a single failing #[test] fn wegi_β¦ /
#[test] fn pref_β¦ or a single Lemma counter_β¦ constructive
counter-example would falsify H.
3. Method β lane decomposition
Lane A β L-CHAT-1-wegi (R-CHAT-1 / CR-CHAT-01)
- File:
crates/trios-chat/rings/CR-CHAT-01/src/welcome_encrypted_group_info_aead.rs
(β270 lines).
- Public API:
validate_welcome_aead_envelope(envelope: &WelcomeAeadEnvelope, view: &WelcomeAeadView) -> Result<(), WelcomeAeadError>.
- Consts
WELCOME_GROUP_INFO_AEAD_NONCE_LEN = 12,
WELCOME_GROUP_INFO_MIN_CT_LEN = 16.
- Six rules in fixed order:
NonCanonicalAeadNonceLength
ShortAeadCiphertext
CrossGroupAeadEnvelope
StaleEpochAeadEnvelope
ReusedAeadNonce
ZeroAeadNonce
- WEGI-01..10 unit tests (10 new tests).
Lane B β L-CHAT-3-pref (R-CHAT-11 / CR-CHAT-03)
- File:
crates/trios-chat/rings/CR-CHAT-03/src/proposal_ref_collision.rs
(β265 lines).
- Public API:
validate_proposal_ref(proposal: &ProposalReference, view: &ProposalRefView) -> Result<(), ProposalRefError>.
- Consts
PROPOSAL_REF_LEN = 32, PROPOSAL_ID_MAX_LEN = 255.
- Seven rules in fixed order:
NonCanonicalProposalRefLength
EmptyProposalId
UnknownProposalRef
CrossGroupProposalRef
StaleEpochProposalRef
ProposalRefReplay
ZeroProposalRef
- PREF-01..10 unit tests (10 new tests).
4. Pre-registration (Gate G2)
| Field |
Value |
statistical_test |
n/a β exhaustive falsification on a finite deny-corpus + Coq Qed |
alpha |
n/a |
effect_size |
100 % falsifier deny-rate per W32 lane (3100/3100) |
n_required |
50 prompts per lane Γ 2 lanes = 100 W32 prompts |
stop_rule |
"first 100/100 deny-rate on W32 corpus" |
multiple_testing |
n/a β single hypothesis per lane |
5. Falsification (Gate G5)
#[test] fn wegi_01..wegi_10 and #[test] fn pref_01..pref_10
in the two new modules β each error variant has a positive
witness (Err(<Variant>)) and the lanes share a positive accept
case.
Lemma inv_chat_194_β¦ through Lemma inv_chat_200_β¦ +
helpers wegi_canonical_envelope_accepted_32,
wegi_min_ciphertext_accepted_32,
pref_canonical_proposal_accepted_32,
pref_one_byte_proposal_id_accepted_32 in
crates/trios-chat/proofs/chat/Trinity_Chat.v Section
TrinityChatWave32 (lines 4418β4540).
6. Deliverables
| File |
Status |
crates/trios-chat/rings/CR-CHAT-01/src/welcome_encrypted_group_info_aead.rs (NEW, 268 lines) |
β
|
crates/trios-chat/rings/CR-CHAT-01/src/lib.rs (mod + pub use) |
β
|
crates/trios-chat/rings/CR-CHAT-03/src/proposal_ref_collision.rs (NEW, 265 lines) |
β
|
crates/trios-chat/rings/CR-CHAT-03/src/lib.rs (mod + pub use) |
β
|
crates/trios-chat/corpus/prompt_injection.jsonl (+100 entries, total 3100) |
β
|
crates/trios-chat/rings/CR-CHAT-06/src/injection.rs (+201 deny patterns) |
β
|
crates/trios-chat/proofs/chat/Trinity_Chat.v (+Section TrinityChatWave32, +11 Qed) |
β
|
crates/trios-chat/src/bin/falsifier_runner.rs (+2 threshold lanes) |
β
|
crates/trios-chat/ROADMAP.md (Wave-32 detail + future waves W33..W37) |
β
|
7. Quality Gates
| Gate |
Expected |
| Cargo tests |
~548 / 0 |
| End-to-end smoke |
25/25 pass |
| Falsifier corpus |
3100/3100 blocked at 62 thresholds |
| Clippy |
clean |
| Coq |
silent, exit 0 (299 Qed / 0 Admitted) |
| Laws Guard CI |
PR body opens with Closes #<this issue> |
| L-ARCH-001 |
new code under crates/trios-chat/rings/CR-CHAT-{01,03}/ only |
| 13/13 CI checks |
green |
8. Forbidden
- New axioms (cumulative axiom list stays at 5:
ss_kp_injective,
dh_step_fresh, dh_post_history_independent,
hybrid_kem_non_degenerate, sn_hash_sym).
Admitted. in Trinity_Chat.v (W32 ships 0 admissions).
unsafe blocks (W32 introduces 0 unsafe).
- Skipping any of the rules per lane.
- Force-push to
main (this PR targets the new branch
feat/trios-chat-wave32).
9. References
- Algebraic anchor
ΟΒ² + Οβ»Β² = 3 β Zenodo
10.5281/zenodo.19227877.
- Trinity software release v2.0.2 β Zenodo
10.5281/zenodo.18947017.
- Sibling sub-tracker (W31) β #770
closed by PR #771,
merged 756cf35.
- RFC 9420 Β§12.4.3 (Welcome / encrypted_group_info AEAD) β IETF MLS protocol.
- RFC 9420 Β§12.1.1 (ProposalRef = MAC over ProposalContent).
10. Battle Cry
Wave-32: two more MLS hazards turn from folklore into Qed. The
Welcome AEAD nonce may not be reused, the ProposalRef may not
collide. ΟΒ² + Οβ»Β² = 3 β and the falsifier blocks every phrasing.
π Wave-32 β welcome_encrypted_group_info_aead + proposal_ref_collision (sub-tracker)
Anchor:
ΟΒ² + Οβ»Β² = 3Sub-tracker for the Wave-32 of the trios-chat protocol β two fresh
threat-model lanes following the W7..W31 canonical cadence.
1. Background
Wave-31 (PR #771,
merged
756cf35) closed KeyPackageinit_keyreuse + External PSKidentifier provenance, bringing the threat coverage to 60
categories / 288 Coq Qed / ~528 tests. Two uncovered MLS surfaces
remain right under the existing W31 ones:
β a hostile sender can publish a Welcome whose
encrypted_group_infoAEAD envelope carries a non-12-bytenonce, a sub-tag ciphertext, a foreign
group_id, a staleepoch, a previously-used(group_id, epoch, nonce)triple(catastrophic AEAD nonce-misuse), or the all-zero AEAD nonce.
can inject a
Proposalcarrying a non-canonicalproposal_reflength, an empty
proposal_id, aproposal_refneverprovisioned in the local commit ledger, a foreign
group_id,a stale
epoch, a replayed(group_id, epoch, proposal_ref)triple, or the all-zero
proposal_ref.Both are MLS hazards independently observable from existing
material; both fit the standard rule-shape of W12..W31.
2. Hypothesis (Gate G1 β Popper)
H = "the W32 validators reject every malformed (WelcomeAeadEnvelope,
view) / (ProposalReference, view) pair listed in Β§3" is false iff
there exists an input in the falsification witness corpus that
returns
Ok(())despite violating one of the rules per lane.Refutation observable: a single failing
#[test] fn wegi_β¦/#[test] fn pref_β¦or a singleLemma counter_β¦constructivecounter-example would falsify H.
3. Method β lane decomposition
Lane A β L-CHAT-1-wegi (R-CHAT-1 / CR-CHAT-01)
crates/trios-chat/rings/CR-CHAT-01/src/welcome_encrypted_group_info_aead.rs(β270 lines).
validate_welcome_aead_envelope(envelope: &WelcomeAeadEnvelope, view: &WelcomeAeadView) -> Result<(), WelcomeAeadError>.WELCOME_GROUP_INFO_AEAD_NONCE_LEN = 12,WELCOME_GROUP_INFO_MIN_CT_LEN = 16.NonCanonicalAeadNonceLengthShortAeadCiphertextCrossGroupAeadEnvelopeStaleEpochAeadEnvelopeReusedAeadNonceZeroAeadNonceLane B β L-CHAT-3-pref (R-CHAT-11 / CR-CHAT-03)
crates/trios-chat/rings/CR-CHAT-03/src/proposal_ref_collision.rs(β265 lines).
validate_proposal_ref(proposal: &ProposalReference, view: &ProposalRefView) -> Result<(), ProposalRefError>.PROPOSAL_REF_LEN = 32,PROPOSAL_ID_MAX_LEN = 255.NonCanonicalProposalRefLengthEmptyProposalIdUnknownProposalRefCrossGroupProposalRefStaleEpochProposalRefProposalRefReplayZeroProposalRef4. Pre-registration (Gate G2)
statistical_testalphaeffect_sizen_requiredstop_rulemultiple_testing5. Falsification (Gate G5)
#[test] fn wegi_01..wegi_10and#[test] fn pref_01..pref_10in the two new modules β each error variant has a positive
witness (
Err(<Variant>)) and the lanes share a positive acceptcase.
Lemma inv_chat_194_β¦throughLemma inv_chat_200_β¦+helpers
wegi_canonical_envelope_accepted_32,wegi_min_ciphertext_accepted_32,pref_canonical_proposal_accepted_32,pref_one_byte_proposal_id_accepted_32incrates/trios-chat/proofs/chat/Trinity_Chat.vSectionTrinityChatWave32(lines 4418β4540).6. Deliverables
crates/trios-chat/rings/CR-CHAT-01/src/welcome_encrypted_group_info_aead.rs(NEW, 268 lines)crates/trios-chat/rings/CR-CHAT-01/src/lib.rs(mod + pub use)crates/trios-chat/rings/CR-CHAT-03/src/proposal_ref_collision.rs(NEW, 265 lines)crates/trios-chat/rings/CR-CHAT-03/src/lib.rs(mod + pub use)crates/trios-chat/corpus/prompt_injection.jsonl(+100 entries, total 3100)crates/trios-chat/rings/CR-CHAT-06/src/injection.rs(+201 deny patterns)crates/trios-chat/proofs/chat/Trinity_Chat.v(+Section TrinityChatWave32, +11 Qed)crates/trios-chat/src/bin/falsifier_runner.rs(+2 threshold lanes)crates/trios-chat/ROADMAP.md(Wave-32 detail + future waves W33..W37)7. Quality Gates
~548 / 025/25 pass3100/3100 blockedat 62 thresholdsCloses #<this issue>crates/trios-chat/rings/CR-CHAT-{01,03}/only8. Forbidden
ss_kp_injective,dh_step_fresh,dh_post_history_independent,hybrid_kem_non_degenerate,sn_hash_sym).Admitted.inTrinity_Chat.v(W32 ships 0 admissions).unsafeblocks (W32 introduces 0unsafe).main(this PR targets the new branchfeat/trios-chat-wave32).9. References
ΟΒ² + Οβ»Β² = 3β Zenodo10.5281/zenodo.19227877.
10.5281/zenodo.18947017.
closed by PR #771,
merged
756cf35.10. Battle Cry