@pomade/core 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 +21 -0
- package/README.md +45 -0
- package/dist/client.d.ts +94 -0
- package/dist/client.d.ts.map +1 -0
- package/dist/client.js +292 -0
- package/dist/client.js.map +1 -0
- package/dist/index.d.ts +8 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +8 -0
- package/dist/index.js.map +1 -0
- package/dist/message.d.ts +255 -0
- package/dist/message.d.ts.map +1 -0
- package/dist/message.js +128 -0
- package/dist/message.js.map +1 -0
- package/dist/rpc.d.ts +75 -0
- package/dist/rpc.d.ts.map +1 -0
- package/dist/rpc.js +184 -0
- package/dist/rpc.js.map +1 -0
- package/dist/schema.d.ts +245 -0
- package/dist/schema.d.ts.map +1 -0
- package/dist/schema.js +194 -0
- package/dist/schema.js.map +1 -0
- package/dist/signer.d.ts +228 -0
- package/dist/signer.d.ts.map +1 -0
- package/dist/signer.js +510 -0
- package/dist/signer.js.map +1 -0
- package/dist/storage.d.ts +21 -0
- package/dist/storage.d.ts.map +1 -0
- package/dist/storage.js +21 -0
- package/dist/storage.js.map +1 -0
- package/dist/util.d.ts +55 -0
- package/dist/util.d.ts.map +1 -0
- package/dist/util.js +103 -0
- package/dist/util.js.map +1 -0
- package/package.json +49 -0
package/dist/signer.js
ADDED
|
@@ -0,0 +1,510 @@
|
|
|
1
|
+
import bcrypt from "bcrypt";
|
|
2
|
+
import { Lib } from "@frostr/bifrost";
|
|
3
|
+
import { randomBytes, bytesToHex } from "@noble/hashes/utils.js";
|
|
4
|
+
import { now, ms, uniq, between, call, int, ago, MINUTE, YEAR } from "@welshman/lib";
|
|
5
|
+
import { getPubkey, verifyEvent, getTagValue, HTTP_AUTH } from "@welshman/util";
|
|
6
|
+
import { Method } from "./schema.js";
|
|
7
|
+
import { RPC } from "./rpc.js";
|
|
8
|
+
import { hashEmail, bcryptOptions, encodeChallenge, debug } from "./util.js";
|
|
9
|
+
import { isChallengeRequest, isEcdhRequest, isLoginSelect, isLoginStart, isRecoverySetup, isRecoverySelect, isRecoveryStart, isRegisterRequest, isSessionDelete, isSessionList, isSignRequest, makeEcdhResult, makeLoginOptions, makeLoginResult, makeRecoverySetupResult, makeRecoveryOptions, makeRecoveryResult, makeRegisterResult, makeSessionDeleteResult, makeSessionListResult, makeSignResult, } from "./message.js";
|
|
10
|
+
// Utils
|
|
11
|
+
function makeSessionItem(session) {
|
|
12
|
+
return {
|
|
13
|
+
pubkey: session.group.group_pk.slice(2),
|
|
14
|
+
client: session.client,
|
|
15
|
+
created_at: session.event.created_at,
|
|
16
|
+
last_activity: session.last_activity,
|
|
17
|
+
threshold: session.group.threshold,
|
|
18
|
+
total: session.group.commits.length,
|
|
19
|
+
idx: session.share.idx,
|
|
20
|
+
email: session.email,
|
|
21
|
+
};
|
|
22
|
+
}
|
|
23
|
+
export class Signer {
|
|
24
|
+
options;
|
|
25
|
+
rpc;
|
|
26
|
+
pubkey;
|
|
27
|
+
sessions;
|
|
28
|
+
recoveries;
|
|
29
|
+
logins;
|
|
30
|
+
challenges;
|
|
31
|
+
intervals;
|
|
32
|
+
constructor(options) {
|
|
33
|
+
this.options = options;
|
|
34
|
+
this.pubkey = getPubkey(options.secret);
|
|
35
|
+
this.sessions = options.storage("sessions");
|
|
36
|
+
this.recoveries = options.storage("recoveries");
|
|
37
|
+
this.logins = options.storage("logins");
|
|
38
|
+
this.challenges = options.storage("challenges");
|
|
39
|
+
this.rpc = new RPC(options.secret, options.relays);
|
|
40
|
+
this.rpc.subscribe(message => {
|
|
41
|
+
// Ignore events with weird timestamps
|
|
42
|
+
if (!between([now() - 60, now() + 60], message.event.created_at)) {
|
|
43
|
+
return debug("[signer]: ignoring event", message.event.id);
|
|
44
|
+
}
|
|
45
|
+
if (isRegisterRequest(message))
|
|
46
|
+
this.handleRegisterRequest(message);
|
|
47
|
+
if (isRecoverySetup(message))
|
|
48
|
+
this.handleRecoverySetup(message);
|
|
49
|
+
if (isChallengeRequest(message))
|
|
50
|
+
this.handleChallengeRequest(message);
|
|
51
|
+
if (isRecoveryStart(message))
|
|
52
|
+
this.handleRecoveryStart(message);
|
|
53
|
+
if (isRecoverySelect(message))
|
|
54
|
+
this.handleRecoverySelect(message);
|
|
55
|
+
if (isLoginStart(message))
|
|
56
|
+
this.handleLoginStart(message);
|
|
57
|
+
if (isLoginSelect(message))
|
|
58
|
+
this.handleLoginSelect(message);
|
|
59
|
+
if (isSignRequest(message))
|
|
60
|
+
this.handleSignRequest(message);
|
|
61
|
+
if (isEcdhRequest(message))
|
|
62
|
+
this.handleEcdhRequest(message);
|
|
63
|
+
if (isSessionList(message))
|
|
64
|
+
this.handleSessionList(message);
|
|
65
|
+
if (isSessionDelete(message))
|
|
66
|
+
this.handleSessionDelete(message);
|
|
67
|
+
});
|
|
68
|
+
// Periodically clean up recovery requests
|
|
69
|
+
this.intervals = [
|
|
70
|
+
setInterval(async () => {
|
|
71
|
+
debug("[signer]: cleaning up logins and recoveries");
|
|
72
|
+
for (const [client, recovery] of await this.recoveries.entries()) {
|
|
73
|
+
if (recovery.event.created_at < ago(15, MINUTE))
|
|
74
|
+
await this.recoveries.delete(client);
|
|
75
|
+
}
|
|
76
|
+
for (const [client, login] of await this.logins.entries()) {
|
|
77
|
+
if (login.event.created_at < ago(15, MINUTE))
|
|
78
|
+
await this.logins.delete(client);
|
|
79
|
+
}
|
|
80
|
+
for (const [client, challenge] of await this.challenges.entries()) {
|
|
81
|
+
if (challenge.event.created_at < ago(15, MINUTE))
|
|
82
|
+
await this.challenges.delete(client);
|
|
83
|
+
}
|
|
84
|
+
}, ms(int(5, MINUTE))),
|
|
85
|
+
];
|
|
86
|
+
// Immediately clean up old sessions
|
|
87
|
+
call(async () => {
|
|
88
|
+
for (const [client, session] of await this.sessions.entries()) {
|
|
89
|
+
if (session.last_activity < ago(YEAR))
|
|
90
|
+
await this.sessions.delete(client);
|
|
91
|
+
}
|
|
92
|
+
});
|
|
93
|
+
}
|
|
94
|
+
stop() {
|
|
95
|
+
this.rpc.stop();
|
|
96
|
+
this.intervals.forEach(clearInterval);
|
|
97
|
+
}
|
|
98
|
+
// Internal utils
|
|
99
|
+
async *_getAuthenticatedSessionsByPassword(password_hash) {
|
|
100
|
+
for (const [_, session] of await this.sessions.entries()) {
|
|
101
|
+
if (session.password_hash && (await bcrypt.compare(password_hash, session.password_hash))) {
|
|
102
|
+
yield session;
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
async *_getAuthenticatedSessionsByOTP(email, otp) {
|
|
107
|
+
const challenge = await this.challenges.get(email);
|
|
108
|
+
await this.challenges.delete(email);
|
|
109
|
+
if (otp === challenge?.otp) {
|
|
110
|
+
for (const [_, session] of await this.sessions.entries()) {
|
|
111
|
+
if (email === session.email) {
|
|
112
|
+
yield session;
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
async _getAuthenticatedSessions(auth) {
|
|
118
|
+
const sessions = [];
|
|
119
|
+
const generator = typeof auth === "string"
|
|
120
|
+
? this._getAuthenticatedSessionsByPassword(auth)
|
|
121
|
+
: this._getAuthenticatedSessionsByOTP(auth.email, auth.otp);
|
|
122
|
+
for await (const session of generator) {
|
|
123
|
+
sessions.push(session);
|
|
124
|
+
}
|
|
125
|
+
return sessions;
|
|
126
|
+
}
|
|
127
|
+
_isNip98AuthValid(auth, method) {
|
|
128
|
+
return (verifyEvent(auth) &&
|
|
129
|
+
auth.kind === HTTP_AUTH &&
|
|
130
|
+
auth.created_at > ago(15) &&
|
|
131
|
+
auth.created_at < now() + 5 &&
|
|
132
|
+
getTagValue("u", auth.tags) === this.pubkey &&
|
|
133
|
+
getTagValue("method", auth.tags) === method);
|
|
134
|
+
}
|
|
135
|
+
async _checkKeyReuse(event) {
|
|
136
|
+
if (await this.sessions.has(event.pubkey)) {
|
|
137
|
+
debug("[signer]: session key re-used", event.pubkey);
|
|
138
|
+
return this.rpc.channel(event.pubkey, false).send(makeRecoveryOptions({
|
|
139
|
+
ok: false,
|
|
140
|
+
message: "Do not re-use session keys.",
|
|
141
|
+
prev: event.id,
|
|
142
|
+
}));
|
|
143
|
+
}
|
|
144
|
+
if (await this.recoveries.has(event.pubkey)) {
|
|
145
|
+
debug("[signer]: recovery key re-used", event.pubkey);
|
|
146
|
+
return this.rpc.channel(event.pubkey, false).send(makeRecoveryOptions({
|
|
147
|
+
ok: false,
|
|
148
|
+
message: "Do not re-use recovery keys.",
|
|
149
|
+
prev: event.id,
|
|
150
|
+
}));
|
|
151
|
+
}
|
|
152
|
+
if (await this.logins.has(event.pubkey)) {
|
|
153
|
+
debug("[signer]: login key re-used", event.pubkey);
|
|
154
|
+
return this.rpc.channel(event.pubkey, false).send(makeRecoveryOptions({
|
|
155
|
+
ok: false,
|
|
156
|
+
message: "Do not re-use login keys.",
|
|
157
|
+
prev: event.id,
|
|
158
|
+
}));
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
// Registration
|
|
162
|
+
async handleRegisterRequest({ payload, event }) {
|
|
163
|
+
debug("[signer]: attempting to register session", event.pubkey);
|
|
164
|
+
return this.sessions.tx(async (sessions) => {
|
|
165
|
+
const { group, share, recovery } = payload;
|
|
166
|
+
const cb = (ok, message) => this.rpc
|
|
167
|
+
.channel(event.pubkey, false)
|
|
168
|
+
.send(makeRegisterResult({ ok, message, prev: event.id }));
|
|
169
|
+
if (await this._checkKeyReuse(event))
|
|
170
|
+
return;
|
|
171
|
+
if (!between([0, group.commits.length], group.threshold)) {
|
|
172
|
+
debug("[signer]: invalid group threshold", event.pubkey);
|
|
173
|
+
return cb(false, "Invalid group threshold.");
|
|
174
|
+
}
|
|
175
|
+
if (!Lib.is_group_member(group, share)) {
|
|
176
|
+
debug("[signer]: share does not belong to the provided group", event.pubkey);
|
|
177
|
+
return cb(false, "Share does not belong to the provided group.");
|
|
178
|
+
}
|
|
179
|
+
if (uniq(group.commits.map(c => c.idx)).length !== group.commits.length) {
|
|
180
|
+
debug("[signer]: group contains duplicate member indices", event.pubkey);
|
|
181
|
+
return cb(false, "Group contains duplicate member indices.");
|
|
182
|
+
}
|
|
183
|
+
if (!group.commits.find(c => c.idx === share.idx)) {
|
|
184
|
+
debug("[signer]: share index not found in group commits", event.pubkey);
|
|
185
|
+
return cb(false, "Share index not found in group commits.");
|
|
186
|
+
}
|
|
187
|
+
if (await sessions.has(event.pubkey)) {
|
|
188
|
+
debug("[signer]: client is already registered", event.pubkey);
|
|
189
|
+
return cb(false, "Client is already registered.");
|
|
190
|
+
}
|
|
191
|
+
await sessions.set(event.pubkey, {
|
|
192
|
+
client: event.pubkey,
|
|
193
|
+
event,
|
|
194
|
+
share,
|
|
195
|
+
group,
|
|
196
|
+
recovery,
|
|
197
|
+
last_activity: now(),
|
|
198
|
+
});
|
|
199
|
+
debug("[signer]: registered", event.pubkey);
|
|
200
|
+
return cb(true, "Your key has been registered");
|
|
201
|
+
});
|
|
202
|
+
}
|
|
203
|
+
// Recovery setup
|
|
204
|
+
async handleRecoverySetup({ payload, event }) {
|
|
205
|
+
return this.sessions.tx(async (sessions) => {
|
|
206
|
+
const session = await sessions.get(event.pubkey);
|
|
207
|
+
if (!session) {
|
|
208
|
+
debug("[signer]: no session found for recovery setup", event.pubkey);
|
|
209
|
+
return this.rpc.channel(event.pubkey, false).send(makeRecoverySetupResult({
|
|
210
|
+
ok: false,
|
|
211
|
+
message: "No session found.",
|
|
212
|
+
prev: event.id,
|
|
213
|
+
}));
|
|
214
|
+
}
|
|
215
|
+
if (!session.recovery) {
|
|
216
|
+
debug("[signer]: recovery is disabled for session", event.pubkey);
|
|
217
|
+
return this.rpc.channel(event.pubkey, false).send(makeRecoverySetupResult({
|
|
218
|
+
ok: false,
|
|
219
|
+
message: "Recovery is disabled on this session.",
|
|
220
|
+
prev: event.id,
|
|
221
|
+
}));
|
|
222
|
+
}
|
|
223
|
+
// recovery method has to be bound at (or shorly after) session, otherwise an attacker with access
|
|
224
|
+
// to any session could escalate permissions by setting up their own recovery method
|
|
225
|
+
if (session.event.created_at < ago(15, MINUTE)) {
|
|
226
|
+
debug("[signer]: recovery method set too late", event.pubkey);
|
|
227
|
+
return this.rpc.channel(event.pubkey, false).send(makeRecoverySetupResult({
|
|
228
|
+
ok: false,
|
|
229
|
+
message: "Recovery method must be set within 5 minutes of session.",
|
|
230
|
+
prev: event.id,
|
|
231
|
+
}));
|
|
232
|
+
}
|
|
233
|
+
if (session.email) {
|
|
234
|
+
debug("[signer]: recovery is already set", event.pubkey);
|
|
235
|
+
return this.rpc.channel(event.pubkey, false).send(makeRecoverySetupResult({
|
|
236
|
+
ok: false,
|
|
237
|
+
message: "Recovery has already been initialized.",
|
|
238
|
+
prev: event.id,
|
|
239
|
+
}));
|
|
240
|
+
}
|
|
241
|
+
await sessions.set(event.pubkey, {
|
|
242
|
+
...session,
|
|
243
|
+
last_activity: now(),
|
|
244
|
+
email: payload.email,
|
|
245
|
+
email_hash: await hashEmail(payload.email, this.pubkey),
|
|
246
|
+
password_hash: await bcrypt.hash(payload.password_hash, bcryptOptions.rounds),
|
|
247
|
+
});
|
|
248
|
+
debug("[signer]: recovery method initialized", event.pubkey);
|
|
249
|
+
this.rpc.channel(event.pubkey, false).send(makeRecoverySetupResult({
|
|
250
|
+
ok: true,
|
|
251
|
+
message: "Recovery method successfully initialized.",
|
|
252
|
+
prev: event.id,
|
|
253
|
+
}));
|
|
254
|
+
});
|
|
255
|
+
}
|
|
256
|
+
async handleChallengeRequest({ payload, event }) {
|
|
257
|
+
let email = undefined;
|
|
258
|
+
for (const [_, session] of await this.sessions.entries()) {
|
|
259
|
+
if (session.email_hash === payload.email_hash) {
|
|
260
|
+
email = session.email;
|
|
261
|
+
break;
|
|
262
|
+
}
|
|
263
|
+
}
|
|
264
|
+
if (email) {
|
|
265
|
+
const otp = bytesToHex(randomBytes(12));
|
|
266
|
+
const challenge = encodeChallenge(this.pubkey, otp);
|
|
267
|
+
await this.challenges.set(email, { otp, email, event });
|
|
268
|
+
this.options.sendChallenge({ email, challenge });
|
|
269
|
+
}
|
|
270
|
+
}
|
|
271
|
+
// Recovery
|
|
272
|
+
async handleRecoveryStart({ payload, event }) {
|
|
273
|
+
if (await this._checkKeyReuse(event))
|
|
274
|
+
return;
|
|
275
|
+
const sessions = await this._getAuthenticatedSessions(payload.auth);
|
|
276
|
+
if (sessions.length === 0) {
|
|
277
|
+
debug("[signer]: no sessions found for recovery", event.pubkey);
|
|
278
|
+
return this.rpc.channel(event.pubkey, false).send(makeRecoveryOptions({
|
|
279
|
+
ok: false,
|
|
280
|
+
message: "No sessions found.",
|
|
281
|
+
prev: event.id,
|
|
282
|
+
}));
|
|
283
|
+
}
|
|
284
|
+
debug("[signer]: sending recovery options", event.pubkey);
|
|
285
|
+
const clients = sessions.map(s => s.client);
|
|
286
|
+
const items = sessions.map(makeSessionItem);
|
|
287
|
+
await this.recoveries.set(event.pubkey, { event, clients });
|
|
288
|
+
this.rpc.channel(event.pubkey, false).send(makeRecoveryOptions({
|
|
289
|
+
items,
|
|
290
|
+
ok: true,
|
|
291
|
+
message: "Successfully retrieved recovery options.",
|
|
292
|
+
prev: event.id,
|
|
293
|
+
}));
|
|
294
|
+
}
|
|
295
|
+
async handleRecoverySelect({ payload, event }) {
|
|
296
|
+
const recovery = await this.recoveries.get(event.pubkey);
|
|
297
|
+
if (!recovery) {
|
|
298
|
+
debug("[signer]: no active recovery found", event.pubkey);
|
|
299
|
+
return this.rpc.channel(event.pubkey, false).send(makeRecoveryResult({
|
|
300
|
+
ok: false,
|
|
301
|
+
message: `No active recovery found.`,
|
|
302
|
+
prev: event.id,
|
|
303
|
+
}));
|
|
304
|
+
}
|
|
305
|
+
// Cleanup right away
|
|
306
|
+
await this.recoveries.delete(event.pubkey);
|
|
307
|
+
if (!recovery.clients.includes(payload.client)) {
|
|
308
|
+
debug("[signer]: invalid session selected for recovery", event.pubkey);
|
|
309
|
+
return this.rpc.channel(event.pubkey, false).send(makeRecoveryResult({
|
|
310
|
+
ok: false,
|
|
311
|
+
message: `Invalid session selected for recovery.`,
|
|
312
|
+
prev: event.id,
|
|
313
|
+
}));
|
|
314
|
+
}
|
|
315
|
+
const session = await this.sessions.get(payload.client);
|
|
316
|
+
if (!session) {
|
|
317
|
+
debug("[signer]: recovery session not found", event.pubkey);
|
|
318
|
+
return this.rpc.channel(event.pubkey, false).send(makeRecoveryResult({
|
|
319
|
+
ok: false,
|
|
320
|
+
message: `Recovery session not found.`,
|
|
321
|
+
prev: event.id,
|
|
322
|
+
}));
|
|
323
|
+
}
|
|
324
|
+
this.rpc.channel(event.pubkey, false).send(makeRecoveryResult({
|
|
325
|
+
ok: true,
|
|
326
|
+
message: "Recovery successfully completed.",
|
|
327
|
+
group: session.group,
|
|
328
|
+
share: session.share,
|
|
329
|
+
prev: event.id,
|
|
330
|
+
}));
|
|
331
|
+
debug("[signer]: recovery successfully completed", event.pubkey);
|
|
332
|
+
}
|
|
333
|
+
// Login
|
|
334
|
+
async handleLoginStart({ payload, event }) {
|
|
335
|
+
if (await this._checkKeyReuse(event))
|
|
336
|
+
return;
|
|
337
|
+
const sessions = await this._getAuthenticatedSessions(payload.auth);
|
|
338
|
+
if (sessions.length === 0) {
|
|
339
|
+
debug("[signer]: no sessions found for login", event.pubkey);
|
|
340
|
+
return this.rpc.channel(event.pubkey, false).send(makeLoginOptions({
|
|
341
|
+
ok: false,
|
|
342
|
+
message: "No sessions found.",
|
|
343
|
+
prev: event.id,
|
|
344
|
+
}));
|
|
345
|
+
}
|
|
346
|
+
debug("[signer]: sending login options", event.pubkey);
|
|
347
|
+
const clients = sessions.map(s => s.client);
|
|
348
|
+
const items = sessions.map(makeSessionItem);
|
|
349
|
+
await this.logins.set(event.pubkey, { event, clients });
|
|
350
|
+
this.rpc.channel(event.pubkey, false).send(makeLoginOptions({
|
|
351
|
+
items,
|
|
352
|
+
ok: true,
|
|
353
|
+
message: "Successfully retrieved login options.",
|
|
354
|
+
prev: event.id,
|
|
355
|
+
}));
|
|
356
|
+
}
|
|
357
|
+
async handleLoginSelect({ payload, event }) {
|
|
358
|
+
const login = await this.logins.get(event.pubkey);
|
|
359
|
+
if (!login) {
|
|
360
|
+
debug("[signer]: no active login found", event.pubkey);
|
|
361
|
+
return this.rpc.channel(event.pubkey, false).send(makeLoginResult({
|
|
362
|
+
ok: false,
|
|
363
|
+
message: `No active login found.`,
|
|
364
|
+
prev: event.id,
|
|
365
|
+
}));
|
|
366
|
+
}
|
|
367
|
+
// Cleanup right away
|
|
368
|
+
await this.logins.delete(event.pubkey);
|
|
369
|
+
if (!login.clients.includes(payload.client)) {
|
|
370
|
+
debug("[signer]: invalid session selected for login", event.pubkey);
|
|
371
|
+
return this.rpc.channel(event.pubkey, false).send(makeLoginResult({
|
|
372
|
+
ok: false,
|
|
373
|
+
message: `Invalid session selected for login.`,
|
|
374
|
+
prev: event.id,
|
|
375
|
+
}));
|
|
376
|
+
}
|
|
377
|
+
const session = await this.sessions.get(payload.client);
|
|
378
|
+
if (!session) {
|
|
379
|
+
debug("[signer]: login session not found", event.pubkey);
|
|
380
|
+
return this.rpc.channel(event.pubkey, false).send(makeLoginResult({
|
|
381
|
+
ok: false,
|
|
382
|
+
message: `Login session not found.`,
|
|
383
|
+
prev: event.id,
|
|
384
|
+
}));
|
|
385
|
+
}
|
|
386
|
+
await this.sessions.set(event.pubkey, {
|
|
387
|
+
event,
|
|
388
|
+
recovery: true,
|
|
389
|
+
client: event.pubkey,
|
|
390
|
+
share: session.share,
|
|
391
|
+
group: session.group,
|
|
392
|
+
last_activity: now(),
|
|
393
|
+
});
|
|
394
|
+
this.rpc.channel(event.pubkey, false).send(makeLoginResult({
|
|
395
|
+
ok: true,
|
|
396
|
+
message: "Login successfully completed.",
|
|
397
|
+
group: session.group,
|
|
398
|
+
prev: event.id,
|
|
399
|
+
}));
|
|
400
|
+
debug("[signer]: login successfully completed", event.pubkey);
|
|
401
|
+
}
|
|
402
|
+
// Signing
|
|
403
|
+
async handleSignRequest({ payload, event }) {
|
|
404
|
+
debug("[signer]: attempting signing flow", event.pubkey);
|
|
405
|
+
return this.sessions.tx(async (sessions) => {
|
|
406
|
+
const session = await sessions.get(event.pubkey);
|
|
407
|
+
if (!session) {
|
|
408
|
+
debug("[signer]: signing failed", event.pubkey);
|
|
409
|
+
return this.rpc.channel(event.pubkey, false).send(makeSignResult({
|
|
410
|
+
ok: false,
|
|
411
|
+
message: "No session found for client",
|
|
412
|
+
prev: event.id,
|
|
413
|
+
}));
|
|
414
|
+
}
|
|
415
|
+
const ctx = Lib.get_session_ctx(session.group, payload.request);
|
|
416
|
+
const partialSignature = Lib.create_psig_pkg(ctx, session.share);
|
|
417
|
+
await sessions.set(event.pubkey, { ...session, last_activity: now() });
|
|
418
|
+
debug("[signer]: signing complete", event.pubkey);
|
|
419
|
+
this.rpc.channel(event.pubkey, false).send(makeSignResult({
|
|
420
|
+
result: partialSignature,
|
|
421
|
+
ok: true,
|
|
422
|
+
message: "Successfully signed event",
|
|
423
|
+
prev: event.id,
|
|
424
|
+
}));
|
|
425
|
+
});
|
|
426
|
+
}
|
|
427
|
+
// Key exchange
|
|
428
|
+
async handleEcdhRequest({ payload, event }) {
|
|
429
|
+
debug("[signer]: attempting ecdh flow", event.pubkey);
|
|
430
|
+
return this.sessions.tx(async (sessions) => {
|
|
431
|
+
const session = await sessions.get(event.pubkey);
|
|
432
|
+
if (!session) {
|
|
433
|
+
debug("[signer]: ecdh failed", event.pubkey);
|
|
434
|
+
return this.rpc.channel(event.pubkey, false).send(makeSignResult({
|
|
435
|
+
ok: false,
|
|
436
|
+
message: "No session found for client",
|
|
437
|
+
prev: event.id,
|
|
438
|
+
}));
|
|
439
|
+
}
|
|
440
|
+
const { members, ecdh_pk } = payload;
|
|
441
|
+
const ecdhPackage = Lib.create_ecdh_pkg(members, ecdh_pk, session.share);
|
|
442
|
+
await sessions.set(event.pubkey, { ...session, last_activity: now() });
|
|
443
|
+
debug("[signer]: ecdh complete", event.pubkey);
|
|
444
|
+
this.rpc.channel(event.pubkey, false).send(makeEcdhResult({
|
|
445
|
+
result: ecdhPackage,
|
|
446
|
+
ok: true,
|
|
447
|
+
message: "Successfully signed event",
|
|
448
|
+
prev: event.id,
|
|
449
|
+
}));
|
|
450
|
+
});
|
|
451
|
+
}
|
|
452
|
+
// Session management
|
|
453
|
+
async handleSessionList({ payload, event }) {
|
|
454
|
+
if (!this._isNip98AuthValid(payload.auth, Method.SessionList)) {
|
|
455
|
+
debug("[signer]: invalid auth event for session list", event.pubkey);
|
|
456
|
+
return this.rpc.channel(event.pubkey, false).send(makeSessionListResult({
|
|
457
|
+
items: [],
|
|
458
|
+
ok: false,
|
|
459
|
+
message: "Failed to validate authentication.",
|
|
460
|
+
prev: event.id,
|
|
461
|
+
}));
|
|
462
|
+
}
|
|
463
|
+
debug("[signer]: attempting to retrieve session list", event.pubkey);
|
|
464
|
+
const items = [];
|
|
465
|
+
for (const [_, session] of await this.sessions.entries()) {
|
|
466
|
+
if (session.group.group_pk.slice(2) === payload.auth.pubkey) {
|
|
467
|
+
items.push(makeSessionItem(session));
|
|
468
|
+
}
|
|
469
|
+
}
|
|
470
|
+
debug("[signer]: successfully retrieved session list", event.pubkey);
|
|
471
|
+
this.rpc.channel(event.pubkey, false).send(makeSessionListResult({
|
|
472
|
+
items,
|
|
473
|
+
ok: true,
|
|
474
|
+
message: "Successfully retrieved session list.",
|
|
475
|
+
prev: event.id,
|
|
476
|
+
}));
|
|
477
|
+
}
|
|
478
|
+
async handleSessionDelete({ payload, event }) {
|
|
479
|
+
if (!this._isNip98AuthValid(payload.auth, Method.SessionDelete)) {
|
|
480
|
+
debug("[signer]: invalid auth event for session deletion", event.pubkey);
|
|
481
|
+
return this.rpc.channel(event.pubkey, false).send(makeSessionDeleteResult({
|
|
482
|
+
ok: false,
|
|
483
|
+
message: "Failed to delete selected session.",
|
|
484
|
+
prev: event.id,
|
|
485
|
+
}));
|
|
486
|
+
}
|
|
487
|
+
debug("[signer]: attempting to delete session", event.pubkey);
|
|
488
|
+
return this.sessions.tx(async (sessions) => {
|
|
489
|
+
const session = await sessions.get(payload.client);
|
|
490
|
+
if (session?.group.group_pk.slice(2) === payload.auth.pubkey) {
|
|
491
|
+
await sessions.delete(payload.client);
|
|
492
|
+
debug("[signer]: deleted session", event.pubkey);
|
|
493
|
+
this.rpc.channel(event.pubkey, false).send(makeSessionDeleteResult({
|
|
494
|
+
ok: true,
|
|
495
|
+
message: "Successfully deleted selected session.",
|
|
496
|
+
prev: event.id,
|
|
497
|
+
}));
|
|
498
|
+
}
|
|
499
|
+
else {
|
|
500
|
+
debug("[signer]: failed to delete session", event.pubkey);
|
|
501
|
+
return this.rpc.channel(event.pubkey, false).send(makeSessionDeleteResult({
|
|
502
|
+
ok: false,
|
|
503
|
+
message: "Failed to logout selected client.",
|
|
504
|
+
prev: event.id,
|
|
505
|
+
}));
|
|
506
|
+
}
|
|
507
|
+
});
|
|
508
|
+
}
|
|
509
|
+
}
|
|
510
|
+
//# sourceMappingURL=signer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"signer.js","sourceRoot":"","sources":["../src/signer.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import type { Maybe } from "@welshman/lib";
|
|
2
|
+
export type IBaseStorage<T> = {
|
|
3
|
+
get(key: string): Promise<Maybe<T>>;
|
|
4
|
+
has(key: string): Promise<boolean>;
|
|
5
|
+
set(key: string, item: T): Promise<void>;
|
|
6
|
+
delete(key: string): Promise<boolean>;
|
|
7
|
+
entries(): Promise<Iterable<[string, T]>>;
|
|
8
|
+
};
|
|
9
|
+
export type IStorage<T> = IBaseStorage<T> & {
|
|
10
|
+
tx<R>(f: (s: IBaseStorage<T>) => R): Promise<R>;
|
|
11
|
+
};
|
|
12
|
+
export type IStorageFactory = <T>(name: string) => IStorage<T>;
|
|
13
|
+
export declare const inMemoryStorageFactory: <T>(name: string) => {
|
|
14
|
+
tx: <R>(f: (s: IBaseStorage<T>) => R) => Promise<void>;
|
|
15
|
+
get(key: string): Promise<Maybe<T>>;
|
|
16
|
+
has(key: string): Promise<boolean>;
|
|
17
|
+
set(key: string, item: T): Promise<void>;
|
|
18
|
+
delete(key: string): Promise<boolean>;
|
|
19
|
+
entries(): Promise<Iterable<[string, T]>>;
|
|
20
|
+
};
|
|
21
|
+
//# sourceMappingURL=storage.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"storage.d.ts","sourceRoot":"","sources":["../src/storage.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAC,KAAK,EAAC,MAAM,eAAe,CAAA;AAExC,MAAM,MAAM,YAAY,CAAC,CAAC,IAAI;IAC5B,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAA;IACnC,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAA;IAClC,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;IACxC,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAA;IACrC,OAAO,IAAI,OAAO,CAAC,QAAQ,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,CAAC,CAAA;CAC1C,CAAA;AAED,MAAM,MAAM,QAAQ,CAAC,CAAC,IAAI,YAAY,CAAC,CAAC,CAAC,GAAG;IAC1C,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,YAAY,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAAA;CAChD,CAAA;AAED,MAAM,MAAM,eAAe,GAAG,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAA;AAE9D,eAAO,MAAM,sBAAsB,GAAI,CAAC,EAAE,MAAM,MAAM;SAKxC,CAAC,KAAK,CAAC,CAAC,EAAE,YAAY,CAAC,CAAC,CAAC,KAAK,CAAC;aAlBlC,MAAM;aACN,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;aACzB,MAAM,YAAY,OAAO,CAAC,IAAI,CAAC;gBAC5B,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;;CAoCtC,CAAA"}
|
package/dist/storage.js
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
export const inMemoryStorageFactory = (name) => {
|
|
2
|
+
const data = new Map();
|
|
3
|
+
let lock = Promise.resolve();
|
|
4
|
+
const tx = (f) => {
|
|
5
|
+
const p = lock.then(() => f(storage));
|
|
6
|
+
lock = p.then(() => undefined);
|
|
7
|
+
return lock;
|
|
8
|
+
};
|
|
9
|
+
const storage = {
|
|
10
|
+
get: (key) => Promise.resolve(data.get(key)),
|
|
11
|
+
has: (key) => Promise.resolve(data.has(key)),
|
|
12
|
+
set: (key, item) => {
|
|
13
|
+
data.set(key, item);
|
|
14
|
+
return Promise.resolve();
|
|
15
|
+
},
|
|
16
|
+
delete: (key) => Promise.resolve(data.delete(key)),
|
|
17
|
+
entries: () => Promise.resolve(data.entries()),
|
|
18
|
+
};
|
|
19
|
+
return { ...storage, tx };
|
|
20
|
+
};
|
|
21
|
+
//# sourceMappingURL=storage.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"storage.js","sourceRoot":"","sources":["../src/storage.ts"],"names":[],"mappings":"AAgBA,MAAM,CAAC,MAAM,sBAAsB,GAAG,CAAI,IAAY,EAAE,EAAE;IACxD,MAAM,IAAI,GAAG,IAAI,GAAG,EAAa,CAAA;IAEjC,IAAI,IAAI,GAAG,OAAO,CAAC,OAAO,EAAE,CAAA;IAE5B,MAAM,EAAE,GAAG,CAAI,CAA4B,EAAE,EAAE;QAC7C,MAAM,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAA;QAErC,IAAI,GAAG,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAA;QAE9B,OAAO,IAAI,CAAA;IACb,CAAC,CAAA;IAED,MAAM,OAAO,GAAoB;QAC/B,GAAG,EAAE,CAAC,GAAW,EAAE,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QACpD,GAAG,EAAE,CAAC,GAAW,EAAE,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QACpD,GAAG,EAAE,CAAC,GAAW,EAAE,IAAO,EAAE,EAAE;YAC5B,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,CAAA;YAEnB,OAAO,OAAO,CAAC,OAAO,EAAE,CAAA;QAC1B,CAAC;QACD,MAAM,EAAE,CAAC,GAAW,EAAE,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QAC1D,OAAO,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC;KAC/C,CAAA;IAED,OAAO,EAAC,GAAG,OAAO,EAAE,EAAE,EAAC,CAAA;AACzB,CAAC,CAAA"}
|
package/dist/util.d.ts
ADDED
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
import type { EventTemplate } from "@welshman/util";
|
|
2
|
+
export declare const bcryptOptions: {
|
|
3
|
+
rounds: number;
|
|
4
|
+
};
|
|
5
|
+
export declare function prepAndSign(secret: string, event: EventTemplate): {
|
|
6
|
+
sig: string;
|
|
7
|
+
tags: string[][];
|
|
8
|
+
content: string;
|
|
9
|
+
kind: number;
|
|
10
|
+
created_at: number;
|
|
11
|
+
pubkey: string;
|
|
12
|
+
id: string;
|
|
13
|
+
};
|
|
14
|
+
export declare const nip44: {
|
|
15
|
+
getSharedSecret: {
|
|
16
|
+
(...args: string[]): Uint8Array<ArrayBufferLike>;
|
|
17
|
+
cache: import("@welshman/lib").LRUCache<string, Uint8Array<ArrayBufferLike>>;
|
|
18
|
+
getKey: (args: string[]) => string;
|
|
19
|
+
getValue: (args: string[]) => Uint8Array<ArrayBufferLike>;
|
|
20
|
+
pop: (...args: string[]) => Uint8Array<ArrayBufferLike>;
|
|
21
|
+
};
|
|
22
|
+
encrypt: (pubkey: string, secret: string, m: string) => string;
|
|
23
|
+
decrypt: (pubkey: string, secret: string, m: string) => string;
|
|
24
|
+
};
|
|
25
|
+
export declare function encodeChallenge(peer: string, otp: string): string;
|
|
26
|
+
export declare function decodeChallenge(challenge: string): {
|
|
27
|
+
peer: string;
|
|
28
|
+
otp: string;
|
|
29
|
+
};
|
|
30
|
+
export declare const argonOptions: {
|
|
31
|
+
t: number;
|
|
32
|
+
m: number;
|
|
33
|
+
p: number;
|
|
34
|
+
};
|
|
35
|
+
export declare function hashEmail(email: string, peer: string): Promise<string>;
|
|
36
|
+
export declare function hashPassword(email: string, password: string, peer: string): Promise<string>;
|
|
37
|
+
export type Context = {
|
|
38
|
+
debug: boolean;
|
|
39
|
+
signerPubkeys: string[];
|
|
40
|
+
indexerRelays: string[];
|
|
41
|
+
setSignerPubkeys: (pubkeys: string[]) => void;
|
|
42
|
+
setIndexerRelays: (relays: string[]) => void;
|
|
43
|
+
};
|
|
44
|
+
export declare const context: Context;
|
|
45
|
+
export declare function debug(...args: any): void;
|
|
46
|
+
export declare const isRelay: (url: string) => boolean;
|
|
47
|
+
export declare const normalizeRelay: (url: string) => string;
|
|
48
|
+
export declare const relayCache: Map<string, string[]>;
|
|
49
|
+
export declare const fetchRelays: (pubkey: string, signal?: AbortSignal) => Promise<string[]>;
|
|
50
|
+
export declare function publishRelays({ secret, signal, relays, }: {
|
|
51
|
+
secret: string;
|
|
52
|
+
signal?: AbortSignal;
|
|
53
|
+
relays: string[];
|
|
54
|
+
}): Promise<import("@welshman/net").PublishResultsByRelay>;
|
|
55
|
+
//# sourceMappingURL=util.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"util.d.ts","sourceRoot":"","sources":["../src/util.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAC,aAAa,EAAC,MAAM,gBAAgB,CAAA;AAcjD,eAAO,MAAM,aAAa;;CAEzB,CAAA;AAED,wBAAgB,WAAW,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,aAAa;;;;;;;;EAE/D;AAED,eAAO,MAAM,KAAK;;;;;;;;sBAOE,MAAM,UAAU,MAAM,KAAK,MAAM;sBAEjC,MAAM,UAAU,MAAM,KAAK,MAAM;CAEpD,CAAA;AAID,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,UAUxD;AAED,wBAAgB,eAAe,CAAC,SAAS,EAAE,MAAM;;;EAMhD;AAID,eAAO,MAAM,YAAY;;;;CAA6B,CAAA;AAEtD,wBAAsB,SAAS,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,mBAE1D;AAED,wBAAsB,YAAY,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,mBAE/E;AAID,MAAM,MAAM,OAAO,GAAG;IACpB,KAAK,EAAE,OAAO,CAAA;IACd,aAAa,EAAE,MAAM,EAAE,CAAA;IACvB,aAAa,EAAE,MAAM,EAAE,CAAA;IACvB,gBAAgB,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,IAAI,CAAA;IAC7C,gBAAgB,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,IAAI,CAAA;CAC7C,CAAA;AAED,eAAO,MAAM,OAAO,EAAE,OAmBrB,CAAA;AAED,wBAAgB,KAAK,CAAC,GAAG,IAAI,EAAE,GAAG,QAIjC;AAID,eAAO,MAAM,OAAO,GAAI,KAAK,MAAM,YAAuD,CAAA;AAE1F,eAAO,MAAM,cAAc,GAAI,KAAK,MAAM,WACc,CAAA;AAExD,eAAO,MAAM,UAAU,uBAA8B,CAAA;AAErD,eAAO,MAAM,WAAW,GAAU,QAAQ,MAAM,EAAE,SAAS,WAAW,sBAoBrE,CAAA;AAED,wBAAgB,aAAa,CAAC,EAC5B,MAAM,EACN,MAAM,EACN,MAAM,GACP,EAAE;IACD,MAAM,EAAE,MAAM,CAAA;IACd,MAAM,CAAC,EAAE,WAAW,CAAA;IACpB,MAAM,EAAE,MAAM,EAAE,CAAA;CACjB,0DAUA"}
|