@interop/wallet-core 0.101.0 → 0.103.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 +35 -19
- package/dist/audiences/audienceGrant.d.ts +49 -0
- package/dist/audiences/audienceGrant.d.ts.map +1 -0
- package/dist/audiences/audienceGrant.js +46 -0
- package/dist/audiences/audienceGrant.js.map +1 -0
- package/dist/audiences/index.d.ts +10 -0
- package/dist/audiences/index.d.ts.map +1 -0
- package/dist/audiences/index.js +10 -0
- package/dist/audiences/index.js.map +1 -0
- package/dist/clientAnnex/gc.d.ts +107 -25
- package/dist/clientAnnex/gc.d.ts.map +1 -1
- package/dist/clientAnnex/gc.js +258 -89
- package/dist/clientAnnex/gc.js.map +1 -1
- package/dist/clientAnnex/grantRevocation.d.ts +0 -10
- package/dist/clientAnnex/grantRevocation.d.ts.map +1 -1
- package/dist/clientAnnex/grantRevocation.js +1 -23
- package/dist/clientAnnex/grantRevocation.js.map +1 -1
- package/dist/clientAnnex/heal.d.ts +32 -0
- package/dist/clientAnnex/heal.d.ts.map +1 -1
- package/dist/clientAnnex/heal.js +52 -50
- package/dist/clientAnnex/heal.js.map +1 -1
- package/dist/clientAnnex/index.d.ts +2 -2
- package/dist/clientAnnex/index.d.ts.map +1 -1
- package/dist/clientAnnex/index.js +2 -2
- package/dist/clientAnnex/index.js.map +1 -1
- package/dist/clientAnnex/log.d.ts +20 -2
- package/dist/clientAnnex/log.d.ts.map +1 -1
- package/dist/clientAnnex/log.js +30 -4
- package/dist/clientAnnex/log.js.map +1 -1
- package/dist/clients/rosterPolicy.d.ts.map +1 -1
- package/dist/clients/rosterPolicy.js +3 -1
- package/dist/clients/rosterPolicy.js.map +1 -1
- package/dist/connections/didKey.d.ts +27 -0
- package/dist/connections/didKey.d.ts.map +1 -1
- package/dist/connections/didKey.js +42 -6
- package/dist/connections/didKey.js.map +1 -1
- package/dist/connections/entry.d.ts +95 -13
- package/dist/connections/entry.d.ts.map +1 -1
- package/dist/connections/entry.js +102 -16
- package/dist/connections/entry.js.map +1 -1
- package/dist/connections/grants.d.ts +225 -3
- package/dist/connections/grants.d.ts.map +1 -1
- package/dist/connections/grants.js +293 -8
- package/dist/connections/grants.js.map +1 -1
- package/dist/connections/index.d.ts +15 -8
- package/dist/connections/index.d.ts.map +1 -1
- package/dist/connections/index.js +13 -6
- package/dist/connections/index.js.map +1 -1
- package/dist/connections/read.d.ts.map +1 -1
- package/dist/connections/read.js +2 -1
- package/dist/connections/read.js.map +1 -1
- package/dist/connections/resourceId.d.ts +33 -0
- package/dist/connections/resourceId.d.ts.map +1 -1
- package/dist/connections/resourceId.js +88 -8
- package/dist/connections/resourceId.js.map +1 -1
- package/dist/connections/upsert.d.ts +219 -7
- package/dist/connections/upsert.d.ts.map +1 -1
- package/dist/connections/upsert.js +628 -41
- package/dist/connections/upsert.js.map +1 -1
- package/dist/connections/writers.js +2 -1
- package/dist/connections/writers.js.map +1 -1
- package/dist/descriptors/index.d.ts +5 -0
- package/dist/descriptors/index.d.ts.map +1 -1
- package/dist/descriptors/index.js +5 -0
- package/dist/descriptors/index.js.map +1 -1
- package/dist/descriptors/logSource.d.ts +9 -4
- package/dist/descriptors/logSource.d.ts.map +1 -1
- package/dist/descriptors/logSource.js +13 -6
- package/dist/descriptors/logSource.js.map +1 -1
- package/dist/jsonObject.d.ts +16 -0
- package/dist/jsonObject.d.ts.map +1 -0
- package/dist/jsonObject.js +18 -0
- package/dist/jsonObject.js.map +1 -0
- package/dist/keys/index.d.ts +13 -9
- package/dist/keys/index.d.ts.map +1 -1
- package/dist/keys/index.js +11 -7
- package/dist/keys/index.js.map +1 -1
- package/dist/keys/userKeyCascade.d.ts +46 -0
- package/dist/keys/userKeyCascade.d.ts.map +1 -1
- package/dist/keys/userKeyCascade.js +153 -65
- package/dist/keys/userKeyCascade.js.map +1 -1
- package/dist/keys/userKeyRoster.d.ts +60 -7
- package/dist/keys/userKeyRoster.d.ts.map +1 -1
- package/dist/keys/userKeyRoster.js +165 -47
- package/dist/keys/userKeyRoster.js.map +1 -1
- package/dist/keys/userKeyRosterCascade.d.ts.map +1 -1
- package/dist/keys/userKeyRosterCascade.js +1 -0
- package/dist/keys/userKeyRosterCascade.js.map +1 -1
- package/dist/menders/ids.d.ts +1 -1
- package/dist/menders/ids.d.ts.map +1 -1
- package/dist/menders/ids.js +20 -4
- package/dist/menders/ids.js.map +1 -1
- package/dist/space/collections.d.ts +26 -6
- package/dist/space/collections.d.ts.map +1 -1
- package/dist/space/collections.js +31 -7
- package/dist/space/collections.js.map +1 -1
- package/dist/space/inboxMessage.d.ts +47 -0
- package/dist/space/inboxMessage.d.ts.map +1 -0
- package/dist/space/inboxMessage.js +86 -0
- package/dist/space/inboxMessage.js.map +1 -0
- package/dist/space/index.d.ts +7 -2
- package/dist/space/index.d.ts.map +1 -1
- package/dist/space/index.js +6 -2
- package/dist/space/index.js.map +1 -1
- package/dist/sync/contactsConflict.d.ts +23 -10
- package/dist/sync/contactsConflict.d.ts.map +1 -1
- package/dist/sync/contactsConflict.js +40 -21
- package/dist/sync/contactsConflict.js.map +1 -1
- package/dist/sync/index.d.ts +2 -2
- package/dist/sync/index.js +2 -2
- package/dist/webvh/didWebProjection.d.ts +38 -5
- package/dist/webvh/didWebProjection.d.ts.map +1 -1
- package/dist/webvh/didWebProjection.js +35 -22
- package/dist/webvh/didWebProjection.js.map +1 -1
- package/dist/webvh/index.d.ts +4 -3
- package/dist/webvh/index.d.ts.map +1 -1
- package/dist/webvh/index.js +4 -3
- package/dist/webvh/index.js.map +1 -1
- package/dist/webvh/standingZcap.d.ts +19 -2
- package/dist/webvh/standingZcap.d.ts.map +1 -1
- package/dist/webvh/standingZcap.js +31 -3
- package/dist/webvh/standingZcap.js.map +1 -1
- package/package.json +12 -6
|
@@ -1,8 +1,108 @@
|
|
|
1
1
|
import { addRecipient, epochKeyIdFor, hasKeyEpochs, replaceRecipient, trustRosterDidKeys } from '@interop/was-client/edv/core';
|
|
2
2
|
import { isSealableDescriptorStore } from './rosterLogStore.js';
|
|
3
|
-
import { currentEpochOf } from './userKeyRoster.js';
|
|
3
|
+
import { currentEpochOf, UserKeyRosterIntegrityError } from './userKeyRoster.js';
|
|
4
4
|
import { userKeyVaultKeys } from './userKey.js';
|
|
5
5
|
import { unwrapUserKeyGenerations, userKeyAsRecipient } from './userKeyGenerations.js';
|
|
6
|
+
/**
|
|
7
|
+
* Whether ONE encrypted collection's epoch roster is on the current user key:
|
|
8
|
+
* the decide-half of {@link rotateCollectionEpochsToUserKey}, extracted so the
|
|
9
|
+
* cascade and any auditor of the collection-epochs-name-the-current-user-key
|
|
10
|
+
* invariant apply one rule. Pure: it reads the descriptor and the generation
|
|
11
|
+
* ids alone, holds no key material, and writes nothing.
|
|
12
|
+
*
|
|
13
|
+
* The verdicts, tested in this order:
|
|
14
|
+
*
|
|
15
|
+
* - `unresolved-current-epoch` -- the descriptor carries no key epochs, or its
|
|
16
|
+
* `currentEpoch` names no epoch in its own list. The cascade refuses both
|
|
17
|
+
* fail-closed; an auditor attributes the state to the invariant that owns
|
|
18
|
+
* it (that every encrypted collection carries an epoch roster).
|
|
19
|
+
* - `stale-current-epoch` -- the current epoch names a superseded user key
|
|
20
|
+
* generation: the cascade's rotate branch.
|
|
21
|
+
* - `current-key-missing` -- the current epoch names neither the current
|
|
22
|
+
* generation nor a superseded one: a roster this cascade cannot heal.
|
|
23
|
+
* - `escrow-incomplete` -- the current epoch is on the current user key, but
|
|
24
|
+
* some epoch in the history lacks its wrap: the cascade's escrow branch.
|
|
25
|
+
* - `current` -- the current epoch names the current generation and no
|
|
26
|
+
* superseded one, and every epoch carries the current generation's wrap. The
|
|
27
|
+
* cascade's no-op branch, and nothing else, follows from it.
|
|
28
|
+
*
|
|
29
|
+
* The kids compared are `epochKeyIdFor`'s over the generation ids, as the
|
|
30
|
+
* cascade builds them.
|
|
31
|
+
*
|
|
32
|
+
* @param options {object}
|
|
33
|
+
* @param options.descriptor {CollectionEncryption} the collection's
|
|
34
|
+
* descriptor
|
|
35
|
+
* @param options.currentGeneration {string} the roster's current epoch id
|
|
36
|
+
* (the current user key's id)
|
|
37
|
+
* @param options.generations {string[]} every user key generation id the
|
|
38
|
+
* roster carries, the current one included
|
|
39
|
+
* @returns {CollectionEpochsVerdict}
|
|
40
|
+
*/
|
|
41
|
+
export function collectionEpochsCurrent(options) {
|
|
42
|
+
return readCollectionEpochs(options).verdict;
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* The one rule {@link collectionEpochsCurrent} and the cascade share, with
|
|
46
|
+
* each verdict's payload (see {@link CollectionEpochsReading}).
|
|
47
|
+
*
|
|
48
|
+
* @param options {object}
|
|
49
|
+
* @param options.descriptor {CollectionEncryption}
|
|
50
|
+
* @param options.currentGeneration {string}
|
|
51
|
+
* @param options.generations {string[]}
|
|
52
|
+
* @returns {CollectionEpochsReading}
|
|
53
|
+
*/
|
|
54
|
+
function readCollectionEpochs({ descriptor, currentGeneration, generations }) {
|
|
55
|
+
if (!hasKeyEpochs(descriptor)) {
|
|
56
|
+
return {
|
|
57
|
+
verdict: 'unresolved-current-epoch',
|
|
58
|
+
refusal: new Error('The collection descriptor carries no key epochs. Every encrypted ' +
|
|
59
|
+
'collection installs its epoch[0] at provision time, so an ' +
|
|
60
|
+
'epoch-less descriptor can only come from a tampering or ' +
|
|
61
|
+
'pre-provisioning host; refusing to rotate it.')
|
|
62
|
+
};
|
|
63
|
+
}
|
|
64
|
+
let currentEpoch;
|
|
65
|
+
try {
|
|
66
|
+
currentEpoch = currentEpochOf({
|
|
67
|
+
descriptor,
|
|
68
|
+
label: 'The collection descriptor'
|
|
69
|
+
});
|
|
70
|
+
}
|
|
71
|
+
catch (err) {
|
|
72
|
+
if (err instanceof UserKeyRosterIntegrityError) {
|
|
73
|
+
return { verdict: 'unresolved-current-epoch', refusal: err };
|
|
74
|
+
}
|
|
75
|
+
throw err;
|
|
76
|
+
}
|
|
77
|
+
const currentKids = new Set(currentEpoch.recipients.map(entry => entry.header.kid));
|
|
78
|
+
const userKeyKid = epochKeyIdFor(currentGeneration);
|
|
79
|
+
const keyed = generations.map(id => ({ id, kid: epochKeyIdFor(id) }));
|
|
80
|
+
const staleNamed = keyed.filter(generation => generation.id !== currentGeneration && currentKids.has(generation.kid));
|
|
81
|
+
if (staleNamed.length > 0) {
|
|
82
|
+
// The escrow owner: the newest stale generation still named by the
|
|
83
|
+
// current epoch, which the cascade invariant escrowed into every prior
|
|
84
|
+
// epoch -- so it unwraps the whole history for the fresh user key's
|
|
85
|
+
// escrow.
|
|
86
|
+
return {
|
|
87
|
+
verdict: 'stale-current-epoch',
|
|
88
|
+
staleKids: staleNamed.map(generation => generation.kid),
|
|
89
|
+
ownerGenerationId: staleNamed[staleNamed.length - 1].id
|
|
90
|
+
};
|
|
91
|
+
}
|
|
92
|
+
if (!currentKids.has(userKeyKid)) {
|
|
93
|
+
return { verdict: 'current-key-missing' };
|
|
94
|
+
}
|
|
95
|
+
const incomplete = (descriptor.epochs ?? []).filter(epoch => !epoch.recipients.some(entry => entry.header.kid === userKeyKid));
|
|
96
|
+
if (incomplete.length === 0) {
|
|
97
|
+
return { verdict: 'current' };
|
|
98
|
+
}
|
|
99
|
+
// The escrow owner must unwrap exactly the incomplete epochs: the newest
|
|
100
|
+
// generation named by every one of them.
|
|
101
|
+
const escrowOwner = [...keyed]
|
|
102
|
+
.reverse()
|
|
103
|
+
.find(generation => incomplete.every(epoch => epoch.recipients.some(entry => entry.header.kid === generation.kid)));
|
|
104
|
+
return { verdict: 'escrow-incomplete', escrowOwnerId: escrowOwner?.id };
|
|
105
|
+
}
|
|
6
106
|
/**
|
|
7
107
|
* Brings ONE encrypted collection's epoch roster onto the current user key --
|
|
8
108
|
* the per-collection op of the revocation cascade and of the completion sweep:
|
|
@@ -50,78 +150,66 @@ export async function rotateCollectionEpochsToUserKey({ store, userKey, generati
|
|
|
50
150
|
return 'noop';
|
|
51
151
|
}
|
|
52
152
|
const descriptor = current.descriptor;
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
'epoch-less descriptor can only come from a tampering or ' +
|
|
58
|
-
'pre-provisioning host; refusing to rotate it.');
|
|
59
|
-
}
|
|
60
|
-
const currentEpoch = currentEpochOf({
|
|
153
|
+
// The decision is the reading's: this cascade dispatches on its verdict and
|
|
154
|
+
// acts on its payload alone, so it and any auditor of the collection cannot
|
|
155
|
+
// disagree.
|
|
156
|
+
const reading = readCollectionEpochs({
|
|
61
157
|
descriptor,
|
|
62
|
-
|
|
158
|
+
currentGeneration: userKey.id,
|
|
159
|
+
generations: generations.map(generation => generation.id)
|
|
63
160
|
});
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
if (staleKids.length === 0) {
|
|
70
|
-
const escrowComplete = (descriptor.epochs ?? []).every(epoch => epoch.recipients.some(entry => entry.header.kid === userKeyKid));
|
|
71
|
-
if (currentKids.has(userKeyKid) && escrowComplete) {
|
|
161
|
+
switch (reading.verdict) {
|
|
162
|
+
case 'unresolved-current-epoch': {
|
|
163
|
+
throw reading.refusal;
|
|
164
|
+
}
|
|
165
|
+
case 'current': {
|
|
72
166
|
if (isSealableDescriptorStore(store)) {
|
|
73
167
|
return (await store.seal()) === 'sealed' ? 'sealed' : 'noop';
|
|
74
168
|
}
|
|
75
169
|
return 'noop';
|
|
76
170
|
}
|
|
171
|
+
case 'stale-current-epoch': {
|
|
172
|
+
const ownerGeneration = generations.find(generation => generation.id === reading.ownerGenerationId);
|
|
173
|
+
const owner = userKeyVaultKeys({ userKey: ownerGeneration });
|
|
174
|
+
await replaceRecipient({
|
|
175
|
+
store,
|
|
176
|
+
retire: reading.staleKids,
|
|
177
|
+
recipient: userKeyAsRecipient({ userKey }),
|
|
178
|
+
owner: { keyAgreementKey: owner.keyAgreementKey },
|
|
179
|
+
resolveRecipientKey: isSealableDescriptorStore(store)
|
|
180
|
+
? trustRosterDidKeys
|
|
181
|
+
: vouchNoSurvivor,
|
|
182
|
+
pull: async () => { }
|
|
183
|
+
});
|
|
184
|
+
return 'rotated';
|
|
185
|
+
}
|
|
186
|
+
case 'current-key-missing': {
|
|
187
|
+
// No stale generation to retire, but the current user key is not a
|
|
188
|
+
// recipient at all: this collection's roster is not user-key-owned in a
|
|
189
|
+
// shape this cascade can heal -- surface it rather than silently minting
|
|
190
|
+
// an epoch whose history the account cannot read.
|
|
191
|
+
throw new Error('The collection current epoch names no user key generation this ' +
|
|
192
|
+
'client can recognize; its roster cannot be rotated to the current ' +
|
|
193
|
+
'user key.');
|
|
194
|
+
}
|
|
195
|
+
case 'escrow-incomplete': {
|
|
196
|
+
// Escrow completion only: the current epoch is already on the current
|
|
197
|
+
// user key, but some historical epoch is missing its wrap.
|
|
198
|
+
const escrowOwner = generations.find(generation => generation.id === reading.escrowOwnerId);
|
|
199
|
+
if (!escrowOwner) {
|
|
200
|
+
throw new Error("The current user key cannot be escrowed into this collection's " +
|
|
201
|
+
'history: no held user key generation is a recipient of every ' +
|
|
202
|
+
'incomplete epoch.');
|
|
203
|
+
}
|
|
204
|
+
const owner = userKeyVaultKeys({ userKey: escrowOwner });
|
|
205
|
+
await addRecipient({
|
|
206
|
+
store,
|
|
207
|
+
recipient: userKeyAsRecipient({ userKey }),
|
|
208
|
+
owner: { keyAgreementKey: owner.keyAgreementKey }
|
|
209
|
+
});
|
|
210
|
+
return 'escrowed';
|
|
211
|
+
}
|
|
77
212
|
}
|
|
78
|
-
if (staleKids.length > 0) {
|
|
79
|
-
// The escrow owner: the newest stale generation still named by the
|
|
80
|
-
// current epoch, which the cascade invariant escrowed into every prior
|
|
81
|
-
// epoch -- so it unwraps the whole history for the fresh user key's escrow.
|
|
82
|
-
const ownerGeneration = [...staleGenerations]
|
|
83
|
-
.reverse()
|
|
84
|
-
.find(generation => currentKids.has(epochKeyIdFor(generation.id)));
|
|
85
|
-
const owner = userKeyVaultKeys({ userKey: ownerGeneration });
|
|
86
|
-
await replaceRecipient({
|
|
87
|
-
store,
|
|
88
|
-
retire: staleKids,
|
|
89
|
-
recipient: userKeyAsRecipient({ userKey }),
|
|
90
|
-
owner: { keyAgreementKey: owner.keyAgreementKey },
|
|
91
|
-
resolveRecipientKey: isSealableDescriptorStore(store)
|
|
92
|
-
? trustRosterDidKeys
|
|
93
|
-
: vouchNoSurvivor,
|
|
94
|
-
pull: async () => { }
|
|
95
|
-
});
|
|
96
|
-
return 'rotated';
|
|
97
|
-
}
|
|
98
|
-
if (!currentKids.has(userKeyKid)) {
|
|
99
|
-
// No stale generation to retire, but the current user key is not a recipient
|
|
100
|
-
// at all: this collection's roster is not user-key-owned in a shape this
|
|
101
|
-
// cascade can heal -- surface it rather than silently minting an epoch
|
|
102
|
-
// whose history the account cannot read.
|
|
103
|
-
throw new Error('The collection current epoch names no user key generation this client ' +
|
|
104
|
-
'can recognize; its roster cannot be rotated to the current user key.');
|
|
105
|
-
}
|
|
106
|
-
// Escrow completion only: the current epoch is already on the current user key,
|
|
107
|
-
// but some historical epoch is missing its wrap. The owner must unwrap
|
|
108
|
-
// exactly those epochs -- the newest generation named by every incomplete
|
|
109
|
-
// epoch.
|
|
110
|
-
const incomplete = (descriptor.epochs ?? []).filter(epoch => !epoch.recipients.some(entry => entry.header.kid === userKeyKid));
|
|
111
|
-
const escrowOwner = [...generations]
|
|
112
|
-
.reverse()
|
|
113
|
-
.find(generation => incomplete.every(epoch => epoch.recipients.some(entry => entry.header.kid === epochKeyIdFor(generation.id))));
|
|
114
|
-
if (!escrowOwner) {
|
|
115
|
-
throw new Error("The current user key cannot be escrowed into this collection's history: " +
|
|
116
|
-
'no held user key generation is a recipient of every incomplete epoch.');
|
|
117
|
-
}
|
|
118
|
-
const owner = userKeyVaultKeys({ userKey: escrowOwner });
|
|
119
|
-
await addRecipient({
|
|
120
|
-
store,
|
|
121
|
-
recipient: userKeyAsRecipient({ userKey }),
|
|
122
|
-
owner: { keyAgreementKey: owner.keyAgreementKey }
|
|
123
|
-
});
|
|
124
|
-
return 'escrowed';
|
|
125
213
|
}
|
|
126
214
|
/**
|
|
127
215
|
* The survivor resolver for a store whose roster is not authenticated: it
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"userKeyCascade.js","sourceRoot":"","sources":["../../src/keys/userKeyCascade.ts"],"names":[],"mappings":"AAqCA,OAAO,EACL,YAAY,EACZ,aAAa,EACb,YAAY,EACZ,gBAAgB,EAChB,kBAAkB,EAGnB,MAAM,8BAA8B,CAAA;AAErC,OAAO,EAAE,yBAAyB,EAAE,MAAM,qBAAqB,CAAA;AAC/D,OAAO,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAA;
|
|
1
|
+
{"version":3,"file":"userKeyCascade.js","sourceRoot":"","sources":["../../src/keys/userKeyCascade.ts"],"names":[],"mappings":"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"}
|
|
@@ -369,6 +369,55 @@ export declare function rosterRecipientsToRetire({ descriptor, keepRecipientIds
|
|
|
369
369
|
export declare function enrolledClientRosterRecipients({ document }: {
|
|
370
370
|
document: KeyAgreementDocument;
|
|
371
371
|
}): RecipientPublicKey[];
|
|
372
|
+
/**
|
|
373
|
+
* What the user key roster's current epoch and the account document disagree
|
|
374
|
+
* on, read from the two alone: the decide-half of
|
|
375
|
+
* {@link convergeUserKeyRosterToDocument}, extracted so the converger and any
|
|
376
|
+
* auditor of the roster-wraps-exactly-the-document-key-set invariant apply one
|
|
377
|
+
* rule. Pure: no I/O, no key material, no write.
|
|
378
|
+
*
|
|
379
|
+
* - `staleRecipientIds` -- the current epoch's kids no document verification
|
|
380
|
+
* method backs ({@link userKeyRosterRecipientResolver}'s rule): the retire
|
|
381
|
+
* direction's input.
|
|
382
|
+
* - `unwrappedClientRecipients` -- the enrolled clients the document keys that
|
|
383
|
+
* hold no wrap in the current epoch
|
|
384
|
+
* ({@link enrolledClientRosterRecipients}, less the wrapped kids): the
|
|
385
|
+
* escrow direction's input, as the recipients to escrow.
|
|
386
|
+
* - `unwrappedCredentialMethodIds` -- the credential-class `keyAgreement`
|
|
387
|
+
* method ids (`credentialKeyAgreementMethods`) no current-epoch wrap
|
|
388
|
+
* answers for: a verbatim method whose `publicKeyMultibase` no wrapped kid
|
|
389
|
+
* names, or a `MultikeyCommitment` that commits to no wrapped kid's key. The
|
|
390
|
+
* converger never acts on this member (a credential's roster kid is not
|
|
391
|
+
* rebuildable from the document, so the ceremony holding the credential
|
|
392
|
+
* mends its wrap), but an auditor reads it, and the one predicate reports
|
|
393
|
+
* every direction of the drift.
|
|
394
|
+
*
|
|
395
|
+
* A healthy roster reads as three empty lists.
|
|
396
|
+
*
|
|
397
|
+
* @param options {object}
|
|
398
|
+
* @param options.descriptor {CollectionEncryption} the roster descriptor
|
|
399
|
+
* @param options.document {KeyAgreementDocument} the locally verified
|
|
400
|
+
* did:webvh document
|
|
401
|
+
* @param options.did {string} the account DID the document resolves to,
|
|
402
|
+
* which tells a credential-class method from an enrolled client's
|
|
403
|
+
* @returns {UserKeyRosterDrift}
|
|
404
|
+
* @throws {UserKeyRosterIntegrityError} the descriptor's `currentEpoch`
|
|
405
|
+
* names no epoch in its own list
|
|
406
|
+
*/
|
|
407
|
+
export declare function userKeyRosterDrift({ descriptor, document, did }: {
|
|
408
|
+
descriptor: CollectionEncryption;
|
|
409
|
+
document: KeyAgreementDocument;
|
|
410
|
+
did: string;
|
|
411
|
+
}): UserKeyRosterDrift;
|
|
412
|
+
/**
|
|
413
|
+
* {@link userKeyRosterDrift}'s result: the three directions the roster's
|
|
414
|
+
* current epoch can disagree with the account document in.
|
|
415
|
+
*/
|
|
416
|
+
export interface UserKeyRosterDrift {
|
|
417
|
+
staleRecipientIds: string[];
|
|
418
|
+
unwrappedClientRecipients: RecipientPublicKey[];
|
|
419
|
+
unwrappedCredentialMethodIds: string[];
|
|
420
|
+
}
|
|
372
421
|
/**
|
|
373
422
|
* Converges the roster onto the account document: the standing detector for a
|
|
374
423
|
* revocation cascade torn between its two halves. The cascade edits the
|
|
@@ -377,12 +426,13 @@ export declare function enrolledClientRosterRecipients({ document }: {
|
|
|
377
426
|
* recipient the document no longer keys -- durable, silent, and permanent,
|
|
378
427
|
* since the revoked client's document edit will never be re-run.
|
|
379
428
|
*
|
|
380
|
-
* The detection is pure durable state
|
|
381
|
-
* document-backed resolver cannot answer
|
|
382
|
-
* document no longer keys, so a healthy account
|
|
383
|
-
* writes nothing. When any such recipient is found
|
|
384
|
-
* from ALL of them at once, because the resolver
|
|
385
|
-
* from the fresh epoch, not just the one named as
|
|
429
|
+
* The detection is pure durable state, and it is {@link userKeyRosterDrift}'s
|
|
430
|
+
* alone: a current-epoch recipient the document-backed resolver cannot answer
|
|
431
|
+
* for is exactly a recipient the document no longer keys, so a healthy account
|
|
432
|
+
* reads the descriptor and writes nothing. When any such recipient is found
|
|
433
|
+
* the roster is rotated away from ALL of them at once, because the resolver
|
|
434
|
+
* drops every unbacked entry from the fresh epoch, not just the one named as
|
|
435
|
+
* retiring.
|
|
386
436
|
*
|
|
387
437
|
* The convergence runs in TWO directions, in one append. The retire direction
|
|
388
438
|
* is above. The escrow direction is its mirror: an enrolled client the
|
|
@@ -421,6 +471,8 @@ export declare function enrolledClientRosterRecipients({ document }: {
|
|
|
421
471
|
* store
|
|
422
472
|
* @param options.document {KeyAgreementDocument} the locally verified
|
|
423
473
|
* did:webvh document -- the recipient source of record
|
|
474
|
+
* @param options.did {string} the account DID the document resolves to
|
|
475
|
+
* (the drift predicate's credential-class reading takes it)
|
|
424
476
|
* @param [options.descriptor] {CollectionEncryption} a descriptor the caller
|
|
425
477
|
* has just read (a login-time roster read), to save a re-read; omitted, the
|
|
426
478
|
* roster is read fresh
|
|
@@ -435,9 +487,10 @@ export declare function enrolledClientRosterRecipients({ document }: {
|
|
|
435
487
|
* stale recipient kids found, the kids escrowed, and the roster descriptor
|
|
436
488
|
* as it now stands (`null` when the account has no roster yet)
|
|
437
489
|
*/
|
|
438
|
-
export declare function convergeUserKeyRosterToDocument({ store, document, descriptor, etag, ownerKeyAgreementKey }: {
|
|
490
|
+
export declare function convergeUserKeyRosterToDocument({ store, document, did, descriptor, etag, ownerKeyAgreementKey }: {
|
|
439
491
|
store: EncryptionDescriptorStore;
|
|
440
492
|
document: KeyAgreementDocument;
|
|
493
|
+
did: string;
|
|
441
494
|
descriptor?: CollectionEncryption;
|
|
442
495
|
etag?: string;
|
|
443
496
|
ownerKeyAgreementKey?: IKeyAgreementKey;
|
|
@@ -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,EACV,oBAAoB,EACpB,yBAAyB,EAC1B,MAAM,qBAAqB,CAAA;AAC5B,OAAO,EAOL,KAAK,yBAAyB,EAC9B,KAAK,kBAAkB,EACxB,MAAM,8BAA8B,CAAA;AACrC,OAAO,EAAgB,KAAK,iBAAiB,EAAE,MAAM,0BAA0B,CAAA;
|
|
1
|
+
{"version":3,"file":"userKeyRoster.d.ts","sourceRoot":"","sources":["../../src/keys/userKeyRoster.ts"],"names":[],"mappings":"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"}
|