keri 0.0.8-dev.bfac33d → 0.0.8-dev.e44ed64

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (104) hide show
  1. package/README.md +1 -8
  2. package/dist/controller/controller.d.ts +109 -0
  3. package/dist/controller/controller.js +545 -0
  4. package/dist/controller/controller.js.map +1 -0
  5. package/dist/controller/encrypt.d.ts +45 -0
  6. package/dist/controller/encrypt.js +120 -0
  7. package/dist/controller/encrypt.js.map +1 -0
  8. package/dist/core/credential-event.d.ts +58 -0
  9. package/dist/core/credential-event.js +28 -0
  10. package/dist/core/credential-event.js.map +1 -0
  11. package/dist/core/credential.d.ts +79 -0
  12. package/dist/core/credential.js +25 -0
  13. package/dist/core/credential.js.map +1 -0
  14. package/dist/core/digest.d.ts +1 -0
  15. package/dist/core/digest.js +7 -0
  16. package/dist/core/digest.js.map +1 -0
  17. package/dist/core/endpoint-discovery.d.ts +20 -0
  18. package/dist/core/endpoint-discovery.js +60 -0
  19. package/dist/core/endpoint-discovery.js.map +1 -0
  20. package/dist/core/events.d.ts +12 -0
  21. package/dist/core/events.js +25 -0
  22. package/dist/core/events.js.map +1 -0
  23. package/dist/core/kawa.d.ts +17 -0
  24. package/dist/core/kawa.js +79 -0
  25. package/dist/core/kawa.js.map +1 -0
  26. package/dist/core/key-event-log.d.ts +13 -0
  27. package/dist/core/key-event-log.js +154 -0
  28. package/dist/core/key-event-log.js.map +1 -0
  29. package/dist/core/key-event.d.ts +96 -0
  30. package/dist/core/key-event.js +89 -0
  31. package/dist/core/key-event.js.map +1 -0
  32. package/dist/core/keys.d.ts +9 -0
  33. package/dist/core/keys.js +17 -0
  34. package/dist/core/keys.js.map +1 -0
  35. package/dist/core/mailbox-client.d.ts +17 -0
  36. package/dist/core/mailbox-client.js +57 -0
  37. package/dist/core/mailbox-client.js.map +1 -0
  38. package/dist/core/main.d.ts +47 -0
  39. package/dist/core/main.js +44 -0
  40. package/dist/core/main.js.map +1 -0
  41. package/dist/core/receipt-event.d.ts +15 -0
  42. package/dist/core/receipt-event.js +13 -0
  43. package/dist/core/receipt-event.js.map +1 -0
  44. package/dist/core/registry-event.d.ts +28 -0
  45. package/dist/core/registry-event.js +18 -0
  46. package/dist/core/registry-event.js.map +1 -0
  47. package/dist/core/routed-event.d.ts +73 -0
  48. package/dist/core/routed-event.js +53 -0
  49. package/dist/core/routed-event.js.map +1 -0
  50. package/dist/core/said.d.ts +4 -0
  51. package/dist/core/said.js +26 -0
  52. package/dist/core/said.js.map +1 -0
  53. package/dist/core/sign.d.ts +5 -0
  54. package/dist/core/sign.js +10 -0
  55. package/dist/core/sign.js.map +1 -0
  56. package/dist/core/threshold.d.ts +6 -0
  57. package/dist/core/threshold.js +58 -0
  58. package/dist/core/threshold.js.map +1 -0
  59. package/dist/core/verify.d.ts +14 -0
  60. package/dist/core/verify.js +43 -0
  61. package/dist/core/verify.js.map +1 -0
  62. package/dist/main.d.ts +2 -7
  63. package/dist/main.js +2 -7
  64. package/dist/main.js.map +1 -1
  65. package/dist/storage/sqlite/node-sqlite.d.ts +12 -0
  66. package/dist/storage/sqlite/node-sqlite.js +25 -0
  67. package/dist/storage/sqlite/node-sqlite.js.map +1 -0
  68. package/dist/storage/sqlite/schema.d.ts +2 -0
  69. package/dist/storage/sqlite/schema.js +49 -0
  70. package/dist/storage/sqlite/schema.js.map +1 -0
  71. package/dist/storage/sqlite/sqlite-database.d.ts +13 -0
  72. package/dist/storage/sqlite/sqlite-database.js +2 -0
  73. package/dist/storage/sqlite/sqlite-database.js.map +1 -0
  74. package/dist/storage/sqlite/storage-sqlite.d.ts +26 -0
  75. package/dist/storage/sqlite/storage-sqlite.js +213 -0
  76. package/dist/storage/sqlite/storage-sqlite.js.map +1 -0
  77. package/package.json +10 -11
  78. package/dist/cli/main.d.ts +0 -2
  79. package/dist/cli/main.js +0 -182
  80. package/dist/cli/main.js.map +0 -1
  81. package/dist/client.d.ts +0 -17
  82. package/dist/client.js +0 -53
  83. package/dist/client.js.map +0 -1
  84. package/dist/controller.d.ts +0 -63
  85. package/dist/controller.js +0 -451
  86. package/dist/controller.js.map +0 -1
  87. package/dist/db/storage-sqlite.d.ts +0 -12
  88. package/dist/db/storage-sqlite.js +0 -53
  89. package/dist/db/storage-sqlite.js.map +0 -1
  90. package/dist/db/storage.d.ts +0 -18
  91. package/dist/db/storage.js +0 -29
  92. package/dist/db/storage.js.map +0 -1
  93. package/dist/events/event-store.d.ts +0 -116
  94. package/dist/events/event-store.js +0 -254
  95. package/dist/events/event-store.js.map +0 -1
  96. package/dist/events/events.d.ts +0 -248
  97. package/dist/events/events.js +0 -186
  98. package/dist/events/events.js.map +0 -1
  99. package/dist/keystore/encrypt.d.ts +0 -10
  100. package/dist/keystore/encrypt.js +0 -39
  101. package/dist/keystore/encrypt.js.map +0 -1
  102. package/dist/keystore/key-manager.d.ts +0 -27
  103. package/dist/keystore/key-manager.js +0 -76
  104. package/dist/keystore/key-manager.js.map +0 -1
