@ledgerhq/device-trusted-app-kit-ledger-keyring-protocol 0.3.0 → 0.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/lib/cjs/api/app-binder/AddToTrustchainDeviceActionTypes.js.map +1 -1
- package/lib/cjs/api/crypto/CryptoService.js.map +1 -1
- package/lib/cjs/api/model/Errors.js +1 -1
- package/lib/cjs/api/model/Errors.js.map +1 -1
- package/lib/cjs/internal/app-binder/LedgerKeyringProtocolBinder.js +1 -1
- package/lib/cjs/internal/app-binder/LedgerKeyringProtocolBinder.js.map +1 -1
- package/lib/cjs/internal/app-binder/command/GetAppNameCommand.js +1 -1
- package/lib/cjs/internal/app-binder/command/GetAppNameCommand.js.map +2 -2
- package/lib/cjs/internal/app-binder/command/GetSeedIdCommand.js +1 -1
- package/lib/cjs/internal/app-binder/command/GetSeedIdCommand.js.map +2 -2
- package/lib/cjs/internal/app-binder/command/GetSeedIdCommand.test.js +3 -3
- package/lib/cjs/internal/app-binder/command/GetSeedIdCommand.test.js.map +3 -3
- package/lib/cjs/internal/app-binder/command/GetVersionCommand.js +1 -1
- package/lib/cjs/internal/app-binder/command/GetVersionCommand.js.map +2 -2
- package/lib/cjs/internal/app-binder/command/InitCommand.js +1 -1
- package/lib/cjs/internal/app-binder/command/InitCommand.js.map +2 -2
- package/lib/cjs/internal/app-binder/command/InitCommand.test.js +1 -1
- package/lib/cjs/internal/app-binder/command/InitCommand.test.js.map +3 -3
- package/lib/cjs/internal/app-binder/command/ParseBlockSignatureCommand.js +1 -1
- package/lib/cjs/internal/app-binder/command/ParseBlockSignatureCommand.js.map +2 -2
- package/lib/cjs/internal/app-binder/command/ParseBlockSignatureCommand.test.js +1 -1
- package/lib/cjs/internal/app-binder/command/ParseBlockSignatureCommand.test.js.map +3 -3
- package/lib/cjs/internal/app-binder/command/ParseStreamBlockCommand.js +1 -1
- package/lib/cjs/internal/app-binder/command/ParseStreamBlockCommand.js.map +2 -2
- package/lib/cjs/internal/app-binder/command/ParseStreamBlockCommand.test.js +1 -1
- package/lib/cjs/internal/app-binder/command/ParseStreamBlockCommand.test.js.map +3 -3
- package/lib/cjs/internal/app-binder/command/ParseStreamBlockHeader.js +1 -1
- package/lib/cjs/internal/app-binder/command/ParseStreamBlockHeader.js.map +2 -2
- package/lib/cjs/internal/app-binder/command/ParseStreamBlockHeader.test.js +1 -1
- package/lib/cjs/internal/app-binder/command/ParseStreamBlockHeader.test.js.map +3 -3
- package/lib/cjs/internal/app-binder/command/SetTrustedMemberCommand.js +1 -1
- package/lib/cjs/internal/app-binder/command/SetTrustedMemberCommand.js.map +2 -2
- package/lib/cjs/internal/app-binder/command/SetTrustedMemberCommand.test.js +1 -1
- package/lib/cjs/internal/app-binder/command/SetTrustedMemberCommand.test.js.map +3 -3
- package/lib/cjs/internal/app-binder/command/SignBlockHeader.js +1 -1
- package/lib/cjs/internal/app-binder/command/SignBlockHeader.js.map +2 -2
- package/lib/cjs/internal/app-binder/command/SignBlockHeader.test.js +1 -1
- package/lib/cjs/internal/app-binder/command/SignBlockHeader.test.js.map +3 -3
- package/lib/cjs/internal/app-binder/command/SignBlockSignatureCommand.js +1 -1
- package/lib/cjs/internal/app-binder/command/SignBlockSignatureCommand.js.map +2 -2
- package/lib/cjs/internal/app-binder/command/SignBlockSignatureCommand.test.js +1 -1
- package/lib/cjs/internal/app-binder/command/SignBlockSignatureCommand.test.js.map +3 -3
- package/lib/cjs/internal/app-binder/command/SignBlockSingleCommand.js +1 -1
- package/lib/cjs/internal/app-binder/command/SignBlockSingleCommand.js.map +2 -2
- package/lib/cjs/internal/app-binder/command/SignBlockSingleCommand.test.js +1 -1
- package/lib/cjs/internal/app-binder/command/SignBlockSingleCommand.test.js.map +3 -3
- package/lib/cjs/internal/app-binder/device-action/AddToTrustchainDeviceAction.js +1 -1
- package/lib/cjs/internal/app-binder/device-action/AddToTrustchainDeviceAction.js.map +1 -1
- package/lib/cjs/internal/app-binder/device-action/AuthenticateWithDeviceDeviceAction.js +1 -1
- package/lib/cjs/internal/app-binder/device-action/AuthenticateWithDeviceDeviceAction.js.map +1 -1
- package/lib/cjs/internal/app-binder/device-action/AuthenticateWithKeypairDeviceAction.js +1 -1
- package/lib/cjs/internal/app-binder/device-action/AuthenticateWithKeypairDeviceAction.js.map +2 -2
- package/lib/cjs/internal/app-binder/device-action/models/AuthenticateWithDeviceDeviceActionTypes.js.map +1 -1
- package/lib/cjs/internal/app-binder/device-action/models/AuthenticateWithKeypairDeviceActionTypes.js +1 -1
- package/lib/cjs/internal/app-binder/device-action/models/AuthenticateWithKeypairDeviceActionTypes.js.map +1 -1
- package/lib/cjs/internal/app-binder/task/ExtractEncryptionKeyTask.js.map +2 -2
- package/lib/cjs/internal/app-binder/task/SignChallengeWithKeypairTask.js +1 -1
- package/lib/cjs/internal/app-binder/task/SignChallengeWithKeypairTask.js.map +2 -2
- package/lib/cjs/internal/app-binder/task/SignChallengeWithKeypairTask.test.js +1 -1
- package/lib/cjs/internal/app-binder/task/SignChallengeWithKeypairTask.test.js.map +2 -2
- package/lib/cjs/internal/use-cases/authentication/AuthenticateUseCase.js +1 -1
- package/lib/cjs/internal/use-cases/authentication/AuthenticateUseCase.js.map +1 -1
- package/lib/cjs/internal/use-cases/authentication/DecryptDataUseCase.js.map +1 -1
- package/lib/cjs/internal/use-cases/authentication/EncryptDataUseCase.js.map +1 -1
- package/lib/cjs/internal/utils/LKRPBlockStream.js +1 -1
- package/lib/cjs/internal/utils/LKRPBlockStream.js.map +2 -2
- package/lib/cjs/package.json +1 -1
- package/lib/esm/api/app-binder/AddToTrustchainDeviceActionTypes.js.map +1 -1
- package/lib/esm/api/crypto/CryptoService.js.map +1 -1
- package/lib/esm/api/model/Errors.js +1 -1
- package/lib/esm/api/model/Errors.js.map +1 -1
- package/lib/esm/internal/app-binder/LedgerKeyringProtocolBinder.js +1 -1
- package/lib/esm/internal/app-binder/LedgerKeyringProtocolBinder.js.map +1 -1
- package/lib/esm/internal/app-binder/command/GetAppNameCommand.js +1 -1
- package/lib/esm/internal/app-binder/command/GetAppNameCommand.js.map +2 -2
- package/lib/esm/internal/app-binder/command/GetSeedIdCommand.js +1 -1
- package/lib/esm/internal/app-binder/command/GetSeedIdCommand.js.map +2 -2
- package/lib/esm/internal/app-binder/command/GetSeedIdCommand.test.js +3 -3
- package/lib/esm/internal/app-binder/command/GetSeedIdCommand.test.js.map +3 -3
- package/lib/esm/internal/app-binder/command/GetVersionCommand.js +1 -1
- package/lib/esm/internal/app-binder/command/GetVersionCommand.js.map +2 -2
- package/lib/esm/internal/app-binder/command/InitCommand.js +1 -1
- package/lib/esm/internal/app-binder/command/InitCommand.js.map +2 -2
- package/lib/esm/internal/app-binder/command/InitCommand.test.js +1 -1
- package/lib/esm/internal/app-binder/command/InitCommand.test.js.map +3 -3
- package/lib/esm/internal/app-binder/command/ParseBlockSignatureCommand.js +1 -1
- package/lib/esm/internal/app-binder/command/ParseBlockSignatureCommand.js.map +2 -2
- package/lib/esm/internal/app-binder/command/ParseBlockSignatureCommand.test.js +1 -1
- package/lib/esm/internal/app-binder/command/ParseBlockSignatureCommand.test.js.map +3 -3
- package/lib/esm/internal/app-binder/command/ParseStreamBlockCommand.js +1 -1
- package/lib/esm/internal/app-binder/command/ParseStreamBlockCommand.js.map +2 -2
- package/lib/esm/internal/app-binder/command/ParseStreamBlockCommand.test.js +1 -1
- package/lib/esm/internal/app-binder/command/ParseStreamBlockCommand.test.js.map +3 -3
- package/lib/esm/internal/app-binder/command/ParseStreamBlockHeader.js +1 -1
- package/lib/esm/internal/app-binder/command/ParseStreamBlockHeader.js.map +2 -2
- package/lib/esm/internal/app-binder/command/ParseStreamBlockHeader.test.js +1 -1
- package/lib/esm/internal/app-binder/command/ParseStreamBlockHeader.test.js.map +3 -3
- package/lib/esm/internal/app-binder/command/SetTrustedMemberCommand.js +1 -1
- package/lib/esm/internal/app-binder/command/SetTrustedMemberCommand.js.map +2 -2
- package/lib/esm/internal/app-binder/command/SetTrustedMemberCommand.test.js +1 -1
- package/lib/esm/internal/app-binder/command/SetTrustedMemberCommand.test.js.map +3 -3
- package/lib/esm/internal/app-binder/command/SignBlockHeader.js +1 -1
- package/lib/esm/internal/app-binder/command/SignBlockHeader.js.map +2 -2
- package/lib/esm/internal/app-binder/command/SignBlockHeader.test.js +1 -1
- package/lib/esm/internal/app-binder/command/SignBlockHeader.test.js.map +3 -3
- package/lib/esm/internal/app-binder/command/SignBlockSignatureCommand.js +1 -1
- package/lib/esm/internal/app-binder/command/SignBlockSignatureCommand.js.map +2 -2
- package/lib/esm/internal/app-binder/command/SignBlockSignatureCommand.test.js +1 -1
- package/lib/esm/internal/app-binder/command/SignBlockSignatureCommand.test.js.map +3 -3
- package/lib/esm/internal/app-binder/command/SignBlockSingleCommand.js +1 -1
- package/lib/esm/internal/app-binder/command/SignBlockSingleCommand.js.map +2 -2
- package/lib/esm/internal/app-binder/command/SignBlockSingleCommand.test.js +1 -1
- package/lib/esm/internal/app-binder/command/SignBlockSingleCommand.test.js.map +3 -3
- package/lib/esm/internal/app-binder/device-action/AddToTrustchainDeviceAction.js +1 -1
- package/lib/esm/internal/app-binder/device-action/AddToTrustchainDeviceAction.js.map +1 -1
- package/lib/esm/internal/app-binder/device-action/AuthenticateWithDeviceDeviceAction.js +1 -1
- package/lib/esm/internal/app-binder/device-action/AuthenticateWithDeviceDeviceAction.js.map +1 -1
- package/lib/esm/internal/app-binder/device-action/AuthenticateWithKeypairDeviceAction.js +1 -1
- package/lib/esm/internal/app-binder/device-action/AuthenticateWithKeypairDeviceAction.js.map +2 -2
- package/lib/esm/internal/app-binder/task/ExtractEncryptionKeyTask.js.map +2 -2
- package/lib/esm/internal/app-binder/task/SignChallengeWithKeypairTask.js +1 -1
- package/lib/esm/internal/app-binder/task/SignChallengeWithKeypairTask.js.map +2 -2
- package/lib/esm/internal/app-binder/task/SignChallengeWithKeypairTask.test.js +1 -1
- package/lib/esm/internal/app-binder/task/SignChallengeWithKeypairTask.test.js.map +2 -2
- package/lib/esm/internal/use-cases/authentication/AuthenticateUseCase.js.map +1 -1
- package/lib/esm/internal/use-cases/authentication/DecryptDataUseCase.js.map +1 -1
- package/lib/esm/internal/use-cases/authentication/EncryptDataUseCase.js.map +1 -1
- package/lib/esm/internal/utils/LKRPBlockStream.js +2 -2
- package/lib/esm/internal/utils/LKRPBlockStream.js.map +2 -2
- package/lib/esm/package.json +1 -1
- package/lib/types/api/app-binder/AddToTrustchainDeviceActionTypes.d.ts +1 -1
- package/lib/types/internal/app-binder/LedgerKeyringProtocolBinder.d.ts +2 -2
- package/lib/types/internal/app-binder/command/GetAppNameCommand.d.ts +1 -0
- package/lib/types/internal/app-binder/command/GetAppNameCommand.d.ts.map +1 -1
- package/lib/types/internal/app-binder/command/GetSeedIdCommand.d.ts +1 -0
- package/lib/types/internal/app-binder/command/GetSeedIdCommand.d.ts.map +1 -1
- package/lib/types/internal/app-binder/command/GetVersionCommand.d.ts +1 -0
- package/lib/types/internal/app-binder/command/GetVersionCommand.d.ts.map +1 -1
- package/lib/types/internal/app-binder/command/InitCommand.d.ts +1 -0
- package/lib/types/internal/app-binder/command/InitCommand.d.ts.map +1 -1
- package/lib/types/internal/app-binder/command/ParseBlockSignatureCommand.d.ts +1 -0
- package/lib/types/internal/app-binder/command/ParseBlockSignatureCommand.d.ts.map +1 -1
- package/lib/types/internal/app-binder/command/ParseStreamBlockCommand.d.ts +1 -0
- package/lib/types/internal/app-binder/command/ParseStreamBlockCommand.d.ts.map +1 -1
- package/lib/types/internal/app-binder/command/ParseStreamBlockHeader.d.ts +1 -0
- package/lib/types/internal/app-binder/command/ParseStreamBlockHeader.d.ts.map +1 -1
- package/lib/types/internal/app-binder/command/SetTrustedMemberCommand.d.ts +1 -0
- package/lib/types/internal/app-binder/command/SetTrustedMemberCommand.d.ts.map +1 -1
- package/lib/types/internal/app-binder/command/SignBlockHeader.d.ts +1 -0
- package/lib/types/internal/app-binder/command/SignBlockHeader.d.ts.map +1 -1
- package/lib/types/internal/app-binder/command/SignBlockSignatureCommand.d.ts +1 -0
- package/lib/types/internal/app-binder/command/SignBlockSignatureCommand.d.ts.map +1 -1
- package/lib/types/internal/app-binder/command/SignBlockSingleCommand.d.ts +1 -0
- package/lib/types/internal/app-binder/command/SignBlockSingleCommand.d.ts.map +1 -1
- package/lib/types/internal/app-binder/device-action/AuthenticateWithDeviceDeviceAction.d.ts +1 -1
- package/lib/types/internal/app-binder/device-action/AuthenticateWithKeypairDeviceAction.d.ts +2 -2
- package/lib/types/internal/app-binder/device-action/models/AuthenticateWithDeviceDeviceActionTypes.d.ts +1 -1
- package/lib/types/internal/app-binder/device-action/models/AuthenticateWithKeypairDeviceActionTypes.d.ts +1 -1
- package/lib/types/internal/app-binder/task/ExtractEncryptionKeyTask.d.ts +1 -1
- package/lib/types/internal/app-binder/task/SignChallengeWithKeypairTask.d.ts +2 -2
- package/lib/types/internal/use-cases/authentication/AuthenticateUseCase.d.ts +1 -1
- package/lib/types/internal/utils/LKRPBlockStream.d.ts +1 -1
- package/lib/types/tsconfig.prod.tsbuildinfo +1 -1
- package/package.json +4 -4
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../../src/internal/app-binder/command/ParseStreamBlockCommand.test.ts"],
|
|
4
|
-
"sourcesContent": ["/* eslint-disable @typescript-eslint/no-unsafe-member-access */\n/* eslint-disable @typescript-eslint/no-explicit-any */\nimport {\n ApduResponse,\n isSuccessCommandResult,\n} from \"@ledgerhq/device-management-kit\";\nimport { describe, expect, it } from \"vitest\";\n\nimport {\n ParseSingleCommand,\n type ParseSingleCommandArgs,\n} from \"./ParseStreamBlockCommand\";\n\nconst DUMMY_COMMAND = Uint8Array.from([0x01, 0x02, 0x03]);\nconst PLACEHOLDER_BYTES = Uint8Array.from([0xf0, 0xca, 0xcc, 0x1a]);\n\ndescribe(\"ParseSingleCommand\", () => {\n const makeArgs = (outputTrustedParam = false): ParseSingleCommandArgs => ({\n command: DUMMY_COMMAND,\n outputTrustedParam,\n });\n\n describe(\"getApdu()\", () => {\n it(\"builds correct APDU without trustedParam\", () => {\n // given\n const cmd = new ParseSingleCommand(makeArgs(false));\n\n // when\n const apdu = cmd.getApdu();\n const raw = apdu.getRawApdu();\n\n // then\n expect(raw).toEqual(\n Uint8Array.from([\n 0xe0,\n 0x08,\n 0x01,\n 0x00,\n DUMMY_COMMAND.length,\n ...DUMMY_COMMAND,\n ]),\n );\n });\n\n it(\"builds correct APDU with trustedParam\", () => {\n // given\n const cmd = new ParseSingleCommand(makeArgs(true));\n\n // when\n const apdu = cmd.getApdu();\n const raw = apdu.getRawApdu();\n\n // then\n expect(raw).toEqual(\n Uint8Array.from([\n 0xe0,\n 0x08,\n 0x01,\n 0x01,\n DUMMY_COMMAND.length,\n ...DUMMY_COMMAND,\n ]),\n );\n });\n });\n\n describe(\"parseResponse()\", () => {\n it(\"returns raw TLV payload on success\", () => {\n // given\n const cmd = new ParseSingleCommand(makeArgs());\n const response = new ApduResponse({\n statusCode: Uint8Array.from([0x90, 0x00]),\n data: PLACEHOLDER_BYTES,\n });\n\n // when\n const result = cmd.parseResponse(response);\n\n // then\n expect(isSuccessCommandResult(result)).toBe(true);\n if (isSuccessCommandResult(result)) {\n expect(result.data).toEqual(PLACEHOLDER_BYTES);\n }\n });\n\n it(\"maps SW errors to CommandResult error\", () => {\n // given\n const cmd = new ParseSingleCommand(makeArgs());\n const response = new ApduResponse({\n statusCode: Uint8Array.from([0x6a, 0x86]),\n data: new Uint8Array(),\n });\n\n // when\n const result = cmd.parseResponse(response);\n\n // then\n expect(isSuccessCommandResult(result)).toBe(false);\n if (!isSuccessCommandResult(result)) {\n expect((result.error as any).errorCode).toBe(\"6a86\");\n }\n });\n\n it(\"errors when no TLV data returned\", () => {\n // given\n const cmd = new ParseSingleCommand(makeArgs());\n const response = new ApduResponse({\n statusCode: Uint8Array.from([0x90, 0x00]),\n data: new Uint8Array(),\n });\n\n // when\n const result = cmd.parseResponse(response);\n\n // then\n expect(isSuccessCommandResult(result)).toBe(true);\n if (isSuccessCommandResult(result)) {\n expect(result.data).toEqual(new Uint8Array([]));\n }\n });\n });\n});\n"],
|
|
5
|
-
"mappings": "AAEA,OACE,gBAAAA,EACA,0BAAAC,MACK,kCACP,OAAS,YAAAC,EAAU,UAAAC,EAAQ,MAAAC,MAAU,SAErC,OACE,sBAAAC,MAEK,4BAEP,MAAMC,EAAgB,WAAW,KAAK,CAAC,EAAM,EAAM,CAAI,CAAC,EAClDC,EAAoB,WAAW,KAAK,CAAC,IAAM,IAAM,IAAM,EAAI,CAAC,EAElEL,EAAS,qBAAsB,IAAM,CACnC,MAAMM,EAAW,CAACC,EAAqB,MAAmC,CACxE,QAASH,EACT,mBAAAG,CACF,GAEAP,EAAS,YAAa,IAAM,CAC1BE,EAAG,2CAA4C,IAAM,CAMnD,
|
|
6
|
-
"names": ["ApduResponse", "isSuccessCommandResult", "describe", "expect", "it", "ParseSingleCommand", "DUMMY_COMMAND", "PLACEHOLDER_BYTES", "makeArgs", "outputTrustedParam", "
|
|
4
|
+
"sourcesContent": ["/* eslint-disable @typescript-eslint/no-unsafe-member-access */\n/* eslint-disable @typescript-eslint/no-explicit-any */\nimport {\n ApduResponse,\n isSuccessCommandResult,\n} from \"@ledgerhq/device-management-kit\";\nimport { describe, expect, it } from \"vitest\";\n\nimport {\n ParseSingleCommand,\n type ParseSingleCommandArgs,\n} from \"./ParseStreamBlockCommand\";\n\nconst DUMMY_COMMAND = Uint8Array.from([0x01, 0x02, 0x03]);\nconst PLACEHOLDER_BYTES = Uint8Array.from([0xf0, 0xca, 0xcc, 0x1a]);\n\ndescribe(\"ParseSingleCommand\", () => {\n const makeArgs = (outputTrustedParam = false): ParseSingleCommandArgs => ({\n command: DUMMY_COMMAND,\n outputTrustedParam,\n });\n\n describe(\"name\", () => {\n it(\"should be 'parseSingle'\", () => {\n const cmd = new ParseSingleCommand(makeArgs());\n expect(cmd.name).toBe(\"parseSingle\");\n });\n });\n\n describe(\"getApdu()\", () => {\n it(\"builds correct APDU without trustedParam\", () => {\n // given\n const cmd = new ParseSingleCommand(makeArgs(false));\n\n // when\n const apdu = cmd.getApdu();\n const raw = apdu.getRawApdu();\n\n // then\n expect(raw).toEqual(\n Uint8Array.from([\n 0xe0,\n 0x08,\n 0x01,\n 0x00,\n DUMMY_COMMAND.length,\n ...DUMMY_COMMAND,\n ]),\n );\n });\n\n it(\"builds correct APDU with trustedParam\", () => {\n // given\n const cmd = new ParseSingleCommand(makeArgs(true));\n\n // when\n const apdu = cmd.getApdu();\n const raw = apdu.getRawApdu();\n\n // then\n expect(raw).toEqual(\n Uint8Array.from([\n 0xe0,\n 0x08,\n 0x01,\n 0x01,\n DUMMY_COMMAND.length,\n ...DUMMY_COMMAND,\n ]),\n );\n });\n });\n\n describe(\"parseResponse()\", () => {\n it(\"returns raw TLV payload on success\", () => {\n // given\n const cmd = new ParseSingleCommand(makeArgs());\n const response = new ApduResponse({\n statusCode: Uint8Array.from([0x90, 0x00]),\n data: PLACEHOLDER_BYTES,\n });\n\n // when\n const result = cmd.parseResponse(response);\n\n // then\n expect(isSuccessCommandResult(result)).toBe(true);\n if (isSuccessCommandResult(result)) {\n expect(result.data).toEqual(PLACEHOLDER_BYTES);\n }\n });\n\n it(\"maps SW errors to CommandResult error\", () => {\n // given\n const cmd = new ParseSingleCommand(makeArgs());\n const response = new ApduResponse({\n statusCode: Uint8Array.from([0x6a, 0x86]),\n data: new Uint8Array(),\n });\n\n // when\n const result = cmd.parseResponse(response);\n\n // then\n expect(isSuccessCommandResult(result)).toBe(false);\n if (!isSuccessCommandResult(result)) {\n expect((result.error as any).errorCode).toBe(\"6a86\");\n }\n });\n\n it(\"errors when no TLV data returned\", () => {\n // given\n const cmd = new ParseSingleCommand(makeArgs());\n const response = new ApduResponse({\n statusCode: Uint8Array.from([0x90, 0x00]),\n data: new Uint8Array(),\n });\n\n // when\n const result = cmd.parseResponse(response);\n\n // then\n expect(isSuccessCommandResult(result)).toBe(true);\n if (isSuccessCommandResult(result)) {\n expect(result.data).toEqual(new Uint8Array([]));\n }\n });\n });\n});\n"],
|
|
5
|
+
"mappings": "AAEA,OACE,gBAAAA,EACA,0BAAAC,MACK,kCACP,OAAS,YAAAC,EAAU,UAAAC,EAAQ,MAAAC,MAAU,SAErC,OACE,sBAAAC,MAEK,4BAEP,MAAMC,EAAgB,WAAW,KAAK,CAAC,EAAM,EAAM,CAAI,CAAC,EAClDC,EAAoB,WAAW,KAAK,CAAC,IAAM,IAAM,IAAM,EAAI,CAAC,EAElEL,EAAS,qBAAsB,IAAM,CACnC,MAAMM,EAAW,CAACC,EAAqB,MAAmC,CACxE,QAASH,EACT,mBAAAG,CACF,GAEAP,EAAS,OAAQ,IAAM,CACrBE,EAAG,0BAA2B,IAAM,CAClC,MAAMM,EAAM,IAAIL,EAAmBG,EAAS,CAAC,EAC7CL,EAAOO,EAAI,IAAI,EAAE,KAAK,aAAa,CACrC,CAAC,CACH,CAAC,EAEDR,EAAS,YAAa,IAAM,CAC1BE,EAAG,2CAA4C,IAAM,CAMnD,MAAMO,EAJM,IAAIN,EAAmBG,EAAS,EAAK,CAAC,EAGjC,QAAQ,EACR,WAAW,EAG5BL,EAAOQ,CAAG,EAAE,QACV,WAAW,KAAK,CACd,IACA,EACA,EACA,EACAL,EAAc,OACd,GAAGA,CACL,CAAC,CACH,CACF,CAAC,EAEDF,EAAG,wCAAyC,IAAM,CAMhD,MAAMO,EAJM,IAAIN,EAAmBG,EAAS,EAAI,CAAC,EAGhC,QAAQ,EACR,WAAW,EAG5BL,EAAOQ,CAAG,EAAE,QACV,WAAW,KAAK,CACd,IACA,EACA,EACA,EACAL,EAAc,OACd,GAAGA,CACL,CAAC,CACH,CACF,CAAC,CACH,CAAC,EAEDJ,EAAS,kBAAmB,IAAM,CAChCE,EAAG,qCAAsC,IAAM,CAE7C,MAAMM,EAAM,IAAIL,EAAmBG,EAAS,CAAC,EACvCI,EAAW,IAAIZ,EAAa,CAChC,WAAY,WAAW,KAAK,CAAC,IAAM,CAAI,CAAC,EACxC,KAAMO,CACR,CAAC,EAGKM,EAASH,EAAI,cAAcE,CAAQ,EAGzCT,EAAOF,EAAuBY,CAAM,CAAC,EAAE,KAAK,EAAI,EAC5CZ,EAAuBY,CAAM,GAC/BV,EAAOU,EAAO,IAAI,EAAE,QAAQN,CAAiB,CAEjD,CAAC,EAEDH,EAAG,wCAAyC,IAAM,CAEhD,MAAMM,EAAM,IAAIL,EAAmBG,EAAS,CAAC,EACvCI,EAAW,IAAIZ,EAAa,CAChC,WAAY,WAAW,KAAK,CAAC,IAAM,GAAI,CAAC,EACxC,KAAM,IAAI,UACZ,CAAC,EAGKa,EAASH,EAAI,cAAcE,CAAQ,EAGzCT,EAAOF,EAAuBY,CAAM,CAAC,EAAE,KAAK,EAAK,EAC5CZ,EAAuBY,CAAM,GAChCV,EAAQU,EAAO,MAAc,SAAS,EAAE,KAAK,MAAM,CAEvD,CAAC,EAEDT,EAAG,mCAAoC,IAAM,CAE3C,MAAMM,EAAM,IAAIL,EAAmBG,EAAS,CAAC,EACvCI,EAAW,IAAIZ,EAAa,CAChC,WAAY,WAAW,KAAK,CAAC,IAAM,CAAI,CAAC,EACxC,KAAM,IAAI,UACZ,CAAC,EAGKa,EAASH,EAAI,cAAcE,CAAQ,EAGzCT,EAAOF,EAAuBY,CAAM,CAAC,EAAE,KAAK,EAAI,EAC5CZ,EAAuBY,CAAM,GAC/BV,EAAOU,EAAO,IAAI,EAAE,QAAQ,IAAI,WAAW,CAAC,CAAC,CAAC,CAElD,CAAC,CACH,CAAC,CACH,CAAC",
|
|
6
|
+
"names": ["ApduResponse", "isSuccessCommandResult", "describe", "expect", "it", "ParseSingleCommand", "DUMMY_COMMAND", "PLACEHOLDER_BYTES", "makeArgs", "outputTrustedParam", "cmd", "raw", "response", "result"]
|
|
7
7
|
}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{ApduBuilder as
|
|
1
|
+
import{ApduBuilder as n,ApduParser as t,CommandResultFactory as a,InvalidStatusWordError as s}from"@ledgerhq/device-management-kit";import{CommandErrorHelper as m}from"@ledgerhq/signer-utils";import{Maybe as p}from"purify-ts";import{LEDGER_SYNC_ERRORS as l,LedgerKeyringProtocolErrorFactory as c}from"./utils/ledgerKeyringProtocolErrors";class P{constructor(r){this.args=r}name="parseBlockHeader";errorHelper=new m(l,c);getApdu(){const{header:r}=this.args;return new n({cla:224,ins:8,p1:0,p2:0}).addBufferToData(r).build()}parseResponse(r){return p.fromNullable(this.errorHelper.getError(r)).orDefaultLazy(()=>{const e=new t(r),d=e.getUnparsedRemainingLength(),o=e.extractFieldByLength(d);return o?a({data:o}):a({error:new s("No data returned by parseBlockHeader")})})}}export{P as ParseBlockHeaderCommand};
|
|
2
2
|
//# sourceMappingURL=ParseStreamBlockHeader.js.map
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../../src/internal/app-binder/command/ParseStreamBlockHeader.ts"],
|
|
4
|
-
"sourcesContent": ["import {\n type Apdu,\n ApduBuilder,\n ApduParser,\n type ApduResponse,\n type Command,\n type CommandResult,\n CommandResultFactory,\n InvalidStatusWordError,\n} from \"@ledgerhq/device-management-kit\";\nimport { CommandErrorHelper } from \"@ledgerhq/signer-utils\";\nimport { Maybe } from \"purify-ts\";\n\nimport {\n LEDGER_SYNC_ERRORS,\n type LedgerKeyringProtocolErrorCodes,\n LedgerKeyringProtocolErrorFactory,\n} from \"./utils/ledgerKeyringProtocolErrors\";\n\nexport type ParseBlockHeaderCommandResponse = Uint8Array;\n\nexport type ParseBlockHeaderCommandArgs = {\n header: Uint8Array;\n};\n\nexport class ParseBlockHeaderCommand\n implements\n Command<\n ParseBlockHeaderCommandResponse,\n ParseBlockHeaderCommandArgs,\n LedgerKeyringProtocolErrorCodes\n >\n{\n private readonly errorHelper = new CommandErrorHelper<\n ParseBlockHeaderCommandResponse,\n LedgerKeyringProtocolErrorCodes\n >(LEDGER_SYNC_ERRORS, LedgerKeyringProtocolErrorFactory);\n\n constructor(private readonly args: ParseBlockHeaderCommandArgs) {}\n\n getApdu(): Apdu {\n const { header } = this.args;\n return (\n new ApduBuilder({ cla: 0xe0, ins: 0x08, p1: 0x00, p2: 0x00 })\n // raw block header\n .addBufferToData(header)\n .build()\n );\n }\n\n parseResponse(\n apduResponse: ApduResponse,\n ): CommandResult<\n ParseBlockHeaderCommandResponse,\n LedgerKeyringProtocolErrorCodes\n > {\n return Maybe.fromNullable(\n this.errorHelper.getError(apduResponse),\n ).orDefaultLazy(() => {\n const parser = new ApduParser(apduResponse);\n const remaining = parser.getUnparsedRemainingLength();\n const payload = parser.extractFieldByLength(remaining);\n if (!payload) {\n return CommandResultFactory({\n error: new InvalidStatusWordError(\n \"No data returned by parseBlockHeader\",\n ),\n });\n }\n return CommandResultFactory({ data: payload });\n });\n }\n}\n"],
|
|
5
|
-
"mappings": "AAAA,OAEE,eAAAA,EACA,cAAAC,EAIA,wBAAAC,EACA,0BAAAC,MACK,kCACP,OAAS,sBAAAC,MAA0B,yBACnC,OAAS,SAAAC,MAAa,YAEtB,OACE,sBAAAC,EAEA,qCAAAC,MACK,sCAQA,MAAMC,CAOb,
|
|
4
|
+
"sourcesContent": ["import {\n type Apdu,\n ApduBuilder,\n ApduParser,\n type ApduResponse,\n type Command,\n type CommandResult,\n CommandResultFactory,\n InvalidStatusWordError,\n} from \"@ledgerhq/device-management-kit\";\nimport { CommandErrorHelper } from \"@ledgerhq/signer-utils\";\nimport { Maybe } from \"purify-ts\";\n\nimport {\n LEDGER_SYNC_ERRORS,\n type LedgerKeyringProtocolErrorCodes,\n LedgerKeyringProtocolErrorFactory,\n} from \"./utils/ledgerKeyringProtocolErrors\";\n\nexport type ParseBlockHeaderCommandResponse = Uint8Array;\n\nexport type ParseBlockHeaderCommandArgs = {\n header: Uint8Array;\n};\n\nexport class ParseBlockHeaderCommand\n implements\n Command<\n ParseBlockHeaderCommandResponse,\n ParseBlockHeaderCommandArgs,\n LedgerKeyringProtocolErrorCodes\n >\n{\n readonly name = \"parseBlockHeader\";\n private readonly errorHelper = new CommandErrorHelper<\n ParseBlockHeaderCommandResponse,\n LedgerKeyringProtocolErrorCodes\n >(LEDGER_SYNC_ERRORS, LedgerKeyringProtocolErrorFactory);\n\n constructor(private readonly args: ParseBlockHeaderCommandArgs) {}\n\n getApdu(): Apdu {\n const { header } = this.args;\n return (\n new ApduBuilder({ cla: 0xe0, ins: 0x08, p1: 0x00, p2: 0x00 })\n // raw block header\n .addBufferToData(header)\n .build()\n );\n }\n\n parseResponse(\n apduResponse: ApduResponse,\n ): CommandResult<\n ParseBlockHeaderCommandResponse,\n LedgerKeyringProtocolErrorCodes\n > {\n return Maybe.fromNullable(\n this.errorHelper.getError(apduResponse),\n ).orDefaultLazy(() => {\n const parser = new ApduParser(apduResponse);\n const remaining = parser.getUnparsedRemainingLength();\n const payload = parser.extractFieldByLength(remaining);\n if (!payload) {\n return CommandResultFactory({\n error: new InvalidStatusWordError(\n \"No data returned by parseBlockHeader\",\n ),\n });\n }\n return CommandResultFactory({ data: payload });\n });\n }\n}\n"],
|
|
5
|
+
"mappings": "AAAA,OAEE,eAAAA,EACA,cAAAC,EAIA,wBAAAC,EACA,0BAAAC,MACK,kCACP,OAAS,sBAAAC,MAA0B,yBACnC,OAAS,SAAAC,MAAa,YAEtB,OACE,sBAAAC,EAEA,qCAAAC,MACK,sCAQA,MAAMC,CAOb,CAOE,YAA6BC,EAAmC,CAAnC,UAAAA,CAAoC,CANxD,KAAO,mBACC,YAAc,IAAIL,EAGjCE,EAAoBC,CAAiC,EAIvD,SAAgB,CACd,KAAM,CAAE,OAAAG,CAAO,EAAI,KAAK,KACxB,OACE,IAAIV,EAAY,CAAE,IAAK,IAAM,IAAK,EAAM,GAAI,EAAM,GAAI,CAAK,CAAC,EAEzD,gBAAgBU,CAAM,EACtB,MAAM,CAEb,CAEA,cACEC,EAIA,CACA,OAAON,EAAM,aACX,KAAK,YAAY,SAASM,CAAY,CACxC,EAAE,cAAc,IAAM,CACpB,MAAMC,EAAS,IAAIX,EAAWU,CAAY,EACpCE,EAAYD,EAAO,2BAA2B,EAC9CE,EAAUF,EAAO,qBAAqBC,CAAS,EACrD,OAAKC,EAOEZ,EAAqB,CAAE,KAAMY,CAAQ,CAAC,EANpCZ,EAAqB,CAC1B,MAAO,IAAIC,EACT,sCACF,CACF,CAAC,CAGL,CAAC,CACH,CACF",
|
|
6
6
|
"names": ["ApduBuilder", "ApduParser", "CommandResultFactory", "InvalidStatusWordError", "CommandErrorHelper", "Maybe", "LEDGER_SYNC_ERRORS", "LedgerKeyringProtocolErrorFactory", "ParseBlockHeaderCommand", "args", "header", "apduResponse", "parser", "remaining", "payload"]
|
|
7
7
|
}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{ApduResponse as
|
|
1
|
+
import{ApduResponse as l,isSuccessCommandResult as n}from"@ledgerhq/device-management-kit";import{describe as m,expect as o,it as d}from"vitest";import{ParseBlockHeaderCommand as c}from"../../app-binder/command/ParseStreamBlockHeader";const t=Uint8Array.from([171,173,190,239]),p=Uint8Array.from([240,202,204,26]);m("ParseBlockHeaderCommand",()=>{m("name",()=>{d("should be 'parseBlockHeader'",()=>{const r={header:t},a=new c(r);o(a.name).toBe("parseBlockHeader")})}),m("getApdu()",()=>{d("should build the correct APDU for a given header",()=>{const r={header:t},s=new c(r).getApdu(),e=Uint8Array.from([224,8,0,0,t.length,...t]);o(s.getRawApdu()).toEqual(e)})}),m("parseResponse()",()=>{d("should return the raw TLV payload on success",()=>{const r={header:t},a=new c(r),s=new l({statusCode:Uint8Array.from([144,0]),data:p}),e=a.parseResponse(s);o(n(e)).toBe(!0),n(e)&&o(e.data).toEqual(p)}),d("should map SW errors to CommandResult errors",()=>{const r={header:t},a=new c(r),s=new l({statusCode:Uint8Array.from([106,134]),data:new Uint8Array}),e=a.parseResponse(s);o(n(e)).toBe(!1),n(e)||o(e.error.errorCode).toBe("6a86")}),d("should handle empty-data payload correctly",()=>{const r={header:t},a=new c(r),s=new l({statusCode:Uint8Array.from([144,0]),data:new Uint8Array([])}),e=a.parseResponse(s);o(n(e)).toBe(!0),n(e)&&o(e.data).toEqual(new Uint8Array([]))})})});
|
|
2
2
|
//# sourceMappingURL=ParseStreamBlockHeader.test.js.map
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../../src/internal/app-binder/command/ParseStreamBlockHeader.test.ts"],
|
|
4
|
-
"sourcesContent": ["/* eslint-disable @typescript-eslint/no-unsafe-member-access */\n/* eslint-disable @typescript-eslint/no-explicit-any */\nimport {\n ApduResponse,\n isSuccessCommandResult,\n} from \"@ledgerhq/device-management-kit\";\nimport { describe, expect, it } from \"vitest\";\n\nimport {\n ParseBlockHeaderCommand,\n type ParseBlockHeaderCommandArgs,\n} from \"@internal/app-binder/command/ParseStreamBlockHeader\";\n\nconst HEADER_BYTES = Uint8Array.from([0xab, 0xad, 0xbe, 0xef]);\nconst TLV_PAYLOAD = Uint8Array.from([0xf0, 0xca, 0xcc, 0x1a]);\n\ndescribe(\"ParseBlockHeaderCommand\", () => {\n describe(\"getApdu()\", () => {\n it(\"should build the correct APDU for a given header\", () => {\n // given\n const args: ParseBlockHeaderCommandArgs = { header: HEADER_BYTES };\n const cmd = new ParseBlockHeaderCommand(args);\n\n // when\n const apdu = cmd.getApdu();\n const expected = Uint8Array.from([\n 0xe0,\n 0x08,\n 0x00,\n 0x00,\n HEADER_BYTES.length,\n ...HEADER_BYTES,\n ]);\n\n // then\n expect(apdu.getRawApdu()).toEqual(expected);\n });\n });\n\n describe(\"parseResponse()\", () => {\n it(\"should return the raw TLV payload on success\", () => {\n // given\n const args: ParseBlockHeaderCommandArgs = { header: HEADER_BYTES };\n const cmd = new ParseBlockHeaderCommand(args);\n const response = new ApduResponse({\n statusCode: Uint8Array.from([0x90, 0x00]),\n data: TLV_PAYLOAD,\n });\n\n // when\n const result = cmd.parseResponse(response);\n\n // then\n expect(isSuccessCommandResult(result)).toBe(true);\n if (isSuccessCommandResult(result)) {\n expect(result.data).toEqual(TLV_PAYLOAD);\n }\n });\n\n it(\"should map SW errors to CommandResult errors\", () => {\n // given\n const args: ParseBlockHeaderCommandArgs = { header: HEADER_BYTES };\n const cmd = new ParseBlockHeaderCommand(args);\n const response = new ApduResponse({\n statusCode: Uint8Array.from([0x6a, 0x86]),\n data: new Uint8Array(),\n });\n\n // when\n const result = cmd.parseResponse(response);\n\n // then\n expect(isSuccessCommandResult(result)).toBe(false);\n if (!isSuccessCommandResult(result)) {\n expect((result.error as any).errorCode).toBe(\"6a86\");\n }\n });\n\n it(\"should handle empty-data payload correctly\", () => {\n // given\n const args: ParseBlockHeaderCommandArgs = { header: HEADER_BYTES };\n const cmd = new ParseBlockHeaderCommand(args);\n const response = new ApduResponse({\n statusCode: Uint8Array.from([0x90, 0x00]),\n data: new Uint8Array([]),\n });\n\n // when\n const result = cmd.parseResponse(response);\n\n // then\n expect(isSuccessCommandResult(result)).toBe(true);\n if (isSuccessCommandResult(result)) {\n expect(result.data).toEqual(new Uint8Array([]));\n }\n });\n });\n});\n"],
|
|
5
|
-
"mappings": "AAEA,OACE,gBAAAA,EACA,0BAAAC,MACK,kCACP,OAAS,YAAAC,EAAU,UAAAC,EAAQ,MAAAC,MAAU,SAErC,OACE,2BAAAC,MAEK,sDAEP,MAAMC,EAAe,WAAW,KAAK,CAAC,IAAM,IAAM,IAAM,GAAI,CAAC,EACvDC,EAAc,WAAW,KAAK,CAAC,IAAM,IAAM,IAAM,EAAI,CAAC,EAE5DL,EAAS,0BAA2B,IAAM,CACxCA,EAAS,YAAa,IAAM,CAC1BE,EAAG,mDAAoD,IAAM,CAE3D,MAAMI,EAAoC,CAAE,OAAQF,CAAa,
|
|
6
|
-
"names": ["ApduResponse", "isSuccessCommandResult", "describe", "expect", "it", "ParseBlockHeaderCommand", "HEADER_BYTES", "TLV_PAYLOAD", "args", "
|
|
4
|
+
"sourcesContent": ["/* eslint-disable @typescript-eslint/no-unsafe-member-access */\n/* eslint-disable @typescript-eslint/no-explicit-any */\nimport {\n ApduResponse,\n isSuccessCommandResult,\n} from \"@ledgerhq/device-management-kit\";\nimport { describe, expect, it } from \"vitest\";\n\nimport {\n ParseBlockHeaderCommand,\n type ParseBlockHeaderCommandArgs,\n} from \"@internal/app-binder/command/ParseStreamBlockHeader\";\n\nconst HEADER_BYTES = Uint8Array.from([0xab, 0xad, 0xbe, 0xef]);\nconst TLV_PAYLOAD = Uint8Array.from([0xf0, 0xca, 0xcc, 0x1a]);\n\ndescribe(\"ParseBlockHeaderCommand\", () => {\n describe(\"name\", () => {\n it(\"should be 'parseBlockHeader'\", () => {\n const args: ParseBlockHeaderCommandArgs = { header: HEADER_BYTES };\n const cmd = new ParseBlockHeaderCommand(args);\n expect(cmd.name).toBe(\"parseBlockHeader\");\n });\n });\n\n describe(\"getApdu()\", () => {\n it(\"should build the correct APDU for a given header\", () => {\n // given\n const args: ParseBlockHeaderCommandArgs = { header: HEADER_BYTES };\n const cmd = new ParseBlockHeaderCommand(args);\n\n // when\n const apdu = cmd.getApdu();\n const expected = Uint8Array.from([\n 0xe0,\n 0x08,\n 0x00,\n 0x00,\n HEADER_BYTES.length,\n ...HEADER_BYTES,\n ]);\n\n // then\n expect(apdu.getRawApdu()).toEqual(expected);\n });\n });\n\n describe(\"parseResponse()\", () => {\n it(\"should return the raw TLV payload on success\", () => {\n // given\n const args: ParseBlockHeaderCommandArgs = { header: HEADER_BYTES };\n const cmd = new ParseBlockHeaderCommand(args);\n const response = new ApduResponse({\n statusCode: Uint8Array.from([0x90, 0x00]),\n data: TLV_PAYLOAD,\n });\n\n // when\n const result = cmd.parseResponse(response);\n\n // then\n expect(isSuccessCommandResult(result)).toBe(true);\n if (isSuccessCommandResult(result)) {\n expect(result.data).toEqual(TLV_PAYLOAD);\n }\n });\n\n it(\"should map SW errors to CommandResult errors\", () => {\n // given\n const args: ParseBlockHeaderCommandArgs = { header: HEADER_BYTES };\n const cmd = new ParseBlockHeaderCommand(args);\n const response = new ApduResponse({\n statusCode: Uint8Array.from([0x6a, 0x86]),\n data: new Uint8Array(),\n });\n\n // when\n const result = cmd.parseResponse(response);\n\n // then\n expect(isSuccessCommandResult(result)).toBe(false);\n if (!isSuccessCommandResult(result)) {\n expect((result.error as any).errorCode).toBe(\"6a86\");\n }\n });\n\n it(\"should handle empty-data payload correctly\", () => {\n // given\n const args: ParseBlockHeaderCommandArgs = { header: HEADER_BYTES };\n const cmd = new ParseBlockHeaderCommand(args);\n const response = new ApduResponse({\n statusCode: Uint8Array.from([0x90, 0x00]),\n data: new Uint8Array([]),\n });\n\n // when\n const result = cmd.parseResponse(response);\n\n // then\n expect(isSuccessCommandResult(result)).toBe(true);\n if (isSuccessCommandResult(result)) {\n expect(result.data).toEqual(new Uint8Array([]));\n }\n });\n });\n});\n"],
|
|
5
|
+
"mappings": "AAEA,OACE,gBAAAA,EACA,0BAAAC,MACK,kCACP,OAAS,YAAAC,EAAU,UAAAC,EAAQ,MAAAC,MAAU,SAErC,OACE,2BAAAC,MAEK,sDAEP,MAAMC,EAAe,WAAW,KAAK,CAAC,IAAM,IAAM,IAAM,GAAI,CAAC,EACvDC,EAAc,WAAW,KAAK,CAAC,IAAM,IAAM,IAAM,EAAI,CAAC,EAE5DL,EAAS,0BAA2B,IAAM,CACxCA,EAAS,OAAQ,IAAM,CACrBE,EAAG,+BAAgC,IAAM,CACvC,MAAMI,EAAoC,CAAE,OAAQF,CAAa,EAC3DG,EAAM,IAAIJ,EAAwBG,CAAI,EAC5CL,EAAOM,EAAI,IAAI,EAAE,KAAK,kBAAkB,CAC1C,CAAC,CACH,CAAC,EAEDP,EAAS,YAAa,IAAM,CAC1BE,EAAG,mDAAoD,IAAM,CAE3D,MAAMI,EAAoC,CAAE,OAAQF,CAAa,EAI3DI,EAHM,IAAIL,EAAwBG,CAAI,EAG3B,QAAQ,EACnBG,EAAW,WAAW,KAAK,CAC/B,IACA,EACA,EACA,EACAL,EAAa,OACb,GAAGA,CACL,CAAC,EAGDH,EAAOO,EAAK,WAAW,CAAC,EAAE,QAAQC,CAAQ,CAC5C,CAAC,CACH,CAAC,EAEDT,EAAS,kBAAmB,IAAM,CAChCE,EAAG,+CAAgD,IAAM,CAEvD,MAAMI,EAAoC,CAAE,OAAQF,CAAa,EAC3DG,EAAM,IAAIJ,EAAwBG,CAAI,EACtCI,EAAW,IAAIZ,EAAa,CAChC,WAAY,WAAW,KAAK,CAAC,IAAM,CAAI,CAAC,EACxC,KAAMO,CACR,CAAC,EAGKM,EAASJ,EAAI,cAAcG,CAAQ,EAGzCT,EAAOF,EAAuBY,CAAM,CAAC,EAAE,KAAK,EAAI,EAC5CZ,EAAuBY,CAAM,GAC/BV,EAAOU,EAAO,IAAI,EAAE,QAAQN,CAAW,CAE3C,CAAC,EAEDH,EAAG,+CAAgD,IAAM,CAEvD,MAAMI,EAAoC,CAAE,OAAQF,CAAa,EAC3DG,EAAM,IAAIJ,EAAwBG,CAAI,EACtCI,EAAW,IAAIZ,EAAa,CAChC,WAAY,WAAW,KAAK,CAAC,IAAM,GAAI,CAAC,EACxC,KAAM,IAAI,UACZ,CAAC,EAGKa,EAASJ,EAAI,cAAcG,CAAQ,EAGzCT,EAAOF,EAAuBY,CAAM,CAAC,EAAE,KAAK,EAAK,EAC5CZ,EAAuBY,CAAM,GAChCV,EAAQU,EAAO,MAAc,SAAS,EAAE,KAAK,MAAM,CAEvD,CAAC,EAEDT,EAAG,6CAA8C,IAAM,CAErD,MAAMI,EAAoC,CAAE,OAAQF,CAAa,EAC3DG,EAAM,IAAIJ,EAAwBG,CAAI,EACtCI,EAAW,IAAIZ,EAAa,CAChC,WAAY,WAAW,KAAK,CAAC,IAAM,CAAI,CAAC,EACxC,KAAM,IAAI,WAAW,CAAC,CAAC,CACzB,CAAC,EAGKa,EAASJ,EAAI,cAAcG,CAAQ,EAGzCT,EAAOF,EAAuBY,CAAM,CAAC,EAAE,KAAK,EAAI,EAC5CZ,EAAuBY,CAAM,GAC/BV,EAAOU,EAAO,IAAI,EAAE,QAAQ,IAAI,WAAW,CAAC,CAAC,CAAC,CAElD,CAAC,CACH,CAAC,CACH,CAAC",
|
|
6
|
+
"names": ["ApduResponse", "isSuccessCommandResult", "describe", "expect", "it", "ParseBlockHeaderCommand", "HEADER_BYTES", "TLV_PAYLOAD", "args", "cmd", "apdu", "expected", "response", "result"]
|
|
7
7
|
}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{ApduBuilder as t,ApduParser as d,CommandResultFactory as o,InvalidStatusWordError as a}from"@ledgerhq/device-management-kit";import{CommandErrorHelper as m}from"@ledgerhq/signer-utils";import{Maybe as n}from"purify-ts";import{TPTags as s}from"../../models/Tags";import{LEDGER_SYNC_ERRORS as p,LedgerKeyringProtocolErrorFactory as u}from"./utils/ledgerKeyringProtocolErrors";class b{constructor(e){this.args=e}errorHelper=new m(p,u);getApdu(){const{iv:e,memberTlv:r}=this.args;return new t({cla:224,ins:9,p1:0,p2:0}).add8BitUIntToData(s.IV).add8BitUIntToData(e.length).addBufferToData(e).addBufferToData(r).build()}parseResponse(e){return n.fromNullable(this.errorHelper.getError(e)).orDefaultLazy(()=>new d(e).getUnparsedRemainingLength()!==0?o({error:new a("Unexpected response data for SetTrustedMemberCommand")}):o({data:void 0}))}}export{b as SetTrustedMemberCommand};
|
|
1
|
+
import{ApduBuilder as t,ApduParser as d,CommandResultFactory as o,InvalidStatusWordError as a}from"@ledgerhq/device-management-kit";import{CommandErrorHelper as m}from"@ledgerhq/signer-utils";import{Maybe as n}from"purify-ts";import{TPTags as s}from"../../models/Tags";import{LEDGER_SYNC_ERRORS as p,LedgerKeyringProtocolErrorFactory as u}from"./utils/ledgerKeyringProtocolErrors";class b{constructor(e){this.args=e}name="setTrustedMember";errorHelper=new m(p,u);getApdu(){const{iv:e,memberTlv:r}=this.args;return new t({cla:224,ins:9,p1:0,p2:0}).add8BitUIntToData(s.IV).add8BitUIntToData(e.length).addBufferToData(e).addBufferToData(r).build()}parseResponse(e){return n.fromNullable(this.errorHelper.getError(e)).orDefaultLazy(()=>new d(e).getUnparsedRemainingLength()!==0?o({error:new a("Unexpected response data for SetTrustedMemberCommand")}):o({data:void 0}))}}export{b as SetTrustedMemberCommand};
|
|
2
2
|
//# sourceMappingURL=SetTrustedMemberCommand.js.map
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../../src/internal/app-binder/command/SetTrustedMemberCommand.ts"],
|
|
4
|
-
"sourcesContent": ["import {\n type Apdu,\n ApduBuilder,\n ApduParser,\n type ApduResponse,\n type Command,\n type CommandResult,\n CommandResultFactory,\n InvalidStatusWordError,\n} from \"@ledgerhq/device-management-kit\";\nimport { CommandErrorHelper } from \"@ledgerhq/signer-utils\";\nimport { Maybe } from \"purify-ts\";\n\nimport { TPTags } from \"@internal/models/Tags\";\n\nimport {\n LEDGER_SYNC_ERRORS,\n type LedgerKeyringProtocolErrorCodes,\n LedgerKeyringProtocolErrorFactory,\n} from \"./utils/ledgerKeyringProtocolErrors\";\n\nexport type SetTrustedMemberCommandResponse = void;\n\nexport type SetTrustedMemberCommandArgs = {\n readonly iv: Uint8Array;\n readonly memberTlv: Uint8Array;\n};\n\nexport class SetTrustedMemberCommand\n implements\n Command<\n SetTrustedMemberCommandResponse,\n SetTrustedMemberCommandArgs,\n LedgerKeyringProtocolErrorCodes\n >\n{\n private readonly errorHelper = new CommandErrorHelper<\n SetTrustedMemberCommandResponse,\n LedgerKeyringProtocolErrorCodes\n >(LEDGER_SYNC_ERRORS, LedgerKeyringProtocolErrorFactory);\n\n constructor(private readonly args: SetTrustedMemberCommandArgs) {}\n\n getApdu(): Apdu {\n const { iv, memberTlv } = this.args;\n return (\n new ApduBuilder({ cla: 0xe0, ins: 0x09, p1: 0x00, p2: 0x00 })\n // tag for IV\n .add8BitUIntToData(TPTags.IV)\n // IV length\n .add8BitUIntToData(iv.length)\n // IV bytes\n .addBufferToData(iv)\n // TrustedMember bytes\n .addBufferToData(memberTlv)\n .build()\n );\n }\n\n parseResponse(\n apduResponse: ApduResponse,\n ): CommandResult<\n SetTrustedMemberCommandResponse,\n LedgerKeyringProtocolErrorCodes\n > {\n return Maybe.fromNullable(\n this.errorHelper.getError(apduResponse),\n ).orDefaultLazy(() => {\n const parser = new ApduParser(apduResponse);\n if (parser.getUnparsedRemainingLength() !== 0) {\n return CommandResultFactory({\n error: new InvalidStatusWordError(\n \"Unexpected response data for SetTrustedMemberCommand\",\n ),\n });\n }\n return CommandResultFactory({ data: undefined });\n });\n }\n}\n"],
|
|
5
|
-
"mappings": "AAAA,OAEE,eAAAA,EACA,cAAAC,EAIA,wBAAAC,EACA,0BAAAC,MACK,kCACP,OAAS,sBAAAC,MAA0B,yBACnC,OAAS,SAAAC,MAAa,YAEtB,OAAS,UAAAC,MAAc,wBAEvB,OACE,sBAAAC,EAEA,qCAAAC,MACK,sCASA,MAAMC,CAOb,
|
|
4
|
+
"sourcesContent": ["import {\n type Apdu,\n ApduBuilder,\n ApduParser,\n type ApduResponse,\n type Command,\n type CommandResult,\n CommandResultFactory,\n InvalidStatusWordError,\n} from \"@ledgerhq/device-management-kit\";\nimport { CommandErrorHelper } from \"@ledgerhq/signer-utils\";\nimport { Maybe } from \"purify-ts\";\n\nimport { TPTags } from \"@internal/models/Tags\";\n\nimport {\n LEDGER_SYNC_ERRORS,\n type LedgerKeyringProtocolErrorCodes,\n LedgerKeyringProtocolErrorFactory,\n} from \"./utils/ledgerKeyringProtocolErrors\";\n\nexport type SetTrustedMemberCommandResponse = void;\n\nexport type SetTrustedMemberCommandArgs = {\n readonly iv: Uint8Array;\n readonly memberTlv: Uint8Array;\n};\n\nexport class SetTrustedMemberCommand\n implements\n Command<\n SetTrustedMemberCommandResponse,\n SetTrustedMemberCommandArgs,\n LedgerKeyringProtocolErrorCodes\n >\n{\n readonly name = \"setTrustedMember\";\n private readonly errorHelper = new CommandErrorHelper<\n SetTrustedMemberCommandResponse,\n LedgerKeyringProtocolErrorCodes\n >(LEDGER_SYNC_ERRORS, LedgerKeyringProtocolErrorFactory);\n\n constructor(private readonly args: SetTrustedMemberCommandArgs) {}\n\n getApdu(): Apdu {\n const { iv, memberTlv } = this.args;\n return (\n new ApduBuilder({ cla: 0xe0, ins: 0x09, p1: 0x00, p2: 0x00 })\n // tag for IV\n .add8BitUIntToData(TPTags.IV)\n // IV length\n .add8BitUIntToData(iv.length)\n // IV bytes\n .addBufferToData(iv)\n // TrustedMember bytes\n .addBufferToData(memberTlv)\n .build()\n );\n }\n\n parseResponse(\n apduResponse: ApduResponse,\n ): CommandResult<\n SetTrustedMemberCommandResponse,\n LedgerKeyringProtocolErrorCodes\n > {\n return Maybe.fromNullable(\n this.errorHelper.getError(apduResponse),\n ).orDefaultLazy(() => {\n const parser = new ApduParser(apduResponse);\n if (parser.getUnparsedRemainingLength() !== 0) {\n return CommandResultFactory({\n error: new InvalidStatusWordError(\n \"Unexpected response data for SetTrustedMemberCommand\",\n ),\n });\n }\n return CommandResultFactory({ data: undefined });\n });\n }\n}\n"],
|
|
5
|
+
"mappings": "AAAA,OAEE,eAAAA,EACA,cAAAC,EAIA,wBAAAC,EACA,0BAAAC,MACK,kCACP,OAAS,sBAAAC,MAA0B,yBACnC,OAAS,SAAAC,MAAa,YAEtB,OAAS,UAAAC,MAAc,wBAEvB,OACE,sBAAAC,EAEA,qCAAAC,MACK,sCASA,MAAMC,CAOb,CAOE,YAA6BC,EAAmC,CAAnC,UAAAA,CAAoC,CANxD,KAAO,mBACC,YAAc,IAAIN,EAGjCG,EAAoBC,CAAiC,EAIvD,SAAgB,CACd,KAAM,CAAE,GAAAG,EAAI,UAAAC,CAAU,EAAI,KAAK,KAC/B,OACE,IAAIZ,EAAY,CAAE,IAAK,IAAM,IAAK,EAAM,GAAI,EAAM,GAAI,CAAK,CAAC,EAEzD,kBAAkBM,EAAO,EAAE,EAE3B,kBAAkBK,EAAG,MAAM,EAE3B,gBAAgBA,CAAE,EAElB,gBAAgBC,CAAS,EACzB,MAAM,CAEb,CAEA,cACEC,EAIA,CACA,OAAOR,EAAM,aACX,KAAK,YAAY,SAASQ,CAAY,CACxC,EAAE,cAAc,IACC,IAAIZ,EAAWY,CAAY,EAC/B,2BAA2B,IAAM,EACnCX,EAAqB,CAC1B,MAAO,IAAIC,EACT,sDACF,CACF,CAAC,EAEID,EAAqB,CAAE,KAAM,MAAU,CAAC,CAChD,CACH,CACF",
|
|
6
6
|
"names": ["ApduBuilder", "ApduParser", "CommandResultFactory", "InvalidStatusWordError", "CommandErrorHelper", "Maybe", "TPTags", "LEDGER_SYNC_ERRORS", "LedgerKeyringProtocolErrorFactory", "SetTrustedMemberCommand", "args", "iv", "memberTlv", "apduResponse"]
|
|
7
7
|
}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{ApduResponse as
|
|
1
|
+
import{ApduResponse as m,InvalidStatusWordError as u,isSuccessCommandResult as o}from"@ledgerhq/device-management-kit";import{describe as c,expect as r,it as a}from"vitest";import{SetTrustedMemberCommand as d}from"./SetTrustedMemberCommand";const x=Uint8Array.from([240,202,204,26]);c("SetTrustedMemberCommand",()=>{const n=()=>({iv:x,memberTlv:x});c("name",()=>{a("should be 'setTrustedMember'",()=>{const t=new d(n());r(t.name).toBe("setTrustedMember")})}),c("getApdu()",()=>{a("builds correct APDU",()=>{const s=new d(n()).getApdu(),e=Uint8Array.from([[224,9,0,0,10],[0,4,240,202,204,26],[240,202,204,26]].flat());r(s.getRawApdu()).toEqual(e)})}),c("parseResponse()",()=>{a("returns success when no data and SW=0x9000",()=>{const t=new d(n()),s=new m({statusCode:Uint8Array.from([144,0]),data:new Uint8Array([])}),e=t.parseResponse(s);r(o(e)).toBe(!0),o(e)&&r(e.data).toEqual(void 0)}),a("returns error on unexpected trailing data",()=>{const t=new d(n()),s=new m({statusCode:Uint8Array.from([144,0]),data:Uint8Array.from([1,2])}),e=t.parseResponse(s);r(o(e)).toBe(!1),o(e)||(r(e.error).toBeInstanceOf(u),r(e.error.originalError?.message).toMatch("Unexpected response data"))}),a("maps SW errors to CommandResult error",()=>{const t=new d(n()),s=new m({statusCode:Uint8Array.from([106,134]),data:new Uint8Array([])}),e=t.parseResponse(s);if(r(o(e)).toBe(!1),!o(e))if("errorCode"in e.error)r(e.error.errorCode).toEqual("6a86");else throw new Error("Unexpected error type: errorCode property is missing")})})});
|
|
2
2
|
//# sourceMappingURL=SetTrustedMemberCommand.test.js.map
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../../src/internal/app-binder/command/SetTrustedMemberCommand.test.ts"],
|
|
4
|
-
"sourcesContent": ["import {\n ApduResponse,\n InvalidStatusWordError,\n isSuccessCommandResult,\n} from \"@ledgerhq/device-management-kit\";\nimport { describe, expect, it } from \"vitest\";\n\nimport {\n SetTrustedMemberCommand,\n type SetTrustedMemberCommandArgs,\n} from \"./SetTrustedMemberCommand\";\n\nconst PLACEHOLDER_BYTES = Uint8Array.from([0xf0, 0xca, 0xcc, 0x1a]);\n\ndescribe(\"SetTrustedMemberCommand\", () => {\n const makeArgs = (): SetTrustedMemberCommandArgs => ({\n iv: PLACEHOLDER_BYTES,\n memberTlv: PLACEHOLDER_BYTES,\n });\n\n describe(\"getApdu()\", () => {\n it(\"builds correct APDU\", () => {\n // given\n const cmd = new SetTrustedMemberCommand(makeArgs());\n\n // when\n const apdu = cmd.getApdu();\n const expected = Uint8Array.from(\n [\n [0xe0, 0x09, 0x00, 0x00, 0x0a], // CLA, INS, P1, P2, Lc\n [0x00, 0x04, 0xf0, 0xca, 0xcc, 0x1a], // IV\n [0xf0, 0xca, 0xcc, 0x1a], // Member\n ].flat(),\n );\n\n // then\n expect(apdu.getRawApdu()).toEqual(expected);\n });\n });\n\n describe(\"parseResponse()\", () => {\n it(\"returns success when no data and SW=0x9000\", () => {\n // given\n const cmd = new SetTrustedMemberCommand(makeArgs());\n const response = new ApduResponse({\n statusCode: Uint8Array.from([0x90, 0x00]),\n data: new Uint8Array([]),\n });\n\n // when\n const result = cmd.parseResponse(response);\n\n // then\n expect(isSuccessCommandResult(result)).toBe(true);\n if (isSuccessCommandResult(result)) {\n expect(result.data).toEqual(undefined);\n }\n });\n\n it(\"returns error on unexpected trailing data\", () => {\n // given\n const cmd = new SetTrustedMemberCommand(makeArgs());\n const response = new ApduResponse({\n statusCode: Uint8Array.from([0x90, 0x00]),\n data: Uint8Array.from([0x01, 0x02]),\n });\n\n // when\n const result = cmd.parseResponse(response);\n\n // then\n expect(isSuccessCommandResult(result)).toBe(false);\n if (!isSuccessCommandResult(result)) {\n expect(result.error).toBeInstanceOf(InvalidStatusWordError);\n expect((result.error.originalError as Error)?.message).toMatch(\n \"Unexpected response data\",\n );\n }\n });\n\n it(\"maps SW errors to CommandResult error\", () => {\n // given\n const cmd = new SetTrustedMemberCommand(makeArgs());\n const response = new ApduResponse({\n statusCode: Uint8Array.from([0x6a, 0x86]),\n data: new Uint8Array([]),\n });\n\n // when\n const result = cmd.parseResponse(response);\n\n // then\n expect(isSuccessCommandResult(result)).toBe(false);\n if (!isSuccessCommandResult(result)) {\n if (\"errorCode\" in result.error) {\n expect(result.error.errorCode).toEqual(\"6a86\");\n } else {\n throw new Error(\n \"Unexpected error type: errorCode property is missing\",\n );\n }\n }\n });\n });\n});\n"],
|
|
5
|
-
"mappings": "AAAA,OACE,gBAAAA,EACA,0BAAAC,EACA,0BAAAC,MACK,kCACP,OAAS,YAAAC,EAAU,UAAAC,EAAQ,MAAAC,MAAU,SAErC,OACE,2BAAAC,MAEK,4BAEP,MAAMC,EAAoB,WAAW,KAAK,CAAC,IAAM,IAAM,IAAM,EAAI,CAAC,EAElEJ,EAAS,0BAA2B,IAAM,CACxC,MAAMK,EAAW,KAAoC,CACnD,GAAID,EACJ,UAAWA,CACb,GAEAJ,EAAS,YAAa,IAAM,CAC1BE,EAAG,sBAAuB,IAAM,CAK9B,
|
|
6
|
-
"names": ["ApduResponse", "InvalidStatusWordError", "isSuccessCommandResult", "describe", "expect", "it", "SetTrustedMemberCommand", "PLACEHOLDER_BYTES", "makeArgs", "
|
|
4
|
+
"sourcesContent": ["import {\n ApduResponse,\n InvalidStatusWordError,\n isSuccessCommandResult,\n} from \"@ledgerhq/device-management-kit\";\nimport { describe, expect, it } from \"vitest\";\n\nimport {\n SetTrustedMemberCommand,\n type SetTrustedMemberCommandArgs,\n} from \"./SetTrustedMemberCommand\";\n\nconst PLACEHOLDER_BYTES = Uint8Array.from([0xf0, 0xca, 0xcc, 0x1a]);\n\ndescribe(\"SetTrustedMemberCommand\", () => {\n const makeArgs = (): SetTrustedMemberCommandArgs => ({\n iv: PLACEHOLDER_BYTES,\n memberTlv: PLACEHOLDER_BYTES,\n });\n\n describe(\"name\", () => {\n it(\"should be 'setTrustedMember'\", () => {\n const cmd = new SetTrustedMemberCommand(makeArgs());\n expect(cmd.name).toBe(\"setTrustedMember\");\n });\n });\n\n describe(\"getApdu()\", () => {\n it(\"builds correct APDU\", () => {\n // given\n const cmd = new SetTrustedMemberCommand(makeArgs());\n\n // when\n const apdu = cmd.getApdu();\n const expected = Uint8Array.from(\n [\n [0xe0, 0x09, 0x00, 0x00, 0x0a], // CLA, INS, P1, P2, Lc\n [0x00, 0x04, 0xf0, 0xca, 0xcc, 0x1a], // IV\n [0xf0, 0xca, 0xcc, 0x1a], // Member\n ].flat(),\n );\n\n // then\n expect(apdu.getRawApdu()).toEqual(expected);\n });\n });\n\n describe(\"parseResponse()\", () => {\n it(\"returns success when no data and SW=0x9000\", () => {\n // given\n const cmd = new SetTrustedMemberCommand(makeArgs());\n const response = new ApduResponse({\n statusCode: Uint8Array.from([0x90, 0x00]),\n data: new Uint8Array([]),\n });\n\n // when\n const result = cmd.parseResponse(response);\n\n // then\n expect(isSuccessCommandResult(result)).toBe(true);\n if (isSuccessCommandResult(result)) {\n expect(result.data).toEqual(undefined);\n }\n });\n\n it(\"returns error on unexpected trailing data\", () => {\n // given\n const cmd = new SetTrustedMemberCommand(makeArgs());\n const response = new ApduResponse({\n statusCode: Uint8Array.from([0x90, 0x00]),\n data: Uint8Array.from([0x01, 0x02]),\n });\n\n // when\n const result = cmd.parseResponse(response);\n\n // then\n expect(isSuccessCommandResult(result)).toBe(false);\n if (!isSuccessCommandResult(result)) {\n expect(result.error).toBeInstanceOf(InvalidStatusWordError);\n expect((result.error.originalError as Error)?.message).toMatch(\n \"Unexpected response data\",\n );\n }\n });\n\n it(\"maps SW errors to CommandResult error\", () => {\n // given\n const cmd = new SetTrustedMemberCommand(makeArgs());\n const response = new ApduResponse({\n statusCode: Uint8Array.from([0x6a, 0x86]),\n data: new Uint8Array([]),\n });\n\n // when\n const result = cmd.parseResponse(response);\n\n // then\n expect(isSuccessCommandResult(result)).toBe(false);\n if (!isSuccessCommandResult(result)) {\n if (\"errorCode\" in result.error) {\n expect(result.error.errorCode).toEqual(\"6a86\");\n } else {\n throw new Error(\n \"Unexpected error type: errorCode property is missing\",\n );\n }\n }\n });\n });\n});\n"],
|
|
5
|
+
"mappings": "AAAA,OACE,gBAAAA,EACA,0BAAAC,EACA,0BAAAC,MACK,kCACP,OAAS,YAAAC,EAAU,UAAAC,EAAQ,MAAAC,MAAU,SAErC,OACE,2BAAAC,MAEK,4BAEP,MAAMC,EAAoB,WAAW,KAAK,CAAC,IAAM,IAAM,IAAM,EAAI,CAAC,EAElEJ,EAAS,0BAA2B,IAAM,CACxC,MAAMK,EAAW,KAAoC,CACnD,GAAID,EACJ,UAAWA,CACb,GAEAJ,EAAS,OAAQ,IAAM,CACrBE,EAAG,+BAAgC,IAAM,CACvC,MAAMI,EAAM,IAAIH,EAAwBE,EAAS,CAAC,EAClDJ,EAAOK,EAAI,IAAI,EAAE,KAAK,kBAAkB,CAC1C,CAAC,CACH,CAAC,EAEDN,EAAS,YAAa,IAAM,CAC1BE,EAAG,sBAAuB,IAAM,CAK9B,MAAMK,EAHM,IAAIJ,EAAwBE,EAAS,CAAC,EAGjC,QAAQ,EACnBG,EAAW,WAAW,KAC1B,CACE,CAAC,IAAM,EAAM,EAAM,EAAM,EAAI,EAC7B,CAAC,EAAM,EAAM,IAAM,IAAM,IAAM,EAAI,EACnC,CAAC,IAAM,IAAM,IAAM,EAAI,CACzB,EAAE,KAAK,CACT,EAGAP,EAAOM,EAAK,WAAW,CAAC,EAAE,QAAQC,CAAQ,CAC5C,CAAC,CACH,CAAC,EAEDR,EAAS,kBAAmB,IAAM,CAChCE,EAAG,6CAA8C,IAAM,CAErD,MAAMI,EAAM,IAAIH,EAAwBE,EAAS,CAAC,EAC5CI,EAAW,IAAIZ,EAAa,CAChC,WAAY,WAAW,KAAK,CAAC,IAAM,CAAI,CAAC,EACxC,KAAM,IAAI,WAAW,CAAC,CAAC,CACzB,CAAC,EAGKa,EAASJ,EAAI,cAAcG,CAAQ,EAGzCR,EAAOF,EAAuBW,CAAM,CAAC,EAAE,KAAK,EAAI,EAC5CX,EAAuBW,CAAM,GAC/BT,EAAOS,EAAO,IAAI,EAAE,QAAQ,MAAS,CAEzC,CAAC,EAEDR,EAAG,4CAA6C,IAAM,CAEpD,MAAMI,EAAM,IAAIH,EAAwBE,EAAS,CAAC,EAC5CI,EAAW,IAAIZ,EAAa,CAChC,WAAY,WAAW,KAAK,CAAC,IAAM,CAAI,CAAC,EACxC,KAAM,WAAW,KAAK,CAAC,EAAM,CAAI,CAAC,CACpC,CAAC,EAGKa,EAASJ,EAAI,cAAcG,CAAQ,EAGzCR,EAAOF,EAAuBW,CAAM,CAAC,EAAE,KAAK,EAAK,EAC5CX,EAAuBW,CAAM,IAChCT,EAAOS,EAAO,KAAK,EAAE,eAAeZ,CAAsB,EAC1DG,EAAQS,EAAO,MAAM,eAAyB,OAAO,EAAE,QACrD,0BACF,EAEJ,CAAC,EAEDR,EAAG,wCAAyC,IAAM,CAEhD,MAAMI,EAAM,IAAIH,EAAwBE,EAAS,CAAC,EAC5CI,EAAW,IAAIZ,EAAa,CAChC,WAAY,WAAW,KAAK,CAAC,IAAM,GAAI,CAAC,EACxC,KAAM,IAAI,WAAW,CAAC,CAAC,CACzB,CAAC,EAGKa,EAASJ,EAAI,cAAcG,CAAQ,EAIzC,GADAR,EAAOF,EAAuBW,CAAM,CAAC,EAAE,KAAK,EAAK,EAC7C,CAACX,EAAuBW,CAAM,EAChC,GAAI,cAAeA,EAAO,MACxBT,EAAOS,EAAO,MAAM,SAAS,EAAE,QAAQ,MAAM,MAE7C,OAAM,IAAI,MACR,sDACF,CAGN,CAAC,CACH,CAAC,CACH,CAAC",
|
|
6
|
+
"names": ["ApduResponse", "InvalidStatusWordError", "isSuccessCommandResult", "describe", "expect", "it", "SetTrustedMemberCommand", "PLACEHOLDER_BYTES", "makeArgs", "cmd", "apdu", "expected", "response", "result"]
|
|
7
7
|
}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{ApduBuilder as m,ApduParser as s,CommandResultFactory as t,InvalidStatusWordError as i}from"@ledgerhq/device-management-kit";import{CommandErrorHelper as p}from"@ledgerhq/signer-utils";import{Maybe as l}from"purify-ts";import{GeneralTags as o}from"../../models/Tags";import{LEDGER_SYNC_ERRORS as g,LedgerKeyringProtocolErrorFactory as c}from"./utils/ledgerKeyringProtocolErrors";const d=[3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],
|
|
1
|
+
import{ApduBuilder as m,ApduParser as s,CommandResultFactory as t,InvalidStatusWordError as i}from"@ledgerhq/device-management-kit";import{CommandErrorHelper as p}from"@ledgerhq/signer-utils";import{Maybe as l}from"purify-ts";import{GeneralTags as o}from"../../models/Tags";import{LEDGER_SYNC_ERRORS as g,LedgerKeyringProtocolErrorFactory as c}from"./utils/ledgerKeyringProtocolErrors";const d=[3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],y=Uint8Array.from([o.PublicKey,d.length,...d]);class B{constructor(r){this.args=r}name="signBlockHeader";errorHelper=new p(g,c);getApdu(){const{parent:r,commandCount:e}=this.args,n=Uint8Array.from([o.Hash,r.length,...r]);return new m({cla:224,ins:7,p1:0,p2:0}).addBufferToData(Uint8Array.from([o.Int,1,1])).addBufferToData(Uint8Array.from(n)).addBufferToData(y).addBufferToData(Uint8Array.from([o.Int,1,e])).build()}parseResponse(r){return l.fromNullable(this.errorHelper.getError(r)).orDefaultLazy(()=>{const e=new s(r),n=e.getUnparsedRemainingLength(),a=e.extractFieldByLength(n);return a?t({data:a}):t({error:new i("No data returned by SignBlockHeaderCommand")})})}}export{y as ISSUER_PLACEHOLDER_TLV,B as SignBlockHeaderCommand};
|
|
2
2
|
//# sourceMappingURL=SignBlockHeader.js.map
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../../src/internal/app-binder/command/SignBlockHeader.ts"],
|
|
4
|
-
"sourcesContent": ["import {\n type Apdu,\n ApduBuilder,\n ApduParser,\n type ApduResponse,\n type Command,\n type CommandResult,\n CommandResultFactory,\n InvalidStatusWordError,\n} from \"@ledgerhq/device-management-kit\";\nimport { CommandErrorHelper } from \"@ledgerhq/signer-utils\";\nimport { Maybe } from \"purify-ts\";\n\nimport { GeneralTags } from \"@internal/models/Tags\";\n\nimport {\n LEDGER_SYNC_ERRORS,\n type LedgerKeyringProtocolErrorCodes,\n LedgerKeyringProtocolErrorFactory,\n} from \"./utils/ledgerKeyringProtocolErrors\";\n\nexport interface SignBlockHeaderCommandArgs {\n parent: Uint8Array;\n commandCount: number;\n}\n\nexport type SignBlockHeaderCommandResponse = Uint8Array;\n\nconst ISSUER_PLACEHOLDER = [\n 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n 0, 0, 0, 0, 0, 0, 0,\n];\nexport const ISSUER_PLACEHOLDER_TLV = Uint8Array.from([\n GeneralTags.PublicKey,\n ISSUER_PLACEHOLDER.length,\n ...ISSUER_PLACEHOLDER,\n]);\n\nexport class SignBlockHeaderCommand\n implements\n Command<\n SignBlockHeaderCommandResponse,\n SignBlockHeaderCommandArgs,\n LedgerKeyringProtocolErrorCodes\n >\n{\n private readonly errorHelper = new CommandErrorHelper<\n SignBlockHeaderCommandResponse,\n LedgerKeyringProtocolErrorCodes\n >(LEDGER_SYNC_ERRORS, LedgerKeyringProtocolErrorFactory);\n\n constructor(private readonly args: SignBlockHeaderCommandArgs) {}\n\n getApdu(): Apdu {\n const { parent, commandCount } = this.args;\n const parentTlv = Uint8Array.from([\n GeneralTags.Hash,\n parent.length,\n ...parent,\n ]);\n\n return new ApduBuilder({\n cla: 0xe0,\n ins: 0x07,\n p1: 0x00,\n p2: 0x00,\n })\n .addBufferToData(Uint8Array.from([GeneralTags.Int, 1, 1])) // Version 1\n .addBufferToData(Uint8Array.from(parentTlv)) // Parent block hash\n .addBufferToData(ISSUER_PLACEHOLDER_TLV) // Placeholder for issuer public key (will be replaced by the device)\n .addBufferToData(Uint8Array.from([GeneralTags.Int, 1, commandCount])) // Command count\n .build();\n }\n\n parseResponse(\n apduResponse: ApduResponse,\n ): CommandResult<\n SignBlockHeaderCommandResponse,\n LedgerKeyringProtocolErrorCodes\n > {\n return Maybe.fromNullable(\n this.errorHelper.getError(apduResponse),\n ).orDefaultLazy(() => {\n const parser = new ApduParser(apduResponse);\n const remaining = parser.getUnparsedRemainingLength();\n const payload = parser.extractFieldByLength(remaining);\n if (!payload) {\n return CommandResultFactory({\n error: new InvalidStatusWordError(\n \"No data returned by SignBlockHeaderCommand\",\n ),\n });\n }\n return CommandResultFactory({ data: payload });\n });\n }\n}\n"],
|
|
5
|
-
"mappings": "AAAA,OAEE,eAAAA,EACA,cAAAC,EAIA,wBAAAC,EACA,0BAAAC,MACK,kCACP,OAAS,sBAAAC,MAA0B,yBACnC,OAAS,SAAAC,MAAa,YAEtB,OAAS,eAAAC,MAAmB,wBAE5B,OACE,sBAAAC,EAEA,qCAAAC,MACK,sCASP,MAAMC,EAAqB,CACzB,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAC3E,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,CACpB,EACaC,EAAyB,WAAW,KAAK,CACpDJ,EAAY,UACZG,EAAmB,OACnB,GAAGA,CACL,CAAC,EAEM,MAAME,CAOb,
|
|
4
|
+
"sourcesContent": ["import {\n type Apdu,\n ApduBuilder,\n ApduParser,\n type ApduResponse,\n type Command,\n type CommandResult,\n CommandResultFactory,\n InvalidStatusWordError,\n} from \"@ledgerhq/device-management-kit\";\nimport { CommandErrorHelper } from \"@ledgerhq/signer-utils\";\nimport { Maybe } from \"purify-ts\";\n\nimport { GeneralTags } from \"@internal/models/Tags\";\n\nimport {\n LEDGER_SYNC_ERRORS,\n type LedgerKeyringProtocolErrorCodes,\n LedgerKeyringProtocolErrorFactory,\n} from \"./utils/ledgerKeyringProtocolErrors\";\n\nexport interface SignBlockHeaderCommandArgs {\n parent: Uint8Array;\n commandCount: number;\n}\n\nexport type SignBlockHeaderCommandResponse = Uint8Array;\n\nconst ISSUER_PLACEHOLDER = [\n 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n 0, 0, 0, 0, 0, 0, 0,\n];\nexport const ISSUER_PLACEHOLDER_TLV = Uint8Array.from([\n GeneralTags.PublicKey,\n ISSUER_PLACEHOLDER.length,\n ...ISSUER_PLACEHOLDER,\n]);\n\nexport class SignBlockHeaderCommand\n implements\n Command<\n SignBlockHeaderCommandResponse,\n SignBlockHeaderCommandArgs,\n LedgerKeyringProtocolErrorCodes\n >\n{\n readonly name = \"signBlockHeader\";\n private readonly errorHelper = new CommandErrorHelper<\n SignBlockHeaderCommandResponse,\n LedgerKeyringProtocolErrorCodes\n >(LEDGER_SYNC_ERRORS, LedgerKeyringProtocolErrorFactory);\n\n constructor(private readonly args: SignBlockHeaderCommandArgs) {}\n\n getApdu(): Apdu {\n const { parent, commandCount } = this.args;\n const parentTlv = Uint8Array.from([\n GeneralTags.Hash,\n parent.length,\n ...parent,\n ]);\n\n return new ApduBuilder({\n cla: 0xe0,\n ins: 0x07,\n p1: 0x00,\n p2: 0x00,\n })\n .addBufferToData(Uint8Array.from([GeneralTags.Int, 1, 1])) // Version 1\n .addBufferToData(Uint8Array.from(parentTlv)) // Parent block hash\n .addBufferToData(ISSUER_PLACEHOLDER_TLV) // Placeholder for issuer public key (will be replaced by the device)\n .addBufferToData(Uint8Array.from([GeneralTags.Int, 1, commandCount])) // Command count\n .build();\n }\n\n parseResponse(\n apduResponse: ApduResponse,\n ): CommandResult<\n SignBlockHeaderCommandResponse,\n LedgerKeyringProtocolErrorCodes\n > {\n return Maybe.fromNullable(\n this.errorHelper.getError(apduResponse),\n ).orDefaultLazy(() => {\n const parser = new ApduParser(apduResponse);\n const remaining = parser.getUnparsedRemainingLength();\n const payload = parser.extractFieldByLength(remaining);\n if (!payload) {\n return CommandResultFactory({\n error: new InvalidStatusWordError(\n \"No data returned by SignBlockHeaderCommand\",\n ),\n });\n }\n return CommandResultFactory({ data: payload });\n });\n }\n}\n"],
|
|
5
|
+
"mappings": "AAAA,OAEE,eAAAA,EACA,cAAAC,EAIA,wBAAAC,EACA,0BAAAC,MACK,kCACP,OAAS,sBAAAC,MAA0B,yBACnC,OAAS,SAAAC,MAAa,YAEtB,OAAS,eAAAC,MAAmB,wBAE5B,OACE,sBAAAC,EAEA,qCAAAC,MACK,sCASP,MAAMC,EAAqB,CACzB,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAC3E,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,CACpB,EACaC,EAAyB,WAAW,KAAK,CACpDJ,EAAY,UACZG,EAAmB,OACnB,GAAGA,CACL,CAAC,EAEM,MAAME,CAOb,CAOE,YAA6BC,EAAkC,CAAlC,UAAAA,CAAmC,CANvD,KAAO,kBACC,YAAc,IAAIR,EAGjCG,EAAoBC,CAAiC,EAIvD,SAAgB,CACd,KAAM,CAAE,OAAAK,EAAQ,aAAAC,CAAa,EAAI,KAAK,KAChCC,EAAY,WAAW,KAAK,CAChCT,EAAY,KACZO,EAAO,OACP,GAAGA,CACL,CAAC,EAED,OAAO,IAAIb,EAAY,CACrB,IAAK,IACL,IAAK,EACL,GAAI,EACJ,GAAI,CACN,CAAC,EACE,gBAAgB,WAAW,KAAK,CAACM,EAAY,IAAK,EAAG,CAAC,CAAC,CAAC,EACxD,gBAAgB,WAAW,KAAKS,CAAS,CAAC,EAC1C,gBAAgBL,CAAsB,EACtC,gBAAgB,WAAW,KAAK,CAACJ,EAAY,IAAK,EAAGQ,CAAY,CAAC,CAAC,EACnE,MAAM,CACX,CAEA,cACEE,EAIA,CACA,OAAOX,EAAM,aACX,KAAK,YAAY,SAASW,CAAY,CACxC,EAAE,cAAc,IAAM,CACpB,MAAMC,EAAS,IAAIhB,EAAWe,CAAY,EACpCE,EAAYD,EAAO,2BAA2B,EAC9CE,EAAUF,EAAO,qBAAqBC,CAAS,EACrD,OAAKC,EAOEjB,EAAqB,CAAE,KAAMiB,CAAQ,CAAC,EANpCjB,EAAqB,CAC1B,MAAO,IAAIC,EACT,4CACF,CACF,CAAC,CAGL,CAAC,CACH,CACF",
|
|
6
6
|
"names": ["ApduBuilder", "ApduParser", "CommandResultFactory", "InvalidStatusWordError", "CommandErrorHelper", "Maybe", "GeneralTags", "LEDGER_SYNC_ERRORS", "LedgerKeyringProtocolErrorFactory", "ISSUER_PLACEHOLDER", "ISSUER_PLACEHOLDER_TLV", "SignBlockHeaderCommand", "args", "parent", "commandCount", "parentTlv", "apduResponse", "parser", "remaining", "payload"]
|
|
7
7
|
}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{ApduResponse as
|
|
1
|
+
import{ApduResponse as u,isSuccessCommandResult as t}from"@ledgerhq/device-management-kit";import{describe as i,expect as r,it as d}from"vitest";import{GeneralTags as l}from"../../models/Tags";import{ISSUER_PLACEHOLDER_TLV as x,SignBlockHeaderCommand as m}from"./SignBlockHeader";const s=3,c=Uint8Array.from([240,202,204,26]),A=Uint8Array.from([l.Int,1,1,l.Hash,4,...c,...x,l.Int,1,s]),p=Uint8Array.from([240,202,204,26]),f=Uint8Array.from([0,p.length,...p]),B=Uint8Array.from([129,p.length,...p]),g=new Uint8Array([...f,...B]);i("SignBlockHeaderCommand",()=>{i("name",()=>{d("should be 'signBlockHeader'",()=>{const n={parent:c,commandCount:s},o=new m(n);r(o.name).toBe("signBlockHeader")})}),i("getApdu()",()=>{d("should build the correct APDU for a parent hash and a commands count",()=>{const n={parent:c,commandCount:s},a=new m(n).getApdu(),e=Uint8Array.from([224,7,0,0,A.length,...A]);r(a.getRawApdu()).toEqual(e)})}),i("parseResponse()",()=>{d("should return raw payload on success",()=>{const n={parent:c,commandCount:s},o=new m(n),a=new u({statusCode:Uint8Array.from([144,0]),data:g}),e=o.parseResponse(a);if(r(t(e)).toBe(!0),t(e)){const C=e.data;r(C).toEqual(g)}}),d("should map SW errors to CommandResult errors",()=>{const n={parent:c,commandCount:s},o=new m(n),a=new u({statusCode:Uint8Array.from([106,134]),data:new Uint8Array}),e=o.parseResponse(a);r(t(e)).toBe(!1),t(e)||r(e.error.errorCode).toBe("6a86")}),d("should error if no data is returned",()=>{const n={parent:c,commandCount:s},o=new m(n),a=new u({statusCode:Uint8Array.from([144,0]),data:new Uint8Array}),e=o.parseResponse(a);r(t(e)).toBe(!0),t(e)&&r(e.data).toEqual(new Uint8Array([]))})})});
|
|
2
2
|
//# sourceMappingURL=SignBlockHeader.test.js.map
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../../src/internal/app-binder/command/SignBlockHeader.test.ts"],
|
|
4
|
-
"sourcesContent": ["/* eslint-disable @typescript-eslint/no-unsafe-member-access */\n/* eslint-disable @typescript-eslint/no-explicit-any */\nimport {\n ApduResponse,\n isSuccessCommandResult,\n} from \"@ledgerhq/device-management-kit\";\nimport { describe, expect, it } from \"vitest\";\n\nimport { GeneralTags } from \"@internal/models/Tags\";\n\nimport {\n ISSUER_PLACEHOLDER_TLV,\n SignBlockHeaderCommand,\n type SignBlockHeaderCommandArgs,\n type SignBlockHeaderCommandResponse,\n} from \"./SignBlockHeader\";\n\nconst COMMAND_COUNT = 3;\nconst PARENT_BYTES = Uint8Array.from([0xf0, 0xca, 0xcc, 0x1a]);\nconst HEADER_BYTES = Uint8Array.from([\n ...[GeneralTags.Int, 1, 1], // version 1\n ...[GeneralTags.Hash, 4, ...PARENT_BYTES], // Parent hash\n ...ISSUER_PLACEHOLDER_TLV,\n ...[GeneralTags.Int, 1, COMMAND_COUNT], // command count\n]);\nconst TLV_VALUE = Uint8Array.from([0xf0, 0xca, 0xcc, 0x1a]);\nconst IV_TLV = Uint8Array.from([0x00, TLV_VALUE.length, ...TLV_VALUE]);\nconst ISSUER_TLV = Uint8Array.from([0x81, TLV_VALUE.length, ...TLV_VALUE]);\nconst FULL_TLV_PAYLOAD = new Uint8Array([...IV_TLV, ...ISSUER_TLV]);\n\ndescribe(\"SignBlockHeaderCommand\", () => {\n describe(\"getApdu()\", () => {\n it(\"should build the correct APDU for a parent hash and a commands count\", () => {\n // given\n const args: SignBlockHeaderCommandArgs = {\n parent: PARENT_BYTES,\n commandCount: COMMAND_COUNT,\n };\n const cmd = new SignBlockHeaderCommand(args);\n\n // when\n const apdu = cmd.getApdu();\n const expected = Uint8Array.from([\n 0xe0,\n 0x07,\n 0x00,\n 0x00,\n HEADER_BYTES.length,\n ...HEADER_BYTES,\n ]);\n\n // then\n expect(apdu.getRawApdu()).toEqual(expected);\n });\n });\n\n describe(\"parseResponse()\", () => {\n it(\"should return raw payload on success\", () => {\n // given\n const args: SignBlockHeaderCommandArgs = {\n parent: PARENT_BYTES,\n commandCount: COMMAND_COUNT,\n };\n const cmd = new SignBlockHeaderCommand(args);\n const response = new ApduResponse({\n statusCode: Uint8Array.from([0x90, 0x00]),\n data: FULL_TLV_PAYLOAD,\n });\n\n // when\n const result = cmd.parseResponse(response);\n\n // then\n expect(isSuccessCommandResult(result)).toBe(true);\n if (isSuccessCommandResult(result)) {\n const res: SignBlockHeaderCommandResponse = result.data;\n expect(res).toEqual(FULL_TLV_PAYLOAD);\n }\n });\n\n it(\"should map SW errors to CommandResult errors\", () => {\n // given\n const args: SignBlockHeaderCommandArgs = {\n parent: PARENT_BYTES,\n commandCount: COMMAND_COUNT,\n };\n const cmd = new SignBlockHeaderCommand(args);\n const response = new ApduResponse({\n statusCode: Uint8Array.from([0x6a, 0x86]),\n data: new Uint8Array(),\n });\n\n // when\n const result = cmd.parseResponse(response);\n\n // then\n expect(isSuccessCommandResult(result)).toBe(false);\n if (!isSuccessCommandResult(result)) {\n expect((result.error as any).errorCode).toBe(\"6a86\");\n }\n });\n\n it(\"should error if no data is returned\", () => {\n // given\n const args: SignBlockHeaderCommandArgs = {\n parent: PARENT_BYTES,\n commandCount: COMMAND_COUNT,\n };\n const cmd = new SignBlockHeaderCommand(args);\n const response = new ApduResponse({\n statusCode: Uint8Array.from([0x90, 0x00]),\n data: new Uint8Array(),\n });\n\n // when\n const result = cmd.parseResponse(response);\n\n // then\n expect(isSuccessCommandResult(result)).toBe(true);\n if (isSuccessCommandResult(result)) {\n expect(result.data).toEqual(new Uint8Array([]));\n }\n });\n });\n});\n"],
|
|
5
|
-
"mappings": "AAEA,OACE,gBAAAA,EACA,0BAAAC,MACK,kCACP,OAAS,YAAAC,EAAU,UAAAC,EAAQ,MAAAC,MAAU,SAErC,OAAS,eAAAC,MAAmB,wBAE5B,OACE,0BAAAC,EACA,0BAAAC,MAGK,oBAEP,MAAMC,EAAgB,EAChBC,EAAe,WAAW,KAAK,CAAC,IAAM,IAAM,IAAM,EAAI,CAAC,EACvDC,EAAe,WAAW,KAAK,CAC/BL,EAAY,IAAK,EAAG,EACpBA,EAAY,KAAM,EAAG,GAAGI,EAC5B,GAAGH,EACCD,EAAY,IAAK,EAAGG,CAC1B,CAAC,EACKG,EAAY,WAAW,KAAK,CAAC,IAAM,IAAM,IAAM,EAAI,CAAC,EACpDC,EAAS,WAAW,KAAK,CAAC,EAAMD,EAAU,OAAQ,GAAGA,CAAS,CAAC,EAC/DE,EAAa,WAAW,KAAK,CAAC,IAAMF,EAAU,OAAQ,GAAGA,CAAS,CAAC,EACnEG,EAAmB,IAAI,WAAW,CAAC,GAAGF,EAAQ,GAAGC,CAAU,CAAC,EAElEX,EAAS,yBAA0B,IAAM,CACvCA,EAAS,YAAa,IAAM,CAC1BE,EAAG,uEAAwE,IAAM,CAE/E,MAAMW,EAAmC,CACvC,OAAQN,EACR,aAAcD,CAChB,
|
|
6
|
-
"names": ["ApduResponse", "isSuccessCommandResult", "describe", "expect", "it", "GeneralTags", "ISSUER_PLACEHOLDER_TLV", "SignBlockHeaderCommand", "COMMAND_COUNT", "PARENT_BYTES", "HEADER_BYTES", "TLV_VALUE", "IV_TLV", "ISSUER_TLV", "FULL_TLV_PAYLOAD", "args", "
|
|
4
|
+
"sourcesContent": ["/* eslint-disable @typescript-eslint/no-unsafe-member-access */\n/* eslint-disable @typescript-eslint/no-explicit-any */\nimport {\n ApduResponse,\n isSuccessCommandResult,\n} from \"@ledgerhq/device-management-kit\";\nimport { describe, expect, it } from \"vitest\";\n\nimport { GeneralTags } from \"@internal/models/Tags\";\n\nimport {\n ISSUER_PLACEHOLDER_TLV,\n SignBlockHeaderCommand,\n type SignBlockHeaderCommandArgs,\n type SignBlockHeaderCommandResponse,\n} from \"./SignBlockHeader\";\n\nconst COMMAND_COUNT = 3;\nconst PARENT_BYTES = Uint8Array.from([0xf0, 0xca, 0xcc, 0x1a]);\nconst HEADER_BYTES = Uint8Array.from([\n ...[GeneralTags.Int, 1, 1], // version 1\n ...[GeneralTags.Hash, 4, ...PARENT_BYTES], // Parent hash\n ...ISSUER_PLACEHOLDER_TLV,\n ...[GeneralTags.Int, 1, COMMAND_COUNT], // command count\n]);\nconst TLV_VALUE = Uint8Array.from([0xf0, 0xca, 0xcc, 0x1a]);\nconst IV_TLV = Uint8Array.from([0x00, TLV_VALUE.length, ...TLV_VALUE]);\nconst ISSUER_TLV = Uint8Array.from([0x81, TLV_VALUE.length, ...TLV_VALUE]);\nconst FULL_TLV_PAYLOAD = new Uint8Array([...IV_TLV, ...ISSUER_TLV]);\n\ndescribe(\"SignBlockHeaderCommand\", () => {\n describe(\"name\", () => {\n it(\"should be 'signBlockHeader'\", () => {\n const args: SignBlockHeaderCommandArgs = {\n parent: PARENT_BYTES,\n commandCount: COMMAND_COUNT,\n };\n const cmd = new SignBlockHeaderCommand(args);\n expect(cmd.name).toBe(\"signBlockHeader\");\n });\n });\n\n describe(\"getApdu()\", () => {\n it(\"should build the correct APDU for a parent hash and a commands count\", () => {\n // given\n const args: SignBlockHeaderCommandArgs = {\n parent: PARENT_BYTES,\n commandCount: COMMAND_COUNT,\n };\n const cmd = new SignBlockHeaderCommand(args);\n\n // when\n const apdu = cmd.getApdu();\n const expected = Uint8Array.from([\n 0xe0,\n 0x07,\n 0x00,\n 0x00,\n HEADER_BYTES.length,\n ...HEADER_BYTES,\n ]);\n\n // then\n expect(apdu.getRawApdu()).toEqual(expected);\n });\n });\n\n describe(\"parseResponse()\", () => {\n it(\"should return raw payload on success\", () => {\n // given\n const args: SignBlockHeaderCommandArgs = {\n parent: PARENT_BYTES,\n commandCount: COMMAND_COUNT,\n };\n const cmd = new SignBlockHeaderCommand(args);\n const response = new ApduResponse({\n statusCode: Uint8Array.from([0x90, 0x00]),\n data: FULL_TLV_PAYLOAD,\n });\n\n // when\n const result = cmd.parseResponse(response);\n\n // then\n expect(isSuccessCommandResult(result)).toBe(true);\n if (isSuccessCommandResult(result)) {\n const res: SignBlockHeaderCommandResponse = result.data;\n expect(res).toEqual(FULL_TLV_PAYLOAD);\n }\n });\n\n it(\"should map SW errors to CommandResult errors\", () => {\n // given\n const args: SignBlockHeaderCommandArgs = {\n parent: PARENT_BYTES,\n commandCount: COMMAND_COUNT,\n };\n const cmd = new SignBlockHeaderCommand(args);\n const response = new ApduResponse({\n statusCode: Uint8Array.from([0x6a, 0x86]),\n data: new Uint8Array(),\n });\n\n // when\n const result = cmd.parseResponse(response);\n\n // then\n expect(isSuccessCommandResult(result)).toBe(false);\n if (!isSuccessCommandResult(result)) {\n expect((result.error as any).errorCode).toBe(\"6a86\");\n }\n });\n\n it(\"should error if no data is returned\", () => {\n // given\n const args: SignBlockHeaderCommandArgs = {\n parent: PARENT_BYTES,\n commandCount: COMMAND_COUNT,\n };\n const cmd = new SignBlockHeaderCommand(args);\n const response = new ApduResponse({\n statusCode: Uint8Array.from([0x90, 0x00]),\n data: new Uint8Array(),\n });\n\n // when\n const result = cmd.parseResponse(response);\n\n // then\n expect(isSuccessCommandResult(result)).toBe(true);\n if (isSuccessCommandResult(result)) {\n expect(result.data).toEqual(new Uint8Array([]));\n }\n });\n });\n});\n"],
|
|
5
|
+
"mappings": "AAEA,OACE,gBAAAA,EACA,0BAAAC,MACK,kCACP,OAAS,YAAAC,EAAU,UAAAC,EAAQ,MAAAC,MAAU,SAErC,OAAS,eAAAC,MAAmB,wBAE5B,OACE,0BAAAC,EACA,0BAAAC,MAGK,oBAEP,MAAMC,EAAgB,EAChBC,EAAe,WAAW,KAAK,CAAC,IAAM,IAAM,IAAM,EAAI,CAAC,EACvDC,EAAe,WAAW,KAAK,CAC/BL,EAAY,IAAK,EAAG,EACpBA,EAAY,KAAM,EAAG,GAAGI,EAC5B,GAAGH,EACCD,EAAY,IAAK,EAAGG,CAC1B,CAAC,EACKG,EAAY,WAAW,KAAK,CAAC,IAAM,IAAM,IAAM,EAAI,CAAC,EACpDC,EAAS,WAAW,KAAK,CAAC,EAAMD,EAAU,OAAQ,GAAGA,CAAS,CAAC,EAC/DE,EAAa,WAAW,KAAK,CAAC,IAAMF,EAAU,OAAQ,GAAGA,CAAS,CAAC,EACnEG,EAAmB,IAAI,WAAW,CAAC,GAAGF,EAAQ,GAAGC,CAAU,CAAC,EAElEX,EAAS,yBAA0B,IAAM,CACvCA,EAAS,OAAQ,IAAM,CACrBE,EAAG,8BAA+B,IAAM,CACtC,MAAMW,EAAmC,CACvC,OAAQN,EACR,aAAcD,CAChB,EACMQ,EAAM,IAAIT,EAAuBQ,CAAI,EAC3CZ,EAAOa,EAAI,IAAI,EAAE,KAAK,iBAAiB,CACzC,CAAC,CACH,CAAC,EAEDd,EAAS,YAAa,IAAM,CAC1BE,EAAG,uEAAwE,IAAM,CAE/E,MAAMW,EAAmC,CACvC,OAAQN,EACR,aAAcD,CAChB,EAIMS,EAHM,IAAIV,EAAuBQ,CAAI,EAG1B,QAAQ,EACnBG,EAAW,WAAW,KAAK,CAC/B,IACA,EACA,EACA,EACAR,EAAa,OACb,GAAGA,CACL,CAAC,EAGDP,EAAOc,EAAK,WAAW,CAAC,EAAE,QAAQC,CAAQ,CAC5C,CAAC,CACH,CAAC,EAEDhB,EAAS,kBAAmB,IAAM,CAChCE,EAAG,uCAAwC,IAAM,CAE/C,MAAMW,EAAmC,CACvC,OAAQN,EACR,aAAcD,CAChB,EACMQ,EAAM,IAAIT,EAAuBQ,CAAI,EACrCI,EAAW,IAAInB,EAAa,CAChC,WAAY,WAAW,KAAK,CAAC,IAAM,CAAI,CAAC,EACxC,KAAMc,CACR,CAAC,EAGKM,EAASJ,EAAI,cAAcG,CAAQ,EAIzC,GADAhB,EAAOF,EAAuBmB,CAAM,CAAC,EAAE,KAAK,EAAI,EAC5CnB,EAAuBmB,CAAM,EAAG,CAClC,MAAMC,EAAsCD,EAAO,KACnDjB,EAAOkB,CAAG,EAAE,QAAQP,CAAgB,CACtC,CACF,CAAC,EAEDV,EAAG,+CAAgD,IAAM,CAEvD,MAAMW,EAAmC,CACvC,OAAQN,EACR,aAAcD,CAChB,EACMQ,EAAM,IAAIT,EAAuBQ,CAAI,EACrCI,EAAW,IAAInB,EAAa,CAChC,WAAY,WAAW,KAAK,CAAC,IAAM,GAAI,CAAC,EACxC,KAAM,IAAI,UACZ,CAAC,EAGKoB,EAASJ,EAAI,cAAcG,CAAQ,EAGzChB,EAAOF,EAAuBmB,CAAM,CAAC,EAAE,KAAK,EAAK,EAC5CnB,EAAuBmB,CAAM,GAChCjB,EAAQiB,EAAO,MAAc,SAAS,EAAE,KAAK,MAAM,CAEvD,CAAC,EAEDhB,EAAG,sCAAuC,IAAM,CAE9C,MAAMW,EAAmC,CACvC,OAAQN,EACR,aAAcD,CAChB,EACMQ,EAAM,IAAIT,EAAuBQ,CAAI,EACrCI,EAAW,IAAInB,EAAa,CAChC,WAAY,WAAW,KAAK,CAAC,IAAM,CAAI,CAAC,EACxC,KAAM,IAAI,UACZ,CAAC,EAGKoB,EAASJ,EAAI,cAAcG,CAAQ,EAGzChB,EAAOF,EAAuBmB,CAAM,CAAC,EAAE,KAAK,EAAI,EAC5CnB,EAAuBmB,CAAM,GAC/BjB,EAAOiB,EAAO,IAAI,EAAE,QAAQ,IAAI,WAAW,CAAC,CAAC,CAAC,CAElD,CAAC,CACH,CAAC,CACH,CAAC",
|
|
6
|
+
"names": ["ApduResponse", "isSuccessCommandResult", "describe", "expect", "it", "GeneralTags", "ISSUER_PLACEHOLDER_TLV", "SignBlockHeaderCommand", "COMMAND_COUNT", "PARENT_BYTES", "HEADER_BYTES", "TLV_VALUE", "IV_TLV", "ISSUER_TLV", "FULL_TLV_PAYLOAD", "args", "cmd", "apdu", "expected", "response", "result", "res"]
|
|
7
7
|
}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{ApduBuilder as
|
|
1
|
+
import{ApduBuilder as l,ApduParser as m,CommandResultFactory as r,InvalidStatusWordError as n}from"@ledgerhq/device-management-kit";import{CommandErrorHelper as u}from"@ledgerhq/signer-utils";import{Maybe as p}from"purify-ts";import{LEDGER_SYNC_ERRORS as c,LedgerKeyringProtocolErrorFactory as y}from"./utils/ledgerKeyringProtocolErrors";class B{name="signBlockSignature";errorHelper=new u(c,y);constructor(){}getApdu(){return new l({cla:224,ins:7,p1:2,p2:0}).build()}parseResponse(t){return p.fromNullable(this.errorHelper.getError(t)).orDefaultLazy(()=>{const i=new m(t),s=i.getUnparsedRemainingLength(),e=i.extractFieldByLength(s);if(!e)return r({error:new n("No data returned by SignBlockSignatureCommand")});if(e.length<2)return r({error:new n("Invalid response: missing signature length or reserved byte")});const a=e[0];if(a===void 0)return r({error:new n("Invalid response: unable to read signature length")});const o=a;if(e.length<2+o)return r({error:new n("Signature length out of bounds")});const d=e.slice(1,1+o),g=e.slice(1+o+1);return r({data:{signature:d,deviceSessionKey:g}})})}}export{B as SignBlockSignatureCommand};
|
|
2
2
|
//# sourceMappingURL=SignBlockSignatureCommand.js.map
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../../src/internal/app-binder/command/SignBlockSignatureCommand.ts"],
|
|
4
|
-
"sourcesContent": ["import {\n type Apdu,\n ApduBuilder,\n ApduParser,\n type ApduResponse,\n type Command,\n type CommandResult,\n CommandResultFactory,\n InvalidStatusWordError,\n} from \"@ledgerhq/device-management-kit\";\nimport { CommandErrorHelper } from \"@ledgerhq/signer-utils\";\nimport { Maybe } from \"purify-ts\";\n\nimport {\n LEDGER_SYNC_ERRORS,\n type LedgerKeyringProtocolErrorCodes,\n LedgerKeyringProtocolErrorFactory,\n} from \"./utils/ledgerKeyringProtocolErrors\";\n\nexport type SignBlockSignatureCommandArgs = Record<string, never>;\n\nexport interface SignBlockSignatureCommandResponse {\n signature: Uint8Array;\n deviceSessionKey: Uint8Array;\n}\n\nexport class SignBlockSignatureCommand\n implements\n Command<\n SignBlockSignatureCommandResponse,\n SignBlockSignatureCommandArgs,\n LedgerKeyringProtocolErrorCodes\n >\n{\n private readonly errorHelper = new CommandErrorHelper<\n SignBlockSignatureCommandResponse,\n LedgerKeyringProtocolErrorCodes\n >(LEDGER_SYNC_ERRORS, LedgerKeyringProtocolErrorFactory);\n\n constructor() {}\n\n getApdu(): Apdu {\n return new ApduBuilder({\n cla: 0xe0,\n ins: 0x07,\n p1: 0x02,\n p2: 0x00,\n }).build();\n }\n\n parseResponse(\n apduResponse: ApduResponse,\n ): CommandResult<\n SignBlockSignatureCommandResponse,\n LedgerKeyringProtocolErrorCodes\n > {\n return Maybe.fromNullable(\n this.errorHelper.getError(apduResponse),\n ).orDefaultLazy(() => {\n const parser = new ApduParser(apduResponse);\n const rem = parser.getUnparsedRemainingLength();\n const data = parser.extractFieldByLength(rem);\n if (!data) {\n return CommandResultFactory({\n error: new InvalidStatusWordError(\n \"No data returned by SignBlockSignatureCommand\",\n ),\n });\n }\n\n if (data.length < 2) {\n return CommandResultFactory({\n error: new InvalidStatusWordError(\n \"Invalid response: missing signature length or reserved byte\",\n ),\n });\n }\n\n const raw = data[0];\n if (raw === undefined) {\n return CommandResultFactory({\n error: new InvalidStatusWordError(\n \"Invalid response: unable to read signature length\",\n ),\n });\n }\n\n const sigLen = raw;\n if (data.length < 2 + sigLen) {\n return CommandResultFactory({\n error: new InvalidStatusWordError(\"Signature length out of bounds\"),\n });\n }\n\n const signature = data.slice(1, 1 + sigLen);\n const deviceSessionKey = data.slice(1 + sigLen + 1);\n\n return CommandResultFactory({ data: { signature, deviceSessionKey } });\n });\n }\n}\n"],
|
|
5
|
-
"mappings": "AAAA,OAEE,eAAAA,EACA,cAAAC,EAIA,wBAAAC,EACA,0BAAAC,MACK,kCACP,OAAS,sBAAAC,MAA0B,yBACnC,OAAS,SAAAC,MAAa,YAEtB,OACE,sBAAAC,EAEA,qCAAAC,MACK,sCASA,MAAMC,CAOb,
|
|
4
|
+
"sourcesContent": ["import {\n type Apdu,\n ApduBuilder,\n ApduParser,\n type ApduResponse,\n type Command,\n type CommandResult,\n CommandResultFactory,\n InvalidStatusWordError,\n} from \"@ledgerhq/device-management-kit\";\nimport { CommandErrorHelper } from \"@ledgerhq/signer-utils\";\nimport { Maybe } from \"purify-ts\";\n\nimport {\n LEDGER_SYNC_ERRORS,\n type LedgerKeyringProtocolErrorCodes,\n LedgerKeyringProtocolErrorFactory,\n} from \"./utils/ledgerKeyringProtocolErrors\";\n\nexport type SignBlockSignatureCommandArgs = Record<string, never>;\n\nexport interface SignBlockSignatureCommandResponse {\n signature: Uint8Array;\n deviceSessionKey: Uint8Array;\n}\n\nexport class SignBlockSignatureCommand\n implements\n Command<\n SignBlockSignatureCommandResponse,\n SignBlockSignatureCommandArgs,\n LedgerKeyringProtocolErrorCodes\n >\n{\n readonly name = \"signBlockSignature\";\n private readonly errorHelper = new CommandErrorHelper<\n SignBlockSignatureCommandResponse,\n LedgerKeyringProtocolErrorCodes\n >(LEDGER_SYNC_ERRORS, LedgerKeyringProtocolErrorFactory);\n\n constructor() {}\n\n getApdu(): Apdu {\n return new ApduBuilder({\n cla: 0xe0,\n ins: 0x07,\n p1: 0x02,\n p2: 0x00,\n }).build();\n }\n\n parseResponse(\n apduResponse: ApduResponse,\n ): CommandResult<\n SignBlockSignatureCommandResponse,\n LedgerKeyringProtocolErrorCodes\n > {\n return Maybe.fromNullable(\n this.errorHelper.getError(apduResponse),\n ).orDefaultLazy(() => {\n const parser = new ApduParser(apduResponse);\n const rem = parser.getUnparsedRemainingLength();\n const data = parser.extractFieldByLength(rem);\n if (!data) {\n return CommandResultFactory({\n error: new InvalidStatusWordError(\n \"No data returned by SignBlockSignatureCommand\",\n ),\n });\n }\n\n if (data.length < 2) {\n return CommandResultFactory({\n error: new InvalidStatusWordError(\n \"Invalid response: missing signature length or reserved byte\",\n ),\n });\n }\n\n const raw = data[0];\n if (raw === undefined) {\n return CommandResultFactory({\n error: new InvalidStatusWordError(\n \"Invalid response: unable to read signature length\",\n ),\n });\n }\n\n const sigLen = raw;\n if (data.length < 2 + sigLen) {\n return CommandResultFactory({\n error: new InvalidStatusWordError(\"Signature length out of bounds\"),\n });\n }\n\n const signature = data.slice(1, 1 + sigLen);\n const deviceSessionKey = data.slice(1 + sigLen + 1);\n\n return CommandResultFactory({ data: { signature, deviceSessionKey } });\n });\n }\n}\n"],
|
|
5
|
+
"mappings": "AAAA,OAEE,eAAAA,EACA,cAAAC,EAIA,wBAAAC,EACA,0BAAAC,MACK,kCACP,OAAS,sBAAAC,MAA0B,yBACnC,OAAS,SAAAC,MAAa,YAEtB,OACE,sBAAAC,EAEA,qCAAAC,MACK,sCASA,MAAMC,CAOb,CACW,KAAO,qBACC,YAAc,IAAIJ,EAGjCE,EAAoBC,CAAiC,EAEvD,aAAc,CAAC,CAEf,SAAgB,CACd,OAAO,IAAIP,EAAY,CACrB,IAAK,IACL,IAAK,EACL,GAAI,EACJ,GAAI,CACN,CAAC,EAAE,MAAM,CACX,CAEA,cACES,EAIA,CACA,OAAOJ,EAAM,aACX,KAAK,YAAY,SAASI,CAAY,CACxC,EAAE,cAAc,IAAM,CACpB,MAAMC,EAAS,IAAIT,EAAWQ,CAAY,EACpCE,EAAMD,EAAO,2BAA2B,EACxCE,EAAOF,EAAO,qBAAqBC,CAAG,EAC5C,GAAI,CAACC,EACH,OAAOV,EAAqB,CAC1B,MAAO,IAAIC,EACT,+CACF,CACF,CAAC,EAGH,GAAIS,EAAK,OAAS,EAChB,OAAOV,EAAqB,CAC1B,MAAO,IAAIC,EACT,6DACF,CACF,CAAC,EAGH,MAAMU,EAAMD,EAAK,CAAC,EAClB,GAAIC,IAAQ,OACV,OAAOX,EAAqB,CAC1B,MAAO,IAAIC,EACT,mDACF,CACF,CAAC,EAGH,MAAMW,EAASD,EACf,GAAID,EAAK,OAAS,EAAIE,EACpB,OAAOZ,EAAqB,CAC1B,MAAO,IAAIC,EAAuB,gCAAgC,CACpE,CAAC,EAGH,MAAMY,EAAYH,EAAK,MAAM,EAAG,EAAIE,CAAM,EACpCE,EAAmBJ,EAAK,MAAM,EAAIE,EAAS,CAAC,EAElD,OAAOZ,EAAqB,CAAE,KAAM,CAAE,UAAAa,EAAW,iBAAAC,CAAiB,CAAE,CAAC,CACvE,CAAC,CACH,CACF",
|
|
6
6
|
"names": ["ApduBuilder", "ApduParser", "CommandResultFactory", "InvalidStatusWordError", "CommandErrorHelper", "Maybe", "LEDGER_SYNC_ERRORS", "LedgerKeyringProtocolErrorFactory", "SignBlockSignatureCommand", "apduResponse", "parser", "rem", "data", "raw", "sigLen", "signature", "deviceSessionKey"]
|
|
7
7
|
}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{ApduResponse as u,isSuccessCommandResult as t}from"@ledgerhq/device-management-kit";import{describe as c,expect as
|
|
1
|
+
import{ApduResponse as u,isSuccessCommandResult as t}from"@ledgerhq/device-management-kit";import{describe as c,expect as e,it as a}from"vitest";import{SignBlockSignatureCommand as i}from"./SignBlockSignatureCommand";const d=Uint8Array.from([240,202,204,26]);c("SignBlockSignatureCommand",()=>{c("name",()=>{a("should be 'signBlockSignature'",()=>{const o=new i;e(o.name).toBe("signBlockSignature")})}),c("getApdu()",()=>{a("should build the correct APDU for finalize-signature",()=>{const s=new i().getApdu();e(s.getRawApdu()).toEqual(Uint8Array.from([224,7,2,0,0]))})}),c("parseResponse()",()=>{a("should return signature and sessionKey on success",()=>{const o=new Uint8Array([d.length,...d,d.length,...d]),s=new i,r=new u({statusCode:Uint8Array.from([144,0]),data:o}),n=s.parseResponse(r);if(e(t(n)).toBe(!0),t(n)){const m=n.data;e(m.signature).toEqual(d),e(m.deviceSessionKey).toEqual(d)}}),a("should map SW errors to CommandResult errors",()=>{const o=new i,s=new u({statusCode:Uint8Array.from([106,134]),data:new Uint8Array}),r=o.parseResponse(s);e(t(r)).toBe(!1),t(r)||e(r.error.errorCode).toBe("6a86")}),a("should error if missing length or reserved byte",()=>{const o=new i,s=new u({statusCode:Uint8Array.from([144,0]),data:new Uint8Array}),r=o.parseResponse(s);e(t(r)).toBe(!1),t(r)||(e(r.error._tag).toBe("InvalidStatusWordError"),e(r.error.originalError.message).toBe("Invalid response: missing signature length or reserved byte"))}),a("should error if signature length out of bounds",()=>{const o=Uint8Array.from([5,170,187]),s=new i,r=new u({statusCode:Uint8Array.from([144,0]),data:o}),n=s.parseResponse(r);e(t(n)).toBe(!1),t(n)||(e(n.error._tag).toBe("InvalidStatusWordError"),e(n.error.originalError.message).toBe("Signature length out of bounds"))})})});
|
|
2
2
|
//# sourceMappingURL=SignBlockSignatureCommand.test.js.map
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../../src/internal/app-binder/command/SignBlockSignatureCommand.test.ts"],
|
|
4
|
-
"sourcesContent": ["/* eslint-disable @typescript-eslint/no-unsafe-member-access */\n/* eslint-disable @typescript-eslint/no-explicit-any */\n\nimport {\n ApduResponse,\n isSuccessCommandResult,\n} from \"@ledgerhq/device-management-kit\";\nimport { describe, expect, it } from \"vitest\";\n\nimport {\n SignBlockSignatureCommand,\n type SignBlockSignatureCommandResponse,\n} from \"./SignBlockSignatureCommand\";\n\nconst SIG_AND_KEY = Uint8Array.from([0xf0, 0xca, 0xcc, 0x1a]);\n\ndescribe(\"SignBlockSignatureCommand\", () => {\n describe(\"getApdu()\", () => {\n it(\"should build the correct APDU for finalize-signature\", () => {\n const cmd = new SignBlockSignatureCommand();\n const apdu = cmd.getApdu();\n expect(apdu.getRawApdu()).toEqual(\n Uint8Array.from([0xe0, 0x07, 0x02, 0x00, 0x00]),\n );\n });\n });\n\n describe(\"parseResponse()\", () => {\n it(\"should return signature and sessionKey on success\", () => {\n // given\n const payload = new Uint8Array([\n SIG_AND_KEY.length,\n ...SIG_AND_KEY,\n SIG_AND_KEY.length,\n ...SIG_AND_KEY,\n ]);\n const cmd = new SignBlockSignatureCommand();\n const response = new ApduResponse({\n statusCode: Uint8Array.from([0x90, 0x00]),\n data: payload,\n });\n\n // when\n const result = cmd.parseResponse(response);\n\n // then\n expect(isSuccessCommandResult(result)).toBe(true);\n if (isSuccessCommandResult(result)) {\n const res: SignBlockSignatureCommandResponse = result.data;\n expect(res.signature).toEqual(SIG_AND_KEY);\n expect(res.deviceSessionKey).toEqual(SIG_AND_KEY);\n }\n });\n\n it(\"should map SW errors to CommandResult errors\", () => {\n // given\n const cmd = new SignBlockSignatureCommand();\n const response = new ApduResponse({\n statusCode: Uint8Array.from([0x6a, 0x86]),\n data: new Uint8Array(),\n });\n\n // when\n const result = cmd.parseResponse(response);\n\n // then\n expect(isSuccessCommandResult(result)).toBe(false);\n if (!isSuccessCommandResult(result)) {\n expect((result.error as any).errorCode).toBe(\"6a86\");\n }\n });\n\n it(\"should error if missing length or reserved byte\", () => {\n // given\n const cmd = new SignBlockSignatureCommand();\n const response = new ApduResponse({\n statusCode: Uint8Array.from([0x90, 0x00]),\n data: new Uint8Array(),\n });\n\n // when\n const result = cmd.parseResponse(response);\n\n // then\n expect(isSuccessCommandResult(result)).toBe(false);\n if (!isSuccessCommandResult(result)) {\n expect((result.error as any)._tag).toBe(\"InvalidStatusWordError\");\n expect((result.error as any).originalError.message).toBe(\n \"Invalid response: missing signature length or reserved byte\",\n );\n }\n });\n\n it(\"should error if signature length out of bounds\", () => {\n // given\n const bad = Uint8Array.from([5, 0xaa, 0xbb]);\n const cmd = new SignBlockSignatureCommand();\n const response = new ApduResponse({\n statusCode: Uint8Array.from([0x90, 0x00]),\n data: bad,\n });\n\n // when\n const result = cmd.parseResponse(response);\n\n // then\n expect(isSuccessCommandResult(result)).toBe(false);\n if (!isSuccessCommandResult(result)) {\n expect((result.error as any)._tag).toBe(\"InvalidStatusWordError\");\n expect((result.error as any).originalError.message).toBe(\n \"Signature length out of bounds\",\n );\n }\n });\n });\n});\n"],
|
|
5
|
-
"mappings": "AAGA,OACE,gBAAAA,EACA,0BAAAC,MACK,kCACP,OAAS,YAAAC,EAAU,UAAAC,EAAQ,MAAAC,MAAU,SAErC,OACE,6BAAAC,MAEK,8BAEP,MAAMC,EAAc,WAAW,KAAK,CAAC,IAAM,IAAM,IAAM,EAAI,CAAC,EAE5DJ,EAAS,4BAA6B,IAAM,CAC1CA,EAAS,YAAa,IAAM,CAC1BE,EAAG,uDAAwD,IAAM,CAE/D,
|
|
6
|
-
"names": ["ApduResponse", "isSuccessCommandResult", "describe", "expect", "it", "SignBlockSignatureCommand", "SIG_AND_KEY", "
|
|
4
|
+
"sourcesContent": ["/* eslint-disable @typescript-eslint/no-unsafe-member-access */\n/* eslint-disable @typescript-eslint/no-explicit-any */\n\nimport {\n ApduResponse,\n isSuccessCommandResult,\n} from \"@ledgerhq/device-management-kit\";\nimport { describe, expect, it } from \"vitest\";\n\nimport {\n SignBlockSignatureCommand,\n type SignBlockSignatureCommandResponse,\n} from \"./SignBlockSignatureCommand\";\n\nconst SIG_AND_KEY = Uint8Array.from([0xf0, 0xca, 0xcc, 0x1a]);\n\ndescribe(\"SignBlockSignatureCommand\", () => {\n describe(\"name\", () => {\n it(\"should be 'signBlockSignature'\", () => {\n const cmd = new SignBlockSignatureCommand();\n expect(cmd.name).toBe(\"signBlockSignature\");\n });\n });\n\n describe(\"getApdu()\", () => {\n it(\"should build the correct APDU for finalize-signature\", () => {\n const cmd = new SignBlockSignatureCommand();\n const apdu = cmd.getApdu();\n expect(apdu.getRawApdu()).toEqual(\n Uint8Array.from([0xe0, 0x07, 0x02, 0x00, 0x00]),\n );\n });\n });\n\n describe(\"parseResponse()\", () => {\n it(\"should return signature and sessionKey on success\", () => {\n // given\n const payload = new Uint8Array([\n SIG_AND_KEY.length,\n ...SIG_AND_KEY,\n SIG_AND_KEY.length,\n ...SIG_AND_KEY,\n ]);\n const cmd = new SignBlockSignatureCommand();\n const response = new ApduResponse({\n statusCode: Uint8Array.from([0x90, 0x00]),\n data: payload,\n });\n\n // when\n const result = cmd.parseResponse(response);\n\n // then\n expect(isSuccessCommandResult(result)).toBe(true);\n if (isSuccessCommandResult(result)) {\n const res: SignBlockSignatureCommandResponse = result.data;\n expect(res.signature).toEqual(SIG_AND_KEY);\n expect(res.deviceSessionKey).toEqual(SIG_AND_KEY);\n }\n });\n\n it(\"should map SW errors to CommandResult errors\", () => {\n // given\n const cmd = new SignBlockSignatureCommand();\n const response = new ApduResponse({\n statusCode: Uint8Array.from([0x6a, 0x86]),\n data: new Uint8Array(),\n });\n\n // when\n const result = cmd.parseResponse(response);\n\n // then\n expect(isSuccessCommandResult(result)).toBe(false);\n if (!isSuccessCommandResult(result)) {\n expect((result.error as any).errorCode).toBe(\"6a86\");\n }\n });\n\n it(\"should error if missing length or reserved byte\", () => {\n // given\n const cmd = new SignBlockSignatureCommand();\n const response = new ApduResponse({\n statusCode: Uint8Array.from([0x90, 0x00]),\n data: new Uint8Array(),\n });\n\n // when\n const result = cmd.parseResponse(response);\n\n // then\n expect(isSuccessCommandResult(result)).toBe(false);\n if (!isSuccessCommandResult(result)) {\n expect((result.error as any)._tag).toBe(\"InvalidStatusWordError\");\n expect((result.error as any).originalError.message).toBe(\n \"Invalid response: missing signature length or reserved byte\",\n );\n }\n });\n\n it(\"should error if signature length out of bounds\", () => {\n // given\n const bad = Uint8Array.from([5, 0xaa, 0xbb]);\n const cmd = new SignBlockSignatureCommand();\n const response = new ApduResponse({\n statusCode: Uint8Array.from([0x90, 0x00]),\n data: bad,\n });\n\n // when\n const result = cmd.parseResponse(response);\n\n // then\n expect(isSuccessCommandResult(result)).toBe(false);\n if (!isSuccessCommandResult(result)) {\n expect((result.error as any)._tag).toBe(\"InvalidStatusWordError\");\n expect((result.error as any).originalError.message).toBe(\n \"Signature length out of bounds\",\n );\n }\n });\n });\n});\n"],
|
|
5
|
+
"mappings": "AAGA,OACE,gBAAAA,EACA,0BAAAC,MACK,kCACP,OAAS,YAAAC,EAAU,UAAAC,EAAQ,MAAAC,MAAU,SAErC,OACE,6BAAAC,MAEK,8BAEP,MAAMC,EAAc,WAAW,KAAK,CAAC,IAAM,IAAM,IAAM,EAAI,CAAC,EAE5DJ,EAAS,4BAA6B,IAAM,CAC1CA,EAAS,OAAQ,IAAM,CACrBE,EAAG,iCAAkC,IAAM,CACzC,MAAMG,EAAM,IAAIF,EAChBF,EAAOI,EAAI,IAAI,EAAE,KAAK,oBAAoB,CAC5C,CAAC,CACH,CAAC,EAEDL,EAAS,YAAa,IAAM,CAC1BE,EAAG,uDAAwD,IAAM,CAE/D,MAAMI,EADM,IAAIH,EAA0B,EACzB,QAAQ,EACzBF,EAAOK,EAAK,WAAW,CAAC,EAAE,QACxB,WAAW,KAAK,CAAC,IAAM,EAAM,EAAM,EAAM,CAAI,CAAC,CAChD,CACF,CAAC,CACH,CAAC,EAEDN,EAAS,kBAAmB,IAAM,CAChCE,EAAG,oDAAqD,IAAM,CAE5D,MAAMK,EAAU,IAAI,WAAW,CAC7BH,EAAY,OACZ,GAAGA,EACHA,EAAY,OACZ,GAAGA,CACL,CAAC,EACKC,EAAM,IAAIF,EACVK,EAAW,IAAIV,EAAa,CAChC,WAAY,WAAW,KAAK,CAAC,IAAM,CAAI,CAAC,EACxC,KAAMS,CACR,CAAC,EAGKE,EAASJ,EAAI,cAAcG,CAAQ,EAIzC,GADAP,EAAOF,EAAuBU,CAAM,CAAC,EAAE,KAAK,EAAI,EAC5CV,EAAuBU,CAAM,EAAG,CAClC,MAAMC,EAAyCD,EAAO,KACtDR,EAAOS,EAAI,SAAS,EAAE,QAAQN,CAAW,EACzCH,EAAOS,EAAI,gBAAgB,EAAE,QAAQN,CAAW,CAClD,CACF,CAAC,EAEDF,EAAG,+CAAgD,IAAM,CAEvD,MAAMG,EAAM,IAAIF,EACVK,EAAW,IAAIV,EAAa,CAChC,WAAY,WAAW,KAAK,CAAC,IAAM,GAAI,CAAC,EACxC,KAAM,IAAI,UACZ,CAAC,EAGKW,EAASJ,EAAI,cAAcG,CAAQ,EAGzCP,EAAOF,EAAuBU,CAAM,CAAC,EAAE,KAAK,EAAK,EAC5CV,EAAuBU,CAAM,GAChCR,EAAQQ,EAAO,MAAc,SAAS,EAAE,KAAK,MAAM,CAEvD,CAAC,EAEDP,EAAG,kDAAmD,IAAM,CAE1D,MAAMG,EAAM,IAAIF,EACVK,EAAW,IAAIV,EAAa,CAChC,WAAY,WAAW,KAAK,CAAC,IAAM,CAAI,CAAC,EACxC,KAAM,IAAI,UACZ,CAAC,EAGKW,EAASJ,EAAI,cAAcG,CAAQ,EAGzCP,EAAOF,EAAuBU,CAAM,CAAC,EAAE,KAAK,EAAK,EAC5CV,EAAuBU,CAAM,IAChCR,EAAQQ,EAAO,MAAc,IAAI,EAAE,KAAK,wBAAwB,EAChER,EAAQQ,EAAO,MAAc,cAAc,OAAO,EAAE,KAClD,6DACF,EAEJ,CAAC,EAEDP,EAAG,iDAAkD,IAAM,CAEzD,MAAMS,EAAM,WAAW,KAAK,CAAC,EAAG,IAAM,GAAI,CAAC,EACrCN,EAAM,IAAIF,EACVK,EAAW,IAAIV,EAAa,CAChC,WAAY,WAAW,KAAK,CAAC,IAAM,CAAI,CAAC,EACxC,KAAMa,CACR,CAAC,EAGKF,EAASJ,EAAI,cAAcG,CAAQ,EAGzCP,EAAOF,EAAuBU,CAAM,CAAC,EAAE,KAAK,EAAK,EAC5CV,EAAuBU,CAAM,IAChCR,EAAQQ,EAAO,MAAc,IAAI,EAAE,KAAK,wBAAwB,EAChER,EAAQQ,EAAO,MAAc,cAAc,OAAO,EAAE,KAClD,gCACF,EAEJ,CAAC,CACH,CAAC,CACH,CAAC",
|
|
6
|
+
"names": ["ApduResponse", "isSuccessCommandResult", "describe", "expect", "it", "SignBlockSignatureCommand", "SIG_AND_KEY", "cmd", "apdu", "payload", "response", "result", "res", "bad"]
|
|
7
7
|
}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{ApduBuilder as a,ApduParser as m,CommandResultFactory as n,InvalidStatusWordError as
|
|
1
|
+
import{ApduBuilder as a,ApduParser as m,CommandResultFactory as n,InvalidStatusWordError as i}from"@ledgerhq/device-management-kit";import{CommandErrorHelper as l}from"@ledgerhq/signer-utils";import{Maybe as d}from"purify-ts";import{LEDGER_SYNC_ERRORS as g,LedgerKeyringProtocolErrorFactory as s}from"./utils/ledgerKeyringProtocolErrors";class C{constructor(r){this.args=r}name="signBlockSingle";errorHelper=new l(g,s);getApdu(){return new a({cla:224,ins:7,p1:1,p2:0}).addBufferToData(this.args.command).build()}parseResponse(r){return d.fromNullable(this.errorHelper.getError(r)).orDefaultLazy(()=>{const e=new m(r),t=e.getUnparsedRemainingLength(),o=e.extractFieldByLength(t);return o?n({data:o}):n({error:new i("No data returned by SignBlockSingleCommand")})})}}export{C as SignBlockSingleCommand};
|
|
2
2
|
//# sourceMappingURL=SignBlockSingleCommand.js.map
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../../src/internal/app-binder/command/SignBlockSingleCommand.ts"],
|
|
4
|
-
"sourcesContent": ["import {\n type Apdu,\n ApduBuilder,\n ApduParser,\n type ApduResponse,\n type Command,\n type CommandResult,\n CommandResultFactory,\n InvalidStatusWordError,\n} from \"@ledgerhq/device-management-kit\";\nimport { CommandErrorHelper } from \"@ledgerhq/signer-utils\";\nimport { Maybe } from \"purify-ts\";\n\nimport {\n LEDGER_SYNC_ERRORS,\n type LedgerKeyringProtocolErrorCodes,\n LedgerKeyringProtocolErrorFactory,\n} from \"./utils/ledgerKeyringProtocolErrors\";\n\nexport interface SignBlockSingleCommandArgs {\n command: Uint8Array;\n}\n\nexport type SignBlockSingleCommandResponse = Uint8Array;\n\nexport class SignBlockSingleCommand\n implements\n Command<\n SignBlockSingleCommandResponse,\n SignBlockSingleCommandArgs,\n LedgerKeyringProtocolErrorCodes\n >\n{\n private readonly errorHelper = new CommandErrorHelper<\n SignBlockSingleCommandResponse,\n LedgerKeyringProtocolErrorCodes\n >(LEDGER_SYNC_ERRORS, LedgerKeyringProtocolErrorFactory);\n\n constructor(private readonly args: SignBlockSingleCommandArgs) {}\n\n getApdu(): Apdu {\n return new ApduBuilder({\n cla: 0xe0,\n ins: 0x07,\n p1: 0x01,\n p2: 0x00,\n })\n .addBufferToData(this.args.command)\n .build();\n }\n\n parseResponse(\n apduResponse: ApduResponse,\n ): CommandResult<\n SignBlockSingleCommandResponse,\n LedgerKeyringProtocolErrorCodes\n > {\n return Maybe.fromNullable(\n this.errorHelper.getError(apduResponse),\n ).orDefaultLazy(() => {\n const parser = new ApduParser(apduResponse);\n const remaining = parser.getUnparsedRemainingLength();\n const tlvBlob = parser.extractFieldByLength(remaining);\n if (!tlvBlob) {\n return CommandResultFactory({\n error: new InvalidStatusWordError(\n \"No data returned by SignBlockSingleCommand\",\n ),\n });\n }\n return CommandResultFactory({ data: tlvBlob });\n });\n }\n}\n"],
|
|
5
|
-
"mappings": "AAAA,OAEE,eAAAA,EACA,cAAAC,EAIA,wBAAAC,EACA,0BAAAC,MACK,kCACP,OAAS,sBAAAC,MAA0B,yBACnC,OAAS,SAAAC,MAAa,YAEtB,OACE,sBAAAC,EAEA,qCAAAC,MACK,sCAQA,MAAMC,CAOb,
|
|
4
|
+
"sourcesContent": ["import {\n type Apdu,\n ApduBuilder,\n ApduParser,\n type ApduResponse,\n type Command,\n type CommandResult,\n CommandResultFactory,\n InvalidStatusWordError,\n} from \"@ledgerhq/device-management-kit\";\nimport { CommandErrorHelper } from \"@ledgerhq/signer-utils\";\nimport { Maybe } from \"purify-ts\";\n\nimport {\n LEDGER_SYNC_ERRORS,\n type LedgerKeyringProtocolErrorCodes,\n LedgerKeyringProtocolErrorFactory,\n} from \"./utils/ledgerKeyringProtocolErrors\";\n\nexport interface SignBlockSingleCommandArgs {\n command: Uint8Array;\n}\n\nexport type SignBlockSingleCommandResponse = Uint8Array;\n\nexport class SignBlockSingleCommand\n implements\n Command<\n SignBlockSingleCommandResponse,\n SignBlockSingleCommandArgs,\n LedgerKeyringProtocolErrorCodes\n >\n{\n readonly name = \"signBlockSingle\";\n private readonly errorHelper = new CommandErrorHelper<\n SignBlockSingleCommandResponse,\n LedgerKeyringProtocolErrorCodes\n >(LEDGER_SYNC_ERRORS, LedgerKeyringProtocolErrorFactory);\n\n constructor(private readonly args: SignBlockSingleCommandArgs) {}\n\n getApdu(): Apdu {\n return new ApduBuilder({\n cla: 0xe0,\n ins: 0x07,\n p1: 0x01,\n p2: 0x00,\n })\n .addBufferToData(this.args.command)\n .build();\n }\n\n parseResponse(\n apduResponse: ApduResponse,\n ): CommandResult<\n SignBlockSingleCommandResponse,\n LedgerKeyringProtocolErrorCodes\n > {\n return Maybe.fromNullable(\n this.errorHelper.getError(apduResponse),\n ).orDefaultLazy(() => {\n const parser = new ApduParser(apduResponse);\n const remaining = parser.getUnparsedRemainingLength();\n const tlvBlob = parser.extractFieldByLength(remaining);\n if (!tlvBlob) {\n return CommandResultFactory({\n error: new InvalidStatusWordError(\n \"No data returned by SignBlockSingleCommand\",\n ),\n });\n }\n return CommandResultFactory({ data: tlvBlob });\n });\n }\n}\n"],
|
|
5
|
+
"mappings": "AAAA,OAEE,eAAAA,EACA,cAAAC,EAIA,wBAAAC,EACA,0BAAAC,MACK,kCACP,OAAS,sBAAAC,MAA0B,yBACnC,OAAS,SAAAC,MAAa,YAEtB,OACE,sBAAAC,EAEA,qCAAAC,MACK,sCAQA,MAAMC,CAOb,CAOE,YAA6BC,EAAkC,CAAlC,UAAAA,CAAmC,CANvD,KAAO,kBACC,YAAc,IAAIL,EAGjCE,EAAoBC,CAAiC,EAIvD,SAAgB,CACd,OAAO,IAAIP,EAAY,CACrB,IAAK,IACL,IAAK,EACL,GAAI,EACJ,GAAI,CACN,CAAC,EACE,gBAAgB,KAAK,KAAK,OAAO,EACjC,MAAM,CACX,CAEA,cACEU,EAIA,CACA,OAAOL,EAAM,aACX,KAAK,YAAY,SAASK,CAAY,CACxC,EAAE,cAAc,IAAM,CACpB,MAAMC,EAAS,IAAIV,EAAWS,CAAY,EACpCE,EAAYD,EAAO,2BAA2B,EAC9CE,EAAUF,EAAO,qBAAqBC,CAAS,EACrD,OAAKC,EAOEX,EAAqB,CAAE,KAAMW,CAAQ,CAAC,EANpCX,EAAqB,CAC1B,MAAO,IAAIC,EACT,4CACF,CACF,CAAC,CAGL,CAAC,CACH,CACF",
|
|
6
6
|
"names": ["ApduBuilder", "ApduParser", "CommandResultFactory", "InvalidStatusWordError", "CommandErrorHelper", "Maybe", "LEDGER_SYNC_ERRORS", "LedgerKeyringProtocolErrorFactory", "SignBlockSingleCommand", "args", "apduResponse", "parser", "remaining", "tlvBlob"]
|
|
7
7
|
}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{ApduResponse as
|
|
1
|
+
import{ApduResponse as i,isSuccessCommandResult as a}from"@ledgerhq/device-management-kit";import{describe as d,expect as s,it as c}from"vitest";import{SignBlockSingleCommand as m}from"./SignBlockSingleCommand";const r=Uint8Array.from([240,202,204,26]),l=Uint8Array.from([240,202,204,26]);d("SignBlockSingleCommand",()=>{d("name",()=>{c("should be 'signBlockSingle'",()=>{const o={command:r},e=new m(o);s(e.name).toBe("signBlockSingle")})}),d("getApdu()",()=>{c("should build the correct APDU for a given command",()=>{const o={command:r},t=new m(o).getApdu(),n=Uint8Array.from([224,7,1,0,r.length,...r]);s(t.getRawApdu()).toEqual(n)})}),d("parseResponse()",()=>{c("should return the raw TLV blob on success",()=>{const o={command:r},e=new m(o),t=new i({statusCode:Uint8Array.from([144,0]),data:l}),n=e.parseResponse(t);if(s(a(n)).toBe(!0),a(n)){const g=n.data;s(g).toEqual(l)}}),c("should map SW errors to CommandResult errors",()=>{const o={command:r},e=new m(o),t=new i({statusCode:Uint8Array.from([106,134]),data:new Uint8Array}),n=e.parseResponse(t);s(a(n)).toBe(!1),a(n)||s(n.error.errorCode).toBe("6a86")}),c("should return an empty Uint8Array if no data is returned",()=>{const o={command:r},e=new m(o),t=new i({statusCode:Uint8Array.from([144,0]),data:new Uint8Array}),n=e.parseResponse(t);s(a(n)).toBe(!0),a(n)&&s(n.data).toEqual(new Uint8Array)})})});
|
|
2
2
|
//# sourceMappingURL=SignBlockSingleCommand.test.js.map
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../../src/internal/app-binder/command/SignBlockSingleCommand.test.ts"],
|
|
4
|
-
"sourcesContent": ["/* eslint-disable @typescript-eslint/no-unsafe-member-access */\n/* eslint-disable @typescript-eslint/no-explicit-any */\nimport {\n ApduResponse,\n isSuccessCommandResult,\n} from \"@ledgerhq/device-management-kit\";\nimport { describe, expect, it } from \"vitest\";\n\nimport {\n SignBlockSingleCommand,\n type SignBlockSingleCommandArgs,\n type SignBlockSingleCommandResponse,\n} from \"./SignBlockSingleCommand\";\n\nconst COMMAND_BYTES = Uint8Array.from([0xf0, 0xca, 0xcc, 0x1a]);\nconst TLV_PAYLOAD = Uint8Array.from([0xf0, 0xca, 0xcc, 0x1a]);\n\ndescribe(\"SignBlockSingleCommand\", () => {\n describe(\"getApdu()\", () => {\n it(\"should build the correct APDU for a given command\", () => {\n // given\n const args: SignBlockSingleCommandArgs = { command: COMMAND_BYTES };\n const cmd = new SignBlockSingleCommand(args);\n\n // when\n const apdu = cmd.getApdu();\n const expected = Uint8Array.from([\n 0xe0,\n 0x07,\n 0x01,\n 0x00,\n COMMAND_BYTES.length,\n ...COMMAND_BYTES,\n ]);\n\n // then\n expect(apdu.getRawApdu()).toEqual(expected);\n });\n });\n\n describe(\"parseResponse()\", () => {\n it(\"should return the raw TLV blob on success\", () => {\n // given\n const args: SignBlockSingleCommandArgs = { command: COMMAND_BYTES };\n const cmd = new SignBlockSingleCommand(args);\n const response = new ApduResponse({\n statusCode: Uint8Array.from([0x90, 0x00]),\n data: TLV_PAYLOAD,\n });\n\n // when\n const result = cmd.parseResponse(response);\n\n // then\n expect(isSuccessCommandResult(result)).toBe(true);\n if (isSuccessCommandResult(result)) {\n const data: SignBlockSingleCommandResponse = result.data;\n expect(data).toEqual(TLV_PAYLOAD);\n }\n });\n\n it(\"should map SW errors to CommandResult errors\", () => {\n // given\n const args: SignBlockSingleCommandArgs = { command: COMMAND_BYTES };\n const cmd = new SignBlockSingleCommand(args);\n const response = new ApduResponse({\n statusCode: Uint8Array.from([0x6a, 0x86]),\n data: new Uint8Array(),\n });\n\n // when\n const result = cmd.parseResponse(response);\n\n // then\n expect(isSuccessCommandResult(result)).toBe(false);\n if (!isSuccessCommandResult(result)) {\n expect((result.error as any).errorCode).toBe(\"6a86\");\n }\n });\n\n it(\"should return an empty Uint8Array if no data is returned\", () => {\n // given\n const args: SignBlockSingleCommandArgs = { command: COMMAND_BYTES };\n const cmd = new SignBlockSingleCommand(args);\n const response = new ApduResponse({\n statusCode: Uint8Array.from([0x90, 0x00]),\n data: new Uint8Array(),\n });\n\n // when\n const result = cmd.parseResponse(response);\n\n // then\n expect(isSuccessCommandResult(result)).toBe(true);\n if (isSuccessCommandResult(result)) {\n expect(result.data).toEqual(new Uint8Array());\n }\n });\n });\n});\n"],
|
|
5
|
-
"mappings": "AAEA,OACE,gBAAAA,EACA,0BAAAC,MACK,kCACP,OAAS,YAAAC,EAAU,UAAAC,EAAQ,MAAAC,MAAU,SAErC,OACE,0BAAAC,MAGK,2BAEP,MAAMC,EAAgB,WAAW,KAAK,CAAC,IAAM,IAAM,IAAM,EAAI,CAAC,EACxDC,EAAc,WAAW,KAAK,CAAC,IAAM,IAAM,IAAM,EAAI,CAAC,EAE5DL,EAAS,yBAA0B,IAAM,CACvCA,EAAS,YAAa,IAAM,CAC1BE,EAAG,oDAAqD,IAAM,CAE5D,MAAMI,EAAmC,CAAE,QAASF,CAAc,
|
|
6
|
-
"names": ["ApduResponse", "isSuccessCommandResult", "describe", "expect", "it", "SignBlockSingleCommand", "COMMAND_BYTES", "TLV_PAYLOAD", "args", "
|
|
4
|
+
"sourcesContent": ["/* eslint-disable @typescript-eslint/no-unsafe-member-access */\n/* eslint-disable @typescript-eslint/no-explicit-any */\nimport {\n ApduResponse,\n isSuccessCommandResult,\n} from \"@ledgerhq/device-management-kit\";\nimport { describe, expect, it } from \"vitest\";\n\nimport {\n SignBlockSingleCommand,\n type SignBlockSingleCommandArgs,\n type SignBlockSingleCommandResponse,\n} from \"./SignBlockSingleCommand\";\n\nconst COMMAND_BYTES = Uint8Array.from([0xf0, 0xca, 0xcc, 0x1a]);\nconst TLV_PAYLOAD = Uint8Array.from([0xf0, 0xca, 0xcc, 0x1a]);\n\ndescribe(\"SignBlockSingleCommand\", () => {\n describe(\"name\", () => {\n it(\"should be 'signBlockSingle'\", () => {\n const args: SignBlockSingleCommandArgs = { command: COMMAND_BYTES };\n const cmd = new SignBlockSingleCommand(args);\n expect(cmd.name).toBe(\"signBlockSingle\");\n });\n });\n\n describe(\"getApdu()\", () => {\n it(\"should build the correct APDU for a given command\", () => {\n // given\n const args: SignBlockSingleCommandArgs = { command: COMMAND_BYTES };\n const cmd = new SignBlockSingleCommand(args);\n\n // when\n const apdu = cmd.getApdu();\n const expected = Uint8Array.from([\n 0xe0,\n 0x07,\n 0x01,\n 0x00,\n COMMAND_BYTES.length,\n ...COMMAND_BYTES,\n ]);\n\n // then\n expect(apdu.getRawApdu()).toEqual(expected);\n });\n });\n\n describe(\"parseResponse()\", () => {\n it(\"should return the raw TLV blob on success\", () => {\n // given\n const args: SignBlockSingleCommandArgs = { command: COMMAND_BYTES };\n const cmd = new SignBlockSingleCommand(args);\n const response = new ApduResponse({\n statusCode: Uint8Array.from([0x90, 0x00]),\n data: TLV_PAYLOAD,\n });\n\n // when\n const result = cmd.parseResponse(response);\n\n // then\n expect(isSuccessCommandResult(result)).toBe(true);\n if (isSuccessCommandResult(result)) {\n const data: SignBlockSingleCommandResponse = result.data;\n expect(data).toEqual(TLV_PAYLOAD);\n }\n });\n\n it(\"should map SW errors to CommandResult errors\", () => {\n // given\n const args: SignBlockSingleCommandArgs = { command: COMMAND_BYTES };\n const cmd = new SignBlockSingleCommand(args);\n const response = new ApduResponse({\n statusCode: Uint8Array.from([0x6a, 0x86]),\n data: new Uint8Array(),\n });\n\n // when\n const result = cmd.parseResponse(response);\n\n // then\n expect(isSuccessCommandResult(result)).toBe(false);\n if (!isSuccessCommandResult(result)) {\n expect((result.error as any).errorCode).toBe(\"6a86\");\n }\n });\n\n it(\"should return an empty Uint8Array if no data is returned\", () => {\n // given\n const args: SignBlockSingleCommandArgs = { command: COMMAND_BYTES };\n const cmd = new SignBlockSingleCommand(args);\n const response = new ApduResponse({\n statusCode: Uint8Array.from([0x90, 0x00]),\n data: new Uint8Array(),\n });\n\n // when\n const result = cmd.parseResponse(response);\n\n // then\n expect(isSuccessCommandResult(result)).toBe(true);\n if (isSuccessCommandResult(result)) {\n expect(result.data).toEqual(new Uint8Array());\n }\n });\n });\n});\n"],
|
|
5
|
+
"mappings": "AAEA,OACE,gBAAAA,EACA,0BAAAC,MACK,kCACP,OAAS,YAAAC,EAAU,UAAAC,EAAQ,MAAAC,MAAU,SAErC,OACE,0BAAAC,MAGK,2BAEP,MAAMC,EAAgB,WAAW,KAAK,CAAC,IAAM,IAAM,IAAM,EAAI,CAAC,EACxDC,EAAc,WAAW,KAAK,CAAC,IAAM,IAAM,IAAM,EAAI,CAAC,EAE5DL,EAAS,yBAA0B,IAAM,CACvCA,EAAS,OAAQ,IAAM,CACrBE,EAAG,8BAA+B,IAAM,CACtC,MAAMI,EAAmC,CAAE,QAASF,CAAc,EAC5DG,EAAM,IAAIJ,EAAuBG,CAAI,EAC3CL,EAAOM,EAAI,IAAI,EAAE,KAAK,iBAAiB,CACzC,CAAC,CACH,CAAC,EAEDP,EAAS,YAAa,IAAM,CAC1BE,EAAG,oDAAqD,IAAM,CAE5D,MAAMI,EAAmC,CAAE,QAASF,CAAc,EAI5DI,EAHM,IAAIL,EAAuBG,CAAI,EAG1B,QAAQ,EACnBG,EAAW,WAAW,KAAK,CAC/B,IACA,EACA,EACA,EACAL,EAAc,OACd,GAAGA,CACL,CAAC,EAGDH,EAAOO,EAAK,WAAW,CAAC,EAAE,QAAQC,CAAQ,CAC5C,CAAC,CACH,CAAC,EAEDT,EAAS,kBAAmB,IAAM,CAChCE,EAAG,4CAA6C,IAAM,CAEpD,MAAMI,EAAmC,CAAE,QAASF,CAAc,EAC5DG,EAAM,IAAIJ,EAAuBG,CAAI,EACrCI,EAAW,IAAIZ,EAAa,CAChC,WAAY,WAAW,KAAK,CAAC,IAAM,CAAI,CAAC,EACxC,KAAMO,CACR,CAAC,EAGKM,EAASJ,EAAI,cAAcG,CAAQ,EAIzC,GADAT,EAAOF,EAAuBY,CAAM,CAAC,EAAE,KAAK,EAAI,EAC5CZ,EAAuBY,CAAM,EAAG,CAClC,MAAMC,EAAuCD,EAAO,KACpDV,EAAOW,CAAI,EAAE,QAAQP,CAAW,CAClC,CACF,CAAC,EAEDH,EAAG,+CAAgD,IAAM,CAEvD,MAAMI,EAAmC,CAAE,QAASF,CAAc,EAC5DG,EAAM,IAAIJ,EAAuBG,CAAI,EACrCI,EAAW,IAAIZ,EAAa,CAChC,WAAY,WAAW,KAAK,CAAC,IAAM,GAAI,CAAC,EACxC,KAAM,IAAI,UACZ,CAAC,EAGKa,EAASJ,EAAI,cAAcG,CAAQ,EAGzCT,EAAOF,EAAuBY,CAAM,CAAC,EAAE,KAAK,EAAK,EAC5CZ,EAAuBY,CAAM,GAChCV,EAAQU,EAAO,MAAc,SAAS,EAAE,KAAK,MAAM,CAEvD,CAAC,EAEDT,EAAG,2DAA4D,IAAM,CAEnE,MAAMI,EAAmC,CAAE,QAASF,CAAc,EAC5DG,EAAM,IAAIJ,EAAuBG,CAAI,EACrCI,EAAW,IAAIZ,EAAa,CAChC,WAAY,WAAW,KAAK,CAAC,IAAM,CAAI,CAAC,EACxC,KAAM,IAAI,UACZ,CAAC,EAGKa,EAASJ,EAAI,cAAcG,CAAQ,EAGzCT,EAAOF,EAAuBY,CAAM,CAAC,EAAE,KAAK,EAAI,EAC5CZ,EAAuBY,CAAM,GAC/BV,EAAOU,EAAO,IAAI,EAAE,QAAQ,IAAI,UAAY,CAEhD,CAAC,CACH,CAAC,CACH,CAAC",
|
|
6
|
+
"names": ["ApduResponse", "isSuccessCommandResult", "describe", "expect", "it", "SignBlockSingleCommand", "COMMAND_BYTES", "TLV_PAYLOAD", "args", "cmd", "apdu", "expected", "response", "result", "data"]
|
|
7
7
|
}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{hexaStringToBuffer as A,UserInteractionRequired as u,XStateDeviceAction as D}from"@ledgerhq/device-management-kit";import{EitherAsync as m,Left as T,Right as E}from"purify-ts";import{assign as p,fromPromise as h,setup as g}from"xstate";import{AddToTrustchainDAState as S,AddToTrustchaineDAStep as d}from"../../../api/app-binder/AddToTrustchainDeviceActionTypes";import{LKRPTrustchainNotReady as k,LKRPUnknownError as I}from"../../../api/model/Errors";import{InitTask as v}from"../../app-binder/task/InitTask";import{ParseStreamToDeviceTask as f}from"../../app-binder/task/ParseStreamToDeviceTask";import{SignBlockTask as b}from"../../app-binder/task/SignBlockTask";import{eitherSeqRecord as l}from"../../utils/eitherSeqRecord";import{required as s}from"../../utils/required";import{raiseAndAssign as c}from"./utils/raiseAndAssign";class U extends D{makeStateMachine(o){const{initCommand:i,parseStream:a,signBlock:y}=this.extractDependencies(o);return g({types:{input:{},context:{},output:{}},actors:{initCommand:h(i),parseStream:h(a),signBlock:h(y)},actions:{assignErrorFromEvent:c(({event:t})=>T(new I(String(t.error))))},guards:{isTustchainEmpty:({context:t})=>t.input.toMaybe().chain(e=>e.trustchain.getAppStream(e.appId)).chain(e=>e.parse().toMaybe()).map(e=>e.length===0).orDefault(!0)}}).createMachine({id:"AddToTrustchainDeviceAction",context:({input:t})=>({input:t,intermediateValue:{requiredUserInteraction:u.None},_internalState:E({sessionKeypair:null})}),initial:"InitSession",states:{InitSession:{entry:p({intermediateValue:{requiredUserInteraction:u.None,step:d.Initialize}}),on:{success:"ParseStream",error:"Error"},invoke:{id:"initCommand",src:"initCommand",input:({context:t})=>t.input.map(e=>e.cryptoService),onError:{actions:"assignErrorFromEvent"},onDone:{actions:c(({event:t})=>t.output.map(e=>({raise:"success",assign:{sessionKeypair:e}})))}}},ParseStream:{entry:p({intermediateValue:{requiredUserInteraction:u.None,step:d.ParseStream}}),on:{success:"CheckApplicationStreamExist",error:"Error"},invoke:{id:"parseStream",src:"parseStream",input:({context:t})=>t.input.chain(e=>l({seedBlock:()=>s(e.trustchain.getRootStream().chain(r=>r.parse().toMaybe()).extract()?.[0],"Missing seed block to parse"),applicationStream:()=>s(e.trustchain.getAppStream(e.appId).extract(),"Missing application stream to parse")})),onError:{actions:"assignErrorFromEvent"},onDone:{actions:c(({event:t})=>t.output.map(()=>({raise:"success"})))}}},CheckApplicationStreamExist:{always:[{target:"AddToNewStream",guard:"isTustchainEmpty"},{target:"AddToExistingStream"}]},AddToExistingStream:{entry:p({intermediateValue:{requiredUserInteraction:S.AddMember,step:d.AddMember}}),on:{success:"Success",error:"Error"},invoke:{id:"signBlock",src:"signBlock",input:({context:t})=>t.input.chain(e=>{const r=e.trustchain.getAppStream(e.appId);return l({cryptoService:e.cryptoService,lkrpDataSource:e.lkrpDataSource,trustchainId:e.trustchain.getId(),jwt:e.jwt,clientName:e.clientName,sessionKeypair:()=>t._internalState.chain(({sessionKeypair:n})=>s(n,"Missing session
|
|
1
|
+
import{hexaStringToBuffer as A,UserInteractionRequired as u,XStateDeviceAction as D}from"@ledgerhq/device-management-kit";import{EitherAsync as m,Left as T,Right as E}from"purify-ts";import{assign as p,fromPromise as h,setup as g}from"xstate";import{AddToTrustchainDAState as S,AddToTrustchaineDAStep as d}from"../../../api/app-binder/AddToTrustchainDeviceActionTypes";import{LKRPTrustchainNotReady as k,LKRPUnknownError as I}from"../../../api/model/Errors";import{InitTask as v}from"../../app-binder/task/InitTask";import{ParseStreamToDeviceTask as f}from"../../app-binder/task/ParseStreamToDeviceTask";import{SignBlockTask as b}from"../../app-binder/task/SignBlockTask";import{eitherSeqRecord as l}from"../../utils/eitherSeqRecord";import{required as s}from"../../utils/required";import{raiseAndAssign as c}from"./utils/raiseAndAssign";class U extends D{makeStateMachine(o){const{initCommand:i,parseStream:a,signBlock:y}=this.extractDependencies(o);return g({types:{input:{},context:{},output:{}},actors:{initCommand:h(i),parseStream:h(a),signBlock:h(y)},actions:{assignErrorFromEvent:c(({event:t})=>T(new I(String(t.error))))},guards:{isTustchainEmpty:({context:t})=>t.input.toMaybe().chain(e=>e.trustchain.getAppStream(e.appId)).chain(e=>e.parse().toMaybe()).map(e=>e.length===0).orDefault(!0)}}).createMachine({id:"AddToTrustchainDeviceAction",context:({input:t})=>({input:t,intermediateValue:{requiredUserInteraction:u.None},_internalState:E({sessionKeypair:null})}),initial:"InitSession",states:{InitSession:{entry:p({intermediateValue:{requiredUserInteraction:u.None,step:d.Initialize}}),on:{success:"ParseStream",error:"Error"},invoke:{id:"initCommand",src:"initCommand",input:({context:t})=>t.input.map(e=>e.cryptoService),onError:{actions:"assignErrorFromEvent"},onDone:{actions:c(({event:t})=>t.output.map(e=>({raise:"success",assign:{sessionKeypair:e}})))}}},ParseStream:{entry:p({intermediateValue:{requiredUserInteraction:u.None,step:d.ParseStream}}),on:{success:"CheckApplicationStreamExist",error:"Error"},invoke:{id:"parseStream",src:"parseStream",input:({context:t})=>t.input.chain(e=>l({seedBlock:()=>s(e.trustchain.getRootStream().chain(r=>r.parse().toMaybe()).extract()?.[0],"Missing seed block to parse"),applicationStream:()=>s(e.trustchain.getAppStream(e.appId).extract(),"Missing application stream to parse")})),onError:{actions:"assignErrorFromEvent"},onDone:{actions:c(({event:t})=>t.output.map(()=>({raise:"success"})))}}},CheckApplicationStreamExist:{always:[{target:"AddToNewStream",guard:"isTustchainEmpty"},{target:"AddToExistingStream"}]},AddToExistingStream:{entry:p({intermediateValue:{requiredUserInteraction:S.AddMember,step:d.AddMember}}),on:{success:"Success",error:"Error"},invoke:{id:"signBlock",src:"signBlock",input:({context:t})=>t.input.chain(e=>{const r=e.trustchain.getAppStream(e.appId);return l({cryptoService:e.cryptoService,lkrpDataSource:e.lkrpDataSource,trustchainId:e.trustchain.getId(),jwt:e.jwt,clientName:e.clientName,sessionKeypair:()=>t._internalState.chain(({sessionKeypair:n})=>s(n,"Missing session keyPair")),path:()=>s(r.chain(n=>n.getPath()).extract(),"Missing application path"),parent:()=>s(r.chain(n=>n.parse().toMaybe()).chainNullable(n=>n.at(-1)?.hash()).chainNullable(A).extract(),"Missing parent block"),blockFlow:{type:"addMember",data:{name:e.clientName,publicKey:e.keyPair.getPublicKey(),permissions:e.permissions}}})}),onError:{actions:"assignErrorFromEvent"},onDone:{actions:c(({event:t})=>t.output.map(()=>({raise:"success"})))}}},AddToNewStream:{entry:p({intermediateValue:{requiredUserInteraction:S.AddMember,step:d.AddMember}}),on:{success:"Success",error:"Error"},invoke:{id:"signBlock",src:"signBlock",input:({context:t})=>t.input.chain(e=>l({lkrpDataSource:e.lkrpDataSource,trustchainId:e.trustchain.getId(),jwt:e.jwt,clientName:e.clientName,sessionKeypair:()=>t._internalState.chain(({sessionKeypair:r})=>s(r,"Missing session keyPair")),path:`m/0'/${e.appId}'/0'`,parent:()=>s(e.trustchain.getRootStream().chain(r=>r.parse().toMaybe()).chainNullable(r=>r[0]?.hash()).chainNullable(A).extract(),"Missing init block"),blockFlow:{type:"derive",data:{name:e.clientName,publicKey:e.keyPair.getPublicKey(),permissions:e.permissions}}}).chain(()=>T(new k))),onError:{actions:"assignErrorFromEvent"},onDone:{actions:c(({event:t})=>t.output.map(()=>({raise:"success"})))}}},Success:{type:"final"},Error:{type:"final"}},output:({context:t})=>t._internalState.map(e=>{})})}extractDependencies(o){return{initCommand:async i=>m.liftEither(i.input).chain(a=>new v(o,a).run()).run(),parseStream:async i=>m.liftEither(i.input).chain(a=>new f(o).run(a)).run(),signBlock:i=>m.liftEither(i.input).chain(a=>new b(o,a.cryptoService).run(a)).run()}}}export{U as AddToTrustchainDeviceAction};
|
|
2
2
|
//# sourceMappingURL=AddToTrustchainDeviceAction.js.map
|