]> git.codecow.com Git - libnemo.git/commitdiff
Fix retrieving private key from Safe worker objectified bytes. Report errors caught...
authorChris Duncan <chris@zoso.dev>
Sun, 6 Jul 2025 07:54:17 +0000 (00:54 -0700)
committerChris Duncan <chris@zoso.dev>
Sun, 6 Jul 2025 07:54:17 +0000 (00:54 -0700)
src/lib/account.ts
src/lib/pool.ts
src/lib/workers/safe.ts
test/test.lock-unlock.mjs

index a8ce5f52dd2514b55361bc1f49e44baaf4b55fc4..2fc90d202bad34939d8b188ba81664dbc8759f87 100644 (file)
@@ -3,7 +3,7 @@
 \r
 import { Blake2b } from './blake2b'\r
 import { ACCOUNT_KEY_BYTE_LENGTH, ACCOUNT_KEY_HEX_LENGTH, ALPHABET, PREFIX, PREFIX_LEGACY } from './constants'\r
-import { base32, bytes, hex, utf8 } from './convert'\r
+import { base32, bytes, hex, obj, utf8 } from './convert'\r
 import { Pool } from './pool'\r
 import { Rpc } from './rpc'\r
 import { NanoNaCl, SafeWorker } from '#workers'\r
@@ -32,7 +32,7 @@ export class Account {
 \r
        get address () { return `${PREFIX}${this.#address}` }\r
        get isLocked () { return this.#locked }\r
-       get isUnLocked () { return !this.#locked }\r
+       get isUnlocked () { return !this.#locked }\r
        get publicKey () { return this.#pub }\r
        get privateKey () { return bytes.toHex(this.#prv) }\r
 \r
@@ -152,7 +152,7 @@ export class Account {
                        password = utf8.toBytes(password)\r
                }\r
                if (password == null || password.constructor.name !== 'Uint8Array') {\r
-                       throw new Error('Failed to unlock wallet')\r
+                       throw new Error('Failed to lock account')\r
                }\r
                try {\r
                        const data: { id: string, privateKey: Uint8Array } = {\r
@@ -191,7 +191,7 @@ export class Account {
                        password = utf8.toBytes(password)\r
                }\r
                if (password == null || password.constructor.name !== 'Uint8Array') {\r
-                       throw new Error('Failed to unlock wallet')\r
+                       throw new Error('Failed to unlock account')\r
                }\r
                try {\r
                        const response = (await Account.#poolSafe.assign({\r
@@ -203,7 +203,7 @@ export class Account {
                        if (id == null || id !== this.#pub) {\r
                                throw null\r
                        }\r
-                       this.#prv.set(privateKey)\r
+                       this.#prv.set(obj.toBytes(privateKey))\r
                } catch (err) {\r
                        console.error(`Failed to unlock account ${this.address}`, err)\r
                        return false\r
index 8c3f0008c731eaa9e992a836c0013d9ce4d166de..d35a91d47c4537793b0181d9ddfcf77a28450707 100644 (file)
@@ -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)
                        }
                })
        }
index 5af2b60c628f7017978eacf692ee99f99c07014b..e043cca4702151497f22bac1405bdab1064b83d8 100644 (file)
@@ -88,7 +88,7 @@ export class Safe extends WorkerInterface {
        static async set (name: string, password: Uint8Array, data: any): Promise<boolean> {
                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 {
index 1c30dceb3e2f190856f398f58c1fa4de7f031e85..9b980b97c784bd6680a3562a96d8f4568c0ac3fc 100644 (file)
@@ -58,12 +58,14 @@ await suite('Lock and unlock wallets', async () => {
                const lockResult = await account.lock(NANO_TEST_VECTORS.PASSWORD)\r
 \r
                assert.equals(lockResult, true)\r
+               assert.ok(account.isLocked)\r
                assert.ok('privateKey' in account)\r
-               assert.nullish(account.privateKey)\r
+               assert.equals(account.privateKey, '0000000000000000000000000000000000000000000000000000000000000000')\r
 \r
                const unlockResult = await account.unlock(NANO_TEST_VECTORS.PASSWORD)\r
 \r
                assert.equals(unlockResult, true)\r
+               assert.ok(account.isUnlocked)\r
                assert.ok('privateKey' in account)\r
                assert.equals(account.privateKey, NANO_TEST_VECTORS.PRIVATE_0)\r
 \r
@@ -207,12 +209,14 @@ await suite('Lock and unlock wallets', async () => {
                const lockResult = await account.lock(NANO_TEST_VECTORS.PASSWORD)\r
 \r
                assert.equals(lockResult, true)\r
+               assert.ok(account.isLocked)\r
                assert.ok('privateKey' in account)\r
-               assert.nullish(account.privateKey)\r
+               assert.equals(account.privateKey, '0000000000000000000000000000000000000000000000000000000000000000')\r
 \r
                const unlockResult = await account.unlock(NANO_TEST_VECTORS.PASSWORD)\r
 \r
                assert.equals(unlockResult, true)\r
+               assert.ok(account.isUnlocked)\r
                assert.ok('privateKey' in account)\r
                assert.equals(account.privateKey, TREZOR_TEST_VECTORS.BLAKE2B_PRIVATE_0)\r
 \r