@ledgerhq/device-management-kit 0.0.0-develop-20260707003031 → 0.0.0-develop-20260708131309

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.
Files changed (58) hide show
  1. package/lib/cjs/package.json +1 -1
  2. package/lib/cjs/src/api/index.js +1 -1
  3. package/lib/cjs/src/api/index.js.map +3 -3
  4. package/lib/esm/package.json +1 -1
  5. package/lib/esm/src/api/index.js +1 -1
  6. package/lib/esm/src/api/index.js.map +3 -3
  7. package/lib/types/src/api/index.d.ts +0 -4
  8. package/lib/types/src/api/index.d.ts.map +1 -1
  9. package/lib/types/tsconfig.prod.tsbuildinfo +1 -1
  10. package/package.json +3 -3
  11. package/lib/cjs/src/api/command/os/BackupStorageCommand.js +0 -2
  12. package/lib/cjs/src/api/command/os/BackupStorageCommand.js.map +0 -7
  13. package/lib/cjs/src/api/command/os/BackupStorageCommand.test.js +0 -2
  14. package/lib/cjs/src/api/command/os/BackupStorageCommand.test.js.map +0 -7
  15. package/lib/cjs/src/api/command/os/GetAppStorageInfoCommand.js +0 -2
  16. package/lib/cjs/src/api/command/os/GetAppStorageInfoCommand.js.map +0 -7
  17. package/lib/cjs/src/api/command/os/GetAppStorageInfoCommand.test.js +0 -2
  18. package/lib/cjs/src/api/command/os/GetAppStorageInfoCommand.test.js.map +0 -7
  19. package/lib/cjs/src/api/command/os/InitRestoreAppStorageCommand.js +0 -2
  20. package/lib/cjs/src/api/command/os/InitRestoreAppStorageCommand.js.map +0 -7
  21. package/lib/cjs/src/api/command/os/InitRestoreAppStorageCommand.test.js +0 -2
  22. package/lib/cjs/src/api/command/os/InitRestoreAppStorageCommand.test.js.map +0 -7
  23. package/lib/cjs/src/api/device-action/task/BackupAppStorageTask.js +0 -2
  24. package/lib/cjs/src/api/device-action/task/BackupAppStorageTask.js.map +0 -7
  25. package/lib/cjs/src/api/device-action/task/BackupAppStorageTask.test.js +0 -2
  26. package/lib/cjs/src/api/device-action/task/BackupAppStorageTask.test.js.map +0 -7
  27. package/lib/esm/src/api/command/os/BackupStorageCommand.js +0 -2
  28. package/lib/esm/src/api/command/os/BackupStorageCommand.js.map +0 -7
  29. package/lib/esm/src/api/command/os/BackupStorageCommand.test.js +0 -2
  30. package/lib/esm/src/api/command/os/BackupStorageCommand.test.js.map +0 -7
  31. package/lib/esm/src/api/command/os/GetAppStorageInfoCommand.js +0 -2
  32. package/lib/esm/src/api/command/os/GetAppStorageInfoCommand.js.map +0 -7
  33. package/lib/esm/src/api/command/os/GetAppStorageInfoCommand.test.js +0 -2
  34. package/lib/esm/src/api/command/os/GetAppStorageInfoCommand.test.js.map +0 -7
  35. package/lib/esm/src/api/command/os/InitRestoreAppStorageCommand.js +0 -2
  36. package/lib/esm/src/api/command/os/InitRestoreAppStorageCommand.js.map +0 -7
  37. package/lib/esm/src/api/command/os/InitRestoreAppStorageCommand.test.js +0 -2
  38. package/lib/esm/src/api/command/os/InitRestoreAppStorageCommand.test.js.map +0 -7
  39. package/lib/esm/src/api/device-action/task/BackupAppStorageTask.js +0 -2
  40. package/lib/esm/src/api/device-action/task/BackupAppStorageTask.js.map +0 -7
  41. package/lib/esm/src/api/device-action/task/BackupAppStorageTask.test.js +0 -2
  42. package/lib/esm/src/api/device-action/task/BackupAppStorageTask.test.js.map +0 -7
  43. package/lib/types/src/api/command/os/BackupStorageCommand.d.ts +0 -23
  44. package/lib/types/src/api/command/os/BackupStorageCommand.d.ts.map +0 -1
  45. package/lib/types/src/api/command/os/BackupStorageCommand.test.d.ts +0 -2
  46. package/lib/types/src/api/command/os/BackupStorageCommand.test.d.ts.map +0 -1
  47. package/lib/types/src/api/command/os/GetAppStorageInfoCommand.d.ts +0 -31
  48. package/lib/types/src/api/command/os/GetAppStorageInfoCommand.d.ts.map +0 -1
  49. package/lib/types/src/api/command/os/GetAppStorageInfoCommand.test.d.ts +0 -2
  50. package/lib/types/src/api/command/os/GetAppStorageInfoCommand.test.d.ts.map +0 -1
  51. package/lib/types/src/api/command/os/InitRestoreAppStorageCommand.d.ts +0 -25
  52. package/lib/types/src/api/command/os/InitRestoreAppStorageCommand.d.ts.map +0 -1
  53. package/lib/types/src/api/command/os/InitRestoreAppStorageCommand.test.d.ts +0 -2
  54. package/lib/types/src/api/command/os/InitRestoreAppStorageCommand.test.d.ts.map +0 -1
  55. package/lib/types/src/api/device-action/task/BackupAppStorageTask.d.ts +0 -23
  56. package/lib/types/src/api/device-action/task/BackupAppStorageTask.d.ts.map +0 -1
  57. package/lib/types/src/api/device-action/task/BackupAppStorageTask.test.d.ts +0 -2
  58. package/lib/types/src/api/device-action/task/BackupAppStorageTask.test.d.ts.map +0 -1
package/package.json CHANGED
@@ -18,10 +18,10 @@
18
18
  "@types/ws": "^8.5.14",
19
19
  "rxjs": "7.8.2",
20
20
  "ts-node": "10.9.2",
21
- "@ledgerhq/ldmk-tool": "0.0.1",
22
- "@ledgerhq/tsconfig-dsdk": "1.0.1",
23
21
  "@ledgerhq/eslint-config-dsdk": "0.0.2",
22
+ "@ledgerhq/ldmk-tool": "0.0.1",
24
23
  "@ledgerhq/prettier-config-dsdk": "0.0.2",
24
+ "@ledgerhq/tsconfig-dsdk": "1.0.1",
25
25
  "@ledgerhq/vitest-config-dmk": "0.0.0"
26
26
  },
27
27
  "exports": {
@@ -45,7 +45,7 @@
45
45
  "type": "git",
46
46
  "url": "https://github.com/LedgerHQ/device-sdk-ts.git"
47
47
  },
