← DocumentationMEETER / DOCSRU

Technical reference for IT and developers. The business overview is in the company documentation.

Technical specification · for developers

E2EE v1

← Public encryption overview

Specification draft. The goal is for an independent implementation to exchange messages with Meeter without the server reading them.

1. Device keys

GET /v1/keys/bundle/{wallet} returns the bundle; private keys never leave the device.

2. Session establishment (X3DH)

Sender: DH(identityA, signedPreKeyB), DH(ephemeralA, identityB), DH(ephemeralA, signedPreKeyB), DH(ephemeralA, oneTimePreKeyB). Shared secret → HKDF → root/key. The first message carries isX3DH=true, ephemeralPub, senderIdentityKey, oneTimePreKeyId, dhRatchetKey, previousCounter, senderKeyId.

3. Message envelope

{
  "version": 1,
  "type": 1,
  "senderKeyId": "…",
  "ciphertext": "base64",
  "iv": "base64",
  "ephemeralPub": "base64",
  "senderIdentityKey": "base64",
  "isX3DH": true,
  "oneTimePreKeyId": 123,
  "dhRatchetKey": "base64",
  "previousCounter": 0
}

type: 1 — text, 2 — file/media, 0x54 — meeting invitation, etc. The server does not interpret ciphertext; sizes and timing are metadata.

4. Groups

Sender keys: a participant distributes their sender key to each member through E2EE; messages are signed/encrypted with the sender key. The server sees senderKeyId, the envelope and metadata. A new participant receives the sender key through an E2EE message.

5. Room and media

6. Test vectors

Test vectors and format freeze are in preparation. Until publication the specification is not considered stable; report discrepancies to security@meeter.me.