Device identity
Each device derives itsoff1… address from an Ed25519 identity key. Verification binds the presented key to that address. It does not establish a person’s role or permission to act on equipment. Your application enrolls identities and enforces authorization.
Encrypted application data
The SDK uses MLS for application messaging and group communication. Keep encryption required, handle session failures and preserve cryptographic state. Forward secrecy and recovery depend on the protocol lifecycle and key management described in the threat model.Control traffic
Service advertisements and discovery are signed plaintext control messages in v0.31.0, and transport observers can read them. From v0.29.0 a service request or response body is sealed inside the 1:1 MLS session with the other device once that device advertises support and the session is confirmed;service_request_received and service_response_received then carry encrypted: true. Toward an older peer, and before the session confirms, the body still leaves as signed plaintext, so the first request to a provider a device has never met is readable by the devices that carry it. Check encrypted before trusting that a body stayed private, and keep secrets out of first-contact requests. encryption.encryptServiceMessages (default true) turns sealing off. Signatures and encryption provide different protections.
The HTTP front always carries a call inside an encrypted direct message. It does not authorize callers: any device with a session can call every registered service, and the provider decides on X-Offline-Protocol-Sender.
Local storage
Identity/session secrets and persisted protocol state use separate storage roles. Protect both and keep the application/profile namespace stable. On a host without a platform keystore, v0.31.0 offers built-in file stores sealed under an operator-supplied store key; see Python. A custom storage implementation must honor atomicity and durability requirements. Validate power-loss and restart behaviour before deployment.Application policy
Authorize senders, validate schemas, bound payloads and retain idempotency records for operations with side effects. Define credential expiry and revocation behaviour during disconnected periods. An offline verifier cannot learn a new central revocation until it receives updated information. The security documentation records trust boundaries and residual risks. Report suspected vulnerabilities privately to security@offlineprotocol.com under the responsible disclosure policy.Residual risks in v0.31.0
The release threat model records limitations that applications must account for:
On iOS, Keychain identity state survives uninstall unless explicitly wiped. Include identity and document deletion in the account lifecycle. Profiles are sent to relays as
X-Device-ID; do not put personal data or secrets in them.