48
- "version": "0.0.0-develop-20260707003031",
48
+ "version": "0.0.0-develop-20260708131309",
49
49
  "scripts": {
50
50
  "build": "pnpm ldmk-tool build --entryPoints index.ts,src/**/*.ts --tsconfig tsconfig.prod.json",
51
51
  "dev": "concurrently \"pnpm watch:builds\" \"pnpm watch:types\"",
@@ -1,2 +0,0 @@
1
- "use strict";var n=Object.defineProperty;var k=Object.getOwnPropertyDescriptor;var S=Object.getOwnPropertyNames;var f=Object.prototype.hasOwnProperty;var E=(e,r)=>{for(var a in r)n(e,a,{get:r[a],enumerable:!0})},y=(e,r,a,t)=>{if(r&&typeof r=="object"||typeof r=="function")for(let o of S(r))!f.call(e,o)&&o!==a&&n(e,o,{get:()=>r[o],enumerable:!(t=k(r,o))||t.enumerable});return e};var B=e=>y(n({},"__esModule",{value:!0}),e);var h={};E(h,{BACKUP_STORAGE_ERRORS:()=>d,BackupStorageCommand:()=>x,BackupStorageCommandError:()=>l});module.exports=B(h);var p=require("../../apdu/utils/ApduBuilder"),s=require("../../apdu/utils/ApduParser"),c=require("../../command/Errors"),m=require("../../command/model/CommandResult"),u=require("../../command/utils/CommandErrors"),i=require("../../command/utils/CommandUtils"),C=require("../../command/utils/GlobalCommandError"),g=require("../../Error");const d={5123:{message:"Invalid context. Get info must be called."},5419:{message:"Failed to generate AES key."},"541a":{message:"Internal error, crypto operation failed."},"541b":{message:"Internal error, failed to compute AES CMAC."},"541c":{message:"Failed to encrypt the app storage backup."},"622f":{message:"Invalid device state, recovery mode."},6642:{message:"Invalid backup state, backup already performed."}};class l extends g.DeviceExchangeError{constructor(r){super({tag:"BackupStorageCommandError",...r})}}class x{name="BackupStorage";header={cla:224,ins:107,p1:0,p2:0};getApdu(){return new p.ApduBuilder(this.header).build()}parseResponse(r){const a=new s.ApduParser(r);if(!i.CommandUtils.isSuccessResponse(r)){const o=a.encodeToHexaString(r.statusCode);return(0,u.isCommandErrorCode)(o,d)?(0,m.CommandResultFactory)({error:new l({...d[o],errorCode:o})}):(0,m.CommandResultFactory)({error:C.GlobalCommandErrorHandler.handle(r)})}const t=a.extractFieldByLength(a.getUnparsedRemainingLength());return t===void 0?(0,m.CommandResultFactory)({error:new c.InvalidStatusWordError("Failed to extract app storage data chunk")}):(0,m.CommandResultFactory)({data:{chunkData:t,chunkSize:t.length}})}}0&&(module.exports={BACKUP_STORAGE_ERRORS,BackupStorageCommand,BackupStorageCommandError});
2
- //# sourceMappingURL=BackupStorageCommand.js.map
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../../../../../src/api/command/os/BackupStorageCommand.ts"],
4
- "sourcesContent": ["import { type Apdu } from \"@api/apdu/model/Apdu\";\nimport { ApduBuilder } from \"@api/apdu/utils/ApduBuilder\";\nimport { ApduParser } from \"@api/apdu/utils/ApduParser\";\nimport { type Command } from \"@api/command/Command\";\nimport { InvalidStatusWordError } from \"@api/command/Errors\";\nimport {\n type CommandResult,\n CommandResultFactory,\n} from \"@api/command/model/CommandResult\";\nimport {\n type CommandErrors,\n isCommandErrorCode,\n} from \"@api/command/utils/CommandErrors\";\nimport { CommandUtils } from \"@api/command/utils/CommandUtils\";\nimport { GlobalCommandErrorHandler } from \"@api/command/utils/GlobalCommandError\";\nimport { type ApduResponse } from \"@api/device-session/ApduResponse\";\nimport { type CommandErrorArgs, DeviceExchangeError } from \"@api/Error\";\n\nexport type BackupStorageCommandResponse = {\n chunkData: Uint8Array;\n chunkSize: number;\n};\n\nexport type BackupStorageCommandErrorCodes =\n | \"5123\"\n | \"5419\"\n | \"541a\"\n | \"541b\"\n | \"541c\"\n | \"622f\"\n | \"6642\";\n\nexport const BACKUP_STORAGE_ERRORS: CommandErrors<BackupStorageCommandErrorCodes> =\n {\n \"5123\": { message: \"Invalid context. Get info must be called.\" },\n \"5419\": { message: \"Failed to generate AES key.\" },\n \"541a\": { message: \"Internal error, crypto operation failed.\" },\n \"541b\": { message: \"Internal error, failed to compute AES CMAC.\" },\n \"541c\": { message: \"Failed to encrypt the app storage backup.\" },\n \"622f\": { message: \"Invalid device state, recovery mode.\" },\n \"6642\": { message: \"Invalid backup state, backup already performed.\" },\n };\n\nexport class BackupStorageCommandError extends DeviceExchangeError<BackupStorageCommandErrorCodes> {\n constructor(args: CommandErrorArgs<BackupStorageCommandErrorCodes>) {\n super({ tag: \"BackupStorageCommandError\", ...args });\n }\n}\n\nexport type BackupStorageCommandResult = CommandResult<\n BackupStorageCommandResponse,\n BackupStorageCommandErrorCodes\n>;\n\nexport class BackupStorageCommand\n implements\n Command<BackupStorageCommandResponse, void, BackupStorageCommandErrorCodes>\n{\n readonly name = \"BackupStorage\";\n\n private readonly header = {\n cla: 0xe0,\n ins: 0x6b,\n p1: 0x00,\n p2: 0x00,\n };\n\n getApdu(): Apdu {\n return new ApduBuilder(this.header).build();\n }\n\n parseResponse(apduResponse: ApduResponse): BackupStorageCommandResult {\n const parser = new ApduParser(apduResponse);\n\n if (!CommandUtils.isSuccessResponse(apduResponse)) {\n const errorCode = parser.encodeToHexaString(apduResponse.statusCode);\n if (isCommandErrorCode(errorCode, BACKUP_STORAGE_ERRORS)) {\n return CommandResultFactory({\n error: new BackupStorageCommandError({\n ...BACKUP_STORAGE_ERRORS[errorCode],\n errorCode,\n }),\n });\n }\n return CommandResultFactory({\n error: GlobalCommandErrorHandler.handle(apduResponse),\n });\n }\n\n const appStorageDataChunk = parser.extractFieldByLength(\n parser.getUnparsedRemainingLength(),\n );\n\n if (appStorageDataChunk === undefined) {\n return CommandResultFactory({\n error: new InvalidStatusWordError(\n \"Failed to extract app storage data chunk\",\n ),\n });\n }\n\n return CommandResultFactory({\n data: {\n chunkData: appStorageDataChunk,\n chunkSize: appStorageDataChunk.length,\n },\n });\n }\n}\n"],
5
- "mappings": "yaAAA,IAAAA,EAAA,GAAAC,EAAAD,EAAA,2BAAAE,EAAA,yBAAAC,EAAA,8BAAAC,IAAA,eAAAC,EAAAL,GACA,IAAAM,EAA4B,uCAC5BC,EAA2B,sCAE3BC,EAAuC,+BACvCC,EAGO,4CACPC,EAGO,4CACPC,EAA6B,2CAC7BC,EAA0C,iDAE1CC,EAA2D,sBAgBpD,MAAMX,EACX,CACE,KAAQ,CAAE,QAAS,2CAA4C,EAC/D,KAAQ,CAAE,QAAS,6BAA8B,EACjD,OAAQ,CAAE,QAAS,0CAA2C,EAC9D,OAAQ,CAAE,QAAS,6CAA8C,EACjE,OAAQ,CAAE,QAAS,2CAA4C,EAC/D,OAAQ,CAAE,QAAS,sCAAuC,EAC1D,KAAQ,CAAE,QAAS,iDAAkD,CACvE,EAEK,MAAME,UAAkC,qBAAoD,CACjG,YAAYU,EAAwD,CAClE,MAAM,CAAE,IAAK,4BAA6B,GAAGA,CAAK,CAAC,CACrD,CACF,CAOO,MAAMX,CAGb,CACW,KAAO,gBAEC,OAAS,CACxB,IAAK,IACL,IAAK,IACL,GAAI,EACJ,GAAI,CACN,EAEA,SAAgB,CACd,OAAO,IAAI,cAAY,KAAK,MAAM,EAAE,MAAM,CAC5C,CAEA,cAAcY,EAAwD,CACpE,MAAMC,EAAS,IAAI,aAAWD,CAAY,EAE1C,GAAI,CAAC,eAAa,kBAAkBA,CAAY,EAAG,CACjD,MAAME,EAAYD,EAAO,mBAAmBD,EAAa,UAAU,EACnE,SAAI,sBAAmBE,EAAWf,CAAqB,KAC9C,wBAAqB,CAC1B,MAAO,IAAIE,EAA0B,CACnC,GAAGF,EAAsBe,CAAS,EAClC,UAAAA,CACF,CAAC,CACH,CAAC,KAEI,wBAAqB,CAC1B,MAAO,4BAA0B,OAAOF,CAAY,CACtD,CAAC,CACH,CAEA,MAAMG,EAAsBF,EAAO,qBACjCA,EAAO,2BAA2B,CACpC,EAEA,OAAIE,IAAwB,UACnB,wBAAqB,CAC1B,MAAO,IAAI,yBACT,0CACF,CACF,CAAC,KAGI,wBAAqB,CAC1B,KAAM,CACJ,UAAWA,EACX,UAAWA,EAAoB,MACjC,CACF,CAAC,CACH,CACF",
6
- "names": ["BackupStorageCommand_exports", "__export", "BACKUP_STORAGE_ERRORS", "BackupStorageCommand", "BackupStorageCommandError", "__toCommonJS", "import_ApduBuilder", "import_ApduParser", "import_Errors", "import_CommandResult", "import_CommandErrors", "import_CommandUtils", "import_GlobalCommandError", "import_Error", "args", "apduResponse", "parser", "errorCode", "appStorageDataChunk"]
7
- }
@@ -1,2 +0,0 @@
1
- "use strict";var s=require("../../command/model/CommandResult"),a=require("../../command/os/BackupStorageCommand"),r=require("../../device-session/ApduResponse");describe("BackupStorageCommand",()=>{describe("Name",()=>{it("name should be 'BackupStorage'",()=>{const e=new a.BackupStorageCommand().name;expect(e).toBe("BackupStorage")})}),describe("Command",()=>{it("should return the correct APDU for backing up app storage",()=>{const t=Uint8Array.from([224,107,0,0,0]),e=new a.BackupStorageCommand().getApdu();expect(e.getRawApdu()).toEqual(t)})}),describe("Success response",()=>{it("should return the app storage data chunk as a hex string",()=>{const t=Uint8Array.from([144,0]),e=new r.ApduResponse({statusCode:t,data:Uint8Array.from([171,205,239,1,35])}),o=new a.BackupStorageCommand().parseResponse(e);expect((0,s.isSuccessCommandResult)(o)).toBe(!0),expect(o).toEqual({data:{chunkData:Uint8Array.from([171,205,239,1,35]),chunkSize:5},status:"SUCCESS"})})}),describe("Error response",()=>{it.each([{description:"get info was not called first",statusCode:[81,35],expectedMessage:"Invalid context. Get info must be called."},{description:"AES key generation fails",statusCode:[84,25],expectedMessage:"Failed to generate AES key."},{description:"crypto operation fails",statusCode:[84,26],expectedMessage:"Internal error, crypto operation failed."},{description:"AES CMAC computation fails",statusCode:[84,27],expectedMessage:"Internal error, failed to compute AES CMAC."},{description:"encryption of backup fails",statusCode:[84,28],expectedMessage:"Failed to encrypt the app storage backup."},{description:"device is in recovery mode",statusCode:[98,47],expectedMessage:"Invalid device state, recovery mode."},{description:"backup was already performed",statusCode:[102,66],expectedMessage:"Invalid backup state, backup already performed."},{description:"error code is not specific to BackupStorageCommand (global error)",statusCode:[85,21],expectedMessage:"Device is locked."}])("should return error when $description",({statusCode:t,expectedMessage:e})=>{const o=new r.ApduResponse({statusCode:Uint8Array.from(t),data:new Uint8Array([])}),c=new a.BackupStorageCommand().parseResponse(o);expect((0,s.isSuccessCommandResult)(c)).toBe(!1),expect(c.error.message).toBe(e)})})});
2
- //# sourceMappingURL=BackupStorageCommand.test.js.map
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../../../../../src/api/command/os/BackupStorageCommand.test.ts"],
4
- "sourcesContent": ["import { isSuccessCommandResult } from \"@api/command/model/CommandResult\";\nimport { BackupStorageCommand } from \"@api/command/os/BackupStorageCommand\";\nimport { ApduResponse } from \"@api/device-session/ApduResponse\";\n\ndescribe(\"BackupStorageCommand\", () => {\n describe(\"Name\", () => {\n it(\"name should be 'BackupStorage'\", () => {\n // ARRANGE\n const command = new BackupStorageCommand();\n\n // ACT\n const name = command.name;\n\n // ASSERT\n expect(name).toBe(\"BackupStorage\");\n });\n });\n\n describe(\"Command\", () => {\n it(\"should return the correct APDU for backing up app storage\", () => {\n // ARRANGE\n const expectedApdu = Uint8Array.from([0xe0, 0x6b, 0x00, 0x00, 0x00]);\n\n // ACT\n const apdu = new BackupStorageCommand().getApdu();\n\n // ASSERT\n expect(apdu.getRawApdu()).toEqual(expectedApdu);\n });\n });\n\n describe(\"Success response\", () => {\n it(\"should return the app storage data chunk as a hex string\", () => {\n // ARRANGE\n const statusCode = Uint8Array.from([0x90, 0x00]);\n const response = new ApduResponse({\n statusCode,\n data: Uint8Array.from([0xab, 0xcd, 0xef, 0x01, 0x23]),\n });\n\n // ACT\n const result = new BackupStorageCommand().parseResponse(response);\n\n // ASSERT\n expect(isSuccessCommandResult(result)).toBe(true);\n expect(result).toEqual({\n data: {\n chunkData: Uint8Array.from([0xab, 0xcd, 0xef, 0x01, 0x23]),\n chunkSize: 5,\n },\n status: \"SUCCESS\",\n });\n });\n });\n\n describe(\"Error response\", () => {\n it.each([\n {\n description: \"get info was not called first\",\n statusCode: [0x51, 0x23],\n expectedMessage: \"Invalid context. Get info must be called.\",\n },\n {\n description: \"AES key generation fails\",\n statusCode: [0x54, 0x19],\n expectedMessage: \"Failed to generate AES key.\",\n },\n {\n description: \"crypto operation fails\",\n statusCode: [0x54, 0x1a],\n expectedMessage: \"Internal error, crypto operation failed.\",\n },\n {\n description: \"AES CMAC computation fails\",\n statusCode: [0x54, 0x1b],\n expectedMessage: \"Internal error, failed to compute AES CMAC.\",\n },\n {\n description: \"encryption of backup fails\",\n statusCode: [0x54, 0x1c],\n expectedMessage: \"Failed to encrypt the app storage backup.\",\n },\n {\n description: \"device is in recovery mode\",\n statusCode: [0x62, 0x2f],\n expectedMessage: \"Invalid device state, recovery mode.\",\n },\n {\n description: \"backup was already performed\",\n statusCode: [0x66, 0x42],\n expectedMessage: \"Invalid backup state, backup already performed.\",\n },\n {\n description:\n \"error code is not specific to BackupStorageCommand (global error)\",\n statusCode: [0x55, 0x15],\n expectedMessage: \"Device is locked.\",\n },\n ])(\n \"should return error when $description\",\n ({ statusCode, expectedMessage }) => {\n // ARRANGE\n const response = new ApduResponse({\n statusCode: Uint8Array.from(statusCode),\n data: new Uint8Array([]),\n });\n\n // ACT\n const result = new BackupStorageCommand().parseResponse(response);\n\n // ASSERT\n expect(isSuccessCommandResult(result)).toBe(false);\n expect((result as unknown as { error: Error }).error.message).toBe(\n expectedMessage,\n );\n },\n );\n });\n});\n"],
5
- "mappings": "aAAA,IAAAA,EAAuC,4CACvCC,EAAqC,gDACrCC,EAA6B,4CAE7B,SAAS,uBAAwB,IAAM,CACrC,SAAS,OAAQ,IAAM,CACrB,GAAG,iCAAkC,IAAM,CAKzC,MAAMC,EAHU,IAAI,uBAAqB,EAGpB,KAGrB,OAAOA,CAAI,EAAE,KAAK,eAAe,CACnC,CAAC,CACH,CAAC,EAED,SAAS,UAAW,IAAM,CACxB,GAAG,4DAA6D,IAAM,CAEpE,MAAMC,EAAe,WAAW,KAAK,CAAC,IAAM,IAAM,EAAM,EAAM,CAAI,CAAC,EAG7DC,EAAO,IAAI,uBAAqB,EAAE,QAAQ,EAGhD,OAAOA,EAAK,WAAW,CAAC,EAAE,QAAQD,CAAY,CAChD,CAAC,CACH,CAAC,EAED,SAAS,mBAAoB,IAAM,CACjC,GAAG,2DAA4D,IAAM,CAEnE,MAAME,EAAa,WAAW,KAAK,CAAC,IAAM,CAAI,CAAC,EACzCC,EAAW,IAAI,eAAa,CAChC,WAAAD,EACA,KAAM,WAAW,KAAK,CAAC,IAAM,IAAM,IAAM,EAAM,EAAI,CAAC,CACtD,CAAC,EAGKE,EAAS,IAAI,uBAAqB,EAAE,cAAcD,CAAQ,EAGhE,UAAO,0BAAuBC,CAAM,CAAC,EAAE,KAAK,EAAI,EAChD,OAAOA,CAAM,EAAE,QAAQ,CACrB,KAAM,CACJ,UAAW,WAAW,KAAK,CAAC,IAAM,IAAM,IAAM,EAAM,EAAI,CAAC,EACzD,UAAW,CACb,EACA,OAAQ,SACV,CAAC,CACH,CAAC,CACH,CAAC,EAED,SAAS,iBAAkB,IAAM,CAC/B,GAAG,KAAK,CACN,CACE,YAAa,gCACb,WAAY,CAAC,GAAM,EAAI,EACvB,gBAAiB,2CACnB,EACA,CACE,YAAa,2BACb,WAAY,CAAC,GAAM,EAAI,EACvB,gBAAiB,6BACnB,EACA,CACE,YAAa,yBACb,WAAY,CAAC,GAAM,EAAI,EACvB,gBAAiB,0CACnB,EACA,CACE,YAAa,6BACb,WAAY,CAAC,GAAM,EAAI,EACvB,gBAAiB,6CACnB,EACA,CACE,YAAa,6BACb,WAAY,CAAC,GAAM,EAAI,EACvB,gBAAiB,2CACnB,EACA,CACE,YAAa,6BACb,WAAY,CAAC,GAAM,EAAI,EACvB,gBAAiB,sCACnB,EACA,CACE,YAAa,+BACb,WAAY,CAAC,IAAM,EAAI,EACvB,gBAAiB,iDACnB,EACA,CACE,YACE,oEACF,WAAY,CAAC,GAAM,EAAI,EACvB,gBAAiB,mBACnB,CACF,CAAC,EACC,wCACA,CAAC,CAAE,WAAAF,EAAY,gBAAAG,CAAgB,IAAM,CAEnC,MAAMF,EAAW,IAAI,eAAa,CAChC,WAAY,WAAW,KAAKD,CAAU,EACtC,KAAM,IAAI,WAAW,CAAC,CAAC,CACzB,CAAC,EAGKE,EAAS,IAAI,uBAAqB,EAAE,cAAcD,CAAQ,EAGhE,UAAO,0BAAuBC,CAAM,CAAC,EAAE,KAAK,EAAK,EACjD,OAAQA,EAAuC,MAAM,OAAO,EAAE,KAC5DC,CACF,CACF,CACF,CACF,CAAC,CACH,CAAC",
6
- "names": ["import_CommandResult", "import_BackupStorageCommand", "import_ApduResponse", "name", "expectedApdu", "apdu", "statusCode", "response", "result", "expectedMessage"]
7
- }
@@ -1,2 +0,0 @@
1
- "use strict";var i=Object.defineProperty;var G=Object.getOwnPropertyDescriptor;var E=Object.getOwnPropertyNames;var h=Object.prototype.hasOwnProperty;var y=(o,e)=>{for(var r in e)i(o,r,{get:e[r],enumerable:!0})},R=(o,e,r,n)=>{if(e&&typeof e=="object"||typeof e=="function")for(let t of E(e))!h.call(o,t)&&t!==r&&i(o,t,{get:()=>e[t],enumerable:!(n=G(e,t))||n.enumerable});return o};var v=o=>R(i({},"__esModule",{value:!0}),o);var b={};y(b,{GET_APP_STORAGE_INFO_ERRORS:()=>d,GetAppStorageInfoCommand:()=>w,GetAppStorageInfoCommandError:()=>x});module.exports=v(b);var S=require("../../apdu/utils/ApduBuilder"),l=require("../../apdu/utils/ApduParser"),s=require("../../command/Errors"),a=require("../../command/model/CommandResult"),A=require("../../command/utils/CommandErrors"),c=require("../../command/utils/CommandUtils"),u=require("../../command/utils/GlobalCommandError"),I=require("../../Error");const d={5123:{message:"Application not found."},"662f":{message:"Device is in recovery mode."},"670a":{message:"Invalid application name length, two chars minimum."}};class x extends I.DeviceExchangeError{constructor(e){super({tag:"GetAppStorageInfoCommandError",...e})}}class w{constructor(e){this.args=e}name="GetAppStorageInfo";header={cla:224,ins:106,p1:0,p2:0};getApdu(){const{appName:e}=this.args;return new S.ApduBuilder(this.header).addAsciiStringToData(e).build()}parseResponse(e){const r=new l.ApduParser(e);if(!c.CommandUtils.isSuccessResponse(e)){const p=r.encodeToHexaString(e.statusCode);return(0,A.isCommandErrorCode)(p,d)?(0,a.CommandResultFactory)({error:new x({...d[p],errorCode:p})}):(0,a.CommandResultFactory)({error:u.GlobalCommandErrorHandler.handle(e)})}const n=r.extract32BitUInt();if(n===void 0)return(0,a.CommandResultFactory)({error:new s.InvalidStatusWordError("Failed to extract app storage size")});let t="",g=!1,f=!1,C="";if(n!==0){const p=r.extract32BitUInt();if(p===void 0)return(0,a.CommandResultFactory)({error:new s.InvalidStatusWordError("Failed to extract app storage version")});t=p.toString(16);const m=r.extract16BitUInt();if(m===void 0)return(0,a.CommandResultFactory)({error:new s.InvalidStatusWordError("Failed to extract app storage properties")});g=(m&1)===1,f=(m&2)===2,C=r.encodeToHexaString(r.extractFieldByLength(32))}return(0,a.CommandResultFactory)({data:{storageSize:n,storageVersion:t,hasSettings:g,hasData:f,storageHash:C}})}}0&&(module.exports={GET_APP_STORAGE_INFO_ERRORS,GetAppStorageInfoCommand,GetAppStorageInfoCommandError});
2
- //# sourceMappingURL=GetAppStorageInfoCommand.js.map
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../../../../../src/api/command/os/GetAppStorageInfoCommand.ts"],
4
- "sourcesContent": ["import { type Apdu } from \"@api/apdu/model/Apdu\";\nimport { ApduBuilder } from \"@api/apdu/utils/ApduBuilder\";\nimport { ApduParser } from \"@api/apdu/utils/ApduParser\";\nimport { type Command } from \"@api/command/Command\";\nimport { InvalidStatusWordError } from \"@api/command/Errors\";\nimport {\n type CommandResult,\n CommandResultFactory,\n} from \"@api/command/model/CommandResult\";\nimport { isCommandErrorCode } from \"@api/command/utils/CommandErrors\";\nimport { type CommandErrors } from \"@api/command/utils/CommandErrors\";\nimport { CommandUtils } from \"@api/command/utils/CommandUtils\";\nimport { GlobalCommandErrorHandler } from \"@api/command/utils/GlobalCommandError\";\nimport { type ApduResponse } from \"@api/device-session/ApduResponse\";\nimport { type CommandErrorArgs, DeviceExchangeError } from \"@api/Error\";\n\nexport type GetAppStorageInfoCommandArgs = {\n appName: string;\n};\n\nexport type GetAppStorageInfoCommandResponse = {\n storageSize: number;\n storageVersion: string;\n hasSettings: boolean;\n hasData: boolean;\n storageHash: string;\n};\n\nexport type GetAppStorageInfoCommandErrorCodes = \"5123\" | \"662f\" | \"670a\";\n\nexport const GET_APP_STORAGE_INFO_ERRORS: CommandErrors<GetAppStorageInfoCommandErrorCodes> =\n {\n \"5123\": { message: \"Application not found.\" },\n \"662f\": { message: \"Device is in recovery mode.\" },\n \"670a\": { message: \"Invalid application name length, two chars minimum.\" },\n };\n\nexport class GetAppStorageInfoCommandError extends DeviceExchangeError<GetAppStorageInfoCommandErrorCodes> {\n constructor(args: CommandErrorArgs<GetAppStorageInfoCommandErrorCodes>) {\n super({ tag: \"GetAppStorageInfoCommandError\", ...args });\n }\n}\n\nexport type GetAppStorageInfoCommandResult = CommandResult<\n GetAppStorageInfoCommandResponse,\n GetAppStorageInfoCommandErrorCodes\n>;\n\nexport class GetAppStorageInfoCommand\n implements\n Command<\n GetAppStorageInfoCommandResponse,\n GetAppStorageInfoCommandArgs,\n GetAppStorageInfoCommandErrorCodes\n >\n{\n readonly name = \"GetAppStorageInfo\";\n\n private readonly header = {\n cla: 0xe0,\n ins: 0x6a,\n p1: 0x00,\n p2: 0x00,\n };\n\n constructor(private readonly args: GetAppStorageInfoCommandArgs) {}\n\n getApdu(): Apdu {\n const { appName } = this.args;\n return new ApduBuilder(this.header).addAsciiStringToData(appName).build();\n }\n\n parseResponse(apduResponse: ApduResponse): GetAppStorageInfoCommandResult {\n const parser = new ApduParser(apduResponse);\n if (!CommandUtils.isSuccessResponse(apduResponse)) {\n const errorCode = parser.encodeToHexaString(apduResponse.statusCode);\n if (isCommandErrorCode(errorCode, GET_APP_STORAGE_INFO_ERRORS)) {\n return CommandResultFactory({\n error: new GetAppStorageInfoCommandError({\n ...GET_APP_STORAGE_INFO_ERRORS[errorCode],\n errorCode,\n }),\n });\n }\n return CommandResultFactory({\n error: GlobalCommandErrorHandler.handle(apduResponse),\n });\n }\n\n const appStorageSize = parser.extract32BitUInt();\n if (appStorageSize === undefined) {\n return CommandResultFactory({\n error: new InvalidStatusWordError(\"Failed to extract app storage size\"),\n });\n }\n\n let appStorageVersion = \"\";\n let hasAppStorageSettings = false;\n let hasAppStorageData = false;\n let hash = \"\";\n\n if (appStorageSize !== 0) {\n const appStorageVersionNumber = parser.extract32BitUInt();\n if (appStorageVersionNumber === undefined) {\n return CommandResultFactory({\n error: new InvalidStatusWordError(\n \"Failed to extract app storage version\",\n ),\n });\n }\n appStorageVersion = appStorageVersionNumber.toString(16);\n /**\n * The properties byte is a bitfield with the following structure:\n * - Bit 0: hasSettings\n * - Bit 1: hasData\n */\n const appStorageProperties = parser.extract16BitUInt();\n if (appStorageProperties === undefined) {\n return CommandResultFactory({\n error: new InvalidStatusWordError(\n \"Failed to extract app storage properties\",\n ),\n });\n }\n\n hasAppStorageSettings = (appStorageProperties & 1) === 1;\n hasAppStorageData = (appStorageProperties & 2) === 2;\n hash = parser.encodeToHexaString(parser.extractFieldByLength(0x20));\n }\n\n return CommandResultFactory({\n data: {\n storageSize: appStorageSize,\n storageVersion: appStorageVersion,\n hasSettings: hasAppStorageSettings,\n hasData: hasAppStorageData,\n storageHash: hash,\n },\n });\n }\n}\n"],
5
- "mappings": "yaAAA,IAAAA,EAAA,GAAAC,EAAAD,EAAA,iCAAAE,EAAA,6BAAAC,EAAA,kCAAAC,IAAA,eAAAC,EAAAL,GACA,IAAAM,EAA4B,uCAC5BC,EAA2B,sCAE3BC,EAAuC,+BACvCC,EAGO,4CACPC,EAAmC,4CAEnCC,EAA6B,2CAC7BC,EAA0C,iDAE1CC,EAA2D,sBAgBpD,MAAMX,EACX,CACE,KAAQ,CAAE,QAAS,wBAAyB,EAC5C,OAAQ,CAAE,QAAS,6BAA8B,EACjD,OAAQ,CAAE,QAAS,qDAAsD,CAC3E,EAEK,MAAME,UAAsC,qBAAwD,CACzG,YAAYU,EAA4D,CACtE,MAAM,CAAE,IAAK,gCAAiC,GAAGA,CAAK,CAAC,CACzD,CACF,CAOO,MAAMX,CAOb,CAUE,YAA6BW,EAAoC,CAApC,UAAAA,CAAqC,CATzD,KAAO,oBAEC,OAAS,CACxB,IAAK,IACL,IAAK,IACL,GAAI,EACJ,GAAI,CACN,EAIA,SAAgB,CACd,KAAM,CAAE,QAAAC,CAAQ,EAAI,KAAK,KACzB,OAAO,IAAI,cAAY,KAAK,MAAM,EAAE,qBAAqBA,CAAO,EAAE,MAAM,CAC1E,CAEA,cAAcC,EAA4D,CACxE,MAAMC,EAAS,IAAI,aAAWD,CAAY,EAC1C,GAAI,CAAC,eAAa,kBAAkBA,CAAY,EAAG,CACjD,MAAME,EAAYD,EAAO,mBAAmBD,EAAa,UAAU,EACnE,SAAI,sBAAmBE,EAAWhB,CAA2B,KACpD,wBAAqB,CAC1B,MAAO,IAAIE,EAA8B,CACvC,GAAGF,EAA4BgB,CAAS,EACxC,UAAAA,CACF,CAAC,CACH,CAAC,KAEI,wBAAqB,CAC1B,MAAO,4BAA0B,OAAOF,CAAY,CACtD,CAAC,CACH,CAEA,MAAMG,EAAiBF,EAAO,iBAAiB,EAC/C,GAAIE,IAAmB,OACrB,SAAO,wBAAqB,CAC1B,MAAO,IAAI,yBAAuB,oCAAoC,CACxE,CAAC,EAGH,IAAIC,EAAoB,GACpBC,EAAwB,GACxBC,EAAoB,GACpBC,EAAO,GAEX,GAAIJ,IAAmB,EAAG,CACxB,MAAMK,EAA0BP,EAAO,iBAAiB,EACxD,GAAIO,IAA4B,OAC9B,SAAO,wBAAqB,CAC1B,MAAO,IAAI,yBACT,uCACF,CACF,CAAC,EAEHJ,EAAoBI,EAAwB,SAAS,EAAE,EAMvD,MAAMC,EAAuBR,EAAO,iBAAiB,EACrD,GAAIQ,IAAyB,OAC3B,SAAO,wBAAqB,CAC1B,MAAO,IAAI,yBACT,0CACF,CACF,CAAC,EAGHJ,GAAyBI,EAAuB,KAAO,EACvDH,GAAqBG,EAAuB,KAAO,EACnDF,EAAON,EAAO,mBAAmBA,EAAO,qBAAqB,EAAI,CAAC,CACpE,CAEA,SAAO,wBAAqB,CAC1B,KAAM,CACJ,YAAaE,EACb,eAAgBC,EAChB,YAAaC,EACb,QAASC,EACT,YAAaC,CACf,CACF,CAAC,CACH,CACF",
6
- "names": ["GetAppStorageInfoCommand_exports", "__export", "GET_APP_STORAGE_INFO_ERRORS", "GetAppStorageInfoCommand", "GetAppStorageInfoCommandError", "__toCommonJS", "import_ApduBuilder", "import_ApduParser", "import_Errors", "import_CommandResult", "import_CommandErrors", "import_CommandUtils", "import_GlobalCommandError", "import_Error", "args", "appName", "apduResponse", "parser", "errorCode", "appStorageSize", "appStorageVersion", "hasAppStorageSettings", "hasAppStorageData", "hash", "appStorageVersionNumber", "appStorageProperties"]
7
- }
@@ -1,2 +0,0 @@
1
- "use strict";var p=require("../../command/Errors"),s=require("../../command/model/CommandResult"),a=require("../../command/os/GetAppStorageInfoCommand"),n=require("../../device-session/ApduResponse");describe("GetAppStorageInfoCommand",()=>{describe("Name",()=>{it("name should be 'GetAppStorageInfo'",()=>{const e=new a.GetAppStorageInfoCommand({appName:"MyApp"}).name;expect(e).toBe("GetAppStorageInfo")})}),describe("Command",()=>{it("should return the correct APDU for getting the app storage info",()=>{const t=Uint8Array.from([224,106,0,0,5,77,121,65,112,112]),e=new a.GetAppStorageInfoCommand({appName:"MyApp"}).getApdu();expect(e.getRawApdu()).toEqual(t)})}),describe("Success response",()=>{it("should return correct app storage info when app storage size is not 0",()=>{const t=Uint8Array.from([144,0]),e=new n.ApduResponse({statusCode:t,data:Uint8Array.from([0,0,0,1,0,0,0,1,0,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,1])}),r=new a.GetAppStorageInfoCommand({appName:"MyApp"}).parseResponse(e);expect((0,s.isSuccessCommandResult)(r)).toBe(!0),expect(r).toEqual({data:{storageSize:1,storageVersion:"1",hasSettings:!0,hasData:!0,storageHash:"0000000000000000000000000000000000000000000000000000000000000001"},status:"SUCCESS"})}),it("should return correct app storage info when app storage size is 0",()=>{const t=Uint8Array.from([144,0]),e=new n.ApduResponse({statusCode:t,data:Uint8Array.from([0,0,0,0])}),r=new a.GetAppStorageInfoCommand({appName:"MyApp"}).parseResponse(e);expect((0,s.isSuccessCommandResult)(r)).toBe(!0),expect(r).toEqual({data:{storageSize:0,storageVersion:"",hasSettings:!1,hasData:!1,storageHash:""},status:"SUCCESS"})})}),describe("Error response",()=>{it.each([{description:"application is not found",statusCode:[81,35],expectedMessage:"Application not found."},{description:"device is in recovery mode",statusCode:[102,47],expectedMessage:"Device is in recovery mode."},{description:"application name length is invalid",statusCode:[103,10],expectedMessage:"Invalid application name length, two chars minimum."},{description:"error code is not specific to GetAppStorageInfoCommand (global error)",statusCode:[85,21],expectedMessage:"Device is locked."}])("should return error when $description",({statusCode:t,expectedMessage:e})=>{const r=new n.ApduResponse({statusCode:Uint8Array.from(t),data:new Uint8Array([])}),o=new a.GetAppStorageInfoCommand({appName:"MyApp"}).parseResponse(r);expect((0,s.isSuccessCommandResult)(o)).toBe(!1),expect(o.error.message).toBe(e)}),it.each([{description:"app storage size extraction fails",data:new Uint8Array([]),expectedOriginalMessage:"Failed to extract app storage size"},{description:"app storage version extraction fails",data:Uint8Array.from([0,0,0,1]),expectedOriginalMessage:"Failed to extract app storage version"},{description:"app storage properties extraction fails",data:Uint8Array.from([0,0,0,1,0,0,0,1]),expectedOriginalMessage:"Failed to extract app storage properties"}])("should return error when $description",({data:t,expectedOriginalMessage:e})=>{const r=new n.ApduResponse({statusCode:Uint8Array.from([144,0]),data:t}),o=new a.GetAppStorageInfoCommand({appName:"MyApp"}).parseResponse(r);expect((0,s.isSuccessCommandResult)(o)).toBe(!1),expect(o.error).toBeInstanceOf(p.InvalidStatusWordError),expect(o.error.originalError?.message).toBe(e)})})});
2
- //# sourceMappingURL=GetAppStorageInfoCommand.test.js.map
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../../../../../src/api/command/os/GetAppStorageInfoCommand.test.ts"],
4
- "sourcesContent": ["import { InvalidStatusWordError } from \"@api/command/Errors\";\nimport { isSuccessCommandResult } from \"@api/command/model/CommandResult\";\nimport { GetAppStorageInfoCommand } from \"@api/command/os/GetAppStorageInfoCommand\";\nimport { ApduResponse } from \"@api/device-session/ApduResponse\";\n\ndescribe(\"GetAppStorageInfoCommand\", () => {\n describe(\"Name\", () => {\n it(\"name should be 'GetAppStorageInfo'\", () => {\n // ARRANGE\n const command = new GetAppStorageInfoCommand({ appName: \"MyApp\" });\n\n // ACT\n const name = command.name;\n\n // ASSERT\n expect(name).toBe(\"GetAppStorageInfo\");\n });\n });\n\n describe(\"Command\", () => {\n it(\"should return the correct APDU for getting the app storage info\", () => {\n // ARRANGE\n const expectedApdu = Uint8Array.from([\n 0xe0, 0x6a, 0x00, 0x00, 0x05, 0x4d, 0x79, 0x41, 0x70, 0x70,\n ]);\n\n // ACT\n const apdu = new GetAppStorageInfoCommand({ appName: \"MyApp\" }).getApdu();\n\n // ASSERT\n expect(apdu.getRawApdu()).toEqual(expectedApdu);\n });\n });\n\n describe(\"Success response\", () => {\n it(\"should return correct app storage info when app storage size is not 0\", () => {\n // ARRANGE\n const statusCode = Uint8Array.from([0x90, 0x00]);\n const response = new ApduResponse({\n statusCode,\n data: Uint8Array.from([\n // appStorageSize (32-bit BE) = 1\n 0x00, 0x00, 0x00, 0x01,\n // appStorageVersion (32-bit BE) = 1\n 0x00, 0x00, 0x00, 0x01,\n // appStorageProperties (16-bit BE) = 0x0003 (bits 0 and 1 set)\n 0x00, 0x03,\n // appStorageHash (32 bytes)\n 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01,\n ]),\n });\n\n // ACT\n const result = new GetAppStorageInfoCommand({\n appName: \"MyApp\",\n }).parseResponse(response);\n\n // ASSERT\n expect(isSuccessCommandResult(result)).toBe(true);\n expect(result).toEqual({\n data: {\n storageSize: 1,\n storageVersion: \"1\",\n hasSettings: true,\n hasData: true,\n storageHash:\n \"0000000000000000000000000000000000000000000000000000000000000001\",\n },\n status: \"SUCCESS\",\n });\n });\n\n it(\"should return correct app storage info when app storage size is 0\", () => {\n // ARRANGE\n const statusCode = Uint8Array.from([0x90, 0x00]);\n const response = new ApduResponse({\n statusCode,\n data: Uint8Array.from([\n // appStorageSize (32-bit BE) = 0\n 0x00, 0x00, 0x00, 0x00,\n ]),\n });\n\n // ACT\n const result = new GetAppStorageInfoCommand({\n appName: \"MyApp\",\n }).parseResponse(response);\n\n // ASSERT\n expect(isSuccessCommandResult(result)).toBe(true);\n expect(result).toEqual({\n data: {\n storageSize: 0,\n storageVersion: \"\",\n hasSettings: false,\n hasData: false,\n storageHash: \"\",\n },\n status: \"SUCCESS\",\n });\n });\n });\n\n describe(\"Error response\", () => {\n it.each([\n {\n description: \"application is not found\",\n statusCode: [0x51, 0x23],\n expectedMessage: \"Application not found.\",\n },\n {\n description: \"device is in recovery mode\",\n statusCode: [0x66, 0x2f],\n expectedMessage: \"Device is in recovery mode.\",\n },\n {\n description: \"application name length is invalid\",\n statusCode: [0x67, 0x0a],\n expectedMessage: \"Invalid application name length, two chars minimum.\",\n },\n {\n description:\n \"error code is not specific to GetAppStorageInfoCommand (global error)\",\n statusCode: [0x55, 0x15],\n expectedMessage: \"Device is locked.\",\n },\n ])(\n \"should return error when $description\",\n ({ statusCode, expectedMessage }) => {\n // ARRANGE\n const response = new ApduResponse({\n statusCode: Uint8Array.from(statusCode),\n data: new Uint8Array([]),\n });\n\n // ACT\n const result = new GetAppStorageInfoCommand({\n appName: \"MyApp\",\n }).parseResponse(response);\n\n // ASSERT\n expect(isSuccessCommandResult(result)).toBe(false);\n expect((result as unknown as { error: Error }).error.message).toBe(\n expectedMessage,\n );\n },\n );\n\n it.each([\n {\n description: \"app storage size extraction fails\",\n data: new Uint8Array([]),\n expectedOriginalMessage: \"Failed to extract app storage size\",\n },\n {\n description: \"app storage version extraction fails\",\n data: Uint8Array.from([0x00, 0x00, 0x00, 0x01]),\n expectedOriginalMessage: \"Failed to extract app storage version\",\n },\n {\n description: \"app storage properties extraction fails\",\n data: Uint8Array.from([0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01]),\n expectedOriginalMessage: \"Failed to extract app storage properties\",\n },\n ])(\n \"should return error when $description\",\n ({ data, expectedOriginalMessage }) => {\n // ARRANGE\n const response = new ApduResponse({\n statusCode: Uint8Array.from([0x90, 0x00]),\n data,\n });\n\n // ACT\n const result = new GetAppStorageInfoCommand({\n appName: \"MyApp\",\n }).parseResponse(response);\n\n // ASSERT\n expect(isSuccessCommandResult(result)).toBe(false);\n expect(\n (result as unknown as { error: InvalidStatusWordError }).error,\n ).toBeInstanceOf(InvalidStatusWordError);\n expect(\n (result as unknown as { error: InvalidStatusWordError }).error\n .originalError?.message,\n ).toBe(expectedOriginalMessage);\n },\n );\n });\n});\n"],
5
- "mappings": "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",
6
- "names": ["import_Errors", "import_CommandResult", "import_GetAppStorageInfoCommand", "import_ApduResponse", "name", "expectedApdu", "apdu", "statusCode", "response", "result", "expectedMessage", "data", "expectedOriginalMessage"]
7
- }
@@ -1,2 +0,0 @@
1
- "use strict";var m=Object.defineProperty;var l=Object.getOwnPropertyDescriptor;var u=Object.getOwnPropertyNames;var R=Object.prototype.hasOwnProperty;var I=(e,r)=>{for(var o in r)m(e,o,{get:r[o],enumerable:!0})},S=(e,r,o,t)=>{if(r&&typeof r=="object"||typeof r=="function")for(let a of u(r))!R.call(e,a)&&a!==o&&m(e,a,{get:()=>r[a],enumerable:!(t=l(r,a))||t.enumerable});return e};var E=e=>S(m({},"__esModule",{value:!0}),e);var y={};I(y,{INIT_RESTORE_APP_STORAGE_ERRORS:()=>s,InitRestoreAppStorageCommand:()=>f,InitRestoreAppStorageCommandError:()=>c});module.exports=E(y);var p=require("../../apdu/utils/ApduBuilder"),d=require("../../apdu/utils/ApduParser"),n=require("../../command/model/CommandResult"),i=require("../../command/utils/CommandErrors"),g=require("../../command/utils/CommandUtils"),C=require("../../command/utils/GlobalCommandError"),A=require("../../Error");const s={5123:{message:"Application not found."},"662f":{message:"Invalid device state, recovery mode."},5501:{message:"Invalid consent, user rejected."},5502:{message:"Invalid consent, pin is not set."},"670a":{message:"Invalid application name length, two chars minimum."},6733:{message:"Invalid backup length value."}};class c extends A.DeviceExchangeError{constructor(r){super({tag:"InitRestoreAppStorageCommandError",...r})}}class f{constructor(r){this.args=r}name="InitRestoreAppStorage";header={cla:224,ins:108,p1:0,p2:0};getApdu(){const{appName:r,backupLength:o}=this.args;return new p.ApduBuilder(this.header).add32BitUIntToData(o).addAsciiStringToData(r).build()}parseResponse(r){const o=new d.ApduParser(r);if(!g.CommandUtils.isSuccessResponse(r)){const t=o.encodeToHexaString(r.statusCode);return(0,i.isCommandErrorCode)(t,s)?(0,n.CommandResultFactory)({error:new c({...s[t],errorCode:t})}):(0,n.CommandResultFactory)({error:C.GlobalCommandErrorHandler.handle(r)})}return(0,n.CommandResultFactory)({data:void 0})}}0&&(module.exports={INIT_RESTORE_APP_STORAGE_ERRORS,InitRestoreAppStorageCommand,InitRestoreAppStorageCommandError});
2
- //# sourceMappingURL=InitRestoreAppStorageCommand.js.map
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../../../../../src/api/command/os/InitRestoreAppStorageCommand.ts"],
4
- "sourcesContent": ["import { type Apdu } from \"@api/apdu/model/Apdu\";\nimport { ApduBuilder } from \"@api/apdu/utils/ApduBuilder\";\nimport { ApduParser } from \"@api/apdu/utils/ApduParser\";\nimport { type Command } from \"@api/command/Command\";\nimport {\n type CommandResult,\n CommandResultFactory,\n} from \"@api/command/model/CommandResult\";\nimport {\n type CommandErrors,\n isCommandErrorCode,\n} from \"@api/command/utils/CommandErrors\";\nimport { CommandUtils } from \"@api/command/utils/CommandUtils\";\nimport { GlobalCommandErrorHandler } from \"@api/command/utils/GlobalCommandError\";\nimport { type ApduResponse } from \"@api/device-session/ApduResponse\";\nimport { type CommandErrorArgs, DeviceExchangeError } from \"@api/Error\";\n\nexport type InitRestoreAppStorageCommandArgs = {\n appName: string;\n backupLength: number;\n};\n\nexport type InitRestoreAppStorageCommandErrorCodes =\n | \"5123\"\n | \"662f\"\n | \"5501\"\n | \"5502\"\n | \"670a\"\n | \"6733\";\n\nexport const INIT_RESTORE_APP_STORAGE_ERRORS: CommandErrors<InitRestoreAppStorageCommandErrorCodes> =\n {\n \"5123\": { message: \"Application not found.\" },\n \"662f\": { message: \"Invalid device state, recovery mode.\" },\n \"5501\": { message: \"Invalid consent, user rejected.\" },\n \"5502\": { message: \"Invalid consent, pin is not set.\" },\n \"670a\": { message: \"Invalid application name length, two chars minimum.\" },\n \"6733\": { message: \"Invalid backup length value.\" },\n };\n\nexport class InitRestoreAppStorageCommandError extends DeviceExchangeError<InitRestoreAppStorageCommandErrorCodes> {\n constructor(args: CommandErrorArgs<InitRestoreAppStorageCommandErrorCodes>) {\n super({ tag: \"InitRestoreAppStorageCommandError\", ...args });\n }\n}\n\nexport type InitRestoreAppStorageCommandResult = CommandResult<\n void,\n InitRestoreAppStorageCommandErrorCodes\n>;\n\nexport class InitRestoreAppStorageCommand\n implements\n Command<\n void,\n InitRestoreAppStorageCommandArgs,\n InitRestoreAppStorageCommandErrorCodes\n >\n{\n readonly name = \"InitRestoreAppStorage\";\n\n private readonly header = {\n cla: 0xe0,\n ins: 0x6c,\n p1: 0x00,\n p2: 0x00,\n };\n\n constructor(private readonly args: InitRestoreAppStorageCommandArgs) {}\n\n getApdu(): Apdu {\n const { appName, backupLength } = this.args;\n return new ApduBuilder(this.header)\n .add32BitUIntToData(backupLength)\n .addAsciiStringToData(appName)\n .build();\n }\n\n parseResponse(\n apduResponse: ApduResponse,\n ): InitRestoreAppStorageCommandResult {\n const parser = new ApduParser(apduResponse);\n if (!CommandUtils.isSuccessResponse(apduResponse)) {\n const errorCode = parser.encodeToHexaString(apduResponse.statusCode);\n if (isCommandErrorCode(errorCode, INIT_RESTORE_APP_STORAGE_ERRORS)) {\n return CommandResultFactory({\n error: new InitRestoreAppStorageCommandError({\n ...INIT_RESTORE_APP_STORAGE_ERRORS[errorCode],\n errorCode,\n }),\n });\n }\n return CommandResultFactory({\n error: GlobalCommandErrorHandler.handle(apduResponse),\n });\n }\n\n return CommandResultFactory({\n data: undefined,\n });\n }\n}\n"],
5
- "mappings": "yaAAA,IAAAA,EAAA,GAAAC,EAAAD,EAAA,qCAAAE,EAAA,iCAAAC,EAAA,sCAAAC,IAAA,eAAAC,EAAAL,GACA,IAAAM,EAA4B,uCAC5BC,EAA2B,sCAE3BC,EAGO,4CACPC,EAGO,4CACPC,EAA6B,2CAC7BC,EAA0C,iDAE1CC,EAA2D,sBAepD,MAAMV,EACX,CACE,KAAQ,CAAE,QAAS,wBAAyB,EAC5C,OAAQ,CAAE,QAAS,sCAAuC,EAC1D,KAAQ,CAAE,QAAS,iCAAkC,EACrD,KAAQ,CAAE,QAAS,kCAAmC,EACtD,OAAQ,CAAE,QAAS,qDAAsD,EACzE,KAAQ,CAAE,QAAS,8BAA+B,CACpD,EAEK,MAAME,UAA0C,qBAA4D,CACjH,YAAYS,EAAgE,CAC1E,MAAM,CAAE,IAAK,oCAAqC,GAAGA,CAAK,CAAC,CAC7D,CACF,CAOO,MAAMV,CAOb,CAUE,YAA6BU,EAAwC,CAAxC,UAAAA,CAAyC,CAT7D,KAAO,wBAEC,OAAS,CACxB,IAAK,IACL,IAAK,IACL,GAAI,EACJ,GAAI,CACN,EAIA,SAAgB,CACd,KAAM,CAAE,QAAAC,EAAS,aAAAC,CAAa,EAAI,KAAK,KACvC,OAAO,IAAI,cAAY,KAAK,MAAM,EAC/B,mBAAmBA,CAAY,EAC/B,qBAAqBD,CAAO,EAC5B,MAAM,CACX,CAEA,cACEE,EACoC,CACpC,MAAMC,EAAS,IAAI,aAAWD,CAAY,EAC1C,GAAI,CAAC,eAAa,kBAAkBA,CAAY,EAAG,CACjD,MAAME,EAAYD,EAAO,mBAAmBD,EAAa,UAAU,EACnE,SAAI,sBAAmBE,EAAWhB,CAA+B,KACxD,wBAAqB,CAC1B,MAAO,IAAIE,EAAkC,CAC3C,GAAGF,EAAgCgB,CAAS,EAC5C,UAAAA,CACF,CAAC,CACH,CAAC,KAEI,wBAAqB,CAC1B,MAAO,4BAA0B,OAAOF,CAAY,CACtD,CAAC,CACH,CAEA,SAAO,wBAAqB,CAC1B,KAAM,MACR,CAAC,CACH,CACF",
6
- "names": ["InitRestoreAppStorageCommand_exports", "__export", "INIT_RESTORE_APP_STORAGE_ERRORS", "InitRestoreAppStorageCommand", "InitRestoreAppStorageCommandError", "__toCommonJS", "import_ApduBuilder", "import_ApduParser", "import_CommandResult", "import_CommandErrors", "import_CommandUtils", "import_GlobalCommandError", "import_Error", "args", "appName", "backupLength", "apduResponse", "parser", "errorCode"]
7
- }
@@ -1,2 +0,0 @@
1
- "use strict";var o=require("../../command/model/CommandResult"),s=require("../../command/os/InitRestoreAppStorageCommand"),n=require("../../device-session/ApduResponse");describe("InitRestoreAppStorageCommand",()=>{describe("Name",()=>{it("name should be 'InitRestoreAppStorage'",()=>{const e=new s.InitRestoreAppStorageCommand({appName:"MyApp",backupLength:10}).name;expect(e).toBe("InitRestoreAppStorage")})}),describe("Command",()=>{it("should return the correct APDU for initializing an app storage restore",()=>{const t=Uint8Array.from([224,108,0,0,9,0,0,0,10,77,121,65,112,112]),e=new s.InitRestoreAppStorageCommand({appName:"MyApp",backupLength:10}).getApdu();expect(e.getRawApdu()).toEqual(t)})}),describe("Success response",()=>{it("should return a success result",()=>{const t=new n.ApduResponse({statusCode:Uint8Array.from([144,0]),data:new Uint8Array([])}),e=new s.InitRestoreAppStorageCommand({appName:"MyApp",backupLength:10}).parseResponse(t);expect((0,o.isSuccessCommandResult)(e)).toBe(!0),expect(e).toEqual({data:void 0,status:"SUCCESS"})})}),describe("Error response",()=>{it.each([{description:"application is not found",statusCode:[81,35],expectedMessage:"Application not found."},{description:"device is in recovery mode",statusCode:[102,47],expectedMessage:"Invalid device state, recovery mode."},{description:"user rejected the consent",statusCode:[85,1],expectedMessage:"Invalid consent, user rejected."},{description:"pin is not set",statusCode:[85,2],expectedMessage:"Invalid consent, pin is not set."},{description:"application name length is invalid",statusCode:[103,10],expectedMessage:"Invalid application name length, two chars minimum."},{description:"backup length value is invalid",statusCode:[103,51],expectedMessage:"Invalid backup length value."},{description:"error code is not specific to InitRestoreAppStorageCommand (global error)",statusCode:[85,21],expectedMessage:"Device is locked."}])("should return error when $description",({statusCode:t,expectedMessage:e})=>{const r=new n.ApduResponse({statusCode:Uint8Array.from(t),data:new Uint8Array([])}),a=new s.InitRestoreAppStorageCommand({appName:"MyApp",backupLength:10}).parseResponse(r);expect((0,o.isSuccessCommandResult)(a)).toBe(!1),expect(a.error.message).toBe(e)})})});
2
- //# sourceMappingURL=InitRestoreAppStorageCommand.test.js.map
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../../../../../src/api/command/os/InitRestoreAppStorageCommand.test.ts"],
4
- "sourcesContent": ["import { isSuccessCommandResult } from \"@api/command/model/CommandResult\";\nimport { InitRestoreAppStorageCommand } from \"@api/command/os/InitRestoreAppStorageCommand\";\nimport { ApduResponse } from \"@api/device-session/ApduResponse\";\n\ndescribe(\"InitRestoreAppStorageCommand\", () => {\n describe(\"Name\", () => {\n it(\"name should be 'InitRestoreAppStorage'\", () => {\n // ARRANGE\n const command = new InitRestoreAppStorageCommand({\n appName: \"MyApp\",\n backupLength: 10,\n });\n\n // ACT\n const name = command.name;\n\n // ASSERT\n expect(name).toBe(\"InitRestoreAppStorage\");\n });\n });\n\n describe(\"Command\", () => {\n it(\"should return the correct APDU for initializing an app storage restore\", () => {\n // ARRANGE\n const expectedApdu = Uint8Array.from([\n 0xe0, 0x6c, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x0a, 0x4d, 0x79, 0x41,\n 0x70, 0x70,\n ]);\n\n // ACT\n const apdu = new InitRestoreAppStorageCommand({\n appName: \"MyApp\",\n backupLength: 10,\n }).getApdu();\n\n // ASSERT\n expect(apdu.getRawApdu()).toEqual(expectedApdu);\n });\n });\n\n describe(\"Success response\", () => {\n it(\"should return a success result\", () => {\n // ARRANGE\n const response = new ApduResponse({\n statusCode: Uint8Array.from([0x90, 0x00]),\n data: new Uint8Array([]),\n });\n\n // ACT\n const result = new InitRestoreAppStorageCommand({\n appName: \"MyApp\",\n backupLength: 10,\n }).parseResponse(response);\n\n // ASSERT\n expect(isSuccessCommandResult(result)).toBe(true);\n expect(result).toEqual({\n data: undefined,\n status: \"SUCCESS\",\n });\n });\n });\n\n describe(\"Error response\", () => {\n it.each([\n {\n description: \"application is not found\",\n statusCode: [0x51, 0x23],\n expectedMessage: \"Application not found.\",\n },\n {\n description: \"device is in recovery mode\",\n statusCode: [0x66, 0x2f],\n expectedMessage: \"Invalid device state, recovery mode.\",\n },\n {\n description: \"user rejected the consent\",\n statusCode: [0x55, 0x01],\n expectedMessage: \"Invalid consent, user rejected.\",\n },\n {\n description: \"pin is not set\",\n statusCode: [0x55, 0x02],\n expectedMessage: \"Invalid consent, pin is not set.\",\n },\n {\n description: \"application name length is invalid\",\n statusCode: [0x67, 0x0a],\n expectedMessage: \"Invalid application name length, two chars minimum.\",\n },\n {\n description: \"backup length value is invalid\",\n statusCode: [0x67, 0x33],\n expectedMessage: \"Invalid backup length value.\",\n },\n {\n description:\n \"error code is not specific to InitRestoreAppStorageCommand (global error)\",\n statusCode: [0x55, 0x15],\n expectedMessage: \"Device is locked.\",\n },\n ])(\n \"should return error when $description\",\n ({ statusCode, expectedMessage }) => {\n // ARRANGE\n const response = new ApduResponse({\n statusCode: Uint8Array.from(statusCode),\n data: new Uint8Array([]),\n });\n\n // ACT\n const result = new InitRestoreAppStorageCommand({\n appName: \"MyApp\",\n backupLength: 10,\n }).parseResponse(response);\n\n // ASSERT\n expect(isSuccessCommandResult(result)).toBe(false);\n expect((result as unknown as { error: Error }).error.message).toBe(\n expectedMessage,\n );\n },\n );\n });\n});\n"],
5
- "mappings": "aAAA,IAAAA,EAAuC,4CACvCC,EAA6C,wDAC7CC,EAA6B,4CAE7B,SAAS,+BAAgC,IAAM,CAC7C,SAAS,OAAQ,IAAM,CACrB,GAAG,yCAA0C,IAAM,CAQjD,MAAMC,EANU,IAAI,+BAA6B,CAC/C,QAAS,QACT,aAAc,EAChB,CAAC,EAGoB,KAGrB,OAAOA,CAAI,EAAE,KAAK,uBAAuB,CAC3C,CAAC,CACH,CAAC,EAED,SAAS,UAAW,IAAM,CACxB,GAAG,yEAA0E,IAAM,CAEjF,MAAMC,EAAe,WAAW,KAAK,CACnC,IAAM,IAAM,EAAM,EAAM,EAAM,EAAM,EAAM,EAAM,GAAM,GAAM,IAAM,GAClE,IAAM,GACR,CAAC,EAGKC,EAAO,IAAI,+BAA6B,CAC5C,QAAS,QACT,aAAc,EAChB,CAAC,EAAE,QAAQ,EAGX,OAAOA,EAAK,WAAW,CAAC,EAAE,QAAQD,CAAY,CAChD,CAAC,CACH,CAAC,EAED,SAAS,mBAAoB,IAAM,CACjC,GAAG,iCAAkC,IAAM,CAEzC,MAAME,EAAW,IAAI,eAAa,CAChC,WAAY,WAAW,KAAK,CAAC,IAAM,CAAI,CAAC,EACxC,KAAM,IAAI,WAAW,CAAC,CAAC,CACzB,CAAC,EAGKC,EAAS,IAAI,+BAA6B,CAC9C,QAAS,QACT,aAAc,EAChB,CAAC,EAAE,cAAcD,CAAQ,EAGzB,UAAO,0BAAuBC,CAAM,CAAC,EAAE,KAAK,EAAI,EAChD,OAAOA,CAAM,EAAE,QAAQ,CACrB,KAAM,OACN,OAAQ,SACV,CAAC,CACH,CAAC,CACH,CAAC,EAED,SAAS,iBAAkB,IAAM,CAC/B,GAAG,KAAK,CACN,CACE,YAAa,2BACb,WAAY,CAAC,GAAM,EAAI,EACvB,gBAAiB,wBACnB,EACA,CACE,YAAa,6BACb,WAAY,CAAC,IAAM,EAAI,EACvB,gBAAiB,sCACnB,EACA,CACE,YAAa,4BACb,WAAY,CAAC,GAAM,CAAI,EACvB,gBAAiB,iCACnB,EACA,CACE,YAAa,iBACb,WAAY,CAAC,GAAM,CAAI,EACvB,gBAAiB,kCACnB,EACA,CACE,YAAa,qCACb,WAAY,CAAC,IAAM,EAAI,EACvB,gBAAiB,qDACnB,EACA,CACE,YAAa,iCACb,WAAY,CAAC,IAAM,EAAI,EACvB,gBAAiB,8BACnB,EACA,CACE,YACE,4EACF,WAAY,CAAC,GAAM,EAAI,EACvB,gBAAiB,mBACnB,CACF,CAAC,EACC,wCACA,CAAC,CAAE,WAAAC,EAAY,gBAAAC,CAAgB,IAAM,CAEnC,MAAMH,EAAW,IAAI,eAAa,CAChC,WAAY,WAAW,KAAKE,CAAU,EACtC,KAAM,IAAI,WAAW,CAAC,CAAC,CACzB,CAAC,EAGKD,EAAS,IAAI,+BAA6B,CAC9C,QAAS,QACT,aAAc,EAChB,CAAC,EAAE,cAAcD,CAAQ,EAGzB,UAAO,0BAAuBC,CAAM,CAAC,EAAE,KAAK,EAAK,EACjD,OAAQA,EAAuC,MAAM,OAAO,EAAE,KAC5DE,CACF,CACF,CACF,CACF,CAAC,CACH,CAAC",
6
- "names": ["import_CommandResult", "import_InitRestoreAppStorageCommand", "import_ApduResponse", "name", "expectedApdu", "apdu", "response", "result", "statusCode", "expectedMessage"]
7
- }
@@ -1,2 +0,0 @@
1
- "use strict";var g=Object.defineProperty;var l=Object.getOwnPropertyDescriptor;var f=Object.getOwnPropertyNames;var A=Object.prototype.hasOwnProperty;var C=(e,r)=>{for(var a in r)g(e,a,{get:r[a],enumerable:!0})},y=(e,r,a,t)=>{if(r&&typeof r=="object"||typeof r=="function")for(let o of f(r))!A.call(e,o)&&o!==a&&g(e,o,{get:()=>r[o],enumerable:!(t=l(r,o))||t.enumerable});return e};var B=e=>y(g({},"__esModule",{value:!0}),e);var E={};C(E,{BackupAppStorageTask:()=>h});module.exports=B(E);var m=require("../../command/model/CommandResult"),u=require("../../command/os/BackupStorageCommand"),d=require("../../command/os/GetAppStorageInfoCommand"),s=require("../../model/DmkResult"),c=require("../../utils/HexaString");class h{constructor(r,a,t){this.args=r;this.api=a;this.logger=t}async run(){this.logger.debug("[run] Starting BackupAppStorageTask",{data:{appName:this.args.appName}});const{appName:r}=this.args,a=await this.api.sendCommand(new d.GetAppStorageInfoCommand({appName:r}));if(!(0,m.isSuccessCommandResult)(a))return this.logger.debug("[run] Failed to get app storage info",{data:{error:a.error}}),(0,s.DmkResultFactory)({error:a.error});const{storageSize:t}=a.data;let o=0,n=new Uint8Array(0);for(;o<t;){const p=await this.api.sendCommand(new u.BackupStorageCommand);if(!(0,m.isSuccessCommandResult)(p))return this.logger.debug("[run] Failed to backup app storage",{data:{error:p.error}}),(0,s.DmkResultFactory)({error:p.error});const{chunkData:S,chunkSize:k}=p.data;n=Uint8Array.from([...n,...S]),o+=k}const i=(0,c.bufferToHexaString)(n);return this.logger.debug("[run] App storage data backed up successfully",{data:{appStorageData:i}}),(0,s.DmkResultFactory)({data:{appStorageData:i}})}}0&&(module.exports={BackupAppStorageTask});
2
- //# sourceMappingURL=BackupAppStorageTask.js.map
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../../../../../src/api/device-action/task/BackupAppStorageTask.ts"],
4
- "sourcesContent": ["import {\n type CommandErrorResult,\n isSuccessCommandResult,\n} from \"@api/command/model/CommandResult\";\nimport {\n BackupStorageCommand,\n type BackupStorageCommandErrorCodes,\n} from \"@api/command/os/BackupStorageCommand\";\nimport {\n GetAppStorageInfoCommand,\n type GetAppStorageInfoCommandErrorCodes,\n} from \"@api/command/os/GetAppStorageInfoCommand\";\nimport { type InternalApi } from \"@api/device-action/DeviceAction\";\nimport { type LoggerPublisherService } from \"@api/logger-publisher/service/LoggerPublisherService\";\nimport { type DmkResult, DmkResultFactory } from \"@api/model/DmkResult\";\nimport { bufferToHexaString, type HexaString } from \"@api/utils/HexaString\";\n\nexport type BackupAppStorageTaskArgs = {\n appName: string;\n};\n\nexport type BackupAppStorageTaskResponse = {\n appStorageData: HexaString;\n};\n\nexport type BackupAppStorageTaskErrorCodes =\n | GetAppStorageInfoCommandErrorCodes\n | BackupStorageCommandErrorCodes;\n\nexport type BackupAppStorageTaskError =\n | CommandErrorResult<GetAppStorageInfoCommandErrorCodes>[\"error\"]\n | CommandErrorResult<BackupStorageCommandErrorCodes>[\"error\"];\n\nexport class BackupAppStorageTask {\n constructor(\n private readonly args: BackupAppStorageTaskArgs,\n private readonly api: InternalApi,\n private readonly logger: LoggerPublisherService,\n ) {}\n\n public async run(): Promise<\n DmkResult<BackupAppStorageTaskResponse, BackupAppStorageTaskError>\n > {\n this.logger.debug(\"[run] Starting BackupAppStorageTask\", {\n data: {\n appName: this.args.appName,\n },\n });\n\n const { appName } = this.args;\n\n const getAppStorageInfo = await this.api.sendCommand(\n new GetAppStorageInfoCommand({\n appName,\n }),\n );\n\n if (!isSuccessCommandResult(getAppStorageInfo)) {\n this.logger.debug(\"[run] Failed to get app storage info\", {\n data: { error: getAppStorageInfo.error },\n });\n return DmkResultFactory({\n error: getAppStorageInfo.error,\n });\n }\n\n const { storageSize } = getAppStorageInfo.data;\n let offset = 0;\n let appStorageDataBytes = new Uint8Array(0);\n\n while (offset < storageSize) {\n const backupStorage = await this.api.sendCommand(\n new BackupStorageCommand(),\n );\n if (!isSuccessCommandResult(backupStorage)) {\n this.logger.debug(\"[run] Failed to backup app storage\", {\n data: { error: backupStorage.error },\n });\n return DmkResultFactory({\n error: backupStorage.error,\n });\n }\n\n const { chunkData, chunkSize } = backupStorage.data;\n appStorageDataBytes = Uint8Array.from([\n ...appStorageDataBytes,\n ...chunkData,\n ]);\n offset += chunkSize;\n }\n\n const appStorageData = bufferToHexaString(appStorageDataBytes);\n this.logger.debug(\"[run] App storage data backed up successfully\", {\n data: {\n appStorageData,\n },\n });\n\n return DmkResultFactory({\n data: {\n appStorageData,\n },\n });\n }\n}\n"],
5
- "mappings": "yaAAA,IAAAA,EAAA,GAAAC,EAAAD,EAAA,0BAAAE,IAAA,eAAAC,EAAAH,GAAA,IAAAI,EAGO,4CACPC,EAGO,gDACPC,EAGO,oDAGPC,EAAiD,gCACjDC,EAAoD,iCAkB7C,MAAMN,CAAqB,CAChC,YACmBO,EACAC,EACAC,EACjB,CAHiB,UAAAF,EACA,SAAAC,EACA,YAAAC,CAChB,CAEH,MAAa,KAEX,CACA,KAAK,OAAO,MAAM,sCAAuC,CACvD,KAAM,CACJ,QAAS,KAAK,KAAK,OACrB,CACF,CAAC,EAED,KAAM,CAAE,QAAAC,CAAQ,EAAI,KAAK,KAEnBC,EAAoB,MAAM,KAAK,IAAI,YACvC,IAAI,2BAAyB,CAC3B,QAAAD,CACF,CAAC,CACH,EAEA,GAAI,IAAC,0BAAuBC,CAAiB,EAC3C,YAAK,OAAO,MAAM,uCAAwC,CACxD,KAAM,CAAE,MAAOA,EAAkB,KAAM,CACzC,CAAC,KACM,oBAAiB,CACtB,MAAOA,EAAkB,KAC3B,CAAC,EAGH,KAAM,CAAE,YAAAC,CAAY,EAAID,EAAkB,KAC1C,IAAIE,EAAS,EACTC,EAAsB,IAAI,WAAW,CAAC,EAE1C,KAAOD,EAASD,GAAa,CAC3B,MAAMG,EAAgB,MAAM,KAAK,IAAI,YACnC,IAAI,sBACN,EACA,GAAI,IAAC,0BAAuBA,CAAa,EACvC,YAAK,OAAO,MAAM,qCAAsC,CACtD,KAAM,CAAE,MAAOA,EAAc,KAAM,CACrC,CAAC,KACM,oBAAiB,CACtB,MAAOA,EAAc,KACvB,CAAC,EAGH,KAAM,CAAE,UAAAC,EAAW,UAAAC,CAAU,EAAIF,EAAc,KAC/CD,EAAsB,WAAW,KAAK,CACpC,GAAGA,EACH,GAAGE,CACL,CAAC,EACDH,GAAUI,CACZ,CAEA,MAAMC,KAAiB,sBAAmBJ,CAAmB,EAC7D,YAAK,OAAO,MAAM,gDAAiD,CACjE,KAAM,CACJ,eAAAI,CACF,CACF,CAAC,KAEM,oBAAiB,CACtB,KAAM,CACJ,eAAAA,CACF,CACF,CAAC,CACH,CACF",
6
- "names": ["BackupAppStorageTask_exports", "__export", "BackupAppStorageTask", "__toCommonJS", "import_CommandResult", "import_BackupStorageCommand", "import_GetAppStorageInfoCommand", "import_DmkResult", "import_HexaString", "args", "api", "logger", "appName", "getAppStorageInfo", "storageSize", "offset", "appStorageDataBytes", "backupStorage", "chunkData", "chunkSize", "appStorageData"]
7
- }
@@ -1,2 +0,0 @@
1
- "use strict";var c=require("../../command/os/BackupStorageCommand"),p=require("../../command/os/GetAppStorageInfoCommand"),n=require("../../device-action/task/BackupAppStorageTask"),e=require("../../index");describe("BackupAppStorageTask",()=>{let o,t;const s=vi.fn();beforeEach(()=>{vi.clearAllMocks(),o={sendCommand:s},t={debug:vi.fn()}}),describe("Success",()=>{it("should backup app storage data successfully",async()=>{const r=new n.BackupAppStorageTask({appName:"MyApp"},o,t);s.mockResolvedValueOnce((0,e.CommandResultFactory)({data:{storageSize:15}})).mockResolvedValueOnce((0,e.CommandResultFactory)({data:{chunkData:new Uint8Array([1,35,69,103,137]),chunkSize:5}})).mockResolvedValueOnce((0,e.CommandResultFactory)({data:{chunkData:new Uint8Array([10,11,12,13,14]),chunkSize:5}})).mockResolvedValueOnce((0,e.CommandResultFactory)({data:{chunkData:new Uint8Array([15,16,17,18,19]),chunkSize:5}}));const a=await r.run();expect((0,e.isSuccessDmkResult)(a)).toBe(!0),expect(a.data.appStorageData).toBe("0x01234567890a0b0c0d0e0f10111213")})}),describe("Error",()=>{it("should return error when getting app storage info fails",async()=>{const r=new n.BackupAppStorageTask({appName:"MyApp"},o,t);s.mockResolvedValueOnce((0,e.CommandResultFactory)({error:new p.GetAppStorageInfoCommandError({message:"Application not found.",errorCode:"5123"})}));const a=await r.run();expect(a).toStrictEqual((0,e.DmkResultFactory)({error:new p.GetAppStorageInfoCommandError({message:"Application not found.",errorCode:"5123"})}))}),it("should return error when backing up app storage data fails",async()=>{const r=new n.BackupAppStorageTask({appName:"MyApp"},o,t);s.mockResolvedValueOnce((0,e.CommandResultFactory)({data:{storageSize:100}})).mockResolvedValueOnce((0,e.CommandResultFactory)({error:new c.BackupStorageCommandError({message:"Failed to backup app storage data.",errorCode:"541c"})}));const a=await r.run();expect((0,e.isSuccessDmkResult)(a)).toBe(!1),expect(a.error).toBeInstanceOf(c.BackupStorageCommandError),expect(a.error.message).toBe("Failed to backup app storage data.")})})});
2
- //# sourceMappingURL=BackupAppStorageTask.test.js.map
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../../../../../src/api/device-action/task/BackupAppStorageTask.test.ts"],
4
- "sourcesContent": ["import { BackupStorageCommandError } from \"@api/command/os/BackupStorageCommand\";\nimport { GetAppStorageInfoCommandError } from \"@api/command/os/GetAppStorageInfoCommand\";\nimport { type InternalApi } from \"@api/device-action/DeviceAction\";\nimport {\n BackupAppStorageTask,\n type BackupAppStorageTaskResponse,\n} from \"@api/device-action/task/BackupAppStorageTask\";\nimport {\n CommandResultFactory,\n DmkResultFactory,\n isSuccessDmkResult,\n} from \"@api/index\";\nimport { type LoggerPublisherService } from \"@api/logger-publisher/service/LoggerPublisherService\";\n\ndescribe(\"BackupAppStorageTask\", () => {\n let api: InternalApi;\n let logger: LoggerPublisherService;\n const sendCommand = vi.fn();\n\n beforeEach(() => {\n vi.clearAllMocks();\n api = {\n sendCommand,\n } as unknown as InternalApi;\n logger = {\n debug: vi.fn(),\n } as unknown as LoggerPublisherService;\n });\n\n describe(\"Success\", () => {\n it(\"should backup app storage data successfully\", async () => {\n // ARRANGE\n const task = new BackupAppStorageTask(\n {\n appName: \"MyApp\",\n },\n api,\n logger,\n );\n\n sendCommand\n .mockResolvedValueOnce(\n CommandResultFactory({ data: { storageSize: 15 } }),\n )\n .mockResolvedValueOnce(\n CommandResultFactory({\n data: {\n chunkData: new Uint8Array([0x01, 0x23, 0x45, 0x67, 0x89]),\n chunkSize: 5,\n },\n }),\n )\n .mockResolvedValueOnce(\n CommandResultFactory({\n data: {\n chunkData: new Uint8Array([0x0a, 0x0b, 0x0c, 0x0d, 0x0e]),\n chunkSize: 5,\n },\n }),\n )\n .mockResolvedValueOnce(\n CommandResultFactory({\n data: {\n chunkData: new Uint8Array([0x0f, 0x10, 0x11, 0x12, 0x13]),\n chunkSize: 5,\n },\n }),\n );\n\n // ACT\n const result = await task.run();\n\n // ASSERT\n expect(isSuccessDmkResult(result)).toBe(true);\n expect(\n (result as { data: BackupAppStorageTaskResponse }).data.appStorageData,\n ).toBe(\"0x01234567890a0b0c0d0e0f10111213\");\n });\n });\n\n describe(\"Error\", () => {\n it(\"should return error when getting app storage info fails\", async () => {\n // ARRANGE\n const task = new BackupAppStorageTask(\n {\n appName: \"MyApp\",\n },\n api,\n logger,\n );\n\n sendCommand.mockResolvedValueOnce(\n CommandResultFactory({\n error: new GetAppStorageInfoCommandError({\n message: \"Application not found.\",\n errorCode: \"5123\",\n }),\n }),\n );\n\n // ACT\n const result = await task.run();\n\n // ASSERT\n expect(result).toStrictEqual(\n DmkResultFactory({\n error: new GetAppStorageInfoCommandError({\n message: \"Application not found.\",\n errorCode: \"5123\",\n }),\n }),\n );\n });\n\n it(\"should return error when backing up app storage data fails\", async () => {\n // ARRANGE\n const task = new BackupAppStorageTask(\n {\n appName: \"MyApp\",\n },\n api,\n logger,\n );\n\n sendCommand\n .mockResolvedValueOnce(\n CommandResultFactory({ data: { storageSize: 100 } }),\n )\n .mockResolvedValueOnce(\n CommandResultFactory({\n error: new BackupStorageCommandError({\n message: \"Failed to backup app storage data.\",\n errorCode: \"541c\",\n }),\n }),\n );\n\n // ACT\n const result = await task.run();\n\n // ASSERT\n expect(isSuccessDmkResult(result)).toBe(false);\n expect(\n (result as { error: BackupStorageCommandError }).error,\n ).toBeInstanceOf(BackupStorageCommandError);\n expect(\n (result as { error: BackupStorageCommandError }).error.message,\n ).toBe(\"Failed to backup app storage data.\");\n });\n });\n});\n"],
5
- "mappings": "aAAA,IAAAA,EAA0C,gDAC1CC,EAA8C,oDAE9CC,EAGO,wDACPC,EAIO,sBAGP,SAAS,uBAAwB,IAAM,CACrC,IAAIC,EACAC,EACJ,MAAMC,EAAc,GAAG,GAAG,EAE1B,WAAW,IAAM,CACf,GAAG,cAAc,EACjBF,EAAM,CACJ,YAAAE,CACF,EACAD,EAAS,CACP,MAAO,GAAG,GAAG,CACf,CACF,CAAC,EAED,SAAS,UAAW,IAAM,CACxB,GAAG,8CAA+C,SAAY,CAE5D,MAAME,EAAO,IAAI,uBACf,CACE,QAAS,OACX,EACAH,EACAC,CACF,EAEAC,EACG,yBACC,wBAAqB,CAAE,KAAM,CAAE,YAAa,EAAG,CAAE,CAAC,CACpD,EACC,yBACC,wBAAqB,CACnB,KAAM,CACJ,UAAW,IAAI,WAAW,CAAC,EAAM,GAAM,GAAM,IAAM,GAAI,CAAC,EACxD,UAAW,CACb,CACF,CAAC,CACH,EACC,yBACC,wBAAqB,CACnB,KAAM,CACJ,UAAW,IAAI,WAAW,CAAC,GAAM,GAAM,GAAM,GAAM,EAAI,CAAC,EACxD,UAAW,CACb,CACF,CAAC,CACH,EACC,yBACC,wBAAqB,CACnB,KAAM,CACJ,UAAW,IAAI,WAAW,CAAC,GAAM,GAAM,GAAM,GAAM,EAAI,CAAC,EACxD,UAAW,CACb,CACF,CAAC,CACH,EAGF,MAAME,EAAS,MAAMD,EAAK,IAAI,EAG9B,UAAO,sBAAmBC,CAAM,CAAC,EAAE,KAAK,EAAI,EAC5C,OACGA,EAAkD,KAAK,cAC1D,EAAE,KAAK,kCAAkC,CAC3C,CAAC,CACH,CAAC,EAED,SAAS,QAAS,IAAM,CACtB,GAAG,0DAA2D,SAAY,CAExE,MAAMD,EAAO,IAAI,uBACf,CACE,QAAS,OACX,EACAH,EACAC,CACF,EAEAC,EAAY,yBACV,wBAAqB,CACnB,MAAO,IAAI,gCAA8B,CACvC,QAAS,yBACT,UAAW,MACb,CAAC,CACH,CAAC,CACH,EAGA,MAAME,EAAS,MAAMD,EAAK,IAAI,EAG9B,OAAOC,CAAM,EAAE,iBACb,oBAAiB,CACf,MAAO,IAAI,gCAA8B,CACvC,QAAS,yBACT,UAAW,MACb,CAAC,CACH,CAAC,CACH,CACF,CAAC,EAED,GAAG,6DAA8D,SAAY,CAE3E,MAAMD,EAAO,IAAI,uBACf,CACE,QAAS,OACX,EACAH,EACAC,CACF,EAEAC,EACG,yBACC,wBAAqB,CAAE,KAAM,CAAE,YAAa,GAAI,CAAE,CAAC,CACrD,EACC,yBACC,wBAAqB,CACnB,MAAO,IAAI,4BAA0B,CACnC,QAAS,qCACT,UAAW,MACb,CAAC,CACH,CAAC,CACH,EAGF,MAAME,EAAS,MAAMD,EAAK,IAAI,EAG9B,UAAO,sBAAmBC,CAAM,CAAC,EAAE,KAAK,EAAK,EAC7C,OACGA,EAAgD,KACnD,EAAE,eAAe,2BAAyB,EAC1C,OACGA,EAAgD,MAAM,OACzD,EAAE,KAAK,oCAAoC,CAC7C,CAAC,CACH,CAAC,CACH,CAAC",
6
- "names": ["import_BackupStorageCommand", "import_GetAppStorageInfoCommand", "import_BackupAppStorageTask", "import_api", "api", "logger", "sendCommand", "task", "result"]
7
- }
@@ -1,2 +0,0 @@
1
- import{ApduBuilder as d}from"../../apdu/utils/ApduBuilder";import{ApduParser as p}from"../../apdu/utils/ApduParser";import{InvalidStatusWordError as s}from"../../command/Errors";import{CommandResultFactory as e}from"../../command/model/CommandResult";import{isCommandErrorCode as c}from"../../command/utils/CommandErrors";import{CommandUtils as u}from"../../command/utils/CommandUtils";import{GlobalCommandErrorHandler as i}from"../../command/utils/GlobalCommandError";import{DeviceExchangeError as C}from"../../Error";const m={5123:{message:"Invalid context. Get info must be called."},5419:{message:"Failed to generate AES key."},"541a":{message:"Internal error, crypto operation failed."},"541b":{message:"Internal error, failed to compute AES CMAC."},"541c":{message:"Failed to encrypt the app storage backup."},"622f":{message:"Invalid device state, recovery mode."},6642:{message:"Invalid backup state, backup already performed."}};class g extends C{constructor(r){super({tag:"BackupStorageCommandError",...r})}}class h{name="BackupStorage";header={cla:224,ins:107,p1:0,p2:0};getApdu(){return new d(this.header).build()}parseResponse(r){const o=new p(r);if(!u.isSuccessResponse(r)){const t=o.encodeToHexaString(r.statusCode);return c(t,m)?e({error:new g({...m[t],errorCode:t})}):e({error:i.handle(r)})}const a=o.extractFieldByLength(o.getUnparsedRemainingLength());return a===void 0?e({error:new s("Failed to extract app storage data chunk")}):e({data:{chunkData:a,chunkSize:a.length}})}}export{m as BACKUP_STORAGE_ERRORS,h as BackupStorageCommand,g as BackupStorageCommandError};
2
- //# sourceMappingURL=BackupStorageCommand.js.map
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../../../../../src/api/command/os/BackupStorageCommand.ts"],
4
- "sourcesContent": ["import { type Apdu } from \"@api/apdu/model/Apdu\";\nimport { ApduBuilder } from \"@api/apdu/utils/ApduBuilder\";\nimport { ApduParser } from \"@api/apdu/utils/ApduParser\";\nimport { type Command } from \"@api/command/Command\";\nimport { InvalidStatusWordError } from \"@api/command/Errors\";\nimport {\n type CommandResult,\n CommandResultFactory,\n} from \"@api/command/model/CommandResult\";\nimport {\n type CommandErrors,\n isCommandErrorCode,\n} from \"@api/command/utils/CommandErrors\";\nimport { CommandUtils } from \"@api/command/utils/CommandUtils\";\nimport { GlobalCommandErrorHandler } from \"@api/command/utils/GlobalCommandError\";\nimport { type ApduResponse } from \"@api/device-session/ApduResponse\";\nimport { type CommandErrorArgs, DeviceExchangeError } from \"@api/Error\";\n\nexport type BackupStorageCommandResponse = {\n chunkData: Uint8Array;\n chunkSize: number;\n};\n\nexport type BackupStorageCommandErrorCodes =\n | \"5123\"\n | \"5419\"\n | \"541a\"\n | \"541b\"\n | \"541c\"\n | \"622f\"\n | \"6642\";\n\nexport const BACKUP_STORAGE_ERRORS: CommandErrors<BackupStorageCommandErrorCodes> =\n {\n \"5123\": { message: \"Invalid context. Get info must be called.\" },\n \"5419\": { message: \"Failed to generate AES key.\" },\n \"541a\": { message: \"Internal error, crypto operation failed.\" },\n \"541b\": { message: \"Internal error, failed to compute AES CMAC.\" },\n \"541c\": { message: \"Failed to encrypt the app storage backup.\" },\n \"622f\": { message: \"Invalid device state, recovery mode.\" },\n \"6642\": { message: \"Invalid backup state, backup already performed.\" },\n };\n\nexport class BackupStorageCommandError extends DeviceExchangeError<BackupStorageCommandErrorCodes> {\n constructor(args: CommandErrorArgs<BackupStorageCommandErrorCodes>) {\n super({ tag: \"BackupStorageCommandError\", ...args });\n }\n}\n\nexport type BackupStorageCommandResult = CommandResult<\n BackupStorageCommandResponse,\n BackupStorageCommandErrorCodes\n>;\n\nexport class BackupStorageCommand\n implements\n Command<BackupStorageCommandResponse, void, BackupStorageCommandErrorCodes>\n{\n readonly name = \"BackupStorage\";\n\n private readonly header = {\n cla: 0xe0,\n ins: 0x6b,\n p1: 0x00,\n p2: 0x00,\n };\n\n getApdu(): Apdu {\n return new ApduBuilder(this.header).build();\n }\n\n parseResponse(apduResponse: ApduResponse): BackupStorageCommandResult {\n const parser = new ApduParser(apduResponse);\n\n if (!CommandUtils.isSuccessResponse(apduResponse)) {\n const errorCode = parser.encodeToHexaString(apduResponse.statusCode);\n if (isCommandErrorCode(errorCode, BACKUP_STORAGE_ERRORS)) {\n return CommandResultFactory({\n error: new BackupStorageCommandError({\n ...BACKUP_STORAGE_ERRORS[errorCode],\n errorCode,\n }),\n });\n }\n return CommandResultFactory({\n error: GlobalCommandErrorHandler.handle(apduResponse),\n });\n }\n\n const appStorageDataChunk = parser.extractFieldByLength(\n parser.getUnparsedRemainingLength(),\n );\n\n if (appStorageDataChunk === undefined) {\n return CommandResultFactory({\n error: new InvalidStatusWordError(\n \"Failed to extract app storage data chunk\",\n ),\n });\n }\n\n return CommandResultFactory({\n data: {\n chunkData: appStorageDataChunk,\n chunkSize: appStorageDataChunk.length,\n },\n });\n }\n}\n"],
5
- "mappings": "AACA,OAAS,eAAAA,MAAmB,8BAC5B,OAAS,cAAAC,MAAkB,6BAE3B,OAAS,0BAAAC,MAA8B,sBACvC,OAEE,wBAAAC,MACK,mCACP,OAEE,sBAAAC,MACK,mCACP,OAAS,gBAAAC,MAAoB,kCAC7B,OAAS,6BAAAC,MAAiC,wCAE1C,OAAgC,uBAAAC,MAA2B,aAgBpD,MAAMC,EACX,CACE,KAAQ,CAAE,QAAS,2CAA4C,EAC/D,KAAQ,CAAE,QAAS,6BAA8B,EACjD,OAAQ,CAAE,QAAS,0CAA2C,EAC9D,OAAQ,CAAE,QAAS,6CAA8C,EACjE,OAAQ,CAAE,QAAS,2CAA4C,EAC/D,OAAQ,CAAE,QAAS,sCAAuC,EAC1D,KAAQ,CAAE,QAAS,iDAAkD,CACvE,EAEK,MAAMC,UAAkCF,CAAoD,CACjG,YAAYG,EAAwD,CAClE,MAAM,CAAE,IAAK,4BAA6B,GAAGA,CAAK,CAAC,CACrD,CACF,CAOO,MAAMC,CAGb,CACW,KAAO,gBAEC,OAAS,CACxB,IAAK,IACL,IAAK,IACL,GAAI,EACJ,GAAI,CACN,EAEA,SAAgB,CACd,OAAO,IAAIX,EAAY,KAAK,MAAM,EAAE,MAAM,CAC5C,CAEA,cAAcY,EAAwD,CACpE,MAAMC,EAAS,IAAIZ,EAAWW,CAAY,EAE1C,GAAI,CAACP,EAAa,kBAAkBO,CAAY,EAAG,CACjD,MAAME,EAAYD,EAAO,mBAAmBD,EAAa,UAAU,EACnE,OAAIR,EAAmBU,EAAWN,CAAqB,EAC9CL,EAAqB,CAC1B,MAAO,IAAIM,EAA0B,CACnC,GAAGD,EAAsBM,CAAS,EAClC,UAAAA,CACF,CAAC,CACH,CAAC,EAEIX,EAAqB,CAC1B,MAAOG,EAA0B,OAAOM,CAAY,CACtD,CAAC,CACH,CAEA,MAAMG,EAAsBF,EAAO,qBACjCA,EAAO,2BAA2B,CACpC,EAEA,OAAIE,IAAwB,OACnBZ,EAAqB,CAC1B,MAAO,IAAID,EACT,0CACF,CACF,CAAC,EAGIC,EAAqB,CAC1B,KAAM,CACJ,UAAWY,EACX,UAAWA,EAAoB,MACjC,CACF,CAAC,CACH,CACF",
6
- "names": ["ApduBuilder", "ApduParser", "InvalidStatusWordError", "CommandResultFactory", "isCommandErrorCode", "CommandUtils", "GlobalCommandErrorHandler", "DeviceExchangeError", "BACKUP_STORAGE_ERRORS", "BackupStorageCommandError", "args", "BackupStorageCommand", "apduResponse", "parser", "errorCode", "appStorageDataChunk"]
7
- }
@@ -1,2 +0,0 @@
1
- import{isSuccessCommandResult as r}from"../../command/model/CommandResult";import{BackupStorageCommand as o}from"../../command/os/BackupStorageCommand";import{ApduResponse as c}from"../../device-session/ApduResponse";describe("BackupStorageCommand",()=>{describe("Name",()=>{it("name should be 'BackupStorage'",()=>{const e=new o().name;expect(e).toBe("BackupStorage")})}),describe("Command",()=>{it("should return the correct APDU for backing up app storage",()=>{const t=Uint8Array.from([224,107,0,0,0]),e=new o().getApdu();expect(e.getRawApdu()).toEqual(t)})}),describe("Success response",()=>{it("should return the app storage data chunk as a hex string",()=>{const t=Uint8Array.from([144,0]),e=new c({statusCode:t,data:Uint8Array.from([171,205,239,1,35])}),a=new o().parseResponse(e);expect(r(a)).toBe(!0),expect(a).toEqual({data:{chunkData:Uint8Array.from([171,205,239,1,35]),chunkSize:5},status:"SUCCESS"})})}),describe("Error response",()=>{it.each([{description:"get info was not called first",statusCode:[81,35],expectedMessage:"Invalid context. Get info must be called."},{description:"AES key generation fails",statusCode:[84,25],expectedMessage:"Failed to generate AES key."},{description:"crypto operation fails",statusCode:[84,26],expectedMessage:"Internal error, crypto operation failed."},{description:"AES CMAC computation fails",statusCode:[84,27],expectedMessage:"Internal error, failed to compute AES CMAC."},{description:"encryption of backup fails",statusCode:[84,28],expectedMessage:"Failed to encrypt the app storage backup."},{description:"device is in recovery mode",statusCode:[98,47],expectedMessage:"Invalid device state, recovery mode."},{description:"backup was already performed",statusCode:[102,66],expectedMessage:"Invalid backup state, backup already performed."},{description:"error code is not specific to BackupStorageCommand (global error)",statusCode:[85,21],expectedMessage:"Device is locked."}])("should return error when $description",({statusCode:t,expectedMessage:e})=>{const a=new c({statusCode:Uint8Array.from(t),data:new Uint8Array([])}),s=new o().parseResponse(a);expect(r(s)).toBe(!1),expect(s.error.message).toBe(e)})})});
2
- //# sourceMappingURL=BackupStorageCommand.test.js.map
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../../../../../src/api/command/os/BackupStorageCommand.test.ts"],
4
- "sourcesContent": ["import { isSuccessCommandResult } from \"@api/command/model/CommandResult\";\nimport { BackupStorageCommand } from \"@api/command/os/BackupStorageCommand\";\nimport { ApduResponse } from \"@api/device-session/ApduResponse\";\n\ndescribe(\"BackupStorageCommand\", () => {\n describe(\"Name\", () => {\n it(\"name should be 'BackupStorage'\", () => {\n // ARRANGE\n const command = new BackupStorageCommand();\n\n // ACT\n const name = command.name;\n\n // ASSERT\n expect(name).toBe(\"BackupStorage\");\n });\n });\n\n describe(\"Command\", () => {\n it(\"should return the correct APDU for backing up app storage\", () => {\n // ARRANGE\n const expectedApdu = Uint8Array.from([0xe0, 0x6b, 0x00, 0x00, 0x00]);\n\n // ACT\n const apdu = new BackupStorageCommand().getApdu();\n\n // ASSERT\n expect(apdu.getRawApdu()).toEqual(expectedApdu);\n });\n });\n\n describe(\"Success response\", () => {\n it(\"should return the app storage data chunk as a hex string\", () => {\n // ARRANGE\n const statusCode = Uint8Array.from([0x90, 0x00]);\n const response = new ApduResponse({\n statusCode,\n data: Uint8Array.from([0xab, 0xcd, 0xef, 0x01, 0x23]),\n });\n\n // ACT\n const result = new BackupStorageCommand().parseResponse(response);\n\n // ASSERT\n expect(isSuccessCommandResult(result)).toBe(true);\n expect(result).toEqual({\n data: {\n chunkData: Uint8Array.from([0xab, 0xcd, 0xef, 0x01, 0x23]),\n chunkSize: 5,\n },\n status: \"SUCCESS\",\n });\n });\n });\n\n describe(\"Error response\", () => {\n it.each([\n {\n description: \"get info was not called first\",\n statusCode: [0x51, 0x23],\n expectedMessage: \"Invalid context. Get info must be called.\",\n },\n {\n description: \"AES key generation fails\",\n statusCode: [0x54, 0x19],\n expectedMessage: \"Failed to generate AES key.\",\n },\n {\n description: \"crypto operation fails\",\n statusCode: [0x54, 0x1a],\n expectedMessage: \"Internal error, crypto operation failed.\",\n },\n {\n description: \"AES CMAC computation fails\",\n statusCode: [0x54, 0x1b],\n expectedMessage: \"Internal error, failed to compute AES CMAC.\",\n },\n {\n description: \"encryption of backup fails\",\n statusCode: [0x54, 0x1c],\n expectedMessage: \"Failed to encrypt the app storage backup.\",\n },\n {\n description: \"device is in recovery mode\",\n statusCode: [0x62, 0x2f],\n expectedMessage: \"Invalid device state, recovery mode.\",\n },\n {\n description: \"backup was already performed\",\n statusCode: [0x66, 0x42],\n expectedMessage: \"Invalid backup state, backup already performed.\",\n },\n {\n description:\n \"error code is not specific to BackupStorageCommand (global error)\",\n statusCode: [0x55, 0x15],\n expectedMessage: \"Device is locked.\",\n },\n ])(\n \"should return error when $description\",\n ({ statusCode, expectedMessage }) => {\n // ARRANGE\n const response = new ApduResponse({\n statusCode: Uint8Array.from(statusCode),\n data: new Uint8Array([]),\n });\n\n // ACT\n const result = new BackupStorageCommand().parseResponse(response);\n\n // ASSERT\n expect(isSuccessCommandResult(result)).toBe(false);\n expect((result as unknown as { error: Error }).error.message).toBe(\n expectedMessage,\n );\n },\n );\n });\n});\n"],
5
- "mappings": "AAAA,OAAS,0BAAAA,MAA8B,mCACvC,OAAS,wBAAAC,MAA4B,uCACrC,OAAS,gBAAAC,MAAoB,mCAE7B,SAAS,uBAAwB,IAAM,CACrC,SAAS,OAAQ,IAAM,CACrB,GAAG,iCAAkC,IAAM,CAKzC,MAAMC,EAHU,IAAIF,EAAqB,EAGpB,KAGrB,OAAOE,CAAI,EAAE,KAAK,eAAe,CACnC,CAAC,CACH,CAAC,EAED,SAAS,UAAW,IAAM,CACxB,GAAG,4DAA6D,IAAM,CAEpE,MAAMC,EAAe,WAAW,KAAK,CAAC,IAAM,IAAM,EAAM,EAAM,CAAI,CAAC,EAG7DC,EAAO,IAAIJ,EAAqB,EAAE,QAAQ,EAGhD,OAAOI,EAAK,WAAW,CAAC,EAAE,QAAQD,CAAY,CAChD,CAAC,CACH,CAAC,EAED,SAAS,mBAAoB,IAAM,CACjC,GAAG,2DAA4D,IAAM,CAEnE,MAAME,EAAa,WAAW,KAAK,CAAC,IAAM,CAAI,CAAC,EACzCC,EAAW,IAAIL,EAAa,CAChC,WAAAI,EACA,KAAM,WAAW,KAAK,CAAC,IAAM,IAAM,IAAM,EAAM,EAAI,CAAC,CACtD,CAAC,EAGKE,EAAS,IAAIP,EAAqB,EAAE,cAAcM,CAAQ,EAGhE,OAAOP,EAAuBQ,CAAM,CAAC,EAAE,KAAK,EAAI,EAChD,OAAOA,CAAM,EAAE,QAAQ,CACrB,KAAM,CACJ,UAAW,WAAW,KAAK,CAAC,IAAM,IAAM,IAAM,EAAM,EAAI,CAAC,EACzD,UAAW,CACb,EACA,OAAQ,SACV,CAAC,CACH,CAAC,CACH,CAAC,EAED,SAAS,iBAAkB,IAAM,CAC/B,GAAG,KAAK,CACN,CACE,YAAa,gCACb,WAAY,CAAC,GAAM,EAAI,EACvB,gBAAiB,2CACnB,EACA,CACE,YAAa,2BACb,WAAY,CAAC,GAAM,EAAI,EACvB,gBAAiB,6BACnB,EACA,CACE,YAAa,yBACb,WAAY,CAAC,GAAM,EAAI,EACvB,gBAAiB,0CACnB,EACA,CACE,YAAa,6BACb,WAAY,CAAC,GAAM,EAAI,EACvB,gBAAiB,6CACnB,EACA,CACE,YAAa,6BACb,WAAY,CAAC,GAAM,EAAI,EACvB,gBAAiB,2CACnB,EACA,CACE,YAAa,6BACb,WAAY,CAAC,GAAM,EAAI,EACvB,gBAAiB,sCACnB,EACA,CACE,YAAa,+BACb,WAAY,CAAC,IAAM,EAAI,EACvB,gBAAiB,iDACnB,EACA,CACE,YACE,oEACF,WAAY,CAAC,GAAM,EAAI,EACvB,gBAAiB,mBACnB,CACF,CAAC,EACC,wCACA,CAAC,CAAE,WAAAF,EAAY,gBAAAG,CAAgB,IAAM,CAEnC,MAAMF,EAAW,IAAIL,EAAa,CAChC,WAAY,WAAW,KAAKI,CAAU,EACtC,KAAM,IAAI,WAAW,CAAC,CAAC,CACzB,CAAC,EAGKE,EAAS,IAAIP,EAAqB,EAAE,cAAcM,CAAQ,EAGhE,OAAOP,EAAuBQ,CAAM,CAAC,EAAE,KAAK,EAAK,EACjD,OAAQA,EAAuC,MAAM,OAAO,EAAE,KAC5DC,CACF,CACF,CACF,CACF,CAAC,CACH,CAAC",
6
- "names": ["isSuccessCommandResult", "BackupStorageCommand", "ApduResponse", "name", "expectedApdu", "apdu", "statusCode", "response", "result", "expectedMessage"]
7
- }
@@ -1,2 +0,0 @@
1
- import{ApduBuilder as C}from"../../apdu/utils/ApduBuilder";import{ApduParser as S}from"../../apdu/utils/ApduParser";import{InvalidStatusWordError as p}from"../../command/Errors";import{CommandResultFactory as t}from"../../command/model/CommandResult";import{isCommandErrorCode as l}from"../../command/utils/CommandErrors";import{CommandUtils as A}from"../../command/utils/CommandUtils";import{GlobalCommandErrorHandler as c}from"../../command/utils/GlobalCommandError";import{DeviceExchangeError as u}from"../../Error";const g={5123:{message:"Application not found."},"662f":{message:"Device is in recovery mode."},"670a":{message:"Invalid application name length, two chars minimum."}};class I extends u{constructor(e){super({tag:"GetAppStorageInfoCommandError",...e})}}class b{constructor(e){this.args=e}name="GetAppStorageInfo";header={cla:224,ins:106,p1:0,p2:0};getApdu(){const{appName:e}=this.args;return new C(this.header).addAsciiStringToData(e).build()}parseResponse(e){const r=new S(e);if(!A.isSuccessResponse(e)){const o=r.encodeToHexaString(e.statusCode);return l(o,g)?t({error:new I({...g[o],errorCode:o})}):t({error:c.handle(e)})}const a=r.extract32BitUInt();if(a===void 0)return t({error:new p("Failed to extract app storage size")});let s="",m=!1,i=!1,d="";if(a!==0){const o=r.extract32BitUInt();if(o===void 0)return t({error:new p("Failed to extract app storage version")});s=o.toString(16);const n=r.extract16BitUInt();if(n===void 0)return t({error:new p("Failed to extract app storage properties")});m=(n&1)===1,i=(n&2)===2,d=r.encodeToHexaString(r.extractFieldByLength(32))}return t({data:{storageSize:a,storageVersion:s,hasSettings:m,hasData:i,storageHash:d}})}}export{g as GET_APP_STORAGE_INFO_ERRORS,b as GetAppStorageInfoCommand,I as GetAppStorageInfoCommandError};
2
- //# sourceMappingURL=GetAppStorageInfoCommand.js.map
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../../../../../src/api/command/os/GetAppStorageInfoCommand.ts"],
4
- "sourcesContent": ["import { type Apdu } from \"@api/apdu/model/Apdu\";\nimport { ApduBuilder } from \"@api/apdu/utils/ApduBuilder\";\nimport { ApduParser } from \"@api/apdu/utils/ApduParser\";\nimport { type Command } from \"@api/command/Command\";\nimport { InvalidStatusWordError } from \"@api/command/Errors\";\nimport {\n type CommandResult,\n CommandResultFactory,\n} from \"@api/command/model/CommandResult\";\nimport { isCommandErrorCode } from \"@api/command/utils/CommandErrors\";\nimport { type CommandErrors } from \"@api/command/utils/CommandErrors\";\nimport { CommandUtils } from \"@api/command/utils/CommandUtils\";\nimport { GlobalCommandErrorHandler } from \"@api/command/utils/GlobalCommandError\";\nimport { type ApduResponse } from \"@api/device-session/ApduResponse\";\nimport { type CommandErrorArgs, DeviceExchangeError } from \"@api/Error\";\n\nexport type GetAppStorageInfoCommandArgs = {\n appName: string;\n};\n\nexport type GetAppStorageInfoCommandResponse = {\n storageSize: number;\n storageVersion: string;\n hasSettings: boolean;\n hasData: boolean;\n storageHash: string;\n};\n\nexport type GetAppStorageInfoCommandErrorCodes = \"5123\" | \"662f\" | \"670a\";\n\nexport const GET_APP_STORAGE_INFO_ERRORS: CommandErrors<GetAppStorageInfoCommandErrorCodes> =\n {\n \"5123\": { message: \"Application not found.\" },\n \"662f\": { message: \"Device is in recovery mode.\" },\n \"670a\": { message: \"Invalid application name length, two chars minimum.\" },\n };\n\nexport class GetAppStorageInfoCommandError extends DeviceExchangeError<GetAppStorageInfoCommandErrorCodes> {\n constructor(args: CommandErrorArgs<GetAppStorageInfoCommandErrorCodes>) {\n super({ tag: \"GetAppStorageInfoCommandError\", ...args });\n }\n}\n\nexport type GetAppStorageInfoCommandResult = CommandResult<\n GetAppStorageInfoCommandResponse,\n GetAppStorageInfoCommandErrorCodes\n>;\n\nexport class GetAppStorageInfoCommand\n implements\n Command<\n GetAppStorageInfoCommandResponse,\n GetAppStorageInfoCommandArgs,\n GetAppStorageInfoCommandErrorCodes\n >\n{\n readonly name = \"GetAppStorageInfo\";\n\n private readonly header = {\n cla: 0xe0,\n ins: 0x6a,\n p1: 0x00,\n p2: 0x00,\n };\n\n constructor(private readonly args: GetAppStorageInfoCommandArgs) {}\n\n getApdu(): Apdu {\n const { appName } = this.args;\n return new ApduBuilder(this.header).addAsciiStringToData(appName).build();\n }\n\n parseResponse(apduResponse: ApduResponse): GetAppStorageInfoCommandResult {\n const parser = new ApduParser(apduResponse);\n if (!CommandUtils.isSuccessResponse(apduResponse)) {\n const errorCode = parser.encodeToHexaString(apduResponse.statusCode);\n if (isCommandErrorCode(errorCode, GET_APP_STORAGE_INFO_ERRORS)) {\n return CommandResultFactory({\n error: new GetAppStorageInfoCommandError({\n ...GET_APP_STORAGE_INFO_ERRORS[errorCode],\n errorCode,\n }),\n });\n }\n return CommandResultFactory({\n error: GlobalCommandErrorHandler.handle(apduResponse),\n });\n }\n\n const appStorageSize = parser.extract32BitUInt();\n if (appStorageSize === undefined) {\n return CommandResultFactory({\n error: new InvalidStatusWordError(\"Failed to extract app storage size\"),\n });\n }\n\n let appStorageVersion = \"\";\n let hasAppStorageSettings = false;\n let hasAppStorageData = false;\n let hash = \"\";\n\n if (appStorageSize !== 0) {\n const appStorageVersionNumber = parser.extract32BitUInt();\n if (appStorageVersionNumber === undefined) {\n return CommandResultFactory({\n error: new InvalidStatusWordError(\n \"Failed to extract app storage version\",\n ),\n });\n }\n appStorageVersion = appStorageVersionNumber.toString(16);\n /**\n * The properties byte is a bitfield with the following structure:\n * - Bit 0: hasSettings\n * - Bit 1: hasData\n */\n const appStorageProperties = parser.extract16BitUInt();\n if (appStorageProperties === undefined) {\n return CommandResultFactory({\n error: new InvalidStatusWordError(\n \"Failed to extract app storage properties\",\n ),\n });\n }\n\n hasAppStorageSettings = (appStorageProperties & 1) === 1;\n hasAppStorageData = (appStorageProperties & 2) === 2;\n hash = parser.encodeToHexaString(parser.extractFieldByLength(0x20));\n }\n\n return CommandResultFactory({\n data: {\n storageSize: appStorageSize,\n storageVersion: appStorageVersion,\n hasSettings: hasAppStorageSettings,\n hasData: hasAppStorageData,\n storageHash: hash,\n },\n });\n }\n}\n"],
5
- "mappings": "AACA,OAAS,eAAAA,MAAmB,8BAC5B,OAAS,cAAAC,MAAkB,6BAE3B,OAAS,0BAAAC,MAA8B,sBACvC,OAEE,wBAAAC,MACK,mCACP,OAAS,sBAAAC,MAA0B,mCAEnC,OAAS,gBAAAC,MAAoB,kCAC7B,OAAS,6BAAAC,MAAiC,wCAE1C,OAAgC,uBAAAC,MAA2B,aAgBpD,MAAMC,EACX,CACE,KAAQ,CAAE,QAAS,wBAAyB,EAC5C,OAAQ,CAAE,QAAS,6BAA8B,EACjD,OAAQ,CAAE,QAAS,qDAAsD,CAC3E,EAEK,MAAMC,UAAsCF,CAAwD,CACzG,YAAYG,EAA4D,CACtE,MAAM,CAAE,IAAK,gCAAiC,GAAGA,CAAK,CAAC,CACzD,CACF,CAOO,MAAMC,CAOb,CAUE,YAA6BD,EAAoC,CAApC,UAAAA,CAAqC,CATzD,KAAO,oBAEC,OAAS,CACxB,IAAK,IACL,IAAK,IACL,GAAI,EACJ,GAAI,CACN,EAIA,SAAgB,CACd,KAAM,CAAE,QAAAE,CAAQ,EAAI,KAAK,KACzB,OAAO,IAAIZ,EAAY,KAAK,MAAM,EAAE,qBAAqBY,CAAO,EAAE,MAAM,CAC1E,CAEA,cAAcC,EAA4D,CACxE,MAAMC,EAAS,IAAIb,EAAWY,CAAY,EAC1C,GAAI,CAACR,EAAa,kBAAkBQ,CAAY,EAAG,CACjD,MAAME,EAAYD,EAAO,mBAAmBD,EAAa,UAAU,EACnE,OAAIT,EAAmBW,EAAWP,CAA2B,EACpDL,EAAqB,CAC1B,MAAO,IAAIM,EAA8B,CACvC,GAAGD,EAA4BO,CAAS,EACxC,UAAAA,CACF,CAAC,CACH,CAAC,EAEIZ,EAAqB,CAC1B,MAAOG,EAA0B,OAAOO,CAAY,CACtD,CAAC,CACH,CAEA,MAAMG,EAAiBF,EAAO,iBAAiB,EAC/C,GAAIE,IAAmB,OACrB,OAAOb,EAAqB,CAC1B,MAAO,IAAID,EAAuB,oCAAoC,CACxE,CAAC,EAGH,IAAIe,EAAoB,GACpBC,EAAwB,GACxBC,EAAoB,GACpBC,EAAO,GAEX,GAAIJ,IAAmB,EAAG,CACxB,MAAMK,EAA0BP,EAAO,iBAAiB,EACxD,GAAIO,IAA4B,OAC9B,OAAOlB,EAAqB,CAC1B,MAAO,IAAID,EACT,uCACF,CACF,CAAC,EAEHe,EAAoBI,EAAwB,SAAS,EAAE,EAMvD,MAAMC,EAAuBR,EAAO,iBAAiB,EACrD,GAAIQ,IAAyB,OAC3B,OAAOnB,EAAqB,CAC1B,MAAO,IAAID,EACT,0CACF,CACF,CAAC,EAGHgB,GAAyBI,EAAuB,KAAO,EACvDH,GAAqBG,EAAuB,KAAO,EACnDF,EAAON,EAAO,mBAAmBA,EAAO,qBAAqB,EAAI,CAAC,CACpE,CAEA,OAAOX,EAAqB,CAC1B,KAAM,CACJ,YAAaa,EACb,eAAgBC,EAChB,YAAaC,EACb,QAASC,EACT,YAAaC,CACf,CACF,CAAC,CACH,CACF",
6
- "names": ["ApduBuilder", "ApduParser", "InvalidStatusWordError", "CommandResultFactory", "isCommandErrorCode", "CommandUtils", "GlobalCommandErrorHandler", "DeviceExchangeError", "GET_APP_STORAGE_INFO_ERRORS", "GetAppStorageInfoCommandError", "args", "GetAppStorageInfoCommand", "appName", "apduResponse", "parser", "errorCode", "appStorageSize", "appStorageVersion", "hasAppStorageSettings", "hasAppStorageData", "hash", "appStorageVersionNumber", "appStorageProperties"]
7
- }
@@ -1,2 +0,0 @@
1
- import{InvalidStatusWordError as p}from"../../command/Errors";import{isSuccessCommandResult as s}from"../../command/model/CommandResult";import{GetAppStorageInfoCommand as o}from"../../command/os/GetAppStorageInfoCommand";import{ApduResponse as n}from"../../device-session/ApduResponse";describe("GetAppStorageInfoCommand",()=>{describe("Name",()=>{it("name should be 'GetAppStorageInfo'",()=>{const e=new o({appName:"MyApp"}).name;expect(e).toBe("GetAppStorageInfo")})}),describe("Command",()=>{it("should return the correct APDU for getting the app storage info",()=>{const t=Uint8Array.from([224,106,0,0,5,77,121,65,112,112]),e=new o({appName:"MyApp"}).getApdu();expect(e.getRawApdu()).toEqual(t)})}),describe("Success response",()=>{it("should return correct app storage info when app storage size is not 0",()=>{const t=Uint8Array.from([144,0]),e=new n({statusCode:t,data:Uint8Array.from([0,0,0,1,0,0,0,1,0,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,1])}),r=new o({appName:"MyApp"}).parseResponse(e);expect(s(r)).toBe(!0),expect(r).toEqual({data:{storageSize:1,storageVersion:"1",hasSettings:!0,hasData:!0,storageHash:"0000000000000000000000000000000000000000000000000000000000000001"},status:"SUCCESS"})}),it("should return correct app storage info when app storage size is 0",()=>{const t=Uint8Array.from([144,0]),e=new n({statusCode:t,data:Uint8Array.from([0,0,0,0])}),r=new o({appName:"MyApp"}).parseResponse(e);expect(s(r)).toBe(!0),expect(r).toEqual({data:{storageSize:0,storageVersion:"",hasSettings:!1,hasData:!1,storageHash:""},status:"SUCCESS"})})}),describe("Error response",()=>{it.each([{description:"application is not found",statusCode:[81,35],expectedMessage:"Application not found."},{description:"device is in recovery mode",statusCode:[102,47],expectedMessage:"Device is in recovery mode."},{description:"application name length is invalid",statusCode:[103,10],expectedMessage:"Invalid application name length, two chars minimum."},{description:"error code is not specific to GetAppStorageInfoCommand (global error)",statusCode:[85,21],expectedMessage:"Device is locked."}])("should return error when $description",({statusCode:t,expectedMessage:e})=>{const r=new n({statusCode:Uint8Array.from(t),data:new Uint8Array([])}),a=new o({appName:"MyApp"}).parseResponse(r);expect(s(a)).toBe(!1),expect(a.error.message).toBe(e)}),it.each([{description:"app storage size extraction fails",data:new Uint8Array([]),expectedOriginalMessage:"Failed to extract app storage size"},{description:"app storage version extraction fails",data:Uint8Array.from([0,0,0,1]),expectedOriginalMessage:"Failed to extract app storage version"},{description:"app storage properties extraction fails",data:Uint8Array.from([0,0,0,1,0,0,0,1]),expectedOriginalMessage:"Failed to extract app storage properties"}])("should return error when $description",({data:t,expectedOriginalMessage:e})=>{const r=new n({statusCode:Uint8Array.from([144,0]),data:t}),a=new o({appName:"MyApp"}).parseResponse(r);expect(s(a)).toBe(!1),expect(a.error).toBeInstanceOf(p),expect(a.error.originalError?.message).toBe(e)})})});
2
- //# sourceMappingURL=GetAppStorageInfoCommand.test.js.map
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../../../../../src/api/command/os/GetAppStorageInfoCommand.test.ts"],
4
- "sourcesContent": ["import { InvalidStatusWordError } from \"@api/command/Errors\";\nimport { isSuccessCommandResult } from \"@api/command/model/CommandResult\";\nimport { GetAppStorageInfoCommand } from \"@api/command/os/GetAppStorageInfoCommand\";\nimport { ApduResponse } from \"@api/device-session/ApduResponse\";\n\ndescribe(\"GetAppStorageInfoCommand\", () => {\n describe(\"Name\", () => {\n it(\"name should be 'GetAppStorageInfo'\", () => {\n // ARRANGE\n const command = new GetAppStorageInfoCommand({ appName: \"MyApp\" });\n\n // ACT\n const name = command.name;\n\n // ASSERT\n expect(name).toBe(\"GetAppStorageInfo\");\n });\n });\n\n describe(\"Command\", () => {\n it(\"should return the correct APDU for getting the app storage info\", () => {\n // ARRANGE\n const expectedApdu = Uint8Array.from([\n 0xe0, 0x6a, 0x00, 0x00, 0x05, 0x4d, 0x79, 0x41, 0x70, 0x70,\n ]);\n\n // ACT\n const apdu = new GetAppStorageInfoCommand({ appName: \"MyApp\" }).getApdu();\n\n // ASSERT\n expect(apdu.getRawApdu()).toEqual(expectedApdu);\n });\n });\n\n describe(\"Success response\", () => {\n it(\"should return correct app storage info when app storage size is not 0\", () => {\n // ARRANGE\n const statusCode = Uint8Array.from([0x90, 0x00]);\n const response = new ApduResponse({\n statusCode,\n data: Uint8Array.from([\n // appStorageSize (32-bit BE) = 1\n 0x00, 0x00, 0x00, 0x01,\n // appStorageVersion (32-bit BE) = 1\n 0x00, 0x00, 0x00, 0x01,\n // appStorageProperties (16-bit BE) = 0x0003 (bits 0 and 1 set)\n 0x00, 0x03,\n // appStorageHash (32 bytes)\n 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01,\n ]),\n });\n\n // ACT\n const result = new GetAppStorageInfoCommand({\n appName: \"MyApp\",\n }).parseResponse(response);\n\n // ASSERT\n expect(isSuccessCommandResult(result)).toBe(true);\n expect(result).toEqual({\n data: {\n storageSize: 1,\n storageVersion: \"1\",\n hasSettings: true,\n hasData: true,\n storageHash:\n \"0000000000000000000000000000000000000000000000000000000000000001\",\n },\n status: \"SUCCESS\",\n });\n });\n\n it(\"should return correct app storage info when app storage size is 0\", () => {\n // ARRANGE\n const statusCode = Uint8Array.from([0x90, 0x00]);\n const response = new ApduResponse({\n statusCode,\n data: Uint8Array.from([\n // appStorageSize (32-bit BE) = 0\n 0x00, 0x00, 0x00, 0x00,\n ]),\n });\n\n // ACT\n const result = new GetAppStorageInfoCommand({\n appName: \"MyApp\",\n }).parseResponse(response);\n\n // ASSERT\n expect(isSuccessCommandResult(result)).toBe(true);\n expect(result).toEqual({\n data: {\n storageSize: 0,\n storageVersion: \"\",\n hasSettings: false,\n hasData: false,\n storageHash: \"\",\n },\n status: \"SUCCESS\",\n });\n });\n });\n\n describe(\"Error response\", () => {\n it.each([\n {\n description: \"application is not found\",\n statusCode: [0x51, 0x23],\n expectedMessage: \"Application not found.\",\n },\n {\n description: \"device is in recovery mode\",\n statusCode: [0x66, 0x2f],\n expectedMessage: \"Device is in recovery mode.\",\n },\n {\n description: \"application name length is invalid\",\n statusCode: [0x67, 0x0a],\n expectedMessage: \"Invalid application name length, two chars minimum.\",\n },\n {\n description:\n \"error code is not specific to GetAppStorageInfoCommand (global error)\",\n statusCode: [0x55, 0x15],\n expectedMessage: \"Device is locked.\",\n },\n ])(\n \"should return error when $description\",\n ({ statusCode, expectedMessage }) => {\n // ARRANGE\n const response = new ApduResponse({\n statusCode: Uint8Array.from(statusCode),\n data: new Uint8Array([]),\n });\n\n // ACT\n const result = new GetAppStorageInfoCommand({\n appName: \"MyApp\",\n }).parseResponse(response);\n\n // ASSERT\n expect(isSuccessCommandResult(result)).toBe(false);\n expect((result as unknown as { error: Error }).error.message).toBe(\n expectedMessage,\n );\n },\n );\n\n it.each([\n {\n description: \"app storage size extraction fails\",\n data: new Uint8Array([]),\n expectedOriginalMessage: \"Failed to extract app storage size\",\n },\n {\n description: \"app storage version extraction fails\",\n data: Uint8Array.from([0x00, 0x00, 0x00, 0x01]),\n expectedOriginalMessage: \"Failed to extract app storage version\",\n },\n {\n description: \"app storage properties extraction fails\",\n data: Uint8Array.from([0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01]),\n expectedOriginalMessage: \"Failed to extract app storage properties\",\n },\n ])(\n \"should return error when $description\",\n ({ data, expectedOriginalMessage }) => {\n // ARRANGE\n const response = new ApduResponse({\n statusCode: Uint8Array.from([0x90, 0x00]),\n data,\n });\n\n // ACT\n const result = new GetAppStorageInfoCommand({\n appName: \"MyApp\",\n }).parseResponse(response);\n\n // ASSERT\n expect(isSuccessCommandResult(result)).toBe(false);\n expect(\n (result as unknown as { error: InvalidStatusWordError }).error,\n ).toBeInstanceOf(InvalidStatusWordError);\n expect(\n (result as unknown as { error: InvalidStatusWordError }).error\n .originalError?.message,\n ).toBe(expectedOriginalMessage);\n },\n );\n });\n});\n"],
5
- "mappings": "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",
6
- "names": ["InvalidStatusWordError", "isSuccessCommandResult", "GetAppStorageInfoCommand", "ApduResponse", "name", "expectedApdu", "apdu", "statusCode", "response", "result", "expectedMessage", "data", "expectedOriginalMessage"]
7
- }
@@ -1,2 +0,0 @@
1
- import{ApduBuilder as m}from"../../apdu/utils/ApduBuilder";import{ApduParser as s}from"../../apdu/utils/ApduParser";import{CommandResultFactory as t}from"../../command/model/CommandResult";import{isCommandErrorCode as p}from"../../command/utils/CommandErrors";import{CommandUtils as d}from"../../command/utils/CommandUtils";import{GlobalCommandErrorHandler as i}from"../../command/utils/GlobalCommandError";import{DeviceExchangeError as g}from"../../Error";const a={5123:{message:"Application not found."},"662f":{message:"Invalid device state, recovery mode."},5501:{message:"Invalid consent, user rejected."},5502:{message:"Invalid consent, pin is not set."},"670a":{message:"Invalid application name length, two chars minimum."},6733:{message:"Invalid backup length value."}};class C extends g{constructor(r){super({tag:"InitRestoreAppStorageCommandError",...r})}}class E{constructor(r){this.args=r}name="InitRestoreAppStorage";header={cla:224,ins:108,p1:0,p2:0};getApdu(){const{appName:r,backupLength:e}=this.args;return new m(this.header).add32BitUIntToData(e).addAsciiStringToData(r).build()}parseResponse(r){const e=new s(r);if(!d.isSuccessResponse(r)){const o=e.encodeToHexaString(r.statusCode);return p(o,a)?t({error:new C({...a[o],errorCode:o})}):t({error:i.handle(r)})}return t({data:void 0})}}export{a as INIT_RESTORE_APP_STORAGE_ERRORS,E as InitRestoreAppStorageCommand,C as InitRestoreAppStorageCommandError};
2
- //# sourceMappingURL=InitRestoreAppStorageCommand.js.map
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../../../../../src/api/command/os/InitRestoreAppStorageCommand.ts"],
4
- "sourcesContent": ["import { type Apdu } from \"@api/apdu/model/Apdu\";\nimport { ApduBuilder } from \"@api/apdu/utils/ApduBuilder\";\nimport { ApduParser } from \"@api/apdu/utils/ApduParser\";\nimport { type Command } from \"@api/command/Command\";\nimport {\n type CommandResult,\n CommandResultFactory,\n} from \"@api/command/model/CommandResult\";\nimport {\n type CommandErrors,\n isCommandErrorCode,\n} from \"@api/command/utils/CommandErrors\";\nimport { CommandUtils } from \"@api/command/utils/CommandUtils\";\nimport { GlobalCommandErrorHandler } from \"@api/command/utils/GlobalCommandError\";\nimport { type ApduResponse } from \"@api/device-session/ApduResponse\";\nimport { type CommandErrorArgs, DeviceExchangeError } from \"@api/Error\";\n\nexport type InitRestoreAppStorageCommandArgs = {\n appName: string;\n backupLength: number;\n};\n\nexport type InitRestoreAppStorageCommandErrorCodes =\n | \"5123\"\n | \"662f\"\n | \"5501\"\n | \"5502\"\n | \"670a\"\n | \"6733\";\n\nexport const INIT_RESTORE_APP_STORAGE_ERRORS: CommandErrors<InitRestoreAppStorageCommandErrorCodes> =\n {\n \"5123\": { message: \"Application not found.\" },\n \"662f\": { message: \"Invalid device state, recovery mode.\" },\n \"5501\": { message: \"Invalid consent, user rejected.\" },\n \"5502\": { message: \"Invalid consent, pin is not set.\" },\n \"670a\": { message: \"Invalid application name length, two chars minimum.\" },\n \"6733\": { message: \"Invalid backup length value.\" },\n };\n\nexport class InitRestoreAppStorageCommandError extends DeviceExchangeError<InitRestoreAppStorageCommandErrorCodes> {\n constructor(args: CommandErrorArgs<InitRestoreAppStorageCommandErrorCodes>) {\n super({ tag: \"InitRestoreAppStorageCommandError\", ...args });\n }\n}\n\nexport type InitRestoreAppStorageCommandResult = CommandResult<\n void,\n InitRestoreAppStorageCommandErrorCodes\n>;\n\nexport class InitRestoreAppStorageCommand\n implements\n Command<\n void,\n InitRestoreAppStorageCommandArgs,\n InitRestoreAppStorageCommandErrorCodes\n >\n{\n readonly name = \"InitRestoreAppStorage\";\n\n private readonly header = {\n cla: 0xe0,\n ins: 0x6c,\n p1: 0x00,\n p2: 0x00,\n };\n\n constructor(private readonly args: InitRestoreAppStorageCommandArgs) {}\n\n getApdu(): Apdu {\n const { appName, backupLength } = this.args;\n return new ApduBuilder(this.header)\n .add32BitUIntToData(backupLength)\n .addAsciiStringToData(appName)\n .build();\n }\n\n parseResponse(\n apduResponse: ApduResponse,\n ): InitRestoreAppStorageCommandResult {\n const parser = new ApduParser(apduResponse);\n if (!CommandUtils.isSuccessResponse(apduResponse)) {\n const errorCode = parser.encodeToHexaString(apduResponse.statusCode);\n if (isCommandErrorCode(errorCode, INIT_RESTORE_APP_STORAGE_ERRORS)) {\n return CommandResultFactory({\n error: new InitRestoreAppStorageCommandError({\n ...INIT_RESTORE_APP_STORAGE_ERRORS[errorCode],\n errorCode,\n }),\n });\n }\n return CommandResultFactory({\n error: GlobalCommandErrorHandler.handle(apduResponse),\n });\n }\n\n return CommandResultFactory({\n data: undefined,\n });\n }\n}\n"],
5
- "mappings": "AACA,OAAS,eAAAA,MAAmB,8BAC5B,OAAS,cAAAC,MAAkB,6BAE3B,OAEE,wBAAAC,MACK,mCACP,OAEE,sBAAAC,MACK,mCACP,OAAS,gBAAAC,MAAoB,kCAC7B,OAAS,6BAAAC,MAAiC,wCAE1C,OAAgC,uBAAAC,MAA2B,aAepD,MAAMC,EACX,CACE,KAAQ,CAAE,QAAS,wBAAyB,EAC5C,OAAQ,CAAE,QAAS,sCAAuC,EAC1D,KAAQ,CAAE,QAAS,iCAAkC,EACrD,KAAQ,CAAE,QAAS,kCAAmC,EACtD,OAAQ,CAAE,QAAS,qDAAsD,EACzE,KAAQ,CAAE,QAAS,8BAA+B,CACpD,EAEK,MAAMC,UAA0CF,CAA4D,CACjH,YAAYG,EAAgE,CAC1E,MAAM,CAAE,IAAK,oCAAqC,GAAGA,CAAK,CAAC,CAC7D,CACF,CAOO,MAAMC,CAOb,CAUE,YAA6BD,EAAwC,CAAxC,UAAAA,CAAyC,CAT7D,KAAO,wBAEC,OAAS,CACxB,IAAK,IACL,IAAK,IACL,GAAI,EACJ,GAAI,CACN,EAIA,SAAgB,CACd,KAAM,CAAE,QAAAE,EAAS,aAAAC,CAAa,EAAI,KAAK,KACvC,OAAO,IAAIZ,EAAY,KAAK,MAAM,EAC/B,mBAAmBY,CAAY,EAC/B,qBAAqBD,CAAO,EAC5B,MAAM,CACX,CAEA,cACEE,EACoC,CACpC,MAAMC,EAAS,IAAIb,EAAWY,CAAY,EAC1C,GAAI,CAACT,EAAa,kBAAkBS,CAAY,EAAG,CACjD,MAAME,EAAYD,EAAO,mBAAmBD,EAAa,UAAU,EACnE,OAAIV,EAAmBY,EAAWR,CAA+B,EACxDL,EAAqB,CAC1B,MAAO,IAAIM,EAAkC,CAC3C,GAAGD,EAAgCQ,CAAS,EAC5C,UAAAA,CACF,CAAC,CACH,CAAC,EAEIb,EAAqB,CAC1B,MAAOG,EAA0B,OAAOQ,CAAY,CACtD,CAAC,CACH,CAEA,OAAOX,EAAqB,CAC1B,KAAM,MACR,CAAC,CACH,CACF",
6
- "names": ["ApduBuilder", "ApduParser", "CommandResultFactory", "isCommandErrorCode", "CommandUtils", "GlobalCommandErrorHandler", "DeviceExchangeError", "INIT_RESTORE_APP_STORAGE_ERRORS", "InitRestoreAppStorageCommandError", "args", "InitRestoreAppStorageCommand", "appName", "backupLength", "apduResponse", "parser", "errorCode"]
7
- }
@@ -1,2 +0,0 @@
1
- import{isSuccessCommandResult as n}from"../../command/model/CommandResult";import{InitRestoreAppStorageCommand as s}from"../../command/os/InitRestoreAppStorageCommand";import{ApduResponse as a}from"../../device-session/ApduResponse";describe("InitRestoreAppStorageCommand",()=>{describe("Name",()=>{it("name should be 'InitRestoreAppStorage'",()=>{const e=new s({appName:"MyApp",backupLength:10}).name;expect(e).toBe("InitRestoreAppStorage")})}),describe("Command",()=>{it("should return the correct APDU for initializing an app storage restore",()=>{const t=Uint8Array.from([224,108,0,0,9,0,0,0,10,77,121,65,112,112]),e=new s({appName:"MyApp",backupLength:10}).getApdu();expect(e.getRawApdu()).toEqual(t)})}),describe("Success response",()=>{it("should return a success result",()=>{const t=new a({statusCode:Uint8Array.from([144,0]),data:new Uint8Array([])}),e=new s({appName:"MyApp",backupLength:10}).parseResponse(t);expect(n(e)).toBe(!0),expect(e).toEqual({data:void 0,status:"SUCCESS"})})}),describe("Error response",()=>{it.each([{description:"application is not found",statusCode:[81,35],expectedMessage:"Application not found."},{description:"device is in recovery mode",statusCode:[102,47],expectedMessage:"Invalid device state, recovery mode."},{description:"user rejected the consent",statusCode:[85,1],expectedMessage:"Invalid consent, user rejected."},{description:"pin is not set",statusCode:[85,2],expectedMessage:"Invalid consent, pin is not set."},{description:"application name length is invalid",statusCode:[103,10],expectedMessage:"Invalid application name length, two chars minimum."},{description:"backup length value is invalid",statusCode:[103,51],expectedMessage:"Invalid backup length value."},{description:"error code is not specific to InitRestoreAppStorageCommand (global error)",statusCode:[85,21],expectedMessage:"Device is locked."}])("should return error when $description",({statusCode:t,expectedMessage:e})=>{const r=new a({statusCode:Uint8Array.from(t),data:new Uint8Array([])}),o=new s({appName:"MyApp",backupLength:10}).parseResponse(r);expect(n(o)).toBe(!1),expect(o.error.message).toBe(e)})})});
2
- //# sourceMappingURL=InitRestoreAppStorageCommand.test.js.map
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../../../../../src/api/command/os/InitRestoreAppStorageCommand.test.ts"],
4
- "sourcesContent": ["import { isSuccessCommandResult } from \"@api/command/model/CommandResult\";\nimport { InitRestoreAppStorageCommand } from \"@api/command/os/InitRestoreAppStorageCommand\";\nimport { ApduResponse } from \"@api/device-session/ApduResponse\";\n\ndescribe(\"InitRestoreAppStorageCommand\", () => {\n describe(\"Name\", () => {\n it(\"name should be 'InitRestoreAppStorage'\", () => {\n // ARRANGE\n const command = new InitRestoreAppStorageCommand({\n appName: \"MyApp\",\n backupLength: 10,\n });\n\n // ACT\n const name = command.name;\n\n // ASSERT\n expect(name).toBe(\"InitRestoreAppStorage\");\n });\n });\n\n describe(\"Command\", () => {\n it(\"should return the correct APDU for initializing an app storage restore\", () => {\n // ARRANGE\n const expectedApdu = Uint8Array.from([\n 0xe0, 0x6c, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x0a, 0x4d, 0x79, 0x41,\n 0x70, 0x70,\n ]);\n\n // ACT\n const apdu = new InitRestoreAppStorageCommand({\n appName: \"MyApp\",\n backupLength: 10,\n }).getApdu();\n\n // ASSERT\n expect(apdu.getRawApdu()).toEqual(expectedApdu);\n });\n });\n\n describe(\"Success response\", () => {\n it(\"should return a success result\", () => {\n // ARRANGE\n const response = new ApduResponse({\n statusCode: Uint8Array.from([0x90, 0x00]),\n data: new Uint8Array([]),\n });\n\n // ACT\n const result = new InitRestoreAppStorageCommand({\n appName: \"MyApp\",\n backupLength: 10,\n }).parseResponse(response);\n\n // ASSERT\n expect(isSuccessCommandResult(result)).toBe(true);\n expect(result).toEqual({\n data: undefined,\n status: \"SUCCESS\",\n });\n });\n });\n\n describe(\"Error response\", () => {\n it.each([\n {\n description: \"application is not found\",\n statusCode: [0x51, 0x23],\n expectedMessage: \"Application not found.\",\n },\n {\n description: \"device is in recovery mode\",\n statusCode: [0x66, 0x2f],\n expectedMessage: \"Invalid device state, recovery mode.\",\n },\n {\n description: \"user rejected the consent\",\n statusCode: [0x55, 0x01],\n expectedMessage: \"Invalid consent, user rejected.\",\n },\n {\n description: \"pin is not set\",\n statusCode: [0x55, 0x02],\n expectedMessage: \"Invalid consent, pin is not set.\",\n },\n {\n description: \"application name length is invalid\",\n statusCode: [0x67, 0x0a],\n expectedMessage: \"Invalid application name length, two chars minimum.\",\n },\n {\n description: \"backup length value is invalid\",\n statusCode: [0x67, 0x33],\n expectedMessage: \"Invalid backup length value.\",\n },\n {\n description:\n \"error code is not specific to InitRestoreAppStorageCommand (global error)\",\n statusCode: [0x55, 0x15],\n expectedMessage: \"Device is locked.\",\n },\n ])(\n \"should return error when $description\",\n ({ statusCode, expectedMessage }) => {\n // ARRANGE\n const response = new ApduResponse({\n statusCode: Uint8Array.from(statusCode),\n data: new Uint8Array([]),\n });\n\n // ACT\n const result = new InitRestoreAppStorageCommand({\n appName: \"MyApp\",\n backupLength: 10,\n }).parseResponse(response);\n\n // ASSERT\n expect(isSuccessCommandResult(result)).toBe(false);\n expect((result as unknown as { error: Error }).error.message).toBe(\n expectedMessage,\n );\n },\n );\n });\n});\n"],
5
- "mappings": "AAAA,OAAS,0BAAAA,MAA8B,mCACvC,OAAS,gCAAAC,MAAoC,+CAC7C,OAAS,gBAAAC,MAAoB,mCAE7B,SAAS,+BAAgC,IAAM,CAC7C,SAAS,OAAQ,IAAM,CACrB,GAAG,yCAA0C,IAAM,CAQjD,MAAMC,EANU,IAAIF,EAA6B,CAC/C,QAAS,QACT,aAAc,EAChB,CAAC,EAGoB,KAGrB,OAAOE,CAAI,EAAE,KAAK,uBAAuB,CAC3C,CAAC,CACH,CAAC,EAED,SAAS,UAAW,IAAM,CACxB,GAAG,yEAA0E,IAAM,CAEjF,MAAMC,EAAe,WAAW,KAAK,CACnC,IAAM,IAAM,EAAM,EAAM,EAAM,EAAM,EAAM,EAAM,GAAM,GAAM,IAAM,GAClE,IAAM,GACR,CAAC,EAGKC,EAAO,IAAIJ,EAA6B,CAC5C,QAAS,QACT,aAAc,EAChB,CAAC,EAAE,QAAQ,EAGX,OAAOI,EAAK,WAAW,CAAC,EAAE,QAAQD,CAAY,CAChD,CAAC,CACH,CAAC,EAED,SAAS,mBAAoB,IAAM,CACjC,GAAG,iCAAkC,IAAM,CAEzC,MAAME,EAAW,IAAIJ,EAAa,CAChC,WAAY,WAAW,KAAK,CAAC,IAAM,CAAI,CAAC,EACxC,KAAM,IAAI,WAAW,CAAC,CAAC,CACzB,CAAC,EAGKK,EAAS,IAAIN,EAA6B,CAC9C,QAAS,QACT,aAAc,EAChB,CAAC,EAAE,cAAcK,CAAQ,EAGzB,OAAON,EAAuBO,CAAM,CAAC,EAAE,KAAK,EAAI,EAChD,OAAOA,CAAM,EAAE,QAAQ,CACrB,KAAM,OACN,OAAQ,SACV,CAAC,CACH,CAAC,CACH,CAAC,EAED,SAAS,iBAAkB,IAAM,CAC/B,GAAG,KAAK,CACN,CACE,YAAa,2BACb,WAAY,CAAC,GAAM,EAAI,EACvB,gBAAiB,wBACnB,EACA,CACE,YAAa,6BACb,WAAY,CAAC,IAAM,EAAI,EACvB,gBAAiB,sCACnB,EACA,CACE,YAAa,4BACb,WAAY,CAAC,GAAM,CAAI,EACvB,gBAAiB,iCACnB,EACA,CACE,YAAa,iBACb,WAAY,CAAC,GAAM,CAAI,EACvB,gBAAiB,kCACnB,EACA,CACE,YAAa,qCACb,WAAY,CAAC,IAAM,EAAI,EACvB,gBAAiB,qDACnB,EACA,CACE,YAAa,iCACb,WAAY,CAAC,IAAM,EAAI,EACvB,gBAAiB,8BACnB,EACA,CACE,YACE,4EACF,WAAY,CAAC,GAAM,EAAI,EACvB,gBAAiB,mBACnB,CACF,CAAC,EACC,wCACA,CAAC,CAAE,WAAAC,EAAY,gBAAAC,CAAgB,IAAM,CAEnC,MAAMH,EAAW,IAAIJ,EAAa,CAChC,WAAY,WAAW,KAAKM,CAAU,EACtC,KAAM,IAAI,WAAW,CAAC,CAAC,CACzB,CAAC,EAGKD,EAAS,IAAIN,EAA6B,CAC9C,QAAS,QACT,aAAc,EAChB,CAAC,EAAE,cAAcK,CAAQ,EAGzB,OAAON,EAAuBO,CAAM,CAAC,EAAE,KAAK,EAAK,EACjD,OAAQA,EAAuC,MAAM,OAAO,EAAE,KAC5DE,CACF,CACF,CACF,CACF,CAAC,CACH,CAAC",
6
- "names": ["isSuccessCommandResult", "InitRestoreAppStorageCommand", "ApduResponse", "name", "expectedApdu", "apdu", "response", "result", "statusCode", "expectedMessage"]
7
- }
@@ -1,2 +0,0 @@
1
- import{isSuccessCommandResult as g}from"../../command/model/CommandResult";import{BackupStorageCommand as u}from"../../command/os/BackupStorageCommand";import{GetAppStorageInfoCommand as d}from"../../command/os/GetAppStorageInfoCommand";import{DmkResultFactory as o}from"../../model/DmkResult";import{bufferToHexaString as c}from"../../utils/HexaString";class y{constructor(t,r,p){this.args=t;this.api=r;this.logger=p}async run(){this.logger.debug("[run] Starting BackupAppStorageTask",{data:{appName:this.args.appName}});const{appName:t}=this.args,r=await this.api.sendCommand(new d({appName:t}));if(!g(r))return this.logger.debug("[run] Failed to get app storage info",{data:{error:r.error}}),o({error:r.error});const{storageSize:p}=r.data;let s=0,e=new Uint8Array(0);for(;s<p;){const a=await this.api.sendCommand(new u);if(!g(a))return this.logger.debug("[run] Failed to backup app storage",{data:{error:a.error}}),o({error:a.error});const{chunkData:m,chunkSize:i}=a.data;e=Uint8Array.from([...e,...m]),s+=i}const n=c(e);return this.logger.debug("[run] App storage data backed up successfully",{data:{appStorageData:n}}),o({data:{appStorageData:n}})}}export{y as BackupAppStorageTask};
2
- //# sourceMappingURL=BackupAppStorageTask.js.map
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../../../../../src/api/device-action/task/BackupAppStorageTask.ts"],
4
- "sourcesContent": ["import {\n type CommandErrorResult,\n isSuccessCommandResult,\n} from \"@api/command/model/CommandResult\";\nimport {\n BackupStorageCommand,\n type BackupStorageCommandErrorCodes,\n} from \"@api/command/os/BackupStorageCommand\";\nimport {\n GetAppStorageInfoCommand,\n type GetAppStorageInfoCommandErrorCodes,\n} from \"@api/command/os/GetAppStorageInfoCommand\";\nimport { type InternalApi } from \"@api/device-action/DeviceAction\";\nimport { type LoggerPublisherService } from \"@api/logger-publisher/service/LoggerPublisherService\";\nimport { type DmkResult, DmkResultFactory } from \"@api/model/DmkResult\";\nimport { bufferToHexaString, type HexaString } from \"@api/utils/HexaString\";\n\nexport type BackupAppStorageTaskArgs = {\n appName: string;\n};\n\nexport type BackupAppStorageTaskResponse = {\n appStorageData: HexaString;\n};\n\nexport type BackupAppStorageTaskErrorCodes =\n | GetAppStorageInfoCommandErrorCodes\n | BackupStorageCommandErrorCodes;\n\nexport type BackupAppStorageTaskError =\n | CommandErrorResult<GetAppStorageInfoCommandErrorCodes>[\"error\"]\n | CommandErrorResult<BackupStorageCommandErrorCodes>[\"error\"];\n\nexport class BackupAppStorageTask {\n constructor(\n private readonly args: BackupAppStorageTaskArgs,\n private readonly api: InternalApi,\n private readonly logger: LoggerPublisherService,\n ) {}\n\n public async run(): Promise<\n DmkResult<BackupAppStorageTaskResponse, BackupAppStorageTaskError>\n > {\n this.logger.debug(\"[run] Starting BackupAppStorageTask\", {\n data: {\n appName: this.args.appName,\n },\n });\n\n const { appName } = this.args;\n\n const getAppStorageInfo = await this.api.sendCommand(\n new GetAppStorageInfoCommand({\n appName,\n }),\n );\n\n if (!isSuccessCommandResult(getAppStorageInfo)) {\n this.logger.debug(\"[run] Failed to get app storage info\", {\n data: { error: getAppStorageInfo.error },\n });\n return DmkResultFactory({\n error: getAppStorageInfo.error,\n });\n }\n\n const { storageSize } = getAppStorageInfo.data;\n let offset = 0;\n let appStorageDataBytes = new Uint8Array(0);\n\n while (offset < storageSize) {\n const backupStorage = await this.api.sendCommand(\n new BackupStorageCommand(),\n );\n if (!isSuccessCommandResult(backupStorage)) {\n this.logger.debug(\"[run] Failed to backup app storage\", {\n data: { error: backupStorage.error },\n });\n return DmkResultFactory({\n error: backupStorage.error,\n });\n }\n\n const { chunkData, chunkSize } = backupStorage.data;\n appStorageDataBytes = Uint8Array.from([\n ...appStorageDataBytes,\n ...chunkData,\n ]);\n offset += chunkSize;\n }\n\n const appStorageData = bufferToHexaString(appStorageDataBytes);\n this.logger.debug(\"[run] App storage data backed up successfully\", {\n data: {\n appStorageData,\n },\n });\n\n return DmkResultFactory({\n data: {\n appStorageData,\n },\n });\n }\n}\n"],
5
- "mappings": "AAAA,OAEE,0BAAAA,MACK,mCACP,OACE,wBAAAC,MAEK,uCACP,OACE,4BAAAC,MAEK,2CAGP,OAAyB,oBAAAC,MAAwB,uBACjD,OAAS,sBAAAC,MAA2C,wBAkB7C,MAAMC,CAAqB,CAChC,YACmBC,EACAC,EACAC,EACjB,CAHiB,UAAAF,EACA,SAAAC,EACA,YAAAC,CAChB,CAEH,MAAa,KAEX,CACA,KAAK,OAAO,MAAM,sCAAuC,CACvD,KAAM,CACJ,QAAS,KAAK,KAAK,OACrB,CACF,CAAC,EAED,KAAM,CAAE,QAAAC,CAAQ,EAAI,KAAK,KAEnBC,EAAoB,MAAM,KAAK,IAAI,YACvC,IAAIR,EAAyB,CAC3B,QAAAO,CACF,CAAC,CACH,EAEA,GAAI,CAACT,EAAuBU,CAAiB,EAC3C,YAAK,OAAO,MAAM,uCAAwC,CACxD,KAAM,CAAE,MAAOA,EAAkB,KAAM,CACzC,CAAC,EACMP,EAAiB,CACtB,MAAOO,EAAkB,KAC3B,CAAC,EAGH,KAAM,CAAE,YAAAC,CAAY,EAAID,EAAkB,KAC1C,IAAIE,EAAS,EACTC,EAAsB,IAAI,WAAW,CAAC,EAE1C,KAAOD,EAASD,GAAa,CAC3B,MAAMG,EAAgB,MAAM,KAAK,IAAI,YACnC,IAAIb,CACN,EACA,GAAI,CAACD,EAAuBc,CAAa,EACvC,YAAK,OAAO,MAAM,qCAAsC,CACtD,KAAM,CAAE,MAAOA,EAAc,KAAM,CACrC,CAAC,EACMX,EAAiB,CACtB,MAAOW,EAAc,KACvB,CAAC,EAGH,KAAM,CAAE,UAAAC,EAAW,UAAAC,CAAU,EAAIF,EAAc,KAC/CD,EAAsB,WAAW,KAAK,CACpC,GAAGA,EACH,GAAGE,CACL,CAAC,EACDH,GAAUI,CACZ,CAEA,MAAMC,EAAiBb,EAAmBS,CAAmB,EAC7D,YAAK,OAAO,MAAM,gDAAiD,CACjE,KAAM,CACJ,eAAAI,CACF,CACF,CAAC,EAEMd,EAAiB,CACtB,KAAM,CACJ,eAAAc,CACF,CACF,CAAC,CACH,CACF",
6
- "names": ["isSuccessCommandResult", "BackupStorageCommand", "GetAppStorageInfoCommand", "DmkResultFactory", "bufferToHexaString", "BackupAppStorageTask", "args", "api", "logger", "appName", "getAppStorageInfo", "storageSize", "offset", "appStorageDataBytes", "backupStorage", "chunkData", "chunkSize", "appStorageData"]
7
- }
@@ -1,2 +0,0 @@
1
- import{BackupStorageCommandError as c}from"../../command/os/BackupStorageCommand";import{GetAppStorageInfoCommandError as p}from"../../command/os/GetAppStorageInfoCommand";import{BackupAppStorageTask as n}from"../../device-action/task/BackupAppStorageTask";import{CommandResultFactory as a,DmkResultFactory as i,isSuccessDmkResult as u}from"../../index";describe("BackupAppStorageTask",()=>{let o,t;const s=vi.fn();beforeEach(()=>{vi.clearAllMocks(),o={sendCommand:s},t={debug:vi.fn()}}),describe("Success",()=>{it("should backup app storage data successfully",async()=>{const r=new n({appName:"MyApp"},o,t);s.mockResolvedValueOnce(a({data:{storageSize:15}})).mockResolvedValueOnce(a({data:{chunkData:new Uint8Array([1,35,69,103,137]),chunkSize:5}})).mockResolvedValueOnce(a({data:{chunkData:new Uint8Array([10,11,12,13,14]),chunkSize:5}})).mockResolvedValueOnce(a({data:{chunkData:new Uint8Array([15,16,17,18,19]),chunkSize:5}}));const e=await r.run();expect(u(e)).toBe(!0),expect(e.data.appStorageData).toBe("0x01234567890a0b0c0d0e0f10111213")})}),describe("Error",()=>{it("should return error when getting app storage info fails",async()=>{const r=new n({appName:"MyApp"},o,t);s.mockResolvedValueOnce(a({error:new p({message:"Application not found.",errorCode:"5123"})}));const e=await r.run();expect(e).toStrictEqual(i({error:new p({message:"Application not found.",errorCode:"5123"})}))}),it("should return error when backing up app storage data fails",async()=>{const r=new n({appName:"MyApp"},o,t);s.mockResolvedValueOnce(a({data:{storageSize:100}})).mockResolvedValueOnce(a({error:new c({message:"Failed to backup app storage data.",errorCode:"541c"})}));const e=await r.run();expect(u(e)).toBe(!1),expect(e.error).toBeInstanceOf(c),expect(e.error.message).toBe("Failed to backup app storage data.")})})});
2
- //# sourceMappingURL=BackupAppStorageTask.test.js.map
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../../../../../src/api/device-action/task/BackupAppStorageTask.test.ts"],
4
- "sourcesContent": ["import { BackupStorageCommandError } from \"@api/command/os/BackupStorageCommand\";\nimport { GetAppStorageInfoCommandError } from \"@api/command/os/GetAppStorageInfoCommand\";\nimport { type InternalApi } from \"@api/device-action/DeviceAction\";\nimport {\n BackupAppStorageTask,\n type BackupAppStorageTaskResponse,\n} from \"@api/device-action/task/BackupAppStorageTask\";\nimport {\n CommandResultFactory,\n DmkResultFactory,\n isSuccessDmkResult,\n} from \"@api/index\";\nimport { type LoggerPublisherService } from \"@api/logger-publisher/service/LoggerPublisherService\";\n\ndescribe(\"BackupAppStorageTask\", () => {\n let api: InternalApi;\n let logger: LoggerPublisherService;\n const sendCommand = vi.fn();\n\n beforeEach(() => {\n vi.clearAllMocks();\n api = {\n sendCommand,\n } as unknown as InternalApi;\n logger = {\n debug: vi.fn(),\n } as unknown as LoggerPublisherService;\n });\n\n describe(\"Success\", () => {\n it(\"should backup app storage data successfully\", async () => {\n // ARRANGE\n const task = new BackupAppStorageTask(\n {\n appName: \"MyApp\",\n },\n api,\n logger,\n );\n\n sendCommand\n .mockResolvedValueOnce(\n CommandResultFactory({ data: { storageSize: 15 } }),\n )\n .mockResolvedValueOnce(\n CommandResultFactory({\n data: {\n chunkData: new Uint8Array([0x01, 0x23, 0x45, 0x67, 0x89]),\n chunkSize: 5,\n },\n }),\n )\n .mockResolvedValueOnce(\n CommandResultFactory({\n data: {\n chunkData: new Uint8Array([0x0a, 0x0b, 0x0c, 0x0d, 0x0e]),\n chunkSize: 5,\n },\n }),\n )\n .mockResolvedValueOnce(\n CommandResultFactory({\n data: {\n chunkData: new Uint8Array([0x0f, 0x10, 0x11, 0x12, 0x13]),\n chunkSize: 5,\n },\n }),\n );\n\n // ACT\n const result = await task.run();\n\n // ASSERT\n expect(isSuccessDmkResult(result)).toBe(true);\n expect(\n (result as { data: BackupAppStorageTaskResponse }).data.appStorageData,\n ).toBe(\"0x01234567890a0b0c0d0e0f10111213\");\n });\n });\n\n describe(\"Error\", () => {\n it(\"should return error when getting app storage info fails\", async () => {\n // ARRANGE\n const task = new BackupAppStorageTask(\n {\n appName: \"MyApp\",\n },\n api,\n logger,\n );\n\n sendCommand.mockResolvedValueOnce(\n CommandResultFactory({\n error: new GetAppStorageInfoCommandError({\n message: \"Application not found.\",\n errorCode: \"5123\",\n }),\n }),\n );\n\n // ACT\n const result = await task.run();\n\n // ASSERT\n expect(result).toStrictEqual(\n DmkResultFactory({\n error: new GetAppStorageInfoCommandError({\n message: \"Application not found.\",\n errorCode: \"5123\",\n }),\n }),\n );\n });\n\n it(\"should return error when backing up app storage data fails\", async () => {\n // ARRANGE\n const task = new BackupAppStorageTask(\n {\n appName: \"MyApp\",\n },\n api,\n logger,\n );\n\n sendCommand\n .mockResolvedValueOnce(\n CommandResultFactory({ data: { storageSize: 100 } }),\n )\n .mockResolvedValueOnce(\n CommandResultFactory({\n error: new BackupStorageCommandError({\n message: \"Failed to backup app storage data.\",\n errorCode: \"541c\",\n }),\n }),\n );\n\n // ACT\n const result = await task.run();\n\n // ASSERT\n expect(isSuccessDmkResult(result)).toBe(false);\n expect(\n (result as { error: BackupStorageCommandError }).error,\n ).toBeInstanceOf(BackupStorageCommandError);\n expect(\n (result as { error: BackupStorageCommandError }).error.message,\n ).toBe(\"Failed to backup app storage data.\");\n });\n });\n});\n"],
5
- "mappings": "AAAA,OAAS,6BAAAA,MAAiC,uCAC1C,OAAS,iCAAAC,MAAqC,2CAE9C,OACE,wBAAAC,MAEK,+CACP,OACE,wBAAAC,EACA,oBAAAC,EACA,sBAAAC,MACK,aAGP,SAAS,uBAAwB,IAAM,CACrC,IAAIC,EACAC,EACJ,MAAMC,EAAc,GAAG,GAAG,EAE1B,WAAW,IAAM,CACf,GAAG,cAAc,EACjBF,EAAM,CACJ,YAAAE,CACF,EACAD,EAAS,CACP,MAAO,GAAG,GAAG,CACf,CACF,CAAC,EAED,SAAS,UAAW,IAAM,CACxB,GAAG,8CAA+C,SAAY,CAE5D,MAAME,EAAO,IAAIP,EACf,CACE,QAAS,OACX,EACAI,EACAC,CACF,EAEAC,EACG,sBACCL,EAAqB,CAAE,KAAM,CAAE,YAAa,EAAG,CAAE,CAAC,CACpD,EACC,sBACCA,EAAqB,CACnB,KAAM,CACJ,UAAW,IAAI,WAAW,CAAC,EAAM,GAAM,GAAM,IAAM,GAAI,CAAC,EACxD,UAAW,CACb,CACF,CAAC,CACH,EACC,sBACCA,EAAqB,CACnB,KAAM,CACJ,UAAW,IAAI,WAAW,CAAC,GAAM,GAAM,GAAM,GAAM,EAAI,CAAC,EACxD,UAAW,CACb,CACF,CAAC,CACH,EACC,sBACCA,EAAqB,CACnB,KAAM,CACJ,UAAW,IAAI,WAAW,CAAC,GAAM,GAAM,GAAM,GAAM,EAAI,CAAC,EACxD,UAAW,CACb,CACF,CAAC,CACH,EAGF,MAAMO,EAAS,MAAMD,EAAK,IAAI,EAG9B,OAAOJ,EAAmBK,CAAM,CAAC,EAAE,KAAK,EAAI,EAC5C,OACGA,EAAkD,KAAK,cAC1D,EAAE,KAAK,kCAAkC,CAC3C,CAAC,CACH,CAAC,EAED,SAAS,QAAS,IAAM,CACtB,GAAG,0DAA2D,SAAY,CAExE,MAAMD,EAAO,IAAIP,EACf,CACE,QAAS,OACX,EACAI,EACAC,CACF,EAEAC,EAAY,sBACVL,EAAqB,CACnB,MAAO,IAAIF,EAA8B,CACvC,QAAS,yBACT,UAAW,MACb,CAAC,CACH,CAAC,CACH,EAGA,MAAMS,EAAS,MAAMD,EAAK,IAAI,EAG9B,OAAOC,CAAM,EAAE,cACbN,EAAiB,CACf,MAAO,IAAIH,EAA8B,CACvC,QAAS,yBACT,UAAW,MACb,CAAC,CACH,CAAC,CACH,CACF,CAAC,EAED,GAAG,6DAA8D,SAAY,CAE3E,MAAMQ,EAAO,IAAIP,EACf,CACE,QAAS,OACX,EACAI,EACAC,CACF,EAEAC,EACG,sBACCL,EAAqB,CAAE,KAAM,CAAE,YAAa,GAAI,CAAE,CAAC,CACrD,EACC,sBACCA,EAAqB,CACnB,MAAO,IAAIH,EAA0B,CACnC,QAAS,qCACT,UAAW,MACb,CAAC,CACH,CAAC,CACH,EAGF,MAAMU,EAAS,MAAMD,EAAK,IAAI,EAG9B,OAAOJ,EAAmBK,CAAM,CAAC,EAAE,KAAK,EAAK,EAC7C,OACGA,EAAgD,KACnD,EAAE,eAAeV,CAAyB,EAC1C,OACGU,EAAgD,MAAM,OACzD,EAAE,KAAK,oCAAoC,CAC7C,CAAC,CACH,CAAC,CACH,CAAC",
6
- "names": ["BackupStorageCommandError", "GetAppStorageInfoCommandError", "BackupAppStorageTask", "CommandResultFactory", "DmkResultFactory", "isSuccessDmkResult", "api", "logger", "sendCommand", "task", "result"]
7
- }
@@ -1,23 +0,0 @@
1
- import { type Apdu } from "../../apdu/model/Apdu";
2
- import { type Command } from "../../command/Command";
3
- import { type CommandResult } from "../../command/model/CommandResult";
4
- import { type CommandErrors } from "../../command/utils/CommandErrors";
5
- import { type ApduResponse } from "../../device-session/ApduResponse";
6
- import { type CommandErrorArgs, DeviceExchangeError } from "../../Error";
7
- export type BackupStorageCommandResponse = {
8
- chunkData: Uint8Array;
9
- chunkSize: number;
10
- };
11
- export type BackupStorageCommandErrorCodes = "5123" | "5419" | "541a" | "541b" | "541c" | "622f" | "6642";
12
- export declare const BACKUP_STORAGE_ERRORS: CommandErrors<BackupStorageCommandErrorCodes>;
13
- export declare class BackupStorageCommandError extends DeviceExchangeError<BackupStorageCommandErrorCodes> {
14
- constructor(args: CommandErrorArgs<BackupStorageCommandErrorCodes>);
15
- }
16
- export type BackupStorageCommandResult = CommandResult<BackupStorageCommandResponse, BackupStorageCommandErrorCodes>;
17
- export declare class BackupStorageCommand implements Command<BackupStorageCommandResponse, void, BackupStorageCommandErrorCodes> {
18
- readonly name = "BackupStorage";
19
- private readonly header;
20
- getApdu(): Apdu;
21
- parseResponse(apduResponse: ApduResponse): BackupStorageCommandResult;
22
- }
23
- //# sourceMappingURL=BackupStorageCommand.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"BackupStorageCommand.d.ts","sourceRoot":"","sources":["../../../../../../src/api/command/os/BackupStorageCommand.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,IAAI,EAAE,MAAM,sBAAsB,CAAC;AAGjD,OAAO,EAAE,KAAK,OAAO,EAAE,MAAM,sBAAsB,CAAC;AAEpD,OAAO,EACL,KAAK,aAAa,EAEnB,MAAM,kCAAkC,CAAC;AAC1C,OAAO,EACL,KAAK,aAAa,EAEnB,MAAM,kCAAkC,CAAC;AAG1C,OAAO,EAAE,KAAK,YAAY,EAAE,MAAM,kCAAkC,CAAC;AACrE,OAAO,EAAE,KAAK,gBAAgB,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AAExE,MAAM,MAAM,4BAA4B,GAAG;IACzC,SAAS,EAAE,UAAU,CAAC;IACtB,SAAS,EAAE,MAAM,CAAC;CACnB,CAAC;AAEF,MAAM,MAAM,8BAA8B,GACtC,MAAM,GACN,MAAM,GACN,MAAM,GACN,MAAM,GACN,MAAM,GACN,MAAM,GACN,MAAM,CAAC;AAEX,eAAO,MAAM,qBAAqB,EAAE,aAAa,CAAC,8BAA8B,CAS7E,CAAC;AAEJ,qBAAa,yBAA0B,SAAQ,mBAAmB,CAAC,8BAA8B,CAAC;gBACpF,IAAI,EAAE,gBAAgB,CAAC,8BAA8B,CAAC;CAGnE;AAED,MAAM,MAAM,0BAA0B,GAAG,aAAa,CACpD,4BAA4B,EAC5B,8BAA8B,CAC/B,CAAC;AAEF,qBAAa,oBACX,YACE,OAAO,CAAC,4BAA4B,EAAE,IAAI,EAAE,8BAA8B,CAAC;IAE7E,QAAQ,CAAC,IAAI,mBAAmB;IAEhC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAKrB;IAEF,OAAO,IAAI,IAAI;IAIf,aAAa,CAAC,YAAY,EAAE,YAAY,GAAG,0BAA0B;CAqCtE"}
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=BackupStorageCommand.test.d.ts.map