@interop/did-cli 0.9.0 → 0.10.1

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 (117) hide show
  1. package/CHANGELOG.md +149 -0
  2. package/README.md +192 -4
  3. package/dist/commands/collection-command.d.ts +169 -0
  4. package/dist/commands/collection-command.d.ts.map +1 -0
  5. package/dist/commands/collection-command.js +241 -0
  6. package/dist/commands/collection-command.js.map +1 -0
  7. package/dist/commands/did/create.d.ts +63 -0
  8. package/dist/commands/did/create.d.ts.map +1 -0
  9. package/dist/commands/did/create.js +625 -0
  10. package/dist/commands/did/create.js.map +1 -0
  11. package/dist/commands/did/manage.d.ts +68 -0
  12. package/dist/commands/did/manage.d.ts.map +1 -0
  13. package/dist/commands/did/manage.js +287 -0
  14. package/dist/commands/did/manage.js.map +1 -0
  15. package/dist/commands/did/service.d.ts +93 -0
  16. package/dist/commands/did/service.d.ts.map +1 -0
  17. package/dist/commands/did/service.js +324 -0
  18. package/dist/commands/did/service.js.map +1 -0
  19. package/dist/commands/did/webvh-update.d.ts +170 -0
  20. package/dist/commands/did/webvh-update.d.ts.map +1 -0
  21. package/dist/commands/did/webvh-update.js +402 -0
  22. package/dist/commands/did/webvh-update.js.map +1 -0
  23. package/dist/commands/did.d.ts +9 -0
  24. package/dist/commands/did.d.ts.map +1 -1
  25. package/dist/commands/did.js +107 -597
  26. package/dist/commands/did.js.map +1 -1
  27. package/dist/commands/edv.d.ts +15 -6
  28. package/dist/commands/edv.d.ts.map +1 -1
  29. package/dist/commands/edv.js +38 -28
  30. package/dist/commands/edv.js.map +1 -1
  31. package/dist/commands/key.d.ts +104 -0
  32. package/dist/commands/key.d.ts.map +1 -1
  33. package/dist/commands/key.js +432 -402
  34. package/dist/commands/key.js.map +1 -1
  35. package/dist/commands/vc.d.ts +2 -1
  36. package/dist/commands/vc.d.ts.map +1 -1
  37. package/dist/commands/vc.js +88 -145
  38. package/dist/commands/vc.js.map +1 -1
  39. package/dist/commands/was/collection.d.ts.map +1 -1
  40. package/dist/commands/was/collection.js +31 -85
  41. package/dist/commands/was/collection.js.map +1 -1
  42. package/dist/commands/was/publish.d.ts.map +1 -1
  43. package/dist/commands/was/publish.js +16 -44
  44. package/dist/commands/was/publish.js.map +1 -1
  45. package/dist/commands/was/resource.d.ts.map +1 -1
  46. package/dist/commands/was/resource.js +24 -51
  47. package/dist/commands/was/resource.js.map +1 -1
  48. package/dist/commands/was/shared.d.ts +78 -0
  49. package/dist/commands/was/shared.d.ts.map +1 -1
  50. package/dist/commands/was/shared.js +84 -0
  51. package/dist/commands/was/shared.js.map +1 -1
  52. package/dist/commands/was/space.d.ts +17 -0
  53. package/dist/commands/was/space.d.ts.map +1 -1
  54. package/dist/commands/was/space.js +47 -18
  55. package/dist/commands/was/space.js.map +1 -1
  56. package/dist/commands/was/tree.d.ts.map +1 -1
  57. package/dist/commands/was/tree.js +4 -6
  58. package/dist/commands/was/tree.js.map +1 -1
  59. package/dist/commands/was.d.ts +1 -1
  60. package/dist/commands/was.d.ts.map +1 -1
  61. package/dist/commands/was.js +71 -76
  62. package/dist/commands/was.js.map +1 -1
  63. package/dist/commands/zcap.d.ts +0 -18
  64. package/dist/commands/zcap.d.ts.map +1 -1
  65. package/dist/commands/zcap.js +63 -155
  66. package/dist/commands/zcap.js.map +1 -1
  67. package/dist/documentLoader.d.ts +5 -0
  68. package/dist/documentLoader.d.ts.map +1 -0
  69. package/dist/documentLoader.js +29 -0
  70. package/dist/documentLoader.js.map +1 -0
  71. package/dist/edv/hmac.d.ts.map +1 -1
  72. package/dist/edv/hmac.js +12 -12
  73. package/dist/edv/hmac.js.map +1 -1
  74. package/dist/edv/recipients.d.ts +2 -0
  75. package/dist/edv/recipients.d.ts.map +1 -1
  76. package/dist/edv/recipients.js +12 -15
  77. package/dist/edv/recipients.js.map +1 -1
  78. package/dist/keys/webvh-signer.d.ts +29 -0
  79. package/dist/keys/webvh-signer.d.ts.map +1 -0
  80. package/dist/keys/webvh-signer.js +44 -0
  81. package/dist/keys/webvh-signer.js.map +1 -0
  82. package/dist/keys/webvh-update.d.ts +33 -0
  83. package/dist/keys/webvh-update.d.ts.map +1 -0
  84. package/dist/keys/webvh-update.js +62 -0
  85. package/dist/keys/webvh-update.js.map +1 -0
  86. package/dist/meta.d.ts +36 -11
  87. package/dist/meta.d.ts.map +1 -1
  88. package/dist/meta.js +95 -73
  89. package/dist/meta.js.map +1 -1
  90. package/dist/storage.d.ts +122 -13
  91. package/dist/storage.d.ts.map +1 -1
  92. package/dist/storage.js +105 -13
  93. package/dist/storage.js.map +1 -1
  94. package/dist/vc/issue.d.ts.map +1 -1
  95. package/dist/vc/issue.js +4 -7
  96. package/dist/vc/issue.js.map +1 -1
  97. package/dist/vc/verify.d.ts +10 -0
  98. package/dist/vc/verify.d.ts.map +1 -1
  99. package/dist/vc/verify.js +38 -1
  100. package/dist/vc/verify.js.map +1 -1
  101. package/dist/was/client.d.ts.map +1 -1
  102. package/dist/was/client.js +8 -2
  103. package/dist/was/client.js.map +1 -1
  104. package/dist/was/grant.d.ts +44 -0
  105. package/dist/was/grant.d.ts.map +1 -0
  106. package/dist/was/grant.js +78 -0
  107. package/dist/was/grant.js.map +1 -0
  108. package/dist/was/registry.d.ts +2 -1
  109. package/dist/was/registry.d.ts.map +1 -1
  110. package/dist/was/registry.js +25 -7
  111. package/dist/was/registry.js.map +1 -1
  112. package/dist/zcap/delegate.d.ts.map +1 -1
  113. package/dist/zcap/delegate.js +1 -6
  114. package/dist/zcap/delegate.js.map +1 -1
  115. package/dist/zcap/signer.d.ts.map +1 -1
  116. package/dist/zcap/signer.js.map +1 -1
  117. package/package.json +8 -6
