@interop/did-cli 0.8.0 → 0.10.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/CHANGELOG.md +158 -0
- package/README.md +386 -4
- package/dist/commands/did.d.ts +9 -0
- package/dist/commands/did.d.ts.map +1 -1
- package/dist/commands/did.js +1041 -20
- package/dist/commands/did.js.map +1 -1
- package/dist/commands/edv.d.ts +63 -0
- package/dist/commands/edv.d.ts.map +1 -0
- package/dist/commands/edv.js +627 -0
- package/dist/commands/edv.js.map +1 -0
- package/dist/commands/key.d.ts.map +1 -1
- package/dist/commands/key.js +44 -8
- package/dist/commands/key.js.map +1 -1
- package/dist/commands/was/space.d.ts +17 -0
- package/dist/commands/was/space.d.ts.map +1 -1
- package/dist/commands/was/space.js +37 -2
- package/dist/commands/was/space.js.map +1 -1
- package/dist/commands/was.d.ts +1 -1
- package/dist/commands/was.d.ts.map +1 -1
- package/dist/commands/was.js +11 -2
- package/dist/commands/was.js.map +1 -1
- package/dist/edv/core.d.ts +60 -0
- package/dist/edv/core.d.ts.map +1 -0
- package/dist/edv/core.js +75 -0
- package/dist/edv/core.js.map +1 -0
- package/dist/edv/document.d.ts +25 -0
- package/dist/edv/document.d.ts.map +1 -0
- package/dist/edv/document.js +19 -0
- package/dist/edv/document.js.map +1 -0
- package/dist/edv/hmac.d.ts +26 -0
- package/dist/edv/hmac.d.ts.map +1 -0
- package/dist/edv/hmac.js +67 -0
- package/dist/edv/hmac.js.map +1 -0
- package/dist/edv/recipients.d.ts +65 -0
- package/dist/edv/recipients.d.ts.map +1 -0
- package/dist/edv/recipients.js +253 -0
- package/dist/edv/recipients.js.map +1 -0
- package/dist/edv/stream.d.ts +69 -0
- package/dist/edv/stream.d.ts.map +1 -0
- package/dist/edv/stream.js +169 -0
- package/dist/edv/stream.js.map +1 -0
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -1
- package/dist/keys/webvh-driver.d.ts +24 -0
- package/dist/keys/webvh-driver.d.ts.map +1 -0
- package/dist/keys/webvh-driver.js +73 -0
- package/dist/keys/webvh-driver.js.map +1 -0
- package/dist/keys/webvh-signer.d.ts +29 -0
- package/dist/keys/webvh-signer.d.ts.map +1 -0
- package/dist/keys/webvh-signer.js +44 -0
- package/dist/keys/webvh-signer.js.map +1 -0
- package/dist/keys/webvh-update.d.ts +33 -0
- package/dist/keys/webvh-update.d.ts.map +1 -0
- package/dist/keys/webvh-update.js +62 -0
- package/dist/keys/webvh-update.js.map +1 -0
- package/dist/meta.d.ts +1 -0
- package/dist/meta.d.ts.map +1 -1
- package/dist/meta.js +1 -1
- package/dist/meta.js.map +1 -1
- package/dist/storage.d.ts +80 -4
- package/dist/storage.d.ts.map +1 -1
- package/dist/storage.js +75 -6
- package/dist/storage.js.map +1 -1
- package/dist/was/io.d.ts +14 -0
- package/dist/was/io.d.ts.map +1 -1
- package/dist/was/io.js +20 -7
- package/dist/was/io.js.map +1 -1
- package/dist/was/registry.d.ts +2 -1
- package/dist/was/registry.d.ts.map +1 -1
- package/dist/was/registry.js +16 -5
- package/dist/was/registry.js.map +1 -1
- package/package.json +9 -6
|
@@ -0,0 +1,169 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Chunked-stream support for EDV Documents (Layer 2, Phase 2): encrypt a large
|
|
3
|
+
* input as a sequence of fixed-size encrypted chunks instead of a single JWE,
|
|
4
|
+
* and decrypt the chunks back into the original bytes. A streamed document
|
|
5
|
+
* carries a cleartext `stream: { sequence, chunks }` descriptor; the bytes
|
|
6
|
+
* themselves live in separate chunk JWEs, each `{ sequence, index, offset, jwe }`
|
|
7
|
+
* (`IEDVChunk`), mirroring how an EDV / WAS server stores stream resources apart
|
|
8
|
+
* from the document.
|
|
9
|
+
*
|
|
10
|
+
* On disk the document and its chunks are a **bundle directory** (convention
|
|
11
|
+
* `*.edvdoc/`): `document.json` (the `{ id, sequence, indexed, stream, jwe }`
|
|
12
|
+
* envelope) and `chunks/<index>.jwe.json` (one file per chunk). This keeps the
|
|
13
|
+
* chunks as distinct resources, faithful to the server model.
|
|
14
|
+
*
|
|
15
|
+
* The cipher driving mirrors `@interop/edv-client`'s `_updateStream` /
|
|
16
|
+
* `EdvDocument.getStream` without taking that dependency: it pumps the input
|
|
17
|
+
* through `cipher.createEncryptStream`, stamps the document `sequence` onto each
|
|
18
|
+
* emitted chunk, and feeds chunks back (in `index` order) through
|
|
19
|
+
* `cipher.createDecryptStream`.
|
|
20
|
+
*/
|
|
21
|
+
import { mkdir, readFile, readdir, writeFile } from 'node:fs/promises';
|
|
22
|
+
import { join } from 'node:path';
|
|
23
|
+
import { isEncryptedDocument } from './document.js';
|
|
24
|
+
/** The envelope file within a bundle directory. */
|
|
25
|
+
const BUNDLE_DOCUMENT_FILE = 'document.json';
|
|
26
|
+
/** The subdirectory holding the chunk JWE files within a bundle directory. */
|
|
27
|
+
const BUNDLE_CHUNKS_DIR = 'chunks';
|
|
28
|
+
/**
|
|
29
|
+
* Drain a TransformStream: write each input value, then read every output
|
|
30
|
+
* value. Reads run concurrently with the single write so a large input cannot
|
|
31
|
+
* deadlock against the stream's internal backpressure.
|
|
32
|
+
*
|
|
33
|
+
* @param options {object}
|
|
34
|
+
* @param options.stream {TransformStream}
|
|
35
|
+
* @param options.inputs {unknown[]} Values to write to the writable side.
|
|
36
|
+
* @returns {Promise<T[]>} The values emitted on the readable side.
|
|
37
|
+
*/
|
|
38
|
+
async function pump({ stream, inputs }) {
|
|
39
|
+
const writer = stream.writable.getWriter();
|
|
40
|
+
const reader = stream.readable.getReader();
|
|
41
|
+
const outputs = [];
|
|
42
|
+
const reading = (async () => {
|
|
43
|
+
for (;;) {
|
|
44
|
+
const { value, done } = await reader.read();
|
|
45
|
+
if (done) {
|
|
46
|
+
break;
|
|
47
|
+
}
|
|
48
|
+
outputs.push(value);
|
|
49
|
+
}
|
|
50
|
+
})();
|
|
51
|
+
for (const input of inputs) {
|
|
52
|
+
await writer.write(input);
|
|
53
|
+
}
|
|
54
|
+
await writer.close();
|
|
55
|
+
await reading;
|
|
56
|
+
return outputs;
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* Concatenate Uint8Array parts into a single buffer.
|
|
60
|
+
*
|
|
61
|
+
* @param parts {Uint8Array[]}
|
|
62
|
+
* @returns {Uint8Array}
|
|
63
|
+
*/
|
|
64
|
+
function concatBytes(parts) {
|
|
65
|
+
const total = parts.reduce((sum, part) => sum + part.byteLength, 0);
|
|
66
|
+
const result = new Uint8Array(total);
|
|
67
|
+
let offset = 0;
|
|
68
|
+
for (const part of parts) {
|
|
69
|
+
result.set(part, offset);
|
|
70
|
+
offset += part.byteLength;
|
|
71
|
+
}
|
|
72
|
+
return result;
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* Encrypt `data` as a stream of chunks for the given recipients, stamping the
|
|
76
|
+
* document `sequence` onto each chunk (as `EdvClientCore._updateStream` does).
|
|
77
|
+
*
|
|
78
|
+
* @param options {object}
|
|
79
|
+
* @param options.cipher {Cipher}
|
|
80
|
+
* @param options.data {Uint8Array}
|
|
81
|
+
* @param options.recipients {IRecipientTemplate[]}
|
|
82
|
+
* @param options.keyResolver {IKeyResolver}
|
|
83
|
+
* @param [options.chunkSize] {number} Bytes per chunk (cipher default 1 MiB).
|
|
84
|
+
* @param options.sequence {number} The owning document's sequence.
|
|
85
|
+
* @returns {Promise<IEDVChunk[]>}
|
|
86
|
+
*/
|
|
87
|
+
export async function encryptToChunks({ cipher, data, recipients, keyResolver, chunkSize, sequence }) {
|
|
88
|
+
const stream = await cipher.createEncryptStream({
|
|
89
|
+
recipients,
|
|
90
|
+
keyResolver,
|
|
91
|
+
chunkSize
|
|
92
|
+
});
|
|
93
|
+
const emitted = await pump({
|
|
94
|
+
stream,
|
|
95
|
+
inputs: [data]
|
|
96
|
+
});
|
|
97
|
+
return emitted.map(chunk => ({
|
|
98
|
+
sequence,
|
|
99
|
+
index: chunk.index,
|
|
100
|
+
offset: chunk.offset,
|
|
101
|
+
jwe: chunk.jwe
|
|
102
|
+
}));
|
|
103
|
+
}
|
|
104
|
+
/**
|
|
105
|
+
* Decrypt a document's chunks (in `index` order) back into the original bytes.
|
|
106
|
+
* A wrong key surfaces as a thrown `DataError` from the decrypt transformer.
|
|
107
|
+
*
|
|
108
|
+
* @param options {object}
|
|
109
|
+
* @param options.cipher {Cipher}
|
|
110
|
+
* @param options.chunks {IEDVChunk[]}
|
|
111
|
+
* @param options.keyAgreementKey {KeyAgreementKey}
|
|
112
|
+
* @returns {Promise<Uint8Array>}
|
|
113
|
+
*/
|
|
114
|
+
export async function decryptChunks({ cipher, chunks, keyAgreementKey }) {
|
|
115
|
+
const ordered = [...chunks].sort((first, second) => first.index - second.index);
|
|
116
|
+
const stream = await cipher.createDecryptStream({ keyAgreementKey });
|
|
117
|
+
const parts = await pump({
|
|
118
|
+
stream,
|
|
119
|
+
inputs: ordered.map(chunk => ({ jwe: chunk.jwe }))
|
|
120
|
+
});
|
|
121
|
+
return concatBytes(parts);
|
|
122
|
+
}
|
|
123
|
+
/**
|
|
124
|
+
* Write a streamed EDV Document as a bundle directory: `document.json` plus
|
|
125
|
+
* `chunks/<index>.jwe.json` for each chunk.
|
|
126
|
+
*
|
|
127
|
+
* @param options {object}
|
|
128
|
+
* @param options.dir {string} The bundle directory path.
|
|
129
|
+
* @param options.document {IEncryptedDocument}
|
|
130
|
+
* @param options.chunks {IEDVChunk[]}
|
|
131
|
+
* @returns {Promise<void>}
|
|
132
|
+
*/
|
|
133
|
+
export async function writeDocumentBundle({ dir, document, chunks }) {
|
|
134
|
+
const chunksDir = join(dir, BUNDLE_CHUNKS_DIR);
|
|
135
|
+
await mkdir(chunksDir, { recursive: true });
|
|
136
|
+
await writeFile(join(dir, BUNDLE_DOCUMENT_FILE), `${JSON.stringify(document, null, 2)}\n`, 'utf8');
|
|
137
|
+
for (const chunk of chunks) {
|
|
138
|
+
await writeFile(join(chunksDir, `${chunk.index}.jwe.json`), `${JSON.stringify(chunk, null, 2)}\n`, 'utf8');
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
/**
|
|
142
|
+
* Read a bundle directory back into its document envelope and chunks (sorted by
|
|
143
|
+
* `index`).
|
|
144
|
+
*
|
|
145
|
+
* @param options {object}
|
|
146
|
+
* @param options.dir {string} The bundle directory path.
|
|
147
|
+
* @returns {Promise<{document: IEncryptedDocument, chunks: IEDVChunk[]}>}
|
|
148
|
+
*/
|
|
149
|
+
export async function readDocumentBundle({ dir }) {
|
|
150
|
+
let document;
|
|
151
|
+
try {
|
|
152
|
+
document = JSON.parse(await readFile(join(dir, BUNDLE_DOCUMENT_FILE), 'utf8'));
|
|
153
|
+
}
|
|
154
|
+
catch (err) {
|
|
155
|
+
throw new Error(`Could not read ${BUNDLE_DOCUMENT_FILE} in bundle "${dir}": ${err.message}`, { cause: err });
|
|
156
|
+
}
|
|
157
|
+
if (!isEncryptedDocument(document)) {
|
|
158
|
+
throw new Error(`Bundle "${dir}" does not contain an EDV Document.`);
|
|
159
|
+
}
|
|
160
|
+
const chunksDir = join(dir, BUNDLE_CHUNKS_DIR);
|
|
161
|
+
const names = (await readdir(chunksDir).catch(() => [])).filter(name => name.endsWith('.jwe.json'));
|
|
162
|
+
const chunks = [];
|
|
163
|
+
for (const name of names) {
|
|
164
|
+
chunks.push(JSON.parse(await readFile(join(chunksDir, name), 'utf8')));
|
|
165
|
+
}
|
|
166
|
+
chunks.sort((first, second) => first.index - second.index);
|
|
167
|
+
return { document, chunks };
|
|
168
|
+
}
|
|
169
|
+
//# sourceMappingURL=stream.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"stream.js","sourceRoot":"","sources":["../../src/edv/stream.ts"],"names":[],"mappings":"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"}
|
package/dist/index.js
CHANGED
|
@@ -2,6 +2,7 @@
|
|
|
2
2
|
import { createRequire } from 'node:module';
|
|
3
3
|
import { Command } from 'commander';
|
|
4
4
|
import { makeDidCommand } from './commands/did.js';
|
|
5
|
+
import { makeEdvCommand } from './commands/edv.js';
|
|
5
6
|
import { makeKeyCommand } from './commands/key.js';
|
|
6
7
|
import { makeVcCommand } from './commands/vc.js';
|
|
7
8
|
import { makeWalletCommand } from './commands/wallet.js';
|
|
@@ -11,6 +12,7 @@ const { version } = createRequire(import.meta.url)('../package.json');
|
|
|
11
12
|
const program = new Command();
|
|
12
13
|
program.name('di').description('DID CLI tool').version(version);
|
|
13
14
|
program.addCommand(makeDidCommand());
|
|
15
|
+
program.addCommand(makeEdvCommand());
|
|
14
16
|
program.addCommand(makeKeyCommand());
|
|
15
17
|
program.addCommand(makeVcCommand());
|
|
16
18
|
program.addCommand(makeWalletCommand());
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAA;AAC3C,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AACnC,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAA;AAClD,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAA;AAClD,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAA;AAChD,OAAO,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAA;AACxD,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAA;AAClD,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAA;AAEpD,MAAM,EAAE,OAAO,EAAE,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,iBAAiB,CAEnE,CAAA;AAED,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAA;AAE7B,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,WAAW,CAAC,cAAc,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,CAAA;AAE/D,OAAO,CAAC,UAAU,CAAC,cAAc,EAAE,CAAC,CAAA;AACpC,OAAO,CAAC,UAAU,CAAC,cAAc,EAAE,CAAC,CAAA;AACpC,OAAO,CAAC,UAAU,CAAC,aAAa,EAAE,CAAC,CAAA;AACnC,OAAO,CAAC,UAAU,CAAC,iBAAiB,EAAE,CAAC,CAAA;AACvC,OAAO,CAAC,UAAU,CAAC,cAAc,EAAE,CAAC,CAAA;AACpC,OAAO,CAAC,UAAU,CAAC,eAAe,EAAE,CAAC,CAAA;AAErC,OAAO,CAAC,KAAK,EAAE,CAAA"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAA;AAC3C,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AACnC,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAA;AAClD,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAA;AAClD,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAA;AAClD,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAA;AAChD,OAAO,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAA;AACxD,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAA;AAClD,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAA;AAEpD,MAAM,EAAE,OAAO,EAAE,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,iBAAiB,CAEnE,CAAA;AAED,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAA;AAE7B,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,WAAW,CAAC,cAAc,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,CAAA;AAE/D,OAAO,CAAC,UAAU,CAAC,cAAc,EAAE,CAAC,CAAA;AACpC,OAAO,CAAC,UAAU,CAAC,cAAc,EAAE,CAAC,CAAA;AACpC,OAAO,CAAC,UAAU,CAAC,cAAc,EAAE,CAAC,CAAA;AACpC,OAAO,CAAC,UAAU,CAAC,aAAa,EAAE,CAAC,CAAA;AACnC,OAAO,CAAC,UAAU,CAAC,iBAAiB,EAAE,CAAC,CAAA;AACvC,OAAO,CAAC,UAAU,CAAC,cAAc,EAAE,CAAC,CAAA;AACpC,OAAO,CAAC,UAAU,CAAC,eAAe,EAAE,CAAC,CAAA;AAErC,OAAO,CAAC,KAAK,EAAE,CAAA"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Generic Ed25519 verifier for resolving a did:webvh history log. The webvh
|
|
3
|
+
* resolver verifies each log entry's `eddsa-jcs-2022` proof by calling
|
|
4
|
+
* `verify(signature, message, publicKey)` with the raw public-key bytes of that
|
|
5
|
+
* entry's update key, so -- unlike the fixed-key signer/verifier in
|
|
6
|
+
* `webvh-signer.ts` -- this reconstructs a key per call from those bytes.
|
|
7
|
+
*/
|
|
8
|
+
export declare const webvhLogVerifier: {
|
|
9
|
+
verify(signature: Uint8Array, message: Uint8Array, publicKey: Uint8Array): Promise<boolean>;
|
|
10
|
+
};
|
|
11
|
+
/**
|
|
12
|
+
* Build a `did:webvh` driver for the security document loader's resolver.
|
|
13
|
+
*
|
|
14
|
+
* @returns {{ method: string, get: (options: { did?: string, url?: string }) =>
|
|
15
|
+
* Promise<Record<string, unknown>> }}
|
|
16
|
+
*/
|
|
17
|
+
export declare function makeWebvhDriver(): {
|
|
18
|
+
method: string;
|
|
19
|
+
get(options: {
|
|
20
|
+
did?: string;
|
|
21
|
+
url?: string;
|
|
22
|
+
}): Promise<Record<string, unknown>>;
|
|
23
|
+
};
|
|
24
|
+
//# sourceMappingURL=webvh-driver.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"webvh-driver.d.ts","sourceRoot":"","sources":["../../src/keys/webvh-driver.ts"],"names":[],"mappings":"AA4BA;;;;;;GAMG;AACH,eAAO,MAAM,gBAAgB;sBAEd,UAAU,WACZ,UAAU,aACR,UAAU,GACpB,OAAO,CAAC,OAAO,CAAC;CAapB,CAAA;AAED;;;;;GAKG;AACH,wBAAgB,eAAe,IAAI;IACjC,MAAM,EAAE,MAAM,CAAA;IACd,GAAG,CAAC,OAAO,EAAE;QAAE,GAAG,CAAC,EAAE,MAAM,CAAC;QAAC,GAAG,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAA;CAC/E,CA6BA"}
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Bridges `@interop/did-method-webvh`'s `resolveDID` to the DID-method driver
|
|
3
|
+
* contract expected by the security document loader's `CachedResolver`
|
|
4
|
+
* (`{ method, get({ did, url }) }`). Registering this driver lets the shared
|
|
5
|
+
* loader resolve `did:webvh` DIDs (and dereference `did#fragment` URLs to their
|
|
6
|
+
* verification method) without `@interop/security-document-loader` itself
|
|
7
|
+
* taking on the `did:webvh` dependency stack.
|
|
8
|
+
*
|
|
9
|
+
* `resolveDID` fetches and verifies the DID's history log, then returns
|
|
10
|
+
* `{ doc, meta }`; unlike the did:web driver it never throws, signalling
|
|
11
|
+
* failure with `doc: null` and a `meta.problemDetails` instead, so this wrapper
|
|
12
|
+
* converts that into a thrown error to match the other drivers' behaviour. The
|
|
13
|
+
* `did#fragment` dereferencing reuses did:web's `getNode` for parity.
|
|
14
|
+
*/
|
|
15
|
+
import { MultibaseEncoding, multibaseEncode, resolveDID } from '@interop/did-method-webvh';
|
|
16
|
+
import { Ed25519VerificationKey } from '@interop/ed25519-verification-key';
|
|
17
|
+
import { getNode } from '@interop/did-web-resolver';
|
|
18
|
+
/**
|
|
19
|
+
* Multicodec `ed25519-pub` varint header. Prepended to a raw 32-byte Ed25519
|
|
20
|
+
* public key to form the multibase (`z6Mk...`) the key class expects.
|
|
21
|
+
*/
|
|
22
|
+
const ED25519_PUB_MULTICODEC_HEADER = Uint8Array.from([0xed, 0x01]);
|
|
23
|
+
/**
|
|
24
|
+
* Generic Ed25519 verifier for resolving a did:webvh history log. The webvh
|
|
25
|
+
* resolver verifies each log entry's `eddsa-jcs-2022` proof by calling
|
|
26
|
+
* `verify(signature, message, publicKey)` with the raw public-key bytes of that
|
|
27
|
+
* entry's update key, so -- unlike the fixed-key signer/verifier in
|
|
28
|
+
* `webvh-signer.ts` -- this reconstructs a key per call from those bytes.
|
|
29
|
+
*/
|
|
30
|
+
export const webvhLogVerifier = {
|
|
31
|
+
async verify(signature, message, publicKey) {
|
|
32
|
+
const multikey = new Uint8Array(ED25519_PUB_MULTICODEC_HEADER.length + publicKey.length);
|
|
33
|
+
multikey.set(ED25519_PUB_MULTICODEC_HEADER);
|
|
34
|
+
multikey.set(publicKey, ED25519_PUB_MULTICODEC_HEADER.length);
|
|
35
|
+
const publicKeyMultibase = multibaseEncode(multikey, MultibaseEncoding.BASE58_BTC);
|
|
36
|
+
const key = await Ed25519VerificationKey.from({ publicKeyMultibase });
|
|
37
|
+
return key.verifier().verify({ data: message, signature });
|
|
38
|
+
}
|
|
39
|
+
};
|
|
40
|
+
/**
|
|
41
|
+
* Build a `did:webvh` driver for the security document loader's resolver.
|
|
42
|
+
*
|
|
43
|
+
* @returns {{ method: string, get: (options: { did?: string, url?: string }) =>
|
|
44
|
+
* Promise<Record<string, unknown>> }}
|
|
45
|
+
*/
|
|
46
|
+
export function makeWebvhDriver() {
|
|
47
|
+
return {
|
|
48
|
+
method: 'webvh',
|
|
49
|
+
async get({ did, url } = {}) {
|
|
50
|
+
const didOrUrl = did ?? url;
|
|
51
|
+
if (!didOrUrl) {
|
|
52
|
+
throw new TypeError('A DID or a URL is required to resolve.');
|
|
53
|
+
}
|
|
54
|
+
// Separate the bare DID from any `?query` or `#fragment`.
|
|
55
|
+
const [didAuthority = ''] = didOrUrl.split(/[#?]/);
|
|
56
|
+
const fragment = didOrUrl.includes('#')
|
|
57
|
+
? didOrUrl.slice(didOrUrl.indexOf('#') + 1)
|
|
58
|
+
: undefined;
|
|
59
|
+
const { doc, meta } = await resolveDID(didAuthority, {
|
|
60
|
+
verifier: webvhLogVerifier
|
|
61
|
+
});
|
|
62
|
+
if (!doc) {
|
|
63
|
+
throw new Error(meta?.problemDetails?.detail ?? `Could not resolve "${didAuthority}".`);
|
|
64
|
+
}
|
|
65
|
+
if (fragment) {
|
|
66
|
+
// Dereference an individual subnode (key or service) by id.
|
|
67
|
+
return getNode({ didDocument: doc, id: `${doc.id}#${fragment}` });
|
|
68
|
+
}
|
|
69
|
+
return doc;
|
|
70
|
+
}
|
|
71
|
+
};
|
|
72
|
+
}
|
|
73
|
+
//# sourceMappingURL=webvh-driver.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"webvh-driver.js","sourceRoot":"","sources":["../../src/keys/webvh-driver.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AACH,OAAO,EACL,iBAAiB,EACjB,eAAe,EACf,UAAU,EACX,MAAM,2BAA2B,CAAA;AAClC,OAAO,EAAE,sBAAsB,EAAE,MAAM,mCAAmC,CAAA;AAC1E,OAAO,EAAE,OAAO,EAAE,MAAM,2BAA2B,CAAA;AAEnD;;;GAGG;AACH,MAAM,6BAA6B,GAAG,UAAU,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,CAAA;AAEnE;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,gBAAgB,GAAG;IAC9B,KAAK,CAAC,MAAM,CACV,SAAqB,EACrB,OAAmB,EACnB,SAAqB;QAErB,MAAM,QAAQ,GAAG,IAAI,UAAU,CAC7B,6BAA6B,CAAC,MAAM,GAAG,SAAS,CAAC,MAAM,CACxD,CAAA;QACD,QAAQ,CAAC,GAAG,CAAC,6BAA6B,CAAC,CAAA;QAC3C,QAAQ,CAAC,GAAG,CAAC,SAAS,EAAE,6BAA6B,CAAC,MAAM,CAAC,CAAA;QAC7D,MAAM,kBAAkB,GAAG,eAAe,CACxC,QAAQ,EACR,iBAAiB,CAAC,UAAU,CAC7B,CAAA;QACD,MAAM,GAAG,GAAG,MAAM,sBAAsB,CAAC,IAAI,CAAC,EAAE,kBAAkB,EAAE,CAAC,CAAA;QACrE,OAAO,GAAG,CAAC,QAAQ,EAAE,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,SAAS,EAAE,CAAC,CAAA;IAC5D,CAAC;CACF,CAAA;AAED;;;;;GAKG;AACH,MAAM,UAAU,eAAe;IAI7B,OAAO;QACL,MAAM,EAAE,OAAO;QACf,KAAK,CAAC,GAAG,CAAC,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE;YACzB,MAAM,QAAQ,GAAG,GAAG,IAAI,GAAG,CAAA;YAC3B,IAAI,CAAC,QAAQ,EAAE,CAAC;gBACd,MAAM,IAAI,SAAS,CAAC,wCAAwC,CAAC,CAAA;YAC/D,CAAC;YACD,0DAA0D;YAC1D,MAAM,CAAC,YAAY,GAAG,EAAE,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,MAAM,CAAC,CAAA;YAClD,MAAM,QAAQ,GAAG,QAAQ,CAAC,QAAQ,CAAC,GAAG,CAAC;gBACrC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;gBAC3C,CAAC,CAAC,SAAS,CAAA;YAEb,MAAM,EAAE,GAAG,EAAE,IAAI,EAAE,GAAG,MAAM,UAAU,CAAC,YAAY,EAAE;gBACnD,QAAQ,EAAE,gBAAgB;aAC3B,CAAC,CAAA;YACF,IAAI,CAAC,GAAG,EAAE,CAAC;gBACT,MAAM,IAAI,KAAK,CACb,IAAI,EAAE,cAAc,EAAE,MAAM,IAAI,sBAAsB,YAAY,IAAI,CACvE,CAAA;YACH,CAAC;YACD,IAAI,QAAQ,EAAE,CAAC;gBACb,4DAA4D;gBAC5D,OAAO,OAAO,CAAC,EAAE,WAAW,EAAE,GAAG,EAAE,EAAE,EAAE,GAAG,GAAG,CAAC,EAAE,IAAI,QAAQ,EAAE,EAAE,CAAC,CAAA;YACnE,CAAC;YACD,OAAO,GAAG,CAAA;QACZ,CAAC;KACF,CAAA;AACH,CAAC"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import type { Signer, Verifier } from '@interop/did-method-webvh';
|
|
2
|
+
/**
|
|
3
|
+
* Build a did:webvh `Signer` (and `Verifier`) backed by an Ed25519 key pair.
|
|
4
|
+
*
|
|
5
|
+
* `keyPair.signer()` requires `keyPair.id` to be set, so the caller must assign
|
|
6
|
+
* an id before signing; this helper derives the verification method id from the
|
|
7
|
+
* key's `publicKeyMultibase` (the did:key form the library validates against).
|
|
8
|
+
*
|
|
9
|
+
* @param options {object}
|
|
10
|
+
* @param options.keyPair {object} an `@interop/ed25519-verification-key` pair.
|
|
11
|
+
* @returns {Signer & Verifier}
|
|
12
|
+
*/
|
|
13
|
+
export declare function makeWebvhSigner({ keyPair }: {
|
|
14
|
+
keyPair: {
|
|
15
|
+
publicKeyMultibase: string;
|
|
16
|
+
signer(): {
|
|
17
|
+
sign(options: {
|
|
18
|
+
data: Uint8Array;
|
|
19
|
+
}): Promise<Uint8Array>;
|
|
20
|
+
};
|
|
21
|
+
verifier(): {
|
|
22
|
+
verify(options: {
|
|
23
|
+
data: Uint8Array;
|
|
24
|
+
signature: Uint8Array;
|
|
25
|
+
}): Promise<boolean>;
|
|
26
|
+
};
|
|
27
|
+
};
|
|
28
|
+
}): Signer & Verifier;
|
|
29
|
+
//# sourceMappingURL=webvh-signer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"webvh-signer.d.ts","sourceRoot":"","sources":["../../src/keys/webvh-signer.ts"],"names":[],"mappings":"AAkBA,OAAO,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,2BAA2B,CAAA;AAEjE;;;;;;;;;;GAUG;AACH,wBAAgB,eAAe,CAAC,EAC9B,OAAO,EACR,EAAE;IACD,OAAO,EAAE;QACP,kBAAkB,EAAE,MAAM,CAAA;QAC1B,MAAM,IAAI;YAAE,IAAI,CAAC,OAAO,EAAE;gBAAE,IAAI,EAAE,UAAU,CAAA;aAAE,GAAG,OAAO,CAAC,UAAU,CAAC,CAAA;SAAE,CAAA;QACtE,QAAQ,IAAI;YACV,MAAM,CAAC,OAAO,EAAE;gBACd,IAAI,EAAE,UAAU,CAAA;gBAChB,SAAS,EAAE,UAAU,CAAA;aACtB,GAAG,OAAO,CAAC,OAAO,CAAC,CAAA;SACrB,CAAA;KACF,CAAA;CACF,GAAG,MAAM,GAAG,QAAQ,CAiBpB"}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Bridge between the CLI's `@interop/ed25519-verification-key` key pair and the
|
|
3
|
+
* `Signer` / `Verifier` interfaces expected by `@interop/did-method-webvh`, so
|
|
4
|
+
* did:webvh reuses the same Ed25519 key class as did:key / did:web rather than
|
|
5
|
+
* pulling in a separate signing implementation.
|
|
6
|
+
*
|
|
7
|
+
* `createDID` both signs the initial log entry and verifies it before
|
|
8
|
+
* returning, so the bridge implements both interfaces: `sign({ document,
|
|
9
|
+
* proof })` returns a base58btc multibase `proofValue`, and `verify` checks an
|
|
10
|
+
* Ed25519 signature. `prepareDataForSigning` produces the bytes to sign (the
|
|
11
|
+
* `eddsa-jcs-2022` cryptosuite hash); the key pair's own `signer()` / `verifier()`
|
|
12
|
+
* do the cryptography.
|
|
13
|
+
*/
|
|
14
|
+
import { MultibaseEncoding, multibaseEncode, prepareDataForSigning } from '@interop/did-method-webvh';
|
|
15
|
+
/**
|
|
16
|
+
* Build a did:webvh `Signer` (and `Verifier`) backed by an Ed25519 key pair.
|
|
17
|
+
*
|
|
18
|
+
* `keyPair.signer()` requires `keyPair.id` to be set, so the caller must assign
|
|
19
|
+
* an id before signing; this helper derives the verification method id from the
|
|
20
|
+
* key's `publicKeyMultibase` (the did:key form the library validates against).
|
|
21
|
+
*
|
|
22
|
+
* @param options {object}
|
|
23
|
+
* @param options.keyPair {object} an `@interop/ed25519-verification-key` pair.
|
|
24
|
+
* @returns {Signer & Verifier}
|
|
25
|
+
*/
|
|
26
|
+
export function makeWebvhSigner({ keyPair }) {
|
|
27
|
+
const verificationMethodId = `did:key:${keyPair.publicKeyMultibase}#${keyPair.publicKeyMultibase}`;
|
|
28
|
+
return {
|
|
29
|
+
async sign({ document, proof }) {
|
|
30
|
+
const data = await prepareDataForSigning(document, proof);
|
|
31
|
+
const signature = await keyPair.signer().sign({ data });
|
|
32
|
+
return {
|
|
33
|
+
proofValue: multibaseEncode(signature, MultibaseEncoding.BASE58_BTC)
|
|
34
|
+
};
|
|
35
|
+
},
|
|
36
|
+
getVerificationMethodId() {
|
|
37
|
+
return verificationMethodId;
|
|
38
|
+
},
|
|
39
|
+
async verify(signature, message) {
|
|
40
|
+
return keyPair.verifier().verify({ data: message, signature });
|
|
41
|
+
}
|
|
42
|
+
};
|
|
43
|
+
}
|
|
44
|
+
//# sourceMappingURL=webvh-signer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"webvh-signer.js","sourceRoot":"","sources":["../../src/keys/webvh-signer.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AACH,OAAO,EACL,iBAAiB,EACjB,eAAe,EACf,qBAAqB,EACtB,MAAM,2BAA2B,CAAA;AAGlC;;;;;;;;;;GAUG;AACH,MAAM,UAAU,eAAe,CAAC,EAC9B,OAAO,EAYR;IACC,MAAM,oBAAoB,GAAG,WAAW,OAAO,CAAC,kBAAkB,IAAI,OAAO,CAAC,kBAAkB,EAAE,CAAA;IAClG,OAAO;QACL,KAAK,CAAC,IAAI,CAAC,EAAE,QAAQ,EAAE,KAAK,EAAE;YAC5B,MAAM,IAAI,GAAG,MAAM,qBAAqB,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAA;YACzD,MAAM,SAAS,GAAG,MAAM,OAAO,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,CAAC,CAAA;YACvD,OAAO;gBACL,UAAU,EAAE,eAAe,CAAC,SAAS,EAAE,iBAAiB,CAAC,UAAU,CAAC;aACrE,CAAA;QACH,CAAC;QACD,uBAAuB;YACrB,OAAO,oBAAoB,CAAA;QAC7B,CAAC;QACD,KAAK,CAAC,MAAM,CAAC,SAAS,EAAE,OAAO;YAC7B,OAAO,OAAO,CAAC,QAAQ,EAAE,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,SAAS,EAAE,CAAC,CAAA;QAChE,CAAC;KACF,CAAA;AACH,CAAC"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import { Ed25519VerificationKey } from '@interop/ed25519-verification-key';
|
|
2
|
+
import type { WebvhUpdateKey } from '../storage.js';
|
|
3
|
+
/**
|
|
4
|
+
* Reconstruct an update key pair from its stored `{ publicKeyMultibase,
|
|
5
|
+
* secretKeyMultibase }` record, so it can sign a new log entry.
|
|
6
|
+
*
|
|
7
|
+
* @param key {WebvhUpdateKey} must carry a `secretKeyMultibase`.
|
|
8
|
+
* @returns {Promise<Ed25519VerificationKey>}
|
|
9
|
+
*/
|
|
10
|
+
export declare function loadUpdateKey(key: WebvhUpdateKey): Promise<Ed25519VerificationKey>;
|
|
11
|
+
/**
|
|
12
|
+
* Export an update key pair to its persisted record.
|
|
13
|
+
*
|
|
14
|
+
* @param keyPair {Ed25519VerificationKey}
|
|
15
|
+
* @returns {Promise<{ publicKeyMultibase: string, secretKeyMultibase: string }>}
|
|
16
|
+
*/
|
|
17
|
+
export declare function exportUpdateKey(keyPair: Ed25519VerificationKey): Promise<{
|
|
18
|
+
publicKeyMultibase: string;
|
|
19
|
+
secretKeyMultibase: string;
|
|
20
|
+
}>;
|
|
21
|
+
/**
|
|
22
|
+
* Generate a fresh staged (pre-committed next) update key as the `staged` record
|
|
23
|
+
* to persist -- its public and secret multibase together with the `nextKeyHash`
|
|
24
|
+
* to commit in this entry's `nextKeyHashes`. The secret is carried in the record
|
|
25
|
+
* (and reconstructed via `loadUpdateKey` at the next rotation), so the key pair
|
|
26
|
+
* itself is not returned.
|
|
27
|
+
*
|
|
28
|
+
* @returns {Promise<WebvhUpdateKey & { nextKeyHash: string }>}
|
|
29
|
+
*/
|
|
30
|
+
export declare function generateStagedKey(): Promise<WebvhUpdateKey & {
|
|
31
|
+
nextKeyHash: string;
|
|
32
|
+
}>;
|
|
33
|
+
//# sourceMappingURL=webvh-update.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"webvh-update.d.ts","sourceRoot":"","sources":["../../src/keys/webvh-update.ts"],"names":[],"mappings":"AAaA,OAAO,EAAE,sBAAsB,EAAE,MAAM,mCAAmC,CAAA;AAC1E,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,eAAe,CAAA;AAEnD;;;;;;GAMG;AACH,wBAAsB,aAAa,CACjC,GAAG,EAAE,cAAc,GAClB,OAAO,CAAC,sBAAsB,CAAC,CAYjC;AAED;;;;;GAKG;AACH,wBAAsB,eAAe,CACnC,OAAO,EAAE,sBAAsB,GAC9B,OAAO,CAAC;IAAE,kBAAkB,EAAE,MAAM,CAAC;IAAC,kBAAkB,EAAE,MAAM,CAAA;CAAE,CAAC,CAMrE;AAED;;;;;;;;GAQG;AACH,wBAAsB,iBAAiB,IAAI,OAAO,CAChD,cAAc,GAAG;IAAE,WAAW,EAAE,MAAM,CAAA;CAAE,CACzC,CAMA"}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Helpers for did:webvh update (authorization) keys and key pre-rotation.
|
|
3
|
+
*
|
|
4
|
+
* Update keys are decoupled from the document's verification-method keys: they
|
|
5
|
+
* only authorize new log entries, and pre-rotation commits, in advance, to the
|
|
6
|
+
* hash of the key allowed to perform the next update. These helpers generate
|
|
7
|
+
* update keys, reconstruct them from their stored multibase secret, and derive
|
|
8
|
+
* the `nextKeyHash` committed in a log entry's `nextKeyHashes`. The hash is the
|
|
9
|
+
* one the library validates -- `deriveNextKeyHash(pub) =
|
|
10
|
+
* base58btc(multihash_sha2_256(sha256(utf8Bytes(pub))))` -- imported from
|
|
11
|
+
* `@interop/did-method-webvh` rather than re-implemented here.
|
|
12
|
+
*/
|
|
13
|
+
import { deriveNextKeyHash } from '@interop/did-method-webvh';
|
|
14
|
+
import { Ed25519VerificationKey } from '@interop/ed25519-verification-key';
|
|
15
|
+
/**
|
|
16
|
+
* Reconstruct an update key pair from its stored `{ publicKeyMultibase,
|
|
17
|
+
* secretKeyMultibase }` record, so it can sign a new log entry.
|
|
18
|
+
*
|
|
19
|
+
* @param key {WebvhUpdateKey} must carry a `secretKeyMultibase`.
|
|
20
|
+
* @returns {Promise<Ed25519VerificationKey>}
|
|
21
|
+
*/
|
|
22
|
+
export async function loadUpdateKey(key) {
|
|
23
|
+
if (!key.secretKeyMultibase) {
|
|
24
|
+
throw new Error('Cannot load an update key without its secret key.');
|
|
25
|
+
}
|
|
26
|
+
// `Ed25519VerificationKey.from` only loads the secret half (making the key
|
|
27
|
+
// able to sign) when the `Multikey` type is present, matching how the key is
|
|
28
|
+
// exported; the stored record omits it, so it is supplied here.
|
|
29
|
+
return Ed25519VerificationKey.from({
|
|
30
|
+
type: 'Multikey',
|
|
31
|
+
publicKeyMultibase: key.publicKeyMultibase,
|
|
32
|
+
secretKeyMultibase: key.secretKeyMultibase
|
|
33
|
+
});
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Export an update key pair to its persisted record.
|
|
37
|
+
*
|
|
38
|
+
* @param keyPair {Ed25519VerificationKey}
|
|
39
|
+
* @returns {Promise<{ publicKeyMultibase: string, secretKeyMultibase: string }>}
|
|
40
|
+
*/
|
|
41
|
+
export async function exportUpdateKey(keyPair) {
|
|
42
|
+
const { publicKeyMultibase, secretKeyMultibase } = await keyPair.export({
|
|
43
|
+
publicKey: true,
|
|
44
|
+
secretKey: true
|
|
45
|
+
});
|
|
46
|
+
return { publicKeyMultibase, secretKeyMultibase };
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Generate a fresh staged (pre-committed next) update key as the `staged` record
|
|
50
|
+
* to persist -- its public and secret multibase together with the `nextKeyHash`
|
|
51
|
+
* to commit in this entry's `nextKeyHashes`. The secret is carried in the record
|
|
52
|
+
* (and reconstructed via `loadUpdateKey` at the next rotation), so the key pair
|
|
53
|
+
* itself is not returned.
|
|
54
|
+
*
|
|
55
|
+
* @returns {Promise<WebvhUpdateKey & { nextKeyHash: string }>}
|
|
56
|
+
*/
|
|
57
|
+
export async function generateStagedKey() {
|
|
58
|
+
const { publicKeyMultibase, secretKeyMultibase } = await exportUpdateKey(await Ed25519VerificationKey.generate());
|
|
59
|
+
const nextKeyHash = await deriveNextKeyHash(publicKeyMultibase);
|
|
60
|
+
return { publicKeyMultibase, secretKeyMultibase, nextKeyHash };
|
|
61
|
+
}
|
|
62
|
+
//# sourceMappingURL=webvh-update.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"webvh-update.js","sourceRoot":"","sources":["../../src/keys/webvh-update.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AACH,OAAO,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAA;AAC7D,OAAO,EAAE,sBAAsB,EAAE,MAAM,mCAAmC,CAAA;AAG1E;;;;;;GAMG;AACH,MAAM,CAAC,KAAK,UAAU,aAAa,CACjC,GAAmB;IAEnB,IAAI,CAAC,GAAG,CAAC,kBAAkB,EAAE,CAAC;QAC5B,MAAM,IAAI,KAAK,CAAC,mDAAmD,CAAC,CAAA;IACtE,CAAC;IACD,2EAA2E;IAC3E,6EAA6E;IAC7E,gEAAgE;IAChE,OAAO,sBAAsB,CAAC,IAAI,CAAC;QACjC,IAAI,EAAE,UAAU;QAChB,kBAAkB,EAAE,GAAG,CAAC,kBAAkB;QAC1C,kBAAkB,EAAE,GAAG,CAAC,kBAAkB;KAC3C,CAAC,CAAA;AACJ,CAAC;AAED;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,eAAe,CACnC,OAA+B;IAE/B,MAAM,EAAE,kBAAkB,EAAE,kBAAkB,EAAE,GAAG,MAAM,OAAO,CAAC,MAAM,CAAC;QACtE,SAAS,EAAE,IAAI;QACf,SAAS,EAAE,IAAI;KAChB,CAAC,CAAA;IACF,OAAO,EAAE,kBAAkB,EAAE,kBAAkB,EAAE,CAAA;AACnD,CAAC;AAED;;;;;;;;GAQG;AACH,MAAM,CAAC,KAAK,UAAU,iBAAiB;IAGrC,MAAM,EAAE,kBAAkB,EAAE,kBAAkB,EAAE,GAAG,MAAM,eAAe,CACtE,MAAM,sBAAsB,CAAC,QAAQ,EAAE,CACxC,CAAA;IACD,MAAM,WAAW,GAAG,MAAM,iBAAiB,CAAC,kBAAkB,CAAC,CAAA;IAC/D,OAAO,EAAE,kBAAkB,EAAE,kBAAkB,EAAE,WAAW,EAAE,CAAA;AAChE,CAAC"}
|
package/dist/meta.d.ts
CHANGED
package/dist/meta.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"meta.d.ts","sourceRoot":"","sources":["../src/meta.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EASL,KAAK,WAAW,EACjB,MAAM,cAAc,CAAA;AAErB;;;;;;;;GAQG;AACH,wBAAgB,iBAAiB,CAAC,EAAE,SAAS,EAAE,EAAE;IAAE,SAAS,EAAE,MAAM,CAAA;CAAE,GAAG;IACvE,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,KAAK,CAAC,EAAE,MAAM,CAAA;CACf,CAQA;AAED;;;;;;;;;GASG;AACH,wBAAsB,qBAAqB,IAAI,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC,CAsB5E;AAED;;;;;;;;;GASG;AACH,wBAAsB,uBAAuB,CAAC,EAC5C,kBAAkB,EAClB,GAAG,EACJ,EAAE;IACD,kBAAkB,EAAE,MAAM,CAAA;IAC1B,GAAG,EAAE,MAAM,CAAA;CACZ,GAAG,OAAO,CAAC,IAAI,CAAC,CAgBhB;AAED;;;;;;;;;GASG;AACH,wBAAsB,uBAAuB,CAAC,EAC5C,kBAAkB,EAClB,GAAG,EACJ,EAAE;IACD,kBAAkB,EAAE,MAAM,CAAA;IAC1B,GAAG,EAAE,MAAM,CAAA;CACZ,GAAG,OAAO,CAAC,IAAI,CAAC,CAwBhB;AAED;;;;;;;;;;GAUG;AACH,wBAAsB,aAAa,CAAC,EAClC,GAAG,EACJ,EAAE;IACD,GAAG,EAAE,MAAM,CAAA;CACZ,GAAG,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAsB9B;AAED;;;;GAIG;AACH,MAAM,WAAW,UAAU;IACzB,EAAE,CAAC,EAAE,MAAM,CAAA;IACX,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,gBAAgB,CAAC,EAAE,MAAM,CAAA;IACzB,gBAAgB,CAAC,EAAE,MAAM,CAAA;IACzB,OAAO,CAAC,EAAE,MAAM,CAAA;CACjB;AAED;;;;;;;;;;GAUG;AACH,wBAAsB,cAAc,CAAC,EAAE,GAAG,EAAE,EAAE;IAAE,GAAG,EAAE,MAAM,CAAA;CAAE,GAAG,OAAO,CACnE;IACE,SAAS,EAAE,MAAM,CAAA;IACjB,IAAI,EAAE,UAAU,CAAA;IAChB,IAAI,CAAC,EAAE,WAAW,CAAA;CACnB,GACD,SAAS,CACZ,CAkCA;AAED;;;;GAIG;AACH,MAAM,WAAW,gBAAgB;IAC/B,EAAE,CAAC,EAAE,MAAM,CAAA;IACX,IAAI,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,CAAA;IACxB,MAAM,CAAC,EAAE,MAAM,GAAG;QAAE,EAAE,CAAC,EAAE,MAAM,CAAA;KAAE,CAAA;IACjC,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,cAAc,CAAC,EAAE,MAAM,CAAA;CACxB;AAED;;;;;;;;;;;GAWG;AACH,wBAAsB,oBAAoB,CAAC,EAAE,GAAG,EAAE,EAAE;IAAE,GAAG,EAAE,MAAM,CAAA;CAAE,GAAG,OAAO,CACzE;IACE,SAAS,EAAE,MAAM,CAAA;IACjB,UAAU,EAAE,gBAAgB,CAAA;IAC5B,IAAI,CAAC,EAAE,WAAW,CAAA;CACnB,GACD,SAAS,CACZ,CAmDA;AAED;;;;;;;;;;GAUG;AACH,wBAAsB,aAAa,CAAC,EAAE,GAAG,EAAE,EAAE;IAAE,GAAG,EAAE,MAAM,CAAA;CAAE,GAAG,OAAO,CAClE;IACE,SAAS,EAAE,MAAM,CAAA;IACjB,GAAG,EAAE;
|
|
1
|
+
{"version":3,"file":"meta.d.ts","sourceRoot":"","sources":["../src/meta.ts"],"names":[],"mappings":"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"}
|
package/dist/meta.js
CHANGED
|
@@ -16,7 +16,7 @@ import { findStoredKey, listCollection, listDids, loadDidDocument, loadDidMeta,
|
|
|
16
16
|
* @returns {{date?: string, type?: string, curve?: string}}
|
|
17
17
|
*/
|
|
18
18
|
export function parseKeyStorageId({ storageId }) {
|
|
19
|
-
const match = storageId.match(/^(\d{4}-\d{2}-\d{2})-(ed25519|ecdsa|x25519)(?:-(p\d{3}))?-/);
|
|
19
|
+
const match = storageId.match(/^(\d{4}-\d{2}-\d{2})-(ed25519|ecdsa|x25519|hmac)(?:-(p\d{3}))?-/);
|
|
20
20
|
if (!match) {
|
|
21
21
|
return {};
|
|
22
22
|
}
|
package/dist/meta.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"meta.js","sourceRoot":"","sources":["../src/meta.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EACL,aAAa,EACb,cAAc,EACd,QAAQ,EACR,eAAe,EACf,WAAW,EACX,kBAAkB,EAClB,sBAAsB,EACtB,oBAAoB,EAErB,MAAM,cAAc,CAAA;AAErB;;;;;;;;GAQG;AACH,MAAM,UAAU,iBAAiB,CAAC,EAAE,SAAS,EAAyB;IAKpE,MAAM,KAAK,GAAG,SAAS,CAAC,KAAK,CAC3B,
|
|
1
|
+
{"version":3,"file":"meta.js","sourceRoot":"","sources":["../src/meta.ts"],"names":[],"mappings":"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"}
|