@interop/did-cli 0.10.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.
- package/CHANGELOG.md +58 -0
- package/dist/commands/collection-command.d.ts +169 -0
- package/dist/commands/collection-command.d.ts.map +1 -0
- package/dist/commands/collection-command.js +241 -0
- package/dist/commands/collection-command.js.map +1 -0
- package/dist/commands/did/create.d.ts +63 -0
- package/dist/commands/did/create.d.ts.map +1 -0
- package/dist/commands/did/create.js +625 -0
- package/dist/commands/did/create.js.map +1 -0
- package/dist/commands/did/manage.d.ts +68 -0
- package/dist/commands/did/manage.d.ts.map +1 -0
- package/dist/commands/did/manage.js +287 -0
- package/dist/commands/did/manage.js.map +1 -0
- package/dist/commands/did/service.d.ts +93 -0
- package/dist/commands/did/service.d.ts.map +1 -0
- package/dist/commands/did/service.js +324 -0
- package/dist/commands/did/service.js.map +1 -0
- package/dist/commands/did/webvh-update.d.ts +170 -0
- package/dist/commands/did/webvh-update.d.ts.map +1 -0
- package/dist/commands/did/webvh-update.js +402 -0
- package/dist/commands/did/webvh-update.js.map +1 -0
- package/dist/commands/did.d.ts +8 -8
- package/dist/commands/did.d.ts.map +1 -1
- package/dist/commands/did.js +27 -1519
- package/dist/commands/did.js.map +1 -1
- package/dist/commands/edv.d.ts +15 -6
- package/dist/commands/edv.d.ts.map +1 -1
- package/dist/commands/edv.js +38 -28
- package/dist/commands/edv.js.map +1 -1
- package/dist/commands/key.d.ts +104 -0
- package/dist/commands/key.d.ts.map +1 -1
- package/dist/commands/key.js +432 -402
- package/dist/commands/key.js.map +1 -1
- package/dist/commands/vc.d.ts +2 -1
- package/dist/commands/vc.d.ts.map +1 -1
- package/dist/commands/vc.js +88 -145
- package/dist/commands/vc.js.map +1 -1
- package/dist/commands/was/collection.d.ts.map +1 -1
- package/dist/commands/was/collection.js +31 -85
- package/dist/commands/was/collection.js.map +1 -1
- package/dist/commands/was/publish.d.ts.map +1 -1
- package/dist/commands/was/publish.js +16 -44
- package/dist/commands/was/publish.js.map +1 -1
- package/dist/commands/was/resource.d.ts.map +1 -1
- package/dist/commands/was/resource.js +24 -51
- package/dist/commands/was/resource.js.map +1 -1
- package/dist/commands/was/shared.d.ts +78 -0
- package/dist/commands/was/shared.d.ts.map +1 -1
- package/dist/commands/was/shared.js +84 -0
- package/dist/commands/was/shared.js.map +1 -1
- package/dist/commands/was/space.d.ts.map +1 -1
- package/dist/commands/was/space.js +10 -16
- package/dist/commands/was/space.js.map +1 -1
- package/dist/commands/was/tree.d.ts.map +1 -1
- package/dist/commands/was/tree.js +4 -6
- package/dist/commands/was/tree.js.map +1 -1
- package/dist/commands/was.d.ts.map +1 -1
- package/dist/commands/was.js +60 -74
- package/dist/commands/was.js.map +1 -1
- package/dist/commands/zcap.d.ts +0 -18
- package/dist/commands/zcap.d.ts.map +1 -1
- package/dist/commands/zcap.js +63 -155
- package/dist/commands/zcap.js.map +1 -1
- package/dist/documentLoader.d.ts +5 -0
- package/dist/documentLoader.d.ts.map +1 -0
- package/dist/documentLoader.js +29 -0
- package/dist/documentLoader.js.map +1 -0
- package/dist/edv/hmac.d.ts.map +1 -1
- package/dist/edv/hmac.js +12 -12
- package/dist/edv/hmac.js.map +1 -1
- package/dist/edv/recipients.d.ts +2 -0
- package/dist/edv/recipients.d.ts.map +1 -1
- package/dist/edv/recipients.js +12 -15
- package/dist/edv/recipients.js.map +1 -1
- package/dist/meta.d.ts +36 -11
- package/dist/meta.d.ts.map +1 -1
- package/dist/meta.js +95 -73
- package/dist/meta.js.map +1 -1
- package/dist/storage.d.ts +48 -13
- package/dist/storage.d.ts.map +1 -1
- package/dist/storage.js +40 -16
- package/dist/storage.js.map +1 -1
- package/dist/vc/issue.d.ts.map +1 -1
- package/dist/vc/issue.js +4 -7
- package/dist/vc/issue.js.map +1 -1
- package/dist/vc/verify.d.ts +10 -0
- package/dist/vc/verify.d.ts.map +1 -1
- package/dist/vc/verify.js +38 -1
- package/dist/vc/verify.js.map +1 -1
- package/dist/was/client.d.ts.map +1 -1
- package/dist/was/client.js +8 -2
- package/dist/was/client.js.map +1 -1
- package/dist/was/grant.d.ts +44 -0
- package/dist/was/grant.d.ts.map +1 -0
- package/dist/was/grant.js +78 -0
- package/dist/was/grant.js.map +1 -0
- package/dist/was/registry.d.ts.map +1 -1
- package/dist/was/registry.js +9 -2
- package/dist/was/registry.js.map +1 -1
- package/dist/zcap/delegate.d.ts.map +1 -1
- package/dist/zcap/delegate.js +1 -6
- package/dist/zcap/delegate.js.map +1 -1
- package/dist/zcap/signer.d.ts.map +1 -1
- package/dist/zcap/signer.js.map +1 -1
- package/package.json +5 -4
- package/dist/keys/webvh-driver.d.ts +0 -24
- package/dist/keys/webvh-driver.d.ts.map +0 -1
- package/dist/keys/webvh-driver.js +0 -73
- package/dist/keys/webvh-driver.js.map +0 -1
|
@@ -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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"}
|