RFC 9420 Compliance Checklist - MLS Implementation
Overview
Comprehensive RFC 9420 compliance verification checklist for the MLS protocol implementation.
Overall Compliance: 65% (Core protocol compliant, security requirements need work)
Protocol Compliance
Section 4: Ciphersuites
| Requirement | Status | Notes |
|---|---|---|
| Support at least one ciphersuite | ✅ COMPLIANT | MLS_128_DHKEMX25519_AES128GCM_SHA256_Ed25519 |
| Negotiate ciphersuite during init | ✅ COMPLIANT | Line 91-95: getCiphersuiteFromName |
| Use ciphersuite ID 1 (mandatory) | ✅ COMPLIANT | Standard X25519 suite |
| X25519 for KEM | ✅ COMPLIANT | via ts-mls |
| AES-128-GCM for AEAD | ✅ COMPLIANT | via ts-mls |
| SHA-256 for Hash | ✅ COMPLIANT | via ts-mls |
| HKDF-SHA256 for KDF | ✅ COMPLIANT | via ts-mls |
| Ed25519 for signatures | ✅ COMPLIANT | via ts-mls |
Ciphersuite Compliance: ✅ 100%
Section 5: Key Packages
| Requirement | Status | Notes |
|---|---|---|
| Generate key packages | ✅ COMPLIANT | Line 115-140 |
| Include protocol version | ✅ COMPLIANT | ts-mls handles |
| Include ciphersuite | ✅ COMPLIANT | Passed to generateKeyPackage |
| Include init_key | ✅ COMPLIANT | X25519 public key |
| Include leaf_node | ✅ COMPLIANT | With credential |
| Include extensions | ✅ COMPLIANT | Empty array allowed |
| Sign key package | ✅ COMPLIANT | Ed25519 signature |
| Validate lifetime | ❌ NON-COMPLIANT | No lifetime validation |
| Verify signature on receipt | ⚠️ PARTIAL | ts-mls verifies, app doesn't |
Key Package Compliance: 🟡 78% (7/9)
Section 6: Message Framing
| Requirement | Status | Notes |
|---|---|---|
| PrivateMessage format | ✅ COMPLIANT | Lines 376-380 |
| PublicMessage format | ✅ COMPLIANT | Lines 599-603 |
| Proper wireformat field | ✅ COMPLIANT | Line 379, 602 |
| Version field | ✅ COMPLIANT | 'mls10' |
| Encode/decode correctly | ✅ COMPLIANT | encodeMlsMessage/decode |
| Handle both message types | ✅ COMPLIANT | Lines 529-553 |
Message Framing Compliance: ✅ 100%
Section 7: Group Creation
| Requirement | Status | Notes |
|---|---|---|
| Initialize group at epoch 0 | ✅ COMPLIANT | Line 165-171 |
| Create ratchet tree | ✅ COMPLIANT | ts-mls createGroup |
| Include creator's leaf | ✅ COMPLIANT | Uses keyPackage |
| Generate group context | ✅ COMPLIANT | ts-mls handles |
| Compute tree hash | ✅ COMPLIANT | ts-mls computes |
Group Creation Compliance: ✅ 100%
Section 8: Group Evolution
8.1 Add Members
| Requirement | Status | Notes |
|---|---|---|
| Create Add proposals | ✅ COMPLIANT | Lines 207-212 |
| Include key packages | ✅ COMPLIANT | From addMembers param |
| Create commit | ✅ COMPLIANT | Line 215-218 |
| Generate Welcome | ✅ COMPLIANT | Line 223-225 |
| Update epoch | ✅ COMPLIANT | Automatic in ts-mls |
| Send Welcome to new members | ⚠️ DOCUMENTED | App responsibility |
| Send commit to existing members | ⚠️ DOCUMENTED | Lines 238-249 doc |
| Validate member limit | ❌ NON-COMPLIANT | No limit check |
Add Members Compliance: 🟡 75% (6/8)
8.2 Remove Members
| Requirement | Status | Notes |
|---|---|---|
| Create Remove proposals | ✅ COMPLIANT | Lines 582-587 |
| Specify removed index | ✅ COMPLIANT | BigInt(index) |
| Create commit | ✅ COMPLIANT | Line 590-593 |
| Update epoch | ✅ COMPLIANT | Automatic |
| Send to remaining members | ⚠️ APP RESPONSIBILITY | Not enforced |
| Validate index bounds | ❌ NON-COMPLIANT | No validation |
Remove Members Compliance: 🟡 67% (4/6)
8.3 Update (Key Rotation)
| Requirement | Status | Notes |
|---|---|---|
| Generate new path | ✅ COMPLIANT | forcePathUpdate: true |
| Create Update commit | ✅ COMPLIANT | Line 462-465 |
| Update all path secrets | ✅ COMPLIANT | ts-mls handles |
| Increment epoch | ✅ COMPLIANT | Line 471 |
| Distribute commit | ⚠️ APP RESPONSIBILITY | Not enforced |
| Return PrivateMessage | ✅ COMPLIANT | Line 475 returns commit |
Update Compliance: ✅ 83% (5/6)
Section 9: TreeKEM
| Requirement | Status | Notes |
|---|---|---|
| Maintain binary tree structure | ✅ COMPLIANT | ts-mls handles |
| Use parent hashes | ✅ COMPLIANT | ts-mls computes |
| Update path on member changes | ✅ COMPLIANT | Automatic |
| Blank parent nodes (nulls) | ✅ COMPLIANT | Lines 33-38 |
| Strip trailing nulls | ✅ COMPLIANT | stripTrailingNulls function |
| Preserve interior nulls | ✅ COMPLIANT | Line 34-37 |
| Compute tree hash | ✅ COMPLIANT | ts-mls computes |
| Validate tree structure | ❌ NON-COMPLIANT | No app-level validation |
| Tree size limits | ❌ NON-COMPLIANT | No size limits |
TreeKEM Compliance: 🟡 78% (7/9)
Section 10: Key Schedule
| Requirement | Status | Notes |
|---|---|---|
| Epoch-based key derivation | ✅ COMPLIANT | ts-mls handles |
| HKDF for derivation | ✅ COMPLIANT | HKDF-SHA256 |
| Proper key separation | ✅ COMPLIANT | Context strings |
| Handshake secret derivation | ✅ COMPLIANT | ts-mls implements |
| Application secret derivation | ✅ COMPLIANT | For message keys |
| Exporter secret | ✅ COMPLIANT | Available if needed |
| Ratchet message keys | ✅ COMPLIANT | Per-message |
Key Schedule Compliance: ✅ 100%
Section 11: Message Protection
11.1 Content Encryption
| Requirement | Status | Notes |
|---|---|---|
| Use group secrets | ✅ COMPLIANT | From key schedule |
| AES-128-GCM encryption | ✅ COMPLIANT | Via ts-mls |
| Unique nonce per message | ✅ COMPLIANT | ts-mls generates |
| Authenticate message | ✅ COMPLIANT | AEAD tag |
| Include authenticated data | ✅ COMPLIANT | Group context |
Content Encryption Compliance: ✅ 100%
11.2 Commit Distribution
| Requirement | Status | Notes |
|---|---|---|
| Send Welcome to new members | ⚠️ DOCUMENTED | Lines 238-249 |
| Send commit to existing members | ⚠️ DOCUMENTED | Clear instructions |
| All members process commit | ⚠️ APP RESPONSIBILITY | Not enforced |
| Synchronize epoch | ⚠️ PARTIAL | No desync detection |
Commit Distribution Compliance: 🟡 50% (2/4)
Section 12: Message Types
12.1 Application Messages
| Requirement | Status | Notes |
|---|---|---|
| Use PrivateMessage | ✅ COMPLIANT | Line 376-380 |
| Encrypt with group secret | ✅ COMPLIANT | ts-mls handles |
| Include epoch | ✅ COMPLIANT | In envelope |
| Include group ID | ✅ COMPLIANT | Line 383 |
| Proper AEAD tag |