@agora-sdk/secure-chat-crypto 0.4.0 → 0.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1,2 @@
1
- export type { SecureChatCrypto, DeviceIdentity, KeyPackageBundle, GroupHandle, TargetedWelcome, CommitResult, PassphraseBackup, } from "./interface.js";
1
+ export type { SecureChatCrypto, DeviceIdentity, KeyPackageBundle, GroupHandle, GroupMemberIdentity, TargetedWelcome, CommitResult, PassphraseBackup, SecureDecryptFailureReason, } from "./interface.js";
2
+ export { SecureChatDecryptError } from "./interface.js";
package/dist/cjs/index.js CHANGED
@@ -1,3 +1,7 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.SecureChatDecryptError = void 0;
4
+ // Value export (a real Error subclass) so callers can `instanceof` it to fail closed on a rejected message.
5
+ var interface_js_1 = require("./interface.js");
6
+ Object.defineProperty(exports, "SecureChatDecryptError", { enumerable: true, get: function () { return interface_js_1.SecureChatDecryptError; } });
3
7
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":""}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":";;;AAiBA,4GAA4G;AAC5G,+CAAwD;AAA/C,sHAAA,sBAAsB,OAAA"}
@@ -18,6 +18,14 @@ export interface GroupHandle {
18
18
  mlsGroupId: Uint8Array;
19
19
  epoch: bigint;
20
20
  }
21
+ /** One member of a group, as seen in the local MLS roster: a device id + its signature public key.
22
+ * The public key is what a safety number / key-verification fingerprint is derived from. */
23
+ export interface GroupMemberIdentity {
24
+ /** The member device's stable id (the MLS credential identity). */
25
+ deviceId: string;
26
+ /** The member device's MLS signature PUBLIC key (safe to expose; never the private half). */
27
+ signaturePublicKey: Uint8Array;
28
+ }
21
29
  /** A Welcome destined for exactly one new-member device (the one whose KeyPackage was used). */
