From: Chris Duncan Date: Sun, 6 Jul 2025 07:54:17 +0000 (-0700) Subject: Fix retrieving private key from Safe worker objectified bytes. Report errors caught... X-Git-Tag: v0.10.5~104 X-Git-Url: https://git.codecow.com/?a=commitdiff_plain;h=a7baf6e1483b1b921bb78268be6e4d7bb561a4ce;p=libnemo.git Fix retrieving private key from Safe worker objectified bytes. Report errors caught by pool workers. --- diff --git a/src/lib/account.ts b/src/lib/account.ts index a8ce5f5..2fc90d2 100644 --- a/src/lib/account.ts +++ b/src/lib/account.ts @@ -3,7 +3,7 @@ import { Blake2b } from './blake2b' import { ACCOUNT_KEY_BYTE_LENGTH, ACCOUNT_KEY_HEX_LENGTH, ALPHABET, PREFIX, PREFIX_LEGACY } from './constants' -import { base32, bytes, hex, utf8 } from './convert' +import { base32, bytes, hex, obj, utf8 } from './convert' import { Pool } from './pool' import { Rpc } from './rpc' import { NanoNaCl, SafeWorker } from '#workers' @@ -32,7 +32,7 @@ export class Account { get address () { return `${PREFIX}${this.#address}` } get isLocked () { return this.#locked } - get isUnLocked () { return !this.#locked } + get isUnlocked () { return !this.#locked } get publicKey () { return this.#pub } get privateKey () { return bytes.toHex(this.#prv) } @@ -152,7 +152,7 @@ export class Account { password = utf8.toBytes(password) } if (password == null || password.constructor.name !== 'Uint8Array') { - throw new Error('Failed to unlock wallet') + throw new Error('Failed to lock account') } try { const data: { id: string, privateKey: Uint8Array } = { @@ -191,7 +191,7 @@ export class Account { password = utf8.toBytes(password) } if (password == null || password.constructor.name !== 'Uint8Array') { - throw new Error('Failed to unlock wallet') + throw new Error('Failed to unlock account') } try { const response = (await Account.#poolSafe.assign({ @@ -203,7 +203,7 @@ export class Account { if (id == null || id !== this.#pub) { throw null } - this.#prv.set(privateKey) + this.#prv.set(obj.toBytes(privateKey)) } catch (err) { console.error(`Failed to unlock account ${this.address}`, err) return false diff --git a/src/lib/pool.ts b/src/lib/pool.ts index 8c3f000..d35a91d 100644 --- a/src/lib/pool.ts +++ b/src/lib/pool.ts @@ -206,7 +206,7 @@ export class WorkerInterface { postMessage(buffer, [buffer]) } else { const data = JSON.parse(new TextDecoder().decode(buffer)) - this.work(data).then(this.report) + this.work(data).then(this.report).catch(this.report) } }) } diff --git a/src/lib/workers/safe.ts b/src/lib/workers/safe.ts index 5af2b60..e043cca 100644 --- a/src/lib/workers/safe.ts +++ b/src/lib/workers/safe.ts @@ -88,7 +88,7 @@ export class Safe extends WorkerInterface { static async set (name: string, password: Uint8Array, data: any): Promise { if (await this.#exists(name)) { password.fill(0) - throw new Error(this.ERR_MSG) + throw new Error('Record is already locked') } let passkey: CryptoKey try { diff --git a/test/test.lock-unlock.mjs b/test/test.lock-unlock.mjs index 1c30dce..9b980b9 100644 --- a/test/test.lock-unlock.mjs +++ b/test/test.lock-unlock.mjs @@ -58,12 +58,14 @@ await suite('Lock and unlock wallets', async () => { const lockResult = await account.lock(NANO_TEST_VECTORS.PASSWORD) assert.equals(lockResult, true) + assert.ok(account.isLocked) assert.ok('privateKey' in account) - assert.nullish(account.privateKey) + assert.equals(account.privateKey, '0000000000000000000000000000000000000000000000000000000000000000') const unlockResult = await account.unlock(NANO_TEST_VECTORS.PASSWORD) assert.equals(unlockResult, true) + assert.ok(account.isUnlocked) assert.ok('privateKey' in account) assert.equals(account.privateKey, NANO_TEST_VECTORS.PRIVATE_0) @@ -207,12 +209,14 @@ await suite('Lock and unlock wallets', async () => { const lockResult = await account.lock(NANO_TEST_VECTORS.PASSWORD) assert.equals(lockResult, true) + assert.ok(account.isLocked) assert.ok('privateKey' in account) - assert.nullish(account.privateKey) + assert.equals(account.privateKey, '0000000000000000000000000000000000000000000000000000000000000000') const unlockResult = await account.unlock(NANO_TEST_VECTORS.PASSWORD) assert.equals(unlockResult, true) + assert.ok(account.isUnlocked) assert.ok('privateKey' in account) assert.equals(account.privateKey, TREZOR_TEST_VECTORS.BLAKE2B_PRIVATE_0)