diff options
| author | Adam Soltys <[email protected]> | 2022-12-29 01:29:56 -0800 |
|---|---|---|
| committer | Adam Soltys <[email protected]> | 2022-12-29 01:29:56 -0800 |
| commit | 127262fcf9feef0c651b73a1a1cc79624d87aa9f (patch) | |
| tree | bdae53cb6a97096109922106106bd7deecbda004 | |
| parent | 43c2847f2cd6b9e09137072ba7fa7d1048d69617 (diff) | |
| download | coinos-ui-127262fcf9feef0c651b73a1a1cc79624d87aa9f.tar.gz coinos-ui-127262fcf9feef0c651b73a1a1cc79624d87aa9f.zip | |
move generate function
| -rw-r--r-- | src/lib/nostr.js | 64 | ||||
| -rw-r--r-- | src/routes/(app)/[username]/generate/+page.svelte | 48 |
2 files changed, 65 insertions, 47 deletions
diff --git a/src/lib/nostr.js b/src/lib/nostr.js index 3f112788..0d21971e 100644 --- a/src/lib/nostr.js +++ b/src/lib/nostr.js @@ -1,12 +1,68 @@ import { get } from 'svelte/store'; -import { entropyToMnemonic, mnemonicToSeedSync } from 'bip39'; +import * as ecc from 'tiny-secp256k1'; +import { generateMnemonic, entropyToMnemonic, mnemonicToEntropy, mnemonicToSeedSync } from 'bip39'; import { Buffer } from 'buffer'; import { bech32m } from 'bech32'; -import { bip32, wait, post, stretch } from '$lib/utils'; +import { bip32, failure, wait, post, stretch } from '$lib/utils'; import { calculateId, signId } from 'nostr'; -import { password as pw, passwordPrompt } from '$lib/store'; +import { password as pw, passwordPrompt, pin, loginRedirect } from '$lib/store'; +import { goto, invalidate } from '$app/navigation'; -const { decode, fromWords } = bech32m; +const { encode, decode, fromWords, toWords } = bech32m; + +export let generate = async (user) => { + let mnemonic, key, seed, entropy, cipher, salt, child; + + if (!get(pin)?.length === 6) return; + + 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); + + mnemonic = generateMnemonic(); + seed = mnemonicToSeedSync(mnemonic); + entropy = mnemonicToEntropy(mnemonic); + key = bip32.fromSeed(seed); + child = key.derivePath("m/44'/1237'/0'/0/0"); + salt = crypto.getRandomValues(new Uint8Array(16)); + + let bytes = new Uint8Array( + await crypto.subtle.encrypt( + { name: 'AES-GCM', iv: new Uint8Array(16) }, + await stretch(password, salt), + Uint8Array.from(Buffer.from(entropy, 'hex')) + ) + ); + + user.pubkey = Buffer.from(ecc.xOnlyPointFromPoint(child.publicKey)).toString('hex'); + user.cipher = encode('en', toWords(bytes), 180); + user.salt = Buffer.from(salt).toString('hex'); + user.pin = get(pin); + + try { + await post(`/${user.username}/generate`, user); + } catch (e) { + if (e.message?.startsWith('Pin')) { + pin.set(''); + failure('Wrong pin, try again'); + } + } + + invalidate('app:user'); + setTimeout(() => goto(get(loginRedirect) || `/${user.username}/dashboard`), 10); +}; export let sign = async ({ event, user }) => { let { cipher, username, salt } = user; diff --git a/src/routes/(app)/[username]/generate/+page.svelte b/src/routes/(app)/[username]/generate/+page.svelte index 330ccedb..f2e53be7 100644 --- a/src/routes/(app)/[username]/generate/+page.svelte +++ b/src/routes/(app)/[username]/generate/+page.svelte @@ -4,63 +4,25 @@ import { onMount } from 'svelte'; import { bech32m } from 'bech32'; import { generateMnemonic, mnemonicToEntropy, mnemonicToSeedSync } from 'bip39'; - import * as ecc from 'tiny-secp256k1'; - import { bip32, stretch, post } from '$lib/utils'; import { goto, invalidate } from '$app/navigation'; import { loginRedirect, password } from '$lib/store'; import { Pin } from '$comp'; import { pin } from '$lib/store'; + import { generate } from '$lib/nostr'; export let data; let { user } = data; - const { encode, toWords } = bech32m; - - let loaded, mnemonic, key, seed, entropy, cipher, pubkey, salt, child; + let loaded; onMount(async () => { setTimeout(() => (loaded = true), 50); - generate(); + generate(user); }); - let generate = async () => { - if (!$pin?.length === 6) return setTimeout(generate, 1000); - mnemonic = generateMnemonic(); - seed = mnemonicToSeedSync(mnemonic); - entropy = mnemonicToEntropy(mnemonic); - key = bip32.fromSeed(seed); - child = key.derivePath("m/44'/1237'/0'/0/0"); - salt = crypto.getRandomValues(new Uint8Array(16)); - - let bytes = new Uint8Array( - await crypto.subtle.encrypt( - { name: 'AES-GCM', iv: new Uint8Array(16) }, - await stretch($password, salt), - Uint8Array.from(Buffer.from(entropy, 'hex')) - ) - ); - - user.pubkey = Buffer.from(ecc.xOnlyPointFromPoint(child.publicKey)).toString('hex'); - user.cipher = encode('en', toWords(bytes), 180); - user.salt = Buffer.from(salt).toString('hex'); - user.pin = $pin; - - try { - await post(`/${user.username}/generate`, user); - } catch (e) { - if (e.message?.startsWith('Pin')) { - $pin = ''; - failure('Wrong pin, try again'); - } - } - - invalidate('app:user'); - setTimeout(() => goto($loginRedirect || `/${user.username}/dashboard`), 10); - }; - - $: $pin?.length === 6 && generate(); + $: $pin?.length === 6 && generate(user); </script> -{#if loaded && user.haspin && $pin?.length !== 6} +{#if loaded && user?.haspin && $pin?.length !== 6} <Pin /> {/if} |
