fix(marmot): SelfRemove uses IANA proposal type 0x000A (not 0xF001)

SelfRemove is standardized in draft-ietf-mls-extensions with
IANA-registered proposal type 0x000A. openmls and mdk encode it
that way on the wire. Quartz was writing 0xF001 (Marmot private-use
range), so mdk's strict tls_codec read 0x000A for a known proposal
type it didn't recognize and the decoder drifted past the variant
body, surfacing later as
    Tls(DecodingError("Trying to decode Option<T> with 64 for option..."))
when it reached `Commit.path` with misaligned bytes.

Fixes test 11 (amy leave → B still sees A as member).

https://claude.ai/code/session_1469d7f4-bb66-4ffa-a44d-1dfa4b526484
This commit is contained in:
Claude
2026-04-22 08:09:31 +00:00
parent b01ee5336a
commit d68c6a2fe7
@@ -45,8 +45,11 @@ enum class ProposalType(
EXTERNAL_INIT(6),
GROUP_CONTEXT_EXTENSIONS(7),
// Marmot custom proposal types (private-use range 0xF000-0xFFFF)
SELF_REMOVE(0xF001),
// SelfRemove is standardized in MLS Extensions draft-ietf-mls-extensions
// as IANA proposal type 0x000A, NOT a Marmot private-use value.
// openmls / mdk encode it as 0x000A on the wire; quartz was writing
// 0xF001, which strict receivers reject as "Unknown ProposalType".
SELF_REMOVE(0x000A),
;
companion object {