22
30
  export interface TargetedWelcome {
23
31
  targetDeviceId: string;
@@ -39,6 +47,34 @@ export interface PassphraseBackup {
39
47
  nonce: Uint8Array;
40
48
  version: number;
41
49
  }
50
+ /**
51
+ * Why an inbound message could not be decrypted/authenticated. Drives fail-closed handling at the
52
+ * caller: a `"replay"` / `"gap-too-large"` / `"unauthenticated"` / `"malformed"` / `"epoch-too-old"`
53
+ * message is a terminal rejection (drop it), whereas a future-epoch message the client hasn't reached
54
+ * yet is NOT one of these — the caller decides that by epoch, not by reason.
55
+ *
56
+ * - `replay` — the sender generation was already consumed (a replayed/duplicated message).
57
+ * - `gap-too-large` — the generation jumped further ahead than the ratchet will skip (possible drop/DoS).
58
+ * - `epoch-too-old` — the message's epoch is older than the retained history; its keys are gone.
59
+ * - `unauthenticated` — signature/authentication failed (forged or corrupted).
60
+ * - `malformed` — the bytes didn't decode as a valid MLS message.
61
+ * - `unknown` — any other decrypt failure.
62
+ */
63
+ export type SecureDecryptFailureReason = "replay" | "gap-too-large" | "epoch-too-old" | "unauthenticated" | "malformed" | "unknown";
64
+ /**
65
+ * Thrown by {@link SecureChatCrypto.decryptMessage} when a message fails to decrypt/authenticate. The
66
+ * MLS core (its secret-tree ratchet) is the single point that enforces replay/gap rejection; this
67
+ * error simply classifies that failure so the caller can fail closed and surface it. Carries no
68
+ * plaintext or key material.
69
+ */
70
+ export declare class SecureChatDecryptError extends Error {
71
+ readonly reason: SecureDecryptFailureReason;
72
+ /**
73
+ * @param reason - The {@link SecureDecryptFailureReason} classification.
74
+ * @param message - A non-sensitive, human-readable description (never includes plaintext/keys).
75
+ */
76
+ constructor(reason: SecureDecryptFailureReason, message: string);
77
+ }
42
78
  export interface SecureChatCrypto {
43
79
  generateDeviceIdentity(opts: {
44
80
  deviceId: string;
@@ -67,11 +103,33 @@ export interface SecureChatCrypto {
67
103
  ciphertext: Uint8Array;
68
104
  epoch: bigint;
69
105
  }>;
106
+ /**
107
+ * Decrypt + authenticate one inbound MLS application message. The MLS core's secret-tree ratchet is
108
+ * the single point that enforces replay/gap rejection (a consumed generation can't be re-derived; a
109
+ * generation too far ahead is refused) — implementations do not hand-roll a parallel counter. Always
110
+ * fails closed: on any failure it throws and returns no plaintext.
111
+ *
112
+ * @param group - The local group handle.
113
+ * @param ciphertext - The MLS PrivateMessage bytes (base64-decoded at the wire boundary).
114
+ * @returns The plaintext, the best-effort sender device id, and the message epoch.
115
+ * @throws {SecureChatDecryptError} On replay, an over-limit generation gap, a too-old epoch, a failed
116
+ * authentication, malformed bytes, or any other decrypt failure (see {@link SecureDecryptFailureReason}).
117
+ */
70
118
  decryptMessage(group: GroupHandle, ciphertext: Uint8Array): Promise<{
71
119
  plaintext: Uint8Array;
72
120
  senderDeviceId: string;
73
121
  epoch: bigint;
74
122
  }>;
123
+ /**
124
+ * List the members of a joined group as `{ deviceId, signaturePublicKey }`, read from the local MLS
125
+ * roster. The public keys feed an out-of-band safety-number / key-verification fingerprint (TOFU
126
+ * hardening against a blind server swapping a KeyPackage). Returns public material only.
127
+ *
128
+ * @param group - The local group handle.
129
+ * @returns The group's members (order is implementation-defined; callers that need stability sort).
130
+ * @throws {Error} When the group is unknown (not joined / evicted).
131
+ */
132
+ exportGroupIdentities(group: GroupHandle): Promise<GroupMemberIdentity[]>;
75
133
  processWelcome(welcome: Uint8Array): Promise<GroupHandle>;
76
134
  processCommit(group: GroupHandle, commit: Uint8Array): Promise<GroupHandle>;
77
135
  processProposal(group: GroupHandle, proposal: Uint8Array): Promise<void>;
@@ -81,6 +139,24 @@ export interface SecureChatCrypto {
81
139
  exportDeviceState(): Promise<Uint8Array>;
82
140
  /** Restore device identity + private state from {@link exportDeviceState} output. */
83
141
  importDeviceState(state: Uint8Array): Promise<DeviceIdentity>;
142
+ /**
143
+ * Seal all local key material (device identity + private keys + every joined group's state) into a
144
+ * passphrase-encrypted blob for upload to the blind server. The real cores use a memory-hard KDF
145
+ * (argon2id) + an AEAD; the server stores the ciphertext verbatim and can never decrypt it.
146
+ *
147
+ * @param passphrase - The user's backup passphrase (never sent to the server).
148
+ * @returns The encrypted backup envelope (base64-encode `blob`/`nonce` at the wire boundary).
149
+ */
84
150
  exportBackup(passphrase: string): Promise<PassphraseBackup>;
85
- importBackup(passphrase: string, backup: PassphraseBackup): Promise<void>;
151
+ /**
152
+ * Restore local key material from a {@link exportBackup} envelope, repopulating this instance's
153
+ * device identity and group states. Symmetric with {@link importDeviceState}, it returns the
154
+ * restored identity so a caller can re-assert the device server-side (idempotently) and rehydrate UI.
155
+ *
156
+ * @param passphrase - The user's backup passphrase.
157
+ * @param backup - The encrypted envelope fetched from the server.
158
+ * @returns The restored device identity.
159
+ * @throws {Error} On a wrong passphrase or a corrupt/tampered backup (fails closed — no partial restore).
160
+ */
161
+ importBackup(passphrase: string, backup: PassphraseBackup): Promise<DeviceIdentity>;
86
162
  }
@@ -11,4 +11,23 @@
11
11
  // its owner. Binary is `Uint8Array` IN MEMORY; the network layer base64-encodes at the wire
12
12
  // boundary. MLS epochs are u64 → `bigint`.
13
13
  Object.defineProperty(exports, "__esModule", { value: true });
14
+ exports.SecureChatDecryptError = void 0;
15
+ /**
16
+ * Thrown by {@link SecureChatCrypto.decryptMessage} when a message fails to decrypt/authenticate. The
17
+ * MLS core (its secret-tree ratchet) is the single point that enforces replay/gap rejection; this
18
+ * error simply classifies that failure so the caller can fail closed and surface it. Carries no
19
+ * plaintext or key material.
20
+ */
21
+ class SecureChatDecryptError extends Error {
22
+ /**
23
+ * @param reason - The {@link SecureDecryptFailureReason} classification.
24
+ * @param message - A non-sensitive, human-readable description (never includes plaintext/keys).
25
+ */
26
+ constructor(reason, message) {
27
+ super(message);
28
+ this.reason = reason;
29
+ this.name = "SecureChatDecryptError";
30
+ }
31
+ }
32
+ exports.SecureChatDecryptError = SecureChatDecryptError;
14
33
  //# sourceMappingURL=interface.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"interface.js","sourceRoot":"","sources":["../../src/interface.ts"],"names":[],"mappings":";AAAA,6FAA6F;AAC7F,EAAE;AACF,+FAA+F;AAC/F,6FAA6F;AAC7F,gGAAgG;AAChG,yFAAyF;AACzF,EAAE;AACF,0FAA0F;AAC1F,kGAAkG;AAClG,4FAA4F;AAC5F,2CAA2C"}
1
+ {"version":3,"file":"interface.js","sourceRoot":"","sources":["../../src/interface.ts"],"names":[],"mappings":";AAAA,6FAA6F;AAC7F,EAAE;AACF,+FAA+F;AAC/F,6FAA6F;AAC7F,gGAAgG;AAChG,yFAAyF;AACzF,EAAE;AACF,0FAA0F;AAC1F,kGAAkG;AAClG,4FAA4F;AAC5F,2CAA2C;;;AA+E3C;;;;;GAKG;AACH,MAAa,sBAAuB,SAAQ,KAAK;IAC/C;;;OAGG;IACH,YACW,MAAkC,EAC3C,OAAe;QAEf,KAAK,CAAC,OAAO,CAAC,CAAC;QAHN,WAAM,GAAN,MAAM,CAA4B;QAI3C,IAAI,CAAC,IAAI,GAAG,wBAAwB,CAAC;IACvC,CAAC;CACF;AAZD,wDAYC"}
@@ -1,4 +1,4 @@
1
- import type { SecureChatCrypto, DeviceIdentity, KeyPackageBundle, GroupHandle, CommitResult, PassphraseBackup, TargetedWelcome } from "./interface.js";
1
+ import type { SecureChatCrypto, DeviceIdentity, KeyPackageBundle, GroupHandle, GroupMemberIdentity, CommitResult, PassphraseBackup, TargetedWelcome } from "./interface.js";
2
2
  export declare class MockSecureChatCrypto implements SecureChatCrypto {
3
3
  private identity?;
4
4
  private privateState?;
@@ -26,7 +26,7 @@ export declare class MockSecureChatCrypto implements SecureChatCrypto {
26
26
  deviceId: string;
27
27
  keyPackage: Uint8Array;
28
28
  }): Promise<CommitResult>;
29
- removeMember(group: GroupHandle, _leafDeviceId: string): Promise<CommitResult>;
29
+ removeMember(group: GroupHandle, leafDeviceId: string): Promise<CommitResult>;
30
30
  encryptMessage(group: GroupHandle, plaintext: Uint8Array): Promise<{
31
31
  ciphertext: Uint8Array;
32
32
  epoch: bigint;
@@ -37,6 +37,7 @@ export declare class MockSecureChatCrypto implements SecureChatCrypto {
37
37
  epoch: bigint;
38
38
  }>;
39
39
  processWelcome(welcome: Uint8Array): Promise<GroupHandle>;
40
+ exportGroupIdentities(group: GroupHandle): Promise<GroupMemberIdentity[]>;
40
41
  processCommit(group: GroupHandle, commit: Uint8Array): Promise<GroupHandle>;
41
42
  processProposal(_group: GroupHandle, _proposal: Uint8Array): Promise<void>;
42
43
  exportDeviceState(): Promise<Uint8Array>;
@@ -44,5 +45,5 @@ export declare class MockSecureChatCrypto implements SecureChatCrypto {
44
45
  exportGroupState(group: GroupHandle): Promise<Uint8Array>;
45
46
  importGroupState(state: Uint8Array): Promise<GroupHandle>;
46
47
  exportBackup(passphrase: string): Promise<PassphraseBackup>;
47
- importBackup(passphrase: string, backup: PassphraseBackup): Promise<void>;
48
+ importBackup(passphrase: string, backup: PassphraseBackup): Promise<DeviceIdentity>;
48
49
  }
@@ -1,6 +1,7 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.MockSecureChatCrypto = void 0;
4
+ const interface_js_1 = require("./interface.js");
4
5
  const enc = new TextEncoder();
5
6
  const dec = new TextDecoder();
6
7
  const BACKUP_MAGIC = "AGORA_MOCK_BACKUP_V1";
@@ -78,13 +79,15 @@ class MockSecureChatCrypto {
78
79
  bytesFrom(`grp:${did}:${opts.initialMembers.map((m) => m.deviceId).join(",")}`, 16);
79
80
  const idHex = toHex(mlsGroupId);
80
81
  const secret = bytesFrom(`secret:${idHex}:${did}`, 32);
81
- this.groups.set(idHex, { secret, epoch: 0n });
82
+ const members = [did, ...opts.initialMembers.map((m) => m.deviceId)];
83
+ this.groups.set(idHex, { secret, epoch: 0n, members });
82
84
  const welcomes = opts.initialMembers.map((m) => ({
83
85
  targetDeviceId: m.deviceId,
84
86
  payload: jsonBytes({
85
87
  groupId: idHex,
86
88
  secret: toHex(secret),
87
89
  epoch: "0",
90
+ members,
88
91
  }),
89
92
  }));
90
93
  return { group: { mlsGroupId, epoch: 0n }, welcomes };
@@ -96,6 +99,8 @@ class MockSecureChatCrypto {
96
99
  throw new Error("mock: unknown group");
97
100
  st.epoch += 1n;
98
101
  const epoch = st.epoch;
102
+ if (!st.members.includes(newDevice.deviceId))
103
+ st.members.push(newDevice.deviceId);
99
104
  return {
100
105
  commit: jsonBytes({ type: "commit", groupId: idHex, epoch: epoch.toString() }),
101
106
  welcomes: [
@@ -105,18 +110,20 @@ class MockSecureChatCrypto {
105
110
  groupId: idHex,
106
111
  secret: toHex(st.secret),
107
112
  epoch: epoch.toString(),
113
+ members: st.members,
108
114
  }),
109
115
  },
110
116
  ],
111
117
  epoch,
112
118
  };
113
119
  }
114
- async removeMember(group, _leafDeviceId) {
120
+ async removeMember(group, leafDeviceId) {
115
121
  const idHex = toHex(group.mlsGroupId);
116
122
  const st = this.groups.get(idHex);
117
123
  if (!st)
118
124
  throw new Error("mock: unknown group");
119
125
  st.epoch += 1n;
126
+ st.members = st.members.filter((m) => m !== leafDeviceId);
120
127
  return {
121
128
  commit: jsonBytes({ type: "commit", groupId: idHex, epoch: st.epoch.toString() }),
122
129
  welcomes: [],
@@ -141,7 +148,7 @@ class MockSecureChatCrypto {
141
148
  const idHex = toHex(group.mlsGroupId);
142
149
  const st = this.groups.get(idHex);
143
150
  if (!st)
144
- throw new Error("mock: unknown group");
151
+ throw new interface_js_1.SecureChatDecryptError("unknown", "mock: unknown group");
145
152
  // header = "<deviceId>|<epoch>|" — split on the SECOND pipe.
146
153
  let pipes = 0;
147
154
  let cut = -1;
@@ -155,7 +162,7 @@ class MockSecureChatCrypto {
155
162
  }
156
163
  }
157
164
  if (cut < 0)
158
- throw new Error("mock: malformed ciphertext");
165
+ throw new interface_js_1.SecureChatDecryptError("malformed", "mock: malformed ciphertext");
159
166
  const [senderDeviceId, epochStr] = dec.decode(ciphertext.slice(0, cut - 1)).split("|");
160
167
  const body = ciphertext.slice(cut);
161
168
  const ks = keystream(st.secret, body.length);
@@ -167,9 +174,25 @@ class MockSecureChatCrypto {
167
174
  }
168
175
  async processWelcome(welcome) {
169
176
  const w = parseJson(welcome);
170
- this.groups.set(w.groupId, { secret: fromHex(w.secret), epoch: BigInt(w.epoch) });
177
+ this.groups.set(w.groupId, {
178
+ secret: fromHex(w.secret),
179
+ epoch: BigInt(w.epoch),
180
+ members: w.members ?? [],
181
+ });
171
182
  return { mlsGroupId: fromHex(w.groupId), epoch: BigInt(w.epoch) };
172
183
  }
184
+ async exportGroupIdentities(group) {
185
+ const idHex = toHex(group.mlsGroupId);
186
+ const st = this.groups.get(idHex);
187
+ if (!st)
188
+ throw new Error("mock: unknown group");
189
+ // The mock derives each device's signature key deterministically from its id (see
190
+ // generateDeviceIdentity), so the roster of device ids is enough to reconstruct every member's key.
191
+ return st.members.map((deviceId) => ({
192
+ deviceId,
193
+ signaturePublicKey: bytesFrom(`sig:${deviceId}`, 32),
194
+ }));
195
+ }
173
196
  async processCommit(group, commit) {
174
197
  const c = parseJson(commit);
175
198
  const idHex = toHex(group.mlsGroupId);
@@ -210,11 +233,20 @@ class MockSecureChatCrypto {
210
233
  const st = this.groups.get(idHex);
211
234
  if (!st)
212
235
  throw new Error("mock: unknown group");
213
- return jsonBytes({ groupId: idHex, secret: toHex(st.secret), epoch: st.epoch.toString() });
236
+ return jsonBytes({
237
+ groupId: idHex,
238
+ secret: toHex(st.secret),
239
+ epoch: st.epoch.toString(),
240
+ members: st.members,
241
+ });
214
242
  }
215
243
  async importGroupState(state) {
216
244
  const s = parseJson(state);
217
- this.groups.set(s.groupId, { secret: fromHex(s.secret), epoch: BigInt(s.epoch) });
245
+ this.groups.set(s.groupId, {
246
+ secret: fromHex(s.secret),
247
+ epoch: BigInt(s.epoch),
248
+ members: s.members ?? [],
249
+ });
218
250
  return { mlsGroupId: fromHex(s.groupId), epoch: BigInt(s.epoch) };
219
251
  }
220
252
  async exportBackup(passphrase) {
@@ -222,11 +254,13 @@ class MockSecureChatCrypto {
222
254
  id,
223
255
  secret: toHex(st.secret),
224
256
  epoch: st.epoch.toString(),
257
+ members: st.members,
225
258
  }));
226
259
  const plain = jsonBytes({
227
260
  magic: BACKUP_MAGIC,
228
261
  identityPriv: this.privateState ? toHex(this.privateState) : null,
229
262
  deviceId: this.identity?.deviceId ?? null,
263
+ ciphersuite: this.identity?.ciphersuite ?? 1,
230
264
  groups,
231
265
  });
232
266
  const salt = bytesFrom(`salt:${passphrase}`, 16);
@@ -251,14 +285,25 @@ class MockSecureChatCrypto {
251
285
  catch {
252
286
  throw new Error("mock: backup decrypt failed (wrong passphrase?)");
253
287
  }
254
- if (parsed.magic !== BACKUP_MAGIC) {
288
+ if (parsed.magic !== BACKUP_MAGIC || !parsed.deviceId) {
255
289
  throw new Error("mock: backup decrypt failed (wrong passphrase?)");
256
290
  }
257
291
  if (parsed.identityPriv)
258
292
  this.privateState = fromHex(parsed.identityPriv);
259
293
  for (const g of parsed.groups) {
260
- this.groups.set(g.id, { secret: fromHex(g.secret), epoch: BigInt(g.epoch) });
294
+ this.groups.set(g.id, { secret: fromHex(g.secret), epoch: BigInt(g.epoch), members: g.members ?? [] });
261
295
  }
296
+ // Rebuild the (deterministic) identity so the restored mock is usable, and return it — symmetric
297
+ // with importDeviceState, so the restore flow can re-assert the device server-side.
298
+ const ciphersuite = parsed.ciphersuite ?? 1;
299
+ const identity = {
300
+ deviceId: parsed.deviceId,
301
+ signaturePublicKey: bytesFrom(`sig:${parsed.deviceId}`, 32),
302
+ credential: enc.encode(parsed.deviceId),
303
+ ciphersuite,
304
+ };
305
+ this.identity = identity;
306
+ return identity;
262
307
  }
263
308
  }
264
309
  exports.MockSecureChatCrypto = MockSecureChatCrypto;
@@ -1 +1 @@
1
- {"version":3,"file":"mock-crypto.js","sourceRoot":"","sources":["../../src/mock-crypto.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"mock-crypto.js","sourceRoot":"","sources":["../../src/mock-crypto.ts"],"names":[],"mappings":"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"}
@@ -1 +1,2 @@
1
- export type { SecureChatCrypto, DeviceIdentity, KeyPackageBundle, GroupHandle, TargetedWelcome, CommitResult, PassphraseBackup, } from "./interface.js";
1
+ export type { SecureChatCrypto, DeviceIdentity, KeyPackageBundle, GroupHandle, GroupMemberIdentity, TargetedWelcome, CommitResult, PassphraseBackup, SecureDecryptFailureReason, } from "./interface.js";
2
+ export { SecureChatDecryptError } from "./interface.js";
package/dist/esm/index.js CHANGED
@@ -1,2 +1,3 @@
1
- export {};
1
+ // Value export (a real Error subclass) so callers can `instanceof` it to fail closed on a rejected message.
2
+ export { SecureChatDecryptError } from "./interface.js";
2
3
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":""}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAiBA,4GAA4G;AAC5G,OAAO,EAAE,sBAAsB,EAAE,MAAM,gBAAgB,CAAC"}
@@ -18,6 +18,14 @@ export interface GroupHandle {
18
18
  mlsGroupId: Uint8Array;
19
19
  epoch: bigint;
20
20
  }
21
+ /** One member of a group, as seen in the local MLS roster: a device id + its signature public key.
22
+ * The public key is what a safety number / key-verification fingerprint is derived from. */
23
+ export interface GroupMemberIdentity {
24
+ /** The member device's stable id (the MLS credential identity). */
25
+ deviceId: string;
26
+ /** The member device's MLS signature PUBLIC key (safe to expose; never the private half). */
27
+ signaturePublicKey: Uint8Array;
28
+ }
21
29
  /** A Welcome destined for exactly one new-member device (the one whose KeyPackage was used). */
22
30
  export interface TargetedWelcome {
23
31
  targetDeviceId: string;
@@ -39,6 +47,34 @@ export interface PassphraseBackup {
39
47
  nonce: Uint8Array;
40
48
  version: number;
41
49
  }
50
+ /**
51
+ * Why an inbound message could not be decrypted/authenticated. Drives fail-closed handling at the
52
+ * caller: a `"replay"` / `"gap-too-large"` / `"unauthenticated"` / `"malformed"` / `"epoch-too-old"`
53
+ * message is a terminal rejection (drop it), whereas a future-epoch message the client hasn't reached
54
+ * yet is NOT one of these — the caller decides that by epoch, not by reason.
55
+ *
56
+ * - `replay` — the sender generation was already consumed (a replayed/duplicated message).
57
+ * - `gap-too-large` — the generation jumped further ahead than the ratchet will skip (possible drop/DoS).
58
+ * - `epoch-too-old` — the message's epoch is older than the retained history; its keys are gone.
59
+ * - `unauthenticated` — signature/authentication failed (forged or corrupted).
60
+ * - `malformed` — the bytes didn't decode as a valid MLS message.
61
+ * - `unknown` — any other decrypt failure.
62
+ */
63
+ export type SecureDecryptFailureReason = "replay" | "gap-too-large" | "epoch-too-old" | "unauthenticated" | "malformed" | "unknown";
64
+ /**
65
+ * Thrown by {@link SecureChatCrypto.decryptMessage} when a message fails to decrypt/authenticate. The
66
+ * MLS core (its secret-tree ratchet) is the single point that enforces replay/gap rejection; this
67
+ * error simply classifies that failure so the caller can fail closed and surface it. Carries no
68
+ * plaintext or key material.
69
+ */
70
+ export declare class SecureChatDecryptError extends Error {
71
+ readonly reason: SecureDecryptFailureReason;
72
+ /**
73
+ * @param reason - The {@link SecureDecryptFailureReason} classification.
74
+ * @param message - A non-sensitive, human-readable description (never includes plaintext/keys).
75
+ */
76
+ constructor(reason: SecureDecryptFailureReason, message: string);
77
+ }
42
78
  export interface SecureChatCrypto {
43
79
  generateDeviceIdentity(opts: {
44
80
  deviceId: string;
@@ -67,11 +103,33 @@ export interface SecureChatCrypto {
67
103
  ciphertext: Uint8Array;
68
104
  epoch: bigint;
69
105
  }>;
106
+ /**
107
+ * Decrypt + authenticate one inbound MLS application message. The MLS core's secret-tree ratchet is
108
+ * the single point that enforces replay/gap rejection (a consumed generation can't be re-derived; a
109
+ * generation too far ahead is refused) — implementations do not hand-roll a parallel counter. Always
110
+ * fails closed: on any failure it throws and returns no plaintext.
111
+ *
112
+ * @param group - The local group handle.
113
+ * @param ciphertext - The MLS PrivateMessage bytes (base64-decoded at the wire boundary).
114
+ * @returns The plaintext, the best-effort sender device id, and the message epoch.
115
+ * @throws {SecureChatDecryptError} On replay, an over-limit generation gap, a too-old epoch, a failed
116
+ * authentication, malformed bytes, or any other decrypt failure (see {@link SecureDecryptFailureReason}).
117
+ */
70
118
  decryptMessage(group: GroupHandle, ciphertext: Uint8Array): Promise<{
71
119
  plaintext: Uint8Array;
72
120
  senderDeviceId: string;
73
121
  epoch: bigint;
74
122
  }>;
123
+ /**
124
+ * List the members of a joined group as `{ deviceId, signaturePublicKey }`, read from the local MLS
125
+ * roster. The public keys feed an out-of-band safety-number / key-verification fingerprint (TOFU
126
+ * hardening against a blind server swapping a KeyPackage). Returns public material only.
127
+ *
128
+ * @param group - The local group handle.
129
+ * @returns The group's members (order is implementation-defined; callers that need stability sort).
130
+ * @throws {Error} When the group is unknown (not joined / evicted).
131
+ */
132
+ exportGroupIdentities(group: GroupHandle): Promise<GroupMemberIdentity[]>;
75
133
  processWelcome(welcome: Uint8Array): Promise<GroupHandle>;
76
134
  processCommit(group: GroupHandle, commit: Uint8Array): Promise<GroupHandle>;
77
135
  processProposal(group: GroupHandle, proposal: Uint8Array): Promise<void>;
@@ -81,6 +139,24 @@ export interface SecureChatCrypto {
81
139
  exportDeviceState(): Promise<Uint8Array>;
82
140
  /** Restore device identity + private state from {@link exportDeviceState} output. */
83
141
  importDeviceState(state: Uint8Array): Promise<DeviceIdentity>;
142
+ /**
143
+ * Seal all local key material (device identity + private keys + every joined group's state) into a
144
+ * passphrase-encrypted blob for upload to the blind server. The real cores use a memory-hard KDF
145
+ * (argon2id) + an AEAD; the server stores the ciphertext verbatim and can never decrypt it.
146
+ *
147
+ * @param passphrase - The user's backup passphrase (never sent to the server).
148
+ * @returns The encrypted backup envelope (base64-encode `blob`/`nonce` at the wire boundary).
149
+ */
84
150
  exportBackup(passphrase: string): Promise<PassphraseBackup>;
85
- importBackup(passphrase: string, backup: PassphraseBackup): Promise<void>;
151
+ /**
152
+ * Restore local key material from a {@link exportBackup} envelope, repopulating this instance's
153
+ * device identity and group states. Symmetric with {@link importDeviceState}, it returns the
154
+ * restored identity so a caller can re-assert the device server-side (idempotently) and rehydrate UI.
155
+ *
156
+ * @param passphrase - The user's backup passphrase.
157
+ * @param backup - The encrypted envelope fetched from the server.
158
+ * @returns The restored device identity.
159
+ * @throws {Error} On a wrong passphrase or a corrupt/tampered backup (fails closed — no partial restore).
160
+ */
161
+ importBackup(passphrase: string, backup: PassphraseBackup): Promise<DeviceIdentity>;
86
162
  }
@@ -9,5 +9,21 @@
9
9
  // (dev)dependency for its integration tests — the server is a CONSUMER of this client crypto, not
10
10
  // its owner. Binary is `Uint8Array` IN MEMORY; the network layer base64-encodes at the wire
11
11
  // boundary. MLS epochs are u64 → `bigint`.
12
- export {};
12
+ /**
13
+ * Thrown by {@link SecureChatCrypto.decryptMessage} when a message fails to decrypt/authenticate. The
14
+ * MLS core (its secret-tree ratchet) is the single point that enforces replay/gap rejection; this
15
+ * error simply classifies that failure so the caller can fail closed and surface it. Carries no
16
+ * plaintext or key material.
17
+ */
18
+ export class SecureChatDecryptError extends Error {
19
+ /**
20
+ * @param reason - The {@link SecureDecryptFailureReason} classification.
21
+ * @param message - A non-sensitive, human-readable description (never includes plaintext/keys).
22
+ */
23
+ constructor(reason, message) {
24
+ super(message);
25
+ this.reason = reason;
26
+ this.name = "SecureChatDecryptError";
27
+ }
28
+ }
13
29
  //# sourceMappingURL=interface.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"interface.js","sourceRoot":"","sources":["../../src/interface.ts"],"names":[],"mappings":"AAAA,6FAA6F;AAC7F,EAAE;AACF,+FAA+F;AAC/F,6FAA6F;AAC7F,gGAAgG;AAChG,yFAAyF;AACzF,EAAE;AACF,0FAA0F;AAC1F,kGAAkG;AAClG,4FAA4F;AAC5F,2CAA2C"}
1
+ {"version":3,"file":"interface.js","sourceRoot":"","sources":["../../src/interface.ts"],"names":[],"mappings":"AAAA,6FAA6F;AAC7F,EAAE;AACF,+FAA+F;AAC/F,6FAA6F;AAC7F,gGAAgG;AAChG,yFAAyF;AACzF,EAAE;AACF,0FAA0F;AAC1F,kGAAkG;AAClG,4FAA4F;AAC5F,2CAA2C;AA+E3C;;;;;GAKG;AACH,MAAM,OAAO,sBAAuB,SAAQ,KAAK;IAC/C;;;OAGG;IACH,YACW,MAAkC,EAC3C,OAAe;QAEf,KAAK,CAAC,OAAO,CAAC,CAAC;QAHN,WAAM,GAAN,MAAM,CAA4B;QAI3C,IAAI,CAAC,IAAI,GAAG,wBAAwB,CAAC;IACvC,CAAC;CACF"}
@@ -1,4 +1,4 @@
1
- import type { SecureChatCrypto, DeviceIdentity, KeyPackageBundle, GroupHandle, CommitResult, PassphraseBackup, TargetedWelcome } from "./interface.js";
1
+ import type { SecureChatCrypto, DeviceIdentity, KeyPackageBundle, GroupHandle, GroupMemberIdentity, CommitResult, PassphraseBackup, TargetedWelcome } from "./interface.js";
2
2
  export declare class MockSecureChatCrypto implements SecureChatCrypto {
3
3
  private identity?;
4
4
  private privateState?;
@@ -26,7 +26,7 @@ export declare class MockSecureChatCrypto implements SecureChatCrypto {
26
26
  deviceId: string;
27
27
  keyPackage: Uint8Array;
28
28
  }): Promise<CommitResult>;
29
- removeMember(group: GroupHandle, _leafDeviceId: string): Promise<CommitResult>;
29
+ removeMember(group: GroupHandle, leafDeviceId: string): Promise<CommitResult>;
30
30
  encryptMessage(group: GroupHandle, plaintext: Uint8Array): Promise<{
31
31
  ciphertext: Uint8Array;
32
32
  epoch: bigint;
@@ -37,6 +37,7 @@ export declare class MockSecureChatCrypto implements SecureChatCrypto {
37
37
  epoch: bigint;
38
38
  }>;
39
39
  processWelcome(welcome: Uint8Array): Promise<GroupHandle>;
40
+ exportGroupIdentities(group: GroupHandle): Promise<GroupMemberIdentity[]>;
40
41
  processCommit(group: GroupHandle, commit: Uint8Array): Promise<GroupHandle>;
41
42
  processProposal(_group: GroupHandle, _proposal: Uint8Array): Promise<void>;
42
43
  exportDeviceState(): Promise<Uint8Array>;
@@ -44,5 +45,5 @@ export declare class MockSecureChatCrypto implements SecureChatCrypto {
44
45
  exportGroupState(group: GroupHandle): Promise<Uint8Array>;
45
46
  importGroupState(state: Uint8Array): Promise<GroupHandle>;
46
47
  exportBackup(passphrase: string): Promise<PassphraseBackup>;
47
- importBackup(passphrase: string, backup: PassphraseBackup): Promise<void>;
48
+ importBackup(passphrase: string, backup: PassphraseBackup): Promise<DeviceIdentity>;
48
49
  }