aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorAdam Soltys <[email protected]>2022-12-29 01:29:56 -0800
committerAdam Soltys <[email protected]>2022-12-29 01:29:56 -0800
commit127262fcf9feef0c651b73a1a1cc79624d87aa9f (patch)
treebdae53cb6a97096109922106106bd7deecbda004 /src
parent43c2847f2cd6b9e09137072ba7fa7d1048d69617 (diff)
downloadcoinos-ui-127262fcf9feef0c651b73a1a1cc79624d87aa9f.tar.gz
coinos-ui-127262fcf9feef0c651b73a1a1cc79624d87aa9f.zip
move generate function
Diffstat (limited to 'src')
-rw-r--r--src/lib/nostr.js64
-rw-r--r--src/routes/(app)/[username]/generate/+page.svelte48
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}