From d84841e8da59c85f984e24fbbc947d33a7ad8a39 Mon Sep 17 00:00:00 2001 From: Chris Duncan Date: Tue, 8 Jul 2025 14:21:43 -0700 Subject: [PATCH] Adjust how Ledger status codes are parsed. --- src/lib/wallets/ledger-wallet.ts | 26 +++++++++++++------------- test/test.sign-blocks.mjs | 4 +++- 2 files changed, 16 insertions(+), 14 deletions(-) diff --git a/src/lib/wallets/ledger-wallet.ts b/src/lib/wallets/ledger-wallet.ts index 720e009..3bf2093 100644 --- a/src/lib/wallets/ledger-wallet.ts +++ b/src/lib/wallets/ledger-wallet.ts @@ -249,13 +249,14 @@ export class LedgerWallet extends Wallet { */ async version (): Promise { const transport = await this.DynamicTransport.create(this.openTimeout, this.listenTimeout) - const response = await transport.send(0xb0, LEDGER_ADPU_CODES.version, LEDGER_ADPU_CODES.paramUnused, LEDGER_ADPU_CODES.paramUnused) + const response = await transport + .send(0xb0, LEDGER_ADPU_CODES.version, LEDGER_ADPU_CODES.paramUnused, LEDGER_ADPU_CODES.paramUnused) .catch(err => dec.toBytes(err.statusCode)) as Uint8Array await transport.close() - if (response.length === 2) { - const statusCode = bytes.toDec(response) as number - const status = LEDGER_STATUS_CODES[statusCode] ?? 'UNKNOWN_ERROR' + const statusCode = bytes.toDec(response.slice(-2)) as number + const status = LEDGER_STATUS_CODES[statusCode] ?? 'UNKNOWN_ERROR' + if (status !== 'OK') { return { status, name: null, version: null } } @@ -263,9 +264,7 @@ export class LedgerWallet extends Wallet { const name = response.slice(2, 2 + nameLength).toString() const versionLength = response[2 + nameLength] const version = response.slice(2 + nameLength + 1, 2 + nameLength + 1 + versionLength).toString() - const statusCode = bytes.toDec(response.slice(-2)) as number - const status = LEDGER_STATUS_CODES[statusCode] return { status, name, version } } @@ -412,13 +411,14 @@ export class LedgerWallet extends Wallet { const data = new Uint8Array([LEDGER_ADPU_CODES.bip32DerivationLevel, ...purpose, ...coin, ...account]) const transport = await this.DynamicTransport.create(this.openTimeout, this.listenTimeout) - const response = await transport.send(LEDGER_ADPU_CODES.class, LEDGER_ADPU_CODES.account, show ? 0x01 : 0x00, LEDGER_ADPU_CODES.paramUnused, data as Buffer) + const response = await transport + .send(LEDGER_ADPU_CODES.class, LEDGER_ADPU_CODES.account, show ? 1 : 0, LEDGER_ADPU_CODES.paramUnused, data as Buffer) .catch(err => dec.toBytes(err.statusCode)) as Uint8Array await transport.close() - if (response.length === 2) { - const statusCode = bytes.toDec(response) as number - const status = LEDGER_STATUS_CODES[statusCode] ?? 'UNKNOWN_ERROR' + const statusCode = bytes.toDec(response.slice(-2)) as number + const status = LEDGER_STATUS_CODES[statusCode] ?? 'UNKNOWN_ERROR' + if (status !== 'OK') { return { status, publicKey: null, address: null } } @@ -426,8 +426,7 @@ export class LedgerWallet extends Wallet { const publicKey = bytes.toHex(response.slice(0, 32)) const addressLength = response[32] const address = response.slice(33, 33 + addressLength).toString() - const statusCode = bytes.toDec(response.slice(33 + addressLength)) as number - const status = LEDGER_STATUS_CODES[statusCode] + return { status, publicKey, address } } catch (err) { return { status: 'ERROR_PARSING_ACCOUNT', publicKey: null, address: null } @@ -463,7 +462,8 @@ export class LedgerWallet extends Wallet { const data = new Uint8Array([LEDGER_ADPU_CODES.bip32DerivationLevel, ...purpose, ...coin, ...account, ...previous, ...link, ...representative, ...balance, ...signature]) const transport = await this.DynamicTransport.create(this.openTimeout, this.listenTimeout) - const response = await transport.send(LEDGER_ADPU_CODES.class, LEDGER_ADPU_CODES.cacheBlock, LEDGER_ADPU_CODES.paramUnused, LEDGER_ADPU_CODES.paramUnused, data as Buffer) + const response = await transport + .send(LEDGER_ADPU_CODES.class, LEDGER_ADPU_CODES.cacheBlock, LEDGER_ADPU_CODES.paramUnused, LEDGER_ADPU_CODES.paramUnused, data as Buffer) .then(res => bytes.toDec(res)) .catch(err => err.statusCode) as number await transport.close() diff --git a/test/test.sign-blocks.mjs b/test/test.sign-blocks.mjs index 90e62e9..cc76c17 100644 --- a/test/test.sign-blocks.mjs +++ b/test/test.sign-blocks.mjs @@ -253,5 +253,7 @@ await suite('Ledger device signing tests', { skip: false }, async () => { assert.rejects(block.sign(0)) }) - await wallet.destroy() + await test('destroy Ledger wallet', async () => { + await wallet.destroy() + }) }) -- 2.47.3