@dxos/keyring 0.10.0 → 0.11.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/dist/lib/index.mjs +291 -0
- package/dist/lib/index.mjs.map +1 -0
- package/dist/types/src/keyring.d.ts +7 -0
- package/dist/types/src/keyring.d.ts.map +1 -1
- package/dist/types/src/sqlite-keyring.d.ts +6 -1
- package/dist/types/src/sqlite-keyring.d.ts.map +1 -1
- package/dist/types/tsconfig.tsbuildinfo +1 -1
- package/package.json +14 -14
- package/src/keyring.ts +7 -0
- package/src/sqlite-keyring.ts +14 -1
- package/dist/lib/neutral/index.mjs +0 -288
- package/dist/lib/neutral/index.mjs.map +0 -7
- package/dist/lib/neutral/meta.json +0 -1
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@dxos/keyring",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.11.0",
|
|
4
4
|
"description": "Halo Keyring.",
|
|
5
5
|
"homepage": "https://dxos.org",
|
|
6
6
|
"bugs": "https://github.com/dxos/dxos/issues",
|
|
@@ -16,7 +16,7 @@
|
|
|
16
16
|
".": {
|
|
17
17
|
"source": "./src/index.ts",
|
|
18
18
|
"types": "./dist/types/src/index.d.ts",
|
|
19
|
-
"
|
|
19
|
+
"import": "./dist/lib/index.mjs"
|
|
20
20
|
}
|
|
21
21
|
},
|
|
22
22
|
"types": "dist/types/src/index.d.ts",
|
|
@@ -27,18 +27,18 @@
|
|
|
27
27
|
"dependencies": {
|
|
28
28
|
"@effect/sql": "0.51.1",
|
|
29
29
|
"effect": "3.21.4",
|
|
30
|
-
"@dxos/
|
|
31
|
-
"@dxos/
|
|
32
|
-
"@dxos/
|
|
33
|
-
"@dxos/
|
|
34
|
-
"@dxos/
|
|
35
|
-
"@dxos/
|
|
36
|
-
"@dxos/
|
|
37
|
-
"@dxos/
|
|
38
|
-
"@dxos/
|
|
39
|
-
"@dxos/
|
|
40
|
-
"@dxos/
|
|
41
|
-
"@dxos/
|
|
30
|
+
"@dxos/async": "0.11.0",
|
|
31
|
+
"@dxos/debug": "0.11.0",
|
|
32
|
+
"@dxos/effect": "0.11.0",
|
|
33
|
+
"@dxos/crypto": "0.11.0",
|
|
34
|
+
"@dxos/codec-protobuf": "0.11.0",
|
|
35
|
+
"@dxos/invariant": "0.11.0",
|
|
36
|
+
"@dxos/keys": "0.11.0",
|
|
37
|
+
"@dxos/node-std": "0.11.0",
|
|
38
|
+
"@dxos/protocols": "0.11.0",
|
|
39
|
+
"@dxos/random-access-storage": "0.11.0",
|
|
40
|
+
"@dxos/sql-sqlite": "0.11.0",
|
|
41
|
+
"@dxos/util": "0.11.0"
|
|
42
42
|
},
|
|
43
43
|
"devDependencies": {},
|
|
44
44
|
"publishConfig": {
|
package/src/keyring.ts
CHANGED
|
@@ -2,6 +2,8 @@
|
|
|
2
2
|
// Copyright 2022 DXOS.org
|
|
3
3
|
//
|
|
4
4
|
|
|
5
|
+
import * as EffectContext from 'effect/Context';
|
|
6
|
+
|
|
5
7
|
import { Event, synchronized } from '@dxos/async';
|
|
6
8
|
import { type ProtoCodec } from '@dxos/codec-protobuf';
|
|
7
9
|
import { type Signer, subtleCrypto } from '@dxos/crypto';
|
|
@@ -25,6 +27,11 @@ export interface KeyringApi extends Signer {
|
|
|
25
27
|
list(): Promise<KeyRecord[]>;
|
|
26
28
|
}
|
|
27
29
|
|
|
30
|
+
/**
|
|
31
|
+
* Effect service tag for {@link KeyringApi}.
|
|
32
|
+
*/
|
|
33
|
+
export class KeyringApiService extends EffectContext.Tag('@dxos/keyring/KeyringApi')<KeyringApiService, KeyringApi>() {}
|
|
34
|
+
|
|
28
35
|
/**
|
|
29
36
|
* Manages keys.
|
|
30
37
|
*/
|
package/src/sqlite-keyring.ts
CHANGED
|
@@ -5,6 +5,7 @@
|
|
|
5
5
|
import * as SqlClient from '@effect/sql/SqlClient';
|
|
6
6
|
import type * as SqlError from '@effect/sql/SqlError';
|
|
7
7
|
import * as Effect from 'effect/Effect';
|
|
8
|
+
import * as Layer from 'effect/Layer';
|
|
8
9
|
|
|
9
10
|
import { Event, synchronized } from '@dxos/async';
|
|
10
11
|
import { subtleCrypto } from '@dxos/crypto';
|
|
@@ -16,7 +17,7 @@ import { type KeyRecord } from '@dxos/protocols/proto/dxos/halo/keyring';
|
|
|
16
17
|
import { SqlTransaction } from '@dxos/sql-sqlite';
|
|
17
18
|
import { ComplexMap, arrayToBuffer } from '@dxos/util';
|
|
18
19
|
|
|
19
|
-
import { type KeyringApi } from './keyring';
|
|
20
|
+
import { type KeyringApi, KeyringApiService } from './keyring';
|
|
20
21
|
|
|
21
22
|
const KeyRecordCodec = schema.getCodecForType('dxos.halo.keyring.KeyRecord');
|
|
22
23
|
|
|
@@ -157,3 +158,15 @@ export class SqliteKeyring implements KeyringApi {
|
|
|
157
158
|
|
|
158
159
|
const keyPairToPublicKey = async (keyPair: CryptoKeyPair): Promise<PublicKey> =>
|
|
159
160
|
PublicKey.from(new Uint8Array(await subtleCrypto.exportKey('raw', keyPair.publicKey)));
|
|
161
|
+
|
|
162
|
+
/**
|
|
163
|
+
* Effect Layer constructing a {@link SqliteKeyring} from the ambient SQL runtime.
|
|
164
|
+
*/
|
|
165
|
+
export const SqliteKeyringLayer = (): Layer.Layer<KeyringApiService, never, SqlClient.SqlClient | SqlTransactionTag> =>
|
|
166
|
+
Layer.effect(
|
|
167
|
+
KeyringApiService,
|
|
168
|
+
Effect.gen(function* () {
|
|
169
|
+
const runtime = yield* RuntimeProvider.currentRuntime<SqlClient.SqlClient | SqlTransactionTag>();
|
|
170
|
+
return new SqliteKeyring({ runtime });
|
|
171
|
+
}),
|
|
172
|
+
);
|
|
@@ -1,288 +0,0 @@
|
|
|
1
|
-
import "@dxos/node-std/globals";
|
|
2
|
-
|
|
3
|
-
// src/keyring.ts
|
|
4
|
-
import { Event, synchronized } from "@dxos/async";
|
|
5
|
-
import { subtleCrypto } from "@dxos/crypto";
|
|
6
|
-
import { todo } from "@dxos/debug";
|
|
7
|
-
import { invariant } from "@dxos/invariant";
|
|
8
|
-
import { PublicKey } from "@dxos/keys";
|
|
9
|
-
import { schema } from "@dxos/protocols/proto";
|
|
10
|
-
import { StorageType, createStorage } from "@dxos/random-access-storage";
|
|
11
|
-
import { ComplexMap, arrayToBuffer } from "@dxos/util";
|
|
12
|
-
var __dxlog_file = "/__w/dxos/dxos/packages/core/halo/keyring/src/keyring.ts";
|
|
13
|
-
function _ts_decorate(decorators, target, key, desc) {
|
|
14
|
-
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
15
|
-
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
16
|
-
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
17
|
-
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
18
|
-
}
|
|
19
|
-
var KeyRecord = schema.getCodecForType("dxos.halo.keyring.KeyRecord");
|
|
20
|
-
var Keyring = class {
|
|
21
|
-
_storage;
|
|
22
|
-
_keyCache = new ComplexMap(PublicKey.hash);
|
|
23
|
-
keysUpdate = new Event();
|
|
24
|
-
constructor(_storage = createStorage({
|
|
25
|
-
type: StorageType.RAM
|
|
26
|
-
}).createDirectory("keyring")) {
|
|
27
|
-
this._storage = _storage;
|
|
28
|
-
invariant(subtleCrypto, "SubtleCrypto not available in this environment.", { "~LogMeta": "~LogMeta", F: __dxlog_file, L: 29, S: this, A: ["subtleCrypto", "'SubtleCrypto not available in this environment.'"] });
|
|
29
|
-
}
|
|
30
|
-
async sign(key, message) {
|
|
31
|
-
const keyPair = await this._getKey(key);
|
|
32
|
-
return new Uint8Array(await subtleCrypto.sign({
|
|
33
|
-
name: "ECDSA",
|
|
34
|
-
hash: "SHA-256"
|
|
35
|
-
}, keyPair.privateKey, message));
|
|
36
|
-
}
|
|
37
|
-
async createKey() {
|
|
38
|
-
const keyPair = await subtleCrypto.generateKey({
|
|
39
|
-
name: "ECDSA",
|
|
40
|
-
namedCurve: "P-256"
|
|
41
|
-
}, true, [
|
|
42
|
-
"sign",
|
|
43
|
-
"verify"
|
|
44
|
-
]);
|
|
45
|
-
await this._setKey(keyPair);
|
|
46
|
-
return keyPairToPublicKey(keyPair);
|
|
47
|
-
}
|
|
48
|
-
async _getKey(key) {
|
|
49
|
-
if (!this._keyCache.has(key)) {
|
|
50
|
-
const file = this._storage.getOrCreateFile(key.toHex());
|
|
51
|
-
const { size } = await file.stat();
|
|
52
|
-
if (size === 0) {
|
|
53
|
-
throw new Error(`Key not found: ${key.toHex()}`);
|
|
54
|
-
}
|
|
55
|
-
const recordBytes = await file.read(0, size);
|
|
56
|
-
await file.close();
|
|
57
|
-
const record = KeyRecord.decode(recordBytes);
|
|
58
|
-
const publicKey = PublicKey.from(record.publicKey);
|
|
59
|
-
invariant(key.equals(publicKey), "Corrupted keyring: Key mismatch", { "~LogMeta": "~LogMeta", F: __dxlog_file, L: 60, S: this, A: ["key.equals(publicKey)", "'Corrupted keyring: Key mismatch'"] });
|
|
60
|
-
invariant(record.privateKey, "Corrupted keyring: Missing private key", { "~LogMeta": "~LogMeta", F: __dxlog_file, L: 61, S: this, A: ["record.privateKey", "'Corrupted keyring: Missing private key'"] });
|
|
61
|
-
const keyPair = {
|
|
62
|
-
publicKey: await subtleCrypto.importKey("raw", record.publicKey, {
|
|
63
|
-
name: "ECDSA",
|
|
64
|
-
namedCurve: "P-256"
|
|
65
|
-
}, true, [
|
|
66
|
-
"verify"
|
|
67
|
-
]),
|
|
68
|
-
privateKey: await subtleCrypto.importKey("pkcs8", record.privateKey, {
|
|
69
|
-
name: "ECDSA",
|
|
70
|
-
namedCurve: "P-256"
|
|
71
|
-
}, true, [
|
|
72
|
-
"sign"
|
|
73
|
-
])
|
|
74
|
-
};
|
|
75
|
-
this._keyCache.set(publicKey, keyPair);
|
|
76
|
-
}
|
|
77
|
-
return this._keyCache.get(key);
|
|
78
|
-
}
|
|
79
|
-
async _setKey(keyPair) {
|
|
80
|
-
const publicKey = await keyPairToPublicKey(keyPair);
|
|
81
|
-
this._keyCache.set(publicKey, keyPair);
|
|
82
|
-
const record = {
|
|
83
|
-
publicKey: publicKey.asUint8Array(),
|
|
84
|
-
privateKey: new Uint8Array(await subtleCrypto.exportKey("pkcs8", keyPair.privateKey))
|
|
85
|
-
};
|
|
86
|
-
const file = this._storage.getOrCreateFile(publicKey.toHex());
|
|
87
|
-
await file.write(0, arrayToBuffer(KeyRecord.encode(record)));
|
|
88
|
-
await file.close();
|
|
89
|
-
await file.flush?.();
|
|
90
|
-
this.keysUpdate.emit();
|
|
91
|
-
}
|
|
92
|
-
// TODO(burdon): ???
|
|
93
|
-
deleteKey(key) {
|
|
94
|
-
return todo("We need a method to delete a file.");
|
|
95
|
-
}
|
|
96
|
-
async list() {
|
|
97
|
-
const keys = [];
|
|
98
|
-
for (const path of await this._storage.list()) {
|
|
99
|
-
const fileName = path.split("/").pop();
|
|
100
|
-
invariant(fileName, "Invalid file name", { "~LogMeta": "~LogMeta", F: __dxlog_file, L: 101, S: this, A: ["fileName", "'Invalid file name'"] });
|
|
101
|
-
keys.push({
|
|
102
|
-
publicKey: PublicKey.fromHex(fileName).asUint8Array()
|
|
103
|
-
});
|
|
104
|
-
}
|
|
105
|
-
return keys;
|
|
106
|
-
}
|
|
107
|
-
async importKeyPair(keyPair) {
|
|
108
|
-
await this._setKey(keyPair);
|
|
109
|
-
return keyPairToPublicKey(keyPair);
|
|
110
|
-
}
|
|
111
|
-
};
|
|
112
|
-
_ts_decorate([
|
|
113
|
-
synchronized
|
|
114
|
-
], Keyring.prototype, "_getKey", null);
|
|
115
|
-
_ts_decorate([
|
|
116
|
-
synchronized
|
|
117
|
-
], Keyring.prototype, "_setKey", null);
|
|
118
|
-
var keyPairToPublicKey = async (keyPair) => {
|
|
119
|
-
return PublicKey.from(new Uint8Array(await subtleCrypto.exportKey("raw", keyPair.publicKey)));
|
|
120
|
-
};
|
|
121
|
-
|
|
122
|
-
// src/sqlite-keyring.ts
|
|
123
|
-
import * as SqlClient from "@effect/sql/SqlClient";
|
|
124
|
-
import * as Effect from "effect/Effect";
|
|
125
|
-
import { Event as Event2, synchronized as synchronized2 } from "@dxos/async";
|
|
126
|
-
import { subtleCrypto as subtleCrypto2 } from "@dxos/crypto";
|
|
127
|
-
import { RuntimeProvider } from "@dxos/effect";
|
|
128
|
-
import { invariant as invariant2 } from "@dxos/invariant";
|
|
129
|
-
import { PublicKey as PublicKey2 } from "@dxos/keys";
|
|
130
|
-
import { schema as schema2 } from "@dxos/protocols/proto";
|
|
131
|
-
import { ComplexMap as ComplexMap2, arrayToBuffer as arrayToBuffer2 } from "@dxos/util";
|
|
132
|
-
var __dxlog_file2 = "/__w/dxos/dxos/packages/core/halo/keyring/src/sqlite-keyring.ts";
|
|
133
|
-
function _ts_decorate2(decorators, target, key, desc) {
|
|
134
|
-
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
135
|
-
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
136
|
-
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
137
|
-
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
138
|
-
}
|
|
139
|
-
var KeyRecordCodec = schema2.getCodecForType("dxos.halo.keyring.KeyRecord");
|
|
140
|
-
var SqliteKeyring = class {
|
|
141
|
-
#runtime;
|
|
142
|
-
#keyCache = new ComplexMap2(PublicKey2.hash);
|
|
143
|
-
keysUpdate = new Event2();
|
|
144
|
-
constructor({ runtime }) {
|
|
145
|
-
invariant2(subtleCrypto2, "SubtleCrypto not available in this environment.", { "~LogMeta": "~LogMeta", F: __dxlog_file2, L: 28, S: this, A: ["subtleCrypto", "'SubtleCrypto not available in this environment.'"] });
|
|
146
|
-
this.#runtime = runtime;
|
|
147
|
-
}
|
|
148
|
-
migrate = Effect.fn("SqliteKeyring.migrate")(() => Effect.gen(function* () {
|
|
149
|
-
const sql = yield* SqlClient.SqlClient;
|
|
150
|
-
yield* sql`CREATE TABLE IF NOT EXISTS keyring (
|
|
151
|
-
public_key TEXT PRIMARY KEY,
|
|
152
|
-
record BLOB NOT NULL
|
|
153
|
-
)`;
|
|
154
|
-
}).pipe(Effect.withSpan("SqliteKeyring.migrate")))();
|
|
155
|
-
async sign(key, message) {
|
|
156
|
-
const keyPair = await this._getKey(key);
|
|
157
|
-
return new Uint8Array(await subtleCrypto2.sign({
|
|
158
|
-
name: "ECDSA",
|
|
159
|
-
hash: "SHA-256"
|
|
160
|
-
}, keyPair.privateKey, message));
|
|
161
|
-
}
|
|
162
|
-
async createKey() {
|
|
163
|
-
const keyPair = await subtleCrypto2.generateKey({
|
|
164
|
-
name: "ECDSA",
|
|
165
|
-
namedCurve: "P-256"
|
|
166
|
-
}, true, [
|
|
167
|
-
"sign",
|
|
168
|
-
"verify"
|
|
169
|
-
]);
|
|
170
|
-
await this._setKey(keyPair);
|
|
171
|
-
return keyPairToPublicKey2(keyPair);
|
|
172
|
-
}
|
|
173
|
-
async importKeyPair(keyPair) {
|
|
174
|
-
await this._setKey(keyPair);
|
|
175
|
-
return keyPairToPublicKey2(keyPair);
|
|
176
|
-
}
|
|
177
|
-
async list() {
|
|
178
|
-
const rows = await RuntimeProvider.runPromise(this.#runtime)(Effect.gen(function* () {
|
|
179
|
-
const sql = yield* SqlClient.SqlClient;
|
|
180
|
-
return yield* sql`SELECT record FROM keyring`;
|
|
181
|
-
}));
|
|
182
|
-
return rows.map((row) => {
|
|
183
|
-
const record = KeyRecordCodec.decode(row.record);
|
|
184
|
-
return {
|
|
185
|
-
publicKey: record.publicKey
|
|
186
|
-
};
|
|
187
|
-
});
|
|
188
|
-
}
|
|
189
|
-
async _getKey(key) {
|
|
190
|
-
if (this.#keyCache.has(key)) {
|
|
191
|
-
return this.#keyCache.get(key);
|
|
192
|
-
}
|
|
193
|
-
const keyHex = key.toHex();
|
|
194
|
-
const rows = await RuntimeProvider.runPromise(this.#runtime)(Effect.gen(function* () {
|
|
195
|
-
const sql = yield* SqlClient.SqlClient;
|
|
196
|
-
return yield* sql`SELECT record FROM keyring WHERE public_key = ${keyHex}`;
|
|
197
|
-
}));
|
|
198
|
-
if (rows.length === 0) {
|
|
199
|
-
throw new Error(`Key not found: ${keyHex}`);
|
|
200
|
-
}
|
|
201
|
-
const record = KeyRecordCodec.decode(rows[0].record);
|
|
202
|
-
const publicKey = PublicKey2.from(record.publicKey);
|
|
203
|
-
invariant2(key.equals(publicKey), "Corrupted keyring: key mismatch", { "~LogMeta": "~LogMeta", F: __dxlog_file2, L: 87, S: this, A: ["key.equals(publicKey)", "'Corrupted keyring: key mismatch'"] });
|
|
204
|
-
invariant2(record.privateKey, "Corrupted keyring: missing private key", { "~LogMeta": "~LogMeta", F: __dxlog_file2, L: 88, S: this, A: ["record.privateKey", "'Corrupted keyring: missing private key'"] });
|
|
205
|
-
const keyPair = {
|
|
206
|
-
publicKey: await subtleCrypto2.importKey("raw", record.publicKey, {
|
|
207
|
-
name: "ECDSA",
|
|
208
|
-
namedCurve: "P-256"
|
|
209
|
-
}, true, [
|
|
210
|
-
"verify"
|
|
211
|
-
]),
|
|
212
|
-
privateKey: await subtleCrypto2.importKey("pkcs8", record.privateKey, {
|
|
213
|
-
name: "ECDSA",
|
|
214
|
-
namedCurve: "P-256"
|
|
215
|
-
}, true, [
|
|
216
|
-
"sign"
|
|
217
|
-
])
|
|
218
|
-
};
|
|
219
|
-
this.#keyCache.set(publicKey, keyPair);
|
|
220
|
-
return keyPair;
|
|
221
|
-
}
|
|
222
|
-
async _setKey(keyPair) {
|
|
223
|
-
const publicKey = await keyPairToPublicKey2(keyPair);
|
|
224
|
-
this.#keyCache.set(publicKey, keyPair);
|
|
225
|
-
const record = {
|
|
226
|
-
publicKey: publicKey.asUint8Array(),
|
|
227
|
-
privateKey: new Uint8Array(await subtleCrypto2.exportKey("pkcs8", keyPair.privateKey))
|
|
228
|
-
};
|
|
229
|
-
const keyHex = publicKey.toHex();
|
|
230
|
-
const encodedRecord = arrayToBuffer2(KeyRecordCodec.encode(record));
|
|
231
|
-
await RuntimeProvider.runPromise(this.#runtime)(Effect.gen(function* () {
|
|
232
|
-
const sql = yield* SqlClient.SqlClient;
|
|
233
|
-
yield* sql`INSERT OR REPLACE INTO keyring (public_key, record) VALUES (${keyHex}, ${encodedRecord})`;
|
|
234
|
-
}));
|
|
235
|
-
this.keysUpdate.emit();
|
|
236
|
-
}
|
|
237
|
-
};
|
|
238
|
-
_ts_decorate2([
|
|
239
|
-
synchronized2
|
|
240
|
-
], SqliteKeyring.prototype, "_getKey", null);
|
|
241
|
-
_ts_decorate2([
|
|
242
|
-
synchronized2
|
|
243
|
-
], SqliteKeyring.prototype, "_setKey", null);
|
|
244
|
-
var keyPairToPublicKey2 = async (keyPair) => PublicKey2.from(new Uint8Array(await subtleCrypto2.exportKey("raw", keyPair.publicKey)));
|
|
245
|
-
|
|
246
|
-
// src/testing.ts
|
|
247
|
-
import { subtleCrypto as subtleCrypto3 } from "@dxos/crypto";
|
|
248
|
-
var generateJWKKeyPair = async () => {
|
|
249
|
-
const keyPair = await subtleCrypto3.generateKey({
|
|
250
|
-
name: "ECDSA",
|
|
251
|
-
namedCurve: "P-256"
|
|
252
|
-
}, true, [
|
|
253
|
-
"sign",
|
|
254
|
-
"verify"
|
|
255
|
-
]);
|
|
256
|
-
const privateKeyExported = await subtleCrypto3.exportKey("jwk", keyPair.privateKey);
|
|
257
|
-
const publicKeyExported = await subtleCrypto3.exportKey("jwk", keyPair.publicKey);
|
|
258
|
-
const publicKeyBuffer = new Uint8Array(await subtleCrypto3.exportKey("raw", keyPair.publicKey));
|
|
259
|
-
const publicKeyHex = Array.from(publicKeyBuffer).map((byte) => byte.toString(16).padStart(2, "0")).join("");
|
|
260
|
-
return {
|
|
261
|
-
privateKey: privateKeyExported,
|
|
262
|
-
publicKey: publicKeyExported,
|
|
263
|
-
publicKeyHex
|
|
264
|
-
};
|
|
265
|
-
};
|
|
266
|
-
var parseJWKKeyPair = async (privateKey, publicKey) => {
|
|
267
|
-
return {
|
|
268
|
-
privateKey: await subtleCrypto3.importKey("jwk", privateKey, {
|
|
269
|
-
name: "ECDSA",
|
|
270
|
-
namedCurve: "P-256"
|
|
271
|
-
}, true, [
|
|
272
|
-
"sign"
|
|
273
|
-
]),
|
|
274
|
-
publicKey: await subtleCrypto3.importKey("jwk", publicKey, {
|
|
275
|
-
name: "ECDSA",
|
|
276
|
-
namedCurve: "P-256"
|
|
277
|
-
}, true, [
|
|
278
|
-
"verify"
|
|
279
|
-
])
|
|
280
|
-
};
|
|
281
|
-
};
|
|
282
|
-
export {
|
|
283
|
-
Keyring,
|
|
284
|
-
SqliteKeyring,
|
|
285
|
-
generateJWKKeyPair,
|
|
286
|
-
parseJWKKeyPair
|
|
287
|
-
};
|
|
288
|
-
//# sourceMappingURL=index.mjs.map
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 3,
|
|
3
|
-
"sources": ["../../../src/keyring.ts", "../../../src/sqlite-keyring.ts", "../../../src/testing.ts"],
|
|
4
|
-
"sourcesContent": ["//\n// Copyright 2022 DXOS.org\n//\n\nimport { Event, synchronized } from '@dxos/async';\nimport { type ProtoCodec } from '@dxos/codec-protobuf';\nimport { type Signer, subtleCrypto } from '@dxos/crypto';\nimport { todo } from '@dxos/debug';\nimport { invariant } from '@dxos/invariant';\nimport { PublicKey } from '@dxos/keys';\nimport { schema } from '@dxos/protocols/proto';\nimport { type KeyRecord } from '@dxos/protocols/proto/dxos/halo/keyring';\nimport { type Directory, StorageType, createStorage } from '@dxos/random-access-storage';\nimport { ComplexMap, arrayToBuffer } from '@dxos/util';\n\nconst KeyRecord: ProtoCodec<KeyRecord> = schema.getCodecForType('dxos.halo.keyring.KeyRecord');\n\n/**\n * Shared public API for keyring implementations.\n */\nexport interface KeyringApi extends Signer {\n readonly keysUpdate: Event;\n createKey(): Promise<PublicKey>;\n importKeyPair(keyPair: CryptoKeyPair): Promise<PublicKey>;\n list(): Promise<KeyRecord[]>;\n}\n\n/**\n * Manages keys.\n */\nexport class Keyring implements KeyringApi {\n private readonly _keyCache = new ComplexMap<PublicKey, CryptoKeyPair>(PublicKey.hash);\n readonly keysUpdate = new Event();\n\n constructor(\n private readonly _storage: Directory = createStorage({\n type: StorageType.RAM,\n }).createDirectory('keyring'),\n ) {\n invariant(subtleCrypto, 'SubtleCrypto not available in this environment.');\n }\n\n async sign(key: PublicKey, message: Uint8Array): Promise<Uint8Array> {\n const keyPair = await this._getKey(key);\n\n return new Uint8Array(\n await subtleCrypto.sign(\n {\n name: 'ECDSA',\n hash: 'SHA-256',\n },\n keyPair.privateKey,\n message as Uint8Array<ArrayBuffer>,\n ),\n );\n }\n\n async createKey(): Promise<PublicKey> {\n const keyPair = await subtleCrypto.generateKey(\n {\n name: 'ECDSA',\n namedCurve: 'P-256',\n },\n true,\n ['sign', 'verify'],\n );\n\n await this._setKey(keyPair);\n\n return keyPairToPublicKey(keyPair);\n }\n\n @synchronized\n private async _getKey(key: PublicKey): Promise<CryptoKeyPair> {\n if (!this._keyCache.has(key)) {\n const file = this._storage.getOrCreateFile(key.toHex());\n const { size } = await file.stat();\n if (size === 0) {\n throw new Error(`Key not found: ${key.toHex()}`);\n }\n\n const recordBytes = await file.read(0, size);\n await file.close();\n\n const record = KeyRecord.decode(recordBytes);\n const publicKey = PublicKey.from(record.publicKey);\n invariant(key.equals(publicKey), 'Corrupted keyring: Key mismatch');\n invariant(record.privateKey, 'Corrupted keyring: Missing private key');\n const keyPair: CryptoKeyPair = {\n publicKey: await subtleCrypto.importKey(\n 'raw',\n record.publicKey as Uint8Array<ArrayBuffer>,\n {\n name: 'ECDSA',\n namedCurve: 'P-256',\n },\n true,\n ['verify'],\n ),\n privateKey: await subtleCrypto.importKey(\n 'pkcs8',\n record.privateKey as Uint8Array<ArrayBuffer>,\n {\n name: 'ECDSA',\n namedCurve: 'P-256',\n },\n true,\n ['sign'],\n ),\n };\n\n this._keyCache.set(publicKey, keyPair);\n }\n\n return this._keyCache.get(key)!; // TODO(burdon): Fail if null?\n }\n\n @synchronized\n private async _setKey(keyPair: CryptoKeyPair): Promise<void> {\n const publicKey = await keyPairToPublicKey(keyPair);\n this._keyCache.set(publicKey, keyPair);\n\n const record: KeyRecord = {\n publicKey: publicKey.asUint8Array(),\n privateKey: new Uint8Array(await subtleCrypto.exportKey('pkcs8', keyPair.privateKey)),\n };\n\n const file = this._storage.getOrCreateFile(publicKey.toHex());\n await file.write(0, arrayToBuffer(KeyRecord.encode(record)));\n await file.close();\n await file.flush?.();\n this.keysUpdate.emit();\n }\n\n // TODO(burdon): ???\n deleteKey(key: PublicKey): Promise<void> {\n return todo('We need a method to delete a file.');\n }\n\n async list(): Promise<KeyRecord[]> {\n const keys: KeyRecord[] = [];\n for (const path of await this._storage.list()) {\n const fileName = path.split('/').pop(); // get last portion of the path\n invariant(fileName, 'Invalid file name');\n keys.push({ publicKey: PublicKey.fromHex(fileName).asUint8Array() });\n }\n return keys;\n }\n\n async importKeyPair(keyPair: CryptoKeyPair): Promise<PublicKey> {\n await this._setKey(keyPair);\n return keyPairToPublicKey(keyPair);\n }\n}\n\nconst keyPairToPublicKey = async (keyPair: CryptoKeyPair): Promise<PublicKey> => {\n return PublicKey.from(new Uint8Array(await subtleCrypto.exportKey('raw', keyPair.publicKey)));\n};\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport * as SqlClient from '@effect/sql/SqlClient';\nimport type * as SqlError from '@effect/sql/SqlError';\nimport * as Effect from 'effect/Effect';\n\nimport { Event, synchronized } from '@dxos/async';\nimport { subtleCrypto } from '@dxos/crypto';\nimport { RuntimeProvider } from '@dxos/effect';\nimport { invariant } from '@dxos/invariant';\nimport { PublicKey } from '@dxos/keys';\nimport { schema } from '@dxos/protocols/proto';\nimport { type KeyRecord } from '@dxos/protocols/proto/dxos/halo/keyring';\nimport { SqlTransaction } from '@dxos/sql-sqlite';\nimport { ComplexMap, arrayToBuffer } from '@dxos/util';\n\nimport { type KeyringApi } from './keyring';\n\nconst KeyRecordCodec = schema.getCodecForType('dxos.halo.keyring.KeyRecord');\n\n// SqlTransaction.SqlTransaction is the Tag class exported from the SqlTransaction namespace.\ntype SqlTransactionTag = SqlTransaction.SqlTransaction;\n\nexport type SqliteKeyringOptions = {\n runtime: RuntimeProvider.RuntimeProvider<SqlClient.SqlClient | SqlTransactionTag>;\n};\n\n/**\n * SQLite-backed Keyring.\n * Stores ECDSA key pairs in the `keyring` table.\n */\nexport class SqliteKeyring implements KeyringApi {\n readonly #runtime: RuntimeProvider.RuntimeProvider<SqlClient.SqlClient | SqlTransactionTag>;\n readonly #keyCache = new ComplexMap<PublicKey, CryptoKeyPair>(PublicKey.hash);\n readonly keysUpdate = new Event();\n\n constructor({ runtime }: SqliteKeyringOptions) {\n invariant(subtleCrypto, 'SubtleCrypto not available in this environment.');\n this.#runtime = runtime;\n }\n\n readonly migrate: Effect.Effect<void, SqlError.SqlError, SqlClient.SqlClient | SqlTransactionTag> = Effect.fn(\n 'SqliteKeyring.migrate',\n )(() =>\n Effect.gen(function* () {\n const sql = yield* SqlClient.SqlClient;\n yield* sql`CREATE TABLE IF NOT EXISTS keyring (\n public_key TEXT PRIMARY KEY,\n record BLOB NOT NULL\n )`;\n }).pipe(Effect.withSpan('SqliteKeyring.migrate')),\n )();\n\n async sign(key: PublicKey, message: Uint8Array): Promise<Uint8Array> {\n const keyPair = await this._getKey(key);\n return new Uint8Array(\n await subtleCrypto.sign(\n { name: 'ECDSA', hash: 'SHA-256' },\n keyPair.privateKey,\n message as Uint8Array<ArrayBuffer>,\n ),\n );\n }\n\n async createKey(): Promise<PublicKey> {\n const keyPair = await subtleCrypto.generateKey({ name: 'ECDSA', namedCurve: 'P-256' }, true, ['sign', 'verify']);\n await this._setKey(keyPair);\n return keyPairToPublicKey(keyPair);\n }\n\n async importKeyPair(keyPair: CryptoKeyPair): Promise<PublicKey> {\n await this._setKey(keyPair);\n return keyPairToPublicKey(keyPair);\n }\n\n async list(): Promise<KeyRecord[]> {\n const rows = await RuntimeProvider.runPromise(this.#runtime)(\n Effect.gen(function* () {\n const sql = yield* SqlClient.SqlClient;\n return yield* sql<{ record: Uint8Array }>`SELECT record FROM keyring`;\n }),\n );\n return rows.map((row) => {\n const record = KeyRecordCodec.decode(row.record);\n // Never expose private key material to callers.\n return { publicKey: record.publicKey };\n });\n }\n\n @synchronized\n private async _getKey(key: PublicKey): Promise<CryptoKeyPair> {\n if (this.#keyCache.has(key)) {\n return this.#keyCache.get(key)!;\n }\n\n const keyHex = key.toHex();\n const rows = await RuntimeProvider.runPromise(this.#runtime)(\n Effect.gen(function* () {\n const sql = yield* SqlClient.SqlClient;\n return yield* sql<{ record: Uint8Array }>`SELECT record FROM keyring WHERE public_key = ${keyHex}`;\n }),\n );\n\n if (rows.length === 0) {\n throw new Error(`Key not found: ${keyHex}`);\n }\n\n const record = KeyRecordCodec.decode(rows[0].record);\n const publicKey = PublicKey.from(record.publicKey);\n invariant(key.equals(publicKey), 'Corrupted keyring: key mismatch');\n invariant(record.privateKey, 'Corrupted keyring: missing private key');\n\n const keyPair: CryptoKeyPair = {\n publicKey: await subtleCrypto.importKey(\n 'raw',\n record.publicKey as Uint8Array<ArrayBuffer>,\n { name: 'ECDSA', namedCurve: 'P-256' },\n true,\n ['verify'],\n ),\n privateKey: await subtleCrypto.importKey(\n 'pkcs8',\n record.privateKey as Uint8Array<ArrayBuffer>,\n { name: 'ECDSA', namedCurve: 'P-256' },\n true,\n ['sign'],\n ),\n };\n\n this.#keyCache.set(publicKey, keyPair);\n return keyPair;\n }\n\n @synchronized\n private async _setKey(keyPair: CryptoKeyPair): Promise<void> {\n const publicKey = await keyPairToPublicKey(keyPair);\n this.#keyCache.set(publicKey, keyPair);\n\n const record: KeyRecord = {\n publicKey: publicKey.asUint8Array(),\n privateKey: new Uint8Array(await subtleCrypto.exportKey('pkcs8', keyPair.privateKey)),\n };\n\n const keyHex = publicKey.toHex();\n const encodedRecord = arrayToBuffer(KeyRecordCodec.encode(record));\n await RuntimeProvider.runPromise(this.#runtime)(\n Effect.gen(function* () {\n const sql = yield* SqlClient.SqlClient;\n yield* sql`INSERT OR REPLACE INTO keyring (public_key, record) VALUES (${keyHex}, ${encodedRecord})`;\n }),\n );\n this.keysUpdate.emit();\n }\n}\n\nconst keyPairToPublicKey = async (keyPair: CryptoKeyPair): Promise<PublicKey> =>\n PublicKey.from(new Uint8Array(await subtleCrypto.exportKey('raw', keyPair.publicKey)));\n", "//\n// Copyright 2023 DXOS.org\n//\n\nimport { subtleCrypto } from '@dxos/crypto';\n\nexport type TestKeyPair = {\n privateKey: JsonWebKey;\n publicKey: JsonWebKey;\n publicKeyHex: string;\n};\n\n/**\n * Generate a key pair which for testing purposes.\n * @returns {Promise<TestKeyPair>}\n */\nexport const generateJWKKeyPair = async (): Promise<TestKeyPair> => {\n const keyPair = await subtleCrypto.generateKey(\n {\n name: 'ECDSA',\n namedCurve: 'P-256',\n },\n true,\n ['sign', 'verify'],\n );\n\n const privateKeyExported = await subtleCrypto.exportKey('jwk', keyPair.privateKey);\n const publicKeyExported = await subtleCrypto.exportKey('jwk', keyPair.publicKey);\n\n // Convert the public key to hex format\n const publicKeyBuffer = new Uint8Array(await subtleCrypto.exportKey('raw', keyPair.publicKey));\n const publicKeyHex = Array.from(publicKeyBuffer)\n .map((byte) => byte.toString(16).padStart(2, '0'))\n .join('');\n\n return {\n privateKey: privateKeyExported,\n publicKey: publicKeyExported,\n publicKeyHex,\n };\n};\n\n/**\n * Parse a key pair from JWK format.\n */\nexport const parseJWKKeyPair = async (privateKey: JsonWebKey, publicKey: JsonWebKey): Promise<CryptoKeyPair> => {\n return {\n privateKey: await subtleCrypto.importKey('jwk', privateKey, { name: 'ECDSA', namedCurve: 'P-256' }, true, ['sign']),\n publicKey: await subtleCrypto.importKey('jwk', publicKey, { name: 'ECDSA', namedCurve: 'P-256' }, true, ['verify']),\n };\n};\n"],
|
|
5
|
-
"mappings": "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",
|
|
6
|
-
"names": ["subtleCrypto", "todo", "invariant", "PublicKey", "schema", "StorageType", "createStorage", "ComplexMap", "arrayToBuffer", "KeyRecord", "_keyCache", "keysUpdate", "_storage", "RAM", "createDirectory", "keyPair", "Uint8Array", "name", "hash", "namedCurve", "keyPairToPublicKey", "file", "size", "Error", "record", "publicKey", "equals", "privateKey", "write", "close", "flush", "emit", "keys", "path", "fileName", "split", "_setKey", "Effect", "Event", "synchronized", "subtleCrypto", "RuntimeProvider", "invariant", "PublicKey", "schema", "ComplexMap", "arrayToBuffer", "KeyRecordCodec", "getCodecForType", "keysUpdate", "runtime", "migrate", "sql", "SqlClient", "sign", "message", "keyPair", "Uint8Array", "name", "hash", "namedCurve", "keyPairToPublicKey", "_setKey", "rows", "record", "publicKey", "get", "from", "equals", "privateKey", "__dxlog_file", "encodedRecord", "runPromise", "subtleCrypto", "generateJWKKeyPair", "keyPair", "generateKey", "name", "namedCurve", "privateKeyExported", "exportKey", "privateKey", "publicKeyExported", "publicKey", "publicKeyBuffer", "Uint8Array", "publicKeyHex", "Array", "from", "map", "byte", "toString", "padStart", "join", "parseJWKKeyPair", "importKey"]
|
|
7
|
-
}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"inputs":{"src/keyring.ts":{"bytes":16585,"imports":[{"path":"@dxos/async","kind":"import-statement","external":true},{"path":"@dxos/crypto","kind":"import-statement","external":true},{"path":"@dxos/debug","kind":"import-statement","external":true},{"path":"@dxos/invariant","kind":"import-statement","external":true},{"path":"@dxos/keys","kind":"import-statement","external":true},{"path":"@dxos/protocols/proto","kind":"import-statement","external":true},{"path":"@dxos/random-access-storage","kind":"import-statement","external":true},{"path":"@dxos/util","kind":"import-statement","external":true}],"format":"esm"},"src/sqlite-keyring.ts":{"bytes":18280,"imports":[{"path":"@effect/sql/SqlClient","kind":"import-statement","external":true},{"path":"effect/Effect","kind":"import-statement","external":true},{"path":"@dxos/async","kind":"import-statement","external":true},{"path":"@dxos/crypto","kind":"import-statement","external":true},{"path":"@dxos/effect","kind":"import-statement","external":true},{"path":"@dxos/invariant","kind":"import-statement","external":true},{"path":"@dxos/keys","kind":"import-statement","external":true},{"path":"@dxos/protocols/proto","kind":"import-statement","external":true},{"path":"@dxos/util","kind":"import-statement","external":true}],"format":"esm"},"src/testing.ts":{"bytes":5077,"imports":[{"path":"@dxos/crypto","kind":"import-statement","external":true}],"format":"esm"},"src/index.ts":{"bytes":564,"imports":[{"path":"src/keyring.ts","kind":"import-statement","original":"./keyring"},{"path":"src/sqlite-keyring.ts","kind":"import-statement","original":"./sqlite-keyring"},{"path":"src/testing.ts","kind":"import-statement","original":"./testing"}],"format":"esm"}},"outputs":{"dist/lib/neutral/index.mjs.map":{"imports":[],"exports":[],"inputs":{},"bytes":19191},"dist/lib/neutral/index.mjs":{"imports":[{"path":"@dxos/async","kind":"import-statement","external":true},{"path":"@dxos/crypto","kind":"import-statement","external":true},{"path":"@dxos/debug","kind":"import-statement","external":true},{"path":"@dxos/invariant","kind":"import-statement","external":true},{"path":"@dxos/keys","kind":"import-statement","external":true},{"path":"@dxos/protocols/proto","kind":"import-statement","external":true},{"path":"@dxos/random-access-storage","kind":"import-statement","external":true},{"path":"@dxos/util","kind":"import-statement","external":true},{"path":"@effect/sql/SqlClient","kind":"import-statement","external":true},{"path":"effect/Effect","kind":"import-statement","external":true},{"path":"@dxos/async","kind":"import-statement","external":true},{"path":"@dxos/crypto","kind":"import-statement","external":true},{"path":"@dxos/effect","kind":"import-statement","external":true},{"path":"@dxos/invariant","kind":"import-statement","external":true},{"path":"@dxos/keys","kind":"import-statement","external":true},{"path":"@dxos/protocols/proto","kind":"import-statement","external":true},{"path":"@dxos/util","kind":"import-statement","external":true},{"path":"@dxos/crypto","kind":"import-statement","external":true}],"exports":["Keyring","SqliteKeyring","generateJWKKeyPair","parseJWKKeyPair"],"entryPoint":"src/index.ts","inputs":{"src/keyring.ts":{"bytesInOutput":4745},"src/index.ts":{"bytesInOutput":0},"src/sqlite-keyring.ts":{"bytesInOutput":5279},"src/testing.ts":{"bytesInOutput":1103}},"bytes":11339}}}
|