@interop/wallet-core 0.44.0 → 0.46.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/dist/clients/revocation.d.ts +2 -25
- package/dist/clients/revocation.d.ts.map +1 -1
- package/dist/clients/revocation.js +25 -96
- package/dist/clients/revocation.js.map +1 -1
- package/dist/keyring/record.d.ts +4 -3
- package/dist/keyring/record.d.ts.map +1 -1
- package/dist/keyring/record.js.map +1 -1
- package/dist/keys/index.d.ts +7 -0
- package/dist/keys/index.d.ts.map +1 -1
- package/dist/keys/index.js +6 -0
- package/dist/keys/index.js.map +1 -1
- package/dist/keys/rosterLogStore.d.ts.map +1 -1
- package/dist/keys/rosterLogStore.js +18 -1
- package/dist/keys/rosterLogStore.js.map +1 -1
- package/dist/keys/userKeyRosterCascade.d.ts +121 -0
- package/dist/keys/userKeyRosterCascade.d.ts.map +1 -0
- package/dist/keys/userKeyRosterCascade.js +125 -0
- package/dist/keys/userKeyRosterCascade.js.map +1 -0
- package/dist/recovery/index.d.ts +1 -1
- package/dist/recovery/index.d.ts.map +1 -1
- package/dist/recovery/index.js +1 -1
- package/dist/recovery/index.js.map +1 -1
- package/dist/recovery/recoveryDelegation.d.ts +27 -40
- package/dist/recovery/recoveryDelegation.d.ts.map +1 -1
- package/dist/recovery/recoveryDelegation.js +119 -53
- package/dist/recovery/recoveryDelegation.js.map +1 -1
- package/dist/recovery/recoveryWebvh.d.ts +9 -2
- package/dist/recovery/recoveryWebvh.d.ts.map +1 -1
- package/dist/recovery/recoveryWebvh.js +4 -2
- package/dist/recovery/recoveryWebvh.js.map +1 -1
- package/dist/resourceLog/controller.d.ts +38 -3
- package/dist/resourceLog/controller.d.ts.map +1 -1
- package/dist/resourceLog/controller.js +106 -10
- package/dist/resourceLog/controller.js.map +1 -1
- package/dist/resourceLog/errors.d.ts +22 -1
- package/dist/resourceLog/errors.d.ts.map +1 -1
- package/dist/resourceLog/errors.js +23 -1
- package/dist/resourceLog/errors.js.map +1 -1
- package/dist/resourceLog/index.d.ts +8 -6
- package/dist/resourceLog/index.d.ts.map +1 -1
- package/dist/resourceLog/index.js +7 -5
- package/dist/resourceLog/index.js.map +1 -1
- package/dist/resourceLog/license.d.ts +44 -0
- package/dist/resourceLog/license.d.ts.map +1 -0
- package/dist/resourceLog/license.js +63 -0
- package/dist/resourceLog/license.js.map +1 -0
- package/dist/resourceLog/verify.d.ts +3 -2
- package/dist/resourceLog/verify.d.ts.map +1 -1
- package/dist/resourceLog/verify.js +30 -8
- package/dist/resourceLog/verify.js.map +1 -1
- package/dist/unlock/index.d.ts +22 -8
- package/dist/unlock/index.d.ts.map +1 -1
- package/dist/unlock/index.js +21 -8
- package/dist/unlock/index.js.map +1 -1
- package/dist/unlock/ladder.d.ts +76 -0
- package/dist/unlock/ladder.d.ts.map +1 -1
- package/dist/unlock/ladder.js +111 -1
- package/dist/unlock/ladder.js.map +1 -1
- package/dist/unlock/retire.d.ts +126 -0
- package/dist/unlock/retire.d.ts.map +1 -0
- package/dist/unlock/retire.js +83 -0
- package/dist/unlock/retire.js.map +1 -0
- package/dist/unlock/standingWebvh.d.ts +50 -3
- package/dist/unlock/standingWebvh.d.ts.map +1 -1
- package/dist/unlock/standingWebvh.js +78 -9
- package/dist/unlock/standingWebvh.js.map +1 -1
- package/dist/unlock/unlockRecord.d.ts +28 -8
- package/dist/unlock/unlockRecord.d.ts.map +1 -1
- package/dist/unlock/unlockRecord.js +93 -13
- package/dist/unlock/unlockRecord.js.map +1 -1
- package/dist/webvh/companion.d.ts +681 -0
- package/dist/webvh/companion.d.ts.map +1 -0
- package/dist/webvh/companion.js +1151 -0
- package/dist/webvh/companion.js.map +1 -0
- package/dist/webvh/delegatedLogStore.d.ts +67 -0
- package/dist/webvh/delegatedLogStore.d.ts.map +1 -0
- package/dist/webvh/delegatedLogStore.js +104 -0
- package/dist/webvh/delegatedLogStore.js.map +1 -0
- package/dist/webvh/didWebvh.d.ts +109 -5
- package/dist/webvh/didWebvh.d.ts.map +1 -1
- package/dist/webvh/didWebvh.js +186 -21
- package/dist/webvh/didWebvh.js.map +1 -1
- package/dist/webvh/index.d.ts +34 -5
- package/dist/webvh/index.d.ts.map +1 -1
- package/dist/webvh/index.js +31 -5
- package/dist/webvh/index.js.map +1 -1
- package/dist/webvh/listClients.d.ts +33 -0
- package/dist/webvh/listClients.d.ts.map +1 -1
- package/dist/webvh/listClients.js +27 -0
- package/dist/webvh/listClients.js.map +1 -1
- package/dist/webvh/standingZcap.d.ts +48 -0
- package/dist/webvh/standingZcap.d.ts.map +1 -0
- package/dist/webvh/standingZcap.js +54 -0
- package/dist/webvh/standingZcap.js.map +1 -0
- package/dist/webvh/wasIdStore.d.ts +36 -6
- package/dist/webvh/wasIdStore.d.ts.map +1 -1
- package/dist/webvh/wasIdStore.js +32 -13
- package/dist/webvh/wasIdStore.js.map +1 -1
- package/dist/webvh/zcap.d.ts +24 -0
- package/dist/webvh/zcap.d.ts.map +1 -1
- package/dist/webvh/zcap.js +42 -0
- package/dist/webvh/zcap.js.map +1 -1
- package/package.json +9 -9
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
import { rotateRosterToDocumentAndCascade } from '../keys/index.js';
|
|
2
|
+
import { removeUnlockKey } from './standingWebvh.js';
|
|
3
|
+
/**
|
|
4
|
+
* Retires one standing unlock credential from an account. See the module doc
|
|
5
|
+
* for the order and the convergence story. Once the posture edit lands, a
|
|
6
|
+
* thrown later stage leaves durable state a naive re-run -- or the login-time
|
|
7
|
+
* sweep -- converges from.
|
|
8
|
+
*
|
|
9
|
+
* @param options {object}
|
|
10
|
+
* @param options.idStore {WebvhIdStore} the account's `id` collection store
|
|
11
|
+
* @param options.updateKeys {ClientWebvhUpdateKeys} the RETIRING (enrolled)
|
|
12
|
+
* client's own did:webvh update-key seeds, which sign the posture edit
|
|
13
|
+
* @param options.unlockKeys {StandingUnlockKeys} the retired credential's
|
|
14
|
+
* public posture (its key-agreement publication and its committed update
|
|
15
|
+
* key)
|
|
16
|
+
* @param [options.expectedDid] {string} the account DID from the caller's
|
|
17
|
+
* stored account pointer; supplied, the posture edit refuses a `did.jsonl`
|
|
18
|
+
* resolving to any other account
|
|
19
|
+
* @param [options.verb] {string} what the caller is doing, for the
|
|
20
|
+
* pending-rotation refusal message (e.g. `'changing your passphrase'`)
|
|
21
|
+
* @param options.rosterStore {EncryptionDescriptorStore} the
|
|
22
|
+
* `key-map/user-key.jsonl` roster store
|
|
23
|
+
* @param [options.userKey] {UserKey} this client's cached user key
|
|
24
|
+
* @param options.clientKeyAgreementKey {IKeyAgreementKey} this client's own
|
|
25
|
+
* (identity) key-agreement key -- its roster entry
|
|
26
|
+
* @param [options.pinnedEpochId] {string} the locally pinned latest-seen
|
|
27
|
+
* roster epoch
|
|
28
|
+
* @param [options.onUserKeyAdopted] {Function} persists a rotated key:
|
|
29
|
+
* called with `{ userKey, latestEpochId, descriptor }` after the roster read
|
|
30
|
+
* and BEFORE the fan-out. The key and the epoch pin must persist atomically
|
|
31
|
+
* @param options.collections {CascadeCollections} the fan-out's work
|
|
32
|
+
* @param [options.onRotationAdopted] {Function} `({ userKey }) =>
|
|
33
|
+
* Promise<void>` -- the live-session adoption of a rotated key, run last so
|
|
34
|
+
* the session keeps operating without a re-login
|
|
35
|
+
* @returns {Promise<UnlockCredentialRetirementResult>}
|
|
36
|
+
*/
|
|
37
|
+
export async function retireUnlockCredential({ idStore, updateKeys, unlockKeys, expectedDid, verb, rosterStore, userKey, clientKeyAgreementKey, pinnedEpochId, onUserKeyAdopted, collections, onRotationAdopted }) {
|
|
38
|
+
// 1. The document posture edit -- the credential's standing, first. It
|
|
39
|
+
// resolves the document as it now stands, which is what stage 2 resolves
|
|
40
|
+
// its remaining recipients from.
|
|
41
|
+
const { did, doc, log } = await removeUnlockKey({
|
|
42
|
+
idStore,
|
|
43
|
+
updateKeys,
|
|
44
|
+
unlockKeys,
|
|
45
|
+
...(expectedDid !== undefined ? { expectedDid } : {}),
|
|
46
|
+
...(verb !== undefined ? { verb } : {})
|
|
47
|
+
});
|
|
48
|
+
// 2. The shared roster-and-cascade tail: the roster rotation onto the
|
|
49
|
+
// post-edit document (with its post-edit controller floor and its seal
|
|
50
|
+
// backstop), then the collection fan-out onto the fresh key.
|
|
51
|
+
const tail = await rotateRosterToDocumentAndCascade({
|
|
52
|
+
rosterStore,
|
|
53
|
+
did,
|
|
54
|
+
doc,
|
|
55
|
+
log,
|
|
56
|
+
...(userKey ? { userKey } : {}),
|
|
57
|
+
clientKeyAgreementKey,
|
|
58
|
+
pinnedEpochId,
|
|
59
|
+
...(onUserKeyAdopted ? { onUserKeyAdopted } : {}),
|
|
60
|
+
collections
|
|
61
|
+
});
|
|
62
|
+
if (!tail.rosterDescriptor || !tail.userKey) {
|
|
63
|
+
// No roster to rotate: the posture edit has landed, so the credential IS
|
|
64
|
+
// retired -- a completed ceremony with nothing rotated.
|
|
65
|
+
return {
|
|
66
|
+
rotated: false,
|
|
67
|
+
collections: tail.collections,
|
|
68
|
+
document: doc
|
|
69
|
+
};
|
|
70
|
+
}
|
|
71
|
+
if (tail.rotated) {
|
|
72
|
+
await onRotationAdopted?.({ userKey: tail.userKey });
|
|
73
|
+
}
|
|
74
|
+
return {
|
|
75
|
+
rotated: tail.rotated,
|
|
76
|
+
...(tail.rosterSeal ? { rosterSeal: tail.rosterSeal } : {}),
|
|
77
|
+
collections: tail.collections,
|
|
78
|
+
document: doc,
|
|
79
|
+
userKey: tail.userKey,
|
|
80
|
+
rosterDescriptor: tail.rosterDescriptor
|
|
81
|
+
};
|
|
82
|
+
}
|
|
83
|
+
//# sourceMappingURL=retire.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"retire.js","sourceRoot":"","sources":["../../src/unlock/retire.ts"],"names":[],"mappings":"AAoDA,OAAO,EACL,gCAAgC,EAKjC,MAAM,kBAAkB,CAAA;AAEzB,OAAO,EAAE,eAAe,EAA2B,MAAM,oBAAoB,CAAA;AAmB7E;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAiCG;AACH,MAAM,CAAC,KAAK,UAAU,sBAAsB,CAAC,EAC3C,OAAO,EACP,UAAU,EACV,UAAU,EACV,WAAW,EACX,IAAI,EACJ,WAAW,EACX,OAAO,EACP,qBAAqB,EACrB,aAAa,EACb,gBAAgB,EAChB,WAAW,EACX,iBAAiB,EAkBlB;IACC,uEAAuE;IACvE,yEAAyE;IACzE,iCAAiC;IACjC,MAAM,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,MAAM,eAAe,CAAC;QAC9C,OAAO;QACP,UAAU;QACV,UAAU;QACV,GAAG,CAAC,WAAW,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACrD,GAAG,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KACxC,CAAC,CAAA;IAEF,sEAAsE;IACtE,uEAAuE;IACvE,6DAA6D;IAC7D,MAAM,IAAI,GAAG,MAAM,gCAAgC,CAAC;QAClD,WAAW;QACX,GAAG;QACH,GAAG;QACH,GAAG;QACH,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC/B,qBAAqB;QACrB,aAAa;QACb,GAAG,CAAC,gBAAgB,CAAC,CAAC,CAAC,EAAE,gBAAgB,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACjD,WAAW;KACZ,CAAC,CAAA;IACF,IAAI,CAAC,IAAI,CAAC,gBAAgB,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC;QAC5C,yEAAyE;QACzE,wDAAwD;QACxD,OAAO;YACL,OAAO,EAAE,KAAK;YACd,WAAW,EAAE,IAAI,CAAC,WAAW;YAC7B,QAAQ,EAAE,GAAG;SACd,CAAA;IACH,CAAC;IAED,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;QACjB,MAAM,iBAAiB,EAAE,CAAC,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,CAAC,CAAA;IACtD,CAAC;IAED,OAAO;QACL,OAAO,EAAE,IAAI,CAAC,OAAO;QACrB,GAAG,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,IAAI,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC3D,WAAW,EAAE,IAAI,CAAC,WAAW;QAC7B,QAAQ,EAAE,GAAG;QACb,OAAO,EAAE,IAAI,CAAC,OAAO;QACrB,gBAAgB,EAAE,IAAI,CAAC,gBAAgB;KACxC,CAAA;AACH,CAAC"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { VerificationMethod } from '@interop/did-method-webvh';
|
|
1
|
+
import type { DIDDoc, DIDLog, VerificationMethod } from '@interop/did-method-webvh';
|
|
2
2
|
import type { ClientWebvhUpdateKeys, WebvhEnrollmentKeys, WebvhIdStore } from '../webvh/didWebvh.js';
|
|
3
3
|
/**
|
|
4
4
|
* The narrow store seam the self-enrollment continuation writes through: a
|
|
@@ -62,6 +62,45 @@ export declare function unlockKeyVerificationMethod({ did, keyAgreement }: {
|
|
|
62
62
|
did: string;
|
|
63
63
|
keyAgreement: UnlockKeyAgreementPublication;
|
|
64
64
|
}): VerificationMethod;
|
|
65
|
+
/**
|
|
66
|
+
* CLIENT-LESS GENESIS: assembles the one-entry did:webvh log of an account
|
|
67
|
+
* with zero enrolled durable clients, anchored on the minting credential's
|
|
68
|
+
* ladder alone. Everything derives from the ladder seed: rung 0 is the sole
|
|
69
|
+
* `updateKeys` member and signs the entry, `nextKeyHashes` commits rung 0's
|
|
70
|
+
* own carry-over hash plus rung 1 (the staged rung) -- the carry-over hash is
|
|
71
|
+
* what the first durable self-enrollment's reveal-and-commit entry,
|
|
72
|
+
* re-stating `updateKeys` containing rung 0, requires --
|
|
73
|
+
* and the ladder VM (the stable sibling) is published under `assertionMethod`
|
|
74
|
+
* and `capabilityDelegation` only. The credential's `keyAgreement` posture
|
|
75
|
+
* entry is FOLDED INTO GENESIS -- no enrolled client exists to run the
|
|
76
|
+
* separate bind entry ({@link publishUnlockKey}) -- so the genesis
|
|
77
|
+
* `keyAgreement` array holds only the credential's entry.
|
|
78
|
+
*
|
|
79
|
+
* The client-less window this opens is closed by the credential's first
|
|
80
|
+
* durable self-enrollment ({@link selfEnrollWebvhClient}), whose add entry
|
|
81
|
+
* atomically publishes the client, retires rung 0, and removes the ladder VM.
|
|
82
|
+
*
|
|
83
|
+
* The caller owns publication (conditional, create-only) and the pointer
|
|
84
|
+
* write that follows; this assembles and signs the log only.
|
|
85
|
+
*
|
|
86
|
+
* @param options {object}
|
|
87
|
+
* @param options.wasServerUrl {string}
|
|
88
|
+
* @param options.spaceId {string}
|
|
89
|
+
* @param options.ladderSeed {Uint8Array} the credential's ladder seed
|
|
90
|
+
* @param options.keyAgreement {UnlockKeyAgreementPublication} the
|
|
91
|
+
* credential's key-agreement publication (commitment or verbatim)
|
|
92
|
+
* @returns {Promise<{ log: DIDLog, webDoc: object, did: string }>}
|
|
93
|
+
*/
|
|
94
|
+
export declare function createClientlessAccountLog({ wasServerUrl, spaceId, ladderSeed, keyAgreement }: {
|
|
95
|
+
wasServerUrl: string;
|
|
96
|
+
spaceId: string;
|
|
97
|
+
ladderSeed: Uint8Array;
|
|
98
|
+
keyAgreement: UnlockKeyAgreementPublication;
|
|
99
|
+
}): Promise<{
|
|
100
|
+
log: DIDLog;
|
|
101
|
+
webDoc: object;
|
|
102
|
+
did: string;
|
|
103
|
+
}>;
|
|
65
104
|
/**
|
|
66
105
|
* BIND (run by an enrolled client, root authority): publishes a standing
|
|
67
106
|
* credential's split posture into the document -- one entry adding the
|
|
@@ -82,7 +121,10 @@ export declare function unlockKeyVerificationMethod({ did, keyAgreement }: {
|
|
|
82
121
|
* to, from the caller's stored account pointer
|
|
83
122
|
* @param [options.verb] {string} what the caller is doing, for the
|
|
84
123
|
* pending-rotation refusal message (e.g. `'issuing a recovery code'`)
|
|
85
|
-
* @returns {Promise<{ did: string }>}
|
|
124
|
+
* @returns {Promise<{ did: string, doc: DIDDoc, log: DIDLog }>} the account
|
|
125
|
+
* DID and the document and log as this call leaves them (unchanged when the
|
|
126
|
+
* posture was already settled), which is what the caller's roster-side half
|
|
127
|
+
* converges onto
|
|
86
128
|
*/
|
|
87
129
|
export declare function publishUnlockKey(options: {
|
|
88
130
|
idStore: WebvhIdStore;
|
|
@@ -92,6 +134,8 @@ export declare function publishUnlockKey(options: {
|
|
|
92
134
|
verb?: string;
|
|
93
135
|
}): Promise<{
|
|
94
136
|
did: string;
|
|
137
|
+
doc: DIDDoc;
|
|
138
|
+
log: DIDLog;
|
|
95
139
|
}>;
|
|
96
140
|
/**
|
|
97
141
|
* REMOVAL (run by an enrolled client, root authority): removes a standing
|
|
@@ -102,7 +146,8 @@ export declare function publishUnlockKey(options: {
|
|
|
102
146
|
* entry.
|
|
103
147
|
*
|
|
104
148
|
* @param options {object} see {@link publishUnlockKey}
|
|
105
|
-
* @returns {Promise<{ did: string }>}
|
|
149
|
+
* @returns {Promise<{ did: string, doc: DIDDoc, log: DIDLog }>} see
|
|
150
|
+
* {@link publishUnlockKey}
|
|
106
151
|
*/
|
|
107
152
|
export declare function removeUnlockKey(options: {
|
|
108
153
|
idStore: WebvhIdStore;
|
|
@@ -112,6 +157,8 @@ export declare function removeUnlockKey(options: {
|
|
|
112
157
|
verb?: string;
|
|
113
158
|
}): Promise<{
|
|
114
159
|
did: string;
|
|
160
|
+
doc: DIDDoc;
|
|
161
|
+
log: DIDLog;
|
|
115
162
|
}>;
|
|
116
163
|
/**
|
|
117
164
|
* SELF-ENROLLMENT (run by the credential-derived client through the delegated
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"standingWebvh.d.ts","sourceRoot":"","sources":["../../src/unlock/standingWebvh.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"standingWebvh.d.ts","sourceRoot":"","sources":["../../src/unlock/standingWebvh.ts"],"names":[],"mappings":"AAgDA,OAAO,KAAK,EACV,MAAM,EACN,MAAM,EACN,kBAAkB,EACnB,MAAM,2BAA2B,CAAA;AAmBlC,OAAO,KAAK,EACV,qBAAqB,EAErB,mBAAmB,EACnB,YAAY,EACb,MAAM,sBAAsB,CAAA;AAO7B;;;;GAIG;AACH,MAAM,MAAM,cAAc,GAAG,IAAI,CAC/B,YAAY,EACZ,kBAAkB,GAAG,eAAe,CACrC,CAAA;AAED;;;;;;GAMG;AACH,MAAM,MAAM,6BAA6B,GACvC;IAAE,kBAAkB,EAAE,MAAM,CAAA;CAAE,GAAG;IAAE,UAAU,EAAE,MAAM,CAAA;CAAE,CAAA;AAEzD;;;;GAIG;AACH,MAAM,WAAW,kBAAkB;IACjC,YAAY,EAAE,6BAA6B,CAAA;IAC3C,kBAAkB,EAAE,MAAM,CAAA;CAC3B;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,aAAa,CAAC,EAC5B,GAAG,EACH,YAAY,EACb,EAAE;IACD,GAAG,EAAE,MAAM,CAAA;IACX,YAAY,EAAE,6BAA6B,CAAA;CAC5C,GAAG,MAAM,CAMT;AAED;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,2BAA2B,CAAC,EAC1C,GAAG,EACH,YAAY,EACb,EAAE;IACD,GAAG,EAAE,MAAM,CAAA;IACX,YAAY,EAAE,6BAA6B,CAAA;CAC5C,GAAG,kBAAkB,CAgBrB;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AACH,wBAAsB,0BAA0B,CAAC,EAC/C,YAAY,EACZ,OAAO,EACP,UAAU,EACV,YAAY,EACb,EAAE;IACD,YAAY,EAAE,MAAM,CAAA;IACpB,OAAO,EAAE,MAAM,CAAA;IACf,UAAU,EAAE,UAAU,CAAA;IACtB,YAAY,EAAE,6BAA6B,CAAA;CAC5C,GAAG,OAAO,CAAC;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAA;CAAE,CAAC,CAsBxD;AAsDD;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,wBAAsB,gBAAgB,CAAC,OAAO,EAAE;IAC9C,OAAO,EAAE,YAAY,CAAA;IACrB,UAAU,EAAE,qBAAqB,CAAA;IACjC,UAAU,EAAE,kBAAkB,CAAA;IAC9B,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,IAAI,CAAC,EAAE,MAAM,CAAA;CACd,GAAG,OAAO,CAAC;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAA;CAAE,CAAC,CAIrD;AAED;;;;;;;;;;;GAWG;AACH,wBAAsB,eAAe,CAAC,OAAO,EAAE;IAC7C,OAAO,EAAE,YAAY,CAAA;IACrB,UAAU,EAAE,qBAAqB,CAAA;IACjC,UAAU,EAAE,kBAAkB,CAAA;IAC9B,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,IAAI,CAAC,EAAE,MAAM,CAAA;CACd,GAAG,OAAO,CAAC;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAA;CAAE,CAAC,CAIrD;AAkGD;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AACH,wBAAsB,qBAAqB,CAAC,OAAO,EAAE;IACnD,KAAK,EAAE,cAAc,CAAA;IACrB,UAAU,EAAE,UAAU,CAAA;IACtB,aAAa,EAAE,mBAAmB,CAAA;IAClC,oBAAoB,EAAE,qBAAqB,CAAA;IAC3C,WAAW,CAAC,EAAE,MAAM,CAAA;CACrB,GAAG,OAAO,CAAC;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,CAE5C"}
|
|
@@ -34,6 +34,10 @@
|
|
|
34
34
|
* hash. The credential's own posture -- its `keyAgreement` entry and the
|
|
35
35
|
* freshly committed `hash(rung i + 1)` -- stands untouched, ready for the
|
|
36
36
|
* next self-enrollment. Nothing is spent, and no replacement exists.
|
|
37
|
+
* When the account was CLIENT-LESS ({@link createClientlessAccountLog}),
|
|
38
|
+
* the same atomic entry removes the ladder VM from the document and its
|
|
39
|
+
* relations -- the transitional key exists only while no durable client
|
|
40
|
+
* does, and folding the removal in leaves no window with neither.
|
|
37
41
|
*
|
|
38
42
|
* Which rung is current is recovered from the log itself
|
|
39
43
|
* (`attributeLadderRung`, fail-closed); a lost compare-and-swap race re-runs,
|
|
@@ -42,8 +46,9 @@
|
|
|
42
46
|
* from durable state alone, on the recovery continuation's pattern.
|
|
43
47
|
*/
|
|
44
48
|
import { deriveNextKeyHash, updateDID } from '@interop/did-method-webvh';
|
|
45
|
-
import { assertCarryOverCommitments, BYOE_CONTEXT_URL, markedVerificationMethodPair, MULTIKEY_COMMITMENT_VM_TYPE, MULTIKEY_VM_TYPE, publishUpdatedLog, putLogResource, readPublishedLog, relationIds, updateKeyMultibase, updateKeySigner, withLogConflictRetry } from '../webvh/didWebvh.js';
|
|
46
|
-
import {
|
|
49
|
+
import { assertCarryOverCommitments, BYOE_CONTEXT_URL, createClientlessWebvhLog, didWebvhControllerTemplate, genesisNextKeyHashes, markedVerificationMethodPair, MULTIKEY_COMMITMENT_VM_TYPE, MULTIKEY_VM_TYPE, publishUpdatedLog, putLogResource, readPublishedLog, relationIds, updateKeyMultibase, updateKeySigner, withLogConflictRetry } from '../webvh/didWebvh.js';
|
|
50
|
+
import { ladderVmIds } from '../webvh/listClients.js';
|
|
51
|
+
import { attributeLadderRung, ladderRung, ladderVmKeyMultibase } from './ladder.js';
|
|
47
52
|
/**
|
|
48
53
|
* The verification-method id a credential's key-agreement entry publishes
|
|
49
54
|
* under: `<did>#<multibase>` for a verbatim key (indistinguishable by id from
|
|
@@ -94,6 +99,58 @@ export function unlockKeyVerificationMethod({ did, keyAgreement }) {
|
|
|
94
99
|
publicKeyCommitment: keyAgreement.commitment
|
|
95
100
|
};
|
|
96
101
|
}
|
|
102
|
+
/**
|
|
103
|
+
* CLIENT-LESS GENESIS: assembles the one-entry did:webvh log of an account
|
|
104
|
+
* with zero enrolled durable clients, anchored on the minting credential's
|
|
105
|
+
* ladder alone. Everything derives from the ladder seed: rung 0 is the sole
|
|
106
|
+
* `updateKeys` member and signs the entry, `nextKeyHashes` commits rung 0's
|
|
107
|
+
* own carry-over hash plus rung 1 (the staged rung) -- the carry-over hash is
|
|
108
|
+
* what the first durable self-enrollment's reveal-and-commit entry,
|
|
109
|
+
* re-stating `updateKeys` containing rung 0, requires --
|
|
110
|
+
* and the ladder VM (the stable sibling) is published under `assertionMethod`
|
|
111
|
+
* and `capabilityDelegation` only. The credential's `keyAgreement` posture
|
|
112
|
+
* entry is FOLDED INTO GENESIS -- no enrolled client exists to run the
|
|
113
|
+
* separate bind entry ({@link publishUnlockKey}) -- so the genesis
|
|
114
|
+
* `keyAgreement` array holds only the credential's entry.
|
|
115
|
+
*
|
|
116
|
+
* The client-less window this opens is closed by the credential's first
|
|
117
|
+
* durable self-enrollment ({@link selfEnrollWebvhClient}), whose add entry
|
|
118
|
+
* atomically publishes the client, retires rung 0, and removes the ladder VM.
|
|
119
|
+
*
|
|
120
|
+
* The caller owns publication (conditional, create-only) and the pointer
|
|
121
|
+
* write that follows; this assembles and signs the log only.
|
|
122
|
+
*
|
|
123
|
+
* @param options {object}
|
|
124
|
+
* @param options.wasServerUrl {string}
|
|
125
|
+
* @param options.spaceId {string}
|
|
126
|
+
* @param options.ladderSeed {Uint8Array} the credential's ladder seed
|
|
127
|
+
* @param options.keyAgreement {UnlockKeyAgreementPublication} the
|
|
128
|
+
* credential's key-agreement publication (commitment or verbatim)
|
|
129
|
+
* @returns {Promise<{ log: DIDLog, webDoc: object, did: string }>}
|
|
130
|
+
*/
|
|
131
|
+
export async function createClientlessAccountLog({ wasServerUrl, spaceId, ladderSeed, keyAgreement }) {
|
|
132
|
+
const rung0 = await ladderRung({ ladderSeed, index: 0 });
|
|
133
|
+
const rung1 = await ladderRung({ ladderSeed, index: 1 });
|
|
134
|
+
const controllerTemplate = didWebvhControllerTemplate({
|
|
135
|
+
wasServerUrl,
|
|
136
|
+
spaceId
|
|
137
|
+
});
|
|
138
|
+
return createClientlessWebvhLog({
|
|
139
|
+
wasServerUrl,
|
|
140
|
+
spaceId,
|
|
141
|
+
ladderVmKeyMultibase: await ladderVmKeyMultibase({ ladderSeed }),
|
|
142
|
+
credentialKeyAgreementMethod: unlockKeyVerificationMethod({
|
|
143
|
+
did: controllerTemplate,
|
|
144
|
+
keyAgreement
|
|
145
|
+
}),
|
|
146
|
+
updateKeyPublicKeyMultibase: rung0.keyMultibase,
|
|
147
|
+
nextKeyHashes: await genesisNextKeyHashes({
|
|
148
|
+
activeKeyMultibase: rung0.keyMultibase,
|
|
149
|
+
stagedKeyMultibase: rung1.keyMultibase
|
|
150
|
+
}),
|
|
151
|
+
signer: await updateKeySigner({ seed: rung0.seed })
|
|
152
|
+
});
|
|
153
|
+
}
|
|
97
154
|
/**
|
|
98
155
|
* Reads and resolves the published log through the narrow store seam.
|
|
99
156
|
*
|
|
@@ -150,7 +207,10 @@ async function publishLogOnly({ store, log, ifMatch }) {
|
|
|
150
207
|
* to, from the caller's stored account pointer
|
|
151
208
|
* @param [options.verb] {string} what the caller is doing, for the
|
|
152
209
|
* pending-rotation refusal message (e.g. `'issuing a recovery code'`)
|
|
153
|
-
* @returns {Promise<{ did: string }>}
|
|
210
|
+
* @returns {Promise<{ did: string, doc: DIDDoc, log: DIDLog }>} the account
|
|
211
|
+
* DID and the document and log as this call leaves them (unchanged when the
|
|
212
|
+
* posture was already settled), which is what the caller's roster-side half
|
|
213
|
+
* converges onto
|
|
154
214
|
*/
|
|
155
215
|
export async function publishUnlockKey(options) {
|
|
156
216
|
return withLogConflictRetry(() => setUnlockKeyPostureOnce({ ...options, polarity: 'publish' }));
|
|
@@ -164,7 +224,8 @@ export async function publishUnlockKey(options) {
|
|
|
164
224
|
* entry.
|
|
165
225
|
*
|
|
166
226
|
* @param options {object} see {@link publishUnlockKey}
|
|
167
|
-
* @returns {Promise<{ did: string }>}
|
|
227
|
+
* @returns {Promise<{ did: string, doc: DIDDoc, log: DIDLog }>} see
|
|
228
|
+
* {@link publishUnlockKey}
|
|
168
229
|
*/
|
|
169
230
|
export async function removeUnlockKey(options) {
|
|
170
231
|
return withLogConflictRetry(() => setUnlockKeyPostureOnce({ ...options, polarity: 'remove' }));
|
|
@@ -176,7 +237,7 @@ export async function removeUnlockKey(options) {
|
|
|
176
237
|
* between two copies would be published into an append-only log.
|
|
177
238
|
*
|
|
178
239
|
* @param options {object} see {@link publishUnlockKey}, plus `polarity`
|
|
179
|
-
* @returns {Promise<{ did: string }>}
|
|
240
|
+
* @returns {Promise<{ did: string, doc: DIDDoc, log: DIDLog }>}
|
|
180
241
|
*/
|
|
181
242
|
async function setUnlockKeyPostureOnce({ idStore, updateKeys, unlockKeys, expectedDid, verb, polarity }) {
|
|
182
243
|
const published = await readLogOrThrow({
|
|
@@ -192,7 +253,7 @@ async function setUnlockKeyPostureOnce({ idStore, updateKeys, unlockKeys, expect
|
|
|
192
253
|
? vmPresent && hashCommitted
|
|
193
254
|
: !vmPresent && !hashCommitted;
|
|
194
255
|
if (settled) {
|
|
195
|
-
return { did };
|
|
256
|
+
return { did, doc, log: published.log };
|
|
196
257
|
}
|
|
197
258
|
const activeKey = await updateKeyMultibase({ seed: updateKeys.updateSeed });
|
|
198
259
|
if (!published.updateKeys.includes(activeKey)) {
|
|
@@ -236,7 +297,7 @@ async function setUnlockKeyPostureOnce({ idStore, updateKeys, unlockKeys, expect
|
|
|
236
297
|
capabilityDelegation: relationIds(doc.capabilityDelegation)
|
|
237
298
|
});
|
|
238
299
|
await publishUpdatedLog({ idStore, updated, ifMatch: published.etag });
|
|
239
|
-
return { did: updated.did };
|
|
300
|
+
return { did: updated.did, doc: updated.doc, log: updated.log };
|
|
240
301
|
}
|
|
241
302
|
/**
|
|
242
303
|
* SELF-ENROLLMENT (run by the credential-derived client through the delegated
|
|
@@ -329,6 +390,13 @@ async function selfEnrollWebvhClientOnce({ store, ladderSeed, newClientKeys, new
|
|
|
329
390
|
// client's update key, whose hash the commit entry just committed.
|
|
330
391
|
const { did, doc } = published;
|
|
331
392
|
const vmId = (publicKeyMultibase) => `${did}#${publicKeyMultibase}`;
|
|
393
|
+
// When this is the FIRST durable enrollment of a client-less account, the
|
|
394
|
+
// same atomic entry ends the client-less window: every ladder VM (the
|
|
395
|
+
// relation-asymmetry recognition) leaves the document and its relations
|
|
396
|
+
// here, so no window exists where the account has neither a durable client
|
|
397
|
+
// nor the ladder VM. On an account with enrolled clients the recognition
|
|
398
|
+
// finds none and the filters are no-ops.
|
|
399
|
+
const ladderVms = ladderVmIds({ doc });
|
|
332
400
|
const addedMethods = markedVerificationMethodPair({
|
|
333
401
|
controller: did,
|
|
334
402
|
signingKeyMultibase: newClientKeys.signingKeyMultibase,
|
|
@@ -336,10 +404,11 @@ async function selfEnrollWebvhClientOnce({ store, ladderSeed, newClientKeys, new
|
|
|
336
404
|
});
|
|
337
405
|
const existingMethods = (doc.verificationMethod ?? []);
|
|
338
406
|
const verificationMethods = [
|
|
339
|
-
...existingMethods.filter(method => !addedMethods.some(added => added.id === method.id)
|
|
407
|
+
...existingMethods.filter(method => !addedMethods.some(added => added.id === method.id) &&
|
|
408
|
+
(method.id === undefined || !ladderVms.includes(method.id))),
|
|
340
409
|
...addedMethods
|
|
341
410
|
];
|
|
342
|
-
const withReference = (relation, id) => [...new Set([...relationIds(relation), id])];
|
|
411
|
+
const withReference = (relation, id) => [...new Set([...relationIds(relation), id])].filter(referencedId => !ladderVms.includes(referencedId));
|
|
343
412
|
const signingVmId = vmId(newClientKeys.signingKeyMultibase);
|
|
344
413
|
const signer = await updateKeySigner({
|
|
345
414
|
seed: newClientUpdateSeeds.updateSeed
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"standingWebvh.js","sourceRoot":"","sources":["../../src/unlock/standingWebvh.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH
|
|
1
|
+
{"version":3,"file":"standingWebvh.js","sourceRoot":"","sources":["../../src/unlock/standingWebvh.ts"],"names":[],"mappings":"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"}
|
|
@@ -26,15 +26,18 @@ export interface SealedRecordMember {
|
|
|
26
26
|
/**
|
|
27
27
|
* The unwrapped contents of an unlock record: the credential-authenticated
|
|
28
28
|
* account core (controller + pointer, plus the ladder seed where the
|
|
29
|
-
* credential is a standing method), the bridge delegation, the optional
|
|
30
|
-
*
|
|
31
|
-
*
|
|
29
|
+
* credential is a standing method), the bridge delegation, the optional
|
|
30
|
+
* companion-Space delegation (`delegatedClients` -- a standing credential's
|
|
31
|
+
* pre-minted GET+PUT over the auxiliary companion Space's items subtree),
|
|
32
|
+
* the optional bind email, and the bind timestamp. `pointer` is required --
|
|
33
|
+
* the record exists only on WAS deployments.
|
|
32
34
|
*/
|
|
33
35
|
export interface UnlockRecordContents {
|
|
34
36
|
controller: string;
|
|
35
37
|
email?: string;
|
|
36
38
|
pointer: AccountPointer;
|
|
37
39
|
delegation: IZcap;
|
|
40
|
+
delegatedClients?: IZcap;
|
|
38
41
|
ladderSeed?: Uint8Array;
|
|
39
42
|
createdAt: string;
|
|
40
43
|
}
|
|
@@ -45,6 +48,7 @@ export interface UnlockRecordContents {
|
|
|
45
48
|
export interface SignedUnlockRecord extends SignedRecord {
|
|
46
49
|
binding: string;
|
|
47
50
|
bridge: SealedRecordMember;
|
|
51
|
+
delegatedClients?: SealedRecordMember;
|
|
48
52
|
ladder?: SealedRecordMember;
|
|
49
53
|
}
|
|
50
54
|
/**
|
|
@@ -110,6 +114,9 @@ export declare function unlockRecordBinding({ record }: {
|
|
|
110
114
|
* @param options.pointer {AccountPointer} the account pointer
|
|
111
115
|
* @param options.delegation {IZcap} the PUT-on-`did.jsonl` delegation to
|
|
112
116
|
* the credential-derived signing DID
|
|
117
|
+
* @param [options.delegatedClients] {IZcap} the companion-Space delegation
|
|
118
|
+
* (GET+PUT over the auxiliary Space's items subtree), for a standing
|
|
119
|
+
* credential (a recovery code carries none)
|
|
113
120
|
* @param [options.ladderSeed] {Uint8Array} the update-key ladder seed, for
|
|
114
121
|
* a standing credential (a recovery code carries none)
|
|
115
122
|
* @param options.keyAgreementKey {IKeyAgreementKey} the credential's unlock
|
|
@@ -122,11 +129,12 @@ export declare function unlockRecordBinding({ record }: {
|
|
|
122
129
|
* freshness.
|
|
123
130
|
* @returns {Promise<SignedUnlockRecord>}
|
|
124
131
|
*/
|
|
125
|
-
export declare function wrapUnlockRecord({ controller, email, pointer, delegation, ladderSeed, keyAgreementKey, signer, bindingMacKey, createdAt }: {
|
|
132
|
+
export declare function wrapUnlockRecord({ controller, email, pointer, delegation, delegatedClients, ladderSeed, keyAgreementKey, signer, bindingMacKey, createdAt }: {
|
|
126
133
|
controller: string;
|
|
127
134
|
email?: string;
|
|
128
135
|
pointer: AccountPointer;
|
|
129
136
|
delegation: IZcap;
|
|
137
|
+
delegatedClients?: IZcap;
|
|
130
138
|
ladderSeed?: Uint8Array;
|
|
131
139
|
keyAgreementKey: IKeyAgreementKey;
|
|
132
140
|
signer: RecordSigner;
|
|
@@ -177,15 +185,23 @@ export declare function unwrapUnlockRecord({ record, keyAgreementKey, keyResolve
|
|
|
177
185
|
proofState: UnlockRecordProofState;
|
|
178
186
|
}>;
|
|
179
187
|
/**
|
|
180
|
-
* Re-mints an unlock record's
|
|
181
|
-
* replaces a rotted or expiring
|
|
188
|
+
* Re-mints an unlock record's pre-minted delegations: the revocation-cascade
|
|
189
|
+
* path that replaces a rotted or expiring bridge (and, where the record
|
|
190
|
+
* carries one, its companion-Space sibling) while touching nothing else. The
|
|
182
191
|
* shell, the ladder member, and the binding are carried VERBATIM (the re-mint
|
|
183
192
|
* cannot decrypt any of them and does not need to -- each is self-contained
|
|
184
|
-
* and the binding covers the core),
|
|
193
|
+
* and the binding covers the core), the fresh delegations are sealed to the
|
|
185
194
|
* credential's unlock KAK public half, and the frame is re-signed by the
|
|
186
195
|
* acting client's account key -- the mixed-signer case the reader settles
|
|
187
196
|
* against the verified document.
|
|
188
197
|
*
|
|
198
|
+
* The two members rot on one axis (same signer, same current-key-set rule,
|
|
199
|
+
* same renewal window), so a re-mint pass reseals both atomically; a
|
|
200
|
+
* `delegatedClients` member the caller supplies no fresh delegation for is
|
|
201
|
+
* carried verbatim, sealed as it stands (self-contained, like the ladder) --
|
|
202
|
+
* the fallback for a pass that cannot rebuild the companion target, never
|
|
203
|
+
* the intended steady state.
|
|
204
|
+
*
|
|
189
205
|
* A record with no binding cannot be re-minted ({@link UnlockBindingError});
|
|
190
206
|
* its credential must be rebound.
|
|
191
207
|
*
|
|
@@ -193,14 +209,18 @@ export declare function unwrapUnlockRecord({ record, keyAgreementKey, keyResolve
|
|
|
193
209
|
* @param options.record {unknown} the standing stored record
|
|
194
210
|
* @param options.delegation {IZcap} the freshly minted `did.jsonl`
|
|
195
211
|
* delegation
|
|
212
|
+
* @param [options.delegatedClients] {IZcap} the freshly minted
|
|
213
|
+
* companion-Space delegation; when absent, an existing `delegatedClients`
|
|
214
|
+
* member travels verbatim
|
|
196
215
|
* @param options.keyAgreementKey {IKeyAgreementKey} the credential's unlock
|
|
197
216
|
* KAK, public half only
|
|
198
217
|
* @param options.signer {RecordSigner} the acting client's account key
|
|
199
218
|
* @returns {Promise<SignedUnlockRecord>}
|
|
200
219
|
*/
|
|
201
|
-
export declare function
|
|
220
|
+
export declare function remintUnlockRecordDelegations({ record, delegation, delegatedClients, keyAgreementKey, signer }: {
|
|
202
221
|
record: unknown;
|
|
203
222
|
delegation: IZcap;
|
|
223
|
+
delegatedClients?: IZcap;
|
|
204
224
|
keyAgreementKey: IKeyAgreementKey;
|
|
205
225
|
signer: RecordSigner;
|
|
206
226
|
}): Promise<SignedUnlockRecord>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"unlockRecord.d.ts","sourceRoot":"","sources":["../../src/unlock/unlockRecord.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"unlockRecord.d.ts","sourceRoot":"","sources":["../../src/unlock/unlockRecord.ts"],"names":[],"mappings":"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"}
|