@interop/wallet-core 0.23.1 → 0.25.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.
Files changed (125) hide show
  1. package/README.md +41 -22
  2. package/dist/clients/index.d.ts +6 -4
  3. package/dist/clients/index.d.ts.map +1 -1
  4. package/dist/clients/index.js +5 -3
  5. package/dist/clients/index.js.map +1 -1
  6. package/dist/clients/policy.d.ts +11 -3
  7. package/dist/clients/policy.d.ts.map +1 -1
  8. package/dist/clients/policy.js +12 -4
  9. package/dist/clients/policy.js.map +1 -1
  10. package/dist/clients/revocation.d.ts +24 -9
  11. package/dist/clients/revocation.d.ts.map +1 -1
  12. package/dist/clients/revocation.js +23 -10
  13. package/dist/clients/revocation.js.map +1 -1
  14. package/dist/clients/rosterPolicy.d.ts +23 -22
  15. package/dist/clients/rosterPolicy.d.ts.map +1 -1
  16. package/dist/clients/rosterPolicy.js +50 -31
  17. package/dist/clients/rosterPolicy.js.map +1 -1
  18. package/dist/descriptors/acquire.d.ts +4 -1
  19. package/dist/descriptors/acquire.d.ts.map +1 -1
  20. package/dist/descriptors/acquire.js +29 -1
  21. package/dist/descriptors/acquire.js.map +1 -1
  22. package/dist/descriptors/index.d.ts +9 -1
  23. package/dist/descriptors/index.d.ts.map +1 -1
  24. package/dist/descriptors/index.js +9 -1
  25. package/dist/descriptors/index.js.map +1 -1
  26. package/dist/descriptors/logSource.d.ts +33 -0
  27. package/dist/descriptors/logSource.d.ts.map +1 -0
  28. package/dist/descriptors/logSource.js +49 -0
  29. package/dist/descriptors/logSource.js.map +1 -0
  30. package/dist/enrollment/enrollment.d.ts +2 -2
  31. package/dist/enrollment/enrollment.d.ts.map +1 -1
  32. package/dist/enrollment/enrollment.js +15 -10
  33. package/dist/enrollment/enrollment.js.map +1 -1
  34. package/dist/index.d.ts +1 -1
  35. package/dist/index.js +1 -1
  36. package/dist/keys/index.d.ts +15 -8
  37. package/dist/keys/index.d.ts.map +1 -1
  38. package/dist/keys/index.js +14 -8
  39. package/dist/keys/index.js.map +1 -1
  40. package/dist/keys/rosterLogStore.d.ts +53 -0
  41. package/dist/keys/rosterLogStore.d.ts.map +1 -0
  42. package/dist/keys/rosterLogStore.js +134 -0
  43. package/dist/keys/rosterLogStore.js.map +1 -0
  44. package/dist/keys/rosterStore.d.ts +20 -6
  45. package/dist/keys/rosterStore.d.ts.map +1 -1
  46. package/dist/keys/rosterStore.js +36 -17
  47. package/dist/keys/rosterStore.js.map +1 -1
  48. package/dist/keys/userKeyCascade.d.ts +14 -7
  49. package/dist/keys/userKeyCascade.d.ts.map +1 -1
  50. package/dist/keys/userKeyCascade.js +12 -3
  51. package/dist/keys/userKeyCascade.js.map +1 -1
  52. package/dist/keys/userKeyRoster.d.ts +50 -97
  53. package/dist/keys/userKeyRoster.d.ts.map +1 -1
  54. package/dist/keys/userKeyRoster.js +44 -145
  55. package/dist/keys/userKeyRoster.js.map +1 -1
  56. package/dist/request/appKey.d.ts +255 -0
  57. package/dist/request/appKey.d.ts.map +1 -0
  58. package/dist/request/appKey.js +492 -0
  59. package/dist/request/appKey.js.map +1 -0
  60. package/dist/request/classify.d.ts +54 -3
  61. package/dist/request/classify.d.ts.map +1 -1
  62. package/dist/request/classify.js +106 -0
  63. package/dist/request/classify.js.map +1 -1
  64. package/dist/request/composeVp.d.ts +6 -7
  65. package/dist/request/composeVp.d.ts.map +1 -1
  66. package/dist/request/composeVp.js +44 -55
  67. package/dist/request/composeVp.js.map +1 -1
  68. package/dist/request/index.d.ts +4 -0
  69. package/dist/request/index.d.ts.map +1 -1
  70. package/dist/request/index.js +4 -0
  71. package/dist/request/index.js.map +1 -1
  72. package/dist/request/processRequest.d.ts +1 -4
  73. package/dist/request/processRequest.d.ts.map +1 -1
  74. package/dist/request/processRequest.js +17 -11
  75. package/dist/request/processRequest.js.map +1 -1
  76. package/dist/request/types.d.ts +45 -2
  77. package/dist/request/types.d.ts.map +1 -1
  78. package/dist/resourceLog/append.d.ts +103 -0
  79. package/dist/resourceLog/append.d.ts.map +1 -0
  80. package/dist/resourceLog/append.js +190 -0
  81. package/dist/resourceLog/append.js.map +1 -0
  82. package/dist/resourceLog/controller.d.ts +57 -0
  83. package/dist/resourceLog/controller.d.ts.map +1 -0
  84. package/dist/resourceLog/controller.js +81 -0
  85. package/dist/resourceLog/controller.js.map +1 -0
  86. package/dist/resourceLog/entry.d.ts +68 -0
  87. package/dist/resourceLog/entry.d.ts.map +1 -0
  88. package/dist/resourceLog/entry.js +167 -0
  89. package/dist/resourceLog/entry.js.map +1 -0
  90. package/dist/resourceLog/errors.d.ts +75 -0
  91. package/dist/resourceLog/errors.d.ts.map +1 -0
  92. package/dist/resourceLog/errors.js +76 -0
  93. package/dist/resourceLog/errors.js.map +1 -0
  94. package/dist/resourceLog/index.d.ts +26 -0
  95. package/dist/resourceLog/index.d.ts.map +1 -0
  96. package/dist/resourceLog/index.js +26 -0
  97. package/dist/resourceLog/index.js.map +1 -0
  98. package/dist/resourceLog/pin.d.ts +44 -0
  99. package/dist/resourceLog/pin.d.ts.map +1 -0
  100. package/dist/resourceLog/pin.js +32 -0
  101. package/dist/resourceLog/pin.js.map +1 -0
  102. package/dist/resourceLog/seal.d.ts +86 -0
  103. package/dist/resourceLog/seal.d.ts.map +1 -0
  104. package/dist/resourceLog/seal.js +99 -0
  105. package/dist/resourceLog/seal.js.map +1 -0
  106. package/dist/resourceLog/verify.d.ts +95 -0
  107. package/dist/resourceLog/verify.d.ts.map +1 -0
  108. package/dist/resourceLog/verify.js +435 -0
  109. package/dist/resourceLog/verify.js.map +1 -0
  110. package/dist/space/collections.d.ts +14 -11
  111. package/dist/space/collections.d.ts.map +1 -1
  112. package/dist/space/collections.js +14 -11
  113. package/dist/space/collections.js.map +1 -1
  114. package/dist/space/index.d.ts +2 -2
  115. package/dist/space/index.d.ts.map +1 -1
  116. package/dist/space/index.js +2 -2
  117. package/dist/space/index.js.map +1 -1
  118. package/dist/webvh/didWeb.d.ts +4 -6
  119. package/dist/webvh/didWeb.d.ts.map +1 -1
  120. package/dist/webvh/didWeb.js.map +1 -1
  121. package/dist/webvh/didWebvh.d.ts +1 -2
  122. package/dist/webvh/didWebvh.d.ts.map +1 -1
  123. package/dist/webvh/didWebvh.js +1 -6
  124. package/dist/webvh/didWebvh.js.map +1 -1
  125. package/package.json +11 -4
