@interop/wallet-core 0.40.0 → 0.42.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 -3
- package/dist/clients/listing.d.ts +4 -3
- package/dist/clients/listing.d.ts.map +1 -1
- package/dist/clients/listing.js.map +1 -1
- package/dist/clients/policy.d.ts +3 -2
- package/dist/clients/policy.d.ts.map +1 -1
- package/dist/clients/policy.js +3 -3
- package/dist/clients/policy.js.map +1 -1
- package/dist/clients/revocation.d.ts +14 -4
- package/dist/clients/revocation.d.ts.map +1 -1
- package/dist/clients/revocation.js +29 -14
- package/dist/clients/revocation.js.map +1 -1
- package/dist/clients/rosterPolicy.d.ts +22 -15
- package/dist/clients/rosterPolicy.d.ts.map +1 -1
- package/dist/clients/rosterPolicy.js +32 -15
- 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 +30 -2
- package/dist/enrollment/enrollment.d.ts.map +1 -1
- package/dist/enrollment/enrollment.js +58 -30
- package/dist/enrollment/enrollment.js.map +1 -1
- package/dist/enrollment/index.d.ts +4 -1
- package/dist/enrollment/index.d.ts.map +1 -1
- package/dist/enrollment/index.js +4 -1
- package/dist/enrollment/index.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 +7 -6
- package/dist/keyring/index.d.ts.map +1 -1
- package/dist/keyring/index.js +7 -6
- 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/keyring/record.d.ts +30 -10
- package/dist/keyring/record.d.ts.map +1 -1
- package/dist/keyring/record.js +31 -15
- package/dist/keyring/record.js.map +1 -1
- package/dist/keys/index.d.ts +5 -3
- package/dist/keys/index.d.ts.map +1 -1
- package/dist/keys/index.js +3 -2
- package/dist/keys/index.js.map +1 -1
- package/dist/keys/rosterLogStore.d.ts +22 -2
- package/dist/keys/rosterLogStore.d.ts.map +1 -1
- package/dist/keys/rosterLogStore.js +40 -20
- 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/userKeyCascade.d.ts +10 -3
- package/dist/keys/userKeyCascade.d.ts.map +1 -1
- package/dist/keys/userKeyCascade.js +10 -4
- package/dist/keys/userKeyCascade.js.map +1 -1
- package/dist/keys/userKeyRoster.d.ts +29 -21
- package/dist/keys/userKeyRoster.d.ts.map +1 -1
- package/dist/keys/userKeyRoster.js +47 -23
- package/dist/keys/userKeyRoster.js.map +1 -1
- package/dist/recovery/index.d.ts +21 -11
- package/dist/recovery/index.d.ts.map +1 -1
- package/dist/recovery/index.js +19 -10
- 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 +151 -0
- package/dist/recovery/recoveryDelegation.d.ts.map +1 -0
- package/dist/recovery/recoveryDelegation.js +261 -0
- package/dist/recovery/recoveryDelegation.js.map +1 -0
- package/dist/recovery/recoveryWebvh.d.ts +13 -22
- package/dist/recovery/recoveryWebvh.d.ts.map +1 -1
- package/dist/recovery/recoveryWebvh.js +53 -139
- 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 +166 -7
- package/dist/webvh/didWebvh.d.ts.map +1 -1
- package/dist/webvh/didWebvh.js +286 -31
- package/dist/webvh/didWebvh.js.map +1 -1
- package/dist/webvh/index.d.ts +15 -3
- package/dist/webvh/index.d.ts.map +1 -1
- package/dist/webvh/index.js +14 -3
- package/dist/webvh/index.js.map +1 -1
- package/dist/webvh/keyAgreement.d.ts +72 -0
- package/dist/webvh/keyAgreement.d.ts.map +1 -0
- package/dist/webvh/keyAgreement.js +47 -0
- package/dist/webvh/keyAgreement.js.map +1 -0
- package/dist/webvh/listClients.d.ts +69 -20
- package/dist/webvh/listClients.d.ts.map +1 -1
- package/dist/webvh/listClients.js +102 -14
- package/dist/webvh/listClients.js.map +1 -1
- package/dist/webvh/revokeClient.d.ts +21 -11
- package/dist/webvh/revokeClient.d.ts.map +1 -1
- package/dist/webvh/revokeClient.js +31 -14
- package/dist/webvh/revokeClient.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 -171
- package/dist/recovery/recoveryRecord.d.ts.map +0 -1
- package/dist/recovery/recoveryRecord.js +0 -290
- package/dist/recovery/recoveryRecord.js.map +0 -1
package/dist/keys/rosterStore.js
CHANGED
|
@@ -18,8 +18,25 @@
|
|
|
18
18
|
*/
|
|
19
19
|
import { WasClient } from '@interop/was-client';
|
|
20
20
|
import { resourceLogStore } from '@interop/was-client/log';
|
|
21
|
+
import { resourceLogPinId } from '../resourceLog/index.js';
|
|
21
22
|
import { KEY_MAP_COLLECTION, USER_KEY_ROSTER_LOG_RESOURCE } from '../space/collections.js';
|
|
22
23
|
import { logGovernedDescriptorStore } from './rosterLogStore.js';
|
|
24
|
+
/**
|
|
25
|
+
* The pin-slot key for a Space's user key roster log
|
|
26
|
+
* (`key-map/user-key.jsonl`) -- what a caller keying its own
|
|
27
|
+
* {@link ResourceLogPinStore} names the roster's pin by.
|
|
28
|
+
*
|
|
29
|
+
* @param options {object}
|
|
30
|
+
* @param options.spaceId {string} the data Space id
|
|
31
|
+
* @returns {string}
|
|
32
|
+
*/
|
|
33
|
+
export function userKeyRosterPinId({ spaceId }) {
|
|
34
|
+
return resourceLogPinId({
|
|
35
|
+
spaceId,
|
|
36
|
+
collectionId: KEY_MAP_COLLECTION.id,
|
|
37
|
+
resourceId: USER_KEY_ROSTER_LOG_RESOURCE
|
|
38
|
+
});
|
|
39
|
+
}
|
|
23
40
|
/**
|
|
24
41
|
* Builds the log-governed descriptor store over the user key roster in a
|
|
25
42
|
* data Space: reads resolve to the verified head of
|
|
@@ -51,6 +68,7 @@ export function userKeyRosterDescriptorStore({ storageServerUrl, zcapClient, spa
|
|
|
51
68
|
}),
|
|
52
69
|
resolveController,
|
|
53
70
|
pinStore,
|
|
71
|
+
logId: userKeyRosterPinId({ spaceId }),
|
|
54
72
|
signer
|
|
55
73
|
});
|
|
56
74
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"rosterStore.js","sourceRoot":"","sources":["../../src/keys/rosterStore.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH;;;;;;;;;;;;;;GAcG;AACH,OAAO,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAA;AAE/C,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAA;
|
|
1
|
+
{"version":3,"file":"rosterStore.js","sourceRoot":"","sources":["../../src/keys/rosterStore.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH;;;;;;;;;;;;;;GAcG;AACH,OAAO,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAA;AAE/C,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAA;AAC1D,OAAO,EACL,gBAAgB,EAIjB,MAAM,yBAAyB,CAAA;AAChC,OAAO,EACL,kBAAkB,EAClB,4BAA4B,EAC7B,MAAM,yBAAyB,CAAA;AAChC,OAAO,EACL,0BAA0B,EAE3B,MAAM,qBAAqB,CAAA;AAE5B;;;;;;;;GAQG;AACH,MAAM,UAAU,kBAAkB,CAAC,EAAE,OAAO,EAAuB;IACjE,OAAO,gBAAgB,CAAC;QACtB,OAAO;QACP,YAAY,EAAE,kBAAkB,CAAC,EAAE;QACnC,UAAU,EAAE,4BAA4B;KACzC,CAAC,CAAA;AACJ,CAAC;AAED;;;;;;;;;;;;;;;;;;;GAmBG;AACH,MAAM,UAAU,4BAA4B,CAAC,EAC3C,gBAAgB,EAChB,UAAU,EACV,OAAO,EACP,iBAAiB,EACjB,QAAQ,EACR,MAAM,EAQP;IACC,MAAM,GAAG,GAAG,IAAI,SAAS,CAAC,EAAE,SAAS,EAAE,gBAAgB,EAAE,UAAU,EAAE,CAAC,CAAA;IACtE,MAAM,UAAU,GAAG,GAAG;SACnB,KAAK,CAAC,OAAO,CAAC;SACd,UAAU,CAAC,kBAAkB,CAAC,EAAE,EAAE,EAAE,UAAU,EAAE,WAAW,EAAE,CAAC,CAAA;IACjE,OAAO,0BAA0B,CAAC;QAChC,GAAG,EAAE,gBAAgB,CAAC;YACpB,QAAQ,EAAE,UAAU,CAAC,QAAQ,CAAC,4BAA4B,CAAC;SAC5D,CAAC;QACF,iBAAiB;QACjB,QAAQ;QACR,KAAK,EAAE,kBAAkB,CAAC,EAAE,OAAO,EAAE,CAAC;QACtC,MAAM;KACP,CAAC,CAAA;AACJ,CAAC"}
|
|
@@ -22,7 +22,12 @@
|
|
|
22
22
|
* The cascade is rotation-only: every encrypted collection's descriptor
|
|
23
23
|
* carries an epoch roster from provisioning (`ensureWalletSpaceEpochs`), so a
|
|
24
24
|
* descriptor met without epochs can only mean a tampering or pre-provisioning
|
|
25
|
-
* host and is refused fail-closed.
|
|
25
|
+
* host and is refused fail-closed. A descriptor whose `currentEpoch` names no
|
|
26
|
+
* epoch in its own list is refused the same way (the shape
|
|
27
|
+
* `readUserKeyRoster` refuses on the roster itself): collection descriptors
|
|
28
|
+
* arrive host-served with no server-side epoch invariants, so a mismatched
|
|
29
|
+
* pair is a configuration no enrolled client authenticated, never something
|
|
30
|
+
* to evaluate against the last epoch. No construction anywhere installs a
|
|
26
31
|
* user-key secret as a collection epoch secret, which is what keeps a
|
|
27
32
|
* collection-epoch escrow (an App Connect grant, a share) from ever handing a
|
|
28
33
|
* grantee the user key itself.
|
|
@@ -88,9 +93,11 @@ export type CollectionUserKeyRotationOutcome = 'noop' | 'sealed' | 'escrowed' |
|
|
|
88
93
|
* so the store's seal backstop runs here (`sealed` when it appended);
|
|
89
94
|
* rotated and escrowed writes seal by construction, anchored at the
|
|
90
95
|
* caller's current controller head.
|
|
91
|
-
* - **No epochs
|
|
96
|
+
* - **No epochs**, or a `currentEpoch` naming no epoch in the descriptor's
|
|
97
|
+
* own list: refused fail-closed (see the module doc) -- provisioning
|
|
92
98
|
* installs every encrypted collection's epoch[0], so the cascade never
|
|
93
|
-
* mints a first epoch
|
|
99
|
+
* mints a first epoch, and never guesses which epoch an inconsistent
|
|
100
|
+
* descriptor meant.
|
|
94
101
|
*
|
|
95
102
|
* The pull axis is deliberately a no-op here: a user key rotation follows a
|
|
96
103
|
* document edit (client revocation, code retirement) that already killed the
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"userKeyCascade.d.ts","sourceRoot":"","sources":["../../src/keys/userKeyCascade.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH
|
|
1
|
+
{"version":3,"file":"userKeyCascade.d.ts","sourceRoot":"","sources":["../../src/keys/userKeyCascade.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8BG;AACH,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,8BAA8B,CAAA;AACpE,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAA;AAC/D,OAAO,EAML,KAAK,yBAAyB,EAC9B,KAAK,kBAAkB,EACxB,MAAM,yBAAyB,CAAA;AAEhC,OAAO,EAAoB,KAAK,OAAO,EAAE,MAAM,cAAc,CAAA;AAE7D;;;;;;;;GAQG;AACH,wBAAgB,kBAAkB,CAAC,EACjC,OAAO,EACR,EAAE;IACD,OAAO,EAAE,OAAO,CAAA;CACjB,GAAG,kBAAkB,CAKrB;AAED;;;;;;;;;;;;;;;GAeG;AACH,wBAAsB,wBAAwB,CAAC,EAC7C,UAAU,EACV,qBAAqB,EACtB,EAAE;IACD,UAAU,EAAE,oBAAoB,CAAA;IAChC,qBAAqB,EAAE,gBAAgB,CAAA;CACxC,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC,CAkBrB;AAED;;;;;;;GAOG;AACH,MAAM,MAAM,gCAAgC,GAC1C,MAAM,GAAG,QAAQ,GAAG,UAAU,GAAG,SAAS,CAAA;AAE5C;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAkCG;AACH,wBAAsB,+BAA+B,CAAC,EACpD,KAAK,EACL,OAAO,EACP,WAAW,EACZ,EAAE;IACD,KAAK,EAAE,yBAAyB,CAAA;IAChC,OAAO,EAAE,OAAO,CAAA;IAChB,WAAW,EAAE,OAAO,EAAE,CAAA;CACvB,GAAG,OAAO,CAAC,gCAAgC,CAAC,CA0G5C;AAED;;;;GAIG;AACH,MAAM,WAAW,oBAAoB;IACnC,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,gCAAgC,CAAC,CAAA;IAC1D,MAAM,EAAE,KAAK,CAAC;QAAE,YAAY,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,OAAO,CAAA;KAAE,CAAC,CAAA;CACxD;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AACH,wBAAsB,2BAA2B,CAAC,EAChD,aAAa,EACb,QAAQ,EACR,WAAW,EACX,gBAAgB,EAChB,qBAAqB,EACrB,OAAO,EACR,EAAE;IACD,aAAa,EAAE,MAAM,EAAE,CAAA;IACvB,QAAQ,EAAE,CAAC,YAAY,EAAE,MAAM,KAAK,yBAAyB,CAAA;IAC7D,WAAW,CAAC,EAAE,CAAC,YAAY,EAAE,MAAM,KAAK,OAAO,CAAC,OAAO,CAAC,CAAA;IACxD,gBAAgB,EAAE,oBAAoB,CAAA;IACtC,qBAAqB,EAAE,gBAAgB,CAAA;IACvC,OAAO,EAAE,OAAO,CAAA;CACjB,GAAG,OAAO,CAAC,oBAAoB,CAAC,CAwBhC"}
|
|
@@ -65,9 +65,11 @@ export async function unwrapUserKeyGenerations({ descriptor, clientKeyAgreementK
|
|
|
65
65
|
* so the store's seal backstop runs here (`sealed` when it appended);
|
|
66
66
|
* rotated and escrowed writes seal by construction, anchored at the
|
|
67
67
|
* caller's current controller head.
|
|
68
|
-
* - **No epochs
|
|
68
|
+
* - **No epochs**, or a `currentEpoch` naming no epoch in the descriptor's
|
|
69
|
+
* own list: refused fail-closed (see the module doc) -- provisioning
|
|
69
70
|
* installs every encrypted collection's epoch[0], so the cascade never
|
|
70
|
-
* mints a first epoch
|
|
71
|
+
* mints a first epoch, and never guesses which epoch an inconsistent
|
|
72
|
+
* descriptor meant.
|
|
71
73
|
*
|
|
72
74
|
* The pull axis is deliberately a no-op here: a user key rotation follows a
|
|
73
75
|
* document edit (client revocation, code retirement) that already killed the
|
|
@@ -95,8 +97,12 @@ export async function rotateCollectionEpochsToUserKey({ store, userKey, generati
|
|
|
95
97
|
'epoch-less descriptor can only come from a tampering or ' +
|
|
96
98
|
'pre-provisioning host; refusing to rotate it.');
|
|
97
99
|
}
|
|
98
|
-
const currentEpoch = descriptor.epochs.find(epoch => epoch.id === descriptor.currentEpoch)
|
|
99
|
-
|
|
100
|
+
const currentEpoch = descriptor.epochs.find(epoch => epoch.id === descriptor.currentEpoch);
|
|
101
|
+
if (!currentEpoch) {
|
|
102
|
+
throw new Error("The collection descriptor's currentEpoch names no epoch in its own " +
|
|
103
|
+
'epochs list. No enrolled client authenticated such a configuration; ' +
|
|
104
|
+
'refusing to evaluate it against any other epoch.');
|
|
105
|
+
}
|
|
100
106
|
const currentKids = new Set(currentEpoch.recipients.map(entry => entry.header.kid));
|
|
101
107
|
const staleKids = staleGenerations
|
|
102
108
|
.map(generation => epochKeyIdFor(generation.id))
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"userKeyCascade.js","sourceRoot":"","sources":["../../src/keys/userKeyCascade.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"userKeyCascade.js","sourceRoot":"","sources":["../../src/keys/userKeyCascade.ts"],"names":[],"mappings":"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"}
|
|
@@ -51,6 +51,7 @@ import type { IKeyAgreementKey } from '@interop/data-integrity-core';
|
|
|
51
51
|
import type { CollectionEncryption } from '@interop/was-client';
|
|
52
52
|
import { type EncryptionDescriptorStore, type RecipientPublicKey } from '@interop/was-client/edv';
|
|
53
53
|
import { type ResourceLogSigner } from '../resourceLog/index.js';
|
|
54
|
+
import type { KeyAgreementDocument } from '../webvh/keyAgreement.js';
|
|
54
55
|
import { type ICapabilityAgent } from '../webvh/zcap.js';
|
|
55
56
|
import type { UserKey } from './userKey.js';
|
|
56
57
|
/**
|
|
@@ -83,21 +84,6 @@ export declare class UserKeyRosterContinuityError extends Error {
|
|
|
83
84
|
export declare class UserKeyRosterUnwrapError extends Error {
|
|
84
85
|
constructor(message: string);
|
|
85
86
|
}
|
|
86
|
-
/**
|
|
87
|
-
* The subset of a resolved DID document the recipient resolver consumes: the
|
|
88
|
-
* `keyAgreement` relation (VM references or embedded VMs) and the
|
|
89
|
-
* `verificationMethod` list references resolve against.
|
|
90
|
-
*/
|
|
91
|
-
export interface RosterRecipientDocument {
|
|
92
|
-
keyAgreement?: Array<string | {
|
|
93
|
-
id?: string;
|
|
94
|
-
publicKeyMultibase?: string;
|
|
95
|
-
}>;
|
|
96
|
-
verificationMethod?: Array<{
|
|
97
|
-
id?: string;
|
|
98
|
-
publicKeyMultibase?: string;
|
|
99
|
-
}>;
|
|
100
|
-
}
|
|
101
87
|
/**
|
|
102
88
|
* The roster's log signer: signs each roster log append with this client's
|
|
103
89
|
* own Ed25519 signing key, named by its public multibase -- exactly the
|
|
@@ -143,13 +129,35 @@ export declare function rosterRecipientKid({ signingKeyMultibase, keyAgreementKe
|
|
|
143
129
|
* resolves `null` -- the was-client skip contract -- so the entry is dropped
|
|
144
130
|
* from the fresh epoch and never receives a wrap.
|
|
145
131
|
*
|
|
132
|
+
* The match is over EVERY key-agreement method the document publishes
|
|
133
|
+
* ({@link resolvedKeyAgreementMethods}), deliberately including the unmarked
|
|
134
|
+
* ones. That is where this predicate parts company with
|
|
135
|
+
* `markedKeyAgreementMethods`, which hard-requires a client's controller
|
|
136
|
+
* marker: a recovery code's or standing unlock credential's key-agreement
|
|
137
|
+
* method is published unmarked by design, so that client listings and
|
|
138
|
+
* revocations never match it, and it must keep its user key wrap through every
|
|
139
|
+
* rotation. Filtering by the marker here would drop every such credential from
|
|
140
|
+
* each rotated epoch.
|
|
141
|
+
*
|
|
142
|
+
* Two branches back an entry, and a method's `type` selects exactly one. A
|
|
143
|
+
* method that is not a `MultikeyCommitment` and carries the key verbatim
|
|
144
|
+
* (`publicKeyMultibase`) matches on the multibase (so a did:key-form kid
|
|
145
|
+
* matches its `<did:webvh>#<multibase>` VM). A `MultikeyCommitment` method's
|
|
146
|
+
* hash commitment (`publicKeyCommitment` -- a low-entropy-derived standing
|
|
147
|
+
* credential, whose key material the document withholds) matches when it
|
|
148
|
+
* commits to the roster entry's own key: the roster carries the real key, the
|
|
149
|
+
* document vouches for it, and a server-injected entry can neither meet a
|
|
150
|
+
* standing commitment nor add one. The type split means a hybrid method
|
|
151
|
+
* carrying both properties backs at most one recipient -- the flavor its
|
|
152
|
+
* `type` declares -- never two.
|
|
153
|
+
*
|
|
146
154
|
* @param options {object}
|
|
147
|
-
* @param options.document {
|
|
155
|
+
* @param options.document {KeyAgreementDocument} the locally verified
|
|
148
156
|
* did:webvh document (never a server-supplied roster field)
|
|
149
157
|
* @returns {function} a `resolveRecipientKey` for `removeRecipient`
|
|
150
158
|
*/
|
|
151
159
|
export declare function userKeyRosterRecipientResolver({ document }: {
|
|
152
|
-
document:
|
|
160
|
+
document: KeyAgreementDocument;
|
|
153
161
|
}): (kid: string) => Promise<RecipientPublicKey | null>;
|
|
154
162
|
/**
|
|
155
163
|
* Ensures the roster exists, create-if-absent: an absent roster is initialized
|
|
@@ -218,7 +226,7 @@ export declare function addUserKeyRosterRecipient({ store, recipient, ownerKeyAg
|
|
|
218
226
|
* @param options {object}
|
|
219
227
|
* @param options.store {EncryptionDescriptorStore} the roster's descriptor
|
|
220
228
|
* store
|
|
221
|
-
* @param options.document {
|
|
229
|
+
* @param options.document {KeyAgreementDocument} the locally verified
|
|
222
230
|
* did:webvh document, AFTER the removal edit
|
|
223
231
|
* @param options.retireRecipientId {string} the removed recipient's roster
|
|
224
232
|
* kid
|
|
@@ -226,7 +234,7 @@ export declare function addUserKeyRosterRecipient({ store, recipient, ownerKeyAg
|
|
|
226
234
|
*/
|
|
227
235
|
export declare function rotateUserKeyRoster({ store, document, retireRecipientId }: {
|
|
228
236
|
store: EncryptionDescriptorStore;
|
|
229
|
-
document:
|
|
237
|
+
document: KeyAgreementDocument;
|
|
230
238
|
retireRecipientId: string;
|
|
231
239
|
}): Promise<CollectionEncryption>;
|
|
232
240
|
/**
|
|
@@ -258,7 +266,7 @@ export declare function rotateUserKeyRoster({ store, document, retireRecipientId
|
|
|
258
266
|
* @param options {object}
|
|
259
267
|
* @param options.store {EncryptionDescriptorStore} the roster's descriptor
|
|
260
268
|
* store
|
|
261
|
-
* @param options.document {
|
|
269
|
+
* @param options.document {KeyAgreementDocument} the locally verified
|
|
262
270
|
* did:webvh document -- the recipient source of record
|
|
263
271
|
* @param [options.descriptor] {CollectionEncryption} a descriptor the caller
|
|
264
272
|
* has just read (a login-time roster read), to save a re-read; omitted, the
|
|
@@ -269,7 +277,7 @@ export declare function rotateUserKeyRoster({ store, document, retireRecipientId
|
|
|
269
277
|
*/
|
|
270
278
|
export declare function convergeUserKeyRosterToDocument({ store, document, descriptor }: {
|
|
271
279
|
store: EncryptionDescriptorStore;
|
|
272
|
-
document:
|
|
280
|
+
document: KeyAgreementDocument;
|
|
273
281
|
descriptor?: CollectionEncryption;
|
|
274
282
|
}): Promise<{
|
|
275
283
|
rotated: boolean;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"userKeyRoster.d.ts","sourceRoot":"","sources":["../../src/keys/userKeyRoster.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6CG;AACH,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,8BAA8B,CAAA;AACpE,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAA;AAC/D,OAAO,EAML,KAAK,yBAAyB,EAC9B,KAAK,kBAAkB,EACxB,MAAM,yBAAyB,CAAA;AAChC,OAAO,EAAgB,KAAK,iBAAiB,EAAE,MAAM,yBAAyB,CAAA;
|
|
1
|
+
{"version":3,"file":"userKeyRoster.d.ts","sourceRoot":"","sources":["../../src/keys/userKeyRoster.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
import { addRecipient, initRecipients, ownerRecipient, removeRecipient, unwrapEpochSecret } from '@interop/was-client/edv';
|
|
2
2
|
import { vmFragmentOf } from '../resourceLog/index.js';
|
|
3
|
+
import { commitmentMatcher, MULTIKEY_COMMITMENT_VM_TYPE } from '../webvh/didWebvh.js';
|
|
4
|
+
import { resolvedKeyAgreementMethods } from '../webvh/keyAgreement.js';
|
|
3
5
|
import { clientSigningKeyMultibase } from '../webvh/zcap.js';
|
|
4
6
|
/**
|
|
5
7
|
* Thrown when a served roster fails its client-side consistency checks: a
|
|
@@ -94,39 +96,61 @@ export function rosterRecipientKid({ signingKeyMultibase, keyAgreementKeyMultiba
|
|
|
94
96
|
* resolves `null` -- the was-client skip contract -- so the entry is dropped
|
|
95
97
|
* from the fresh epoch and never receives a wrap.
|
|
96
98
|
*
|
|
99
|
+
* The match is over EVERY key-agreement method the document publishes
|
|
100
|
+
* ({@link resolvedKeyAgreementMethods}), deliberately including the unmarked
|
|
101
|
+
* ones. That is where this predicate parts company with
|
|
102
|
+
* `markedKeyAgreementMethods`, which hard-requires a client's controller
|
|
103
|
+
* marker: a recovery code's or standing unlock credential's key-agreement
|
|
104
|
+
* method is published unmarked by design, so that client listings and
|
|
105
|
+
* revocations never match it, and it must keep its user key wrap through every
|
|
106
|
+
* rotation. Filtering by the marker here would drop every such credential from
|
|
107
|
+
* each rotated epoch.
|
|
108
|
+
*
|
|
109
|
+
* Two branches back an entry, and a method's `type` selects exactly one. A
|
|
110
|
+
* method that is not a `MultikeyCommitment` and carries the key verbatim
|
|
111
|
+
* (`publicKeyMultibase`) matches on the multibase (so a did:key-form kid
|
|
112
|
+
* matches its `<did:webvh>#<multibase>` VM). A `MultikeyCommitment` method's
|
|
113
|
+
* hash commitment (`publicKeyCommitment` -- a low-entropy-derived standing
|
|
114
|
+
* credential, whose key material the document withholds) matches when it
|
|
115
|
+
* commits to the roster entry's own key: the roster carries the real key, the
|
|
116
|
+
* document vouches for it, and a server-injected entry can neither meet a
|
|
117
|
+
* standing commitment nor add one. The type split means a hybrid method
|
|
118
|
+
* carrying both properties backs at most one recipient -- the flavor its
|
|
119
|
+
* `type` declares -- never two.
|
|
120
|
+
*
|
|
97
121
|
* @param options {object}
|
|
98
|
-
* @param options.document {
|
|
122
|
+
* @param options.document {KeyAgreementDocument} the locally verified
|
|
99
123
|
* did:webvh document (never a server-supplied roster field)
|
|
100
124
|
* @returns {function} a `resolveRecipientKey` for `removeRecipient`
|
|
101
125
|
*/
|
|
102
126
|
export function userKeyRosterRecipientResolver({ document }) {
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
for (const entry of document.keyAgreement ?? []) {
|
|
113
|
-
const method = typeof entry === 'string' ? byId.get(entry) : entry;
|
|
114
|
-
if (method && typeof method.publicKeyMultibase === 'string') {
|
|
115
|
-
keyAgreementMethods.push(method);
|
|
116
|
-
}
|
|
117
|
-
}
|
|
127
|
+
const methods = resolvedKeyAgreementMethods({ doc: document });
|
|
128
|
+
const verbatimMethods = methods.filter(method => method.type !== MULTIKEY_COMMITMENT_VM_TYPE &&
|
|
129
|
+
typeof method.publicKeyMultibase === 'string');
|
|
130
|
+
const commitmentBacked = commitmentMatcher({
|
|
131
|
+
commitments: methods
|
|
132
|
+
.filter(method => method.type === MULTIKEY_COMMITMENT_VM_TYPE)
|
|
133
|
+
.map(method => method.publicKeyCommitment)
|
|
134
|
+
.filter((value) => typeof value === 'string')
|
|
135
|
+
});
|
|
118
136
|
return async function resolveRecipientKey(kid) {
|
|
119
137
|
const fragment = vmFragmentOf(kid);
|
|
120
138
|
if (!fragment) {
|
|
121
139
|
return null;
|
|
122
140
|
}
|
|
123
|
-
const match =
|
|
141
|
+
const match = verbatimMethods.find(method => method.publicKeyMultibase === fragment ||
|
|
124
142
|
(typeof method.id === 'string' && vmFragmentOf(method.id) === fragment));
|
|
125
|
-
if (
|
|
126
|
-
|
|
127
|
-
|
|
143
|
+
if (match) {
|
|
144
|
+
return { id: kid, publicKeyMultibase: match.publicKeyMultibase };
|
|
145
|
+
}
|
|
146
|
+
// The commitment branch: the roster entry's key is document-backed iff a
|
|
147
|
+
// published `MultikeyCommitment` method commits to it. The matcher
|
|
148
|
+
// pre-decoded the commitments (a malformed one matches nothing).
|
|
149
|
+
if (commitmentBacked(fragment)) {
|
|
150
|
+
return { id: kid, publicKeyMultibase: fragment };
|
|
128
151
|
}
|
|
129
|
-
|
|
152
|
+
// No document verification method backs this roster entry: drop it.
|
|
153
|
+
return null;
|
|
130
154
|
};
|
|
131
155
|
}
|
|
132
156
|
/**
|
|
@@ -218,7 +242,7 @@ export async function addUserKeyRosterRecipient({ store, recipient, ownerKeyAgre
|
|
|
218
242
|
* @param options {object}
|
|
219
243
|
* @param options.store {EncryptionDescriptorStore} the roster's descriptor
|
|
220
244
|
* store
|
|
221
|
-
* @param options.document {
|
|
245
|
+
* @param options.document {KeyAgreementDocument} the locally verified
|
|
222
246
|
* did:webvh document, AFTER the removal edit
|
|
223
247
|
* @param options.retireRecipientId {string} the removed recipient's roster
|
|
224
248
|
* kid
|
|
@@ -261,7 +285,7 @@ export async function rotateUserKeyRoster({ store, document, retireRecipientId }
|
|
|
261
285
|
* @param options {object}
|
|
262
286
|
* @param options.store {EncryptionDescriptorStore} the roster's descriptor
|
|
263
287
|
* store
|
|
264
|
-
* @param options.document {
|
|
288
|
+
* @param options.document {KeyAgreementDocument} the locally verified
|
|
265
289
|
* did:webvh document -- the recipient source of record
|
|
266
290
|
* @param [options.descriptor] {CollectionEncryption} a descriptor the caller
|
|
267
291
|
* has just read (a login-time roster read), to save a re-read; omitted, the
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"userKeyRoster.js","sourceRoot":"","sources":["../../src/keys/userKeyRoster.ts"],"names":[],"mappings":"AAmDA,OAAO,EACL,YAAY,EACZ,cAAc,EACd,cAAc,EACd,eAAe,EACf,iBAAiB,EAGlB,MAAM,yBAAyB,CAAA;AAChC,OAAO,EAAE,YAAY,EAA0B,MAAM,yBAAyB,CAAA;AAC9E,OAAO,EACL,yBAAyB,EAE1B,MAAM,kBAAkB,CAAA;AAGzB;;;;;GAKG;AACH,MAAM,OAAO,2BAA4B,SAAQ,KAAK;IACpD,YAAY,OAAe;QACzB,KAAK,CAAC,OAAO,CAAC,CAAA;QACd,IAAI,CAAC,IAAI,GAAG,6BAA6B,CAAA;IAC3C,CAAC;CACF;AAED;;;;;GAKG;AACH,MAAM,OAAO,4BAA6B,SAAQ,KAAK;IACrD,aAAa,CAAQ;IACrB,YAAY,EAAE,aAAa,EAA6B;QACtD,KAAK,CACH,4EAA4E;YAC1E,mCAAmC,CACtC,CAAA;QACD,IAAI,CAAC,IAAI,GAAG,8BAA8B,CAAA;QAC1C,IAAI,CAAC,aAAa,GAAG,aAAa,CAAA;IACpC,CAAC;CACF;AAED;;;;;GAKG;AACH,MAAM,OAAO,wBAAyB,SAAQ,KAAK;IACjD,YAAY,OAAe;QACzB,KAAK,CAAC,OAAO,CAAC,CAAA;QACd,IAAI,CAAC,IAAI,GAAG,0BAA0B,CAAA;IACxC,CAAC;CACF;
|
|
1
|
+
{"version":3,"file":"userKeyRoster.js","sourceRoot":"","sources":["../../src/keys/userKeyRoster.ts"],"names":[],"mappings":"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"}
|
package/dist/recovery/index.d.ts
CHANGED
|
@@ -12,25 +12,35 @@
|
|
|
12
12
|
* - `recoveryClientFromCode` -- the deterministic client key set:
|
|
13
13
|
* unlock identity, client seed (signing + key-agreement pair), and the
|
|
14
14
|
* single did:webvh update key whose hash stands pre-committed.
|
|
15
|
-
* -
|
|
16
|
-
*
|
|
17
|
-
*
|
|
18
|
-
*
|
|
19
|
-
*
|
|
20
|
-
*
|
|
21
|
-
*
|
|
22
|
-
* so a storage host can never redirect recovery at
|
|
15
|
+
* - The record codec lives in `@interop/wallet-core/unlock` now
|
|
16
|
+
* (`wrapUnlockRecord` / `unwrapUnlockRecord`, re-exported here): a
|
|
17
|
+
* recovery record is an unlock record with no ladder member -- the account
|
|
18
|
+
* pointer plus the pre-minted PUT-on-`did.jsonl` bridge delegation (never
|
|
19
|
+
* a seed, never a user key wrap), signed under the mixed-signer policy
|
|
20
|
+
* (the code's unlock key at issuance, an enrolled client's account key on
|
|
21
|
+
* a re-mint), with the account core authenticated by a MAC under a
|
|
22
|
+
* code-derived key, so a storage host can never redirect recovery at
|
|
23
|
+
* another account.
|
|
23
24
|
* - `publishRecoveryKey` / `removeRecoveryKey` / `recoverWebvhClient` -- the
|
|
24
|
-
* document half: issuance's split posture
|
|
25
|
+
* document half: issuance's split posture and revocation's removal (thin
|
|
26
|
+
* wrappers over the unlock subpath's merged posture core), and the
|
|
25
27
|
* self-enrolling recovery continuation.
|
|
28
|
+
* - `delegateLogWrite` / `delegationProofKeyId` /
|
|
29
|
+
* `remintRecoveryDelegations` -- the authorization bridge: the pre-minted
|
|
30
|
+
* PUT-on-`did.jsonl` delegation builder and the revocation cascade's
|
|
31
|
+
* re-mint of the delegations a document edit rotted, behind injected
|
|
32
|
+
* app seams (management-zcap client factory, storage URL, registry
|
|
33
|
+
* read/record).
|
|
26
34
|
*
|
|
27
35
|
* Kept out of the root export: this subpath pulls the webkms-client / ezcap /
|
|
28
36
|
* was-client dependency graph (the same isolation pattern as `./keyring`).
|
|
29
37
|
*/
|
|
30
38
|
export { decodeRecoveryCode, formatRecoveryCode, generateRecoveryCode, normalizeRecoveryCode, RECOVERY_CODE_BYTES, RECOVERY_KDF, RecoveryCodeInvalidError, recoveryClientFromCode } from './recoveryCode.js';
|
|
31
39
|
export type { RecoveryClient } from './recoveryCode.js';
|
|
32
|
-
export {
|
|
33
|
-
export type {
|
|
40
|
+
export { computeUnlockBinding, remintUnlockRecordBridge, UnlockBindingError, unlockRecordBinding, unwrapUnlockRecord, wrapUnlockRecord } from '../unlock/unlockRecord.js';
|
|
41
|
+
export type { SignedUnlockRecord, UnlockRecordContents, UnlockRecordProofState } from '../unlock/unlockRecord.js';
|
|
42
|
+
export { delegateLogWrite, delegationProofKeyId, RECOVERY_DELEGATION_TTL_MS, remintRecoveryDelegations, ZCAP_RENEWAL_WINDOW_MS, zcapExpiring } from './recoveryDelegation.js';
|
|
43
|
+
export type { RecoveryDelegationEntry } from './recoveryDelegation.js';
|
|
34
44
|
export { publishRecoveryKey, recoverWebvhClient, RecoveryKeyNotCommittedError, recoveryVmId, removeRecoveryKey } from './recoveryWebvh.js';
|
|
35
45
|
export type { RecoveryLogStore, RecoveryPublicKeys } from './recoveryWebvh.js';
|
|
36
46
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/recovery/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/recovery/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAiCG;AACH,OAAO,EACL,kBAAkB,EAClB,kBAAkB,EAClB,oBAAoB,EACpB,qBAAqB,EACrB,mBAAmB,EACnB,YAAY,EACZ,wBAAwB,EACxB,sBAAsB,EACvB,MAAM,mBAAmB,CAAA;AAC1B,YAAY,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAA;AAEvD,OAAO,EACL,oBAAoB,EACpB,wBAAwB,EACxB,kBAAkB,EAClB,mBAAmB,EACnB,kBAAkB,EAClB,gBAAgB,EACjB,MAAM,2BAA2B,CAAA;AAClC,YAAY,EACV,kBAAkB,EAClB,oBAAoB,EACpB,sBAAsB,EACvB,MAAM,2BAA2B,CAAA;AAElC,OAAO,EACL,gBAAgB,EAChB,oBAAoB,EACpB,0BAA0B,EAC1B,yBAAyB,EACzB,sBAAsB,EACtB,YAAY,EACb,MAAM,yBAAyB,CAAA;AAChC,YAAY,EAAE,uBAAuB,EAAE,MAAM,yBAAyB,CAAA;AAEtE,OAAO,EACL,kBAAkB,EAClB,kBAAkB,EAClB,4BAA4B,EAC5B,YAAY,EACZ,iBAAiB,EAClB,MAAM,oBAAoB,CAAA;AAC3B,YAAY,EAAE,gBAAgB,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAA"}
|
package/dist/recovery/index.js
CHANGED
|
@@ -12,22 +12,31 @@
|
|
|
12
12
|
* - `recoveryClientFromCode` -- the deterministic client key set:
|
|
13
13
|
* unlock identity, client seed (signing + key-agreement pair), and the
|
|
14
14
|
* single did:webvh update key whose hash stands pre-committed.
|
|
15
|
-
* -
|
|
16
|
-
*
|
|
17
|
-
*
|
|
18
|
-
*
|
|
19
|
-
*
|
|
20
|
-
*
|
|
21
|
-
*
|
|
22
|
-
* so a storage host can never redirect recovery at
|
|
15
|
+
* - The record codec lives in `@interop/wallet-core/unlock` now
|
|
16
|
+
* (`wrapUnlockRecord` / `unwrapUnlockRecord`, re-exported here): a
|
|
17
|
+
* recovery record is an unlock record with no ladder member -- the account
|
|
18
|
+
* pointer plus the pre-minted PUT-on-`did.jsonl` bridge delegation (never
|
|
19
|
+
* a seed, never a user key wrap), signed under the mixed-signer policy
|
|
20
|
+
* (the code's unlock key at issuance, an enrolled client's account key on
|
|
21
|
+
* a re-mint), with the account core authenticated by a MAC under a
|
|
22
|
+
* code-derived key, so a storage host can never redirect recovery at
|
|
23
|
+
* another account.
|
|
23
24
|
* - `publishRecoveryKey` / `removeRecoveryKey` / `recoverWebvhClient` -- the
|
|
24
|
-
* document half: issuance's split posture
|
|
25
|
+
* document half: issuance's split posture and revocation's removal (thin
|
|
26
|
+
* wrappers over the unlock subpath's merged posture core), and the
|
|
25
27
|
* self-enrolling recovery continuation.
|
|
28
|
+
* - `delegateLogWrite` / `delegationProofKeyId` /
|
|
29
|
+
* `remintRecoveryDelegations` -- the authorization bridge: the pre-minted
|
|
30
|
+
* PUT-on-`did.jsonl` delegation builder and the revocation cascade's
|
|
31
|
+
* re-mint of the delegations a document edit rotted, behind injected
|
|
32
|
+
* app seams (management-zcap client factory, storage URL, registry
|
|
33
|
+
* read/record).
|
|
26
34
|
*
|
|
27
35
|
* Kept out of the root export: this subpath pulls the webkms-client / ezcap /
|
|
28
36
|
* was-client dependency graph (the same isolation pattern as `./keyring`).
|
|
29
37
|
*/
|
|
30
38
|
export { decodeRecoveryCode, formatRecoveryCode, generateRecoveryCode, normalizeRecoveryCode, RECOVERY_CODE_BYTES, RECOVERY_KDF, RecoveryCodeInvalidError, recoveryClientFromCode } from './recoveryCode.js';
|
|
31
|
-
export {
|
|
39
|
+
export { computeUnlockBinding, remintUnlockRecordBridge, UnlockBindingError, unlockRecordBinding, unwrapUnlockRecord, wrapUnlockRecord } from '../unlock/unlockRecord.js';
|
|
40
|
+
export { delegateLogWrite, delegationProofKeyId, RECOVERY_DELEGATION_TTL_MS, remintRecoveryDelegations, ZCAP_RENEWAL_WINDOW_MS, zcapExpiring } from './recoveryDelegation.js';
|
|
32
41
|
export { publishRecoveryKey, recoverWebvhClient, RecoveryKeyNotCommittedError, recoveryVmId, removeRecoveryKey } from './recoveryWebvh.js';
|
|
33
42
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/recovery/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/recovery/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAiCG;AACH,OAAO,EACL,kBAAkB,EAClB,kBAAkB,EAClB,oBAAoB,EACpB,qBAAqB,EACrB,mBAAmB,EACnB,YAAY,EACZ,wBAAwB,EACxB,sBAAsB,EACvB,MAAM,mBAAmB,CAAA;AAG1B,OAAO,EACL,oBAAoB,EACpB,wBAAwB,EACxB,kBAAkB,EAClB,mBAAmB,EACnB,kBAAkB,EAClB,gBAAgB,EACjB,MAAM,2BAA2B,CAAA;AAOlC,OAAO,EACL,gBAAgB,EAChB,oBAAoB,EACpB,0BAA0B,EAC1B,yBAAyB,EACzB,sBAAsB,EACtB,YAAY,EACb,MAAM,yBAAyB,CAAA;AAGhC,OAAO,EACL,kBAAkB,EAClB,kBAAkB,EAClB,4BAA4B,EAC5B,YAAY,EACZ,iBAAiB,EAClB,MAAM,oBAAoB,CAAA"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import type { ProfileAgents } from '../identity/agents.js';
|
|
2
1
|
import type { UnlockKdf } from '../keyring/kdf.js';
|
|
2
|
+
import type { UnlockClientIdentity } from '../unlock/standingClient.js';
|
|
3
3
|
/**
|
|
4
4
|
* The byte length of a recovery code: 16 random bytes is ~128 bits, enough
|
|
5
5
|
* that the unlock derivation is a single expansion rather than a stretched
|
|
@@ -73,28 +73,16 @@ export declare function decodeRecoveryCode({ code }: {
|
|
|
73
73
|
* agents, and the public multibases / ids the issuance and recovery flows
|
|
74
74
|
* publish and look up.
|
|
75
75
|
*/
|
|
76
|
-
export interface RecoveryClient {
|
|
76
|
+
export interface RecoveryClient extends UnlockClientIdentity {
|
|
77
77
|
codeBytes: Uint8Array;
|
|
78
|
-
clientSeed: Uint8Array;
|
|
79
78
|
updateSeed: Uint8Array;
|
|
80
79
|
/**
|
|
81
|
-
* The symmetric key that MACs the recovery record's account binding
|
|
82
|
-
*
|
|
83
|
-
*
|
|
84
|
-
* storage host never holds it.
|
|
80
|
+
* The symmetric key that MACs the recovery record's account binding:
|
|
81
|
+
* computed at issuance, verified at recovery before the pointer is trusted.
|
|
82
|
+
* Derived from the code bytes, so the storage host never holds it.
|
|
85
83
|
*/
|
|
86
84
|
bindingMacKey: Uint8Array;
|
|
87
|
-
agents: ProfileAgents;
|
|
88
|
-
clientDid: string;
|
|
89
|
-
signingKeyMultibase: string;
|
|
90
|
-
keyAgreementKeyMultibase: string;
|
|
91
85
|
updateKeyMultibase: string;
|
|
92
|
-
/**
|
|
93
|
-
* The kid of the code's user-key-roster entry -- its key-agreement key's id
|
|
94
|
-
* exactly as `agentsFromSeed` derives it (`did:key:<ed>#<x>`), so the wrap
|
|
95
|
-
* minted at issuance is the one the recovery flow's roster read looks for.
|
|
96
|
-
*/
|
|
97
|
-
recipientKid: string;
|
|
98
86
|
}
|
|
99
87
|
/**
|
|
100
88
|
* Derives the code's whole client identity from a (possibly formatted) code.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"recoveryCode.d.ts","sourceRoot":"","sources":["../../src/recovery/recoveryCode.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"recoveryCode.d.ts","sourceRoot":"","sources":["../../src/recovery/recoveryCode.ts"],"names":[],"mappings":"AAsBA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAA;AAElD,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,6BAA6B,CAAA;AAGvE;;;;GAIG;AACH,eAAO,MAAM,mBAAmB,KAAK,CAAA;AAErC;;;;;;GAMG;AACH,eAAO,MAAM,YAAY,EAAE,SAM1B,CAAA;AAoBD;;;;;;GAMG;AACH,qBAAa,wBAAyB,SAAQ,KAAK;gBACrC,OAAO,SAAuC;CAI3D;AAED;;;;GAIG;AACH,wBAAgB,oBAAoB,IAAI,MAAM,CAI7C;AAED;;;;;;;;GAQG;AACH,wBAAgB,kBAAkB,CAAC,EAAE,IAAI,EAAE,EAAE;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,GAAG,MAAM,CAErE;AAED;;;;;;;GAOG;AACH,wBAAgB,qBAAqB,CAAC,EAAE,KAAK,EAAE,EAAE;IAAE,KAAK,EAAE,MAAM,CAAA;CAAE,GAAG,MAAM,CAE1E;AAED;;;;;;;GAOG;AACH,wBAAgB,kBAAkB,CAAC,EAAE,IAAI,EAAE,EAAE;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,GAAG,UAAU,CAazE;AAED;;;;;;;;GAQG;AACH,MAAM,WAAW,cAAe,SAAQ,oBAAoB;IAC1D,SAAS,EAAE,UAAU,CAAA;IACrB,UAAU,EAAE,UAAU,CAAA;IACtB;;;;OAIG;IACH,aAAa,EAAE,UAAU,CAAA;IACzB,kBAAkB,EAAE,MAAM,CAAA;CAC3B;AAED;;;;;;;;;GASG;AACH,wBAAsB,sBAAsB,CAAC,EAC3C,IAAI,EACL,EAAE;IACD,IAAI,EAAE,MAAM,CAAA;CACb,GAAG,OAAO,CAAC,cAAc,CAAC,CAgC1B"}
|
|
@@ -20,7 +20,7 @@
|
|
|
20
20
|
import { base58 } from '@scure/base';
|
|
21
21
|
import { hkdf } from '@noble/hashes/hkdf.js';
|
|
22
22
|
import { sha256 } from '@noble/hashes/sha2.js';
|
|
23
|
-
import {
|
|
23
|
+
import { unlockClientIdentityFromSeed } from '../unlock/standingClient.js';
|
|
24
24
|
import { updateKeyMultibase } from '../webvh/didWebvh.js';
|
|
25
25
|
/**
|
|
26
26
|
* The byte length of a recovery code: 16 random bytes is ~128 bits, enough
|
|
@@ -143,23 +143,13 @@ export async function recoveryClientFromCode({ code }) {
|
|
|
143
143
|
const clientSeed = hkdf(sha256, codeBytes, salt, new TextEncoder().encode(RECOVERY_CLIENT_SEED_INFO), 32);
|
|
144
144
|
const updateSeed = hkdf(sha256, codeBytes, salt, new TextEncoder().encode(RECOVERY_UPDATE_SEED_INFO), 32);
|
|
145
145
|
const bindingMacKey = hkdf(sha256, codeBytes, new TextEncoder().encode(RECOVERY_KDF.salt), new TextEncoder().encode(RECOVERY_BINDING_MAC_INFO), 32);
|
|
146
|
-
const
|
|
147
|
-
const { publicKeyMultibase: keyAgreementKeyMultibase } = agents.keyAgreementKey;
|
|
148
|
-
if (!keyAgreementKeyMultibase) {
|
|
149
|
-
throw new Error('The derived key-agreement key has no public multibase.');
|
|
150
|
-
}
|
|
151
|
-
const [, , signingKeyMultibase] = agents.keyAgent.id.split(':');
|
|
146
|
+
const identity = await unlockClientIdentityFromSeed({ clientSeed });
|
|
152
147
|
return {
|
|
148
|
+
...identity,
|
|
153
149
|
codeBytes,
|
|
154
|
-
clientSeed,
|
|
155
150
|
updateSeed,
|
|
156
151
|
bindingMacKey,
|
|
157
|
-
|
|
158
|
-
clientDid: agents.keyAgent.id,
|
|
159
|
-
signingKeyMultibase: signingKeyMultibase,
|
|
160
|
-
keyAgreementKeyMultibase,
|
|
161
|
-
updateKeyMultibase: await updateKeyMultibase({ seed: updateSeed }),
|
|
162
|
-
recipientKid: `${agents.keyAgent.id}#${keyAgreementKeyMultibase}`
|
|
152
|
+
updateKeyMultibase: await updateKeyMultibase({ seed: updateSeed })
|
|
163
153
|
};
|
|
164
154
|
}
|
|
165
155
|
//# sourceMappingURL=recoveryCode.js.map
|