@plane31/blind-relay 0.0.0-stage → 0.1.2
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.
- package/LICENSE +202 -0
- package/README.md +26 -2
- package/dist/adapters/index.d.ts +18 -0
- package/dist/adapters/index.d.ts.map +1 -0
- package/dist/adapters/index.js +22 -0
- package/dist/adapters/index.js.map +1 -0
- package/dist/audience.d.ts +77 -0
- package/dist/audience.d.ts.map +1 -0
- package/dist/audience.js +76 -0
- package/dist/audience.js.map +1 -0
- package/dist/bytes.d.ts +54 -0
- package/dist/bytes.d.ts.map +1 -0
- package/dist/bytes.js +200 -0
- package/dist/bytes.js.map +1 -0
- package/dist/circle.d.ts +59 -0
- package/dist/circle.d.ts.map +1 -0
- package/dist/circle.js +105 -0
- package/dist/circle.js.map +1 -0
- package/dist/client.d.ts +234 -0
- package/dist/client.d.ts.map +1 -0
- package/dist/client.js +1365 -0
- package/dist/client.js.map +1 -0
- package/dist/codec.d.ts +189 -0
- package/dist/codec.d.ts.map +1 -0
- package/dist/codec.js +512 -0
- package/dist/codec.js.map +1 -0
- package/dist/crypto/backend.d.ts +39 -0
- package/dist/crypto/backend.d.ts.map +1 -0
- package/dist/crypto/backend.js +8 -0
- package/dist/crypto/backend.js.map +1 -0
- package/dist/crypto/noble.d.ts +3 -0
- package/dist/crypto/noble.d.ts.map +1 -0
- package/dist/crypto/noble.js +107 -0
- package/dist/crypto/noble.js.map +1 -0
- package/dist/crypto/sodium.d.ts +9 -0
- package/dist/crypto/sodium.d.ts.map +1 -0
- package/dist/crypto/sodium.js +51 -0
- package/dist/crypto/sodium.js.map +1 -0
- package/dist/crypto.d.ts +66 -0
- package/dist/crypto.d.ts.map +1 -0
- package/dist/crypto.js +225 -0
- package/dist/crypto.js.map +1 -0
- package/dist/epoch.d.ts +93 -0
- package/dist/epoch.d.ts.map +1 -0
- package/dist/epoch.js +121 -0
- package/dist/epoch.js.map +1 -0
- package/dist/errors.d.ts +17 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/errors.js +30 -0
- package/dist/errors.js.map +1 -0
- package/dist/historyIndex.d.ts +15 -0
- package/dist/historyIndex.d.ts.map +1 -0
- package/dist/historyIndex.js +57 -0
- package/dist/historyIndex.js.map +1 -0
- package/dist/identity.d.ts +62 -0
- package/dist/identity.d.ts.map +1 -0
- package/dist/identity.js +99 -0
- package/dist/identity.js.map +1 -0
- package/dist/inbox.d.ts +153 -0
- package/dist/inbox.d.ts.map +1 -0
- package/dist/inbox.js +472 -0
- package/dist/inbox.js.map +1 -0
- package/dist/index.d.ts +19 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +22 -0
- package/dist/index.js.map +1 -0
- package/dist/outbox.d.ts +96 -0
- package/dist/outbox.d.ts.map +1 -0
- package/dist/outbox.js +339 -0
- package/dist/outbox.js.map +1 -0
- package/dist/policy.d.ts +33 -0
- package/dist/policy.d.ts.map +1 -0
- package/dist/policy.js +71 -0
- package/dist/policy.js.map +1 -0
- package/dist/record.d.ts +49 -0
- package/dist/record.d.ts.map +1 -0
- package/dist/record.js +46 -0
- package/dist/record.js.map +1 -0
- package/dist/reset.d.ts +74 -0
- package/dist/reset.d.ts.map +1 -0
- package/dist/reset.js +127 -0
- package/dist/reset.js.map +1 -0
- package/dist/rows.d.ts +16 -0
- package/dist/rows.d.ts.map +1 -0
- package/dist/rows.js +103 -0
- package/dist/rows.js.map +1 -0
- package/dist/slots.d.ts +22 -0
- package/dist/slots.d.ts.map +1 -0
- package/dist/slots.js +38 -0
- package/dist/slots.js.map +1 -0
- package/dist/store.d.ts +357 -0
- package/dist/store.d.ts.map +1 -0
- package/dist/store.js +192 -0
- package/dist/store.js.map +1 -0
- package/dist/testing/clock.d.ts +14 -0
- package/dist/testing/clock.d.ts.map +1 -0
- package/dist/testing/clock.js +27 -0
- package/dist/testing/clock.js.map +1 -0
- package/dist/testing/fakeHost.d.ts +118 -0
- package/dist/testing/fakeHost.d.ts.map +1 -0
- package/dist/testing/fakeHost.js +462 -0
- package/dist/testing/fakeHost.js.map +1 -0
- package/dist/testing/faults.d.ts +97 -0
- package/dist/testing/faults.d.ts.map +1 -0
- package/dist/testing/faults.js +264 -0
- package/dist/testing/faults.js.map +1 -0
- package/dist/testing/fixtures.d.ts +15 -0
- package/dist/testing/fixtures.d.ts.map +1 -0
- package/dist/testing/fixtures.js +22 -0
- package/dist/testing/fixtures.js.map +1 -0
- package/dist/testing/index.d.ts +7 -0
- package/dist/testing/index.d.ts.map +1 -0
- package/dist/testing/index.js +7 -0
- package/dist/testing/index.js.map +1 -0
- package/dist/testing/providers.d.ts +16 -0
- package/dist/testing/providers.d.ts.map +1 -0
- package/dist/testing/providers.js +36 -0
- package/dist/testing/providers.js.map +1 -0
- package/dist/testing/sweep.d.ts +46 -0
- package/dist/testing/sweep.d.ts.map +1 -0
- package/dist/testing/sweep.js +366 -0
- package/dist/testing/sweep.js.map +1 -0
- package/dist/transactions.d.ts +75 -0
- package/dist/transactions.d.ts.map +1 -0
- package/dist/transactions.js +212 -0
- package/dist/transactions.js.map +1 -0
- package/dist/transport.d.ts +125 -0
- package/dist/transport.d.ts.map +1 -0
- package/dist/transport.js +6 -0
- package/dist/transport.js.map +1 -0
- package/dist/vault.d.ts +59 -0
- package/dist/vault.d.ts.map +1 -0
- package/dist/vault.js +69 -0
- package/dist/vault.js.map +1 -0
- package/package.json +67 -3
- package/src/adapters/index.ts +102 -0
- package/src/audience.ts +123 -0
- package/src/bytes.ts +209 -0
- package/src/circle.ts +127 -0
- package/src/client.ts +1442 -0
- package/src/codec.ts +642 -0
- package/src/crypto/backend.ts +48 -0
- package/src/crypto/noble.ts +104 -0
- package/src/crypto/node-module.d.ts +11 -0
- package/src/crypto/sodium.ts +53 -0
- package/src/crypto.ts +266 -0
- package/src/epoch.ts +201 -0
- package/src/errors.ts +78 -0
- package/src/historyIndex.ts +61 -0
- package/src/identity.ts +158 -0
- package/src/inbox.ts +560 -0
- package/src/index.ts +59 -0
- package/src/outbox.ts +385 -0
- package/src/policy.ts +88 -0
- package/src/record.ts +106 -0
- package/src/reset.ts +176 -0
- package/src/rows.ts +116 -0
- package/src/slots.ts +55 -0
- package/src/store.ts +557 -0
- package/src/testing/clock.ts +29 -0
- package/src/testing/fakeHost.ts +482 -0
- package/src/testing/faults.ts +321 -0
- package/src/testing/fixtures.ts +35 -0
- package/src/testing/index.ts +6 -0
- package/src/testing/providers.ts +39 -0
- package/src/testing/sweep.ts +407 -0
- package/src/transactions.ts +231 -0
- package/src/transport.ts +106 -0
- package/src/vault.ts +126 -0
|
@@ -0,0 +1,212 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The named transaction boundaries of protocol section 11 (T1 to T5, T8, T9). T6, T6h and T7
|
|
3
|
+
* live with the outbox and the inbox. Each function takes an open `Tx` so callers can compose
|
|
4
|
+
* them; nothing here opens the network.
|
|
5
|
+
*/
|
|
6
|
+
import { equalBytes, toHex } from "./bytes.js";
|
|
7
|
+
import { applyAudienceEvent, initialRevisionState } from "./audience.js";
|
|
8
|
+
import { DocumentType, expectType, parseDocument } from "./codec.js";
|
|
9
|
+
import { identityId } from "./crypto.js";
|
|
10
|
+
import { promote } from "./epoch.js";
|
|
11
|
+
import { KavachError } from "./errors.js";
|
|
12
|
+
import { openAccount, pinFromCertificate } from "./identity.js";
|
|
13
|
+
import { big, pinToRow, preparedToRow, revisionToRow, rowToPrepared, rowToRevision, unbig } from "./rows.js";
|
|
14
|
+
export const META = "meta";
|
|
15
|
+
export const SELF = "self";
|
|
16
|
+
export const STREAM = "stream";
|
|
17
|
+
export const REVISION = "revision";
|
|
18
|
+
export const VAULT = "vault";
|
|
19
|
+
/**
|
|
20
|
+
* Bind the secret store to the local store. A mismatch between the two is `RECOVERY_REQUIRED`
|
|
21
|
+
* and is resolved by device replacement, never by inventing counters.
|
|
22
|
+
*/
|
|
23
|
+
export async function openStore(store, secrets, accountName) {
|
|
24
|
+
const stage = "openStore";
|
|
25
|
+
const [accountSeed, instanceId] = await Promise.all([secrets.get("accountSeed"), secrets.get("instanceId")]);
|
|
26
|
+
const meta = await store.read((tx) => tx.get("meta", META));
|
|
27
|
+
if (!accountSeed || !instanceId) {
|
|
28
|
+
if (meta)
|
|
29
|
+
throw new KavachError("RECOVERY_REQUIRED", stage, "store present but secrets missing");
|
|
30
|
+
return { kind: "fresh" };
|
|
31
|
+
}
|
|
32
|
+
const account = openAccount(accountName, accountSeed);
|
|
33
|
+
if (!meta)
|
|
34
|
+
return { kind: "initializing", account };
|
|
35
|
+
if (meta.instanceId !== toHex(instanceId) || meta.identityId !== toHex(account.identityId) || meta.accountName !== accountName || meta.schema !== 1) {
|
|
36
|
+
throw new KavachError("RECOVERY_REQUIRED", stage, "store header does not match the secret store");
|
|
37
|
+
}
|
|
38
|
+
if (meta.state === "INITIALIZING")
|
|
39
|
+
return { kind: "initializing", account };
|
|
40
|
+
return { kind: meta.state, meta, account };
|
|
41
|
+
}
|
|
42
|
+
// T1 ----------------------------------------------------------------------------------------------
|
|
43
|
+
/** T1a: roots into the secret store. Idempotent for the same values. */
|
|
44
|
+
export async function t1Secrets(secrets, roots) {
|
|
45
|
+
await secrets.set("accountSeed", roots.accountSeed);
|
|
46
|
+
await secrets.set("deviceSeed", roots.deviceSeed);
|
|
47
|
+
await secrets.set("recoveryKey", roots.recoveryKey);
|
|
48
|
+
await secrets.set("instanceId", roots.instanceId);
|
|
49
|
+
}
|
|
50
|
+
/** T1b: the store header with the INITIALIZING marker, the own pin and the stream state. */
|
|
51
|
+
export function t1Header(tx, input) {
|
|
52
|
+
const doc = expectType(parseDocument(input.certificate), DocumentType.AccountDevice, "t1");
|
|
53
|
+
const pin = pinFromCertificate(doc);
|
|
54
|
+
if (!equalBytes(pin.identityId, input.account.identityId))
|
|
55
|
+
throw new KavachError("MALFORMED", "t1", "certificate is not for this account");
|
|
56
|
+
tx.put("meta", META, {
|
|
57
|
+
schema: 1,
|
|
58
|
+
historyIndex: 1,
|
|
59
|
+
newest: 1,
|
|
60
|
+
instanceId: toHex(input.instanceId),
|
|
61
|
+
accountName: input.account.accountName,
|
|
62
|
+
identityId: toHex(input.account.identityId),
|
|
63
|
+
certificateHash: toHex(pin.certificateHash),
|
|
64
|
+
state: "INITIALIZING"
|
|
65
|
+
});
|
|
66
|
+
tx.put("self", SELF, {
|
|
67
|
+
generation: big(input.generation),
|
|
68
|
+
deviceId: toHex(input.device.deviceId),
|
|
69
|
+
certificate: toHex(input.certificate),
|
|
70
|
+
certificateHash: toHex(pin.certificateHash),
|
|
71
|
+
streamId: toHex(pin.streamId)
|
|
72
|
+
});
|
|
73
|
+
tx.put("pins", toHex(pin.identityId), pinToRow(pin));
|
|
74
|
+
tx.put("certificates", toHex(pin.certificateHash), {
|
|
75
|
+
identityId: toHex(pin.identityId),
|
|
76
|
+
certificateHash: toHex(pin.certificateHash),
|
|
77
|
+
signingKey: toHex(pin.signingKey),
|
|
78
|
+
boxKey: toHex(pin.boxKey),
|
|
79
|
+
streamId: toHex(pin.streamId),
|
|
80
|
+
generation: big(input.generation),
|
|
81
|
+
wire: toHex(input.certificate),
|
|
82
|
+
current: true
|
|
83
|
+
});
|
|
84
|
+
tx.put("stream", STREAM, { highestCommittedEpoch: 0, activeEpoch: undefined, pendingEpoch: undefined });
|
|
85
|
+
tx.put("revision", REVISION, revisionToRow(initialRevisionState, undefined));
|
|
86
|
+
}
|
|
87
|
+
/** T1c: ACTIVE once the certificate is durable at the host. */
|
|
88
|
+
export function t1Activate(tx) {
|
|
89
|
+
const meta = tx.get("meta", META);
|
|
90
|
+
if (!meta)
|
|
91
|
+
throw new KavachError("STORAGE_FAILURE", "t1", "no header");
|
|
92
|
+
tx.put("meta", META, { ...meta, state: "ACTIVE" });
|
|
93
|
+
}
|
|
94
|
+
// T2 ----------------------------------------------------------------------------------------------
|
|
95
|
+
/** T2: the exact replacement certificate and vault bytes prepared for activation. */
|
|
96
|
+
export function t2PrepareActivation(tx, row) {
|
|
97
|
+
tx.put("activation", "pending", row);
|
|
98
|
+
const meta = tx.get("meta", META);
|
|
99
|
+
if (meta)
|
|
100
|
+
tx.put("meta", META, { ...meta, state: "ACTIVATION_PENDING" });
|
|
101
|
+
}
|
|
102
|
+
/**
|
|
103
|
+
* T3: a verified circle or device change. Bumps the desired revision, invalidates the active
|
|
104
|
+
* epoch, burns its counters and cancels queued (not yet handed off) outbox rows sealed under the
|
|
105
|
+
* obsolete revision. Pauses with `rotation`.
|
|
106
|
+
*/
|
|
107
|
+
export function t3ApplyChange(tx, event) {
|
|
108
|
+
const row = tx.get("revision", REVISION);
|
|
109
|
+
const state = row ? rowToRevision(row) : initialRevisionState;
|
|
110
|
+
const { state: next, changed } = applyAudienceEvent(state, event);
|
|
111
|
+
if (!changed)
|
|
112
|
+
return { changed: false, desiredRevision: state.desiredRevision, cancelled: [] };
|
|
113
|
+
tx.put("revision", REVISION, revisionToRow(next, "rotation"));
|
|
114
|
+
const stream = tx.get("stream", STREAM);
|
|
115
|
+
if (stream?.activeEpoch !== undefined) {
|
|
116
|
+
const active = tx.get("epochs", String(stream.activeEpoch));
|
|
117
|
+
if (active)
|
|
118
|
+
tx.put("epochs", String(stream.activeEpoch), { ...active, status: "obsolete" });
|
|
119
|
+
tx.put("stream", STREAM, { ...stream, activeEpoch: undefined });
|
|
120
|
+
}
|
|
121
|
+
const cancelled = [];
|
|
122
|
+
for (const [key, out] of tx.list("outbox")) {
|
|
123
|
+
if (out.status === "queued" && unbig(out.desiredRevision) < next.desiredRevision) {
|
|
124
|
+
tx.put("outbox", key, { ...out, wire: "", status: "cancelled", reason: "rotation" });
|
|
125
|
+
cancelled.push(key);
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
return { changed: true, desiredRevision: next.desiredRevision, cancelled };
|
|
129
|
+
}
|
|
130
|
+
/**
|
|
131
|
+
* T3c: one circle row change with its bookkeeping. The row is stored, the audience event it
|
|
132
|
+
* implies (if any) rotates the sending epoch, and the vault is marked so the backup follows the
|
|
133
|
+
* rows. Every circle write except the restore from the vault itself goes through here.
|
|
134
|
+
*/
|
|
135
|
+
export function t3Circle(tx, row, event) {
|
|
136
|
+
tx.put("circles", row.circleId, row);
|
|
137
|
+
t9MarkVault(tx);
|
|
138
|
+
return event ? t3ApplyChange(tx, event) : { changed: false, desiredRevision: currentRevision(tx), cancelled: [] };
|
|
139
|
+
}
|
|
140
|
+
export function currentRevision(tx) {
|
|
141
|
+
const row = tx.get("revision", REVISION);
|
|
142
|
+
return row ? unbig(row.desiredRevision) : 1n;
|
|
143
|
+
}
|
|
144
|
+
// T4 and T5 ---------------------------------------------------------------------------------------
|
|
145
|
+
/** T4: the exact manifest, wraps, key and audience checkpoint of a prepared epoch. One unresolved epoch per stream. */
|
|
146
|
+
export function t4PersistPrepared(tx, prepared) {
|
|
147
|
+
const stream = tx.get("stream", STREAM) ?? { highestCommittedEpoch: 0, activeEpoch: undefined, pendingEpoch: undefined };
|
|
148
|
+
// Never overwrite an unresolved epoch, even at the same number: a second preparation carries a
|
|
149
|
+
// different key, and publishing both is an equivocation against ourselves.
|
|
150
|
+
if (stream.pendingEpoch !== undefined)
|
|
151
|
+
throw new KavachError("ROTATION_REQUIRED", "t4", "an epoch is already unresolved");
|
|
152
|
+
if (prepared.epoch !== stream.highestCommittedEpoch + 1)
|
|
153
|
+
throw new KavachError("MALFORMED", "t4", "epoch must be highestCommitted + 1");
|
|
154
|
+
tx.put("epochs", String(prepared.epoch), preparedToRow(prepared));
|
|
155
|
+
tx.put("stream", STREAM, { ...stream, pendingEpoch: prepared.epoch });
|
|
156
|
+
}
|
|
157
|
+
/** T5: a committed publication. Promotion is conditional on the revision and the exact audience. */
|
|
158
|
+
export function t5Committed(tx, epoch, currentAudienceKey) {
|
|
159
|
+
const stream = tx.get("stream", STREAM);
|
|
160
|
+
const row = tx.get("epochs", String(epoch));
|
|
161
|
+
if (!stream || !row)
|
|
162
|
+
throw new KavachError("STORAGE_FAILURE", "t5", "unknown epoch");
|
|
163
|
+
// Idempotent: two contexts can both learn of one publication. The second must not reset a
|
|
164
|
+
// counter the first already started allocating from.
|
|
165
|
+
if (row.status === "active")
|
|
166
|
+
return "PROMOTED";
|
|
167
|
+
if (row.status === "obsolete" || row.status === "retired")
|
|
168
|
+
return "OBSOLETE";
|
|
169
|
+
const outcome = promote(rowToPrepared(row), currentRevision(tx), currentAudienceKey);
|
|
170
|
+
const revision = tx.get("revision", REVISION);
|
|
171
|
+
if (outcome === "PROMOTED") {
|
|
172
|
+
tx.put("epochs", String(epoch), { ...row, status: "active", nextCounter: 0 });
|
|
173
|
+
tx.put("stream", STREAM, { highestCommittedEpoch: Math.max(stream.highestCommittedEpoch, epoch), activeEpoch: epoch, pendingEpoch: undefined });
|
|
174
|
+
// A promoted epoch resolved whatever paused sending: the rotation, the missing certificate,
|
|
175
|
+
// or the audience limit. The sync pause belongs to the host and stays.
|
|
176
|
+
if (revision?.paused && revision.paused !== "sync")
|
|
177
|
+
tx.put("revision", REVISION, { ...revision, paused: undefined });
|
|
178
|
+
}
|
|
179
|
+
else {
|
|
180
|
+
tx.put("epochs", String(epoch), { ...row, status: "obsolete" });
|
|
181
|
+
tx.put("stream", STREAM, { ...stream, highestCommittedEpoch: Math.max(stream.highestCommittedEpoch, epoch), pendingEpoch: undefined });
|
|
182
|
+
}
|
|
183
|
+
return outcome;
|
|
184
|
+
}
|
|
185
|
+
// T8 and T9 ---------------------------------------------------------------------------------------
|
|
186
|
+
/** T8: the owner's successor snapshot, kept until the host confirms it. */
|
|
187
|
+
export function t8OwnerSnapshot(tx, circleId, snapshot, revision, close = false) {
|
|
188
|
+
const key = toHex(circleId);
|
|
189
|
+
const row = tx.get("circles", key);
|
|
190
|
+
if (!row)
|
|
191
|
+
throw new KavachError("STORAGE_FAILURE", "t8", "unknown circle");
|
|
192
|
+
tx.put("circles", key, { ...row, pending: { snapshot: toHex(snapshot), revision: big(revision), ...(close ? { close: true } : {}) } });
|
|
193
|
+
}
|
|
194
|
+
/** T9: a vault update prepared for publication (or confirmed). */
|
|
195
|
+
export function t9Vault(tx, row) {
|
|
196
|
+
tx.put("vault", VAULT, row);
|
|
197
|
+
}
|
|
198
|
+
/** T9 marker: the circle rows changed in this transaction, so the vault has to be derived from them again. */
|
|
199
|
+
export function t9MarkVault(tx) {
|
|
200
|
+
const row = tx.get("vault", VAULT);
|
|
201
|
+
if (row && !row.dirty)
|
|
202
|
+
tx.put("vault", VAULT, { ...row, dirty: true });
|
|
203
|
+
}
|
|
204
|
+
/** Own identity id from the header, for callers that only hold a transaction. */
|
|
205
|
+
export function selfIdentity(tx, accountName, accountKey) {
|
|
206
|
+
const meta = tx.get("meta", META);
|
|
207
|
+
const iid = identityId(accountName, accountKey);
|
|
208
|
+
if (meta && meta.identityId !== toHex(iid))
|
|
209
|
+
throw new KavachError("RECOVERY_REQUIRED", "selfIdentity");
|
|
210
|
+
return iid;
|
|
211
|
+
}
|
|
212
|
+
//# sourceMappingURL=transactions.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"transactions.js","sourceRoot":"","sources":["../src/transactions.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,125 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The transport the host implements (protocol section 13): a directory and a relay. The SDK
|
|
3
|
+
* passes opaque bytes through unchanged; no plaintext payload ever enters this interface.
|
|
4
|
+
*/
|
|
5
|
+
export type MutationStatus = "COMMITTED" | "ALREADY_COMMITTED" | "CONFLICT" | "IGNORED_OLDER" | "RETRYABLE" | "UNAUTHORIZED" | "PERMANENT_FAILURE";
|
|
6
|
+
export interface MutationOutcome {
|
|
7
|
+
readonly status: MutationStatus;
|
|
8
|
+
/** On CONFLICT: the bytes the host currently holds, when it can return them. */
|
|
9
|
+
readonly current?: Uint8Array | undefined;
|
|
10
|
+
readonly currentRevision?: bigint | undefined;
|
|
11
|
+
}
|
|
12
|
+
export interface ResolvedAccount {
|
|
13
|
+
readonly accountName: string;
|
|
14
|
+
readonly accountKey: Uint8Array;
|
|
15
|
+
/** The current certificate wire. */
|
|
16
|
+
readonly certificate: Uint8Array;
|
|
17
|
+
/** When the account's key changed through a reset: the receipt that proves it. */
|
|
18
|
+
readonly resetReceipt?: Uint8Array | undefined;
|
|
19
|
+
}
|
|
20
|
+
export interface JoinRequest {
|
|
21
|
+
readonly circleId: Uint8Array;
|
|
22
|
+
readonly accountName: string;
|
|
23
|
+
readonly action: "join" | "leave";
|
|
24
|
+
readonly requestedAt: bigint;
|
|
25
|
+
}
|
|
26
|
+
export interface Directory {
|
|
27
|
+
resolveAccounts(names: readonly string[]): Promise<readonly ResolvedAccount[]>;
|
|
28
|
+
/** Snapshots name identities; the directory maps them back to accounts (host-trusted, like first contact). */
|
|
29
|
+
resolveIdentities(identityIds: readonly Uint8Array[]): Promise<readonly ResolvedAccount[]>;
|
|
30
|
+
getCertificate(hash: Uint8Array): Promise<Uint8Array | undefined>;
|
|
31
|
+
activateDevice(input: {
|
|
32
|
+
accountName: string;
|
|
33
|
+
expectedCertificateHash: Uint8Array;
|
|
34
|
+
expectedVaultRevision: bigint;
|
|
35
|
+
expectedVaultHash: Uint8Array;
|
|
36
|
+
newCertificate: Uint8Array;
|
|
37
|
+
newVault: Uint8Array;
|
|
38
|
+
}): Promise<MutationOutcome>;
|
|
39
|
+
registerAccount(input: {
|
|
40
|
+
certificate: Uint8Array;
|
|
41
|
+
vault: Uint8Array;
|
|
42
|
+
}): Promise<MutationOutcome>;
|
|
43
|
+
getVault(accountName: string): Promise<Uint8Array | undefined>;
|
|
44
|
+
publishVault(input: {
|
|
45
|
+
expectedRevision: bigint;
|
|
46
|
+
expectedHash: Uint8Array | undefined;
|
|
47
|
+
newVault: Uint8Array;
|
|
48
|
+
}): Promise<MutationOutcome>;
|
|
49
|
+
getCircle(circleId: Uint8Array): Promise<Uint8Array | undefined>;
|
|
50
|
+
publishOwnedCircle(input: {
|
|
51
|
+
circleId: Uint8Array;
|
|
52
|
+
expectedRevision: bigint;
|
|
53
|
+
expectedHash: Uint8Array | undefined;
|
|
54
|
+
newSnapshot: Uint8Array;
|
|
55
|
+
}): Promise<MutationOutcome>;
|
|
56
|
+
requestJoin(circleId: Uint8Array): Promise<MutationOutcome>;
|
|
57
|
+
requestLeave(circleId: Uint8Array): Promise<MutationOutcome>;
|
|
58
|
+
readRequests(circleId: Uint8Array): Promise<readonly JoinRequest[]>;
|
|
59
|
+
getResetKeyList(): Promise<Uint8Array | undefined>;
|
|
60
|
+
getResetReceipt(resetId: Uint8Array): Promise<Uint8Array | undefined>;
|
|
61
|
+
resetAccount(input: {
|
|
62
|
+
accountName: string;
|
|
63
|
+
expectedOldIdentityId: Uint8Array;
|
|
64
|
+
newCertificate: Uint8Array;
|
|
65
|
+
newVault: Uint8Array;
|
|
66
|
+
resetId: Uint8Array;
|
|
67
|
+
reauthProof: Uint8Array;
|
|
68
|
+
}): Promise<MutationOutcome & {
|
|
69
|
+
receipt?: Uint8Array | undefined;
|
|
70
|
+
}>;
|
|
71
|
+
}
|
|
72
|
+
export interface EpochBundle {
|
|
73
|
+
readonly manifest: Uint8Array;
|
|
74
|
+
/** The caller's own wrap. */
|
|
75
|
+
readonly wrap: Uint8Array | undefined;
|
|
76
|
+
}
|
|
77
|
+
export type AppendStatus = "ACCEPTED" | "ALREADY_ACCEPTED" | "EQUIVOCATION" | "STALE_APPEND" | "RETRYABLE" | "UNAUTHORIZED" | "SUPERSEDED_DEVICE" | "EPOCH_FENCED";
|
|
78
|
+
export interface AppendOutcome {
|
|
79
|
+
readonly status: AppendStatus;
|
|
80
|
+
readonly deliverySeq?: bigint;
|
|
81
|
+
}
|
|
82
|
+
export interface ReadRecordsResult {
|
|
83
|
+
readonly records: readonly {
|
|
84
|
+
readonly deliverySeq: bigint;
|
|
85
|
+
readonly wire: Uint8Array;
|
|
86
|
+
}[];
|
|
87
|
+
readonly nextSeq: bigint;
|
|
88
|
+
readonly tail: bigint;
|
|
89
|
+
readonly expiredThrough: bigint;
|
|
90
|
+
readonly committedCursor: bigint;
|
|
91
|
+
}
|
|
92
|
+
export interface Relay {
|
|
93
|
+
getCurrentEpoch(streamId: Uint8Array): Promise<{
|
|
94
|
+
epoch: number;
|
|
95
|
+
manifestHash: Uint8Array;
|
|
96
|
+
} | undefined>;
|
|
97
|
+
getEpoch(streamId: Uint8Array, epoch: number): Promise<EpochBundle | undefined>;
|
|
98
|
+
publishEpoch(input: {
|
|
99
|
+
streamId: Uint8Array;
|
|
100
|
+
expectedEpoch: number;
|
|
101
|
+
expectedHash: Uint8Array | undefined;
|
|
102
|
+
manifest: Uint8Array;
|
|
103
|
+
wraps: ReadonlyMap<string, Uint8Array>;
|
|
104
|
+
}): Promise<MutationOutcome & {
|
|
105
|
+
currentEpoch?: number | undefined;
|
|
106
|
+
currentManifest?: Uint8Array | undefined;
|
|
107
|
+
}>;
|
|
108
|
+
/** MUST be callable from inside T6h without awaiting: it queues the bytes synchronously and returns a promise. */
|
|
109
|
+
appendRecord(recordId: Uint8Array, wire: Uint8Array): Promise<AppendOutcome>;
|
|
110
|
+
readRecords(streamId: Uint8Array, afterSeq: bigint, limit: number): Promise<ReadRecordsResult>;
|
|
111
|
+
ackThrough(streamId: Uint8Array, cursor: bigint): Promise<{
|
|
112
|
+
status: "COMMITTED" | "CURSOR_OUT_OF_RANGE" | "RETRYABLE" | "UNAUTHORIZED";
|
|
113
|
+
committedCursor?: bigint;
|
|
114
|
+
}>;
|
|
115
|
+
/** The streams this reader is subscribed to (the host creates subscriptions). */
|
|
116
|
+
listSubscriptions(): Promise<readonly {
|
|
117
|
+
streamId: Uint8Array;
|
|
118
|
+
authorIdentityId: Uint8Array;
|
|
119
|
+
}[]>;
|
|
120
|
+
}
|
|
121
|
+
export interface Transport {
|
|
122
|
+
readonly directory: Directory;
|
|
123
|
+
readonly relay: Relay;
|
|
124
|
+
}
|
|
125
|
+
//# sourceMappingURL=transport.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"transport.d.ts","sourceRoot":"","sources":["../src/transport.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"transport.js","sourceRoot":"","sources":["../src/transport.ts"],"names":[],"mappings":"AAAA;;;GAGG"}
|
package/dist/vault.d.ts
ADDED
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
import { decodeRecoveryCode, encodeRecoveryCode, openVault, sealVault, type OpenedVault, type VaultContents, type VaultEntry, type VaultHeader } from "./codec.js";
|
|
2
|
+
export { encodeRecoveryCode, decodeRecoveryCode, openVault, sealVault };
|
|
3
|
+
export type { OpenedVault, VaultContents, VaultEntry, VaultHeader };
|
|
4
|
+
export type ProviderStatus = "available" | "unavailable" | "locked" | "unsupported" | "error";
|
|
5
|
+
export type BackupState = "unknown" | "pending" | "unavailable";
|
|
6
|
+
export interface ProviderLoadResult {
|
|
7
|
+
readonly status: ProviderStatus;
|
|
8
|
+
readonly reason?: string;
|
|
9
|
+
readonly recoveryKey?: Uint8Array;
|
|
10
|
+
}
|
|
11
|
+
export interface ProviderSaveResult {
|
|
12
|
+
readonly status: ProviderStatus;
|
|
13
|
+
readonly reason?: string;
|
|
14
|
+
/** A successful local write is never reported as a completed cloud backup. */
|
|
15
|
+
readonly backupState: BackupState;
|
|
16
|
+
}
|
|
17
|
+
export interface ProviderStatusResult {
|
|
18
|
+
readonly status: ProviderStatus;
|
|
19
|
+
readonly backupState: BackupState;
|
|
20
|
+
readonly reason?: string;
|
|
21
|
+
}
|
|
22
|
+
/** The platform recovery provider the host supplies (synced Keychain, Block Store, ...). */
|
|
23
|
+
export interface RecoveryProvider {
|
|
24
|
+
load(accountName: string, identityId: Uint8Array): Promise<ProviderLoadResult>;
|
|
25
|
+
save(accountName: string, identityId: Uint8Array, recoveryKey: Uint8Array): Promise<ProviderSaveResult>;
|
|
26
|
+
status(): Promise<ProviderStatusResult>;
|
|
27
|
+
/** Logout or retirement: forget local access without deleting the shared item. */
|
|
28
|
+
eraseLocalAccess(): Promise<void>;
|
|
29
|
+
}
|
|
30
|
+
export declare function newRecoveryKey(): Uint8Array;
|
|
31
|
+
/** Seal a vault at a revision with a fresh nonce. Returns the exact bytes and their hash. */
|
|
32
|
+
export declare function buildVault(header: VaultHeader, contents: VaultContents, recoveryKey: Uint8Array): {
|
|
33
|
+
wire: Uint8Array;
|
|
34
|
+
hash: Uint8Array;
|
|
35
|
+
};
|
|
36
|
+
/** Pure edits to the entry list, keeping it sorted and unique by circle id. */
|
|
37
|
+
export declare function upsertEntry(entries: readonly VaultEntry[], entry: VaultEntry): VaultEntry[];
|
|
38
|
+
export declare function removeEntry(entries: readonly VaultEntry[], circleId: Uint8Array): VaultEntry[];
|
|
39
|
+
export type RecoverySource = "provider" | "code";
|
|
40
|
+
export interface RecoveryOutcome {
|
|
41
|
+
readonly vault: OpenedVault;
|
|
42
|
+
readonly recoveryKey: Uint8Array;
|
|
43
|
+
readonly source: RecoverySource;
|
|
44
|
+
readonly providerStatus: ProviderStatus;
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* The recovery order. The provider is asked first; a saved code second; when neither opens the
|
|
48
|
+
* vault the result is `ACCOUNT_RECOVERY_REQUIRED` and the caller preserves what it cannot use.
|
|
49
|
+
* A wrong key is an authentication failure and never a reason to reset.
|
|
50
|
+
*/
|
|
51
|
+
export declare function recoverAccount(input: {
|
|
52
|
+
readonly accountName: string;
|
|
53
|
+
readonly identityId: Uint8Array;
|
|
54
|
+
readonly accountKey: Uint8Array;
|
|
55
|
+
readonly vaultWire: Uint8Array;
|
|
56
|
+
readonly provider: RecoveryProvider;
|
|
57
|
+
readonly recoveryCode?: string;
|
|
58
|
+
}): Promise<RecoveryOutcome>;
|
|
59
|
+
//# sourceMappingURL=vault.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"vault.d.ts","sourceRoot":"","sources":["../src/vault.ts"],"names":[],"mappings":"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"}
|
package/dist/vault.js
ADDED
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The account vault and the recovery order (protocol section 5).
|
|
3
|
+
*
|
|
4
|
+
* The vault carries the account seed, the last device checkpoint and the circle pins with their
|
|
5
|
+
* sharing preference. It never carries a key that decrypts a record. Recovery tries the platform
|
|
6
|
+
* provider, then a saved code, and otherwise reports `ACCOUNT_RECOVERY_REQUIRED`; it never
|
|
7
|
+
* manufactures identity keys.
|
|
8
|
+
*/
|
|
9
|
+
import { compareBytes, equalBytes } from "./bytes.js";
|
|
10
|
+
import { decodeRecoveryCode, encodeRecoveryCode, openVault, sealVault } from "./codec.js";
|
|
11
|
+
import { KEY_BYTES, NONCE_BYTES, bodyHash, randomBytes } from "./crypto.js";
|
|
12
|
+
import { KavachError, isKavachError } from "./errors.js";
|
|
13
|
+
export { encodeRecoveryCode, decodeRecoveryCode, openVault, sealVault };
|
|
14
|
+
export function newRecoveryKey() {
|
|
15
|
+
return randomBytes(KEY_BYTES);
|
|
16
|
+
}
|
|
17
|
+
/** Seal a vault at a revision with a fresh nonce. Returns the exact bytes and their hash. */
|
|
18
|
+
export function buildVault(header, contents, recoveryKey) {
|
|
19
|
+
const wire = sealVault(header, contents, recoveryKey, randomBytes(NONCE_BYTES));
|
|
20
|
+
return { wire, hash: bodyHash(wire) };
|
|
21
|
+
}
|
|
22
|
+
/** Pure edits to the entry list, keeping it sorted and unique by circle id. */
|
|
23
|
+
export function upsertEntry(entries, entry) {
|
|
24
|
+
const rest = entries.filter((e) => !equalBytes(e.circleId, entry.circleId));
|
|
25
|
+
return [...rest, entry].sort((a, b) => compareBytes(a.circleId, b.circleId));
|
|
26
|
+
}
|
|
27
|
+
export function removeEntry(entries, circleId) {
|
|
28
|
+
return entries.filter((e) => !equalBytes(e.circleId, circleId));
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* The recovery order. The provider is asked first; a saved code second; when neither opens the
|
|
32
|
+
* vault the result is `ACCOUNT_RECOVERY_REQUIRED` and the caller preserves what it cannot use.
|
|
33
|
+
* A wrong key is an authentication failure and never a reason to reset.
|
|
34
|
+
*/
|
|
35
|
+
export async function recoverAccount(input) {
|
|
36
|
+
const stage = "recoverAccount";
|
|
37
|
+
const tryOpen = (key) => {
|
|
38
|
+
try {
|
|
39
|
+
return openVault(input.vaultWire, key, input.accountName, input.accountKey);
|
|
40
|
+
}
|
|
41
|
+
catch (e) {
|
|
42
|
+
if (isKavachError(e, "DECRYPT_FAILED"))
|
|
43
|
+
return undefined;
|
|
44
|
+
throw e;
|
|
45
|
+
}
|
|
46
|
+
};
|
|
47
|
+
let providerStatus = "error";
|
|
48
|
+
try {
|
|
49
|
+
const loaded = await input.provider.load(input.accountName, input.identityId);
|
|
50
|
+
providerStatus = loaded.status;
|
|
51
|
+
if (loaded.status === "available" && loaded.recoveryKey) {
|
|
52
|
+
const vault = tryOpen(loaded.recoveryKey);
|
|
53
|
+
if (vault)
|
|
54
|
+
return { vault, recoveryKey: loaded.recoveryKey, source: "provider", providerStatus };
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
catch {
|
|
58
|
+
providerStatus = "error";
|
|
59
|
+
}
|
|
60
|
+
if (input.recoveryCode !== undefined) {
|
|
61
|
+
const key = decodeRecoveryCode(input.recoveryCode);
|
|
62
|
+
const vault = tryOpen(key);
|
|
63
|
+
if (vault)
|
|
64
|
+
return { vault, recoveryKey: key, source: "code", providerStatus };
|
|
65
|
+
throw new KavachError("DECRYPT_FAILED", stage, "recovery code does not open the vault");
|
|
66
|
+
}
|
|
67
|
+
throw new KavachError("ACCOUNT_RECOVERY_REQUIRED", stage, `provider ${providerStatus}, no code`);
|
|
68
|
+
}
|
|
69
|
+
//# sourceMappingURL=vault.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"vault.js","sourceRoot":"","sources":["../src/vault.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,70 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@plane31/blind-relay",
|
|
3
|
-
"version": "0.
|
|
4
|
-
"
|
|
5
|
-
"
|
|
3
|
+
"version": "0.1.2",
|
|
4
|
+
"description": "Kavach v1 protocol: documents, cryptography, state machine. Pure TypeScript, no platform imports.",
|
|
5
|
+
"license": "Apache-2.0",
|
|
6
|
+
"repository": {
|
|
7
|
+
"type": "git",
|
|
8
|
+
"url": "git+https://github.com/plane31-org/kavach.git",
|
|
9
|
+
"directory": "packages/core"
|
|
10
|
+
},
|
|
11
|
+
"homepage": "https://github.com/plane31-org/kavach#readme",
|
|
12
|
+
"bugs": {
|
|
13
|
+
"url": "https://github.com/plane31-org/kavach/issues"
|
|
14
|
+
},
|
|
15
|
+
"keywords": [
|
|
16
|
+
"end-to-end-encryption",
|
|
17
|
+
"e2ee",
|
|
18
|
+
"relay",
|
|
19
|
+
"protocol",
|
|
20
|
+
"circles",
|
|
21
|
+
"sealed-records"
|
|
22
|
+
],
|
|
23
|
+
"publishConfig": {
|
|
24
|
+
"access": "public",
|
|
25
|
+
"provenance": true
|
|
26
|
+
},
|
|
27
|
+
"type": "module",
|
|
28
|
+
"main": "./dist/index.js",
|
|
29
|
+
"types": "./dist/index.d.ts",
|
|
30
|
+
"exports": {
|
|
31
|
+
".": {
|
|
32
|
+
"types": "./dist/index.d.ts",
|
|
33
|
+
"import": "./dist/index.js"
|
|
34
|
+
},
|
|
35
|
+
"./adapters": {
|
|
36
|
+
"types": "./dist/adapters/index.d.ts",
|
|
37
|
+
"import": "./dist/adapters/index.js"
|
|
38
|
+
},
|
|
39
|
+
"./testing": {
|
|
40
|
+
"types": "./dist/testing/index.d.ts",
|
|
41
|
+
"import": "./dist/testing/index.js"
|
|
42
|
+
},
|
|
43
|
+
"./sodium": {
|
|
44
|
+
"types": "./dist/crypto/sodium.d.ts",
|
|
45
|
+
"import": "./dist/crypto/sodium.js"
|
|
46
|
+
}
|
|
47
|
+
},
|
|
48
|
+
"files": [
|
|
49
|
+
"dist",
|
|
50
|
+
"src"
|
|
51
|
+
],
|
|
52
|
+
"sideEffects": false,
|
|
53
|
+
"dependencies": {
|
|
54
|
+
"@noble/ciphers": "^1.0.0",
|
|
55
|
+
"@noble/curves": "^1.6.0",
|
|
56
|
+
"@noble/hashes": "^1.5.0",
|
|
57
|
+
"libsodium-wrappers-sumo": "^0.7.15"
|
|
58
|
+
},
|
|
59
|
+
"devDependencies": {
|
|
60
|
+
"@types/libsodium-wrappers-sumo": "^0.7.8",
|
|
61
|
+
"esbuild": "0.21.5"
|
|
62
|
+
},
|
|
63
|
+
"scripts": {
|
|
64
|
+
"build": "tsc -b",
|
|
65
|
+
"typecheck": "tsc -p tsconfig.json --noEmit",
|
|
66
|
+
"test": "vitest run && KAVACH_CRYPTO=sodium vitest run",
|
|
67
|
+
"test:noble": "vitest run",
|
|
68
|
+
"test:sodium": "KAVACH_CRYPTO=sodium vitest run"
|
|
69
|
+
}
|
|
6
70
|
}
|