@metalabel/dfos-protocol 0.44.0 → 0.46.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.
@@ -0,0 +1,981 @@
1
+ import {
2
+ ED25519_PUB_MULTICODEC,
3
+ decodeMultikey,
4
+ encodeEd25519Multikey
5
+ } from "./chunk-IDVYITX7.js";
6
+ import {
7
+ base64urlDecode,
8
+ base64urlEncode,
9
+ importEd25519Keypair,
10
+ isValidEd25519Signature,
11
+ sha256,
12
+ signPayloadEd25519
13
+ } from "./chunk-4LG2GEB2.js";
14
+
15
+ // src/key-proof/role-set.ts
16
+ var KEY_ROLES = ["auth", "assert", "controller"];
17
+ var isKeyRole = (value) => KEY_ROLES.includes(value);
18
+ var serializeRoleSet = (roles) => {
19
+ const present = /* @__PURE__ */ new Set();
20
+ for (const role of roles) {
21
+ if (!isKeyRole(role)) {
22
+ throw new Error(`invalid role set: unknown role ${JSON.stringify(role)}`);
23
+ }
24
+ present.add(role);
25
+ }
26
+ if (present.size === 0) throw new Error("invalid role set: must name at least one role");
27
+ return KEY_ROLES.filter((role) => present.has(role)).join(",");
28
+ };
29
+ var parseRoleSet = (value) => {
30
+ const parts = value.split(",");
31
+ const roles = [];
32
+ const seen = /* @__PURE__ */ new Set();
33
+ for (const part of parts) {
34
+ if (!isKeyRole(part) || seen.has(part)) return null;
35
+ seen.add(part);
36
+ roles.push(part);
37
+ }
38
+ if (roles.join(",") !== KEY_ROLES.filter((role) => seen.has(role)).join(",")) return null;
39
+ return roles;
40
+ };
41
+ var isCanonicalRoleSet = (value) => parseRoleSet(value) !== null;
42
+ var roleSetCovers = (value, role) => parseRoleSet(value)?.includes(role) ?? false;
43
+
44
+ // src/key-proof/key-proof.ts
45
+ var KEY_ADD_JWS_TYP = "did:dfos:key-add";
46
+ var MAX_KEY_PROOF_SIZE = 4096;
47
+ var DEFAULT_KEY_PROOF_SKEW_SECONDS = 300;
48
+ var KeyProofVerifyError = class extends Error {
49
+ reason;
50
+ constructor(reason, message) {
51
+ super(message);
52
+ this.name = "KeyProofVerifyError";
53
+ this.reason = reason;
54
+ }
55
+ };
56
+ var invalid = (reason, message) => new KeyProofVerifyError(reason, `invalid key proof: ${message}`);
57
+ var encoder = new TextEncoder();
58
+ var KEY_PROOF_MEMBERS = [
59
+ "nonce",
60
+ "audience",
61
+ "did",
62
+ "roleSet",
63
+ "prevCID",
64
+ "publicKeyMultibase",
65
+ "timestamp"
66
+ ];
67
+ var LONE_SURROGATE = /[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?<![\uD800-\uDBFF])[\uDC00-\uDFFF]/;
68
+ var WHOLE_SECOND_TIMESTAMP = /^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}\.000Z$/;
69
+ var PROTOCOL_TIMESTAMP = /^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}\.\d{3}Z$/;
70
+ var validateKeyProofPayload = (value) => {
71
+ if (typeof value !== "object" || value === null || Array.isArray(value)) {
72
+ throw invalid("schema", "expected a JSON object");
73
+ }
74
+ const raw = value;
75
+ for (const member of Object.keys(raw)) {
76
+ if (!KEY_PROOF_MEMBERS.includes(member)) {
77
+ throw invalid("schema", `unknown member ${JSON.stringify(member)} \u2014 the payload is closed`);
78
+ }
79
+ }
80
+ for (const member of KEY_PROOF_MEMBERS) {
81
+ if (typeof raw[member] !== "string" || raw[member] === "") {
82
+ throw invalid("schema", `${member} must be a non-empty string`);
83
+ }
84
+ if (LONE_SURROGATE.test(raw[member])) {
85
+ throw invalid("schema", `${member} must be well-formed Unicode`);
86
+ }
87
+ }
88
+ const nonce = raw["nonce"];
89
+ const audience = raw["audience"];
90
+ const did = raw["did"];
91
+ const roleSet = raw["roleSet"];
92
+ const prevCID = raw["prevCID"];
93
+ const publicKeyMultibase = raw["publicKeyMultibase"];
94
+ const timestamp = raw["timestamp"];
95
+ if (audience !== audience.toLowerCase() || /[\s/\\?#]/.test(audience)) {
96
+ throw invalid("schema", "audience must be a lowercase authority, without a scheme or path");
97
+ }
98
+ if (!isCanonicalRoleSet(roleSet)) {
99
+ throw invalid(
100
+ "schema",
101
+ "roleSet must be a canonical, non-empty subset of auth,assert,controller in that order"
102
+ );
103
+ }
104
+ const parsedMs = WHOLE_SECOND_TIMESTAMP.test(timestamp) ? Date.parse(timestamp) : Number.NaN;
105
+ if (!Number.isFinite(parsedMs) || new Date(parsedMs).toISOString() !== timestamp) {
106
+ throw invalid("schema", "timestamp must be ISO-8601 UTC whole-second .000Z");
107
+ }
108
+ return { nonce, audience, did, roleSet, prevCID, publicKeyMultibase, timestamp };
109
+ };
110
+ var keyProofSigningInput = (payload) => encoder.encode(JSON.stringify(keyProofPayloadObject(validateKeyProofPayload(payload))));
111
+ var keyProofPayloadObject = (payload) => ({
112
+ nonce: payload.nonce,
113
+ audience: payload.audience,
114
+ did: payload.did,
115
+ roleSet: payload.roleSet,
116
+ prevCID: payload.prevCID,
117
+ publicKeyMultibase: payload.publicKeyMultibase,
118
+ timestamp: payload.timestamp
119
+ });
120
+ var bytesEqual = (a, b) => a.length === b.length && a.every((byte, index) => byte === b[index]);
121
+ var normalizeTimestamp = (ms) => new Date(Math.floor(ms / 1e3) * 1e3).toISOString();
122
+ var signKeyProof = async (input) => {
123
+ if (input.typ === "") {
124
+ throw new Error("invalid key proof: typ must be a registered purpose value");
125
+ }
126
+ const { publicKey } = importEd25519Keypair(input.privateKey);
127
+ let timestamp;
128
+ if (input.timestamp === void 0) {
129
+ timestamp = normalizeTimestamp(input.now ? input.now() : Date.now());
130
+ } else {
131
+ const ms = Date.parse(input.timestamp);
132
+ if (!PROTOCOL_TIMESTAMP.test(input.timestamp) || !Number.isFinite(ms) || new Date(ms).toISOString() !== input.timestamp) {
133
+ throw new Error(`invalid key proof: unparseable timestamp: ${input.timestamp}`);
134
+ }
135
+ timestamp = normalizeTimestamp(ms);
136
+ }
137
+ const payload = validateKeyProofPayload({
138
+ nonce: input.nonce,
139
+ audience: input.audience,
140
+ did: input.did,
141
+ roleSet: input.roleSet,
142
+ prevCID: input.prevCID,
143
+ publicKeyMultibase: encodeEd25519Multikey(publicKey),
144
+ timestamp
145
+ });
146
+ const headerB64 = base64urlEncode(JSON.stringify({ alg: "EdDSA", typ: input.typ }));
147
+ const payloadB64 = base64urlEncode(keyProofSigningInput(payload));
148
+ const signingInput = `${headerB64}.${payloadB64}`;
149
+ const signature = signPayloadEd25519(encoder.encode(signingInput), input.privateKey);
150
+ const proof = `${signingInput}.${base64urlEncode(signature)}`;
151
+ if (proof.length > MAX_KEY_PROOF_SIZE) {
152
+ throw new Error(`key proof exceeds max size: ${proof.length} > ${MAX_KEY_PROOF_SIZE}`);
153
+ }
154
+ return { proof, payload };
155
+ };
156
+ var decodeKeyProof = (jws, expectedTyp) => {
157
+ if (jws.length > MAX_KEY_PROOF_SIZE) {
158
+ throw invalid("size", `envelope exceeds max size: ${jws.length} > ${MAX_KEY_PROOF_SIZE}`);
159
+ }
160
+ const parts = jws.split(".");
161
+ if (parts.length !== 3) throw invalid("header", "failed to decode JWS");
162
+ const [headerB64, payloadB64, signatureB64] = parts;
163
+ let header;
164
+ try {
165
+ const decoded = JSON.parse(
166
+ new TextDecoder("utf-8", { fatal: true }).decode(base64urlDecode(headerB64))
167
+ );
168
+ if (typeof decoded !== "object" || decoded === null || Array.isArray(decoded)) {
169
+ throw new Error("protected header must be an object");
170
+ }
171
+ header = decoded;
172
+ } catch (err) {
173
+ throw invalid("header", err instanceof Error ? err.message : "failed to decode header");
174
+ }
175
+ if (header["alg"] !== "EdDSA") {
176
+ throw invalid("header", `unsupported algorithm: ${String(header["alg"])}`);
177
+ }
178
+ if ("crit" in header) throw invalid("header", "crit header is not supported");
179
+ for (const member of ["jwk", "jku", "x5c", "x5u"]) {
180
+ if (member in header) {
181
+ throw invalid("header", `${member} header is not allowed (the key rides in the payload)`);
182
+ }
183
+ }
184
+ if ("kid" in header) {
185
+ throw invalid("header", "kid must be absent \u2014 the candidate key is in no chain");
186
+ }
187
+ const typ = header["typ"];
188
+ if (typeof typ !== "string" || typ !== expectedTyp) {
189
+ throw invalid("header", `invalid typ: expected ${expectedTyp}, got ${String(typ)}`);
190
+ }
191
+ let payload;
192
+ try {
193
+ const payloadBytes = base64urlDecode(payloadB64);
194
+ const source = new TextDecoder("utf-8", { fatal: true }).decode(payloadBytes);
195
+ payload = validateKeyProofPayload(JSON.parse(source));
196
+ if (!bytesEqual(keyProofSigningInput(payload), payloadBytes)) {
197
+ throw invalid("schema", "payload is not the canonical signing input for its members");
198
+ }
199
+ } catch (err) {
200
+ if (err instanceof KeyProofVerifyError) throw err;
201
+ throw invalid("schema", err instanceof Error ? err.message : "payload is not valid UTF-8 JSON");
202
+ }
203
+ return { payload, headerB64, payloadB64, signatureB64, typ };
204
+ };
205
+ var verifyKeyProofSignature = (decoded) => {
206
+ let keyBytes;
207
+ try {
208
+ const key = decodeMultikey(decoded.payload.publicKeyMultibase);
209
+ if (key.codec !== ED25519_PUB_MULTICODEC) {
210
+ throw new Error("publicKeyMultibase is not an Ed25519 public key");
211
+ }
212
+ keyBytes = key.keyBytes;
213
+ } catch (err) {
214
+ throw invalid(
215
+ "signature",
216
+ err instanceof Error ? err.message : "undecodable publicKeyMultibase"
217
+ );
218
+ }
219
+ let verified = false;
220
+ try {
221
+ verified = isValidEd25519Signature(
222
+ encoder.encode(`${decoded.headerB64}.${decoded.payloadB64}`),
223
+ base64urlDecode(decoded.signatureB64),
224
+ keyBytes
225
+ );
226
+ } catch {
227
+ verified = false;
228
+ }
229
+ if (!verified) throw invalid("signature", "signature does not verify against publicKeyMultibase");
230
+ };
231
+ var verifyKeyProof = (jws, options) => {
232
+ if (options.expectedTyp === "") {
233
+ throw new Error("invalid key proof verifier: expectedTyp must be a registered purpose value");
234
+ }
235
+ if (options.expectedAudience === "") {
236
+ throw new Error("invalid key proof verifier: expectedAudience must name this authority");
237
+ }
238
+ if (options.expectedDid === "") {
239
+ throw new Error("invalid key proof verifier: expectedDid must name the chain");
240
+ }
241
+ if (options.expectedPrevCID === "") {
242
+ throw new Error("invalid key proof verifier: expectedPrevCID must name the chain head");
243
+ }
244
+ if (!isCanonicalRoleSet(options.expectedRoleSet)) {
245
+ throw new Error(
246
+ "invalid key proof verifier: expectedRoleSet must be a canonical role set \u2014 build it with serializeRoleSet"
247
+ );
248
+ }
249
+ const maxSkew = options.maxSkewSeconds ?? DEFAULT_KEY_PROOF_SKEW_SECONDS;
250
+ if (!Number.isSafeInteger(maxSkew) || maxSkew < 0) {
251
+ throw new Error("invalid key proof verifier: maxSkewSeconds must be a non-negative integer");
252
+ }
253
+ const decoded = decodeKeyProof(jws, options.expectedTyp);
254
+ const payload = decoded.payload;
255
+ if (payload.audience !== options.expectedAudience) {
256
+ throw invalid("audience", "audience does not match this verifier authority");
257
+ }
258
+ if (payload.did !== options.expectedDid) {
259
+ throw invalid("did", "did does not match the chain this ceremony completes for");
260
+ }
261
+ if (payload.roleSet !== options.expectedRoleSet) {
262
+ throw invalid("roleSet", "roleSet does not match the roles this ceremony grants");
263
+ }
264
+ if (payload.prevCID !== options.expectedPrevCID) {
265
+ throw invalid("prevCID", "prevCID does not match the chain head this introduction builds on");
266
+ }
267
+ const now = Math.floor((options.now ? options.now() : Date.now()) / 1e3);
268
+ const issued = Math.floor(Date.parse(payload.timestamp) / 1e3);
269
+ if (Math.abs(now - issued) > maxSkew) {
270
+ throw invalid("freshness", "timestamp is outside the acceptance window");
271
+ }
272
+ verifyKeyProofSignature(decoded);
273
+ return { payload, typ: decoded.typ, now };
274
+ };
275
+ var unsafeKeyProofSubject = (jws) => {
276
+ const parts = jws.split(".");
277
+ if (parts.length !== 3) return null;
278
+ try {
279
+ const decoded = JSON.parse(
280
+ new TextDecoder("utf-8", { fatal: true }).decode(base64urlDecode(parts[1]))
281
+ );
282
+ if (typeof decoded !== "object" || decoded === null || Array.isArray(decoded)) return null;
283
+ const subject = decoded["publicKeyMultibase"];
284
+ return typeof subject === "string" ? subject : null;
285
+ } catch {
286
+ return null;
287
+ }
288
+ };
289
+ var verifyChainKeyProof = (jws, options) => {
290
+ if (options.expectedTyp === "") {
291
+ throw new Error("invalid key proof verifier: expectedTyp must be a registered purpose value");
292
+ }
293
+ const decoded = decodeKeyProof(jws, options.expectedTyp);
294
+ const payload = decoded.payload;
295
+ if (payload.publicKeyMultibase !== options.publicKeyMultibase) {
296
+ throw invalid("key", "publicKeyMultibase is not the key being introduced");
297
+ }
298
+ if (payload.did !== options.did) {
299
+ throw invalid("did", "did is not this chain");
300
+ }
301
+ if (payload.prevCID !== options.prevCID) {
302
+ throw invalid("prevCID", "prevCID is not the carrying operation previousOperationCID");
303
+ }
304
+ if (!roleSetCovers(payload.roleSet, options.role)) {
305
+ throw invalid("roleSet", `roleSet does not cover the ${options.role} role`);
306
+ }
307
+ verifyKeyProofSignature(decoded);
308
+ return payload;
309
+ };
310
+
311
+ // src/key-proof/pgp-word-list.ts
312
+ var PGP_EVEN_WORDS = [
313
+ "aardvark",
314
+ "absurd",
315
+ "accrue",
316
+ "acme",
317
+ // 00
318
+ "adrift",
319
+ "adult",
320
+ "afflict",
321
+ "ahead",
322
+ // 04
323
+ "aimless",
324
+ "algol",
325
+ "allow",
326
+ "alone",
327
+ // 08
328
+ "ammo",
329
+ "ancient",
330
+ "apple",
331
+ "artist",
332
+ // 0c
333
+ "assume",
334
+ "athens",
335
+ "atlas",
336
+ "aztec",
337
+ // 10
338
+ "baboon",
339
+ "backfield",
340
+ "backward",
341
+ "banjo",
342
+ // 14
343
+ "beaming",
344
+ "bedlamp",
345
+ "beehive",
346
+ "beeswax",
347
+ // 18
348
+ "befriend",
349
+ "belfast",
350
+ "berserk",
351
+ "billiard",
352
+ // 1c
353
+ "bison",
354
+ "blackjack",
355
+ "blockade",
356
+ "blowtorch",
357
+ // 20
358
+ "bluebird",
359
+ "bombast",
360
+ "bookshelf",
361
+ "brackish",
362
+ // 24
363
+ "breadline",
364
+ "breakup",
365
+ "brickyard",
366
+ "briefcase",
367
+ // 28
368
+ "burbank",
369
+ "button",
370
+ "buzzard",
371
+ "cement",
372
+ // 2c
373
+ "chairlift",
374
+ "chatter",
375
+ "checkup",
376
+ "chisel",
377
+ // 30
378
+ "choking",
379
+ "chopper",
380
+ "christmas",
381
+ "clamshell",
382
+ // 34
383
+ "classic",
384
+ "classroom",
385
+ "cleanup",
386
+ "clockwork",
387
+ // 38
388
+ "cobra",
389
+ "commence",
390
+ "concert",
391
+ "cowbell",
392
+ // 3c
393
+ "crackdown",
394
+ "cranky",
395
+ "crowfoot",
396
+ "crucial",
397
+ // 40
398
+ "crumpled",
399
+ "crusade",
400
+ "cubic",
401
+ "dashboard",
402
+ // 44
403
+ "deadbolt",
404
+ "deckhand",
405
+ "dogsled",
406
+ "dragnet",
407
+ // 48
408
+ "drainage",
409
+ "dreadful",
410
+ "drifter",
411
+ "dropper",
412
+ // 4c
413
+ "drumbeat",
414
+ "drunken",
415
+ "dupont",
416
+ "dwelling",
417
+ // 50
418
+ "eating",
419
+ "edict",
420
+ "egghead",
421
+ "eightball",
422
+ // 54
423
+ "endorse",
424
+ "endow",
425
+ "enlist",
426
+ "erase",
427
+ // 58
428
+ "escape",
429
+ "exceed",
430
+ "eyeglass",
431
+ "eyetooth",
432
+ // 5c
433
+ "facial",
434
+ "fallout",
435
+ "flagpole",
436
+ "flatfoot",
437
+ // 60
438
+ "flytrap",
439
+ "fracture",
440
+ "framework",
441
+ "freedom",
442
+ // 64
443
+ "frighten",
444
+ "gazelle",
445
+ "geiger",
446
+ "glitter",
447
+ // 68
448
+ "glucose",
449
+ "goggles",
450
+ "goldfish",
451
+ "gremlin",
452
+ // 6c
453
+ "guidance",
454
+ "hamlet",
455
+ "highchair",
456
+ "hockey",
457
+ // 70
458
+ "indoors",
459
+ "indulge",
460
+ "inverse",
461
+ "involve",
462
+ // 74
463
+ "island",
464
+ "jawbone",
465
+ "keyboard",
466
+ "kickoff",
467
+ // 78
468
+ "kiwi",
469
+ "klaxon",
470
+ "locale",
471
+ "lockup",
472
+ // 7c
473
+ "merit",
474
+ "minnow",
475
+ "miser",
476
+ "mohawk",
477
+ // 80
478
+ "mural",
479
+ "music",
480
+ "necklace",
481
+ "neptune",
482
+ // 84
483
+ "newborn",
484
+ "nightbird",
485
+ "oakland",
486
+ "obtuse",
487
+ // 88
488
+ "offload",
489
+ "optic",
490
+ "orca",
491
+ "payday",
492
+ // 8c
493
+ "peachy",
494
+ "pheasant",
495
+ "physique",
496
+ "playhouse",
497
+ // 90
498
+ "pluto",
499
+ "preclude",
500
+ "prefer",
501
+ "preshrunk",
502
+ // 94
503
+ "printer",
504
+ "prowler",
505
+ "pupil",
506
+ "puppy",
507
+ // 98
508
+ "python",
509
+ "quadrant",
510
+ "quiver",
511
+ "quota",
512
+ // 9c
513
+ "ragtime",
514
+ "ratchet",
515
+ "rebirth",
516
+ "reform",
517
+ // a0
518
+ "regain",
519
+ "reindeer",
520
+ "rematch",
521
+ "repay",
522
+ // a4
523
+ "retouch",
524
+ "revenge",
525
+ "reward",
526
+ "rhythm",
527
+ // a8
528
+ "ribcage",
529
+ "ringbolt",
530
+ "robust",
531
+ "rocker",
532
+ // ac
533
+ "ruffled",
534
+ "sailboat",
535
+ "sawdust",
536
+ "scallion",
537
+ // b0
538
+ "scenic",
539
+ "scorecard",
540
+ "scotland",
541
+ "seabird",
542
+ // b4
543
+ "select",
544
+ "sentence",
545
+ "shadow",
546
+ "shamrock",
547
+ // b8
548
+ "showgirl",
549
+ "skullcap",
550
+ "skydive",
551
+ "slingshot",
552
+ // bc
553
+ "slowdown",
554
+ "snapline",
555
+ "snapshot",
556
+ "snowcap",
557
+ // c0
558
+ "snowslide",
559
+ "solo",
560
+ "southward",
561
+ "soybean",
562
+ // c4
563
+ "spaniel",
564
+ "spearhead",
565
+ "spellbind",
566
+ "spheroid",
567
+ // c8
568
+ "spigot",
569
+ "spindle",
570
+ "spyglass",
571
+ "stagehand",
572
+ // cc
573
+ "stagnate",
574
+ "stairway",
575
+ "standard",
576
+ "stapler",
577
+ // d0
578
+ "steamship",
579
+ "sterling",
580
+ "stockman",
581
+ "stopwatch",
582
+ // d4
583
+ "stormy",
584
+ "sugar",
585
+ "surmount",
586
+ "suspense",
587
+ // d8
588
+ "sweatband",
589
+ "swelter",
590
+ "tactics",
591
+ "talon",
592
+ // dc
593
+ "tapeworm",
594
+ "tempest",
595
+ "tiger",
596
+ "tissue",
597
+ // e0
598
+ "tonic",
599
+ "topmost",
600
+ "tracker",
601
+ "transit",
602
+ // e4
603
+ "trauma",
604
+ "treadmill",
605
+ "trojan",
606
+ "trouble",
607
+ // e8
608
+ "tumor",
609
+ "tunnel",
610
+ "tycoon",
611
+ "uncut",
612
+ // ec
613
+ "unearth",
614
+ "unwind",
615
+ "uproot",
616
+ "upset",
617
+ // f0
618
+ "upshot",
619
+ "vapor",
620
+ "village",
621
+ "virus",
622
+ // f4
623
+ "vulcan",
624
+ "waffle",
625
+ "wallet",
626
+ "watchword",
627
+ // f8
628
+ "wayside",
629
+ "willow",
630
+ "woodlark",
631
+ "zulu"
632
+ // fc
633
+ ];
634
+ var PGP_ODD_WORDS = [
635
+ "adroitness",
636
+ "adviser",
637
+ "aftermath",
638
+ "aggregate",
639
+ // 00
640
+ "alkali",
641
+ "almighty",
642
+ "amulet",
643
+ "amusement",
644
+ // 04
645
+ "antenna",
646
+ "applicant",
647
+ "apollo",
648
+ "armistice",
649
+ // 08
650
+ "article",
651
+ "asteroid",
652
+ "atlantic",
653
+ "atmosphere",
654
+ // 0c
655
+ "autopsy",
656
+ "babylon",
657
+ "backwater",
658
+ "barbecue",
659
+ // 10
660
+ "belowground",
661
+ "bifocals",
662
+ "bodyguard",
663
+ "bookseller",
664
+ // 14
665
+ "borderline",
666
+ "bottomless",
667
+ "bradbury",
668
+ "bravado",
669
+ // 18
670
+ "brazilian",
671
+ "breakaway",
672
+ "burlington",
673
+ "businessman",
674
+ // 1c
675
+ "butterfat",
676
+ "camelot",
677
+ "candidate",
678
+ "cannonball",
679
+ // 20
680
+ "capricorn",
681
+ "caravan",
682
+ "caretaker",
683
+ "celebrate",
684
+ // 24
685
+ "cellulose",
686
+ "certify",
687
+ "chambermaid",
688
+ "cherokee",
689
+ // 28
690
+ "chicago",
691
+ "clergyman",
692
+ "coherence",
693
+ "combustion",
694
+ // 2c
695
+ "commando",
696
+ "company",
697
+ "component",
698
+ "concurrent",
699
+ // 30
700
+ "confidence",
701
+ "conformist",
702
+ "congregate",
703
+ "consensus",
704
+ // 34
705
+ "consulting",
706
+ "corporate",
707
+ "corrosion",
708
+ "councilman",
709
+ // 38
710
+ "crossover",
711
+ "crucifix",
712
+ "cumbersome",
713
+ "customer",
714
+ // 3c
715
+ "dakota",
716
+ "decadence",
717
+ "december",
718
+ "decimal",
719
+ // 40
720
+ "designing",
721
+ "detector",
722
+ "detergent",
723
+ "determine",
724
+ // 44
725
+ "dictator",
726
+ "dinosaur",
727
+ "direction",
728
+ "disable",
729
+ // 48
730
+ "disbelief",
731
+ "disruptive",
732
+ "distortion",
733
+ "document",
734
+ // 4c
735
+ "embezzle",
736
+ "enchanting",
737
+ "enrollment",
738
+ "enterprise",
739
+ // 50
740
+ "equation",
741
+ "equipment",
742
+ "escapade",
743
+ "eskimo",
744
+ // 54
745
+ "everyday",
746
+ "examine",
747
+ "existence",
748
+ "exodus",
749
+ // 58
750
+ "fascinate",
751
+ "filament",
752
+ "finicky",
753
+ "forever",
754
+ // 5c
755
+ "fortitude",
756
+ "frequency",
757
+ "gadgetry",
758
+ "galveston",
759
+ // 60
760
+ "getaway",
761
+ "glossary",
762
+ "gossamer",
763
+ "graduate",
764
+ // 64
765
+ "gravity",
766
+ "guitarist",
767
+ "hamburger",
768
+ "hamilton",
769
+ // 68
770
+ "handiwork",
771
+ "hazardous",
772
+ "headwaters",
773
+ "hemisphere",
774
+ // 6c
775
+ "hesitate",
776
+ "hideaway",
777
+ "holiness",
778
+ "hurricane",
779
+ // 70
780
+ "hydraulic",
781
+ "impartial",
782
+ "impetus",
783
+ "inception",
784
+ // 74
785
+ "indigo",
786
+ "inertia",
787
+ "infancy",
788
+ "inferno",
789
+ // 78
790
+ "informant",
791
+ "insincere",
792
+ "insurgent",
793
+ "integrate",
794
+ // 7c
795
+ "intention",
796
+ "inventive",
797
+ "istanbul",
798
+ "jamaica",
799
+ // 80
800
+ "jupiter",
801
+ "leprosy",
802
+ "letterhead",
803
+ "liberty",
804
+ // 84
805
+ "maritime",
806
+ "matchmaker",
807
+ "maverick",
808
+ "medusa",
809
+ // 88
810
+ "megaton",
811
+ "microscope",
812
+ "microwave",
813
+ "midsummer",
814
+ // 8c
815
+ "millionaire",
816
+ "miracle",
817
+ "misnomer",
818
+ "molasses",
819
+ // 90
820
+ "molecule",
821
+ "montana",
822
+ "monument",
823
+ "mosquito",
824
+ // 94
825
+ "narrative",
826
+ "nebula",
827
+ "newsletter",
828
+ "norwegian",
829
+ // 98
830
+ "october",
831
+ "ohio",
832
+ "onlooker",
833
+ "opulent",
834
+ // 9c
835
+ "orlando",
836
+ "outfielder",
837
+ "pacific",
838
+ "pandemic",
839
+ // a0
840
+ "pandora",
841
+ "paperweight",
842
+ "paragon",
843
+ "paragraph",
844
+ // a4
845
+ "paramount",
846
+ "passenger",
847
+ "pedigree",
848
+ "pegasus",
849
+ // a8
850
+ "penetrate",
851
+ "perceptive",
852
+ "performance",
853
+ "pharmacy",
854
+ // ac
855
+ "phonetic",
856
+ "photograph",
857
+ "pioneer",
858
+ "pocketful",
859
+ // b0
860
+ "politeness",
861
+ "positive",
862
+ "potato",
863
+ "processor",
864
+ // b4
865
+ "provincial",
866
+ "proximate",
867
+ "puberty",
868
+ "publisher",
869
+ // b8
870
+ "pyramid",
871
+ "quantity",
872
+ "racketeer",
873
+ "rebellion",
874
+ // bc
875
+ "recipe",
876
+ "recover",
877
+ "repellent",
878
+ "replica",
879
+ // c0
880
+ "reproduce",
881
+ "resistor",
882
+ "responsive",
883
+ "retraction",
884
+ // c4
885
+ "retrieval",
886
+ "retrospect",
887
+ "revenue",
888
+ "revival",
889
+ // c8
890
+ "revolver",
891
+ "sandalwood",
892
+ "sardonic",
893
+ "saturday",
894
+ // cc
895
+ "savagery",
896
+ "scavenger",
897
+ "sensation",
898
+ "sociable",
899
+ // d0
900
+ "souvenir",
901
+ "specialist",
902
+ "speculate",
903
+ "stethoscope",
904
+ // d4
905
+ "stupendous",
906
+ "supportive",
907
+ "surrender",
908
+ "suspicious",
909
+ // d8
910
+ "sympathy",
911
+ "tambourine",
912
+ "telephone",
913
+ "therapist",
914
+ // dc
915
+ "tobacco",
916
+ "tolerance",
917
+ "tomorrow",
918
+ "torpedo",
919
+ // e0
920
+ "tradition",
921
+ "travesty",
922
+ "trombonist",
923
+ "truncated",
924
+ // e4
925
+ "typewriter",
926
+ "ultimate",
927
+ "undaunted",
928
+ "underfoot",
929
+ // e8
930
+ "unicorn",
931
+ "unify",
932
+ "universe",
933
+ "unravel",
934
+ // ec
935
+ "upcoming",
936
+ "vacancy",
937
+ "vagabond",
938
+ "vertigo",
939
+ // f0
940
+ "virginia",
941
+ "visitor",
942
+ "vocalist",
943
+ "voyager",
944
+ // f4
945
+ "warranty",
946
+ "waterloo",
947
+ "whimsical",
948
+ "wichita",
949
+ // f8
950
+ "wilmington",
951
+ "wyoming",
952
+ "yesteryear",
953
+ "yucatan"
954
+ // fc
955
+ ];
956
+ var pgpWords = (data) => Array.from(
957
+ data,
958
+ (byte, index) => index % 2 === 0 ? PGP_EVEN_WORDS[byte] : PGP_ODD_WORDS[byte]
959
+ ).join(" ");
960
+
961
+ // src/key-proof/word-fingerprint.ts
962
+ var FINGERPRINT_BYTES = 6;
963
+ var keyWordFingerprint = (publicKeyMultibase) => pgpWords(sha256(new TextEncoder().encode(publicKeyMultibase)).slice(0, FINGERPRINT_BYTES));
964
+
965
+ export {
966
+ KEY_ROLES,
967
+ serializeRoleSet,
968
+ parseRoleSet,
969
+ isCanonicalRoleSet,
970
+ roleSetCovers,
971
+ KEY_ADD_JWS_TYP,
972
+ MAX_KEY_PROOF_SIZE,
973
+ DEFAULT_KEY_PROOF_SKEW_SECONDS,
974
+ KeyProofVerifyError,
975
+ keyProofSigningInput,
976
+ signKeyProof,
977
+ verifyKeyProof,
978
+ unsafeKeyProofSubject,
979
+ verifyChainKeyProof,
980
+ keyWordFingerprint
981
+ };