Skip to main content

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​

CategoryPurpose
HandshakeEstablish encryptionReady
Encrypted transportUser content with encryptedMessage wrapper
ChunkingSplit large ciphertext
MessagingCleartext routing metadata (payload may be encrypted inside wrapper)
FilesFile transfer (standard and fast paths)
CallsGroup/voice/video signaling
PresenceTyping, peer list

P4.3 Handshake PDUs​

typeDirectionRequired fields (minimum)Notes
mls-key-package-requestEither—Triggers key package send
mls-key-packageEitherkeyPackage (implementation-defined)MLS RFC 9420 structure
mls-encryption-sync-requestEither—State sync
mls-encryption-sync-responseEither—State sync response
signal-key-exchange-requestEitherSignal payload fields (WASM)P2P X3DH start
signal-key-exchange-responseEitherSignal payload fields
signal-session-completeEither—Signal ready
mlkem-key-exchangeEitherML-KEM public key material
mlkem-key-exchange-responseEitherML-KEM response
mls-commitEitherMLS commit bytes / structureGroup ops
mls-welcomeEitherMLS welcomeNew member
mls-welcome-ackEither—Ack
rotation-timestamp-broadcastEitherrotation timestampAES key rotation suffix
handshakeEither—Legacy/generic
protocol-errorEithercode number MUST; messageId string MAY; detail string MAYSee P8.8

P4.4 Encrypted message wrapper​

User-visible chat uses outer PDU:

FieldTypeRequiredDescription
typestringMUST"message" for chat
encryptedMessageobjectMUST when E2EE onSee P4.5
callbackanyMAYImplementation callback

Inner cleartext fields (before encryption) for message action:

FieldTypeDescription
messageIdstringUnique id
messagestringText body
timestampnumberUnix ms
groupIdstringMAY — group route
attachmentobjectMAY — media metadata

P4.5 encryptedMessage object​

P4.5.1 Cascade mode (cascaded: true)​

FieldTypeRequiredDescription
encryptedbooleanMUSTtrue
cascadedbooleanMUSTtrue
cascadedPayloadobjectMUSTSee P5
timestampnumberMUSTEncryption time
chunkedbooleanMAYtrue if split
messageIdstringMAYRequired if chunked
totalChunksnumberMAYChunk count
chunksnumber[]MAYByte arrays as JSON numbers

P4.5.2 MLS-only fallback (cascaded absent)​

FieldTypeRequiredDescription
encryptedbooleanMUSTtrue
envelopeobjectMUSTgroupId, epoch, ciphertext (byte array)
chunkedbooleanMAYMLS chunking

MLS envelope fields:

FieldTypeDescription
groupIdnumber[]Byte array as JSON numbers
epochnumberMLS epoch
ciphertextnumber[]MLS ciphertext bytes

P4.6 Chunk transport PDU​

typeFieldsDescription
__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​

FieldTypeRequiredMax / notes
typestringMUSTDiscriminator; see tables below
specVersionstringMAYMUST 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 · MUST
mls-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 · SHOULD
handshakelegacy · 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 MAY
deleteMessagemessageId string MUST · groupId string MAY
typing-indicatorindicatorType string SHOULD (typing, recording-audio, sharing-location, stopped) · chatId string MAY
peer-listpeer list payload · implementation-defined
peer-joinedpeerId string SHOULD
group-member-joinedgroupId string MUST · member fields · implementation-defined
group-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 MAY
fast-file-metadatasame as file-metadata
request-chunkfileId MUST · chunkIndex number MUST · requestedSize number MAY · groupId string MAY · originalRequester string MAY
file-chunkfileId MUST · chunkIndex number MUST · chunk number[]/binary MUST · groupId string MAY
chunk-receivedfileId MUST · chunkIndex number MUST
chunk-ackack fields · implementation-defined
file-transfer-completefileId MUST · completion metadata MAY

Fast file transfer​

typeFields
chunk-requestfileId MUST · chunkIndex number MUST · requestedSize number MAY
byte-range-requestrange fields · implementation-defined
byte-range-responserange + data · implementation-defined
transfer-verify-requestfileId MUST · verify metadata MAY
transfer-verify-responseverify result · implementation-defined
transfer-chunk-status-requeststatus query · implementation-defined
transfer-chunk-status-responsestatus result · implementation-defined
transfer-complete-notifyfileId MUST
transfer-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 MAY
groupCallAcceptedgroup/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)​

FieldTypeRequiredNotes
typestringMUST"protocol-error"
codenumberMUST1–5 per P8.8
messageIdstringMAYRelated message
detailstringMAYDebug only; no secrets

Relay metadata (group PDUs)​

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.