@@ -0,0 +1,625 @@
1
+ /**
2
+ * DID creation and key addition: `runCreate` (key, web, webvh) and `runAddKey`
3
+ * (add a verification key to a stored did:web). Both share the seed-derivation,
4
+ * ECDSA-curve, non-deterministic-seed-guard, and output helpers at the top of
5
+ * this module; the webvh signer/sidecar plumbing is reused from
6
+ * `./webvh-update.js`.
7
+ */
8
+ import { decodeSecretKeySeed, generateSecretKeySeed } from '@digitalcredentials/bnid';
9
+ import { driver } from '@interop/did-method-key';
10
+ import * as didWeb from '@interop/did-web-resolver';
11
+ import { createDID } from '@interop/did-method-webvh';
12
+ import { Ed25519VerificationKey } from '@interop/ed25519-verification-key';
13
+ import * as EcdsaMultikey from '@interop/ecdsa-multikey';
14
+ import { X25519KeyAgreementKey2020 } from '@interop/x25519-key-agreement-key';
15
+ import { loadDidDocument, loadDidKeys, saveDidLog, saveDidMeta, saveToDids } from '../../storage.js';
16
+ import { recordKeyDidAssociation } from '../../meta.js';
17
+ import { normalizeEcdsaCurve, SUPPORTED_ECDSA_CURVES, warnIfNotVcIssuanceCapable } from '../../keys/ecdsa.js';
18
+ import { exportUpdateKey, generateStagedKey } from '../../keys/webvh-update.js';
19
+ import { requireSaveForMetaFlags } from '../collection-command.js';
20
+ import { makeWebvhEntrySigner, persistUpdateKeysSidecar } from './webvh-update.js';
21
+ /**
22
+ * Verification relationships a newly created did:webvh document key is wired
23
+ * into -- everything but keyAgreement, which needs an X25519 key. Also the
24
+ * `add-key` default purpose set (described in its help text).
25
+ */
26
+ export const DEFAULT_VERIFICATION_PURPOSES = [
27
+ 'authentication',
28
+ 'assertionMethod',
29
+ 'capabilityDelegation',
30
+ 'capabilityInvocation'
31
+ ];
32
+ /**
33
+ * Save the artifacts of a newly created DID: the DID document, its keys file,
34
+ * a metadata sidecar (creation timestamp plus the handle and description when
35
+ * given), and the key-to-DID association cache of any matching wallet keys.
36
+ *
37
+ * @param options {object}
38
+ * @param options.method {string}
39
+ * @param options.didDocument {object}
40
+ * @param options.exportedKeys {object}
41
+ * @param options.fingerprints {(string | undefined)[]}
42
+ * @param [options.handle] {string}
43
+ * @param [options.description] {string}
44
+ * @returns {Promise<void>}
45
+ */
46
+ async function saveDidArtifacts({ method, didDocument, exportedKeys, fingerprints, handle, description }) {
47
+ const did = didDocument.id;
48
+ const docPath = await saveToDids({ method, did, data: didDocument });
49
+ await saveToDids({ method, did, suffix: 'keys', data: exportedKeys });
50
+ const meta = { created: new Date().toISOString() };
51
+ if (handle) {
52
+ meta.handle = handle;
53
+ }
54
+ if (description) {
55
+ meta.description = description;
56
+ }
57
+ await saveDidMeta({ did, meta });
58
+ for (const fingerprint of fingerprints) {
59
+ if (fingerprint) {
60
+ await recordKeyDidAssociation({ publicKeyMultibase: fingerprint, did });
61
+ }
62
+ }
63
+ console.error(`DID saved to ${docPath}`);
64
+ }
65
+ /**
66
+ * Resolve the secret key seed for a deterministic (Ed25519) key. With
67
+ * `--with-seed`, an existing `SECRET_KEY_SEED` env var is honored or a fresh
68
+ * seed generated; without it, only an explicitly set env seed is used. Returns
69
+ * the encoded seed (echoed back to the user) and its decoded bytes (for key
70
+ * generation).
71
+ *
72
+ * @param options {object}
73
+ * @param [options.withSeed] {boolean}
74
+ * @returns {Promise<{ secretKeySeed?: string, seedBytes?: Uint8Array }>}
75
+ */
76
+ async function deriveSeed({ withSeed }) {
77
+ const envSeed = process.env.SECRET_KEY_SEED;
78
+ const secretKeySeed = withSeed
79
+ ? (envSeed ?? (await generateSecretKeySeed()))
80
+ : envSeed;
81
+ const seedBytes = secretKeySeed
82
+ ? decodeSecretKeySeed({ secretKeySeed })
83
+ : undefined;
84
+ return { secretKeySeed, seedBytes };
85
+ }
86
+ /**
87
+ * Guard a non-deterministic key type against `--with-seed`: ECDSA and X25519
88
+ * keys are generated non-deterministically and cannot be derived from a seed.
89
+ * Prints the error and returns true when the flag was wrongly supplied.
90
+ *
91
+ * @param options {object}
92
+ * @param [options.withSeed] {boolean}
93
+ * @param options.keyLabel {string} lowercase key type name (e.g. `ecdsa`).
94
+ * @returns {boolean} true when `--with-seed` was rejected.
95
+ */
96
+ function rejectSeedForNonDeterministic({ withSeed, keyLabel }) {
97
+ if (!withSeed) {
98
+ return false;
99
+ }
100
+ console.error(`--with-seed is not supported for ${keyLabel} keys; ` +
101
+ `${keyLabel.toUpperCase()} key generation is non-deterministic and ` +
102
+ 'cannot be derived from a seed.');
103
+ return true;
104
+ }
105
+ /**
106
+ * Normalize an ECDSA curve name and warn when it is not VC-issuance-capable,
107
+ * returning the canonical curve. Prints the error and returns undefined for an
108
+ * unknown curve.
109
+ *
110
+ * @param curveInput {string}
111
+ * @returns {EcdsaCurve | undefined}
112
+ */
113
+ function resolveEcdsaCurveOrReport(curveInput) {
114
+ const curve = normalizeEcdsaCurve({ curve: curveInput });
115
+ if (!curve) {
116
+ console.error(`Unknown ecdsa curve: ${curveInput}. ` +
117
+ `Supported: ${SUPPORTED_ECDSA_CURVES}`);
118
+ return undefined;
119
+ }
120
+ warnIfNotVcIssuanceCapable({ curve });
121
+ return curve;
122
+ }
123
+ /**
124
+ * Print the standard `did create` / `add-key` result object: the DID id, the
125
+ * secret key seed when one is being echoed back, then the DID document.
126
+ *
127
+ * @param options {object}
128
+ * @param options.id {string}
129
+ * @param options.didDocument {unknown}
130
+ * @param [options.secretKeySeed] {string} included only when defined.
131
+ * @returns {void}
132
+ */
133
+ function printDidOutput({ id, didDocument, secretKeySeed }) {
134
+ const output = { id };
135
+ if (secretKeySeed !== undefined) {
136
+ output.secretKeySeed = secretKeySeed;
137
+ }
138
+ output.didDocument = didDocument;
139
+ console.log(JSON.stringify(output, null, 2));
140
+ }
141
+ /**
142
+ * Create a new DID of the given method (key, web, or webvh), optionally saving
143
+ * its document, keys, and metadata to local storage, and print it to stdout.
144
+ *
145
+ * @param options {object}
146
+ * @param [options.method] {string} DID method: key (default), web, or webvh.
147
+ * @param options.type {string} Key type (ed25519 or ecdsa).
148
+ * @param options.curve {string} ECDSA curve, for --type ecdsa.
149
+ * @param [options.url] {string} HTTPS url (required for did:web/did:webvh).
150
+ * @param [options.prerotation] {boolean} Arm did:webvh key pre-rotation.
151
+ * @param [options.portable] {boolean} Create a portable did:webvh.
152
+ * @param [options.witness] {string[]} did:webvh witness did:key DIDs.
153
+ * @param [options.witnessThreshold] {string} Required witness approvals.
154
+ * @param [options.watcher] {string[]} did:webvh watcher URLs.
155
+ * @param [options.withSeed] {boolean} Include/derive the secret key seed.
156
+ * @param [options.save] {boolean} Save the DID to local storage.
157
+ * @param [options.handle] {string} Short tag stored in the metadata sidecar.
158
+ * @param [options.description] {string} Longer description for the sidecar.
159
+ * @returns {Promise<number>} The process exit code.
160
+ */
161
+ export async function runCreate(options) {
162
+ const method = options.method ?? 'key';
163
+ if (!requireSaveForMetaFlags(options)) {
164
+ return 1;
165
+ }
166
+ switch (method) {
167
+ case 'key': {
168
+ switch (options.type) {
169
+ case 'ed25519': {
170
+ const { secretKeySeed, seedBytes } = await deriveSeed({
171
+ withSeed: options.withSeed
172
+ });
173
+ const keyPair = await Ed25519VerificationKey.generate({
174
+ seed: seedBytes
175
+ });
176
+ const didDriver = driver();
177
+ didDriver.use({ keyPairClass: Ed25519VerificationKey });
178
+ const { didDocument } = await didDriver.fromKeyPair({
179
+ verificationKeyPair: keyPair
180
+ });
181
+ if (options.save) {
182
+ const exported = await keyPair.export({
183
+ publicKey: true,
184
+ secretKey: true
185
+ });
186
+ await saveDidArtifacts({
187
+ method: 'key',
188
+ didDocument,
189
+ exportedKeys: exported,
190
+ fingerprints: [
191
+ exported.publicKeyMultibase
192
+ ],
193
+ handle: options.handle,
194
+ description: options.description
195
+ });
196
+ }
197
+ printDidOutput({
198
+ id: didDocument.id,
199
+ didDocument,
200
+ secretKeySeed: options.withSeed ? secretKeySeed : undefined
201
+ });
202
+ return 0;
203
+ }
204
+ case 'ecdsa': {
205
+ if (rejectSeedForNonDeterministic({
206
+ withSeed: options.withSeed,
207
+ keyLabel: 'ecdsa'
208
+ })) {
209
+ return 1;
210
+ }
211
+ const curve = resolveEcdsaCurveOrReport(options.curve);
212
+ if (!curve) {
213
+ return 1;
214
+ }
215
+ const keyPair = await EcdsaMultikey.generate({ curve });
216
+ const didDriver = driver();
217
+ const { didDocument } = await didDriver.fromKeyPair({
218
+ verificationKeyPair: keyPair
219
+ });
220
+ if (options.save) {
221
+ const exported = await keyPair.export({
222
+ publicKey: true,
223
+ secretKey: true
224
+ });
225
+ await saveDidArtifacts({
226
+ method: 'key',
227
+ didDocument,
228
+ exportedKeys: exported,
229
+ fingerprints: [
230
+ exported.publicKeyMultibase
231
+ ],
232
+ handle: options.handle,
233
+ description: options.description
234
+ });
235
+ }
236
+ printDidOutput({ id: didDocument.id, didDocument });
237
+ return 0;
238
+ }
239
+ default:
240
+ console.error(`Unknown key type: ${options.type}. Supported: ed25519, ecdsa`);
241
+ return 1;
242
+ }
243
+ }
244
+ case 'web': {
245
+ switch (options.type) {
246
+ case 'ed25519': {
247
+ if (!options.url) {
248
+ console.error('did:web requires --url (e.g. --url https://example.com)');
249
+ return 1;
250
+ }
251
+ const { secretKeySeed, seedBytes } = await deriveSeed({
252
+ withSeed: options.withSeed
253
+ });
254
+ const didWebDriver = didWeb.driver();
255
+ didWebDriver.use({ keyPairClass: Ed25519VerificationKey });
256
+ const { didDocument, keyPairs } = await didWebDriver.generate({
257
+ url: options.url,
258
+ seed: seedBytes
259
+ });
260
+ if (options.save) {
261
+ const exported = {};
262
+ const fingerprints = [];
263
+ for (const [methodId, keyPair] of keyPairs) {
264
+ const exportedKey = (await keyPair.export({
265
+ publicKey: true,
266
+ secretKey: true
267
+ }));
268
+ exported[methodId] = exportedKey;
269
+ fingerprints.push(exportedKey.publicKeyMultibase);
270
+ }
271
+ await saveDidArtifacts({
272
+ method: 'web',
273
+ didDocument,
274
+ exportedKeys: exported,
275
+ fingerprints,
276
+ handle: options.handle,
277
+ description: options.description
278
+ });
279
+ }
280
+ printDidOutput({
281
+ id: didDocument.id,
282
+ didDocument,
283
+ secretKeySeed: options.withSeed ? secretKeySeed : undefined
284
+ });
285
+ return 0;
286
+ }
287
+ case 'ecdsa': {
288
+ if (!options.url) {
289
+ console.error('did:web requires --url (e.g. --url https://example.com)');
290
+ return 1;
291
+ }
292
+ if (rejectSeedForNonDeterministic({
293
+ withSeed: options.withSeed,
294
+ keyLabel: 'ecdsa'
295
+ })) {
296
+ return 1;
297
+ }
298
+ const curve = resolveEcdsaCurveOrReport(options.curve);
299
+ if (!curve) {
300
+ return 1;
301
+ }
302
+ const keyPair = await EcdsaMultikey.generate({ curve });
303
+ const didWebDriver = didWeb.driver();
304
+ const { didDocument, keyPairs } = await didWebDriver.generate({
305
+ url: options.url,
306
+ verificationKeyPair: keyPair
307
+ });
308
+ if (options.save) {
309
+ const exported = {};
310
+ const fingerprints = [];
311
+ for (const [methodId, savedKey] of keyPairs) {
312
+ const exportedKey = (await savedKey.export({
313
+ publicKey: true,
314
+ secretKey: true
315
+ }));
316
+ exported[methodId] = exportedKey;
317
+ fingerprints.push(exportedKey.publicKeyMultibase);
318
+ }
319
+ await saveDidArtifacts({
320
+ method: 'web',
321
+ didDocument,
322
+ exportedKeys: exported,
323
+ fingerprints,
324
+ handle: options.handle,
325
+ description: options.description
326
+ });
327
+ }
328
+ printDidOutput({ id: didDocument.id, didDocument });
329
+ return 0;
330
+ }
331
+ default:
332
+ console.error(`Unknown key type: ${options.type}. ` + `Supported: ed25519, ecdsa`);
333
+ return 1;
334
+ }
335
+ }
336
+ case 'webvh': {
337
+ if (!options.url) {
338
+ console.error('did:webvh requires --url (e.g. --url https://example.com)');
339
+ return 1;
340
+ }
341
+ // The webvh library hardcodes the `eddsa-jcs-2022` cryptosuite, so
342
+ // only Ed25519 update keys are supported for now.
343
+ if (options.type !== 'ed25519') {
344
+ console.error(`did:webvh only supports --type ed25519 (got ${options.type}); ` +
345
+ 'the eddsa-jcs-2022 cryptosuite requires an Ed25519 key.');
346
+ return 1;
347
+ }
348
+ // Pre-rotation is the default; --no-prerotation opts out. With no
349
+ // flag, commander leaves `prerotation` undefined, which is on.
350
+ const prerotation = options.prerotation !== false;
351
+ // Portability is the default; --no-portable opts out (same shape).
352
+ const portable = options.portable !== false;
353
+ // Witness declarations (declaration only -- generating the witness
354
+ // proofs / did-witness.json sidecar is out of scope for now).
355
+ const witnessDids = options.witness ?? [];
356
+ if (options.witnessThreshold !== undefined && witnessDids.length === 0) {
357
+ console.error('--witness-threshold requires at least one --witness');
358
+ return 1;
359
+ }
360
+ for (const witnessDid of witnessDids) {
361
+ if (!witnessDid.startsWith('did:key:')) {
362
+ console.error(`Invalid witness "${witnessDid}": witnesses must be ` +
363
+ 'did:key DIDs');
364
+ return 1;
365
+ }
366
+ }
367
+ let witness;
368
+ if (witnessDids.length > 0) {
369
+ let threshold = witnessDids.length;
370
+ if (options.witnessThreshold !== undefined) {
371
+ threshold = Number.parseInt(options.witnessThreshold, 10);
372
+ if (!Number.isInteger(threshold) ||
373
+ threshold < 1 ||
374
+ threshold > witnessDids.length) {
375
+ console.error('--witness-threshold must be an integer between 1 and the ' +
376
+ `number of witnesses (${witnessDids.length})`);
377
+ return 1;
378
+ }
379
+ }
380
+ witness = {
381
+ threshold,
382
+ witnesses: witnessDids.map(id => ({ id }))
383
+ };
384
+ }
385
+ // Watcher URLs: https:// (or http://localhost for local testing).
386
+ const watchers = options.watcher ?? [];
387
+ for (const watcher of watchers) {
388
+ let watcherUrl;
389
+ try {
390
+ watcherUrl = new URL(watcher);
391
+ }
392
+ catch {
393
+ console.error(`Invalid watcher URL: ${watcher}`);
394
+ return 1;
395
+ }
396
+ const isLocalhost = watcherUrl.protocol === 'http:' &&
397
+ (watcherUrl.hostname === 'localhost' ||
398
+ watcherUrl.hostname === '127.0.0.1');
399
+ if (watcherUrl.protocol !== 'https:' && !isLocalhost) {
400
+ console.error(`Invalid watcher URL "${watcher}": must be https:// ` +
401
+ '(or http://localhost)');
402
+ return 1;
403
+ }
404
+ }
405
+ const { secretKeySeed, seedBytes } = await deriveSeed({
406
+ withSeed: options.withSeed
407
+ });
408
+ // Update key A: the active authorization key. It is what the DID
409
+ // identifier (SCID) derives from, so it is the seed-derived one.
410
+ const updateKey = await Ed25519VerificationKey.generate({
411
+ seed: seedBytes
412
+ });
413
+ const signer = makeWebvhEntrySigner(updateKey);
414
+ // Document verification key V, decoupled from the update keys so
415
+ // that rotating the update key never disturbs the document.
416
+ const docKey = await Ed25519VerificationKey.generate();
417
+ // Staged next update key B: when pre-rotation is on, commit its
418
+ // hash now so the next update must reveal it.
419
+ const stagedKey = prerotation ? await generateStagedKey() : undefined;
420
+ const result = await createDID({
421
+ address: options.url,
422
+ signer,
423
+ verifier: signer,
424
+ // A portable DID (the default) can later be moved to a different
425
+ // domain; --no-portable pins it to its origin.
426
+ portable,
427
+ updateKeys: [updateKey.publicKeyMultibase],
428
+ ...(stagedKey ? { nextKeyHashes: [stagedKey.nextKeyHash] } : {}),
429
+ ...(witness ? { witness } : {}),
430
+ ...(watchers.length > 0 ? { watchers } : {}),
431
+ verificationMethods: [
432
+ {
433
+ type: 'Multikey',
434
+ publicKeyMultibase: docKey.publicKeyMultibase,
435
+ // Wire the document key into the same relationships as did:web
436
+ // (everything but keyAgreement, which needs an X25519 key).
437
+ purpose: [...DEFAULT_VERIFICATION_PURPOSES]
438
+ }
439
+ ]
440
+ });
441
+ if (options.save) {
442
+ // Persist the document key V keyed by its document verification
443
+ // method id (so it can be selected for signing), and set its id
444
+ // to match.
445
+ const docVmId = result.doc.verificationMethod?.[0]?.id;
446
+ if (!docVmId) {
447
+ console.error('Created did:webvh document is missing a verification method id');
448
+ return 1;
449
+ }
450
+ docKey.id = docVmId;
451
+ const exportedDoc = (await docKey.export({
452
+ publicKey: true,
453
+ secretKey: true
454
+ }));
455
+ await saveDidArtifacts({
456
+ method: 'webvh',
457
+ didDocument: result.doc,
458
+ exportedKeys: { [docVmId]: exportedDoc },
459
+ fingerprints: [exportedDoc.publicKeyMultibase],
460
+ handle: options.handle,
461
+ description: options.description
462
+ });
463
+ // Persist the update keys (active A, and staged B when armed) in
464
+ // a sidecar distinct from the document's keys file.
465
+ const updateKeysPath = await persistUpdateKeysSidecar({
466
+ did: result.did,
467
+ newActive: await exportUpdateKey(updateKey),
468
+ newStaged: stagedKey
469
+ });
470
+ const logPath = await saveDidLog({
471
+ did: result.did,
472
+ log: result.log
473
+ });
474
+ console.error(`DID history log saved to ${logPath}`);
475
+ console.error(`Update keys saved to ${updateKeysPath}`);
476
+ }
477
+ printDidOutput({
478
+ id: result.did,
479
+ didDocument: result.doc,
480
+ secretKeySeed: options.withSeed ? secretKeySeed : undefined
481
+ });
482
+ return 0;
483
+ }
484
+ default:
485
+ console.error(`Unknown method: ${method}. Supported: key, web, webvh`);
486
+ return 1;
487
+ }
488
+ }
489
+ /**
490
+ * Add a verification key to an existing (locally stored) did:web document,
491
+ * re-save the document and keys file, and print the updated document.
492
+ *
493
+ * @param options {object}
494
+ * @param options.did {string} The did:web DID to add a key to.
495
+ * @param options.type {string} Key type: ed25519, ecdsa, or x25519.
496
+ * @param options.curve {string} ECDSA curve, for --type ecdsa.
497
+ * @param [options.purpose] {string[]} Verification relationship(s) to wire
498
+ * the key into.
499
+ * @param [options.withSeed] {boolean} Include/derive the secret key seed
500
+ * (ed25519 only).
501
+ * @returns {Promise<number>} The process exit code.
502
+ */
503
+ export async function runAddKey(options) {
504
+ const { did } = options;
505
+ if (!did.startsWith('did:web:')) {
506
+ console.error('add-key is only supported for did:web DIDs');
507
+ return 1;
508
+ }
509
+ if (options.type !== 'ed25519' &&
510
+ options.type !== 'ecdsa' &&
511
+ options.type !== 'x25519') {
512
+ console.error(`Unknown key type: ${options.type}. ` +
513
+ 'Supported: ed25519, ecdsa, x25519');
514
+ return 1;
515
+ }
516
+ // x25519 keys are key agreement keys; they can only be wired into the
517
+ // keyAgreement verification relationship.
518
+ let purposes = options.purpose;
519
+ if (options.type === 'x25519') {
520
+ if (purposes && purposes.some(purpose => purpose !== 'keyAgreement')) {
521
+ console.error('x25519 keys can only be added to the keyAgreement ' +
522
+ 'verification relationship');
523
+ return 1;
524
+ }
525
+ purposes = ['keyAgreement'];
526
+ }
527
+ let didDocument;
528
+ let exportedKeys;
529
+ try {
530
+ didDocument = await loadDidDocument(did);
531
+ exportedKeys = await loadDidKeys(did);
532
+ }
533
+ catch {
534
+ console.error(`No locally stored did:web found for ${did}`);
535
+ return 1;
536
+ }
537
+ // ed25519 keys are derived from a seed; ecdsa and x25519 keys are
538
+ // generated non-deterministically and have no seed.
539
+ let secretKeySeed;
540
+ let keyPair;
541
+ const didWebDriver = didWeb.driver();
542
+ if (options.type === 'ed25519') {
543
+ let seedBytes;
544
+ ({ secretKeySeed, seedBytes } = await deriveSeed({
545
+ withSeed: options.withSeed
546
+ }));
547
+ keyPair = await Ed25519VerificationKey.generate({ seed: seedBytes });
548
+ didWebDriver.use({ keyPairClass: Ed25519VerificationKey });
549
+ }
550
+ else if (options.type === 'ecdsa') {
551
+ if (rejectSeedForNonDeterministic({
552
+ withSeed: options.withSeed,
553
+ keyLabel: 'ecdsa'
554
+ })) {
555
+ return 1;
556
+ }
557
+ const curve = resolveEcdsaCurveOrReport(options.curve);
558
+ if (!curve) {
559
+ return 1;
560
+ }
561
+ keyPair = await EcdsaMultikey.generate({ curve });
562
+ }
563
+ else {
564
+ if (rejectSeedForNonDeterministic({
565
+ withSeed: options.withSeed,
566
+ keyLabel: 'x25519'
567
+ })) {
568
+ return 1;
569
+ }
570
+ keyPair = await X25519KeyAgreementKey2020.generate();
571
+ }
572
+ const keyPairs = new Map();
573
+ try {
574
+ await didWebDriver.addVerificationMethod({
575
+ didDocument,
576
+ keyPairs,
577
+ keyPair,
578
+ purposes
579
+ });
580
+ }
581
+ catch (err) {
582
+ console.error(err.message);
583
+ return 1;
584
+ }
585
+ // Merge the new key into the stored keys file (keyed by VM id). X25519
586
+ // keys export their private half as `privateKeyMultibase`, the other
587
+ // suites as `secretKeyMultibase`.
588
+ const addedFingerprints = [];
589
+ for (const [methodId, addedKey] of keyPairs) {
590
+ const exportedKey = (await addedKey.export(options.type === 'x25519'
591
+ ? { publicKey: true, privateKey: true }
592
+ : { publicKey: true, secretKey: true }));
593
+ exportedKeys[methodId] = exportedKey;
594
+ addedFingerprints.push(exportedKey.publicKeyMultibase);
595
+ }
596
+ const docPath = await saveToDids({
597
+ method: 'web',
598
+ did,
599
+ data: didDocument
600
+ });
601
+ await saveToDids({
602
+ method: 'web',
603
+ did,
604
+ suffix: 'keys',
605
+ data: exportedKeys
606
+ });
607
+ // Update the key-to-DID cache of any matching wallet keys; the DID's
608
+ // own metadata sidecar is left untouched.
609
+ for (const fingerprint of addedFingerprints) {
610
+ if (fingerprint) {
611
+ await recordKeyDidAssociation({
612
+ publicKeyMultibase: fingerprint,
613
+ did
614
+ });
615
+ }
616
+ }
617
+ console.error(`DID saved to ${docPath}`);
618
+ printDidOutput({
619
+ id: didDocument.id,
620
+ didDocument,
621
+ secretKeySeed: options.withSeed ? secretKeySeed : undefined
622
+ });
623
+ return 0;
624
+ }
625
+ //# sourceMappingURL=create.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"create.js","sourceRoot":"","sources":["../../../src/commands/did/create.ts"],"names":[],"mappings":"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"}