What your relay can see
The relay never needs message plaintext or device private keys. It does need routing metadata.
The delivery envelope, field by field
Plaintext and long-term private keys exist only inside a device. This is what a relay adapter receives. Sealed sender omits two of these fields.
| Field | Identified delivery | Sealed sender | What it is |
|---|---|---|---|
targetUserId | visible | visible | Who the message is for |
targetDeviceId | visible | visible | Which of their devices |
senderUserId | visible | omitted | Who sent it |
senderDeviceId | visible | omitted | Which device sent it |
messageType | visible | visible | Handshake or steady-state |
timestamp | visible | visible | When it was sent |
groupId | visible | visible | Present on group messages |
clientMessageId | visible | visible | Retry idempotency key |
ciphertext | opaque | opaque | Bytes the relay never needs to read |
Some fields appear only in context: recipientRegistrationId accompanies the initial handshake envelope. contentHint is optional. deliveryClass selects durable delivery or an online-only hint. Your relay also assigns its own message identifier and server timestamp.
What sealed sender does not hide
Sealed sender omits the sender fields. It does not make a sender anonymous.
Anonymity does not compose over a conversation
One-sided anonymity breaks when two parties exchange several messages. NDSS 2021 research linked sealed-sender users after as few as five messages, using delivery receipts. Later work extended the technique to whole group conversations. Whether your application supplies that signal is your design decision.
When, and roughly how much
Timestamps are plaintext. Message bodies are padded into 160-byte buckets, which coarsens length without concealing it. Attachments travel through a separate object store.
Network-level metadata
Addresses, connection timing, and traffic patterns belong to your transport and deployment. This SDK implements no decoy traffic and no timing jitter.
Sealed sender is best effort
If the recipient profile key or identity key is unavailable, the client falls back to identified delivery rather than failing the send.
Threat model boundary
An attacker in full control of your relay can serve stale or hostile responses and observe every routing field above. Once trust is pinned, an identity substitution that would reach plaintext fails closed.
First contact is trust on first use. A relay that is hostile from the first message can substitute an identity before trust is pinned. A safety-number comparison closes that gap. After trust is pinned, substituting either half of the identity tuple fails closed until a rotation is explicitly accepted.
What there is to check
Each figure carries the date it was measured.
- 7,073
- test cases across 400 modules, 0 failing and 2 skipped, on 2026-09-12. An export is only cut from a revision where they pass.
- 6
- direct production dependencies: @noble/ciphers, @noble/curves, @noble/hashes, @noble/post-quantum, async-lock, unique-names-generator. They resolve to 6 packages in total. The only edges inside the tree run between the @noble packages. Everything else is a development or optional peer dependency.
- 7
- published specifications the implementation profile is pinned to, by revision, in the SDK README (opens in a new tab).
- 72 hours
- to acknowledge a vulnerability report sent to security@open-e2ee.dev, and 7 days to an initial assessment. Resolution targets by severity: critical 24 to 72 hours, high 1 to 2 weeks, medium 2 to 4 weeks, low the next release cycle. Good-faith research on the SDK is covered by the safe harbor in the policy. Do not open a public issue. The full policy is in the repository (opens in a new tab).
Published limits
Read the primary sources
These are the maintained documents. Where one disagrees with this page, the document is right.
- Threat model (opens in a new tab)
- Protocol policy and post-quantum modes (opens in a new tab)
- Architecture (opens in a new tab)
- How the encryption works (opens in a new tab)
- DEVIATIONS (opens in a new tab)
- Assurance (opens in a new tab)
- Third-party notices (opens in a new tab)
- Reporting a vulnerability (opens in a new tab)
- LICENSE (opens in a new tab)
Take this to whoever signs it off
Enterprise and OEM agreements include a scoped security review, service levels, and negotiated portfolio or redistribution rights.
Email security@open-e2ee.dev with a threat-model question, or an answer you need for a questionnaire. No license, meeting, or account first. If you are earlier than that, read E2EE changes your application architecture.