From 8bdcad7fac570437ee48e3aba0e60e64280d8623 Mon Sep 17 00:00:00 2001 From: Chris Duncan Date: Thu, 28 Nov 2024 03:15:19 -0800 Subject: [PATCH] Pass blake2b through nacl functions. Need to do something about bytes vs hex in blake vs bip wallets. --- src/lib/wallet.ts | 8 ++++---- src/lib/workers/nano-nacl.ts | 16 +++++++++------- 2 files changed, 13 insertions(+), 11 deletions(-) diff --git a/src/lib/wallet.ts b/src/lib/wallet.ts index 4b760a1..2f74b8e 100644 --- a/src/lib/wallet.ts +++ b/src/lib/wallet.ts @@ -2,10 +2,10 @@ // SPDX-License-Identifier: GPL-3.0-or-later import { Account } from './account.js' -import { Blake2b } from './blake2b.js' +import { default as blake2b, Blake2b } from './blake2b.js' import { Bip39Mnemonic } from './bip39-mnemonic.js' import { ADDRESS_GAP, SEED_LENGTH_BIP44, SEED_LENGTH_BLAKE2B } from './constants.js' -import { hex } from './convert.js' +import { bytes, hex } from './convert.js' import { Entropy } from './entropy.js' import { Pool } from './pool.js' import { Rpc } from './rpc.js' @@ -98,7 +98,7 @@ abstract class Wallet { let results = await this.ckd(indexes) if (!Array.isArray(results)) results = [results] const data: any = [] - results.forEach(r => data.push({ privateKey: hex.toBytes(r.privateKey as string), index: r.index })) + results.forEach(r => data.push({ privateKey: hex.toBytes(r.privateKey as string), index: r.index, blake2b })) let now = performance.now() const keypairs: [{ publicKey: string, privateKey: string, index: number }] = await this.#pool.work(data) console.log(`accounts: ${-now + (now = performance.now())} ms`) @@ -107,7 +107,7 @@ abstract class Wallet { if (keypair.privateKey == null) throw new RangeError('Account private key missing') if (keypair.index == null) throw new RangeError('Account keys derived but index missing') const { publicKey, privateKey, index } = keypair - this.#accounts[keypair.index] = Account.fromKnownKeys(publicKey, privateKey, index) + this.#accounts[keypair.index] = Account.fromKnownKeys(bytes.toHex(publicKey as unknown as Uint8Array), bytes.toHex(privateKey as unknown as Uint8Array), index) } console.log(`done: ${-now + (now = performance.now())} ms`) } diff --git a/src/lib/workers/nano-nacl.ts b/src/lib/workers/nano-nacl.ts index 38bb648..49a373f 100644 --- a/src/lib/workers/nano-nacl.ts +++ b/src/lib/workers/nano-nacl.ts @@ -22,8 +22,9 @@ async function fn () { * Listens for messages from a calling function. */ addEventListener('message', (message) => { - const { privateKey, index } = message.data ?? message - keyPair.fromSeed(privateKey).then(publicKey => postMessage({ publicKey, privateKey, index })) + const { privateKey, index, blake2b } = message.data ?? message + const { publicKey } = keyPair.fromSeed(privateKey, blake2b) + postMessage({ publicKey, privateKey, index }) }) @@ -527,7 +528,8 @@ function pow2523(o, i) { } // Note: difference from TweetNaCl - BLAKE2b used to hash instead of SHA-512. -function crypto_hash(out, m, n) { +function crypto_hash (out, m, n, b2b) { + const Blake2b = Function(`return ${b2b}`)() const input = new Uint8Array(n) for (let i = 0; i < n; ++i) { input[i] = m[i] @@ -605,13 +607,13 @@ function scalarbase(p, s) { scalarmult(p, q, s); } -function crypto_sign_keypair(pk, sk, seeded?) { +function crypto_sign_keypair (pk, sk, seeded?, b2b) { var d = new Uint8Array(64); var p = [gf(), gf(), gf(), gf()]; var i; if (!seeded) randombytes(sk, 32); - crypto_hash(d, sk, 32); + crypto_hash(d, sk, 32, b2b); d[0] &= 248; d[31] &= 127; d[31] |= 64; @@ -838,14 +840,14 @@ const keyPair = { return {publicKey: pk, secretKey: new Uint8Array(secretKey)}; }, - fromSeed(seed) { + fromSeed (seed, b2b) { checkArrayTypes(seed); if (seed.length !== crypto_sign_SEEDBYTES) throw new Error('bad seed size'); var pk = new Uint8Array(crypto_sign_PUBLICKEYBYTES); var sk = new Uint8Array(crypto_sign_SECRETKEYBYTES); for (var i = 0; i < 32; i++) sk[i] = seed[i]; - crypto_sign_keypair(pk, sk, true); + crypto_sign_keypair(pk, sk, true, b2b); return {publicKey: pk, secretKey: sk}; } } -- 2.34.1