aboutsummaryrefslogtreecommitdiffstats
path: root/src/lib/nostr.js
blob: 918ee1530a650e515a86bd2a29f8458e01e64de0 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
import { get } from 'svelte/store';
import { entropyToMnemonic, mnemonicToSeedSync } from 'bip39';
import { Buffer } from 'buffer';
import { bech32m } from 'bech32';
import { bip32, wait, post, stretch } from '$lib/utils';
import { calculateId, signId } from 'nostr';
import { password as pw, passwordPrompt } from '$lib/store';

const { decode, fromWords } = bech32m;

export let sign = async ({ event, user }) => {
	let { cipher, username, salt } = user;

	let password = get(pw);

	if (!password) {
		passwordPrompt.set(true);
	}

	try {
		await post('/password', { password });
	} catch (e) {
		console.log(e);
		passwordPrompt.set(true);
	}

	await wait(() => !!get(pw));
	password = get(pw);

	console.log('got pw');

	let mnemonic, key, seed, entropy, child, privkey;
  let stretched = await stretch(password, Buffer.from(salt, 'hex'));
  console.log("stretched", stretched)
  if (username ==="bob") console.log(cipher, salt, password, decode(cipher, 180));
	entropy = Buffer.from(
		await crypto.subtle.decrypt(
			{ name: 'AES-GCM', iv: new Uint8Array(16) },
			stretched,
			Uint8Array.from(fromWords(decode(cipher, 180).words))
		),
		'hex'
	).toString('hex');

	console.log('decoded entropy');

	mnemonic = entropyToMnemonic(entropy);
	seed = mnemonicToSeedSync(mnemonic);
	key = bip32.fromSeed(seed);
	child = key.derivePath("m/44'/1237'/0'/0/0");
	privkey = child.privateKey;

	console.log('derived privkey');

	event.id = await calculateId(event);
	console.log('got id');
	event.sig = await signId(privkey, event.id);
	console.log('signed');
};

export let send = (event) => {
	return post('/events', { event });
};