keri 0.0.0-dev.fc3df9d → 0.0.4
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/LICENSE +201 -0
- package/README.md +10 -0
- package/dist/cli/main.d.ts +2 -0
- package/dist/cli/main.js +175 -0
- package/dist/cli/main.js.map +1 -0
- package/dist/client.d.ts +21 -0
- package/dist/client.js +88 -0
- package/dist/client.js.map +1 -0
- package/dist/controller.d.ts +64 -0
- package/dist/controller.js +472 -0
- package/dist/controller.js.map +1 -0
- package/dist/db/storage-sqlite.d.ts +12 -0
- package/dist/db/storage-sqlite.js +53 -0
- package/dist/db/storage-sqlite.js.map +1 -0
- package/dist/db/storage.d.ts +18 -0
- package/dist/db/storage.js +29 -0
- package/dist/db/storage.js.map +1 -0
- package/dist/events/event-store.d.ts +126 -0
- package/dist/events/event-store.js +242 -0
- package/dist/events/event-store.js.map +1 -0
- package/dist/events/events.d.ts +248 -0
- package/dist/events/events.js +184 -0
- package/dist/events/events.js.map +1 -0
- package/dist/keystore/encrypt.d.ts +10 -2
- package/dist/keystore/encrypt.js +26 -25
- package/dist/keystore/encrypt.js.map +1 -0
- package/dist/keystore/key-manager.d.ts +26 -0
- package/dist/keystore/key-manager.js +70 -0
- package/dist/keystore/key-manager.js.map +1 -0
- package/dist/main.d.ts +6 -2
- package/dist/main.js +7 -2
- package/dist/main.js.map +1 -0
- package/package.json +27 -24
- package/dist/data-type.d.ts +0 -9
- package/dist/data-type.js +0 -1
- package/dist/db/sqlite-db.d.ts +0 -14
- package/dist/db/sqlite-db.js +0 -90
- package/dist/event.d.ts +0 -45
- package/dist/event.js +0 -44
- package/dist/keri.d.ts +0 -1
- package/dist/keri.js +0 -110
- package/dist/keystore/keystore-fs.d.ts +0 -13
- package/dist/keystore/keystore-fs.js +0 -50
- package/dist/keystore/keystore-web.d.ts +0 -12
- package/dist/keystore/keystore-web.js +0 -48
- package/dist/keystore/keystore.d.ts +0 -15
- package/dist/keystore/keystore.js +0 -1
- package/dist/main-common.d.ts +0 -7
- package/dist/main-common.js +0 -7
- package/dist/main-web.d.ts +0 -2
- package/dist/main-web.js +0 -2
- package/dist/parser/base64.d.ts +0 -6
- package/dist/parser/base64.js +0 -74
- package/dist/parser/cesr-encoding.d.ts +0 -34
- package/dist/parser/cesr-encoding.js +0 -158
- package/dist/parser/codes.d.ts +0 -143
- package/dist/parser/codes.js +0 -266
- package/dist/parser/parser.d.ts +0 -11
- package/dist/parser/parser.js +0 -150
- package/dist/parser/version.d.ts +0 -11
- package/dist/parser/version.js +0 -56
|
@@ -0,0 +1,184 @@
|
|
|
1
|
+
import { blake3 } from "@noble/hashes/blake3";
|
|
2
|
+
import { cesr, MatterCode } from "cesr/__unstable__";
|
|
3
|
+
export function formatDate(date) {
|
|
4
|
+
return date.toISOString().replace("Z", "000+00:00");
|
|
5
|
+
}
|
|
6
|
+
export function randomNonce() {
|
|
7
|
+
return cesr.encodeMatter({ code: MatterCode.Salt_128, raw: crypto.getRandomValues(new Uint8Array(16)) });
|
|
8
|
+
}
|
|
9
|
+
function calculateSaid(event) {
|
|
10
|
+
const encoder = new TextEncoder();
|
|
11
|
+
const digest = cesr.encodeMatter({
|
|
12
|
+
code: MatterCode.Blake3_256,
|
|
13
|
+
raw: blake3
|
|
14
|
+
.create({ dkLen: 32 })
|
|
15
|
+
.update(encoder.encode(JSON.stringify(event)))
|
|
16
|
+
.digest(),
|
|
17
|
+
});
|
|
18
|
+
return digest;
|
|
19
|
+
}
|
|
20
|
+
export function saidify(event, labels) {
|
|
21
|
+
if (!labels?.length) {
|
|
22
|
+
return event;
|
|
23
|
+
}
|
|
24
|
+
const digest = calculateSaid(event);
|
|
25
|
+
for (const label of labels ?? []) {
|
|
26
|
+
event[label] = digest;
|
|
27
|
+
}
|
|
28
|
+
return event;
|
|
29
|
+
}
|
|
30
|
+
function isTransferable(key) {
|
|
31
|
+
const raw = cesr.decodeMatter(key);
|
|
32
|
+
switch (raw.code) {
|
|
33
|
+
case MatterCode.ECDSA_256k1N:
|
|
34
|
+
case MatterCode.Ed25519N:
|
|
35
|
+
case MatterCode.Ed448N:
|
|
36
|
+
return false;
|
|
37
|
+
default:
|
|
38
|
+
return true;
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
function resolveBackerThreshold(data) {
|
|
42
|
+
if (data.bt) {
|
|
43
|
+
return data.bt;
|
|
44
|
+
}
|
|
45
|
+
if (!data.b || data.b.length === 0) {
|
|
46
|
+
return 0;
|
|
47
|
+
}
|
|
48
|
+
if (data.b.length === 1) {
|
|
49
|
+
return 1;
|
|
50
|
+
}
|
|
51
|
+
return data.b.length - 1;
|
|
52
|
+
}
|
|
53
|
+
export class KeriEventCreator {
|
|
54
|
+
#version;
|
|
55
|
+
constructor(options) {
|
|
56
|
+
this.#version = options.version;
|
|
57
|
+
}
|
|
58
|
+
#encode(data, labels = ["d"]) {
|
|
59
|
+
for (const label of labels) {
|
|
60
|
+
if (!(label in data)) {
|
|
61
|
+
throw new Error(`Input missing label '${label}'`);
|
|
62
|
+
}
|
|
63
|
+
data[label] = "#".repeat(44);
|
|
64
|
+
}
|
|
65
|
+
const event = JSON.parse(cesr.encodeMessage(data, { legacy: this.#version === 1 }));
|
|
66
|
+
return saidify(event, labels);
|
|
67
|
+
}
|
|
68
|
+
registry(args) {
|
|
69
|
+
return this.#encode({
|
|
70
|
+
t: "vcp",
|
|
71
|
+
d: "",
|
|
72
|
+
i: "",
|
|
73
|
+
ii: args.ii,
|
|
74
|
+
s: "0",
|
|
75
|
+
c: ["NB"],
|
|
76
|
+
bt: "0",
|
|
77
|
+
b: [],
|
|
78
|
+
n: args.n ?? randomNonce(),
|
|
79
|
+
}, ["d", "i"]);
|
|
80
|
+
}
|
|
81
|
+
issue(args) {
|
|
82
|
+
return this.#encode({
|
|
83
|
+
t: "iss",
|
|
84
|
+
d: "",
|
|
85
|
+
i: args.i,
|
|
86
|
+
s: "0",
|
|
87
|
+
ri: args.ri,
|
|
88
|
+
dt: args.dt ?? formatDate(new Date()),
|
|
89
|
+
});
|
|
90
|
+
}
|
|
91
|
+
incept(data) {
|
|
92
|
+
if (data.k.length === 0) {
|
|
93
|
+
throw new Error("No keys provided in inception event");
|
|
94
|
+
}
|
|
95
|
+
const transferable = data.k.length > 1 || isTransferable(data.k[0]);
|
|
96
|
+
const labels = ["d"];
|
|
97
|
+
if (transferable) {
|
|
98
|
+
labels.push("i");
|
|
99
|
+
}
|
|
100
|
+
return this.#encode({
|
|
101
|
+
t: "icp",
|
|
102
|
+
d: "",
|
|
103
|
+
i: transferable ? "" : data.k[0],
|
|
104
|
+
s: "0",
|
|
105
|
+
kt: data.kt ?? data.k.length.toString(),
|
|
106
|
+
k: data.k,
|
|
107
|
+
nt: data.nt ?? data.n?.length.toString() ?? "0",
|
|
108
|
+
n: data.n ?? [],
|
|
109
|
+
bt: resolveBackerThreshold(data).toString(),
|
|
110
|
+
b: data.b ?? [],
|
|
111
|
+
c: [],
|
|
112
|
+
a: [],
|
|
113
|
+
}, labels);
|
|
114
|
+
}
|
|
115
|
+
exchange(data) {
|
|
116
|
+
return this.#encode({
|
|
117
|
+
t: "exn",
|
|
118
|
+
d: "",
|
|
119
|
+
i: data.i,
|
|
120
|
+
rp: data.rp || "",
|
|
121
|
+
p: data.p || "",
|
|
122
|
+
dt: data.dt || formatDate(new Date()),
|
|
123
|
+
r: data.r,
|
|
124
|
+
q: data.q || {},
|
|
125
|
+
a: data.a || {},
|
|
126
|
+
e: data.e ? saidify({ ...(data.e ?? {}), d: "" }, ["d"]) : {},
|
|
127
|
+
});
|
|
128
|
+
}
|
|
129
|
+
interact(data) {
|
|
130
|
+
return this.#encode({
|
|
131
|
+
t: "ixn",
|
|
132
|
+
d: "",
|
|
133
|
+
i: data.i,
|
|
134
|
+
s: data.s,
|
|
135
|
+
p: data.p,
|
|
136
|
+
a: data.a ?? [],
|
|
137
|
+
});
|
|
138
|
+
}
|
|
139
|
+
query(args) {
|
|
140
|
+
return this.#encode({
|
|
141
|
+
t: "qry",
|
|
142
|
+
d: "",
|
|
143
|
+
dt: formatDate(args.dt ?? new Date()),
|
|
144
|
+
r: args.r ?? "",
|
|
145
|
+
rr: args.rr ?? "",
|
|
146
|
+
q: args.q,
|
|
147
|
+
});
|
|
148
|
+
}
|
|
149
|
+
receipt(data) {
|
|
150
|
+
return this.#encode({
|
|
151
|
+
t: "rct",
|
|
152
|
+
d: data.d,
|
|
153
|
+
i: data.i,
|
|
154
|
+
s: data.s,
|
|
155
|
+
}, []);
|
|
156
|
+
}
|
|
157
|
+
reply(data) {
|
|
158
|
+
return this.#encode({
|
|
159
|
+
t: "rpy",
|
|
160
|
+
d: "",
|
|
161
|
+
dt: data.dt ?? formatDate(new Date()),
|
|
162
|
+
r: data.r,
|
|
163
|
+
a: data.a,
|
|
164
|
+
});
|
|
165
|
+
}
|
|
166
|
+
credential(data) {
|
|
167
|
+
const event = JSON.parse(cesr.encodeMessage({
|
|
168
|
+
d: "#".repeat(44),
|
|
169
|
+
...(data.u && { u: data.u }),
|
|
170
|
+
i: data.i,
|
|
171
|
+
ri: data.ri,
|
|
172
|
+
s: data.s,
|
|
173
|
+
a: saidify({
|
|
174
|
+
d: "#".repeat(44),
|
|
175
|
+
...data.a,
|
|
176
|
+
}, ["d"]),
|
|
177
|
+
...(data.e && { e: saidify({ d: "#".repeat(44), ...data.e }, ["d"]) }),
|
|
178
|
+
r: saidify({ d: "#".repeat(44), ...data.r }, ["d"]),
|
|
179
|
+
}, { legacy: this.#version === 1, protocol: "ACDC" }));
|
|
180
|
+
return saidify(event, ["d"]);
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
export const keri = new KeriEventCreator({ version: 1 });
|
|
184
|
+
//# sourceMappingURL=events.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"events.js","sourceRoot":"","sources":["../../src/events/events.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,2 +1,10 @@
|
|
|
1
|
-
export
|
|
2
|
-
|
|
1
|
+
export interface Encrypter {
|
|
2
|
+
encrypt(data: Uint8Array): Promise<Uint8Array>;
|
|
3
|
+
decrypt(data: Uint8Array): Promise<Uint8Array>;
|
|
4
|
+
}
|
|
5
|
+
export declare class PassphraseEncrypter implements Encrypter {
|
|
6
|
+
#private;
|
|
7
|
+
constructor(passphrase: string);
|
|
8
|
+
encrypt(data: Uint8Array): Promise<Uint8Array<ArrayBuffer>>;
|
|
9
|
+
decrypt(ciphertext: Uint8Array): Promise<Uint8Array>;
|
|
10
|
+
}
|
package/dist/keystore/encrypt.js
CHANGED
|
@@ -1,38 +1,39 @@
|
|
|
1
|
-
|
|
1
|
+
async function deriveKey(passphrase, salt) {
|
|
2
2
|
const encoder = new TextEncoder();
|
|
3
3
|
const encryptionKey = await crypto.subtle.importKey("raw", encoder.encode(passphrase), "PBKDF2", false, [
|
|
4
4
|
"deriveBits",
|
|
5
5
|
"deriveKey",
|
|
6
6
|
]);
|
|
7
|
-
const salt = crypto.getRandomValues(new Uint8Array(16));
|
|
8
|
-
const iv = crypto.getRandomValues(new Uint8Array(16));
|
|
9
7
|
const key = await crypto.subtle.deriveKey({
|
|
10
8
|
name: "PBKDF2",
|
|
11
9
|
salt,
|
|
12
10
|
iterations: 100000,
|
|
13
11
|
hash: "SHA-256",
|
|
14
12
|
}, encryptionKey, { name: "AES-GCM", length: 256 }, true, ["encrypt", "decrypt"]);
|
|
15
|
-
|
|
16
|
-
const result = new Uint8Array(salt.byteLength + iv.byteLength + encrypted.byteLength);
|
|
17
|
-
result.set(salt, 0);
|
|
18
|
-
result.set(iv, salt.byteLength);
|
|
19
|
-
result.set(new Uint8Array(encrypted), salt.byteLength + iv.byteLength);
|
|
20
|
-
return result;
|
|
13
|
+
return key;
|
|
21
14
|
}
|
|
22
|
-
export
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
salt,
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
15
|
+
export class PassphraseEncrypter {
|
|
16
|
+
#passphrase;
|
|
17
|
+
constructor(passphrase) {
|
|
18
|
+
this.#passphrase = passphrase;
|
|
19
|
+
}
|
|
20
|
+
async encrypt(data) {
|
|
21
|
+
const salt = crypto.getRandomValues(new Uint8Array(16));
|
|
22
|
+
const iv = crypto.getRandomValues(new Uint8Array(16));
|
|
23
|
+
const key = await deriveKey(this.#passphrase, salt);
|
|
24
|
+
const encrypted = await crypto.subtle.encrypt({ name: "AES-GCM", iv }, key, data);
|
|
25
|
+
const result = new Uint8Array(salt.byteLength + iv.byteLength + encrypted.byteLength);
|
|
26
|
+
result.set(salt, 0);
|
|
27
|
+
result.set(iv, salt.byteLength);
|
|
28
|
+
result.set(new Uint8Array(encrypted), salt.byteLength + iv.byteLength);
|
|
29
|
+
return result;
|
|
30
|
+
}
|
|
31
|
+
async decrypt(ciphertext) {
|
|
32
|
+
const salt = ciphertext.slice(0, 16);
|
|
33
|
+
const key = await deriveKey(this.#passphrase, salt);
|
|
34
|
+
const iv = ciphertext.slice(16, 32);
|
|
35
|
+
const encrypted = ciphertext.slice(32);
|
|
36
|
+
return new Uint8Array(await crypto.subtle.decrypt({ name: "AES-GCM", iv }, key, encrypted));
|
|
37
|
+
}
|
|
38
38
|
}
|
|
39
|
+
//# sourceMappingURL=encrypt.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"encrypt.js","sourceRoot":"","sources":["../../src/keystore/encrypt.ts"],"names":[],"mappings":"AAKA,KAAK,UAAU,SAAS,CAAC,UAAkB,EAAE,IAAgB;IAC3D,MAAM,OAAO,GAAG,IAAI,WAAW,EAAE,CAAC;IAClC,MAAM,aAAa,GAAG,MAAM,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,KAAK,EAAE,OAAO,CAAC,MAAM,CAAC,UAAU,CAAC,EAAE,QAAQ,EAAE,KAAK,EAAE;QACtG,YAAY;QACZ,WAAW;KACZ,CAAC,CAAC;IAEH,MAAM,GAAG,GAAG,MAAM,MAAM,CAAC,MAAM,CAAC,SAAS,CACvC;QACE,IAAI,EAAE,QAAQ;QACd,IAAI;QACJ,UAAU,EAAE,MAAM;QAClB,IAAI,EAAE,SAAS;KAChB,EACD,aAAa,EACb,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,GAAG,EAAE,EAChC,IAAI,EACJ,CAAC,SAAS,EAAE,SAAS,CAAC,CACvB,CAAC;IAEF,OAAO,GAAG,CAAC;AACb,CAAC;AAED,MAAM,OAAO,mBAAmB;IAC9B,WAAW,CAAS;IAEpB,YAAY,UAAkB;QAC5B,IAAI,CAAC,WAAW,GAAG,UAAU,CAAC;IAChC,CAAC;IAED,KAAK,CAAC,OAAO,CAAC,IAAgB;QAC5B,MAAM,IAAI,GAAG,MAAM,CAAC,eAAe,CAAC,IAAI,UAAU,CAAC,EAAE,CAAC,CAAC,CAAC;QACxD,MAAM,EAAE,GAAG,MAAM,CAAC,eAAe,CAAC,IAAI,UAAU,CAAC,EAAE,CAAC,CAAC,CAAC;QACtD,MAAM,GAAG,GAAG,MAAM,SAAS,CAAC,IAAI,CAAC,WAAW,EAAE,IAAI,CAAC,CAAC;QACpD,MAAM,SAAS,GAAG,MAAM,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,IAAI,CAAC,CAAC;QAElF,MAAM,MAAM,GAAG,IAAI,UAAU,CAAC,IAAI,CAAC,UAAU,GAAG,EAAE,CAAC,UAAU,GAAG,SAAS,CAAC,UAAU,CAAC,CAAC;QACtF,MAAM,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;QACpB,MAAM,CAAC,GAAG,CAAC,EAAE,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC;QAChC,MAAM,CAAC,GAAG,CAAC,IAAI,UAAU,CAAC,SAAS,CAAC,EAAE,IAAI,CAAC,UAAU,GAAG,EAAE,CAAC,UAAU,CAAC,CAAC;QAEvE,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,KAAK,CAAC,OAAO,CAAC,UAAsB;QAClC,MAAM,IAAI,GAAG,UAAU,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QACrC,MAAM,GAAG,GAAG,MAAM,SAAS,CAAC,IAAI,CAAC,WAAW,EAAE,IAAI,CAAC,CAAC;QACpD,MAAM,EAAE,GAAG,UAAU,CAAC,KAAK,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;QACpC,MAAM,SAAS,GAAG,UAAU,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QAEvC,OAAO,IAAI,UAAU,CAAC,MAAM,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,SAAS,CAAC,CAAC,CAAC;IAC9F,CAAC;CACF"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import type { Encrypter } from "./encrypt.ts";
|
|
2
|
+
import { type KeyValueStorage } from "../events/event-store.ts";
|
|
3
|
+
export interface Key {
|
|
4
|
+
/**
|
|
5
|
+
* The public key of the tranferable key.
|
|
6
|
+
*/
|
|
7
|
+
current: string;
|
|
8
|
+
/**
|
|
9
|
+
* Digest of the next public key of the key pair.
|
|
10
|
+
*/
|
|
11
|
+
next: string;
|
|
12
|
+
}
|
|
13
|
+
export interface KeyManagerOptions {
|
|
14
|
+
encrypter: Encrypter;
|
|
15
|
+
storage: KeyValueStorage;
|
|
16
|
+
}
|
|
17
|
+
export declare class KeyManager {
|
|
18
|
+
storage: KeyValueStorage;
|
|
19
|
+
encrypter: Encrypter;
|
|
20
|
+
constructor(options: KeyManagerOptions);
|
|
21
|
+
private load;
|
|
22
|
+
import(key0: Uint8Array, key1: Uint8Array): Promise<Key>;
|
|
23
|
+
incept(): Promise<Key>;
|
|
24
|
+
rotate(publicKey: string): Promise<Key>;
|
|
25
|
+
sign(publicKey: string, message: Uint8Array, index?: number): Promise<string>;
|
|
26
|
+
}
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
import { ed25519 } from "@noble/curves/ed25519";
|
|
2
|
+
import { blake3 } from "@noble/hashes/blake3";
|
|
3
|
+
import { decodeBase64Url, encodeBase64Url, encodeIndexer, encodeMatter, IndexCode, MatterCode, } from "cesr/__unstable__";
|
|
4
|
+
export class KeyManager {
|
|
5
|
+
storage;
|
|
6
|
+
encrypter;
|
|
7
|
+
constructor(options) {
|
|
8
|
+
this.encrypter = options.encrypter;
|
|
9
|
+
this.storage = options.storage;
|
|
10
|
+
}
|
|
11
|
+
async load(publicKey) {
|
|
12
|
+
const value = await this.storage.get(`keys.${publicKey}`);
|
|
13
|
+
if (!value) {
|
|
14
|
+
throw new Error(`Key ${publicKey} not found`);
|
|
15
|
+
}
|
|
16
|
+
const [key0, key1] = value.split("\n");
|
|
17
|
+
return [await this.encrypter.decrypt(decodeBase64Url(key0)), await this.encrypter.decrypt(decodeBase64Url(key1))];
|
|
18
|
+
}
|
|
19
|
+
async import(key0, key1) {
|
|
20
|
+
const current = encodeMatter({
|
|
21
|
+
code: MatterCode.Ed25519,
|
|
22
|
+
raw: ed25519.getPublicKey(key0),
|
|
23
|
+
});
|
|
24
|
+
const next = encodeMatter({
|
|
25
|
+
code: MatterCode.Blake3_256,
|
|
26
|
+
raw: blake3.create({ dkLen: 32 }).update(current).digest(),
|
|
27
|
+
});
|
|
28
|
+
await this.storage.set(`keys.${current}`, [
|
|
29
|
+
encodeBase64Url(await this.encrypter.encrypt(key0)),
|
|
30
|
+
encodeBase64Url(await this.encrypter.encrypt(key1)),
|
|
31
|
+
"\n",
|
|
32
|
+
].join("\n"));
|
|
33
|
+
return { current, next };
|
|
34
|
+
}
|
|
35
|
+
async incept() {
|
|
36
|
+
const key0 = ed25519.utils.randomPrivateKey();
|
|
37
|
+
const key1 = ed25519.utils.randomPrivateKey();
|
|
38
|
+
return await this.import(key0, key1);
|
|
39
|
+
}
|
|
40
|
+
async rotate(publicKey) {
|
|
41
|
+
const [, key0] = await this.load(publicKey);
|
|
42
|
+
const key1 = ed25519.utils.randomPrivateKey();
|
|
43
|
+
const current = encodeMatter({
|
|
44
|
+
code: MatterCode.Ed25519,
|
|
45
|
+
raw: ed25519.getPublicKey(key0),
|
|
46
|
+
});
|
|
47
|
+
const next = encodeMatter({
|
|
48
|
+
code: MatterCode.Blake3_256,
|
|
49
|
+
raw: blake3.create({ dkLen: 32 }).update(current).digest(),
|
|
50
|
+
});
|
|
51
|
+
await this.import(key0, key1);
|
|
52
|
+
return { current, next };
|
|
53
|
+
}
|
|
54
|
+
async sign(publicKey, message, index) {
|
|
55
|
+
const [key] = await this.load(publicKey);
|
|
56
|
+
const signature = ed25519.sign(message, key);
|
|
57
|
+
if (index !== undefined) {
|
|
58
|
+
return encodeIndexer({
|
|
59
|
+
code: IndexCode.Ed25519_Sig,
|
|
60
|
+
raw: signature,
|
|
61
|
+
index,
|
|
62
|
+
});
|
|
63
|
+
}
|
|
64
|
+
return encodeMatter({
|
|
65
|
+
code: MatterCode.Ed25519_Sig,
|
|
66
|
+
raw: signature,
|
|
67
|
+
});
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
//# sourceMappingURL=key-manager.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"key-manager.js","sourceRoot":"","sources":["../../src/keystore/key-manager.ts"],"names":[],"mappings":"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"}
|
package/dist/main.d.ts
CHANGED
|
@@ -1,2 +1,6 @@
|
|
|
1
|
-
export * from "./
|
|
2
|
-
export * from "./
|
|
1
|
+
export * from "./events/events.ts";
|
|
2
|
+
export * from "./events/event-store.ts";
|
|
3
|
+
export * from "./db/storage.ts";
|
|
4
|
+
export * from "./keystore/key-manager.ts";
|
|
5
|
+
export * from "./keystore/encrypt.ts";
|
|
6
|
+
export * from "./controller.ts";
|
package/dist/main.js
CHANGED
|
@@ -1,2 +1,7 @@
|
|
|
1
|
-
export * from "./
|
|
2
|
-
export * from "./
|
|
1
|
+
export * from "./events/events.js";
|
|
2
|
+
export * from "./events/event-store.js";
|
|
3
|
+
export * from "./db/storage.js";
|
|
4
|
+
export * from "./keystore/key-manager.js";
|
|
5
|
+
export * from "./keystore/encrypt.js";
|
|
6
|
+
export * from "./controller.js";
|
|
7
|
+
//# sourceMappingURL=main.js.map
|
package/dist/main.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"main.js","sourceRoot":"","sources":["../src/main.ts"],"names":[],"mappings":"AAAA,cAAc,oBAAoB,CAAC;AACnC,cAAc,yBAAyB,CAAC;AACxC,cAAc,iBAAiB,CAAC;AAChC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,uBAAuB,CAAC;AACtC,cAAc,iBAAiB,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,45 +1,48 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "keri",
|
|
3
|
-
"version": "0.0.
|
|
3
|
+
"version": "0.0.4",
|
|
4
4
|
"scripts": {
|
|
5
|
-
"lint": "eslint && prettier --check . && tsc --noEmit",
|
|
6
|
-
"lint:fix": "eslint --fix && prettier --write .",
|
|
7
5
|
"build": "tsc -p tsconfig.build.json",
|
|
8
|
-
"
|
|
9
|
-
"
|
|
6
|
+
"dev": "tsc -p tsconfig.build.json --watch",
|
|
7
|
+
"test": "node --test --test-reporter=spec --no-warnings --experimental-strip-types",
|
|
8
|
+
"test:integration": "npm test -- 'test_integration/**/*.ts'",
|
|
9
|
+
"test:scripts": "node --no-warnings --experimental-strip-types scripts/run-scripts.ts",
|
|
10
|
+
"lint": "eslint",
|
|
11
|
+
"clean": "node --experimental-strip-types --no-warnings scripts/clean.ts"
|
|
10
12
|
},
|
|
11
13
|
"bin": {
|
|
12
|
-
"keri": "
|
|
14
|
+
"keri": "dist/cli/main.js"
|
|
13
15
|
},
|
|
14
16
|
"exports": {
|
|
15
17
|
".": "./dist/main.js",
|
|
16
|
-
"./
|
|
18
|
+
"./storage-sqlite": "./dist/db/storage-sqlite.js"
|
|
17
19
|
},
|
|
18
20
|
"files": [
|
|
19
21
|
"dist"
|
|
20
22
|
],
|
|
21
23
|
"type": "module",
|
|
22
|
-
"author": "",
|
|
23
|
-
"license": "
|
|
24
|
-
"description": "",
|
|
24
|
+
"author": "Daniel Lenksjö",
|
|
25
|
+
"license": "Apache-2.0",
|
|
26
|
+
"description": "KERI for JavaScript",
|
|
25
27
|
"engines": {
|
|
26
28
|
"node": ">=22"
|
|
27
29
|
},
|
|
30
|
+
"dependencies": {
|
|
31
|
+
"@noble/curves": "^1.9.2",
|
|
32
|
+
"@noble/ed25519": "^2.2.3",
|
|
33
|
+
"@noble/hashes": "^1.8.0",
|
|
34
|
+
"@noble/secp256k1": "^2.2.3",
|
|
35
|
+
"cesr": "^0.0.14",
|
|
36
|
+
"commander": "^14.0.0"
|
|
37
|
+
},
|
|
28
38
|
"devDependencies": {
|
|
29
|
-
"@eslint/js": "^9.
|
|
30
|
-
"@types/node": "^22.
|
|
31
|
-
"
|
|
32
|
-
"eslint": "^9.17.0",
|
|
39
|
+
"@eslint/js": "^9.28.0",
|
|
40
|
+
"@types/node": "^22.15.30",
|
|
41
|
+
"eslint": "^9.28.0",
|
|
33
42
|
"eslint-config-prettier": "^9.1.0",
|
|
34
|
-
"globals": "^15.
|
|
35
|
-
"prettier": "^3.
|
|
36
|
-
"typescript": "^5.
|
|
37
|
-
"typescript-eslint": "^8.
|
|
38
|
-
},
|
|
39
|
-
"dependencies": {
|
|
40
|
-
"@noble/curves": "^1.6.0",
|
|
41
|
-
"@noble/ed25519": "^2.2.2",
|
|
42
|
-
"@noble/hashes": "^1.5.0",
|
|
43
|
-
"@noble/secp256k1": "^2.2.2"
|
|
43
|
+
"globals": "^15.15.0",
|
|
44
|
+
"prettier": "^3.5.3",
|
|
45
|
+
"typescript": "^5.8.3",
|
|
46
|
+
"typescript-eslint": "^8.33.1"
|
|
44
47
|
}
|
|
45
48
|
}
|
package/dist/data-type.d.ts
DELETED
|
@@ -1,9 +0,0 @@
|
|
|
1
|
-
export type DataValue = string | number | boolean | DataObject | DataArray;
|
|
2
|
-
export type DataArray = DataValue[];
|
|
3
|
-
/**
|
|
4
|
-
* Defines a data object that can be serialized to JSON.
|
|
5
|
-
* E.g. key events and acdc objects
|
|
6
|
-
*/
|
|
7
|
-
export interface DataObject {
|
|
8
|
-
[x: string]: DataValue;
|
|
9
|
-
}
|
package/dist/data-type.js
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export {};
|
package/dist/db/sqlite-db.d.ts
DELETED
|
@@ -1,14 +0,0 @@
|
|
|
1
|
-
import type { KeyEvent, ReplyEvent } from "../event.ts";
|
|
2
|
-
export interface SqliteEventStoreOptions {
|
|
3
|
-
filename?: string;
|
|
4
|
-
}
|
|
5
|
-
export declare class SqliteEventStore {
|
|
6
|
-
#private;
|
|
7
|
-
constructor(options?: SqliteEventStoreOptions);
|
|
8
|
-
init(): void;
|
|
9
|
-
insert(event: KeyEvent): Promise<void>;
|
|
10
|
-
get(id: string): Promise<any>;
|
|
11
|
-
aid(id: string): Promise<any[]>;
|
|
12
|
-
locations(id: string): Promise<ReplyEvent[]>;
|
|
13
|
-
list(): Promise<KeyEvent[]>;
|
|
14
|
-
}
|
package/dist/db/sqlite-db.js
DELETED
|
@@ -1,90 +0,0 @@
|
|
|
1
|
-
var __classPrivateFieldSet = (this && this.__classPrivateFieldSet) || function (receiver, state, value, kind, f) {
|
|
2
|
-
if (kind === "m") throw new TypeError("Private method is not writable");
|
|
3
|
-
if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a setter");
|
|
4
|
-
if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot write private member to an object whose class did not declare it");
|
|
5
|
-
return (kind === "a" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;
|
|
6
|
-
};
|
|
7
|
-
var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, state, kind, f) {
|
|
8
|
-
if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter");
|
|
9
|
-
if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it");
|
|
10
|
-
return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);
|
|
11
|
-
};
|
|
12
|
-
var _SqliteEventStore_db;
|
|
13
|
-
import { DatabaseSync } from "node:sqlite";
|
|
14
|
-
import { existsSync, mkdirSync } from "node:fs";
|
|
15
|
-
import { dirname } from "node:path";
|
|
16
|
-
function parseRow(row) {
|
|
17
|
-
if (!row || typeof row !== "object") {
|
|
18
|
-
throw new Error(`Row not found`);
|
|
19
|
-
}
|
|
20
|
-
const data = "data" in row && row["data"];
|
|
21
|
-
if (!data || typeof data !== "string") {
|
|
22
|
-
throw new Error(`Unexpected row format`);
|
|
23
|
-
}
|
|
24
|
-
return JSON.parse(data);
|
|
25
|
-
}
|
|
26
|
-
function ensureDirSync(filename) {
|
|
27
|
-
const dir = dirname(filename);
|
|
28
|
-
if (!existsSync(dir)) {
|
|
29
|
-
mkdirSync(dir);
|
|
30
|
-
}
|
|
31
|
-
}
|
|
32
|
-
export class SqliteEventStore {
|
|
33
|
-
constructor(options = {}) {
|
|
34
|
-
_SqliteEventStore_db.set(this, void 0);
|
|
35
|
-
if (options.filename) {
|
|
36
|
-
ensureDirSync(options.filename);
|
|
37
|
-
}
|
|
38
|
-
__classPrivateFieldSet(this, _SqliteEventStore_db, new DatabaseSync(options.filename ?? ":memory:"), "f");
|
|
39
|
-
}
|
|
40
|
-
init() {
|
|
41
|
-
__classPrivateFieldGet(this, _SqliteEventStore_db, "f").exec(`
|
|
42
|
-
CREATE TABLE IF NOT EXISTS events (
|
|
43
|
-
id TEXT PRIMARY KEY,
|
|
44
|
-
data JSON NOT NULL
|
|
45
|
-
);
|
|
46
|
-
`);
|
|
47
|
-
}
|
|
48
|
-
async insert(event) {
|
|
49
|
-
const sql = `
|
|
50
|
-
INSERT INTO events (id, data)
|
|
51
|
-
VALUES ($id, $data) ON CONFLICT(id) DO NOTHING;
|
|
52
|
-
`;
|
|
53
|
-
__classPrivateFieldGet(this, _SqliteEventStore_db, "f").prepare(sql).run({
|
|
54
|
-
id: event.d,
|
|
55
|
-
data: JSON.stringify(event),
|
|
56
|
-
});
|
|
57
|
-
}
|
|
58
|
-
async get(id) {
|
|
59
|
-
const row = __classPrivateFieldGet(this, _SqliteEventStore_db, "f").prepare("SELECT * FROM events WHERE id = ?").get(id);
|
|
60
|
-
return parseRow(row);
|
|
61
|
-
}
|
|
62
|
-
async aid(id) {
|
|
63
|
-
const sql = `
|
|
64
|
-
SELECT * FROM events WHERE json_extract(data, '$.i') = $aid
|
|
65
|
-
ORDER BY json_extract(data, '$.sn') DESC;
|
|
66
|
-
`;
|
|
67
|
-
const rows = __classPrivateFieldGet(this, _SqliteEventStore_db, "f").prepare(sql).all({ aid: id });
|
|
68
|
-
return rows.map(parseRow);
|
|
69
|
-
}
|
|
70
|
-
async locations(id) {
|
|
71
|
-
const sql = `
|
|
72
|
-
SELECT * FROM
|
|
73
|
-
events
|
|
74
|
-
WHERE
|
|
75
|
-
json_extract(data, '$.t') = 'rpy' AND
|
|
76
|
-
json_extract(data, '$.r') = '/loc/scheme' AND
|
|
77
|
-
json_extract(data, '$.a.eid') = $id;
|
|
78
|
-
`;
|
|
79
|
-
const rows = __classPrivateFieldGet(this, _SqliteEventStore_db, "f").prepare(sql).all({ id });
|
|
80
|
-
return rows.map(parseRow);
|
|
81
|
-
}
|
|
82
|
-
async list() {
|
|
83
|
-
const sql = `
|
|
84
|
-
SELECT * FROM events;
|
|
85
|
-
`;
|
|
86
|
-
const rows = __classPrivateFieldGet(this, _SqliteEventStore_db, "f").prepare(sql).all();
|
|
87
|
-
return rows.map(parseRow);
|
|
88
|
-
}
|
|
89
|
-
}
|
|
90
|
-
_SqliteEventStore_db = new WeakMap();
|
package/dist/event.d.ts
DELETED
|
@@ -1,45 +0,0 @@
|
|
|
1
|
-
import type { DataArray, DataObject } from "./data-type.ts";
|
|
2
|
-
export type Threshold = string | string[];
|
|
3
|
-
export interface InceptArgs {
|
|
4
|
-
k: string[];
|
|
5
|
-
kt: Threshold;
|
|
6
|
-
n: string[];
|
|
7
|
-
nt: Threshold;
|
|
8
|
-
b?: string[];
|
|
9
|
-
bt?: string;
|
|
10
|
-
}
|
|
11
|
-
export interface KeyEvent {
|
|
12
|
-
v: string;
|
|
13
|
-
t: string;
|
|
14
|
-
d: string;
|
|
15
|
-
}
|
|
16
|
-
export interface InceptEvent {
|
|
17
|
-
v: string;
|
|
18
|
-
t: "icp";
|
|
19
|
-
d: string;
|
|
20
|
-
i: string;
|
|
21
|
-
s: string;
|
|
22
|
-
kt: Threshold;
|
|
23
|
-
k: string[];
|
|
24
|
-
nt: Threshold;
|
|
25
|
-
n: string[];
|
|
26
|
-
bt: string;
|
|
27
|
-
b: string[];
|
|
28
|
-
c: string[];
|
|
29
|
-
a: DataArray;
|
|
30
|
-
}
|
|
31
|
-
export declare function incept(data: InceptArgs): InceptEvent;
|
|
32
|
-
export interface ReplyArgs {
|
|
33
|
-
dt?: string;
|
|
34
|
-
r: string;
|
|
35
|
-
a: DataObject;
|
|
36
|
-
}
|
|
37
|
-
export interface ReplyEvent {
|
|
38
|
-
v: string;
|
|
39
|
-
t: "rpy";
|
|
40
|
-
d: string;
|
|
41
|
-
dt: string;
|
|
42
|
-
r: string;
|
|
43
|
-
a: DataObject;
|
|
44
|
-
}
|
|
45
|
-
export declare function reply(data: ReplyArgs): ReplyEvent;
|