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-requestEitherTriggers key package send
mls-key-packageEitherkeyPackage (implementation-defined)MLS RFC 9420 structure
mls-encryption-sync-requestEitherState sync
mls-encryption-sync-responseEitherState sync response
signal-key-exchange-requestEitherSignal payload fields (WASM)P2P X3DH start
signal-key-exchange-responseEitherSignal payload fields
signal-session-completeEitherSignal 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-ackEitherAck
rotation-timestamp-broadcastEitherrotation timestampAES key rotation suffix
handshakeEitherLegacy/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.