@@ -0,0 +1,255 @@
1
+ import type { IVerifiableCredential } from '@interop/data-integrity-core';
2
+ import { CONTEXT_URL_V1 as APP_CONNECT_CONTEXT_URL } from 'byoe-context';
3
+ import type { IAppConnectApp } from './types.js';
4
+ /**
5
+ * The key name mixed into seed derivation. Unlike the handle this is
6
+ * load-bearing: it is the HMAC message in `CapabilityAgent` derivation, so the
7
+ * exact string is a pinned input of the App Connect key-derivation rule --
8
+ * every existing app-key credential's identity depends on it.
9
+ */
10
+ export declare const APP_KEY_KEY_NAME = "app-key";
11
+ /**
12
+ * The marker type every app-key credential carries, mapped to one stable IRI
13
+ * for every application. It makes "presents as an app key" a term check rather
14
+ * than a shape heuristic, which is what the store-time refusal
15
+ * ({@link assertStorableAppKey}) and the match path key off.
16
+ *
17
+ * It is a self-declaration, not evidence: the `type` array of a planted
18
+ * credential is attacker-controlled like the rest of it. The seed-to-subject
19
+ * binding ({@link appKeySeedBindsSubject}) authenticates only a credential's
20
+ * internal consistency, never its provenance (a fully attacker-generated
21
+ * credential binds perfectly). That is exactly why external ingest refuses on
22
+ * the marker alone, binding or not ({@link assertStorableAppKey}): app keys
23
+ * are wallet-minted, never imported.
24
+ */
25
+ export declare const APP_KEY_CREDENTIAL_TYPE = "AppKeyCredential";
26
+ /**
27
+ * The fixed `type` array of every app-key credential: exactly two entries, in
28
+ * this order, identical for every application. Which application a credential
29
+ * belongs to is the `credentialSubject.appUrl` claim, not a type.
30
+ */
31
+ export declare const APP_KEY_TYPE_ARRAY: readonly string[];
32
+ /**
33
+ * The hosted App Connect context URL every app-key credential carries as the
34
+ * second entry of its `@context` array (after the VC 1.1 context URL). The
35
+ * context document defines the profile's BYOE terms; document loaders resolve
36
+ * it from the bundled `byoe-context` document, so no fetch happens at sign or
37
+ * verification time.
38
+ */
39
+ export { APP_CONNECT_CONTEXT_URL };
40
+ /**
41
+ * Whether a credential presents as an app key -- that is, carries the
42
+ * {@link APP_KEY_CREDENTIAL_TYPE} marker in its `type` array. Says nothing
43
+ * about whether it IS one; that is the seed-to-subject binding's job.
44
+ *
45
+ * @param credential {IVerifiableCredential}
46
+ * @returns {boolean}
47
+ */
48
+ export declare function presentsAsAppKey(credential: IVerifiableCredential): boolean;
49
+ /**
50
+ * The refusal a store path raises for a credential that presents as an app key
51
+ * but arrived from outside the wallet's own mint path. A distinct class so the
52
+ * UI can show its own translated wording rather than this message.
53
+ */
54
+ export declare class AppKeyRefusedError extends Error {
55
+ constructor();
56
+ }
57
+ /**
58
+ * Refuses any credential that presents as an app key, unconditionally --
59
+ * whether or not it binds to its own seed. Called on every path that puts a
60
+ * credential in the store from outside the wallet (a CHAPI store offer, a
61
+ * URL / QR / manual-paste import), so an externally arriving app key never
62
+ * reaches the store, the credential list, or the user's Space.
63
+ *
64
+ * The seed-to-subject binding ({@link appKeySeedBindsSubject}) authenticates
65
+ * only the credential's internal consistency, not its provenance: a fully
66
+ * attacker-generated credential binds perfectly (a fresh seed, the victim
67
+ * app's `origin` and `appUrl`, self-issued), and storing it would make its
68
+ * DID the controller the wallet delegates the user's storage to. So there is
69
+ * no "binds, so it stores" carve-out here: app-key credentials are
70
+ * wallet-minted, never imported, and only the wallet's own mint path may
71
+ * store one.
72
+ *
73
+ * A credential with no marker is left alone, so an ordinary credential that
74
+ * merely happens to carry a `seed` or `origin` claim is never caught.
75
+ *
76
+ * @param credential {IVerifiableCredential}
77
+ * @returns {void} throws the refusal reason
78
+ */
79
+ export declare function assertStorableAppKey(credential: IVerifiableCredential): void;
80
+ /**
81
+ * Whether an app-key credential's subject DID is the one its own seed derives
82
+ * -- the binding that makes the credential an app key rather than merely a
83
+ * self-issued claim to be one. Self-issuance is a weak signal (anyone can
84
+ * self-issue); this is the strong one, and it is fully local: the credential
85
+ * carries the seed, so re-derive with the same call `mintAppKeyCredential`
86
+ * uses and compare. Fails closed on an absent, non-base64url, or otherwise
87
+ * unusable seed rather than throwing out of the match path.
88
+ *
89
+ * @param credential {IVerifiableCredential}
90
+ * @returns {Promise<boolean>}
91
+ */
92
+ export declare function appKeySeedBindsSubject(credential: IVerifiableCredential): Promise<boolean>;
93
+ /**
94
+ * Raised by {@link assertMintedAppKey} when a credential offered to the mint
95
+ * path's store door does not carry the mint invariants. Reaching it means a
96
+ * caller tried to route a foreign credential through the wallet's own mint
97
+ * door -- a programming error, not a user-facing refusal, so it is not
98
+ * translated like {@link AppKeyRefusedError}.
99
+ */
100
+ export declare class AppKeyMintInvariantError extends Error {
101
+ constructor();
102
+ }
103
+ /**
104
+ * Asserts the mint invariants on a credential the wallet claims to have just
105
+ * minted: it presents as an app key (the marker type) and its subject DID
106
+ * re-derives from the seed it carries. The mirror image of
107
+ * {@link assertStorableAppKey} -- external ingest refuses every marker
108
+ * credential, the mint door stores only credentials that carry the full mint
109
+ * shape -- kept beside it so the two halves of the app-key store policy live
110
+ * in one module.
111
+ *
112
+ * @param credential {IVerifiableCredential}
113
+ * @returns {Promise<void>} throws {@link AppKeyMintInvariantError}
114
+ */
115
+ export declare function assertMintedAppKey(credential: IVerifiableCredential): Promise<void>;
116
+ /**
117
+ * The app-key candidates for an app + origin, latest-first: everything the
118
+ * cheap, synchronous predicates accept, so only plausible candidates pay for
119
+ * a key derivation. A candidate must carry the marker (required, not merely
120
+ * tolerated: a credential can then only reach the delegation path by carrying
121
+ * it, which is exactly what the store-time refusal screens), name the
122
+ * request's `appUrl` in `credentialSubject.appUrl` (both sides in serialized
123
+ * form -- the wallet mints the claim serialized, so the comparison is an
124
+ * exact string match), be self-issued, and be bound to the attested
125
+ * requesting origin. Sorting here (rather than after the binding check) lets
126
+ * {@link findAppKeyCredential} stop at the newest credential that binds.
127
+ *
128
+ * @param options {object}
129
+ * @param options.credentials {IVerifiableCredential[]}
130
+ * @param options.appUrl {string} - The request's `app.appUrl` in serialized
131
+ * form.
132
+ * @param options.origin {string} - The attested requesting origin.
133
+ * @returns {IVerifiableCredential[]}
134
+ */
135
+ export declare function appKeyCandidates({ credentials, appUrl, origin }: {
136
+ credentials: IVerifiableCredential[];
137
+ appUrl: string;
138
+ origin: string;
139
+ }): IVerifiableCredential[];
140
+ /**
141
+ * The current (latest) app-key credential for an app + origin, or undefined
142
+ * when the user has none -- which signals first run for that (origin,
143
+ * `appUrl`) pair.
144
+ *
145
+ * @param options {object}
146
+ * @param options.credentials {IVerifiableCredential[]}
147
+ * @param options.appUrl {string} - The request's `app.appUrl` in serialized
148
+ * form.
149
+ * @param options.origin {string} - The attested requesting origin.
150
+ * @returns {Promise<IVerifiableCredential | undefined>}
151
+ */
152
+ export declare function findAppKeyCredential({ credentials, appUrl, origin }: {
153
+ credentials: IVerifiableCredential[];
154
+ appUrl: string;
155
+ origin: string;
156
+ }): Promise<IVerifiableCredential | undefined>;
157
+ /**
158
+ * Mints a fresh app-key credential for an app + origin: generates a 32-byte
159
+ * seed, derives the seed's did:key, and self-issues the credential (issuer ==
160
+ * subject == the seed-derived DID) with the `credentialSubject.appUrl` claim
161
+ * set from the validated request value. Does NOT store the result -- the
162
+ * caller stores it before delegating, so a failed delegation is found as
163
+ * "returning" on the next attempt rather than minting a second identity.
164
+ *
165
+ * @param options {object}
166
+ * @param options.app {IAppConnectApp} - The validated app identity; its
167
+ * `appUrl` must already be in serialized form (`appConnectRequestOf`
168
+ * guarantees this).
169
+ * @param options.origin {string} - The attested requesting origin, never a
170
+ * value taken from the request body.
171
+ * @returns {Promise<{ credential: IVerifiableCredential; subjectDid: string }>}
172
+ */
173
+ export declare function mintAppKeyCredential({ app, origin }: {
174
+ app: IAppConnectApp;
175
+ origin: string;
176
+ }): Promise<{
177
+ credential: IVerifiableCredential;
178
+ subjectDid: string;
179
+ }>;
180
+ /**
181
+ * The latest legacy app-key credential for an origin, or undefined. A legacy
182
+ * credential predates the `appUrl` model: it carries the marker and a
183
+ * per-app third type entry, but no `credentialSubject.appUrl` claim. Its
184
+ * identity was scoped to (origin, `credentialType`), and the request no
185
+ * longer carries a `credentialType` to select on, so the mapping is
186
+ * recoverable only when it is unambiguous: when the binding legacy candidates
187
+ * for the origin all name one subject DID. Two distinct legacy identities on
188
+ * one origin yield undefined rather than a guess -- re-issuing the wrong one
189
+ * would hand one application another's identity, which is worse than the
190
+ * caller treating the connect as a first run.
191
+ *
192
+ * @param options {object}
193
+ * @param options.credentials {IVerifiableCredential[]}
194
+ * @param options.origin {string} - The attested requesting origin.
195
+ * @returns {Promise<IVerifiableCredential | undefined>}
196
+ */
197
+ export declare function findLegacyAppKeyCredential({ credentials, origin }: {
198
+ credentials: IVerifiableCredential[];
199
+ origin: string;
200
+ }): Promise<IVerifiableCredential | undefined>;
201
+ /**
202
+ * Re-issues a legacy app-key credential in place under the `appUrl` model:
203
+ * the same seed (so the same derived DID -- the app's identity and its
204
+ * encrypted-data access are preserved), the fixed two-entry type array, the
205
+ * hosted App Connect context URL, and the `credentialSubject.appUrl` claim set
206
+ * from the validated request value. A fresh mint would roll the seed and orphan
207
+ * the identity, and must never be the migration path. The fresh
208
+ * `issuanceDate` ranks the re-issued credential ahead of the legacy one, so
209
+ * subsequent connects match it directly.
210
+ *
211
+ * Does NOT store the result; the caller stores it through the mint door
212
+ * (it satisfies {@link assertMintedAppKey}) and may retire the legacy record.
213
+ *
214
+ * @param options {object}
215
+ * @param options.credential {IVerifiableCredential} - The legacy credential;
216
+ * it must bind per {@link appKeySeedBindsSubject} and be bound to `origin`,
217
+ * else this throws {@link AppKeyMintInvariantError}.
218
+ * @param options.app {IAppConnectApp} - The validated app identity; its
219
+ * `appUrl` must already be in serialized form.
220
+ * @param options.origin {string} - The attested requesting origin.
221
+ * @returns {Promise<{ credential: IVerifiableCredential; subjectDid: string }>}
222
+ */
223
+ export declare function reissueAppKeyCredential({ credential, app, origin }: {
224
+ credential: IVerifiableCredential;
225
+ app: IAppConnectApp;
226
+ origin: string;
227
+ }): Promise<{
228
+ credential: IVerifiableCredential;
229
+ subjectDid: string;
230
+ }>;
231
+ /**
232
+ * The subject DID (`credentialSubject.id`) of an app-key credential, or
233
+ * undefined. For a valid app-key credential this equals the issuer.
234
+ *
235
+ * @param credential {IVerifiableCredential}
236
+ * @returns {string | undefined}
237
+ */
238
+ export declare function appKeySubjectDid(credential: IVerifiableCredential): string | undefined;
239
+ /**
240
+ * The origin (`credentialSubject.origin`) an app-key credential is bound to,
241
+ * when present.
242
+ *
243
+ * @param credential {IVerifiableCredential}
244
+ * @returns {string | undefined}
245
+ */
246
+ export declare function appKeyOrigin(credential: IVerifiableCredential): string | undefined;
247
+ /**
248
+ * The application URL (`credentialSubject.appUrl`) an app-key credential is
249
+ * scoped to, when present. Absent on a legacy (pre-`appUrl`) credential.
250
+ *
251
+ * @param credential {IVerifiableCredential}
252
+ * @returns {string | undefined}
253
+ */
254
+ export declare function appKeyAppUrl(credential: IVerifiableCredential): string | undefined;
255
+ //# sourceMappingURL=appKey.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"appKey.d.ts","sourceRoot":"","sources":["../../src/request/appKey.ts"],"names":[],"mappings":"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"}