aboutsummaryrefslogtreecommitdiffstats
path: root/src/lib/nostr.ts
diff options
context:
space:
mode:
authorAdam Soltys <[email protected]>2024-10-18 09:08:07 -0700
committerAdam Soltys <[email protected]>2024-10-18 09:09:14 -0700
commit002cd9134d2e23bec34f838f6d6fefba41f2d530 (patch)
tree92fa0e0ab54ce1a715d25f458de8b8ed8cc70bd5 /src/lib/nostr.ts
parentf6bfe889d91bc6e36b0300d7b618f10158efe176 (diff)
downloadcoinos-ui-002cd9134d2e23bec34f838f6d6fefba41f2d530.tar.gz
coinos-ui-002cd9134d2e23bec34f838f6d6fefba41f2d530.zip
biome format
Diffstat (limited to 'src/lib/nostr.ts')
-rw-r--r--src/lib/nostr.ts192
1 files changed, 96 insertions, 96 deletions
diff --git a/src/lib/nostr.ts b/src/lib/nostr.ts
index a9926ba1..a00a28f9 100644
--- a/src/lib/nostr.ts
+++ b/src/lib/nostr.ts
@@ -5,16 +5,16 @@ import { Buffer } from "buffer";
import { wait, post, stretch } from "$lib/utils";
import { decrypted, password as pw, passwordPrompt, pin } from "$lib/store";
import {
- getPublicKey,
- finalizeEvent,
- nip04,
- nip19,
- type EventTemplate,
+ getPublicKey,
+ finalizeEvent,
+ nip04,
+ nip19,
+ type EventTemplate,
} from "nostr-tools";
import {
- encrypt as nip49encrypt,
- decrypt as nip49decrypt,
+ encrypt as nip49encrypt,
+ decrypt as nip49decrypt,
} from "nostr-tools/nip49";
import { mnemonicToEntropy, entropyToMnemonic } from "@scure/bip39";
@@ -24,154 +24,154 @@ import { wordlist } from "@scure/bip39/wordlists/english";
import { generateSeedWords, privateKeyFromSeedWords } from "nostr-tools/nip06";
type User = {
- [key: string]: any;
+ [key: string]: any;
};
type EncryptParams = {
- message: string;
- recipient: string;
- user: User;
+ message: string;
+ recipient: string;
+ user: User;
};
const { encode, decode, toWords, fromWords } = bech32m;
export let generate = async (user: any) => {
- let p = get(pin);
- if (p && p.length !== 6) return;
+ let p = get(pin);
+ if (p && p.length !== 6) return;
- let salt = crypto.getRandomValues(new Uint8Array(16));
- let mnemonic = generateSeedWords();
- let sk = privateKeyFromSeedWords(mnemonic);
+ let salt = crypto.getRandomValues(new Uint8Array(16));
+ let mnemonic = generateSeedWords();
+ let sk = privateKeyFromSeedWords(mnemonic);
- let bytes = new Uint8Array(
- await crypto.subtle.encrypt(
- { name: "AES-GCM", iv: new Uint8Array(16) },
- await stretch(await getPassword(), salt),
- mnemonicToEntropy(mnemonic, wordlist)
- )
- );
+ let bytes = new Uint8Array(
+ await crypto.subtle.encrypt(
+ { name: "AES-GCM", iv: new Uint8Array(16) },
+ await stretch(await getPassword(), salt),
+ mnemonicToEntropy(mnemonic, wordlist),
+ ),
+ );
- user.pubkey = getPublicKey(hexToUint8Array(sk));
- user.cipher = encode("en", toWords(bytes), 180);
- user.salt = Buffer.from(salt).toString("hex");
+ user.pubkey = getPublicKey(hexToUint8Array(sk));
+ user.cipher = encode("en", toWords(bytes), 180);
+ user.salt = Buffer.from(salt).toString("hex");
};
export let encrypt = async ({ message, recipient, user }: EncryptParams) => {
- let sk = await getPrivateKey(user);
- return nip04.encrypt(sk, recipient, message);
+ let sk = await getPrivateKey(user);
+ return nip04.encrypt(sk, recipient, message);
};
export let decrypt = async ({ event, user }) => {
- let cache = get(decrypted);
- try {
- let { content, pubkey, id } = event;
- if (cache[id]) return cache[id];
- if (pubkey === user.pubkey) pubkey = event.tags[0][1];
+ let cache = get(decrypted);
+ try {
+ let { content, pubkey, id } = event;
+ if (cache[id]) return cache[id];
+ if (pubkey === user.pubkey) pubkey = event.tags[0][1];
- let message = await nip04.decrypt(
- await getPrivateKey(user),
- pubkey,
- content
- );
+ let message = await nip04.decrypt(
+ await getPrivateKey(user),
+ pubkey,
+ content,
+ );
- cache[id] = Buffer.from(message).toString("utf8");
- decrypted.set(cache);
+ cache[id] = Buffer.from(message).toString("utf8");
+ decrypted.set(cache);
- return cache[id];
- } catch (e) {
- // console.log(e);
- }
+ return cache[id];
+ } catch (e) {
+ // console.log(e);
+ }
};
export let getPrivateKey = async (user: User): Promise<Uint8Array> => {
- let k;
- if (browser) {
- k = localStorage.getItem("nsec");
- if (k) {
- return nip19.decode(k).data as Uint8Array;
- }
- }
+ let k;
+ if (browser) {
+ k = localStorage.getItem("nsec");
+ if (k) {
+ return nip19.decode(k).data as Uint8Array;
+ }
+ }
- let { nsec } = user;
+ let { nsec } = user;
- if (nsec) {
- k = nip49decrypt(nsec, await getPassword());
- } else k = hexToUint8Array(privateKeyFromSeedWords(await getMnemonic(user)));
+ if (nsec) {
+ k = nip49decrypt(nsec, await getPassword());
+ } else k = hexToUint8Array(privateKeyFromSeedWords(await getMnemonic(user)));
- localStorage.setItem("nsec", nip19.nsecEncode(k));
- return k;
+ localStorage.setItem("nsec", nip19.nsecEncode(k));
+ return k;
};
export let getMnemonic = async (user: User) => {
- let { cipher, salt } = user;
- let entropy;
+ let { cipher, salt } = user;
+ let entropy;
- entropy = new Uint8Array(
- await crypto.subtle.decrypt(
- { name: "AES-GCM", iv: new Uint8Array(16) },
- await stretch(await getPassword(), Buffer.from(salt, "hex")),
- Uint8Array.from(fromWords(decode(cipher, 180).words))
- )
- );
+ entropy = new Uint8Array(
+ await crypto.subtle.decrypt(
+ { name: "AES-GCM", iv: new Uint8Array(16) },
+ await stretch(await getPassword(), Buffer.from(salt, "hex")),
+ Uint8Array.from(fromWords(decode(cipher, 180).words)),
+ ),
+ );
- return entropyToMnemonic(entropy, wordlist);
+ return entropyToMnemonic(entropy, wordlist);
};
let decodeNsec = (nsec: string): Uint8Array => {
- let { type, data } = nip19.decode(nsec);
- if (type === "nsec" && data instanceof Uint8Array) return data;
- else throw new Error("invalid nsec");
+ let { type, data } = nip19.decode(nsec);
+ if (type === "nsec" && data instanceof Uint8Array) return data;
+ else throw new Error("invalid nsec");
};
export let getNsec = async (user: User) => {
- return nip19.nsecEncode(await getPrivateKey(user));
+ return nip19.nsecEncode(await getPrivateKey(user));
};
export let setNsec = async (user: User, nsec: string) => {
- user.pubkey = getPublicKey(decodeNsec(nsec));
- user.nsec = await encryptNsec(nsec);
+ user.pubkey = getPublicKey(decodeNsec(nsec));
+ user.nsec = await encryptNsec(nsec);
};
export let encryptNsec = async (nsec: string) => {
- let d = decodeNsec(nsec);
- return nip49encrypt(d, await getPassword());
+ let d = decodeNsec(nsec);
+ return nip49encrypt(d, await getPassword());
};
type SignParams = {
- event: EventTemplate;
- user: User;
+ event: EventTemplate;
+ user: User;
};
export let sign = async ({ event, user }: SignParams) => {
- event = finalizeEvent(event, await getPrivateKey(user));
+ event = finalizeEvent(event, await getPrivateKey(user));
};
export let send = (event: EventTemplate) => {
- return post("/events", { event });
+ return post("/events", { event });
};
let getPassword = async (): Promise<string> => {
- if (!get(pw)) passwordPrompt.set(true);
- await wait(() => !!get(pw));
- return get(pw) || "";
+ if (!get(pw)) passwordPrompt.set(true);
+ await wait(() => !!get(pw));
+ return get(pw) || "";
};
export let reEncryptEntropy = async (user: User, newPassword: string) => {
- let { cipher, salt } = user;
+ let { cipher, salt } = user;
- let entropy = await crypto.subtle.decrypt(
- { name: "AES-GCM", iv: new Uint8Array(16) },
- await stretch(await getPassword(), hexToUint8Array(salt)),
- Uint8Array.from(fromWords(decode(cipher, 180).words))
- );
+ let entropy = await crypto.subtle.decrypt(
+ { name: "AES-GCM", iv: new Uint8Array(16) },
+ await stretch(await getPassword(), hexToUint8Array(salt)),
+ Uint8Array.from(fromWords(decode(cipher, 180).words)),
+ );
- let bytes = new Uint8Array(
- await crypto.subtle.encrypt(
- { name: "AES-GCM", iv: new Uint8Array(16) },
- await stretch(newPassword, hexToUint8Array(salt)),
- entropy
- )
- );
+ let bytes = new Uint8Array(
+ await crypto.subtle.encrypt(
+ { name: "AES-GCM", iv: new Uint8Array(16) },
+ await stretch(newPassword, hexToUint8Array(salt)),
+ entropy,
+ ),
+ );
- return encode("en", toWords(bytes), 180);
+ return encode("en", toWords(bytes), 180);
};