@interop/wallet-core 0.41.0 → 0.43.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.
- package/README.md +17 -4
- package/dist/clients/rosterPolicy.d.ts +28 -16
- package/dist/clients/rosterPolicy.d.ts.map +1 -1
- package/dist/clients/rosterPolicy.js +51 -26
- package/dist/clients/rosterPolicy.js.map +1 -1
- package/dist/descriptors/index.d.ts +1 -1
- package/dist/descriptors/index.d.ts.map +1 -1
- package/dist/descriptors/index.js +1 -1
- package/dist/descriptors/index.js.map +1 -1
- package/dist/descriptors/logSource.d.ts +58 -6
- package/dist/descriptors/logSource.d.ts.map +1 -1
- package/dist/descriptors/logSource.js +57 -15
- package/dist/descriptors/logSource.js.map +1 -1
- package/dist/enrollment/enrollment.d.ts.map +1 -1
- package/dist/enrollment/enrollment.js +14 -26
- package/dist/enrollment/enrollment.js.map +1 -1
- package/dist/keyring/fetch.d.ts +12 -0
- package/dist/keyring/fetch.d.ts.map +1 -1
- package/dist/keyring/fetch.js +0 -2
- package/dist/keyring/fetch.js.map +1 -1
- package/dist/keyring/index.d.ts +1 -1
- package/dist/keyring/index.d.ts.map +1 -1
- package/dist/keyring/index.js +1 -1
- package/dist/keyring/index.js.map +1 -1
- package/dist/keyring/kdf.d.ts +22 -6
- package/dist/keyring/kdf.d.ts.map +1 -1
- package/dist/keyring/kdf.js +9 -14
- package/dist/keyring/kdf.js.map +1 -1
- package/dist/keys/index.d.ts +1 -1
- package/dist/keys/index.d.ts.map +1 -1
- package/dist/keys/index.js +1 -1
- package/dist/keys/index.js.map +1 -1
- package/dist/keys/rosterLogStore.d.ts +4 -1
- package/dist/keys/rosterLogStore.d.ts.map +1 -1
- package/dist/keys/rosterLogStore.js +13 -16
- package/dist/keys/rosterLogStore.js.map +1 -1
- package/dist/keys/rosterStore.d.ts +13 -1
- package/dist/keys/rosterStore.d.ts.map +1 -1
- package/dist/keys/rosterStore.js +18 -0
- package/dist/keys/rosterStore.js.map +1 -1
- package/dist/keys/userKeyRoster.d.ts +17 -5
- package/dist/keys/userKeyRoster.d.ts.map +1 -1
- package/dist/keys/userKeyRoster.js +38 -13
- package/dist/keys/userKeyRoster.js.map +1 -1
- package/dist/recovery/index.d.ts +14 -12
- package/dist/recovery/index.d.ts.map +1 -1
- package/dist/recovery/index.js +13 -11
- package/dist/recovery/index.js.map +1 -1
- package/dist/recovery/recoveryCode.d.ts +5 -17
- package/dist/recovery/recoveryCode.d.ts.map +1 -1
- package/dist/recovery/recoveryCode.js +4 -14
- package/dist/recovery/recoveryCode.js.map +1 -1
- package/dist/recovery/recoveryDelegation.d.ts +50 -19
- package/dist/recovery/recoveryDelegation.d.ts.map +1 -1
- package/dist/recovery/recoveryDelegation.js +86 -41
- package/dist/recovery/recoveryDelegation.js.map +1 -1
- package/dist/recovery/recoveryWebvh.d.ts +13 -22
- package/dist/recovery/recoveryWebvh.d.ts.map +1 -1
- package/dist/recovery/recoveryWebvh.js +37 -129
- package/dist/recovery/recoveryWebvh.js.map +1 -1
- package/dist/resourceLog/append.d.ts +12 -3
- package/dist/resourceLog/append.d.ts.map +1 -1
- package/dist/resourceLog/append.js +17 -10
- package/dist/resourceLog/append.js.map +1 -1
- package/dist/resourceLog/index.d.ts +1 -1
- package/dist/resourceLog/index.d.ts.map +1 -1
- package/dist/resourceLog/index.js +1 -1
- package/dist/resourceLog/index.js.map +1 -1
- package/dist/resourceLog/pin.d.ts +46 -8
- package/dist/resourceLog/pin.d.ts.map +1 -1
- package/dist/resourceLog/pin.js +32 -7
- package/dist/resourceLog/pin.js.map +1 -1
- package/dist/resourceLog/seal.d.ts +4 -1
- package/dist/resourceLog/seal.d.ts.map +1 -1
- package/dist/resourceLog/seal.js +6 -2
- package/dist/resourceLog/seal.js.map +1 -1
- package/dist/unlock/index.d.ts +40 -0
- package/dist/unlock/index.d.ts.map +1 -0
- package/dist/unlock/index.js +36 -0
- package/dist/unlock/index.js.map +1 -0
- package/dist/unlock/ladder.d.ts +100 -0
- package/dist/unlock/ladder.d.ts.map +1 -0
- package/dist/unlock/ladder.js +144 -0
- package/dist/unlock/ladder.js.map +1 -0
- package/dist/unlock/selfEnroll.d.ts +83 -0
- package/dist/unlock/selfEnroll.d.ts.map +1 -0
- package/dist/unlock/selfEnroll.js +126 -0
- package/dist/unlock/selfEnroll.js.map +1 -0
- package/dist/unlock/standingClient.d.ts +68 -0
- package/dist/unlock/standingClient.d.ts.map +1 -0
- package/dist/unlock/standingClient.js +81 -0
- package/dist/unlock/standingClient.js.map +1 -0
- package/dist/unlock/standingWebvh.d.ts +153 -0
- package/dist/unlock/standingWebvh.d.ts.map +1 -0
- package/dist/unlock/standingWebvh.js +370 -0
- package/dist/unlock/standingWebvh.js.map +1 -0
- package/dist/unlock/unlockRecord.d.ts +207 -0
- package/dist/unlock/unlockRecord.d.ts.map +1 -0
- package/dist/unlock/unlockRecord.js +435 -0
- package/dist/unlock/unlockRecord.js.map +1 -0
- package/dist/webvh/didWebvh.d.ts +94 -6
- package/dist/webvh/didWebvh.d.ts.map +1 -1
- package/dist/webvh/didWebvh.js +175 -19
- package/dist/webvh/didWebvh.js.map +1 -1
- package/dist/webvh/index.d.ts +7 -2
- package/dist/webvh/index.d.ts.map +1 -1
- package/dist/webvh/index.js +7 -2
- package/dist/webvh/index.js.map +1 -1
- package/dist/webvh/keyAgreement.d.ts +22 -6
- package/dist/webvh/keyAgreement.d.ts.map +1 -1
- package/dist/webvh/keyAgreement.js +1 -1
- package/dist/webvh/keyAgreement.js.map +1 -1
- package/dist/webvh/verifyLog.d.ts +15 -2
- package/dist/webvh/verifyLog.d.ts.map +1 -1
- package/dist/webvh/verifyLog.js +22 -3
- package/dist/webvh/verifyLog.js.map +1 -1
- package/package.json +11 -5
- package/dist/recovery/recoveryRecord.d.ts +0 -172
- package/dist/recovery/recoveryRecord.d.ts.map +0 -1
- package/dist/recovery/recoveryRecord.js +0 -288
- package/dist/recovery/recoveryRecord.js.map +0 -1
|
@@ -33,21 +33,23 @@ import { verifyResourceLog } from './verify.js';
|
|
|
33
33
|
* (also confirming any `history` dispatch hint the caller followed)
|
|
34
34
|
* @param options.pinStore {ResourceLogPinStore} this client's pin for this
|
|
35
35
|
* log
|
|
36
|
+
* @param options.logId {string} the pin-slot key for this log, from
|
|
37
|
+
* `resourceLogPinId`
|
|
36
38
|
* @returns {Promise<{ verified: VerifiedResourceLog; etag?: string } | null>}
|
|
37
39
|
*/
|
|
38
|
-
export async function readResourceLog({ store, controller, expectedMethod, pinStore }) {
|
|
40
|
+
export async function readResourceLog({ store, controller, expectedMethod, pinStore, logId }) {
|
|
39
41
|
const current = await store.read();
|
|
40
42
|
if (current === null) {
|
|
41
43
|
return null;
|
|
42
44
|
}
|
|
43
|
-
const pin = await pinStore.read();
|
|
45
|
+
const pin = await pinStore.read({ logId });
|
|
44
46
|
const verified = await verifyResourceLog({
|
|
45
47
|
entries: current.entries,
|
|
46
48
|
controller,
|
|
47
49
|
expectedMethod,
|
|
48
50
|
pin
|
|
49
51
|
});
|
|
50
|
-
await pinStore.write(verified.pin);
|
|
52
|
+
await pinStore.write({ logId, pin: verified.pin });
|
|
51
53
|
return { verified, etag: current.etag };
|
|
52
54
|
}
|
|
53
55
|
/**
|
|
@@ -64,6 +66,8 @@ export async function readResourceLog({ store, controller, expectedMethod, pinSt
|
|
|
64
66
|
* @param options.controller {ResourceLogController}
|
|
65
67
|
* @param options.expectedMethod {string}
|
|
66
68
|
* @param options.pinStore {ResourceLogPinStore}
|
|
69
|
+
* @param options.logId {string} the pin-slot key for this log, from
|
|
70
|
+
* `resourceLogPinId`
|
|
67
71
|
* @param options.signer {ResourceLogSigner}
|
|
68
72
|
* @param options.buildState {function} `(verified) => state | null` -- the
|
|
69
73
|
* full next state rebased on the verified head, or `null` when the head
|
|
@@ -74,14 +78,15 @@ export async function readResourceLog({ store, controller, expectedMethod, pinSt
|
|
|
74
78
|
* @returns {Promise<VerifiedResourceLog>} the read-back, re-verified log
|
|
75
79
|
* (whether or not this call appended)
|
|
76
80
|
*/
|
|
77
|
-
export async function appendResourceLog({ store, controller, expectedMethod, pinStore, signer, buildState, versionTime, maxAttempts = 3 }) {
|
|
81
|
+
export async function appendResourceLog({ store, controller, expectedMethod, pinStore, logId, signer, buildState, versionTime, maxAttempts = 3 }) {
|
|
78
82
|
let lastConflict;
|
|
79
83
|
for (let attempt = 0; attempt < maxAttempts; attempt++) {
|
|
80
84
|
const current = await readResourceLog({
|
|
81
85
|
store,
|
|
82
86
|
controller,
|
|
83
87
|
expectedMethod,
|
|
84
|
-
pinStore
|
|
88
|
+
pinStore,
|
|
89
|
+
logId
|
|
85
90
|
});
|
|
86
91
|
if (current === null) {
|
|
87
92
|
throw new Error('Cannot append to the resource log: the log does not exist yet ' +
|
|
@@ -124,9 +129,9 @@ export async function appendResourceLog({ store, controller, expectedMethod, pin
|
|
|
124
129
|
entries: readBack.entries,
|
|
125
130
|
controller,
|
|
126
131
|
expectedMethod,
|
|
127
|
-
pin: await pinStore.read()
|
|
132
|
+
pin: await pinStore.read({ logId })
|
|
128
133
|
});
|
|
129
|
-
await pinStore.write(confirmed.pin);
|
|
134
|
+
await pinStore.write({ logId, pin: confirmed.pin });
|
|
130
135
|
return confirmed;
|
|
131
136
|
}
|
|
132
137
|
throw new Error(`Appending to the resource log lost the compare-and-swap race ` +
|
|
@@ -145,6 +150,8 @@ export async function appendResourceLog({ store, controller, expectedMethod, pin
|
|
|
145
150
|
* @param options.controller {ResourceLogController}
|
|
146
151
|
* @param options.method {string} the format identifier to declare
|
|
147
152
|
* @param options.pinStore {ResourceLogPinStore}
|
|
153
|
+
* @param options.logId {string} the pin-slot key for this log, from
|
|
154
|
+
* `resourceLogPinId`
|
|
148
155
|
* @param options.signer {ResourceLogSigner}
|
|
149
156
|
* @param options.state {ResourceLogEntry['state']} the full initial state
|
|
150
157
|
* @param [options.previousLog] {object} handover successors only
|
|
@@ -152,7 +159,7 @@ export async function appendResourceLog({ store, controller, expectedMethod, pin
|
|
|
152
159
|
* @returns {Promise<{ verified: VerifiedResourceLog; created: boolean }>}
|
|
153
160
|
* the verified log as it now stands, and whether this call created it
|
|
154
161
|
*/
|
|
155
|
-
export async function createResourceLog({ store, controller, method, pinStore, signer, state, previousLog, versionTime }) {
|
|
162
|
+
export async function createResourceLog({ store, controller, method, pinStore, logId, signer, state, previousLog, versionTime }) {
|
|
156
163
|
const genesis = await buildResourceLogGenesis({
|
|
157
164
|
state,
|
|
158
165
|
method,
|
|
@@ -182,9 +189,9 @@ export async function createResourceLog({ store, controller, method, pinStore, s
|
|
|
182
189
|
entries: current.entries,
|
|
183
190
|
controller,
|
|
184
191
|
expectedMethod: method,
|
|
185
|
-
pin: await pinStore.read()
|
|
192
|
+
pin: await pinStore.read({ logId })
|
|
186
193
|
});
|
|
187
|
-
await pinStore.write(verified.pin);
|
|
194
|
+
await pinStore.write({ logId, pin: verified.pin });
|
|
188
195
|
return { verified, created };
|
|
189
196
|
}
|
|
190
197
|
//# sourceMappingURL=append.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"append.js","sourceRoot":"","sources":["../../src/resourceLog/append.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH;;;;;;;;;;GAUG;AACH,OAAO,EAAE,uBAAuB,EAAE,MAAM,qBAAqB,CAAA;AAC7D,OAAO,EACL,aAAa,EAGd,MAAM,yBAAyB,CAAA;AAEhC,OAAO,EAAE,sBAAsB,EAAE,MAAM,aAAa,CAAA;AACpD,OAAO,EACL,qBAAqB,EACrB,uBAAuB,EAExB,MAAM,YAAY,CAAA;AAEnB,OAAO,EAAE,iBAAiB,EAA4B,MAAM,aAAa,CAAA;AAEzE
|
|
1
|
+
{"version":3,"file":"append.js","sourceRoot":"","sources":["../../src/resourceLog/append.ts"],"names":[],"mappings":"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"}
|
|
@@ -19,7 +19,7 @@
|
|
|
19
19
|
export { webvhResourceLogController, type ResourceLogController } from './controller.js';
|
|
20
20
|
export { ResourceLogClosedError, ResourceLogContinuityError, ResourceLogIntegrityError } from './errors.js';
|
|
21
21
|
export { buildResourceLogEntry, buildResourceLogGenesis, type ResourceLogSigner } from './entry.js';
|
|
22
|
-
export { memoryResourceLogPinStore, type ResourceLogHeadPin, type ResourceLogPinStore } from './pin.js';
|
|
22
|
+
export { memoryResourceLogPinStore, resourceLogPinId, type ResourceLogHeadPin, type ResourceLogPinStore } from './pin.js';
|
|
23
23
|
export { isTerminalResourceLogEntry, verifyResourceLog, verifyResourceLogHandover, type VerifiedResourceLog } from './verify.js';
|
|
24
24
|
export { appendResourceLog, createResourceLog, readResourceLog } from './append.js';
|
|
25
25
|
export { latestAssertionRemovalIndex, sealResourceLog } from './seal.js';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/resourceLog/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH;;;;;;;;;;;;;;GAcG;AACH,OAAO,EACL,0BAA0B,EAC1B,KAAK,qBAAqB,EAC3B,MAAM,iBAAiB,CAAA;AACxB,OAAO,EACL,sBAAsB,EACtB,0BAA0B,EAC1B,yBAAyB,EAC1B,MAAM,aAAa,CAAA;AACpB,OAAO,EACL,qBAAqB,EACrB,uBAAuB,EACvB,KAAK,iBAAiB,EACvB,MAAM,YAAY,CAAA;AACnB,OAAO,EACL,yBAAyB,EACzB,KAAK,kBAAkB,EACvB,KAAK,mBAAmB,EACzB,MAAM,UAAU,CAAA;AACjB,OAAO,EACL,0BAA0B,EAC1B,iBAAiB,EACjB,yBAAyB,EACzB,KAAK,mBAAmB,EACzB,MAAM,aAAa,CAAA;AACpB,OAAO,EACL,iBAAiB,EACjB,iBAAiB,EACjB,eAAe,EAChB,MAAM,aAAa,CAAA;AACpB,OAAO,EAAE,2BAA2B,EAAE,eAAe,EAAE,MAAM,WAAW,CAAA;AACxE,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAA"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/resourceLog/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH;;;;;;;;;;;;;;GAcG;AACH,OAAO,EACL,0BAA0B,EAC1B,KAAK,qBAAqB,EAC3B,MAAM,iBAAiB,CAAA;AACxB,OAAO,EACL,sBAAsB,EACtB,0BAA0B,EAC1B,yBAAyB,EAC1B,MAAM,aAAa,CAAA;AACpB,OAAO,EACL,qBAAqB,EACrB,uBAAuB,EACvB,KAAK,iBAAiB,EACvB,MAAM,YAAY,CAAA;AACnB,OAAO,EACL,yBAAyB,EACzB,gBAAgB,EAChB,KAAK,kBAAkB,EACvB,KAAK,mBAAmB,EACzB,MAAM,UAAU,CAAA;AACjB,OAAO,EACL,0BAA0B,EAC1B,iBAAiB,EACjB,yBAAyB,EACzB,KAAK,mBAAmB,EACzB,MAAM,aAAa,CAAA;AACpB,OAAO,EACL,iBAAiB,EACjB,iBAAiB,EACjB,eAAe,EAChB,MAAM,aAAa,CAAA;AACpB,OAAO,EAAE,2BAA2B,EAAE,eAAe,EAAE,MAAM,WAAW,CAAA;AACxE,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAA"}
|
|
@@ -19,7 +19,7 @@
|
|
|
19
19
|
export { webvhResourceLogController } from './controller.js';
|
|
20
20
|
export { ResourceLogClosedError, ResourceLogContinuityError, ResourceLogIntegrityError } from './errors.js';
|
|
21
21
|
export { buildResourceLogEntry, buildResourceLogGenesis } from './entry.js';
|
|
22
|
-
export { memoryResourceLogPinStore } from './pin.js';
|
|
22
|
+
export { memoryResourceLogPinStore, resourceLogPinId } from './pin.js';
|
|
23
23
|
export { isTerminalResourceLogEntry, verifyResourceLog, verifyResourceLogHandover } from './verify.js';
|
|
24
24
|
export { appendResourceLog, createResourceLog, readResourceLog } from './append.js';
|
|
25
25
|
export { latestAssertionRemovalIndex, sealResourceLog } from './seal.js';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/resourceLog/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH;;;;;;;;;;;;;;GAcG;AACH,OAAO,EACL,0BAA0B,EAE3B,MAAM,iBAAiB,CAAA;AACxB,OAAO,EACL,sBAAsB,EACtB,0BAA0B,EAC1B,yBAAyB,EAC1B,MAAM,aAAa,CAAA;AACpB,OAAO,EACL,qBAAqB,EACrB,uBAAuB,EAExB,MAAM,YAAY,CAAA;AACnB,OAAO,EACL,yBAAyB,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/resourceLog/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH;;;;;;;;;;;;;;GAcG;AACH,OAAO,EACL,0BAA0B,EAE3B,MAAM,iBAAiB,CAAA;AACxB,OAAO,EACL,sBAAsB,EACtB,0BAA0B,EAC1B,yBAAyB,EAC1B,MAAM,aAAa,CAAA;AACpB,OAAO,EACL,qBAAqB,EACrB,uBAAuB,EAExB,MAAM,YAAY,CAAA;AACnB,OAAO,EACL,yBAAyB,EACzB,gBAAgB,EAGjB,MAAM,UAAU,CAAA;AACjB,OAAO,EACL,0BAA0B,EAC1B,iBAAiB,EACjB,yBAAyB,EAE1B,MAAM,aAAa,CAAA;AACpB,OAAO,EACL,iBAAiB,EACjB,iBAAiB,EACjB,eAAe,EAChB,MAAM,aAAa,CAAA;AACpB,OAAO,EAAE,2BAA2B,EAAE,eAAe,EAAE,MAAM,WAAW,CAAA;AACxE,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAA"}
|
|
@@ -11,6 +11,12 @@
|
|
|
11
11
|
* adopted. Storage is the app's concern (freewallet: beside its other pins in
|
|
12
12
|
* localStorage; DCW: a table row), so only the seam lives here, plus an
|
|
13
13
|
* in-memory implementation for tests and single-session use.
|
|
14
|
+
*
|
|
15
|
+
* The seam is keyed: every read and write names the log it concerns with a
|
|
16
|
+
* `logId`, so one store instance serves every log a wallet holds. Wallet-core
|
|
17
|
+
* supplies the key at every call, built by {@link resourceLogPinId} (or one of
|
|
18
|
+
* the named builders over it), so an app implements one keyed store and never
|
|
19
|
+
* chooses keys itself.
|
|
14
20
|
*/
|
|
15
21
|
/**
|
|
16
22
|
* One log's pin: the format identifier from the genesis `parameters.method`,
|
|
@@ -25,18 +31,50 @@ export interface ResourceLogHeadPin {
|
|
|
25
31
|
head: string;
|
|
26
32
|
}
|
|
27
33
|
/**
|
|
28
|
-
* Where a client keeps its chain-head pins, one record per log
|
|
29
|
-
* resolves `null` before first contact
|
|
30
|
-
* transitions (advance after full verification,
|
|
31
|
-
* handover) -- the verifier never regresses a pin.
|
|
34
|
+
* Where a client keeps its chain-head pins, one record per log, keyed by
|
|
35
|
+
* `logId`. `read` resolves `null` before first contact with that log. Writes
|
|
36
|
+
* happen only on the two legal transitions (advance after full verification,
|
|
37
|
+
* replace across a verified handover) -- the verifier never regresses a pin.
|
|
38
|
+
*
|
|
39
|
+
* The `logId` uniquely names one log among all the logs this store instance
|
|
40
|
+
* serves: one store may serve every log a wallet holds, keyed per log, and two
|
|
41
|
+
* different logs must never share a `logId`. Wallet-core supplies the key at
|
|
42
|
+
* every read and write, built by {@link resourceLogPinId} (or one of the named
|
|
43
|
+
* builders over it), so an implementation never chooses keys of its own.
|
|
32
44
|
*/
|
|
33
45
|
export interface ResourceLogPinStore {
|
|
34
|
-
read(
|
|
35
|
-
|
|
46
|
+
read(options: {
|
|
47
|
+
logId: string;
|
|
48
|
+
}): Promise<ResourceLogHeadPin | null>;
|
|
49
|
+
write(options: {
|
|
50
|
+
logId: string;
|
|
51
|
+
pin: ResourceLogHeadPin;
|
|
52
|
+
}): Promise<void>;
|
|
36
53
|
}
|
|
37
54
|
/**
|
|
38
|
-
*
|
|
39
|
-
*
|
|
55
|
+
* The pin-slot key for one log: an opaque per-log identity key for pin
|
|
56
|
+
* storage, not a fetchable path or URL.
|
|
57
|
+
*
|
|
58
|
+
* It is deliberately host-free. The `spaceId` is the account's stable random
|
|
59
|
+
* id, so a log served from a claimed new host lands in the SAME pin slot and
|
|
60
|
+
* is checked against the pin already held, rather than opening a fresh
|
|
61
|
+
* trust-on-first-use slate (the mirror-fork concern).
|
|
62
|
+
*
|
|
63
|
+
* @param options {object}
|
|
64
|
+
* @param options.spaceId {string} the Space the log lives in
|
|
65
|
+
* @param options.collectionId {string} the collection holding the log
|
|
66
|
+
* @param options.resourceId {string} the log resource's id
|
|
67
|
+
* @returns {string}
|
|
68
|
+
*/
|
|
69
|
+
export declare function resourceLogPinId({ spaceId, collectionId, resourceId }: {
|
|
70
|
+
spaceId: string;
|
|
71
|
+
collectionId: string;
|
|
72
|
+
resourceId: string;
|
|
73
|
+
}): string;
|
|
74
|
+
/**
|
|
75
|
+
* An in-memory pin store: continuity within one session only, keyed by
|
|
76
|
+
* `logId` like any other implementation, so one instance serves several logs.
|
|
77
|
+
* Tests use it as the seam's reference implementation; apps persist for real.
|
|
40
78
|
*
|
|
41
79
|
* @returns {ResourceLogPinStore}
|
|
42
80
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pin.d.ts","sourceRoot":"","sources":["../../src/resourceLog/pin.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH
|
|
1
|
+
{"version":3,"file":"pin.d.ts","sourceRoot":"","sources":["../../src/resourceLog/pin.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH;;;;;;;;;;;;;;;;GAgBG;AAEH;;;;;;GAMG;AACH,MAAM,WAAW,kBAAkB;IACjC,MAAM,EAAE,MAAM,CAAA;IACd,IAAI,EAAE,MAAM,CAAA;IACZ,IAAI,EAAE,MAAM,CAAA;CACb;AAED;;;;;;;;;;;GAWG;AACH,MAAM,WAAW,mBAAmB;IAClC,IAAI,CAAC,OAAO,EAAE;QAAE,KAAK,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,kBAAkB,GAAG,IAAI,CAAC,CAAA;IACpE,KAAK,CAAC,OAAO,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,kBAAkB,CAAA;KAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;CAC1E;AAED;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,gBAAgB,CAAC,EAC/B,OAAO,EACP,YAAY,EACZ,UAAU,EACX,EAAE;IACD,OAAO,EAAE,MAAM,CAAA;IACf,YAAY,EAAE,MAAM,CAAA;IACpB,UAAU,EAAE,MAAM,CAAA;CACnB,GAAG,MAAM,CAET;AAED;;;;;;GAMG;AACH,wBAAgB,yBAAyB,IAAI,mBAAmB,CAU/D"}
|
package/dist/resourceLog/pin.js
CHANGED
|
@@ -11,21 +11,46 @@
|
|
|
11
11
|
* adopted. Storage is the app's concern (freewallet: beside its other pins in
|
|
12
12
|
* localStorage; DCW: a table row), so only the seam lives here, plus an
|
|
13
13
|
* in-memory implementation for tests and single-session use.
|
|
14
|
+
*
|
|
15
|
+
* The seam is keyed: every read and write names the log it concerns with a
|
|
16
|
+
* `logId`, so one store instance serves every log a wallet holds. Wallet-core
|
|
17
|
+
* supplies the key at every call, built by {@link resourceLogPinId} (or one of
|
|
18
|
+
* the named builders over it), so an app implements one keyed store and never
|
|
19
|
+
* chooses keys itself.
|
|
20
|
+
*/
|
|
21
|
+
/**
|
|
22
|
+
* The pin-slot key for one log: an opaque per-log identity key for pin
|
|
23
|
+
* storage, not a fetchable path or URL.
|
|
24
|
+
*
|
|
25
|
+
* It is deliberately host-free. The `spaceId` is the account's stable random
|
|
26
|
+
* id, so a log served from a claimed new host lands in the SAME pin slot and
|
|
27
|
+
* is checked against the pin already held, rather than opening a fresh
|
|
28
|
+
* trust-on-first-use slate (the mirror-fork concern).
|
|
29
|
+
*
|
|
30
|
+
* @param options {object}
|
|
31
|
+
* @param options.spaceId {string} the Space the log lives in
|
|
32
|
+
* @param options.collectionId {string} the collection holding the log
|
|
33
|
+
* @param options.resourceId {string} the log resource's id
|
|
34
|
+
* @returns {string}
|
|
14
35
|
*/
|
|
36
|
+
export function resourceLogPinId({ spaceId, collectionId, resourceId }) {
|
|
37
|
+
return `space/${spaceId}/${collectionId}/${resourceId}`;
|
|
38
|
+
}
|
|
15
39
|
/**
|
|
16
|
-
* An in-memory pin store: continuity within one session only
|
|
17
|
-
*
|
|
40
|
+
* An in-memory pin store: continuity within one session only, keyed by
|
|
41
|
+
* `logId` like any other implementation, so one instance serves several logs.
|
|
42
|
+
* Tests use it as the seam's reference implementation; apps persist for real.
|
|
18
43
|
*
|
|
19
44
|
* @returns {ResourceLogPinStore}
|
|
20
45
|
*/
|
|
21
46
|
export function memoryResourceLogPinStore() {
|
|
22
|
-
|
|
47
|
+
const pins = new Map();
|
|
23
48
|
return {
|
|
24
|
-
async read() {
|
|
25
|
-
return
|
|
49
|
+
async read({ logId }) {
|
|
50
|
+
return pins.get(logId) ?? null;
|
|
26
51
|
},
|
|
27
|
-
async write(
|
|
28
|
-
pin
|
|
52
|
+
async write({ logId, pin }) {
|
|
53
|
+
pins.set(logId, pin);
|
|
29
54
|
}
|
|
30
55
|
};
|
|
31
56
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pin.js","sourceRoot":"","sources":["../../src/resourceLog/pin.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH
|
|
1
|
+
{"version":3,"file":"pin.js","sourceRoot":"","sources":["../../src/resourceLog/pin.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH;;;;;;;;;;;;;;;;GAgBG;AAgCH;;;;;;;;;;;;;;GAcG;AACH,MAAM,UAAU,gBAAgB,CAAC,EAC/B,OAAO,EACP,YAAY,EACZ,UAAU,EAKX;IACC,OAAO,SAAS,OAAO,IAAI,YAAY,IAAI,UAAU,EAAE,CAAA;AACzD,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,yBAAyB;IACvC,MAAM,IAAI,GAAG,IAAI,GAAG,EAA8B,CAAA;IAClD,OAAO;QACL,KAAK,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE;YAClB,OAAO,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,IAAI,CAAA;QAChC,CAAC;QACD,KAAK,CAAC,KAAK,CAAC,EAAE,KAAK,EAAE,GAAG,EAAE;YACxB,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,GAAG,CAAC,CAAA;QACtB,CAAC;KACF,CAAA;AACH,CAAC"}
|
|
@@ -67,6 +67,8 @@ export declare function latestAssertionRemovalIndex({ controller }: {
|
|
|
67
67
|
* @param options.expectedMethod {string} the format identifier expected
|
|
68
68
|
* @param options.pinStore {ResourceLogPinStore} this client's chain-head
|
|
69
69
|
* pin for this log
|
|
70
|
+
* @param options.logId {string} the pin-slot key for this log, from
|
|
71
|
+
* `resourceLogPinId`
|
|
70
72
|
* @param options.signer {ResourceLogSigner} this client's enrolled signing
|
|
71
73
|
* key
|
|
72
74
|
* @param [options.versionTime] {string} RFC3339 UTC; defaults to now
|
|
@@ -79,11 +81,12 @@ export declare function latestAssertionRemovalIndex({ controller }: {
|
|
|
79
81
|
* anything is written
|
|
80
82
|
* @returns {Promise<{ sealed: boolean, verified: VerifiedResourceLog | null }>}
|
|
81
83
|
*/
|
|
82
|
-
export declare function sealResourceLog({ store, controller, expectedMethod, pinStore, signer, versionTime, verified: knownVerified }: {
|
|
84
|
+
export declare function sealResourceLog({ store, controller, expectedMethod, pinStore, logId, signer, versionTime, verified: knownVerified }: {
|
|
83
85
|
store: ResourceLogStore;
|
|
84
86
|
controller: ResourceLogController;
|
|
85
87
|
expectedMethod: string;
|
|
86
88
|
pinStore: ResourceLogPinStore;
|
|
89
|
+
logId: string;
|
|
87
90
|
signer: ResourceLogSigner;
|
|
88
91
|
versionTime?: string;
|
|
89
92
|
verified?: VerifiedResourceLog;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"seal.d.ts","sourceRoot":"","sources":["../../src/resourceLog/seal.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAA;AAE/D,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,iBAAiB,CAAA;AAC5D,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAA;AACnD,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,UAAU,CAAA;AACnD,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAA;AAEtD;;;;;;;;;;;;;GAaG;AACH,wBAAsB,2BAA2B,CAAC,EAChD,UAAU,EACX,EAAE;IACD,UAAU,EAAE,qBAAqB,CAAA;CAClC,GAAG,OAAO,CAAC,MAAM,CAAC,CAgBlB;AAED
|
|
1
|
+
{"version":3,"file":"seal.d.ts","sourceRoot":"","sources":["../../src/resourceLog/seal.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAA;AAE/D,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,iBAAiB,CAAA;AAC5D,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAA;AACnD,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,UAAU,CAAA;AACnD,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAA;AAEtD;;;;;;;;;;;;;GAaG;AACH,wBAAsB,2BAA2B,CAAC,EAChD,UAAU,EACX,EAAE;IACD,UAAU,EAAE,qBAAqB,CAAA;CAClC,GAAG,OAAO,CAAC,MAAM,CAAC,CAgBlB;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAoCG;AACH,wBAAsB,eAAe,CAAC,EACpC,KAAK,EACL,UAAU,EACV,cAAc,EACd,QAAQ,EACR,KAAK,EACL,MAAM,EACN,WAAW,EACX,QAAQ,EAAE,aAAa,EACxB,EAAE;IACD,KAAK,EAAE,gBAAgB,CAAA;IACvB,UAAU,EAAE,qBAAqB,CAAA;IACjC,cAAc,EAAE,MAAM,CAAA;IACtB,QAAQ,EAAE,mBAAmB,CAAA;IAC7B,KAAK,EAAE,MAAM,CAAA;IACb,MAAM,EAAE,iBAAiB,CAAA;IACzB,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,QAAQ,CAAC,EAAE,mBAAmB,CAAA;CAC/B,GAAG,OAAO,CAAC;IAAE,MAAM,EAAE,OAAO,CAAC;IAAC,QAAQ,EAAE,mBAAmB,GAAG,IAAI,CAAA;CAAE,CAAC,CA6CrE"}
|
package/dist/resourceLog/seal.js
CHANGED
|
@@ -53,6 +53,8 @@ export async function latestAssertionRemovalIndex({ controller }) {
|
|
|
53
53
|
* @param options.expectedMethod {string} the format identifier expected
|
|
54
54
|
* @param options.pinStore {ResourceLogPinStore} this client's chain-head
|
|
55
55
|
* pin for this log
|
|
56
|
+
* @param options.logId {string} the pin-slot key for this log, from
|
|
57
|
+
* `resourceLogPinId`
|
|
56
58
|
* @param options.signer {ResourceLogSigner} this client's enrolled signing
|
|
57
59
|
* key
|
|
58
60
|
* @param [options.versionTime] {string} RFC3339 UTC; defaults to now
|
|
@@ -65,7 +67,7 @@ export async function latestAssertionRemovalIndex({ controller }) {
|
|
|
65
67
|
* anything is written
|
|
66
68
|
* @returns {Promise<{ sealed: boolean, verified: VerifiedResourceLog | null }>}
|
|
67
69
|
*/
|
|
68
|
-
export async function sealResourceLog({ store, controller, expectedMethod, pinStore, signer, versionTime, verified: knownVerified }) {
|
|
70
|
+
export async function sealResourceLog({ store, controller, expectedMethod, pinStore, logId, signer, versionTime, verified: knownVerified }) {
|
|
69
71
|
if (controller.versionIds.length === 0) {
|
|
70
72
|
return { sealed: false, verified: null };
|
|
71
73
|
}
|
|
@@ -79,7 +81,8 @@ export async function sealResourceLog({ store, controller, expectedMethod, pinSt
|
|
|
79
81
|
store,
|
|
80
82
|
controller,
|
|
81
83
|
expectedMethod,
|
|
82
|
-
pinStore
|
|
84
|
+
pinStore,
|
|
85
|
+
logId
|
|
83
86
|
});
|
|
84
87
|
if (current === null) {
|
|
85
88
|
return { sealed: false, verified: null };
|
|
@@ -95,6 +98,7 @@ export async function sealResourceLog({ store, controller, expectedMethod, pinSt
|
|
|
95
98
|
controller,
|
|
96
99
|
expectedMethod,
|
|
97
100
|
pinStore,
|
|
101
|
+
logId,
|
|
98
102
|
signer,
|
|
99
103
|
// The rebase hook doubles as the convergence check: a concurrent writer
|
|
100
104
|
// whose entry already anchors past the removal sealed the log for us.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"seal.js","sourceRoot":"","sources":["../../src/resourceLog/seal.ts"],"names":[],"mappings":"AAyBA,OAAO,EAAE,iBAAiB,EAAE,eAAe,EAAE,MAAM,aAAa,CAAA;AAMhE;;;;;;;;;;;;;GAaG;AACH,MAAM,CAAC,KAAK,UAAU,2BAA2B,CAAC,EAChD,UAAU,EAGX;IACC,IAAI,YAAY,GAAG,CAAC,CAAA;IACpB,IAAI,QAAQ,GAAuB,IAAI,CAAA;IACvC,KAAK,MAAM,CAAC,KAAK,EAAE,SAAS,CAAC,IAAI,UAAU,CAAC,UAAU,CAAC,OAAO,EAAE,EAAE,CAAC;QACjE,MAAM,IAAI,GAAG,MAAM,UAAU,CAAC,eAAe,CAAC,SAAS,CAAC,CAAA;QACxD,IAAI,QAAQ,KAAK,IAAI,EAAE,CAAC;YACtB,KAAK,MAAM,GAAG,IAAI,QAAQ,EAAE,CAAC;gBAC3B,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;oBACnB,YAAY,GAAG,KAAK,CAAA;oBACpB,MAAK;gBACP,CAAC;YACH,CAAC;QACH,CAAC;QACD,QAAQ,GAAG,IAAI,CAAA;IACjB,CAAC;IACD,OAAO,YAAY,CAAA;AACrB,CAAC;AAED
|
|
1
|
+
{"version":3,"file":"seal.js","sourceRoot":"","sources":["../../src/resourceLog/seal.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
/*!
|
|
2
|
+
* Copyright (c) 2026 Interop Alliance. All rights reserved.
|
|
3
|
+
*/
|
|
4
|
+
/**
|
|
5
|
+
* The `@interop/wallet-core/unlock` subpath: standing unlock credentials --
|
|
6
|
+
* every unlock method (passphrase, passkey PRF, recovery code) as a standing
|
|
7
|
+
* credential in the recovery-code posture, with self-enrolling login. The
|
|
8
|
+
* recovery subpath's spend-on-use flows sit on top of the machinery here.
|
|
9
|
+
*
|
|
10
|
+
* - `standingClientFromUnlockSeed` / `unlockClientIdentityFromSeed` -- the
|
|
11
|
+
* deterministic client identity a credential derives (roster wrap target,
|
|
12
|
+
* binding MAC key), shared with the recovery-code derivation.
|
|
13
|
+
* - `generateLadderSeed` / `ladderRung` / `attributeLadderRung` -- the
|
|
14
|
+
* update-key ladder: latent-and-consumed did:webvh update authority from a
|
|
15
|
+
* random seed carried in the unlock record, current rung recovered from the
|
|
16
|
+
* log itself, ambiguity failing closed.
|
|
17
|
+
* - `wrapUnlockRecord` / `unwrapUnlockRecord` / `remintUnlockRecordBridge` --
|
|
18
|
+
* the unlock record codec: the credential-authenticated shell-and-core
|
|
19
|
+
* layout (controller, email, pointer under the binding MAC; the bridge
|
|
20
|
+
* delegation re-mintable; the ladder seed sealed and carried verbatim).
|
|
21
|
+
* - `publishUnlockKey` / `removeUnlockKey` -- the merged document posture
|
|
22
|
+
* edit, parameterized by credential class: a verbatim `keyAgreement` entry,
|
|
23
|
+
* or a `MultikeyCommitment` entry for a low-entropy-derived key.
|
|
24
|
+
* - `selfEnrollWebvhClient` / `selfEnrollClientCore` -- the self-enrolling
|
|
25
|
+
* continuation (reveal a rung, add an ordinary client, retire the rung) and
|
|
26
|
+
* the composed completion a fresh browser runs end to end.
|
|
27
|
+
*
|
|
28
|
+
* Kept out of the root export: this subpath pulls the webkms-client / ezcap /
|
|
29
|
+
* was-client dependency graph (the same isolation pattern as `./keyring`).
|
|
30
|
+
*/
|
|
31
|
+
export { standingClientFromUnlockSeed, STANDING_CLIENT_SALT, unlockClientIdentityFromSeed } from './standingClient.js';
|
|
32
|
+
export type { StandingUnlockClient, UnlockClientIdentity } from './standingClient.js';
|
|
33
|
+
export { attributeLadderRung, generateLadderSeed, LADDER_MAX_SCAN, LADDER_SEED_BYTES, LadderAttributionError, ladderRung, ladderRungSeed } from './ladder.js';
|
|
34
|
+
export type { LadderRung, LadderRungState } from './ladder.js';
|
|
35
|
+
export { computeUnlockBinding, remintUnlockRecordBridge, UnlockBindingError, unlockRecordBinding, unwrapUnlockRecord, wrapUnlockRecord } from './unlockRecord.js';
|
|
36
|
+
export type { SealedRecordMember, SignedUnlockRecord, UnlockRecordContents, UnlockRecordProofState } from './unlockRecord.js';
|
|
37
|
+
export { publishUnlockKey, removeUnlockKey, selfEnrollWebvhClient, unlockKeyVerificationMethod, unlockKeyVmId } from './standingWebvh.js';
|
|
38
|
+
export type { StandingUnlockKeys, UnlockKeyAgreementPublication, UnlockLogStore } from './standingWebvh.js';
|
|
39
|
+
export { selfEnrollClientCore } from './selfEnroll.js';
|
|
40
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/unlock/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AACH,OAAO,EACL,4BAA4B,EAC5B,oBAAoB,EACpB,4BAA4B,EAC7B,MAAM,qBAAqB,CAAA;AAC5B,YAAY,EACV,oBAAoB,EACpB,oBAAoB,EACrB,MAAM,qBAAqB,CAAA;AAE5B,OAAO,EACL,mBAAmB,EACnB,kBAAkB,EAClB,eAAe,EACf,iBAAiB,EACjB,sBAAsB,EACtB,UAAU,EACV,cAAc,EACf,MAAM,aAAa,CAAA;AACpB,YAAY,EAAE,UAAU,EAAE,eAAe,EAAE,MAAM,aAAa,CAAA;AAE9D,OAAO,EACL,oBAAoB,EACpB,wBAAwB,EACxB,kBAAkB,EAClB,mBAAmB,EACnB,kBAAkB,EAClB,gBAAgB,EACjB,MAAM,mBAAmB,CAAA;AAC1B,YAAY,EACV,kBAAkB,EAClB,kBAAkB,EAClB,oBAAoB,EACpB,sBAAsB,EACvB,MAAM,mBAAmB,CAAA;AAE1B,OAAO,EACL,gBAAgB,EAChB,eAAe,EACf,qBAAqB,EACrB,2BAA2B,EAC3B,aAAa,EACd,MAAM,oBAAoB,CAAA;AAC3B,YAAY,EACV,kBAAkB,EAClB,6BAA6B,EAC7B,cAAc,EACf,MAAM,oBAAoB,CAAA;AAE3B,OAAO,EAAE,oBAAoB,EAAE,MAAM,iBAAiB,CAAA"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
/*!
|
|
2
|
+
* Copyright (c) 2026 Interop Alliance. All rights reserved.
|
|
3
|
+
*/
|
|
4
|
+
/**
|
|
5
|
+
* The `@interop/wallet-core/unlock` subpath: standing unlock credentials --
|
|
6
|
+
* every unlock method (passphrase, passkey PRF, recovery code) as a standing
|
|
7
|
+
* credential in the recovery-code posture, with self-enrolling login. The
|
|
8
|
+
* recovery subpath's spend-on-use flows sit on top of the machinery here.
|
|
9
|
+
*
|
|
10
|
+
* - `standingClientFromUnlockSeed` / `unlockClientIdentityFromSeed` -- the
|
|
11
|
+
* deterministic client identity a credential derives (roster wrap target,
|
|
12
|
+
* binding MAC key), shared with the recovery-code derivation.
|
|
13
|
+
* - `generateLadderSeed` / `ladderRung` / `attributeLadderRung` -- the
|
|
14
|
+
* update-key ladder: latent-and-consumed did:webvh update authority from a
|
|
15
|
+
* random seed carried in the unlock record, current rung recovered from the
|
|
16
|
+
* log itself, ambiguity failing closed.
|
|
17
|
+
* - `wrapUnlockRecord` / `unwrapUnlockRecord` / `remintUnlockRecordBridge` --
|
|
18
|
+
* the unlock record codec: the credential-authenticated shell-and-core
|
|
19
|
+
* layout (controller, email, pointer under the binding MAC; the bridge
|
|
20
|
+
* delegation re-mintable; the ladder seed sealed and carried verbatim).
|
|
21
|
+
* - `publishUnlockKey` / `removeUnlockKey` -- the merged document posture
|
|
22
|
+
* edit, parameterized by credential class: a verbatim `keyAgreement` entry,
|
|
23
|
+
* or a `MultikeyCommitment` entry for a low-entropy-derived key.
|
|
24
|
+
* - `selfEnrollWebvhClient` / `selfEnrollClientCore` -- the self-enrolling
|
|
25
|
+
* continuation (reveal a rung, add an ordinary client, retire the rung) and
|
|
26
|
+
* the composed completion a fresh browser runs end to end.
|
|
27
|
+
*
|
|
28
|
+
* Kept out of the root export: this subpath pulls the webkms-client / ezcap /
|
|
29
|
+
* was-client dependency graph (the same isolation pattern as `./keyring`).
|
|
30
|
+
*/
|
|
31
|
+
export { standingClientFromUnlockSeed, STANDING_CLIENT_SALT, unlockClientIdentityFromSeed } from './standingClient.js';
|
|
32
|
+
export { attributeLadderRung, generateLadderSeed, LADDER_MAX_SCAN, LADDER_SEED_BYTES, LadderAttributionError, ladderRung, ladderRungSeed } from './ladder.js';
|
|
33
|
+
export { computeUnlockBinding, remintUnlockRecordBridge, UnlockBindingError, unlockRecordBinding, unwrapUnlockRecord, wrapUnlockRecord } from './unlockRecord.js';
|
|
34
|
+
export { publishUnlockKey, removeUnlockKey, selfEnrollWebvhClient, unlockKeyVerificationMethod, unlockKeyVmId } from './standingWebvh.js';
|
|
35
|
+
export { selfEnrollClientCore } from './selfEnroll.js';
|
|
36
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/unlock/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AACH,OAAO,EACL,4BAA4B,EAC5B,oBAAoB,EACpB,4BAA4B,EAC7B,MAAM,qBAAqB,CAAA;AAM5B,OAAO,EACL,mBAAmB,EACnB,kBAAkB,EAClB,eAAe,EACf,iBAAiB,EACjB,sBAAsB,EACtB,UAAU,EACV,cAAc,EACf,MAAM,aAAa,CAAA;AAGpB,OAAO,EACL,oBAAoB,EACpB,wBAAwB,EACxB,kBAAkB,EAClB,mBAAmB,EACnB,kBAAkB,EAClB,gBAAgB,EACjB,MAAM,mBAAmB,CAAA;AAQ1B,OAAO,EACL,gBAAgB,EAChB,eAAe,EACf,qBAAqB,EACrB,2BAA2B,EAC3B,aAAa,EACd,MAAM,oBAAoB,CAAA;AAO3B,OAAO,EAAE,oBAAoB,EAAE,MAAM,iBAAiB,CAAA"}
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The byte length of a ladder seed: 32 random bytes, minted at bind time and
|
|
3
|
+
* carried only inside the unlock record's sealed ladder member.
|
|
4
|
+
*/
|
|
5
|
+
export declare const LADDER_SEED_BYTES = 32;
|
|
6
|
+
/**
|
|
7
|
+
* How many rungs {@link attributeLadderRung} derives before concluding the
|
|
8
|
+
* log commits none of them. Generous: one rung is consumed per
|
|
9
|
+
* self-enrollment, so a real ladder's standing commitment sits at the number
|
|
10
|
+
* of self-enrollments the credential has ever performed.
|
|
11
|
+
*/
|
|
12
|
+
export declare const LADDER_MAX_SCAN = 128;
|
|
13
|
+
/**
|
|
14
|
+
* Thrown when the published log's standing parameters match no derivable rung
|
|
15
|
+
* -- the credential's posture was revoked (or never published), the ladder
|
|
16
|
+
* seed does not belong to this account, or the scan bound was exceeded -- or
|
|
17
|
+
* when they match more than one rung in the same role, which no legitimate
|
|
18
|
+
* history produces. Self-enrollment refuses loudly rather than guessing.
|
|
19
|
+
*/
|
|
20
|
+
export declare class LadderAttributionError extends Error {
|
|
21
|
+
constructor(message: string);
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Generates a fresh random ladder seed.
|
|
25
|
+
*
|
|
26
|
+
* @returns {Uint8Array}
|
|
27
|
+
*/
|
|
28
|
+
export declare function generateLadderSeed(): Uint8Array;
|
|
29
|
+
/**
|
|
30
|
+
* One rung of the ladder: its index, the 32-byte Ed25519 seed behind it, and
|
|
31
|
+
* the update key's public multibase as the log carries it.
|
|
32
|
+
*/
|
|
33
|
+
export interface LadderRung {
|
|
34
|
+
index: number;
|
|
35
|
+
seed: Uint8Array;
|
|
36
|
+
keyMultibase: string;
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Derives the 32-byte update-key seed of rung `index`.
|
|
40
|
+
*
|
|
41
|
+
* @param options {object}
|
|
42
|
+
* @param options.ladderSeed {Uint8Array}
|
|
43
|
+
* @param options.index {number} the rung index, from 0
|
|
44
|
+
* @returns {Uint8Array}
|
|
45
|
+
*/
|
|
46
|
+
export declare function ladderRungSeed({ ladderSeed, index }: {
|
|
47
|
+
ladderSeed: Uint8Array;
|
|
48
|
+
index: number;
|
|
49
|
+
}): Uint8Array;
|
|
50
|
+
/**
|
|
51
|
+
* Derives rung `index` in full: seed and public multibase.
|
|
52
|
+
*
|
|
53
|
+
* @param options {object}
|
|
54
|
+
* @param options.ladderSeed {Uint8Array}
|
|
55
|
+
* @param options.index {number} the rung index, from 0
|
|
56
|
+
* @returns {Promise<LadderRung>}
|
|
57
|
+
*/
|
|
58
|
+
export declare function ladderRung({ ladderSeed, index }: {
|
|
59
|
+
ladderSeed: Uint8Array;
|
|
60
|
+
index: number;
|
|
61
|
+
}): Promise<LadderRung>;
|
|
62
|
+
/**
|
|
63
|
+
* Where an attributed rung stands in the published log: `'committed'` (the
|
|
64
|
+
* steady state -- only its hash stands in `nextKeyHashes`) or `'revealed'` (a
|
|
65
|
+
* torn self-enrollment published the reveal entry but not the add entry, so
|
|
66
|
+
* the rung sits in `updateKeys` awaiting the resumed add).
|
|
67
|
+
*/
|
|
68
|
+
export type LadderRungState = 'committed' | 'revealed';
|
|
69
|
+
/**
|
|
70
|
+
* Recovers the ladder's current rung from the published log's standing
|
|
71
|
+
* parameters -- the counter recovery that replaces any stored counter. Scans
|
|
72
|
+
* rungs `0..maxScan - 1`; a rung whose key stands in `updateKeys` is a torn
|
|
73
|
+
* self-enrollment to resume (`'revealed'`), else a rung whose hash stands in
|
|
74
|
+
* `nextKeyHashes` is the standing commitment (`'committed'`). Exactly one
|
|
75
|
+
* revealed rung, or exactly one committed rung beside it, is legitimate --
|
|
76
|
+
* the reveal entry keeps the spent rung's hash committed so a resumed run can
|
|
77
|
+
* re-state it, which is why a revealed rung wins over a committed one.
|
|
78
|
+
* Anything else fails closed with {@link LadderAttributionError}.
|
|
79
|
+
*
|
|
80
|
+
* @param options {object}
|
|
81
|
+
* @param options.ladderSeed {Uint8Array}
|
|
82
|
+
* @param options.published {object} the resolved log's standing parameters
|
|
83
|
+
* @param options.published.updateKeys {string[]}
|
|
84
|
+
* @param options.published.nextKeyHashes {string[]}
|
|
85
|
+
* @param [options.maxScan] {number} how many rungs to derive before giving
|
|
86
|
+
* up; defaults to {@link LADDER_MAX_SCAN}
|
|
87
|
+
* @returns {Promise<{ rung: LadderRung, state: LadderRungState }>}
|
|
88
|
+
*/
|
|
89
|
+
export declare function attributeLadderRung({ ladderSeed, published, maxScan }: {
|
|
90
|
+
ladderSeed: Uint8Array;
|
|
91
|
+
published: {
|
|
92
|
+
updateKeys: string[];
|
|
93
|
+
nextKeyHashes: string[];
|
|
94
|
+
};
|
|
95
|
+
maxScan?: number;
|
|
96
|
+
}): Promise<{
|
|
97
|
+
rung: LadderRung;
|
|
98
|
+
state: LadderRungState;
|
|
99
|
+
}>;
|
|
100
|
+
//# sourceMappingURL=ladder.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ladder.d.ts","sourceRoot":"","sources":["../../src/unlock/ladder.ts"],"names":[],"mappings":"AAiCA;;;GAGG;AACH,eAAO,MAAM,iBAAiB,KAAK,CAAA;AAUnC;;;;;GAKG;AACH,eAAO,MAAM,eAAe,MAAM,CAAA;AAElC;;;;;;GAMG;AACH,qBAAa,sBAAuB,SAAQ,KAAK;gBACnC,OAAO,EAAE,MAAM;CAI5B;AAED;;;;GAIG;AACH,wBAAgB,kBAAkB,IAAI,UAAU,CAE/C;AAED;;;GAGG;AACH,MAAM,WAAW,UAAU;IACzB,KAAK,EAAE,MAAM,CAAA;IACb,IAAI,EAAE,UAAU,CAAA;IAChB,YAAY,EAAE,MAAM,CAAA;CACrB;AAED;;;;;;;GAOG;AACH,wBAAgB,cAAc,CAAC,EAC7B,UAAU,EACV,KAAK,EACN,EAAE;IACD,UAAU,EAAE,UAAU,CAAA;IACtB,KAAK,EAAE,MAAM,CAAA;CACd,GAAG,UAAU,CAWb;AAED;;;;;;;GAOG;AACH,wBAAsB,UAAU,CAAC,EAC/B,UAAU,EACV,KAAK,EACN,EAAE;IACD,UAAU,EAAE,UAAU,CAAA;IACtB,KAAK,EAAE,MAAM,CAAA;CACd,GAAG,OAAO,CAAC,UAAU,CAAC,CAGtB;AAED;;;;;GAKG;AACH,MAAM,MAAM,eAAe,GAAG,WAAW,GAAG,UAAU,CAAA;AAEtD;;;;;;;;;;;;;;;;;;;GAmBG;AACH,wBAAsB,mBAAmB,CAAC,EACxC,UAAU,EACV,SAAS,EACT,OAAyB,EAC1B,EAAE;IACD,UAAU,EAAE,UAAU,CAAA;IACtB,SAAS,EAAE;QAAE,UAAU,EAAE,MAAM,EAAE,CAAC;QAAC,aAAa,EAAE,MAAM,EAAE,CAAA;KAAE,CAAA;IAC5D,OAAO,CAAC,EAAE,MAAM,CAAA;CACjB,GAAG,OAAO,CAAC;IAAE,IAAI,EAAE,UAAU,CAAC;IAAC,KAAK,EAAE,eAAe,CAAA;CAAE,CAAC,CA+BxD"}
|