@@ -0,0 +1,79 @@
1
+ import { cesr, Indexer, Matter, Message, parse } from "cesr";
2
+ import { MailboxClient } from "./mailbox-client.js";
3
+ import { verifyOrThrow } from "./verify.js";
4
+ import {} from "./receipt-event.js";
5
+ async function receipt(event, witnessUrl) {
6
+ const url = new URL("/receipts", witnessUrl);
7
+ if (url.protocol !== "http:" && url.protocol !== "https:") {
8
+ throw new Error(`Invalid protocol: ${url}`);
9
+ }
10
+ const fetchResponse = await fetch(url, {
11
+ method: "POST",
12
+ body: JSON.stringify(event.body),
13
+ headers: {
14
+ "Content-Type": "application/cesr+json",
15
+ "CESR-ATTACHMENT": event.attachments.text(),
16
+ },
17
+ });
18
+ if (!fetchResponse.ok || !fetchResponse.body) {
19
+ throw new Error(`Failed to submit event to witness: ${fetchResponse.status} ${fetchResponse.statusText}`);
20
+ }
21
+ for await (const incoming of parse(fetchResponse.body)) {
22
+ if (incoming.body.t === "rct" && incoming.body.d === event.body.d) {
23
+ for (const couple of incoming.attachments.NonTransReceiptCouples) {
24
+ const sig = Indexer.convert(Matter.parse(couple.sig), 0).text();
25
+ verifyOrThrow(event.raw, {
26
+ keys: [couple.prefix],
27
+ sigs: [sig],
28
+ threshold: "1",
29
+ });
30
+ }
31
+ return incoming;
32
+ }
33
+ }
34
+ throw new Error(`No receipt returned from ${witnessUrl}`);
35
+ }
36
+ /**
37
+ * KERI Algorithm for Witness Agreement (KAWA).
38
+ *
39
+ * Collects receipts from all witnesses, then distributes those receipts back
40
+ * to all witnesses. The event must already have controller signatures attached.
41
+ *
42
+ * @param event Pre-signed key event (ControllerIdxSigs already on attachments)
43
+ * @param endpoints Pre-resolved endpoints for each witness
44
+ * @returns Indexed witness signatures (wigs)
45
+ */
46
+ export async function submitToWitnesses(event, endpoints) {
47
+ // TODO: implement the spec's round-robin approach where receipts collected from
48
+ // earlier witnesses are forwarded to later ones in the same pass, reducing total
49
+ // network exchanges from N+(N×(N-1)) to at most 2×N.
50
+ const receipts = {};
51
+ const wigs = new Set();
52
+ const wits = endpoints.map((e) => e.aid);
53
+ for (const endpoint of endpoints) {
54
+ const response = await receipt(event, endpoint.url);
55
+ if (response.attachments.NonTransReceiptCouples.length > 0) {
56
+ const receiptCouple = response.attachments.NonTransReceiptCouples[0];
57
+ const witnessIndex = wits.indexOf(receiptCouple.prefix);
58
+ if (witnessIndex !== -1) {
59
+ const signature = Matter.parse(receiptCouple.sig);
60
+ wigs.add(cesr.index(signature, witnessIndex).text());
61
+ }
62
+ }
63
+ receipts[endpoint.aid] = response;
64
+ }
65
+ for (const endpoint of endpoints) {
66
+ const client = new MailboxClient({ id: endpoint.aid, url: endpoint.url });
67
+ for (const [other, receipt] of Object.entries(receipts)) {
68
+ if (other === endpoint.aid) {
69
+ continue;
70
+ }
71
+ const message = new Message(receipt.body, {
72
+ NonTransReceiptCouples: receipt.attachments.NonTransReceiptCouples,
73
+ });
74
+ await client.sendMessage(message);
75
+ }
76
+ }
77
+ return Array.from(wigs);
78
+ }
79
+ //# sourceMappingURL=kawa.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"kawa.js","sourceRoot":"","sources":["../../src/core/kawa.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ import { Message } from "cesr";
2
+ import { type KeyState, type InceptEvent, type InteractEvent, type RotateEvent, type KeyEventBody } from "./key-event.ts";
3
+ export type { KeyState, InceptEvent, InteractEvent, RotateEvent };
4
+ export declare class KeyEventLog {
5
+ #private;
6
+ private constructor();
7
+ static empty(): KeyEventLog;
8
+ static from(events: Iterable<Message<KeyEventBody>>): KeyEventLog;
9
+ static parse(stream: AsyncIterable<Uint8Array>): Promise<KeyEventLog>;
10
+ get state(): KeyState;
11
+ get events(): Message<KeyEventBody>[];
12
+ append(message: Message<KeyEventBody>): KeyEventLog;
13
+ }
@@ -0,0 +1,154 @@
1
+ import { Message, parse } from "cesr";
2
+ import {} from "./key-event.js";
3
+ import { verifyOrThrow } from "./verify.js";
4
+ export class KeyEventLog {
5
+ #events;
6
+ #state;
7
+ constructor(events, state) {
8
+ this.#events = events;
9
+ this.#state = state;
10
+ }
11
+ static empty() {
12
+ return new KeyEventLog([], null);
13
+ }
14
+ static from(events) {
15
+ let log = KeyEventLog.empty();
16
+ for (const event of events) {
17
+ log = log.append(event);
18
+ }
19
+ return log;
20
+ }
21
+ static async parse(stream) {
22
+ let log = KeyEventLog.empty();
23
+ for await (const message of parse(stream)) {
24
+ // TODO: Verify that the message is a valid KeyEventBody before casting
25
+ if (message.body.t === "icp" || message.body.t === "ixn" || message.body.t === "rot") {
26
+ log = log.append(message);
27
+ }
28
+ }
29
+ return log;
30
+ }
31
+ get state() {
32
+ if (this.#state === null) {
33
+ throw new Error("No events in KEL");
34
+ }
35
+ return this.#state;
36
+ }
37
+ get events() {
38
+ return this.#events;
39
+ }
40
+ append(message) {
41
+ const sigs = message.attachments.ControllerIdxSigs ?? [];
42
+ const wigs = message.attachments.WitnessIdxSigs ?? [];
43
+ const body = message.body;
44
+ const bodyRaw = new Message(body).raw;
45
+ switch (body.t) {
46
+ case "icp": {
47
+ if (this.#state !== null) {
48
+ throw new Error("State already initialized");
49
+ }
50
+ const icp = body;
51
+ if (!icp.k || !Array.isArray(icp.k) || icp.k.length === 0) {
52
+ throw new Error("Inception event must have at least one key");
53
+ }
54
+ verifyOrThrow(bodyRaw, {
55
+ keys: icp.k,
56
+ threshold: icp.kt,
57
+ sigs,
58
+ });
59
+ if (icp.b && Array.isArray(icp.b) && icp.b.length > 0) {
60
+ verifyOrThrow(bodyRaw, {
61
+ keys: icp.b,
62
+ threshold: icp.bt,
63
+ sigs: wigs,
64
+ });
65
+ }
66
+ break;
67
+ }
68
+ case "ixn":
69
+ case "rot": {
70
+ if (this.#state === null) {
71
+ throw new Error("State must be initialized before applying interact or rotate events");
72
+ }
73
+ const state = this.#state;
74
+ verifyOrThrow(bodyRaw, {
75
+ keys: state.signingKeys,
76
+ threshold: state.signingThreshold,
77
+ sigs,
78
+ });
79
+ if (state.backers && state.backers.length > 0) {
80
+ verifyOrThrow(bodyRaw, {
81
+ keys: state.backers,
82
+ threshold: state.backerThreshold,
83
+ sigs: wigs,
84
+ });
85
+ }
86
+ break;
87
+ }
88
+ default:
89
+ throw new Error(`Unsupported event type: ${body.t}`);
90
+ }
91
+ const newState = reduceKeyState(this.#state, body);
92
+ return new KeyEventLog([...this.#events, message], newState);
93
+ }
94
+ }
95
+ function assertDefined(obj) {
96
+ if (obj === null) {
97
+ throw new Error("Object is null");
98
+ }
99
+ }
100
+ function merge(a, b) {
101
+ return {
102
+ identifier: b.identifier ?? a.identifier,
103
+ signingThreshold: b.signingThreshold ?? a.signingThreshold,
104
+ signingKeys: b.signingKeys ?? a.signingKeys,
105
+ nextThreshold: b.nextThreshold ?? a.nextThreshold,
106
+ nextKeyDigests: b.nextKeyDigests ?? a.nextKeyDigests,
107
+ backerThreshold: b.backerThreshold ?? a.backerThreshold,
108
+ backers: b.backers ?? a.backers,
109
+ configTraits: b.configTraits ?? a.configTraits,
110
+ lastEvent: b.lastEvent ?? a.lastEvent,
111
+ lastEstablishment: b.lastEstablishment ?? a.lastEstablishment,
112
+ };
113
+ }
114
+ function reduceKeyState(state, body) {
115
+ switch (body.t) {
116
+ case "icp": {
117
+ const icp = body;
118
+ return {
119
+ identifier: icp.i,
120
+ signingThreshold: icp.kt,
121
+ signingKeys: icp.k,
122
+ nextThreshold: icp.nt,
123
+ nextKeyDigests: icp.n,
124
+ backerThreshold: icp.bt,
125
+ backers: icp.b,
126
+ configTraits: icp.c,
127
+ lastEvent: { i: icp.i, s: icp.s, d: icp.d },
128
+ lastEstablishment: { i: icp.i, s: icp.s, d: icp.d },
129
+ };
130
+ }
131
+ case "ixn": {
132
+ assertDefined(state);
133
+ const ixn = body;
134
+ return merge(state, { lastEvent: { i: ixn.i, s: ixn.s, d: ixn.d } });
135
+ }
136
+ case "rot": {
137
+ assertDefined(state);
138
+ const rot = body;
139
+ return merge(state, {
140
+ backers: state.backers.filter((b) => !rot.br.includes(b)).concat(rot.ba),
141
+ backerThreshold: rot.bt,
142
+ signingKeys: rot.k,
143
+ signingThreshold: rot.kt,
144
+ nextKeyDigests: rot.n,
145
+ nextThreshold: rot.nt,
146
+ lastEvent: { i: rot.i, s: rot.s, d: rot.d },
147
+ lastEstablishment: { i: rot.i, s: rot.s, d: rot.d },
148
+ });
149
+ }
150
+ default:
151
+ throw new Error(`Unsupported event type: ${body.t}`);
152
+ }
153
+ }
154
+ //# sourceMappingURL=key-event-log.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"key-event-log.js","sourceRoot":"","sources":["../../src/core/key-event-log.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,96 @@
1
+ import { Message } from "cesr";
2
+ import { type Threshold } from "./threshold.ts";
3
+ export interface KeyState {
4
+ identifier: string;
5
+ signingThreshold: Threshold;
6
+ signingKeys: string[];
7
+ nextThreshold: Threshold;
8
+ nextKeyDigests: string[];
9
+ backerThreshold: string;
10
+ backers: string[];
11
+ configTraits: string[];
12
+ lastEvent: {
13
+ i: string;
14
+ s: string;
15
+ d: string;
16
+ };
17
+ lastEstablishment: {
18
+ i: string;
19
+ s: string;
20
+ d: string;
21
+ };
22
+ }
23
+ export interface InceptArgs {
24
+ signingKeys: string[];
25
+ signingThreshold?: Threshold;
26
+ nextKeys: string[];
27
+ nextThreshold?: Threshold;
28
+ wits?: string[];
29
+ toad?: number;
30
+ }
31
+ export interface InteractArgs {
32
+ data?: Record<string, unknown>;
33
+ }
34
+ export interface RotateArgs {
35
+ signingKeys: string[];
36
+ nextKeyDigests: string[];
37
+ data?: Record<string, unknown>;
38
+ br?: string[];
39
+ ba?: string[];
40
+ bt?: string;
41
+ }
42
+ export type InceptEvent = {
43
+ v: string;
44
+ t: "icp";
45
+ d: string;
46
+ i: string;
47
+ s: string;
48
+ kt: Threshold;
49
+ k: string[];
50
+ nt: Threshold;
51
+ n: string[];
52
+ bt: string;
53
+ b: string[];
54
+ c: string[];
55
+ a: Record<string, unknown>[];
56
+ };
57
+ export type InteractEvent = {
58
+ v: string;
59
+ t: "ixn";
60
+ d: string;
61
+ i: string;
62
+ s: string;
63
+ p: string;
64
+ a: Record<string, unknown>[];
65
+ };
66
+ export type RotateEvent = {
67
+ v: string;
68
+ t: "rot";
69
+ d: string;
70
+ i: string;
71
+ s: string;
72
+ p: string;
73
+ kt: Threshold;
74
+ k: string[];
75
+ nt: Threshold;
76
+ n: string[];
77
+ bt: string;
78
+ br: string[];
79
+ ba: string[];
80
+ c: string[];
81
+ a: Record<string, unknown>[];
82
+ };
83
+ export type KeyEventBody = {
84
+ v: string;
85
+ t: string;
86
+ d: string;
87
+ i: string;
88
+ s: string;
89
+ [key: string]: unknown;
90
+ };
91
+ export type KeyEvent<T extends KeyEventBody = KeyEventBody> = Message<T>;
92
+ export declare function incept(args: InceptArgs): Message<InceptEvent & {
93
+ v: string;
94
+ }>;
95
+ export declare function interact(state: KeyState, args?: InteractArgs): KeyEvent<InteractEvent>;
96
+ export declare function rotate(state: KeyState, args: RotateArgs): KeyEvent<RotateEvent>;
@@ -0,0 +1,89 @@
1
+ import { Matter, Message } from "cesr";
2
+ import { DUMMY_VERSION, encodeEvent } from "./events.js";
3
+ import {} from "./threshold.js";
4
+ function isTransferable(key) {
5
+ const raw = Matter.parse(key);
6
+ switch (raw.code) {
7
+ case Matter.Code.ECDSA_256k1N:
8
+ case Matter.Code.Ed25519N:
9
+ case Matter.Code.Ed448N:
10
+ return false;
11
+ default:
12
+ return true;
13
+ }
14
+ }
15
+ export function incept(args) {
16
+ const keys = args.signingKeys;
17
+ if (keys.length === 0) {
18
+ throw new Error("No keys provided in inception event");
19
+ }
20
+ const wits = args.wits ?? [];
21
+ const transferable = keys.length > 1 || isTransferable(keys[0]);
22
+ const labels = transferable ? ["d", "i"] : ["d"];
23
+ let bt;
24
+ if (args.toad !== undefined) {
25
+ bt = args.toad.toString();
26
+ }
27
+ else if (wits.length === 0) {
28
+ bt = "0";
29
+ }
30
+ else if (wits.length === 1) {
31
+ bt = "1";
32
+ }
33
+ else {
34
+ bt = (wits.length - 1).toString();
35
+ }
36
+ const body = encodeEvent({
37
+ v: DUMMY_VERSION,
38
+ t: "icp",
39
+ d: "",
40
+ i: transferable ? "" : keys[0],
41
+ s: "0",
42
+ kt: keys.length.toString(),
43
+ k: keys,
44
+ nt: args.nextKeys.length.toString(),
45
+ n: args.nextKeys,
46
+ bt,
47
+ b: wits,
48
+ c: [],
49
+ a: [],
50
+ }, { labels, legacy: true });
51
+ return new Message(body);
52
+ }
53
+ export function interact(state, args = {}) {
54
+ const body = encodeEvent({
55
+ v: DUMMY_VERSION,
56
+ t: "ixn",
57
+ d: "",
58
+ i: state.identifier,
59
+ s: (parseInt(state.lastEvent.s, 16) + 1).toString(16),
60
+ p: state.lastEvent.d,
61
+ a: args.data ? [args.data] : [],
62
+ }, { labels: ["d"], legacy: true });
63
+ return new Message(body);
64
+ }
65
+ export function rotate(state, args) {
66
+ const keyDigest = state.nextKeyDigests[0];
67
+ if (!keyDigest) {
68
+ throw new Error(`State for id ${state.identifier} does not contain pre-committed next key digest`);
69
+ }
70
+ const body = encodeEvent({
71
+ v: DUMMY_VERSION,
72
+ t: "rot",
73
+ d: "",
74
+ i: state.identifier,
75
+ s: (parseInt(state.lastEvent.s, 16) + 1).toString(16),
76
+ p: state.lastEvent.d,
77
+ kt: "1",
78
+ k: args.signingKeys,
79
+ nt: "1",
80
+ n: args.nextKeyDigests,
81
+ bt: args.bt ?? "0",
82
+ br: args.br ?? [],
83
+ ba: args.ba ?? [],
84
+ c: [],
85
+ a: args.data ? [args.data] : [],
86
+ }, { labels: ["d"], legacy: true });
87
+ return new Message(body);
88
+ }
89
+ //# sourceMappingURL=key-event.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"key-event.js","sourceRoot":"","sources":["../../src/core/key-event.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ export interface KeyPair {
2
+ privateKey: Uint8Array;
3
+ publicKey: string;
4
+ publicKeyDigest: string;
5
+ }
6
+ export interface GenerateKeyPairOptions {
7
+ nonTransferable?: boolean;
8
+ }
9
+ export declare function generateKeyPair(seed?: string, options?: GenerateKeyPairOptions): KeyPair;
@@ -0,0 +1,17 @@
1
+ import { cesr } from "cesr";
2
+ import { ed25519 } from "@noble/curves/ed25519.js";
3
+ import { blake3 } from "@noble/hashes/blake3.js";
4
+ export function generateKeyPair(seed, options) {
5
+ const privateKey = seed
6
+ ? blake3(new TextEncoder().encode(seed), { dkLen: 32 })
7
+ : crypto.getRandomValues(new Uint8Array(32));
8
+ const rawPublicKey = ed25519.getPublicKey(privateKey);
9
+ const publicKey = options?.nonTransferable
10
+ ? cesr.crypto.ed25519N(rawPublicKey).text()
11
+ : cesr.crypto.ed25519(rawPublicKey).text();
12
+ const publicKeyDigest = cesr.crypto
13
+ .blake3_256(blake3.create({ dkLen: 32 }).update(new TextEncoder().encode(publicKey)).digest())
14
+ .text();
15
+ return { privateKey, publicKey, publicKeyDigest };
16
+ }
17
+ //# sourceMappingURL=keys.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"keys.js","sourceRoot":"","sources":["../../src/core/keys.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAC5B,OAAO,EAAE,OAAO,EAAE,MAAM,0BAA0B,CAAC;AACnD,OAAO,EAAE,MAAM,EAAE,MAAM,yBAAyB,CAAC;AAYjD,MAAM,UAAU,eAAe,CAAC,IAAa,EAAE,OAAgC;IAC7E,MAAM,UAAU,GAAG,IAAI;QACrB,CAAC,CAAC,MAAM,CAAC,IAAI,WAAW,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC;QACvD,CAAC,CAAC,MAAM,CAAC,eAAe,CAAC,IAAI,UAAU,CAAC,EAAE,CAAC,CAAC,CAAC;IAE/C,MAAM,YAAY,GAAG,OAAO,CAAC,YAAY,CAAC,UAAU,CAAC,CAAC;IACtD,MAAM,SAAS,GAAG,OAAO,EAAE,eAAe;QACxC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC,IAAI,EAAE;QAC3C,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC,IAAI,EAAE,CAAC;IAE7C,MAAM,eAAe,GAAG,IAAI,CAAC,MAAM;SAChC,UAAU,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC,CAAC,MAAM,CAAC,IAAI,WAAW,EAAE,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;SAC7F,IAAI,EAAE,CAAC;IAEV,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,eAAe,EAAE,CAAC;AACpD,CAAC"}
@@ -0,0 +1,17 @@
1
+ import { type Message } from "cesr";
2
+ export interface MailboxClientOptions {
3
+ /**
4
+ * The SAID of the mailbox controller.
5
+ */
6
+ id: string;
7
+ /**
8
+ * The URL of the mailbox server to send messages to.
9
+ */
10
+ url: string;
11
+ }
12
+ export declare class MailboxClient {
13
+ readonly url: string;
14
+ readonly id: string;
15
+ constructor(options: MailboxClientOptions);
16
+ sendMessage(message: Message, signal?: AbortSignal): Promise<Message[]>;
17
+ }
@@ -0,0 +1,57 @@
1
+ import { parse } from "cesr";
2
+ export class MailboxClient {
3
+ url;
4
+ id;
5
+ constructor(options) {
6
+ this.url = options.url;
7
+ this.id = options.id;
8
+ }
9
+ async sendMessage(message, signal) {
10
+ const url = new URL("/", this.url);
11
+ const body = JSON.stringify(message.body);
12
+ const headers = {
13
+ "Content-Type": "application/cesr+json",
14
+ "CESR-ATTACHMENT": message.attachments.text(),
15
+ "CESR-DESTINATION": this.id,
16
+ };
17
+ const response = await fetch(url, {
18
+ method: "POST",
19
+ body,
20
+ headers,
21
+ signal,
22
+ });
23
+ if (!response.ok) {
24
+ throw new Error(`Failed to send event: ${response.status} ${response.statusText}`);
25
+ }
26
+ if (!response.body) {
27
+ return [];
28
+ }
29
+ const contentType = response.headers.get("Content-Type");
30
+ if (!contentType) {
31
+ return [];
32
+ }
33
+ if (contentType === "text/event-stream") {
34
+ const reader = response.body.getReader();
35
+ while (true) {
36
+ const { done, value } = await reader.read();
37
+ if (done) {
38
+ break;
39
+ }
40
+ const str = new TextDecoder().decode(value);
41
+ for (const line of str.split("\n")) {
42
+ if (line.startsWith("data: ")) {
43
+ const data = line.slice(6);
44
+ const message = await Array.fromAsync(parse(data));
45
+ reader.cancel("Got message, cancelling reader");
46
+ return message;
47
+ }
48
+ }
49
+ }
50
+ }
51
+ if (contentType?.startsWith("application/json")) {
52
+ return [];
53
+ }
54
+ return await Array.fromAsync(parse(response.body));
55
+ }
56
+ }
57
+ //# sourceMappingURL=mailbox-client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mailbox-client.js","sourceRoot":"","sources":["../../src/core/mailbox-client.ts"],"names":[],"mappings":"AAAA,OAAO,EAAgB,KAAK,EAAE,MAAM,MAAM,CAAC;AAc3C,MAAM,OAAO,aAAa;IACf,GAAG,CAAS;IACZ,EAAE,CAAS;IAEpB,YAAY,OAA6B;QACvC,IAAI,CAAC,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC;QACvB,IAAI,CAAC,EAAE,GAAG,OAAO,CAAC,EAAE,CAAC;IACvB,CAAC;IAED,KAAK,CAAC,WAAW,CAAC,OAAgB,EAAE,MAAoB;QACtD,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC;QAEnC,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;QAC1C,MAAM,OAAO,GAAG;YACd,cAAc,EAAE,uBAAuB;YACvC,iBAAiB,EAAE,OAAO,CAAC,WAAW,CAAC,IAAI,EAAE;YAC7C,kBAAkB,EAAE,IAAI,CAAC,EAAE;SAC5B,CAAC;QAEF,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE;YAChC,MAAM,EAAE,MAAM;YACd,IAAI;YACJ,OAAO;YACP,MAAM;SACP,CAAC,CAAC;QAEH,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;YACjB,MAAM,IAAI,KAAK,CAAC,yBAAyB,QAAQ,CAAC,MAAM,IAAI,QAAQ,CAAC,UAAU,EAAE,CAAC,CAAC;QACrF,CAAC;QAED,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC;YACnB,OAAO,EAAE,CAAC;QACZ,CAAC;QAED,MAAM,WAAW,GAAG,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;QACzD,IAAI,CAAC,WAAW,EAAE,CAAC;YACjB,OAAO,EAAE,CAAC;QACZ,CAAC;QAED,IAAI,WAAW,KAAK,mBAAmB,EAAE,CAAC;YACxC,MAAM,MAAM,GAAG,QAAQ,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC;YACzC,OAAO,IAAI,EAAE,CAAC;gBACZ,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,MAAM,MAAM,CAAC,IAAI,EAAE,CAAC;gBAE5C,IAAI,IAAI,EAAE,CAAC;oBACT,MAAM;gBACR,CAAC;gBAED,MAAM,GAAG,GAAG,IAAI,WAAW,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;gBAE5C,KAAK,MAAM,IAAI,IAAI,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;oBACnC,IAAI,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;wBAC9B,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;wBAC3B,MAAM,OAAO,GAAG,MAAM,KAAK,CAAC,SAAS,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC;wBACnD,MAAM,CAAC,MAAM,CAAC,gCAAgC,CAAC,CAAC;wBAChD,OAAO,OAAO,CAAC;oBACjB,CAAC;gBACH,CAAC;YACH,CAAC;QACH,CAAC;QAED,IAAI,WAAW,EAAE,UAAU,CAAC,kBAAkB,CAAC,EAAE,CAAC;YAChD,OAAO,EAAE,CAAC;QACZ,CAAC;QAED,OAAO,MAAM,KAAK,CAAC,SAAS,CAAC,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC;IACrD,CAAC;CACF"}
@@ -0,0 +1,47 @@
1
+ import { exchange, query, reply } from "./routed-event.ts";
2
+ import { receipt } from "./receipt-event.ts";
3
+ import { incept, interact, rotate } from "./key-event.ts";
4
+ import { incept as registry } from "./registry-event.ts";
5
+ import { issue, revoke } from "./credential-event.ts";
6
+ import { formatDate } from "./events.ts";
7
+ import { generateKeyPair } from "./keys.ts";
8
+ import { createCredential } from "./credential.ts";
9
+ import { sign } from "./sign.ts";
10
+ import { verify } from "./verify.ts";
11
+ import { digest } from "./digest.ts";
12
+ export { sign } from "./sign.ts";
13
+ export { Message, Attachments } from "cesr";
14
+ export { type KeyEvent } from "./key-event.ts";
15
+ export { KeyEventLog } from "./key-event-log.ts";
16
+ export type { KeyState, InceptEvent, InteractEvent, RotateEvent, KeyEventBody } from "./key-event.ts";
17
+ export type { KeyPair } from "./keys.ts";
18
+ export type { RegistryInceptEvent } from "./registry-event.ts";
19
+ export type { IssueEvent, RevokeEvent } from "./credential-event.ts";
20
+ export type { ReplyEvent, ExchangeEvent } from "./routed-event.ts";
21
+ export { createCredential } from "./credential.ts";
22
+ export type { EndRoleRecord, LocationRecord, Endpoint } from "./endpoint-discovery.ts";
23
+ export { resolveEndRole, resolveLocation } from "./endpoint-discovery.ts";
24
+ export type { Credential, CredentialBody } from "./credential.ts";
25
+ export type { VerifyResult } from "./verify.ts";
26
+ export { MailboxClient } from "./mailbox-client.ts";
27
+ export { submitToWitnesses } from "./kawa.ts";
28
+ export declare const keri: {
29
+ incept: typeof incept;
30
+ interact: typeof interact;
31
+ rotate: typeof rotate;
32
+ registry: typeof registry;
33
+ issue: typeof issue;
34
+ revoke: typeof revoke;
35
+ credential: typeof createCredential;
36
+ exchange: typeof exchange;
37
+ query: typeof query;
38
+ reply: typeof reply;
39
+ receipt: typeof receipt;
40
+ utils: {
41
+ sign: typeof sign;
42
+ verify: typeof verify;
43
+ formatDate: typeof formatDate;
44
+ generateKeyPair: typeof generateKeyPair;
45
+ digest: typeof digest;
46
+ };
47
+ };
@@ -0,0 +1,44 @@
1
+ import { exchange, query, reply } from "./routed-event.js";
2
+ import { receipt } from "./receipt-event.js";
3
+ import { incept, interact, rotate } from "./key-event.js";
4
+ import { incept as registry } from "./registry-event.js";
5
+ import { issue, revoke } from "./credential-event.js";
6
+ import { formatDate } from "./events.js";
7
+ import { generateKeyPair } from "./keys.js";
8
+ import { createCredential } from "./credential.js";
9
+ import { sign } from "./sign.js";
10
+ import { verify } from "./verify.js";
11
+ import { digest } from "./digest.js";
12
+ export { sign } from "./sign.js";
13
+ export { Message, Attachments } from "cesr";
14
+ export {} from "./key-event.js";
15
+ export { KeyEventLog } from "./key-event-log.js";
16
+ export { createCredential } from "./credential.js";
17
+ export { resolveEndRole, resolveLocation } from "./endpoint-discovery.js";
18
+ export { MailboxClient } from "./mailbox-client.js";
19
+ export { submitToWitnesses } from "./kawa.js";
20
+ export const keri = {
21
+ // Key events
22
+ incept,
23
+ interact,
24
+ rotate,
25
+ // Registry
26
+ registry,
27
+ issue,
28
+ revoke,
29
+ credential: createCredential,
30
+ // Routed
31
+ exchange,
32
+ query,
33
+ reply,
34
+ // Receipt
35
+ receipt,
36
+ utils: {
37
+ sign,
38
+ verify,
39
+ formatDate,
40
+ generateKeyPair,
41
+ digest,
42
+ },
43
+ };
44
+ //# sourceMappingURL=main.js.map