From 53beb6bc0b06d712c70a567aff0fedf624a7a51f Mon Sep 17 00:00:00 2001 From: Chris Duncan Date: Tue, 19 Nov 2024 16:37:32 -0800 Subject: [PATCH] Restore ckd worker file. --- src/lib/ckd.ts | 60 ++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 60 insertions(+) create mode 100644 src/lib/ckd.ts diff --git a/src/lib/ckd.ts b/src/lib/ckd.ts new file mode 100644 index 0000000..c0548e0 --- /dev/null +++ b/src/lib/ckd.ts @@ -0,0 +1,60 @@ +// SPDX-FileCopyrightText: 2024 Chris Duncan +// SPDX-License-Identifier: GPL-3.0-or-later + +import blake2b from 'blake2b-wasm' +import { nanoCKD } from './bip32-key-derivation.js' + +let addEventListener = globalThis.addEventListener +let postMessage = globalThis.postMessage +if (addEventListener == null || postMessage == null) { + const { isMainThread, parentPort } = await import('node:worker_threads') + if (!isMainThread && parentPort) { + addEventListener = Object.getPrototypeOf(parentPort).addListener.bind(parentPort) + postMessage = Object.getPrototypeOf(parentPort).postMessage.bind(parentPort) + } +} + +/** +* Derives BIP-44 Nano account private keys. +* +* @param {number} index - Index of the account +* @returns {Promise} +*/ +addEventListener('message', (message) => { + const { type, seed, index } = message.data ?? message + switch (type) { + case 'bip44': { + ckdBip44(seed, index).then(postMessage) + break + } + case 'blake2b': { + ckdBlake2b(seed, index).then(postMessage) + break + } + } +}) + +/** +* Derives BIP-44 Nano account private keys. +* +* @param {number} index - Index of the account +* @returns {Promise} +*/ +async function ckdBip44 (seed: string, index: number): Promise { + return nanoCKD(seed, index) +} + +/** +* Derives BLAKE2b account private keys. +* +* @param {number} index - Index of the account +* @returns {Promise} +*/ +async function ckdBlake2b (seed: string, index: number): Promise { + const indexHex = index.toString(16).padStart(8, '0').toUpperCase() + const inputHex = `${seed}${indexHex}`.padStart(72, '0') + const inputArray = (inputHex.match(/.{1,2}/g) ?? []).map(h => parseInt(h, 16)) + const inputBytes = Uint8Array.from(inputArray) + const hash = blake2b().update(inputBytes).digest('hex') + return hash +} -- 2.34.1