]> git.codecow.com Git - libnemo.git/commitdiff
Adjust how Ledger status codes are parsed.
authorChris Duncan <chris@zoso.dev>
Tue, 8 Jul 2025 21:21:43 +0000 (14:21 -0700)
committerChris Duncan <chris@zoso.dev>
Tue, 8 Jul 2025 21:21:43 +0000 (14:21 -0700)
src/lib/wallets/ledger-wallet.ts
test/test.sign-blocks.mjs

index 720e00978cf5613a821431fc8adf2643b1266cfa..3bf2093654445ee96d753354c1c324651640f837 100644 (file)
@@ -249,13 +249,14 @@ export class LedgerWallet extends Wallet {
        */\r
        async version (): Promise<LedgerVersionResponse> {\r
                const transport = await this.DynamicTransport.create(this.openTimeout, this.listenTimeout)\r
-               const response = await transport.send(0xb0, LEDGER_ADPU_CODES.version, LEDGER_ADPU_CODES.paramUnused, LEDGER_ADPU_CODES.paramUnused)\r
+               const response = await transport\r
+                       .send(0xb0, LEDGER_ADPU_CODES.version, LEDGER_ADPU_CODES.paramUnused, LEDGER_ADPU_CODES.paramUnused)\r
                        .catch(err => dec.toBytes(err.statusCode)) as Uint8Array\r
                await transport.close()\r
 \r
-               if (response.length === 2) {\r
-                       const statusCode = bytes.toDec(response) as number\r
-                       const status = LEDGER_STATUS_CODES[statusCode] ?? 'UNKNOWN_ERROR'\r
+               const statusCode = bytes.toDec(response.slice(-2)) as number\r
+               const status = LEDGER_STATUS_CODES[statusCode] ?? 'UNKNOWN_ERROR'\r
+               if (status !== 'OK') {\r
                        return { status, name: null, version: null }\r
                }\r
 \r
@@ -263,9 +264,7 @@ export class LedgerWallet extends Wallet {
                const name = response.slice(2, 2 + nameLength).toString()\r
                const versionLength = response[2 + nameLength]\r
                const version = response.slice(2 + nameLength + 1, 2 + nameLength + 1 + versionLength).toString()\r
-               const statusCode = bytes.toDec(response.slice(-2)) as number\r
 \r
-               const status = LEDGER_STATUS_CODES[statusCode]\r
                return { status, name, version }\r
        }\r
 \r
@@ -412,13 +411,14 @@ export class LedgerWallet extends Wallet {
                const data = new Uint8Array([LEDGER_ADPU_CODES.bip32DerivationLevel, ...purpose, ...coin, ...account])\r
 \r
                const transport = await this.DynamicTransport.create(this.openTimeout, this.listenTimeout)\r
-               const response = await transport.send(LEDGER_ADPU_CODES.class, LEDGER_ADPU_CODES.account, show ? 0x01 : 0x00, LEDGER_ADPU_CODES.paramUnused, data as Buffer)\r
+               const response = await transport\r
+                       .send(LEDGER_ADPU_CODES.class, LEDGER_ADPU_CODES.account, show ? 1 : 0, LEDGER_ADPU_CODES.paramUnused, data as Buffer)\r
                        .catch(err => dec.toBytes(err.statusCode)) as Uint8Array\r
                await transport.close()\r
 \r
-               if (response.length === 2) {\r
-                       const statusCode = bytes.toDec(response) as number\r
-                       const status = LEDGER_STATUS_CODES[statusCode] ?? 'UNKNOWN_ERROR'\r
+               const statusCode = bytes.toDec(response.slice(-2)) as number\r
+               const status = LEDGER_STATUS_CODES[statusCode] ?? 'UNKNOWN_ERROR'\r
+               if (status !== 'OK') {\r
                        return { status, publicKey: null, address: null }\r
                }\r
 \r
@@ -426,8 +426,7 @@ export class LedgerWallet extends Wallet {
                        const publicKey = bytes.toHex(response.slice(0, 32))\r
                        const addressLength = response[32]\r
                        const address = response.slice(33, 33 + addressLength).toString()\r
-                       const statusCode = bytes.toDec(response.slice(33 + addressLength)) as number\r
-                       const status = LEDGER_STATUS_CODES[statusCode]\r
+\r
                        return { status, publicKey, address }\r
                } catch (err) {\r
                        return { status: 'ERROR_PARSING_ACCOUNT', publicKey: null, address: null }\r
@@ -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])\r
 \r
                const transport = await this.DynamicTransport.create(this.openTimeout, this.listenTimeout)\r
-               const response = await transport.send(LEDGER_ADPU_CODES.class, LEDGER_ADPU_CODES.cacheBlock, LEDGER_ADPU_CODES.paramUnused, LEDGER_ADPU_CODES.paramUnused, data as Buffer)\r
+               const response = await transport\r
+                       .send(LEDGER_ADPU_CODES.class, LEDGER_ADPU_CODES.cacheBlock, LEDGER_ADPU_CODES.paramUnused, LEDGER_ADPU_CODES.paramUnused, data as Buffer)\r
                        .then(res => bytes.toDec(res))\r
                        .catch(err => err.statusCode) as number\r
                await transport.close()\r
index 90e62e9cc536cb47a5f8305dedd39a1c00ae8182..cc76c171c05f994a017e9d445ac293704c4315ce 100644 (file)
@@ -253,5 +253,7 @@ await suite('Ledger device signing tests', { skip: false }, async () => {
                assert.rejects(block.sign(0))\r
        })\r
 \r
-       await wallet.destroy()\r
+       await test('destroy Ledger wallet', async () => {\r
+               await wallet.destroy()\r
+       })\r
 })\r