P4. PDU catalog and schemas
Work in progress — not audited
Normative protocol documentation for the current implementation. Not independently audited.
P4.1 Encoding
All PDUs described here are sent over WebRTC data channels unless noted.
Serialization: JSON encoded as UTF-8 text unless binary/Uint8Array fields are noted.
Every PDU MUST include a string field type as the discriminator.
Schema version: EnkryptedChat-Profile-v0 — field names may change before v1.0 freeze.
P4.2 PDU categories
Category Purpose Handshake Establish encryptionReady Encrypted transport User content with encryptedMessage wrapper Chunking Split large ciphertext Messaging Cleartext routing metadata (payload may be encrypted inside wrapper) Files File transfer (standard and fast paths) Calls Group/voice/video signaling Presence Typing, peer list
P4.3 Handshake PDUs
typeDirection Required fields (minimum) Notes mls-key-package-requestEither — Triggers key package send mls-key-packageEither keyPackage (implementation-defined)MLS RFC 9420 structure mls-encryption-sync-requestEither — State sync mls-encryption-sync-responseEither — State sync response signal-key-exchange-requestEither Signal payload fields (WASM) P2P X3DH start signal-key-exchange-responseEither Signal payload fields signal-session-completeEither — Signal ready mlkem-key-exchangeEither ML-KEM public key material mlkem-key-exchange-responseEither ML-KEM response mls-commitEither MLS commit bytes / structure Group ops mls-welcomeEither MLS welcome New member mls-welcome-ackEither — Ack rotation-timestamp-broadcastEither rotation timestamp AES key rotation suffix handshakeEither — Legacy/generic protocol-errorEither code number MUST; messageId string MAY; detail string MAYSee P8.8
P4.4 Encrypted message wrapper
User-visible chat uses outer PDU:
Field Type Required Description typestring MUST "message" for chatencryptedMessageobject MUST when E2EE on See P4.5 callbackany MAY Implementation callback
Inner cleartext fields (before encryption) for message action:
Field Type Description messageIdstring Unique id messagestring Text body timestampnumber Unix ms groupIdstring MAY — group route attachmentobject MAY — media metadata
P4.5 encryptedMessage object
P4.5.1 Cascade mode (cascaded: true)
Field Type Required Description encryptedboolean MUST truecascadedboolean MUST truecascadedPayloadobject MUST See P5 timestampnumber MUST Encryption time chunkedboolean MAY true if splitmessageIdstring MAY Required if chunked totalChunksnumber MAY Chunk count chunksnumber[] MAY Byte arrays as JSON numbers
P4.5.2 MLS-only fallback (cascaded absent)
Field Type Required Description encryptedboolean MUST trueenvelopeobject MUST groupId, epoch, ciphertext (byte array)chunkedboolean MAY MLS chunking
MLS envelope fields:
Field Type Description groupIdnumber[] Byte array as JSON numbers epochnumber MLS epoch ciphertextnumber[] MLS ciphertext bytes
P4.6 Chunk transport PDU
typeFields Description __mls_chunk__messageType, messageId, chunkIndex, totalChunks, chunk, envelope?, timestampReassembles to full encryptedMessage
Reassembly MUST complete before decrypt. Out-of-order chunks SHOULD be buffered by chunkIndex.
P4.7 Messaging and presence PDUs
typePurpose messageChat (see P4.4) deleteMessageDelete by messageId typing-indicatorTyping state peer-listKnown peers peer-joinedPeer presence group-member-joinedGroup membership group-inviteGroup invite
P4.8 File transfer PDUs (standard path)
typePurpose file-metadataStart transfer request-chunkRequest chunk index file-chunkChunk payload chunk-receivedAck file-transfer-completeDone chunk-ackAck variant
P4.9 File transfer PDUs (fast path)
Used when fast file transfer is enabled; cascade MAY be bypassed.
typePurpose chunk-requestRequest chunk file-chunkData byte-range-requestRange request byte-range-responseRange response transfer-verify-requestVerify transfer-verify-responseVerify response transfer-chunk-status-requestStatus transfer-chunk-status-responseStatus response transfer-complete-notifyComplete transfer-complete-verifyVerify complete missing-data-responseMissing data fast-file-metadataFast path metadata (same role as file-metadata)
Chunk sizes: 1 MB–16 MB adaptive (useFastFileTransfer); per-message cap 256 KB metadata overhead in some paths.
P4.10 Call PDUs
typePurpose groupCallRequestIncoming group call groupCallAcceptedAccepted groupCallEndedEnded call-ended1:1 call end
Media uses WebRTC SRTP; optional SFrame layer — experimental (ch. 4 ).
P4.11 Unknown types
Receivers MUST drop unknown type values without crashing; MAY log at debug only. Senders MUST NOT send handshake PDUs after encryptionReady except for rotation or group maintenance.
P4.12 Global PDU fields
Field Type Required Max / notes typestring MUST Discriminator; see tables below specVersionstring MAY MUST in Profile-v1; value "1.0"
Total serialized PDU size MUST NOT exceed 16 MiB (P8 ).
P4.13 Complete PDU field reference
Extracted from p2p routing (MLSProvider.tsx) and p2p/src/features/. WASM/MLS binary blobs are opaque string or number[] on the wire.
Handshake and crypto control
typeFields (name · type · required) mls-key-package-request— (no additional fields) mls-key-packagekeyPackage · string/object · MUSTmls-encryption-sync-requestimplementation-defined · MAY mls-encryption-sync-responseimplementation-defined · MAY signal-key-exchange-requestSignal WASM payload · MUST · Appendix B signal-key-exchange-responseSignal WASM payload · MUST signal-session-complete— · MAY mlkem-key-exchangeML-KEM public key material · MUST mlkem-key-exchange-responseML-KEM response · MUST mls-commitMLS commit bytes/structure · MUST mls-welcomeMLS welcome · MUST mls-welcome-ack— · MAY rotation-timestamp-broadcastrotationTimestamp · number · SHOULDhandshakelegacy · MAY
Messaging and presence
typeFields messagemessageId string SHOULD · message string MAY · timestamp number MAY · groupId string MAY · attachment object MAY · encryptedMessage object MUST when E2EE · originalSender string MAY (relay) · _senderId string MAYdeleteMessagemessageId string MUST · groupId string MAYtyping-indicatorindicatorType string SHOULD (typing, recording-audio, sharing-location, stopped) · chatId string MAYpeer-listpeer list payload · implementation-defined peer-joinedpeerId string SHOULDgroup-member-joinedgroupId string MUST · member fields · implementation-definedgroup-invitegroupId string MUST · invite payload · implementation-defined
Chunk transport
typeFields __mls_chunk__messageId MUST · chunkIndex MUST · totalChunks MUST · chunk number[] MUST · messageType MAY · timestamp MAY · envelope object MAY (MLS chunk path)
Standard file transfer
typeFields file-metadatafileId MUST · fileName MAY · fileSize number MAY · mimeType string MAY · totalChunks number MAY · prefix string MAY · thumbnail string/object MAY · groupId string MAYfast-file-metadatasame as file-metadata request-chunkfileId MUST · chunkIndex number MUST · requestedSize number MAY · groupId string MAY · originalRequester string MAYfile-chunkfileId MUST · chunkIndex number MUST · chunk number[]/binary MUST · groupId string MAYchunk-receivedfileId MUST · chunkIndex number MUSTchunk-ackack fields · implementation-defined file-transfer-completefileId MUST · completion metadata MAY
Fast file transfer
typeFields chunk-requestfileId MUST · chunkIndex number MUST · requestedSize number MAYbyte-range-requestrange fields · implementation-defined byte-range-responserange + data · implementation-defined transfer-verify-requestfileId MUST · verify metadata MAYtransfer-verify-responseverify result · implementation-defined transfer-chunk-status-requeststatus query · implementation-defined transfer-chunk-status-responsestatus result · implementation-defined transfer-complete-notifyfileId MUSTtransfer-complete-verifyverify complete · implementation-defined missing-data-responsemissing chunk indices · implementation-defined
Calls
typeFields groupCallRequestcallType string MUST · groupId string MAY · callerName string MAY · originalCaller string MAY · relayedBy string MAYgroupCallAcceptedgroup/call ids · implementation-defined groupCallEndedgroup/call ids · implementation-defined call-endedfrom string MAY (peer id)
| protocol-error | code MUST · messageId MAY · detail MAY (no secrets) |
protocol-error (Profile-v0 implemented)
Field Type Required Notes typestring MUST "protocol-error"codenumber MUST 1–5 per P8.8 messageIdstring MAY Related message detailstring MAY Debug only; no secrets
Group relay PDUs MAY include: originalSender, _senderId, relayedBy (string). Receivers SHOULD use originalSender for routing when present.
P4.14 Source of truth
PDU handlers are centralized in MLSProvider.tsx (routing) and feature modules under p2p/src/features/. This catalog reflects that implementation as of profile v0. See ch. 10 for repository map.