@ledgerhq/device-trusted-app-kit-ledger-keyring-protocol 0.3.1 → 0.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (62) hide show
  1. package/lib/cjs/api/app-binder/AddToTrustchainDeviceActionTypes.js.map +1 -1
  2. package/lib/cjs/api/crypto/CryptoService.js.map +1 -1
  3. package/lib/cjs/api/model/Errors.js +1 -1
  4. package/lib/cjs/api/model/Errors.js.map +1 -1
  5. package/lib/cjs/internal/app-binder/LedgerKeyringProtocolBinder.js +1 -1
  6. package/lib/cjs/internal/app-binder/LedgerKeyringProtocolBinder.js.map +1 -1
  7. package/lib/cjs/internal/app-binder/device-action/AddToTrustchainDeviceAction.js +1 -1
  8. package/lib/cjs/internal/app-binder/device-action/AddToTrustchainDeviceAction.js.map +1 -1
  9. package/lib/cjs/internal/app-binder/device-action/AuthenticateWithDeviceDeviceAction.js +1 -1
  10. package/lib/cjs/internal/app-binder/device-action/AuthenticateWithDeviceDeviceAction.js.map +1 -1
  11. package/lib/cjs/internal/app-binder/device-action/AuthenticateWithKeypairDeviceAction.js +1 -1
  12. package/lib/cjs/internal/app-binder/device-action/AuthenticateWithKeypairDeviceAction.js.map +2 -2
  13. package/lib/cjs/internal/app-binder/device-action/models/AuthenticateWithDeviceDeviceActionTypes.js.map +1 -1
  14. package/lib/cjs/internal/app-binder/device-action/models/AuthenticateWithKeypairDeviceActionTypes.js +1 -1
  15. package/lib/cjs/internal/app-binder/device-action/models/AuthenticateWithKeypairDeviceActionTypes.js.map +1 -1
  16. package/lib/cjs/internal/app-binder/task/ExtractEncryptionKeyTask.js.map +2 -2
  17. package/lib/cjs/internal/app-binder/task/SignChallengeWithKeypairTask.js +1 -1
  18. package/lib/cjs/internal/app-binder/task/SignChallengeWithKeypairTask.js.map +2 -2
  19. package/lib/cjs/internal/app-binder/task/SignChallengeWithKeypairTask.test.js +1 -1
  20. package/lib/cjs/internal/app-binder/task/SignChallengeWithKeypairTask.test.js.map +2 -2
  21. package/lib/cjs/internal/use-cases/authentication/AuthenticateUseCase.js +1 -1
  22. package/lib/cjs/internal/use-cases/authentication/AuthenticateUseCase.js.map +1 -1
  23. package/lib/cjs/internal/use-cases/authentication/DecryptDataUseCase.js.map +1 -1
  24. package/lib/cjs/internal/use-cases/authentication/EncryptDataUseCase.js.map +1 -1
  25. package/lib/cjs/internal/utils/LKRPBlockStream.js +1 -1
  26. package/lib/cjs/internal/utils/LKRPBlockStream.js.map +2 -2
  27. package/lib/cjs/package.json +1 -1
  28. package/lib/esm/api/app-binder/AddToTrustchainDeviceActionTypes.js.map +1 -1
  29. package/lib/esm/api/crypto/CryptoService.js.map +1 -1
  30. package/lib/esm/api/model/Errors.js +1 -1
  31. package/lib/esm/api/model/Errors.js.map +1 -1
  32. package/lib/esm/internal/app-binder/LedgerKeyringProtocolBinder.js +1 -1
  33. package/lib/esm/internal/app-binder/LedgerKeyringProtocolBinder.js.map +1 -1
  34. package/lib/esm/internal/app-binder/device-action/AddToTrustchainDeviceAction.js +1 -1
  35. package/lib/esm/internal/app-binder/device-action/AddToTrustchainDeviceAction.js.map +1 -1
  36. package/lib/esm/internal/app-binder/device-action/AuthenticateWithDeviceDeviceAction.js +1 -1
  37. package/lib/esm/internal/app-binder/device-action/AuthenticateWithDeviceDeviceAction.js.map +1 -1
  38. package/lib/esm/internal/app-binder/device-action/AuthenticateWithKeypairDeviceAction.js +1 -1
  39. package/lib/esm/internal/app-binder/device-action/AuthenticateWithKeypairDeviceAction.js.map +2 -2
  40. package/lib/esm/internal/app-binder/task/ExtractEncryptionKeyTask.js.map +2 -2
  41. package/lib/esm/internal/app-binder/task/SignChallengeWithKeypairTask.js +1 -1
  42. package/lib/esm/internal/app-binder/task/SignChallengeWithKeypairTask.js.map +2 -2
  43. package/lib/esm/internal/app-binder/task/SignChallengeWithKeypairTask.test.js +1 -1
  44. package/lib/esm/internal/app-binder/task/SignChallengeWithKeypairTask.test.js.map +2 -2
  45. package/lib/esm/internal/use-cases/authentication/AuthenticateUseCase.js.map +1 -1
  46. package/lib/esm/internal/use-cases/authentication/DecryptDataUseCase.js.map +1 -1
  47. package/lib/esm/internal/use-cases/authentication/EncryptDataUseCase.js.map +1 -1
  48. package/lib/esm/internal/utils/LKRPBlockStream.js +2 -2
  49. package/lib/esm/internal/utils/LKRPBlockStream.js.map +2 -2
  50. package/lib/esm/package.json +1 -1
  51. package/lib/types/api/app-binder/AddToTrustchainDeviceActionTypes.d.ts +1 -1
  52. package/lib/types/internal/app-binder/LedgerKeyringProtocolBinder.d.ts +2 -2
  53. package/lib/types/internal/app-binder/device-action/AuthenticateWithDeviceDeviceAction.d.ts +1 -1
  54. package/lib/types/internal/app-binder/device-action/AuthenticateWithKeypairDeviceAction.d.ts +2 -2
  55. package/lib/types/internal/app-binder/device-action/models/AuthenticateWithDeviceDeviceActionTypes.d.ts +1 -1
  56. package/lib/types/internal/app-binder/device-action/models/AuthenticateWithKeypairDeviceActionTypes.d.ts +1 -1
  57. package/lib/types/internal/app-binder/task/ExtractEncryptionKeyTask.d.ts +1 -1
  58. package/lib/types/internal/app-binder/task/SignChallengeWithKeypairTask.d.ts +2 -2
  59. package/lib/types/internal/use-cases/authentication/AuthenticateUseCase.d.ts +1 -1
  60. package/lib/types/internal/utils/LKRPBlockStream.d.ts +1 -1
  61. package/lib/types/tsconfig.prod.tsbuildinfo +1 -1
  62. package/package.json +5 -5
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../../src/internal/app-binder/task/SignChallengeWithKeypairTask.ts"],
4
- "sourcesContent": ["import {\n bufferToHexaString,\n ByteArrayParser,\n hexaStringToBuffer,\n} from \"@ledgerhq/device-management-kit\";\nimport { type Either, EitherAsync, Left, Maybe } from \"purify-ts\";\n\nimport { type CryptoService, HashAlgo } from \"@api/crypto/CryptoService\";\nimport { type KeyPair, SigFormat } from \"@api/crypto/KeyPair\";\nimport { LKRPMissingDataError, LKRPUnknownError } from \"@api/model/Errors\";\nimport {\n type AuthenticationPayload,\n type Challenge,\n} from \"@internal/lkrp-datasource/data/LKRPDataSource\";\nimport { eitherSeqRecord } from \"@internal/utils/eitherSeqRecord\";\n\nexport class SignChallengeWithKeypairTask {\n constructor(\n private readonly cryptoService: CryptoService,\n private readonly keypair: KeyPair,\n private readonly trustchainId: string,\n ) {}\n\n run(\n challenge: Challenge,\n ): EitherAsync<\n LKRPMissingDataError | LKRPUnknownError,\n AuthenticationPayload\n > {\n const attestation = this.getAttestation();\n const credential = this.getCredential(this.keypair.getPublicKeyToHex());\n\n return EitherAsync.liftEither(this.getUnsignedChallengeTLV(challenge.tlv))\n .map((buf) => this.cryptoService.hash(buf, HashAlgo.SHA256))\n .map((hash) => this.keypair.sign(hash, SigFormat.DER))\n .map((str) => bufferToHexaString(str, false))\n .map((signature) => ({\n challenge: challenge.json,\n signature: { attestation, credential, signature },\n }))\n .mapLeft((error) =>\n error instanceof LKRPMissingDataError\n ? error\n : new LKRPUnknownError(String(error)),\n );\n }\n\n // Spec https://ledgerhq.atlassian.net/wiki/spaces/TA/pages/4335960138/ARCH+LedgerLive+Auth+specifications\n private getAttestation() {\n const bytes = new TextEncoder().encode(this.trustchainId);\n const attestation = Uint8Array.from([0x02, bytes.length, ...bytes]);\n return bufferToHexaString(attestation, false);\n }\n\n private getCredential(publicKey: string) {\n return { version: 0, curveId: 33, signAlgorithm: 1, publicKey };\n }\n\n private getUnsignedChallengeTLV(\n tlv: string,\n ): Either<LKRPMissingDataError, Uint8Array> {\n const parser = new ByteArrayParser(\n hexaStringToBuffer(tlv) ?? new Uint8Array(),\n );\n const parsed = new Map(\n (function* () {\n while (true) {\n const field = parser.extractFieldTLVEncoded();\n if (!field) break; // No more fields to extract\n yield [field.tag, field.value];\n }\n })(),\n );\n\n // We expect 10 fields in the TLV\n if (parsed.size > 10) {\n return Left(\n new LKRPMissingDataError(\"Challenge TLV contains unexpected data\"),\n );\n }\n\n const getField = (tag: number, fieldName: string) =>\n Maybe.fromNullable(parsed.get(tag)).toEither(\n new LKRPMissingDataError(`Missing ${fieldName} field`),\n );\n\n return eitherSeqRecord({\n // Unsigned fields\n payloadType: () => getField(0x01, \"Payload type\"),\n version: () => getField(0x02, \"Version\"),\n challengeExpiry: () => getField(0x16, \"Challenge expiry\"),\n host: () => getField(0x20, \"Host\"),\n protocolVersion: () => getField(0x60, \"Protocol version\"),\n\n // Signed fields\n curveId: () => getField(0x32, \"Curve ID\"),\n publicKey: () => getField(0x33, \"Public key\"),\n challengeData: () => getField(0x12, \"Challenge data\"),\n signAlgorithm: () => getField(0x14, \"Sign algorithm\"),\n rpSignatureField: () => getField(0x15, \"RP signature field\"),\n }).map((fields) =>\n Uint8Array.from(\n [\n [0x01, fields.payloadType.length, ...fields.payloadType],\n [0x02, fields.version.length, ...fields.version],\n [0x12, fields.challengeData.length, ...fields.challengeData],\n [0x16, fields.challengeExpiry.length, ...fields.challengeExpiry],\n [0x20, fields.host.length, ...fields.host],\n [0x60, fields.protocolVersion.length, ...fields.protocolVersion],\n ].flat(),\n ),\n );\n }\n}\n"],
4
+ "sourcesContent": ["import {\n bufferToHexaString,\n ByteArrayParser,\n hexaStringToBuffer,\n} from \"@ledgerhq/device-management-kit\";\nimport { type Either, EitherAsync, Left, Maybe } from \"purify-ts\";\n\nimport { type CryptoService, HashAlgo } from \"@api/crypto/CryptoService\";\nimport { type KeyPair, SigFormat } from \"@api/crypto/KeyPair\";\nimport { LKRPMissingDataError, LKRPUnknownError } from \"@api/model/Errors\";\nimport {\n type AuthenticationPayload,\n type Challenge,\n} from \"@internal/lkrp-datasource/data/LKRPDataSource\";\nimport { eitherSeqRecord } from \"@internal/utils/eitherSeqRecord\";\n\nexport class SignChallengeWithKeypairTask {\n constructor(\n private readonly cryptoService: CryptoService,\n private readonly keyPair: KeyPair,\n private readonly trustchainId: string,\n ) {}\n\n run(\n challenge: Challenge,\n ): EitherAsync<\n LKRPMissingDataError | LKRPUnknownError,\n AuthenticationPayload\n > {\n const attestation = this.getAttestation();\n const credential = this.getCredential(this.keyPair.getPublicKeyToHex());\n\n return EitherAsync.liftEither(this.getUnsignedChallengeTLV(challenge.tlv))\n .map((buf) => this.cryptoService.hash(buf, HashAlgo.SHA256))\n .map((hash) => this.keyPair.sign(hash, SigFormat.DER))\n .map((str) => bufferToHexaString(str, false))\n .map((signature) => ({\n challenge: challenge.json,\n signature: { attestation, credential, signature },\n }))\n .mapLeft((error) =>\n error instanceof LKRPMissingDataError\n ? error\n : new LKRPUnknownError(String(error)),\n );\n }\n\n // Spec https://ledgerhq.atlassian.net/wiki/spaces/TA/pages/4335960138/ARCH+LedgerLive+Auth+specifications\n private getAttestation() {\n const bytes = new TextEncoder().encode(this.trustchainId);\n const attestation = Uint8Array.from([0x02, bytes.length, ...bytes]);\n return bufferToHexaString(attestation, false);\n }\n\n private getCredential(publicKey: string) {\n return { version: 0, curveId: 33, signAlgorithm: 1, publicKey };\n }\n\n private getUnsignedChallengeTLV(\n tlv: string,\n ): Either<LKRPMissingDataError, Uint8Array> {\n const parser = new ByteArrayParser(\n hexaStringToBuffer(tlv) ?? new Uint8Array(),\n );\n const parsed = new Map(\n (function* () {\n while (true) {\n const field = parser.extractFieldTLVEncoded();\n if (!field) break; // No more fields to extract\n yield [field.tag, field.value];\n }\n })(),\n );\n\n // We expect 10 fields in the TLV\n if (parsed.size > 10) {\n return Left(\n new LKRPMissingDataError(\"Challenge TLV contains unexpected data\"),\n );\n }\n\n const getField = (tag: number, fieldName: string) =>\n Maybe.fromNullable(parsed.get(tag)).toEither(\n new LKRPMissingDataError(`Missing ${fieldName} field`),\n );\n\n return eitherSeqRecord({\n // Unsigned fields\n payloadType: () => getField(0x01, \"Payload type\"),\n version: () => getField(0x02, \"Version\"),\n challengeExpiry: () => getField(0x16, \"Challenge expiry\"),\n host: () => getField(0x20, \"Host\"),\n protocolVersion: () => getField(0x60, \"Protocol version\"),\n\n // Signed fields\n curveId: () => getField(0x32, \"Curve ID\"),\n publicKey: () => getField(0x33, \"Public key\"),\n challengeData: () => getField(0x12, \"Challenge data\"),\n signAlgorithm: () => getField(0x14, \"Sign algorithm\"),\n rpSignatureField: () => getField(0x15, \"RP signature field\"),\n }).map((fields) =>\n Uint8Array.from(\n [\n [0x01, fields.payloadType.length, ...fields.payloadType],\n [0x02, fields.version.length, ...fields.version],\n [0x12, fields.challengeData.length, ...fields.challengeData],\n [0x16, fields.challengeExpiry.length, ...fields.challengeExpiry],\n [0x20, fields.host.length, ...fields.host],\n [0x60, fields.protocolVersion.length, ...fields.protocolVersion],\n ].flat(),\n ),\n );\n }\n}\n"],
5
5
  "mappings": "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",
6
- "names": ["SignChallengeWithKeypairTask_exports", "__export", "SignChallengeWithKeypairTask", "__toCommonJS", "import_device_management_kit", "import_purify_ts", "import_CryptoService", "import_KeyPair", "import_Errors", "import_eitherSeqRecord", "cryptoService", "keypair", "trustchainId", "challenge", "attestation", "credential", "buf", "hash", "str", "signature", "error", "bytes", "publicKey", "tlv", "parser", "parsed", "field", "getField", "tag", "fieldName", "fields"]
6
+ "names": ["SignChallengeWithKeypairTask_exports", "__export", "SignChallengeWithKeypairTask", "__toCommonJS", "import_device_management_kit", "import_purify_ts", "import_CryptoService", "import_KeyPair", "import_Errors", "import_eitherSeqRecord", "cryptoService", "keyPair", "trustchainId", "challenge", "attestation", "credential", "buf", "hash", "str", "signature", "error", "bytes", "publicKey", "tlv", "parser", "parsed", "field", "getField", "tag", "fieldName", "fields"]
7
7
  }
@@ -1,2 +1,2 @@
1
- "use strict";var s=require("@ledgerhq/device-management-kit"),f=require("../../../api/crypto/CryptoService"),o=require("../../../api/crypto/noble/NobleCryptoService"),b=require("../../../api/model/Errors"),r=require("./SignChallengeWithKeypairTask");const n=new o.NobleCryptoService;describe("SignChallengeWithKeypairTask",()=>{it("should sign a challenge with a keypair",async()=>{const{challenge:e,keypair:a,trustchainId:c}=d(),i=await new r.SignChallengeWithKeypairTask(n,a,c).run(e).run();expect(i.isRight()).toBe(!0),i.ifRight(t=>{expect(t.challenge).toBe(e.json),expect(t.signature.credential).toEqual({version:0,curveId:33,signAlgorithm:1,publicKey:a.getPublicKeyToHex()}),expect(t.signature.attestation).toBe("0242303062373538386231393136633036373635343632656266343530363734346665323565643164623831393635326532646562613732313338393738396364633337"),expect(t.signature.signature).toBe("3045022100e9fead4e341f4e145f8888d7897184ff585e23c832a4c7acd15b5a2e53c58d2902204c58596d039960ab9b56ba4f9d27dbc5e647dbe779089e5e7e608501c5270049")})}),it("should handle invalid challenge",async()=>{const{challenge:e,keypair:a,trustchainId:c}=d({tlv:"invalid-tlv"});(await new r.SignChallengeWithKeypairTask(n,a,c).run(e).run()).ifLeft(t=>expect(t).toBeInstanceOf(b.LKRPMissingDataError))})});function d({privateKey:e="b21ef366414b1aaba29b9576b7c1a661d663cfd8b4f998257dddbf7dc60d315d",trustchainId:a="00b7588b1916c06765462ebf4506744fe25ed1db819652e2deba721389789cdc37",tlv:c="0101070201001210bb1ea0c98526e1ea2deb7c7537f2989514010115473045022038632e8fa245483f0ecdbaa4ca0d455a03e7510da269d2089fed0d5cfa69d3d6022100c2f938d60bf1c34e96a2d332822a86059d90ec26ea222189cd9731834a5c151216046878ab74202b7472757374636861696e2d6261636b656e642e6170692e6177732e7374672e6c64672d746563682e636f6d320121332103cb7628e7248ddf9c07da54b979f16bf081fb3d173aac0992ad2a44ef6a388ae2600401000000"}={}){return{challenge:{tlv:c,json:{}},keypair:n.importKeyPair((0,s.hexaStringToBuffer)(e),f.Curve.K256),trustchainId:a}}
1
+ "use strict";var s=require("@ledgerhq/device-management-kit"),f=require("../../../api/crypto/CryptoService"),o=require("../../../api/crypto/noble/NobleCryptoService"),b=require("../../../api/model/Errors"),r=require("./SignChallengeWithKeypairTask");const n=new o.NobleCryptoService;describe("SignChallengeWithKeypairTask",()=>{it("should sign a challenge with a keyPair",async()=>{const{challenge:e,keyPair:a,trustchainId:c}=d(),i=await new r.SignChallengeWithKeypairTask(n,a,c).run(e).run();expect(i.isRight()).toBe(!0),i.ifRight(t=>{expect(t.challenge).toBe(e.json),expect(t.signature.credential).toEqual({version:0,curveId:33,signAlgorithm:1,publicKey:a.getPublicKeyToHex()}),expect(t.signature.attestation).toBe("0242303062373538386231393136633036373635343632656266343530363734346665323565643164623831393635326532646562613732313338393738396364633337"),expect(t.signature.signature).toBe("3045022100e9fead4e341f4e145f8888d7897184ff585e23c832a4c7acd15b5a2e53c58d2902204c58596d039960ab9b56ba4f9d27dbc5e647dbe779089e5e7e608501c5270049")})}),it("should handle invalid challenge",async()=>{const{challenge:e,keyPair:a,trustchainId:c}=d({tlv:"invalid-tlv"});(await new r.SignChallengeWithKeypairTask(n,a,c).run(e).run()).ifLeft(t=>expect(t).toBeInstanceOf(b.LKRPMissingDataError))})});function d({privateKey:e="b21ef366414b1aaba29b9576b7c1a661d663cfd8b4f998257dddbf7dc60d315d",trustchainId:a="00b7588b1916c06765462ebf4506744fe25ed1db819652e2deba721389789cdc37",tlv:c="0101070201001210bb1ea0c98526e1ea2deb7c7537f2989514010115473045022038632e8fa245483f0ecdbaa4ca0d455a03e7510da269d2089fed0d5cfa69d3d6022100c2f938d60bf1c34e96a2d332822a86059d90ec26ea222189cd9731834a5c151216046878ab74202b7472757374636861696e2d6261636b656e642e6170692e6177732e7374672e6c64672d746563682e636f6d320121332103cb7628e7248ddf9c07da54b979f16bf081fb3d173aac0992ad2a44ef6a388ae2600401000000"}={}){return{challenge:{tlv:c,json:{}},keyPair:n.importKeyPair((0,s.hexaStringToBuffer)(e),f.Curve.K256),trustchainId:a}}
2
2
  //# sourceMappingURL=SignChallengeWithKeypairTask.test.js.map
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../../src/internal/app-binder/task/SignChallengeWithKeypairTask.test.ts"],
4
- "sourcesContent": ["import { hexaStringToBuffer } from \"@ledgerhq/device-management-kit\";\n\nimport { Curve } from \"@api/crypto/CryptoService\";\nimport { NobleCryptoService } from \"@api/crypto/noble/NobleCryptoService\";\nimport { LKRPMissingDataError } from \"@api/model/Errors\";\nimport { type Challenge } from \"@internal/lkrp-datasource/data/LKRPDataSource\";\n\nimport { SignChallengeWithKeypairTask } from \"./SignChallengeWithKeypairTask\";\n\nconst cryptoService = new NobleCryptoService();\n\ndescribe(\"SignChallengeWithKeypairTask\", () => {\n it(\"should sign a challenge with a keypair\", async () => {\n // GIVEN\n const { challenge, keypair, trustchainId } = getParameters();\n\n // WHEN\n const task = new SignChallengeWithKeypairTask(\n cryptoService,\n keypair,\n trustchainId,\n );\n const result = await task.run(challenge).run();\n\n // THEN\n expect(result.isRight()).toBe(true);\n result.ifRight((payload) => {\n expect(payload.challenge).toBe(challenge.json);\n expect(payload.signature.credential).toEqual({\n version: 0,\n curveId: 33,\n signAlgorithm: 1,\n publicKey: keypair.getPublicKeyToHex(),\n });\n expect(payload.signature.attestation).toBe(\n \"0242303062373538386231393136633036373635343632656266343530363734346665323565643164623831393635326532646562613732313338393738396364633337\",\n );\n expect(payload.signature.signature).toBe(\n \"3045022100e9fead4e341f4e145f8888d7897184ff585e23c832a4c7acd15b5a2e53c58d2902204c58596d039960ab9b56ba4f9d27dbc5e647dbe779089e5e7e608501c5270049\",\n );\n });\n });\n\n it(\"should handle invalid challenge\", async () => {\n // GIVEN\n const { challenge, keypair, trustchainId } = getParameters({\n tlv: \"invalid-tlv\", // Invalid TLV\n });\n\n // WHEN\n const task = new SignChallengeWithKeypairTask(\n cryptoService,\n keypair,\n trustchainId,\n );\n const result = await task.run(challenge).run();\n\n // THEN\n result.ifLeft((error) =>\n expect(error).toBeInstanceOf(LKRPMissingDataError),\n );\n });\n});\n\nfunction getParameters({\n privateKey = \"b21ef366414b1aaba29b9576b7c1a661d663cfd8b4f998257dddbf7dc60d315d\",\n trustchainId = \"00b7588b1916c06765462ebf4506744fe25ed1db819652e2deba721389789cdc37\",\n tlv = \"0101070201001210bb1ea0c98526e1ea2deb7c7537f2989514010115473045022038632e8fa245483f0ecdbaa4ca0d455a03e7510da269d2089fed0d5cfa69d3d6022100c2f938d60bf1c34e96a2d332822a86059d90ec26ea222189cd9731834a5c151216046878ab74202b7472757374636861696e2d6261636b656e642e6170692e6177732e7374672e6c64672d746563682e636f6d320121332103cb7628e7248ddf9c07da54b979f16bf081fb3d173aac0992ad2a44ef6a388ae2600401000000\",\n} = {}) {\n return {\n challenge: { tlv, json: {} as Challenge[\"json\"] },\n keypair: cryptoService.importKeyPair(\n hexaStringToBuffer(privateKey)!,\n Curve.K256,\n ),\n trustchainId,\n };\n}\n"],
4
+ "sourcesContent": ["import { hexaStringToBuffer } from \"@ledgerhq/device-management-kit\";\n\nimport { Curve } from \"@api/crypto/CryptoService\";\nimport { NobleCryptoService } from \"@api/crypto/noble/NobleCryptoService\";\nimport { LKRPMissingDataError } from \"@api/model/Errors\";\nimport { type Challenge } from \"@internal/lkrp-datasource/data/LKRPDataSource\";\n\nimport { SignChallengeWithKeypairTask } from \"./SignChallengeWithKeypairTask\";\n\nconst cryptoService = new NobleCryptoService();\n\ndescribe(\"SignChallengeWithKeypairTask\", () => {\n it(\"should sign a challenge with a keyPair\", async () => {\n // GIVEN\n const { challenge, keyPair, trustchainId } = getParameters();\n\n // WHEN\n const task = new SignChallengeWithKeypairTask(\n cryptoService,\n keyPair,\n trustchainId,\n );\n const result = await task.run(challenge).run();\n\n // THEN\n expect(result.isRight()).toBe(true);\n result.ifRight((payload) => {\n expect(payload.challenge).toBe(challenge.json);\n expect(payload.signature.credential).toEqual({\n version: 0,\n curveId: 33,\n signAlgorithm: 1,\n publicKey: keyPair.getPublicKeyToHex(),\n });\n expect(payload.signature.attestation).toBe(\n \"0242303062373538386231393136633036373635343632656266343530363734346665323565643164623831393635326532646562613732313338393738396364633337\",\n );\n expect(payload.signature.signature).toBe(\n \"3045022100e9fead4e341f4e145f8888d7897184ff585e23c832a4c7acd15b5a2e53c58d2902204c58596d039960ab9b56ba4f9d27dbc5e647dbe779089e5e7e608501c5270049\",\n );\n });\n });\n\n it(\"should handle invalid challenge\", async () => {\n // GIVEN\n const { challenge, keyPair, trustchainId } = getParameters({\n tlv: \"invalid-tlv\", // Invalid TLV\n });\n\n // WHEN\n const task = new SignChallengeWithKeypairTask(\n cryptoService,\n keyPair,\n trustchainId,\n );\n const result = await task.run(challenge).run();\n\n // THEN\n result.ifLeft((error) =>\n expect(error).toBeInstanceOf(LKRPMissingDataError),\n );\n });\n});\n\nfunction getParameters({\n privateKey = \"b21ef366414b1aaba29b9576b7c1a661d663cfd8b4f998257dddbf7dc60d315d\",\n trustchainId = \"00b7588b1916c06765462ebf4506744fe25ed1db819652e2deba721389789cdc37\",\n tlv = \"0101070201001210bb1ea0c98526e1ea2deb7c7537f2989514010115473045022038632e8fa245483f0ecdbaa4ca0d455a03e7510da269d2089fed0d5cfa69d3d6022100c2f938d60bf1c34e96a2d332822a86059d90ec26ea222189cd9731834a5c151216046878ab74202b7472757374636861696e2d6261636b656e642e6170692e6177732e7374672e6c64672d746563682e636f6d320121332103cb7628e7248ddf9c07da54b979f16bf081fb3d173aac0992ad2a44ef6a388ae2600401000000\",\n} = {}) {\n return {\n challenge: { tlv, json: {} as Challenge[\"json\"] },\n keyPair: cryptoService.importKeyPair(\n hexaStringToBuffer(privateKey)!,\n Curve.K256,\n ),\n trustchainId,\n };\n}\n"],
5
5
  "mappings": "aAAA,IAAAA,EAAmC,2CAEnCC,EAAsB,qCACtBC,EAAmC,gDACnCC,EAAqC,6BAGrCC,EAA6C,0CAE7C,MAAMC,EAAgB,IAAI,qBAE1B,SAAS,+BAAgC,IAAM,CAC7C,GAAG,yCAA0C,SAAY,CAEvD,KAAM,CAAE,UAAAC,EAAW,QAAAC,EAAS,aAAAC,CAAa,EAAIC,EAAc,EAQrDC,EAAS,MALF,IAAI,+BACfL,EACAE,EACAC,CACF,EAC0B,IAAIF,CAAS,EAAE,IAAI,EAG7C,OAAOI,EAAO,QAAQ,CAAC,EAAE,KAAK,EAAI,EAClCA,EAAO,QAASC,GAAY,CAC1B,OAAOA,EAAQ,SAAS,EAAE,KAAKL,EAAU,IAAI,EAC7C,OAAOK,EAAQ,UAAU,UAAU,EAAE,QAAQ,CAC3C,QAAS,EACT,QAAS,GACT,cAAe,EACf,UAAWJ,EAAQ,kBAAkB,CACvC,CAAC,EACD,OAAOI,EAAQ,UAAU,WAAW,EAAE,KACpC,0IACF,EACA,OAAOA,EAAQ,UAAU,SAAS,EAAE,KAClC,gJACF,CACF,CAAC,CACH,CAAC,EAED,GAAG,kCAAmC,SAAY,CAEhD,KAAM,CAAE,UAAAL,EAAW,QAAAC,EAAS,aAAAC,CAAa,EAAIC,EAAc,CACzD,IAAK,aACP,CAAC,GAQc,MALF,IAAI,+BACfJ,EACAE,EACAC,CACF,EAC0B,IAAIF,CAAS,EAAE,IAAI,GAGtC,OAAQM,GACb,OAAOA,CAAK,EAAE,eAAe,sBAAoB,CACnD,CACF,CAAC,CACH,CAAC,EAED,SAASH,EAAc,CACrB,WAAAI,EAAa,mEACb,aAAAL,EAAe,qEACf,IAAAM,EAAM,wYACR,EAAI,CAAC,EAAG,CACN,MAAO,CACL,UAAW,CAAE,IAAAA,EAAK,KAAM,CAAC,CAAuB,EAChD,QAAST,EAAc,iBACrB,sBAAmBQ,CAAU,EAC7B,QAAM,IACR,EACA,aAAAL,CACF,CACF",
6
- "names": ["import_device_management_kit", "import_CryptoService", "import_NobleCryptoService", "import_Errors", "import_SignChallengeWithKeypairTask", "cryptoService", "challenge", "keypair", "trustchainId", "getParameters", "result", "payload", "error", "privateKey", "tlv"]
6
+ "names": ["import_device_management_kit", "import_CryptoService", "import_NobleCryptoService", "import_Errors", "import_SignChallengeWithKeypairTask", "cryptoService", "challenge", "keyPair", "trustchainId", "getParameters", "result", "payload", "error", "privateKey", "tlv"]
7
7
  }
@@ -1,2 +1,2 @@
1
- "use strict";var s=Object.defineProperty;var d=Object.getOwnPropertyDescriptor;var g=Object.getOwnPropertyNames;var v=Object.prototype.hasOwnProperty;var D=(r,e)=>{for(var i in e)s(r,i,{get:e[i],enumerable:!0})},l=(r,e,i,n)=>{if(e&&typeof e=="object"||typeof e=="function")for(let t of g(e))!v.call(r,t)&&t!==i&&s(r,t,{get:()=>e[t],enumerable:!(n=d(e,t))||n.enumerable});return r};var B=r=>l(s({},"__esModule",{value:!0}),r),m=(r,e,i,n)=>{for(var t=n>1?void 0:n?d(e,i):e,c=r.length-1,p;c>=0;c--)(p=r[c])&&(t=(n?p(e,i,t):p(t))||t);return n&&t&&s(e,i,t),t},u=(r,e)=>(i,n)=>e(i,n,r);var P={};D(P,{AuthenticateUseCase:()=>o});module.exports=B(P);var f=require("@ledgerhq/device-management-kit"),a=require("inversify"),h=require("rxjs"),I=require("../../../api/model/Errors"),y=require("../../app-binder/di/appBinderTypes");let o=class{constructor(e){this.appBinder=e}execute(e){if(e.trustchainId)return this.appBinder.authenticateWithKeypair(e);const i=e.sessionId;return i?this.appBinder.authenticateWithDevice({...e,sessionId:i}):{observable:(0,h.of)({status:f.DeviceActionStatus.Error,error:new I.LKRPMissingDataError("Either a trustchainId or a device is required for authentication.")}),cancel:()=>{}}}};o=m([(0,a.injectable)(),u(0,(0,a.inject)(y.appBinderTypes.AppBinding))],o);0&&(module.exports={AuthenticateUseCase});
1
+ "use strict";var s=Object.defineProperty;var d=Object.getOwnPropertyDescriptor;var g=Object.getOwnPropertyNames;var v=Object.prototype.hasOwnProperty;var D=(r,e)=>{for(var i in e)s(r,i,{get:e[i],enumerable:!0})},P=(r,e,i,n)=>{if(e&&typeof e=="object"||typeof e=="function")for(let t of g(e))!v.call(r,t)&&t!==i&&s(r,t,{get:()=>e[t],enumerable:!(n=d(e,t))||n.enumerable});return r};var l=r=>P(s({},"__esModule",{value:!0}),r),m=(r,e,i,n)=>{for(var t=n>1?void 0:n?d(e,i):e,c=r.length-1,p;c>=0;c--)(p=r[c])&&(t=(n?p(e,i,t):p(t))||t);return n&&t&&s(e,i,t),t},u=(r,e)=>(i,n)=>e(i,n,r);var B={};D(B,{AuthenticateUseCase:()=>o});module.exports=l(B);var f=require("@ledgerhq/device-management-kit"),a=require("inversify"),h=require("rxjs"),I=require("../../../api/model/Errors"),y=require("../../app-binder/di/appBinderTypes");let o=class{constructor(e){this.appBinder=e}execute(e){if(e.trustchainId)return this.appBinder.authenticateWithKeypair(e);const i=e.sessionId;return i?this.appBinder.authenticateWithDevice({...e,sessionId:i}):{observable:(0,h.of)({status:f.DeviceActionStatus.Error,error:new I.LKRPMissingDataError("Either a trustchainId or a device is required for authentication.")}),cancel:()=>{}}}};o=m([(0,a.injectable)(),u(0,(0,a.inject)(y.appBinderTypes.AppBinding))],o);0&&(module.exports={AuthenticateUseCase});
2
2
  //# sourceMappingURL=AuthenticateUseCase.js.map
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../../src/internal/use-cases/authentication/AuthenticateUseCase.ts"],
4
- "sourcesContent": ["import {\n DeviceActionStatus,\n DeviceSessionId,\n} from \"@ledgerhq/device-management-kit\";\nimport { inject, injectable } from \"inversify\";\nimport { of } from \"rxjs\";\n\nimport { AuthenticateDAReturnType } from \"@api/app-binder/AuthenticateDeviceActionTypes\";\nimport { KeyPair } from \"@api/crypto/KeyPair\";\nimport { LKRPMissingDataError } from \"@api/model/Errors\";\nimport { Permissions } from \"@api/model/Permissions\";\nimport { appBinderTypes } from \"@internal/app-binder/di/appBinderTypes\";\nimport { LedgerKeyringProtocolBinder } from \"@internal/app-binder/LedgerKeyringProtocolBinder\";\n\nexport type AuthenticateUsecaseInput = {\n keypair: KeyPair;\n clientName: string;\n permissions: Permissions;\n} & (\n | { trustchainId: string; sessionId?: DeviceSessionId }\n | { trustchainId?: undefined; sessionId: DeviceSessionId }\n);\n\n@injectable()\nexport class AuthenticateUseCase {\n constructor(\n @inject(appBinderTypes.AppBinding)\n private appBinder: LedgerKeyringProtocolBinder,\n ) {}\n\n execute(input: AuthenticateUsecaseInput): AuthenticateDAReturnType {\n if (input.trustchainId) {\n return this.appBinder.authenticateWithKeypair(input);\n }\n\n const sessionId = input.sessionId;\n if (sessionId) {\n return this.appBinder.authenticateWithDevice({ ...input, sessionId });\n }\n\n // The AuthenticateUsecaseInput type should prevent this case\n return {\n observable: of({\n status: DeviceActionStatus.Error,\n error: new LKRPMissingDataError(\n \"Either a trustchainId or a device is required for authentication.\",\n ),\n }),\n cancel: () => undefined,\n };\n }\n}\n"],
4
+ "sourcesContent": ["import {\n DeviceActionStatus,\n DeviceSessionId,\n} from \"@ledgerhq/device-management-kit\";\nimport { inject, injectable } from \"inversify\";\nimport { of } from \"rxjs\";\n\nimport { AuthenticateDAReturnType } from \"@api/app-binder/AuthenticateDeviceActionTypes\";\nimport { KeyPair } from \"@api/crypto/KeyPair\";\nimport { LKRPMissingDataError } from \"@api/model/Errors\";\nimport { Permissions } from \"@api/model/Permissions\";\nimport { appBinderTypes } from \"@internal/app-binder/di/appBinderTypes\";\nimport { LedgerKeyringProtocolBinder } from \"@internal/app-binder/LedgerKeyringProtocolBinder\";\n\nexport type AuthenticateUsecaseInput = {\n keyPair: KeyPair;\n clientName: string;\n permissions: Permissions;\n} & (\n | { trustchainId: string; sessionId?: DeviceSessionId }\n | { trustchainId?: undefined; sessionId: DeviceSessionId }\n);\n\n@injectable()\nexport class AuthenticateUseCase {\n constructor(\n @inject(appBinderTypes.AppBinding)\n private appBinder: LedgerKeyringProtocolBinder,\n ) {}\n\n execute(input: AuthenticateUsecaseInput): AuthenticateDAReturnType {\n if (input.trustchainId) {\n return this.appBinder.authenticateWithKeypair(input);\n }\n\n const sessionId = input.sessionId;\n if (sessionId) {\n return this.appBinder.authenticateWithDevice({ ...input, sessionId });\n }\n\n // The AuthenticateUsecaseInput type should prevent this case\n return {\n observable: of({\n status: DeviceActionStatus.Error,\n error: new LKRPMissingDataError(\n \"Either a trustchainId or a device is required for authentication.\",\n ),\n }),\n cancel: () => undefined,\n };\n }\n}\n"],
5
5
  "mappings": "okBAAA,IAAAA,EAAA,GAAAC,EAAAD,EAAA,yBAAAE,IAAA,eAAAC,EAAAH,GAAA,IAAAI,EAGO,2CACPC,EAAmC,qBACnCC,EAAmB,gBAInBC,EAAqC,6BAErCC,EAA+B,kDAaxB,IAAMC,EAAN,KAA0B,CAC/B,YAEUC,EACR,CADQ,eAAAA,CACP,CAEH,QAAQC,EAA2D,CACjE,GAAIA,EAAM,aACR,OAAO,KAAK,UAAU,wBAAwBA,CAAK,EAGrD,MAAMC,EAAYD,EAAM,UACxB,OAAIC,EACK,KAAK,UAAU,uBAAuB,CAAE,GAAGD,EAAO,UAAAC,CAAU,CAAC,EAI/D,CACL,cAAY,MAAG,CACb,OAAQ,qBAAmB,MAC3B,MAAO,IAAI,uBACT,mEACF,CACF,CAAC,EACD,OAAQ,IAAG,EACb,CACF,CACF,EA3BaH,EAANI,EAAA,IADN,cAAW,EAGPC,EAAA,eAAO,iBAAe,UAAU,IAFxBL",
6
6
  "names": ["AuthenticateUseCase_exports", "__export", "AuthenticateUseCase", "__toCommonJS", "import_device_management_kit", "import_inversify", "import_rxjs", "import_Errors", "import_appBinderTypes", "AuthenticateUseCase", "appBinder", "input", "sessionId", "__decorateClass", "__decorateParam"]
7
7
  }
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../../src/internal/use-cases/authentication/DecryptDataUseCase.ts"],
4
- "sourcesContent": ["import { ByteArrayParser } from \"@ledgerhq/device-management-kit\";\nimport { inject, injectable } from \"inversify\";\nimport { Maybe } from \"purify-ts\";\n\nimport {\n type CryptoService,\n Curve,\n EncryptionAlgo,\n HashAlgo,\n} from \"@api/crypto/CryptoService\";\nimport { LKRPParsingError } from \"@api/model/Errors\";\nimport { externalTypes } from \"@internal/externalTypes\";\nimport { eitherSeqRecord } from \"@internal/utils/eitherSeqRecord\";\n\n@injectable()\nexport class DecryptDataUseCase {\n constructor(\n @inject(externalTypes.CryptoService)\n private cryptoService: CryptoService,\n ) {}\n\n // TODO better return type instead of throw on errors\n async execute(\n encryptionKey: Uint8Array,\n data: Uint8Array,\n ): Promise<Uint8Array> {\n const parser = new ByteArrayParser(data);\n if (parser.extract8BitUInt() !== 0) {\n throw new LKRPParsingError(\"Unsupported serialization version\");\n }\n const required = (value: Uint8Array | undefined, field: string) =>\n Maybe.fromNullable(value).toEither(\n new LKRPParsingError(`Missing ${field} field`),\n );\n\n return eitherSeqRecord({\n ephemeralPublicKey: () =>\n required(parser.extractFieldByLength(33), \"ephemeral public key\"),\n iv: () => required(parser.extractFieldByLength(16), \"IV\"),\n tag: () => required(parser.extractFieldByLength(16), \"tag\"),\n encryptedData: () =>\n required(\n parser.extractFieldByLength(parser.getUnparsedRemainingLength()),\n \"encrypted data\",\n ),\n })\n .map(async ({ ephemeralPublicKey, iv, tag, encryptedData }) => {\n // Derive the shared secret using ECDH with an ephemeral keypair\n const privateKey = this.cryptoService.importKeyPair(\n encryptionKey,\n Curve.K256,\n );\n const sharedSecret =\n await privateKey.deriveSharedSecret(ephemeralPublicKey);\n\n // Key derivation using HMAC-SHA256\n const key = this.cryptoService.hmac(\n new Uint8Array(),\n sharedSecret.slice(1),\n HashAlgo.SHA256,\n );\n\n // Decrypt the data\n const symmetricKey = this.cryptoService.importSymmetricKey(\n key,\n EncryptionAlgo.AES256_GCM,\n );\n const ciphertext = new Uint8Array([...encryptedData, ...tag]);\n const cleartext = await symmetricKey.decrypt(iv, ciphertext);\n return cleartext;\n })\n .caseOf({\n Left: (error) => {\n throw error;\n },\n Right: (cleartext) => cleartext,\n });\n }\n}\n"],
4
+ "sourcesContent": ["import { ByteArrayParser } from \"@ledgerhq/device-management-kit\";\nimport { inject, injectable } from \"inversify\";\nimport { Maybe } from \"purify-ts\";\n\nimport {\n type CryptoService,\n Curve,\n EncryptionAlgo,\n HashAlgo,\n} from \"@api/crypto/CryptoService\";\nimport { LKRPParsingError } from \"@api/model/Errors\";\nimport { externalTypes } from \"@internal/externalTypes\";\nimport { eitherSeqRecord } from \"@internal/utils/eitherSeqRecord\";\n\n@injectable()\nexport class DecryptDataUseCase {\n constructor(\n @inject(externalTypes.CryptoService)\n private cryptoService: CryptoService,\n ) {}\n\n // TODO better return type instead of throw on errors\n async execute(\n encryptionKey: Uint8Array,\n data: Uint8Array,\n ): Promise<Uint8Array> {\n const parser = new ByteArrayParser(data);\n if (parser.extract8BitUInt() !== 0) {\n throw new LKRPParsingError(\"Unsupported serialization version\");\n }\n const required = (value: Uint8Array | undefined, field: string) =>\n Maybe.fromNullable(value).toEither(\n new LKRPParsingError(`Missing ${field} field`),\n );\n\n return eitherSeqRecord({\n ephemeralPublicKey: () =>\n required(parser.extractFieldByLength(33), \"ephemeral public key\"),\n iv: () => required(parser.extractFieldByLength(16), \"IV\"),\n tag: () => required(parser.extractFieldByLength(16), \"tag\"),\n encryptedData: () =>\n required(\n parser.extractFieldByLength(parser.getUnparsedRemainingLength()),\n \"encrypted data\",\n ),\n })\n .map(async ({ ephemeralPublicKey, iv, tag, encryptedData }) => {\n // Derive the shared secret using ECDH with an ephemeral keyPair\n const privateKey = this.cryptoService.importKeyPair(\n encryptionKey,\n Curve.K256,\n );\n const sharedSecret =\n await privateKey.deriveSharedSecret(ephemeralPublicKey);\n\n // Key derivation using HMAC-SHA256\n const key = this.cryptoService.hmac(\n new Uint8Array(),\n sharedSecret.slice(1),\n HashAlgo.SHA256,\n );\n\n // Decrypt the data\n const symmetricKey = this.cryptoService.importSymmetricKey(\n key,\n EncryptionAlgo.AES256_GCM,\n );\n const ciphertext = new Uint8Array([...encryptedData, ...tag]);\n const cleartext = await symmetricKey.decrypt(iv, ciphertext);\n return cleartext;\n })\n .caseOf({\n Left: (error) => {\n throw error;\n },\n Right: (cleartext) => cleartext,\n });\n }\n}\n"],
5
5
  "mappings": "okBAAA,IAAAA,EAAA,GAAAC,EAAAD,EAAA,wBAAAE,IAAA,eAAAC,EAAAH,GAAA,IAAAI,EAAgC,2CAChCC,EAAmC,qBACnCC,EAAsB,qBAEtBC,EAKO,qCACPC,EAAiC,6BACjCC,EAA8B,mCAC9BC,EAAgC,2CAGzB,IAAMC,EAAN,KAAyB,CAC9B,YAEUC,EACR,CADQ,mBAAAA,CACP,CAGH,MAAM,QACJC,EACAC,EACqB,CACrB,MAAMC,EAAS,IAAI,kBAAgBD,CAAI,EACvC,GAAIC,EAAO,gBAAgB,IAAM,EAC/B,MAAM,IAAI,mBAAiB,mCAAmC,EAEhE,MAAMC,EAAW,CAACC,EAA+BC,IAC/C,QAAM,aAAaD,CAAK,EAAE,SACxB,IAAI,mBAAiB,WAAWC,CAAK,QAAQ,CAC/C,EAEF,SAAO,mBAAgB,CACrB,mBAAoB,IAClBF,EAASD,EAAO,qBAAqB,EAAE,EAAG,sBAAsB,EAClE,GAAI,IAAMC,EAASD,EAAO,qBAAqB,EAAE,EAAG,IAAI,EACxD,IAAK,IAAMC,EAASD,EAAO,qBAAqB,EAAE,EAAG,KAAK,EAC1D,cAAe,IACbC,EACED,EAAO,qBAAqBA,EAAO,2BAA2B,CAAC,EAC/D,gBACF,CACJ,CAAC,EACE,IAAI,MAAO,CAAE,mBAAAI,EAAoB,GAAAC,EAAI,IAAAC,EAAK,cAAAC,CAAc,IAAM,CAM7D,MAAMC,EACJ,MALiB,KAAK,cAAc,cACpCV,EACA,QAAM,IACR,EAEmB,mBAAmBM,CAAkB,EAGlDK,EAAM,KAAK,cAAc,KAC7B,IAAI,WACJD,EAAa,MAAM,CAAC,EACpB,WAAS,MACX,EAGME,EAAe,KAAK,cAAc,mBACtCD,EACA,iBAAe,UACjB,EACME,EAAa,IAAI,WAAW,CAAC,GAAGJ,EAAe,GAAGD,CAAG,CAAC,EAE5D,OADkB,MAAMI,EAAa,QAAQL,EAAIM,CAAU,CAE7D,CAAC,EACA,OAAO,CACN,KAAOC,GAAU,CACf,MAAMA,CACR,EACA,MAAQC,GAAcA,CACxB,CAAC,CACL,CACF,EA/DajB,EAANkB,EAAA,IADN,cAAW,EAGPC,EAAA,eAAO,gBAAc,aAAa,IAF1BnB",
6
6
  "names": ["DecryptDataUseCase_exports", "__export", "DecryptDataUseCase", "__toCommonJS", "import_device_management_kit", "import_inversify", "import_purify_ts", "import_CryptoService", "import_Errors", "import_externalTypes", "import_eitherSeqRecord", "DecryptDataUseCase", "cryptoService", "encryptionKey", "data", "parser", "required", "value", "field", "ephemeralPublicKey", "iv", "tag", "encryptedData", "sharedSecret", "key", "symmetricKey", "ciphertext", "error", "cleartext", "__decorateClass", "__decorateParam"]
7
7
  }
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../../src/internal/use-cases/authentication/EncryptDataUseCase.ts"],
4
- "sourcesContent": ["import { ByteArrayBuilder } from \"@ledgerhq/device-management-kit\";\nimport { inject, injectable } from \"inversify\";\n\nimport {\n type CryptoService,\n Curve,\n EncryptionAlgo,\n HashAlgo,\n} from \"@api/crypto/CryptoService\";\nimport { AES256_BLOCK_SIZE } from \"@api/crypto/Key\";\nimport { externalTypes } from \"@internal/externalTypes\";\n\n@injectable()\nexport class EncryptDataUseCase {\n constructor(\n @inject(externalTypes.CryptoService)\n private cryptoService: CryptoService,\n ) {}\n\n async execute(\n encryptionKey: Uint8Array,\n data: Uint8Array,\n ): Promise<Uint8Array> {\n // Derive the shared secret using ECDH with an ephemeral keypair\n const privateKey = this.cryptoService.importKeyPair(\n encryptionKey,\n Curve.K256,\n );\n const ephemeralKeypair = await this.cryptoService.createKeyPair(Curve.K256);\n const sharedSecret = await privateKey.deriveSharedSecret(\n ephemeralKeypair.getPublicKey(),\n );\n\n // Key derivation using HMAC-SHA256\n const key = this.cryptoService.hmac(\n new Uint8Array(),\n sharedSecret.slice(1),\n HashAlgo.SHA256,\n );\n\n // Generate a random IV (nonce)\n const iv = this.cryptoService.randomBytes(16);\n\n // Encrypt data\n const symmetricKey = this.cryptoService.importSymmetricKey(\n key,\n EncryptionAlgo.AES256_GCM,\n );\n const ciphertext = await symmetricKey.encrypt(iv, data);\n const encryptedData = ciphertext.subarray(0, -AES256_BLOCK_SIZE);\n const tag = ciphertext.subarray(-AES256_BLOCK_SIZE);\n\n // Serialize the result\n return new ByteArrayBuilder()\n .add8BitUIntToData(0) // Version of the format\n .addBufferToData(ephemeralKeypair.getPublicKey())\n .addBufferToData(iv)\n .addBufferToData(tag)\n .addBufferToData(encryptedData)\n .build();\n }\n}\n"],
4
+ "sourcesContent": ["import { ByteArrayBuilder } from \"@ledgerhq/device-management-kit\";\nimport { inject, injectable } from \"inversify\";\n\nimport {\n type CryptoService,\n Curve,\n EncryptionAlgo,\n HashAlgo,\n} from \"@api/crypto/CryptoService\";\nimport { AES256_BLOCK_SIZE } from \"@api/crypto/Key\";\nimport { externalTypes } from \"@internal/externalTypes\";\n\n@injectable()\nexport class EncryptDataUseCase {\n constructor(\n @inject(externalTypes.CryptoService)\n private cryptoService: CryptoService,\n ) {}\n\n async execute(\n encryptionKey: Uint8Array,\n data: Uint8Array,\n ): Promise<Uint8Array> {\n // Derive the shared secret using ECDH with an ephemeral keyPair\n const privateKey = this.cryptoService.importKeyPair(\n encryptionKey,\n Curve.K256,\n );\n const ephemeralKeypair = await this.cryptoService.createKeyPair(Curve.K256);\n const sharedSecret = await privateKey.deriveSharedSecret(\n ephemeralKeypair.getPublicKey(),\n );\n\n // Key derivation using HMAC-SHA256\n const key = this.cryptoService.hmac(\n new Uint8Array(),\n sharedSecret.slice(1),\n HashAlgo.SHA256,\n );\n\n // Generate a random IV (nonce)\n const iv = this.cryptoService.randomBytes(16);\n\n // Encrypt data\n const symmetricKey = this.cryptoService.importSymmetricKey(\n key,\n EncryptionAlgo.AES256_GCM,\n );\n const ciphertext = await symmetricKey.encrypt(iv, data);\n const encryptedData = ciphertext.subarray(0, -AES256_BLOCK_SIZE);\n const tag = ciphertext.subarray(-AES256_BLOCK_SIZE);\n\n // Serialize the result\n return new ByteArrayBuilder()\n .add8BitUIntToData(0) // Version of the format\n .addBufferToData(ephemeralKeypair.getPublicKey())\n .addBufferToData(iv)\n .addBufferToData(tag)\n .addBufferToData(encryptedData)\n .build();\n }\n}\n"],
5
5
  "mappings": "okBAAA,IAAAA,EAAA,GAAAC,EAAAD,EAAA,wBAAAE,IAAA,eAAAC,EAAAH,GAAA,IAAAI,EAAiC,2CACjCC,EAAmC,qBAEnCC,EAKO,qCACPC,EAAkC,2BAClCC,EAA8B,mCAGvB,IAAMC,EAAN,KAAyB,CAC9B,YAEUC,EACR,CADQ,mBAAAA,CACP,CAEH,MAAM,QACJC,EACAC,EACqB,CAErB,MAAMC,EAAa,KAAK,cAAc,cACpCF,EACA,QAAM,IACR,EACMG,EAAmB,MAAM,KAAK,cAAc,cAAc,QAAM,IAAI,EACpEC,EAAe,MAAMF,EAAW,mBACpCC,EAAiB,aAAa,CAChC,EAGME,EAAM,KAAK,cAAc,KAC7B,IAAI,WACJD,EAAa,MAAM,CAAC,EACpB,WAAS,MACX,EAGME,EAAK,KAAK,cAAc,YAAY,EAAE,EAOtCC,EAAa,MAJE,KAAK,cAAc,mBACtCF,EACA,iBAAe,UACjB,EACsC,QAAQC,EAAIL,CAAI,EAChDO,EAAgBD,EAAW,SAAS,EAAG,CAAC,mBAAiB,EACzDE,EAAMF,EAAW,SAAS,CAAC,mBAAiB,EAGlD,OAAO,IAAI,mBAAiB,EACzB,kBAAkB,CAAC,EACnB,gBAAgBJ,EAAiB,aAAa,CAAC,EAC/C,gBAAgBG,CAAE,EAClB,gBAAgBG,CAAG,EACnB,gBAAgBD,CAAa,EAC7B,MAAM,CACX,CACF,EAhDaV,EAANY,EAAA,IADN,cAAW,EAGPC,EAAA,eAAO,gBAAc,aAAa,IAF1Bb",
6
6
  "names": ["EncryptDataUseCase_exports", "__export", "EncryptDataUseCase", "__toCommonJS", "import_device_management_kit", "import_inversify", "import_CryptoService", "import_Key", "import_externalTypes", "EncryptDataUseCase", "cryptoService", "encryptionKey", "data", "privateKey", "ephemeralKeypair", "sharedSecret", "key", "iv", "ciphertext", "encryptedData", "tag", "__decorateClass", "__decorateParam"]
7
7
  }
@@ -1,4 +1,4 @@
1
- "use strict";var p=Object.defineProperty;var b=Object.getOwnPropertyDescriptor;var P=Object.getOwnPropertyNames;var g=Object.prototype.hasOwnProperty;var d=(c,e)=>{for(var o in e)p(c,o,{get:e[o],enumerable:!0})},K=(c,e,o,t)=>{if(e&&typeof e=="object"||typeof e=="function")for(let a of P(e))!g.call(c,a)&&a!==o&&p(c,a,{get:()=>e[a],enumerable:!(t=b(e,a))||t.enumerable});return c};var k=c=>K(p({},"__esModule",{value:!0}),c);var M={};d(M,{LKRPBlockStream:()=>l});module.exports=k(M);var y=require("@ledgerhq/device-management-kit"),r=require("purify-ts"),u=require("../../api/crypto/CryptoService"),h=require("../models/Tags"),m=require("./LKRPBlock"),f=require("./TLVParser");class l{constructor(e,o){this.bytes=e;this.blocks=o?(0,r.Just)((0,r.Right)(o)):r.Nothing}validation=r.Nothing;blocks=r.Nothing;path=r.Nothing;static fromHex(e){return new l((0,y.hexaStringToBuffer)(e)??new Uint8Array)}static fromData(e,o){const t=[];let a=o??(0,y.bufferToHexaString)(crypto.getRandomValues(new Uint8Array(32)),!1);for(const i of e){const n=m.LKRPBlock.fromData({...i,parent:a});a=n.hash(),t.push(n)}const s=t.reduce((i,n)=>new Uint8Array([...i,...n.toU8A()]),new Uint8Array);return new l(s,t)}toU8A(){return this.bytes}toString(){return(0,y.bufferToHexaString)(this.bytes,!1)}parse(){return this.blocks.orDefaultLazy(()=>{const e=new f.TLVParser(this.bytes),o=[];for(;!e.state.isDone;){const a=e.state.offset,s=e.parseBlockData().map(i=>{const n=e.state.offset;return new m.LKRPBlock(this.bytes.slice(a,n),i)});if(o.push(s),s.isLeft())break}const t=r.Either.sequence(o);return this.blocks=(0,r.Just)(t),t})}toHuman(){return this.parse().map(e=>e.map(o=>o.toHuman())).chain(r.Either.sequence).map(e=>e.join(`
1
+ "use strict";var l=Object.defineProperty;var b=Object.getOwnPropertyDescriptor;var P=Object.getOwnPropertyNames;var g=Object.prototype.hasOwnProperty;var d=(c,e)=>{for(var o in e)l(c,o,{get:e[o],enumerable:!0})},K=(c,e,o,t)=>{if(e&&typeof e=="object"||typeof e=="function")for(let a of P(e))!g.call(c,a)&&a!==o&&l(c,a,{get:()=>e[a],enumerable:!(t=b(e,a))||t.enumerable});return c};var k=c=>K(l({},"__esModule",{value:!0}),c);var M={};d(M,{LKRPBlockStream:()=>p});module.exports=k(M);var y=require("@ledgerhq/device-management-kit"),r=require("purify-ts"),u=require("../../api/crypto/CryptoService"),h=require("../models/Tags"),m=require("./LKRPBlock"),f=require("./TLVParser");class p{constructor(e,o){this.bytes=e;this.blocks=o?(0,r.Just)((0,r.Right)(o)):r.Nothing}validation=r.Nothing;blocks=r.Nothing;path=r.Nothing;static fromHex(e){return new p((0,y.hexaStringToBuffer)(e)??new Uint8Array)}static fromData(e,o){const t=[];let a=o??(0,y.bufferToHexaString)(crypto.getRandomValues(new Uint8Array(32)),!1);for(const i of e){const n=m.LKRPBlock.fromData({...i,parent:a});a=n.hash(),t.push(n)}const s=t.reduce((i,n)=>new Uint8Array([...i,...n.toU8A()]),new Uint8Array);return new p(s,t)}toU8A(){return this.bytes}toString(){return(0,y.bufferToHexaString)(this.bytes,!1)}parse(){return this.blocks.orDefaultLazy(()=>{const e=new f.TLVParser(this.bytes),o=[];for(;!e.state.isDone;){const a=e.state.offset,s=e.parseBlockData().map(i=>{const n=e.state.offset;return new m.LKRPBlock(this.bytes.slice(a,n),i)});if(o.push(s),s.isLeft())break}const t=r.Either.sequence(o);return this.blocks=(0,r.Just)(t),t})}toHuman(){return this.parse().map(e=>e.map(o=>o.toHuman())).chain(r.Either.sequence).map(e=>e.join(`
2
2
 
3
3
  `))}async validate(e){return this.validation.orDefaultLazy(async()=>this.parse().map(t=>t.map(a=>a.parse().map(({parent:s})=>({parent:s,hash:()=>a.hash()})))).chain(r.Either.sequence).toMaybe().map(async t=>{if(e&&t[0]&&e!==t[0].parent)return!1;for await(const[a,s]of t.entries()){const i=t[a+1];if(i&&s.hash()!==i.parent)return!1}return!0}).orDefault(Promise.resolve(!1)))}getPath(){return this.path.ifNothing(()=>{this.path=this.parse().toMaybe().chainNullable(e=>e[0]).chain(e=>e.parse().toMaybe()).chainNullable(({commands:e})=>e[0]).chain(e=>e.parse().toMaybe()).chain(e=>{switch(e.type){case h.CommandTags.Derive:return(0,r.Just)(e.path);case h.CommandTags.Seed:return(0,r.Just)("m/0'");default:return r.Nothing}})}),this.path}getMemberBlock(e){return this.parse().toMaybe().chain(o=>{for(const t of o){const a=t.parse();if(a.isRight()){const s=a.extract();for(const i of s.commands){const n=i.getPublicKey();if(n.isJust()&&n.extract()===e)return r.Maybe.of(s)}}}return r.Nothing})}hasMember(e){return this.getMemberBlock(e).isJust()}async getPublishedKey(e,o){return r.MaybeAsync.liftMaybe(this.getMemberBlock(o.getPublicKeyToHex()).chain(t=>{for(const a of t.commands){const s=a.getEncryptedPublishedKey();if(s.isJust())return s}return r.Nothing})).map(async t=>{const a=(await o.deriveSharedSecret(t.ephemeralPublicKey)).slice(1),i=await e.importSymmetricKey(a,u.EncryptionAlgo.AES256_GCM).decrypt(t.initializationVector,t.encryptedXpriv);return{privateKey:i.slice(0,32),chainCode:i.slice(32)}})}}0&&(module.exports={LKRPBlockStream});
4
4
  //# sourceMappingURL=LKRPBlockStream.js.map
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../src/internal/utils/LKRPBlockStream.ts"],
4
- "sourcesContent": ["import {\n bufferToHexaString,\n hexaStringToBuffer,\n} from \"@ledgerhq/device-management-kit\";\nimport { Either, Just, Maybe, MaybeAsync, Nothing, Right } from \"purify-ts\";\n\nimport { type CryptoService, EncryptionAlgo } from \"@api/crypto/CryptoService\";\nimport { type KeyPair } from \"@api/crypto/KeyPair\";\nimport { type LKRPParsingError } from \"@api/model/Errors\";\nimport { type LKRPBlockData } from \"@internal/models/LKRPBlockTypes\";\nimport { CommandTags } from \"@internal/models/Tags\";\nimport {\n type EncryptedPublishedKey,\n type PublishedKey,\n} from \"@internal/models/Types\";\n\nimport { LKRPBlock } from \"./LKRPBlock\";\nimport { TLVParser } from \"./TLVParser\";\n\nexport class LKRPBlockStream {\n private validation: Maybe<Promise<boolean>> = Nothing;\n private blocks: Maybe<Either<LKRPParsingError, LKRPBlock[]>> = Nothing;\n private path: Maybe<string> = Nothing;\n\n constructor(\n private readonly bytes: Uint8Array,\n blocks?: LKRPBlock[],\n ) {\n this.blocks = blocks ? Just(Right(blocks)) : Nothing;\n }\n\n static fromHex(hex: string): LKRPBlockStream {\n return new LKRPBlockStream(hexaStringToBuffer(hex) ?? new Uint8Array());\n }\n\n static fromData(\n blocksData: Omit<LKRPBlockData, \"parent\">[],\n parentHash?: string,\n ): LKRPBlockStream {\n const blocks: LKRPBlock[] = [];\n let hash =\n parentHash ??\n bufferToHexaString(crypto.getRandomValues(new Uint8Array(32)), false);\n\n for (const blockData of blocksData) {\n const block = LKRPBlock.fromData({\n ...blockData,\n parent: hash,\n });\n hash = block.hash();\n blocks.push(block);\n }\n const bytes = blocks.reduce(\n (acc, block) => new Uint8Array([...acc, ...block.toU8A()]),\n new Uint8Array(),\n );\n return new LKRPBlockStream(bytes, blocks);\n }\n\n toU8A(): Uint8Array {\n return this.bytes;\n }\n\n toString(): string {\n return bufferToHexaString(this.bytes, false);\n }\n\n parse(): Either<LKRPParsingError, LKRPBlock[]> {\n return this.blocks.orDefaultLazy(() => {\n const parser = new TLVParser(this.bytes);\n const parsed: Either<LKRPParsingError, LKRPBlock>[] = [];\n while (!parser.state.isDone) {\n const start = parser.state.offset;\n const block = parser.parseBlockData().map((data) => {\n const end = parser.state.offset;\n return new LKRPBlock(this.bytes.slice(start, end), data);\n });\n parsed.push(block);\n if (block.isLeft()) break;\n }\n const blocks = Either.sequence(parsed);\n this.blocks = Just(blocks);\n return blocks;\n });\n }\n\n toHuman(): Either<LKRPParsingError, string> {\n return this.parse()\n .map((blocks) => blocks.map((block) => block.toHuman()))\n .chain(Either.sequence)\n .map((blocks) => blocks.join(\"\\n\\n\"));\n }\n\n async validate(streamParentHash?: string): Promise<boolean> {\n return this.validation.orDefaultLazy(async () => {\n const validation = this.parse()\n .map((blocks) =>\n blocks.map((block) =>\n block\n .parse()\n .map(({ parent }) => ({ parent, hash: () => block.hash() })),\n ),\n )\n .chain(Either.sequence)\n .toMaybe()\n .map(async (blocks) => {\n if (\n streamParentHash &&\n blocks[0] &&\n streamParentHash !== blocks[0].parent\n ) {\n return false;\n }\n\n for await (const [index, block] of blocks.entries()) {\n const nextBlock = blocks[index + 1];\n if (nextBlock && block.hash() !== nextBlock.parent) {\n return false;\n }\n }\n return true;\n })\n .orDefault(Promise.resolve(false));\n\n return validation;\n });\n }\n\n getPath(): Maybe<string> {\n this.path.ifNothing(() => {\n this.path = this.parse()\n .toMaybe()\n .chainNullable((blocks) => blocks[0])\n .chain((block) => block.parse().toMaybe())\n .chainNullable(({ commands }) => commands[0])\n .chain((command) => command.parse().toMaybe())\n .chain((data) => {\n switch (data.type) {\n case CommandTags.Derive:\n return Just(data.path);\n case CommandTags.Seed:\n return Just(\"m/0'\");\n default:\n return Nothing;\n }\n });\n });\n return this.path;\n }\n\n getMemberBlock(member: string): Maybe<LKRPBlockData> {\n return this.parse()\n .toMaybe()\n .chain((blocks) => {\n for (const block of blocks) {\n const parsedBlock = block.parse();\n if (parsedBlock.isRight()) {\n const blockData = parsedBlock.extract();\n for (const command of blockData.commands) {\n const pubkey = command.getPublicKey();\n if (pubkey.isJust() && pubkey.extract() === member) {\n return Maybe.of(blockData);\n }\n }\n }\n }\n return Nothing;\n });\n }\n\n hasMember(member: string): boolean {\n return this.getMemberBlock(member).isJust();\n }\n\n async getPublishedKey(\n cryptoService: CryptoService,\n keypair: KeyPair,\n ): Promise<Maybe<PublishedKey>> {\n return MaybeAsync.liftMaybe(\n this.getMemberBlock(keypair.getPublicKeyToHex()).chain(\n (block): Maybe<EncryptedPublishedKey> => {\n for (const command of block.commands) {\n const key = command.getEncryptedPublishedKey();\n if (key.isJust()) {\n return key;\n }\n }\n return Nothing;\n },\n ),\n ).map(async (published) => {\n const secret = (\n await keypair.deriveSharedSecret(published.ephemeralPublicKey)\n ).slice(1);\n const key = cryptoService.importSymmetricKey(\n secret,\n EncryptionAlgo.AES256_GCM,\n );\n const xpriv = await key.decrypt(\n published.initializationVector,\n published.encryptedXpriv,\n );\n return { privateKey: xpriv.slice(0, 32), chainCode: xpriv.slice(32) };\n });\n }\n}\n"],
4
+ "sourcesContent": ["import {\n bufferToHexaString,\n hexaStringToBuffer,\n} from \"@ledgerhq/device-management-kit\";\nimport { Either, Just, Maybe, MaybeAsync, Nothing, Right } from \"purify-ts\";\n\nimport { type CryptoService, EncryptionAlgo } from \"@api/crypto/CryptoService\";\nimport { type KeyPair } from \"@api/crypto/KeyPair\";\nimport { type LKRPParsingError } from \"@api/model/Errors\";\nimport { type LKRPBlockData } from \"@internal/models/LKRPBlockTypes\";\nimport { CommandTags } from \"@internal/models/Tags\";\nimport {\n type EncryptedPublishedKey,\n type PublishedKey,\n} from \"@internal/models/Types\";\n\nimport { LKRPBlock } from \"./LKRPBlock\";\nimport { TLVParser } from \"./TLVParser\";\n\nexport class LKRPBlockStream {\n private validation: Maybe<Promise<boolean>> = Nothing;\n private blocks: Maybe<Either<LKRPParsingError, LKRPBlock[]>> = Nothing;\n private path: Maybe<string> = Nothing;\n\n constructor(\n private readonly bytes: Uint8Array,\n blocks?: LKRPBlock[],\n ) {\n this.blocks = blocks ? Just(Right(blocks)) : Nothing;\n }\n\n static fromHex(hex: string): LKRPBlockStream {\n return new LKRPBlockStream(hexaStringToBuffer(hex) ?? new Uint8Array());\n }\n\n static fromData(\n blocksData: Omit<LKRPBlockData, \"parent\">[],\n parentHash?: string,\n ): LKRPBlockStream {\n const blocks: LKRPBlock[] = [];\n let hash =\n parentHash ??\n bufferToHexaString(crypto.getRandomValues(new Uint8Array(32)), false);\n\n for (const blockData of blocksData) {\n const block = LKRPBlock.fromData({\n ...blockData,\n parent: hash,\n });\n hash = block.hash();\n blocks.push(block);\n }\n const bytes = blocks.reduce(\n (acc, block) => new Uint8Array([...acc, ...block.toU8A()]),\n new Uint8Array(),\n );\n return new LKRPBlockStream(bytes, blocks);\n }\n\n toU8A(): Uint8Array {\n return this.bytes;\n }\n\n toString(): string {\n return bufferToHexaString(this.bytes, false);\n }\n\n parse(): Either<LKRPParsingError, LKRPBlock[]> {\n return this.blocks.orDefaultLazy(() => {\n const parser = new TLVParser(this.bytes);\n const parsed: Either<LKRPParsingError, LKRPBlock>[] = [];\n while (!parser.state.isDone) {\n const start = parser.state.offset;\n const block = parser.parseBlockData().map((data) => {\n const end = parser.state.offset;\n return new LKRPBlock(this.bytes.slice(start, end), data);\n });\n parsed.push(block);\n if (block.isLeft()) break;\n }\n const blocks = Either.sequence(parsed);\n this.blocks = Just(blocks);\n return blocks;\n });\n }\n\n toHuman(): Either<LKRPParsingError, string> {\n return this.parse()\n .map((blocks) => blocks.map((block) => block.toHuman()))\n .chain(Either.sequence)\n .map((blocks) => blocks.join(\"\\n\\n\"));\n }\n\n async validate(streamParentHash?: string): Promise<boolean> {\n return this.validation.orDefaultLazy(async () => {\n const validation = this.parse()\n .map((blocks) =>\n blocks.map((block) =>\n block\n .parse()\n .map(({ parent }) => ({ parent, hash: () => block.hash() })),\n ),\n )\n .chain(Either.sequence)\n .toMaybe()\n .map(async (blocks) => {\n if (\n streamParentHash &&\n blocks[0] &&\n streamParentHash !== blocks[0].parent\n ) {\n return false;\n }\n\n for await (const [index, block] of blocks.entries()) {\n const nextBlock = blocks[index + 1];\n if (nextBlock && block.hash() !== nextBlock.parent) {\n return false;\n }\n }\n return true;\n })\n .orDefault(Promise.resolve(false));\n\n return validation;\n });\n }\n\n getPath(): Maybe<string> {\n this.path.ifNothing(() => {\n this.path = this.parse()\n .toMaybe()\n .chainNullable((blocks) => blocks[0])\n .chain((block) => block.parse().toMaybe())\n .chainNullable(({ commands }) => commands[0])\n .chain((command) => command.parse().toMaybe())\n .chain((data) => {\n switch (data.type) {\n case CommandTags.Derive:\n return Just(data.path);\n case CommandTags.Seed:\n return Just(\"m/0'\");\n default:\n return Nothing;\n }\n });\n });\n return this.path;\n }\n\n getMemberBlock(member: string): Maybe<LKRPBlockData> {\n return this.parse()\n .toMaybe()\n .chain((blocks) => {\n for (const block of blocks) {\n const parsedBlock = block.parse();\n if (parsedBlock.isRight()) {\n const blockData = parsedBlock.extract();\n for (const command of blockData.commands) {\n const pubkey = command.getPublicKey();\n if (pubkey.isJust() && pubkey.extract() === member) {\n return Maybe.of(blockData);\n }\n }\n }\n }\n return Nothing;\n });\n }\n\n hasMember(member: string): boolean {\n return this.getMemberBlock(member).isJust();\n }\n\n async getPublishedKey(\n cryptoService: CryptoService,\n keyPair: KeyPair,\n ): Promise<Maybe<PublishedKey>> {\n return MaybeAsync.liftMaybe(\n this.getMemberBlock(keyPair.getPublicKeyToHex()).chain(\n (block): Maybe<EncryptedPublishedKey> => {\n for (const command of block.commands) {\n const key = command.getEncryptedPublishedKey();\n if (key.isJust()) {\n return key;\n }\n }\n return Nothing;\n },\n ),\n ).map(async (published) => {\n const secret = (\n await keyPair.deriveSharedSecret(published.ephemeralPublicKey)\n ).slice(1);\n const key = cryptoService.importSymmetricKey(\n secret,\n EncryptionAlgo.AES256_GCM,\n );\n const xpriv = await key.decrypt(\n published.initializationVector,\n published.encryptedXpriv,\n );\n return { privateKey: xpriv.slice(0, 32), chainCode: xpriv.slice(32) };\n });\n }\n}\n"],
5
5
  "mappings": "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",
6
- "names": ["LKRPBlockStream_exports", "__export", "LKRPBlockStream", "__toCommonJS", "import_device_management_kit", "import_purify_ts", "import_CryptoService", "import_Tags", "import_LKRPBlock", "import_TLVParser", "bytes", "blocks", "hex", "blocksData", "parentHash", "hash", "blockData", "block", "acc", "parser", "parsed", "start", "data", "end", "streamParentHash", "parent", "index", "nextBlock", "commands", "command", "member", "parsedBlock", "pubkey", "cryptoService", "keypair", "key", "published", "secret", "xpriv"]
6
+ "names": ["LKRPBlockStream_exports", "__export", "LKRPBlockStream", "__toCommonJS", "import_device_management_kit", "import_purify_ts", "import_CryptoService", "import_Tags", "import_LKRPBlock", "import_TLVParser", "bytes", "blocks", "hex", "blocksData", "parentHash", "hash", "blockData", "block", "acc", "parser", "parsed", "start", "data", "end", "streamParentHash", "parent", "index", "nextBlock", "commands", "command", "member", "parsedBlock", "pubkey", "cryptoService", "keyPair", "key", "published", "secret", "xpriv"]
7
7
  }
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ledgerhq/device-trusted-app-kit-ledger-keyring-protocol",
3
- "version": "0.3.1",
3
+ "version": "0.4.0",
4
4
  "license": "Apache-2.0",
5
5
  "private": false,
6
6
  "exports": {
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../src/api/app-binder/AddToTrustchainDeviceActionTypes.ts"],
4
- "sourcesContent": ["import {\n type OpenAppDAError,\n type UserInteractionRequired,\n} from \"@ledgerhq/device-management-kit\";\nimport { type Either } from \"purify-ts\";\n\nimport { type CryptoService } from \"@api/crypto/CryptoService\";\nimport { type KeyPair } from \"@api/crypto/KeyPair\";\nimport {\n type LKRPDataSourceError,\n type LKRPMissingDataError,\n type LKRPOutdatedTrustchainError,\n type LKRPParsingError,\n type LKRPTrustchainNotReady,\n type LKRPUnknownError,\n} from \"@api/model/Errors\";\nimport { type JWT } from \"@api/model/JWT\";\nimport { type Permissions } from \"@api/model/Permissions\";\nimport { type LKRPDeviceCommandError } from \"@internal/app-binder/command/utils/ledgerKeyringProtocolErrors\";\nimport { type LKRPDataSource } from \"@internal/lkrp-datasource/data/LKRPDataSource\";\nimport { type Trustchain } from \"@internal/utils/Trustchain\";\n\nexport type AddToTrustchainDAOutput = undefined;\n\nexport type AddToTrustchainDAInput = Either<\n LKRPMissingDataError,\n {\n readonly lkrpDataSource: LKRPDataSource;\n readonly cryptoService: CryptoService;\n readonly keypair: KeyPair;\n readonly jwt: JWT;\n readonly appId: number;\n readonly trustchain: Trustchain;\n readonly clientName: string;\n readonly permissions: Permissions;\n }\n>;\n\nexport type AddToTrustchainDAError =\n | LKRPDeviceCommandError\n | LKRPDataSourceError\n | LKRPParsingError\n | LKRPMissingDataError\n | LKRPOutdatedTrustchainError\n | LKRPTrustchainNotReady\n | OpenAppDAError\n | LKRPUnknownError;\n\nexport type AddToTrustchainDAIntermediateValue =\n | {\n requiredUserInteraction: UserInteractionRequired.None;\n step?:\n | AddToTrustchaineDAStep.Initialize\n | AddToTrustchaineDAStep.ParseStream;\n }\n | {\n requiredUserInteraction: AddToTrustchainDAState.AddMember;\n step: AddToTrustchaineDAStep.AddMember;\n };\n\nexport enum AddToTrustchainDAState {\n AddMember = \"lkrp-add-member\",\n}\n\nexport enum AddToTrustchaineDAStep {\n Initialize = \"lkrp-init-transaction\",\n ParseStream = \"lkrp-parse-stream\",\n AddMember = \"lkrp-add-member\",\n}\n\nexport type AddToTrustchainDAInternalState = Either<\n AddToTrustchainDAError,\n {\n readonly sessionKeypair: KeyPair | null;\n }\n>;\n"],
4
+ "sourcesContent": ["import {\n type OpenAppDAError,\n type UserInteractionRequired,\n} from \"@ledgerhq/device-management-kit\";\nimport { type Either } from \"purify-ts\";\n\nimport { type CryptoService } from \"@api/crypto/CryptoService\";\nimport { type KeyPair } from \"@api/crypto/KeyPair\";\nimport {\n type LKRPDataSourceError,\n type LKRPMissingDataError,\n type LKRPOutdatedTrustchainError,\n type LKRPParsingError,\n type LKRPTrustchainNotReady,\n type LKRPUnknownError,\n} from \"@api/model/Errors\";\nimport { type JWT } from \"@api/model/JWT\";\nimport { type Permissions } from \"@api/model/Permissions\";\nimport { type LKRPDeviceCommandError } from \"@internal/app-binder/command/utils/ledgerKeyringProtocolErrors\";\nimport { type LKRPDataSource } from \"@internal/lkrp-datasource/data/LKRPDataSource\";\nimport { type Trustchain } from \"@internal/utils/Trustchain\";\n\nexport type AddToTrustchainDAOutput = undefined;\n\nexport type AddToTrustchainDAInput = Either<\n LKRPMissingDataError,\n {\n readonly lkrpDataSource: LKRPDataSource;\n readonly cryptoService: CryptoService;\n readonly keyPair: KeyPair;\n readonly jwt: JWT;\n readonly appId: number;\n readonly trustchain: Trustchain;\n readonly clientName: string;\n readonly permissions: Permissions;\n }\n>;\n\nexport type AddToTrustchainDAError =\n | LKRPDeviceCommandError\n | LKRPDataSourceError\n | LKRPParsingError\n | LKRPMissingDataError\n | LKRPOutdatedTrustchainError\n | LKRPTrustchainNotReady\n | OpenAppDAError\n | LKRPUnknownError;\n\nexport type AddToTrustchainDAIntermediateValue =\n | {\n requiredUserInteraction: UserInteractionRequired.None;\n step?:\n | AddToTrustchaineDAStep.Initialize\n | AddToTrustchaineDAStep.ParseStream;\n }\n | {\n requiredUserInteraction: AddToTrustchainDAState.AddMember;\n step: AddToTrustchaineDAStep.AddMember;\n };\n\nexport enum AddToTrustchainDAState {\n AddMember = \"lkrp-add-member\",\n}\n\nexport enum AddToTrustchaineDAStep {\n Initialize = \"lkrp-init-transaction\",\n ParseStream = \"lkrp-parse-stream\",\n AddMember = \"lkrp-add-member\",\n}\n\nexport type AddToTrustchainDAInternalState = Either<\n AddToTrustchainDAError,\n {\n readonly sessionKeypair: KeyPair | null;\n }\n>;\n"],
5
5
  "mappings": "AA4DO,IAAKA,OACVA,EAAA,UAAY,kBADFA,OAAA,IAIAC,OACVA,EAAA,WAAa,wBACbA,EAAA,YAAc,oBACdA,EAAA,UAAY,kBAHFA,OAAA",
6
6
  "names": ["AddToTrustchainDAState", "AddToTrustchaineDAStep"]
7
7
  }
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../src/api/crypto/CryptoService.ts"],
4
- "sourcesContent": ["import { type Key } from \"./Key\";\nimport { type KeyPair } from \"./KeyPair\";\n\nexport enum Curve {\n K256, // secp256k1\n P256, // P-256\n}\n\nexport enum EncryptionAlgo {\n AES256_GCM,\n}\n\nexport enum HashAlgo {\n SHA256,\n}\n\nexport interface CryptoService {\n // Generate a random buffer\n randomBytes(len: number): Uint8Array;\n\n // Compute a hash\n hash(bytes: Uint8Array, algo: HashAlgo): Uint8Array;\n\n // Compute a HMAC\n hmac(key: Uint8Array, message: Uint8Array, algo: HashAlgo): Uint8Array;\n\n // Generate a new random keypair\n createKeyPair(curve: Curve): Promise<KeyPair>;\n\n // Import a keypair\n importKeyPair(privateKey: Uint8Array, curve: Curve): KeyPair;\n\n // Generate a new random symmetric key\n createSymmetricKey(algo: EncryptionAlgo): Promise<Key>;\n\n // Import a symmetric key\n importSymmetricKey(keyMaterial: Uint8Array, algo: EncryptionAlgo): Key;\n}\n"],
4
+ "sourcesContent": ["import { type Key } from \"./Key\";\nimport { type KeyPair } from \"./KeyPair\";\n\nexport enum Curve {\n K256, // secp256k1\n P256, // P-256\n}\n\nexport enum EncryptionAlgo {\n AES256_GCM,\n}\n\nexport enum HashAlgo {\n SHA256,\n}\n\nexport interface CryptoService {\n // Generate a random buffer\n randomBytes(len: number): Uint8Array;\n\n // Compute a hash\n hash(bytes: Uint8Array, algo: HashAlgo): Uint8Array;\n\n // Compute a HMAC\n hmac(key: Uint8Array, message: Uint8Array, algo: HashAlgo): Uint8Array;\n\n // Generate a new random keyPair\n createKeyPair(curve: Curve): Promise<KeyPair>;\n\n // Import a keyPair\n importKeyPair(privateKey: Uint8Array, curve: Curve): KeyPair;\n\n // Generate a new random symmetric key\n createSymmetricKey(algo: EncryptionAlgo): Promise<Key>;\n\n // Import a symmetric key\n importSymmetricKey(keyMaterial: Uint8Array, algo: EncryptionAlgo): Key;\n}\n"],
5
5
  "mappings": "AAGO,IAAKA,OACVA,IAAA,eACAA,IAAA,eAFUA,OAAA,IAKAC,OACVA,IAAA,2BADUA,OAAA,IAIAC,OACVA,IAAA,mBADUA,OAAA",
6
6
  "names": ["Curve", "EncryptionAlgo", "HashAlgo"]
7
7
  }
@@ -1,2 +1,2 @@
1
- import{GeneralDmkError as e}from"@ledgerhq/device-management-kit";class d extends e{constructor(r){super(r.message);this.err=r;this.status=r.status,this.message=r.message}_tag="LedgerKeyringProtocolError";message;status}class i extends e{constructor(r=null,s=`Current keypair is not a member of the trustchain${r?` ${r}`:""}.`){super(s);this.trustchainId=r;this.message=s}_tag="LedgerKeyringProtocolError"}class u extends e{constructor(r="The trustchain is outdated."){super(r);this.message=r}_tag="LedgerKeyringProtocolError"}class c extends e{constructor(r="Ledger Sync must be initialized from Ledger Live with this device."){super(r);this.message=r}_tag="LedgerKeyringProtocolError"}class g extends e{constructor(r){super(r);this.err=r}_tag="LedgerKeyringProtocolError"}class l extends e{constructor(r){super(r);this.err=r}_tag="LedgerKeyringProtocolError"}class y extends e{constructor(r){const s=r&&typeof r=="object"&&"type"in r&&typeof r.type=="number"&&`0x${r.type.toString(16).padStart(2,"0")}`;let n="Unsupported command";s&&(n+=`: ${s}`);super(n);this.command=r;this.message=n}_tag="LedgerKeyringProtocolError";message}class p extends e{constructor(r){super(r);this.message=r}_tag="LedgerKeyringProtocolError"}export{d as LKRPDataSourceError,l as LKRPMissingDataError,u as LKRPOutdatedTrustchainError,g as LKRPParsingError,c as LKRPTrustchainNotReady,i as LKRPUnauthorizedError,p as LKRPUnknownError,y as LKRPUnsupportedCommandError};
1
+ import{GeneralDmkError as e}from"@ledgerhq/device-management-kit";class d extends e{constructor(r){super(r.message);this.err=r;this.status=r.status,this.message=r.message}_tag="LedgerKeyringProtocolError";message;status}class i extends e{constructor(r=null,s=`Current keyPair is not a member of the trustchain${r?` ${r}`:""}.`){super(s);this.trustchainId=r;this.message=s}_tag="LedgerKeyringProtocolError"}class u extends e{constructor(r="The trustchain is outdated."){super(r);this.message=r}_tag="LedgerKeyringProtocolError"}class c extends e{constructor(r="Ledger Sync must be initialized from Ledger Live with this device."){super(r);this.message=r}_tag="LedgerKeyringProtocolError"}class g extends e{constructor(r){super(r);this.err=r}_tag="LedgerKeyringProtocolError"}class l extends e{constructor(r){super(r);this.err=r}_tag="LedgerKeyringProtocolError"}class y extends e{constructor(r){const s=r&&typeof r=="object"&&"type"in r&&typeof r.type=="number"&&`0x${r.type.toString(16).padStart(2,"0")}`;let n="Unsupported command";s&&(n+=`: ${s}`);super(n);this.command=r;this.message=n}_tag="LedgerKeyringProtocolError";message}class p extends e{constructor(r){super(r);this.message=r}_tag="LedgerKeyringProtocolError"}export{d as LKRPDataSourceError,l as LKRPMissingDataError,u as LKRPOutdatedTrustchainError,g as LKRPParsingError,c as LKRPTrustchainNotReady,i as LKRPUnauthorizedError,p as LKRPUnknownError,y as LKRPUnsupportedCommandError};
2
2
  //# sourceMappingURL=Errors.js.map
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../src/api/model/Errors.ts"],
4
- "sourcesContent": ["import { GeneralDmkError } from \"@ledgerhq/device-management-kit\";\n\nexport type LKRPDataSourceErrorStatus =\n | \"UNAUTHORIZED\"\n | \"BAD_REQUEST\"\n | \"UNKNOWN\";\n\nexport class LKRPDataSourceError extends GeneralDmkError {\n override _tag = \"LedgerKeyringProtocolError\";\n public readonly message: string;\n public readonly status: LKRPDataSourceErrorStatus;\n\n constructor(\n readonly err: {\n status: LKRPDataSourceErrorStatus;\n message: string;\n },\n ) {\n super(err.message);\n this.status = err.status;\n this.message = err.message;\n }\n}\n\nexport class LKRPUnauthorizedError extends GeneralDmkError {\n override _tag = \"LedgerKeyringProtocolError\";\n constructor(\n readonly trustchainId: string | null = null,\n readonly message: string = `Current keypair is not a member of the trustchain${trustchainId ? ` ${trustchainId}` : \"\"}.`,\n ) {\n super(message);\n }\n}\n\nexport class LKRPOutdatedTrustchainError extends GeneralDmkError {\n override _tag = \"LedgerKeyringProtocolError\";\n constructor(readonly message = \"The trustchain is outdated.\") {\n super(message);\n }\n}\n\nexport class LKRPTrustchainNotReady extends GeneralDmkError {\n override readonly _tag = \"LedgerKeyringProtocolError\";\n constructor(\n readonly message = \"Ledger Sync must be initialized from Ledger Live with this device.\",\n ) {\n super(message);\n }\n}\n\nexport class LKRPParsingError extends GeneralDmkError {\n override readonly _tag = \"LedgerKeyringProtocolError\";\n constructor(readonly err?: unknown) {\n super(err);\n }\n}\n\nexport class LKRPMissingDataError extends GeneralDmkError {\n override readonly _tag = \"LedgerKeyringProtocolError\";\n constructor(readonly err?: unknown) {\n super(err);\n }\n}\n\nexport class LKRPUnsupportedCommandError extends GeneralDmkError {\n override readonly _tag = \"LedgerKeyringProtocolError\";\n readonly message: string;\n constructor(readonly command: unknown) {\n const commandType =\n command &&\n typeof command === \"object\" &&\n \"type\" in command &&\n typeof command.type === \"number\" &&\n `0x${command.type.toString(16).padStart(2, \"0\")}`;\n let message = `Unsupported command`;\n if (commandType) message += `: ${commandType}`;\n\n super(message);\n\n this.message = message;\n }\n}\n\nexport class LKRPUnknownError extends GeneralDmkError {\n override readonly _tag = \"LedgerKeyringProtocolError\";\n constructor(readonly message: string) {\n super(message);\n }\n}\n"],
4
+ "sourcesContent": ["import { GeneralDmkError } from \"@ledgerhq/device-management-kit\";\n\nexport type LKRPDataSourceErrorStatus =\n | \"UNAUTHORIZED\"\n | \"BAD_REQUEST\"\n | \"UNKNOWN\";\n\nexport class LKRPDataSourceError extends GeneralDmkError {\n override _tag = \"LedgerKeyringProtocolError\";\n public readonly message: string;\n public readonly status: LKRPDataSourceErrorStatus;\n\n constructor(\n readonly err: {\n status: LKRPDataSourceErrorStatus;\n message: string;\n },\n ) {\n super(err.message);\n this.status = err.status;\n this.message = err.message;\n }\n}\n\nexport class LKRPUnauthorizedError extends GeneralDmkError {\n override _tag = \"LedgerKeyringProtocolError\";\n constructor(\n readonly trustchainId: string | null = null,\n readonly message: string = `Current keyPair is not a member of the trustchain${trustchainId ? ` ${trustchainId}` : \"\"}.`,\n ) {\n super(message);\n }\n}\n\nexport class LKRPOutdatedTrustchainError extends GeneralDmkError {\n override _tag = \"LedgerKeyringProtocolError\";\n constructor(readonly message = \"The trustchain is outdated.\") {\n super(message);\n }\n}\n\nexport class LKRPTrustchainNotReady extends GeneralDmkError {\n override readonly _tag = \"LedgerKeyringProtocolError\";\n constructor(\n readonly message = \"Ledger Sync must be initialized from Ledger Live with this device.\",\n ) {\n super(message);\n }\n}\n\nexport class LKRPParsingError extends GeneralDmkError {\n override readonly _tag = \"LedgerKeyringProtocolError\";\n constructor(readonly err?: unknown) {\n super(err);\n }\n}\n\nexport class LKRPMissingDataError extends GeneralDmkError {\n override readonly _tag = \"LedgerKeyringProtocolError\";\n constructor(readonly err?: unknown) {\n super(err);\n }\n}\n\nexport class LKRPUnsupportedCommandError extends GeneralDmkError {\n override readonly _tag = \"LedgerKeyringProtocolError\";\n readonly message: string;\n constructor(readonly command: unknown) {\n const commandType =\n command &&\n typeof command === \"object\" &&\n \"type\" in command &&\n typeof command.type === \"number\" &&\n `0x${command.type.toString(16).padStart(2, \"0\")}`;\n let message = `Unsupported command`;\n if (commandType) message += `: ${commandType}`;\n\n super(message);\n\n this.message = message;\n }\n}\n\nexport class LKRPUnknownError extends GeneralDmkError {\n override readonly _tag = \"LedgerKeyringProtocolError\";\n constructor(readonly message: string) {\n super(message);\n }\n}\n"],
5
5
  "mappings": "AAAA,OAAS,mBAAAA,MAAuB,kCAOzB,MAAMC,UAA4BD,CAAgB,CAKvD,YACWE,EAIT,CACA,MAAMA,EAAI,OAAO,EALR,SAAAA,EAMT,KAAK,OAASA,EAAI,OAClB,KAAK,QAAUA,EAAI,OACrB,CAbS,KAAO,6BACA,QACA,MAYlB,CAEO,MAAMC,UAA8BH,CAAgB,CAEzD,YACWI,EAA8B,KAC9BC,EAAkB,oDAAoDD,EAAe,IAAIA,CAAY,GAAK,EAAE,IACrH,CACA,MAAMC,CAAO,EAHJ,kBAAAD,EACA,aAAAC,CAGX,CANS,KAAO,4BAOlB,CAEO,MAAMC,UAAoCN,CAAgB,CAE/D,YAAqBK,EAAU,8BAA+B,CAC5D,MAAMA,CAAO,EADM,aAAAA,CAErB,CAHS,KAAO,4BAIlB,CAEO,MAAME,UAA+BP,CAAgB,CAE1D,YACWK,EAAU,qEACnB,CACA,MAAMA,CAAO,EAFJ,aAAAA,CAGX,CALkB,KAAO,4BAM3B,CAEO,MAAMG,UAAyBR,CAAgB,CAEpD,YAAqBE,EAAe,CAClC,MAAMA,CAAG,EADU,SAAAA,CAErB,CAHkB,KAAO,4BAI3B,CAEO,MAAMO,UAA6BT,CAAgB,CAExD,YAAqBE,EAAe,CAClC,MAAMA,CAAG,EADU,SAAAA,CAErB,CAHkB,KAAO,4BAI3B,CAEO,MAAMQ,UAAoCV,CAAgB,CAG/D,YAAqBW,EAAkB,CACrC,MAAMC,EACJD,GACA,OAAOA,GAAY,UACnB,SAAUA,GACV,OAAOA,EAAQ,MAAS,UACxB,KAAKA,EAAQ,KAAK,SAAS,EAAE,EAAE,SAAS,EAAG,GAAG,CAAC,GACjD,IAAIN,EAAU,sBACVO,IAAaP,GAAW,KAAKO,CAAW,IAE5C,MAAMP,CAAO,EAVM,aAAAM,EAYnB,KAAK,QAAUN,CACjB,CAfkB,KAAO,6BAChB,OAeX,CAEO,MAAMQ,UAAyBb,CAAgB,CAEpD,YAAqBK,EAAiB,CACpC,MAAMA,CAAO,EADM,aAAAA,CAErB,CAHkB,KAAO,4BAI3B",
6
6
  "names": ["GeneralDmkError", "LKRPDataSourceError", "err", "LKRPUnauthorizedError", "trustchainId", "message", "LKRPOutdatedTrustchainError", "LKRPTrustchainNotReady", "LKRPParsingError", "LKRPMissingDataError", "LKRPUnsupportedCommandError", "command", "commandType", "LKRPUnknownError"]
7
7
  }
@@ -1,2 +1,2 @@
1
- var d=Object.defineProperty;var y=Object.getOwnPropertyDescriptor;var u=(n,e,r,i)=>{for(var t=i>1?void 0:i?y(e,r):e,c=n.length-1,s;c>=0;c--)(s=n[c])&&(t=(i?s(e,r,t):s(t))||t);return i&&t&&d(e,r,t),t},o=(n,e)=>(r,i)=>e(r,i,n);import{SendCommandInAppDeviceAction as h,UserInteractionRequired as D}from"@ledgerhq/device-management-kit";import{inject as p,injectable as k}from"inversify";import{externalTypes as m}from"../externalTypes";import{lkrpDatasourceTypes as v}from"../lkrp-datasource/di/lkrpDatasourceTypes";import{GetVersionCommand as l}from"./command/GetVersionCommand";import{AuthenticateWithDeviceDeviceAction as A}from"./device-action/AuthenticateWithDeviceDeviceAction";import{AuthenticateWithKeypairDeviceAction as S}from"./device-action/AuthenticateWithKeypairDeviceAction";let a=class{constructor(e,r,i,t){this.dmk=e;this.applicationId=r;this.cryptoService=i;this.lkrpDataSource=t}authenticateWithKeypair(e){return new S({input:{lkrpDataSource:this.lkrpDataSource,appId:this.applicationId,cryptoService:this.cryptoService,keypair:e.keypair,trustchainId:e.trustchainId}}).execute()}authenticateWithDevice(e){return this.dmk.executeDeviceAction({sessionId:e.sessionId,deviceAction:new A({input:{lkrpDataSource:this.lkrpDataSource,appId:this.applicationId,cryptoService:this.cryptoService,clientName:e.clientName,permissions:e.permissions,keypair:e.keypair}})})}getVersion(e){return this.dmk.executeDeviceAction({sessionId:e.sessionId,deviceAction:new h({input:{command:new l,appName:"Ledger Sync",requiredUserInteraction:D.None,skipOpenApp:e.skipOpenApp}})})}getAppName(){throw new Error("Not implemented")}getSeedId(){throw new Error("Not implemented")}init(){throw new Error("Not implemented")}parseStream(){throw new Error("Not implemented")}signBlock(){throw new Error("Not implemented")}setTrustedMember(){throw new Error("Not implemented")}};a=u([k(),o(0,p(m.Dmk)),o(1,p(m.ApplicationId)),o(2,p(m.CryptoService)),o(3,p(v.LKRPDataSource))],a);export{a as LedgerKeyringProtocolBinder};
1
+ var d=Object.defineProperty;var y=Object.getOwnPropertyDescriptor;var u=(n,e,r,i)=>{for(var t=i>1?void 0:i?y(e,r):e,c=n.length-1,s;c>=0;c--)(s=n[c])&&(t=(i?s(e,r,t):s(t))||t);return i&&t&&d(e,r,t),t},o=(n,e)=>(r,i)=>e(r,i,n);import{SendCommandInAppDeviceAction as h,UserInteractionRequired as D}from"@ledgerhq/device-management-kit";import{inject as p,injectable as k}from"inversify";import{externalTypes as m}from"../externalTypes";import{lkrpDatasourceTypes as v}from"../lkrp-datasource/di/lkrpDatasourceTypes";import{GetVersionCommand as l}from"./command/GetVersionCommand";import{AuthenticateWithDeviceDeviceAction as A}from"./device-action/AuthenticateWithDeviceDeviceAction";import{AuthenticateWithKeypairDeviceAction as S}from"./device-action/AuthenticateWithKeypairDeviceAction";let a=class{constructor(e,r,i,t){this.dmk=e;this.applicationId=r;this.cryptoService=i;this.lkrpDataSource=t}authenticateWithKeypair(e){return new S({input:{lkrpDataSource:this.lkrpDataSource,appId:this.applicationId,cryptoService:this.cryptoService,keyPair:e.keyPair,trustchainId:e.trustchainId}}).execute()}authenticateWithDevice(e){return this.dmk.executeDeviceAction({sessionId:e.sessionId,deviceAction:new A({input:{lkrpDataSource:this.lkrpDataSource,appId:this.applicationId,cryptoService:this.cryptoService,clientName:e.clientName,permissions:e.permissions,keyPair:e.keyPair}})})}getVersion(e){return this.dmk.executeDeviceAction({sessionId:e.sessionId,deviceAction:new h({input:{command:new l,appName:"Ledger Sync",requiredUserInteraction:D.None,skipOpenApp:e.skipOpenApp}})})}getAppName(){throw new Error("Not implemented")}getSeedId(){throw new Error("Not implemented")}init(){throw new Error("Not implemented")}parseStream(){throw new Error("Not implemented")}signBlock(){throw new Error("Not implemented")}setTrustedMember(){throw new Error("Not implemented")}};a=u([k(),o(0,p(m.Dmk)),o(1,p(m.ApplicationId)),o(2,p(m.CryptoService)),o(3,p(v.LKRPDataSource))],a);export{a as LedgerKeyringProtocolBinder};
2
2
  //# sourceMappingURL=LedgerKeyringProtocolBinder.js.map
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../src/internal/app-binder/LedgerKeyringProtocolBinder.ts"],
4
- "sourcesContent": ["import {\n DeviceManagementKit,\n type DeviceSessionId,\n SendCommandInAppDeviceAction,\n UserInteractionRequired,\n} from \"@ledgerhq/device-management-kit\";\nimport { inject, injectable } from \"inversify\";\n\nimport { AuthenticateDAReturnType } from \"@api/app-binder/AuthenticateDeviceActionTypes\";\nimport { GetVersionDAReturnType } from \"@api/app-binder/GetVersionDeviceActionTypes\";\nimport { type CryptoService } from \"@api/crypto/CryptoService\";\nimport { KeyPair } from \"@api/crypto/KeyPair\";\nimport { Permissions } from \"@api/model/Permissions\";\nimport { externalTypes } from \"@internal/externalTypes\";\nimport { type LKRPDataSource } from \"@internal/lkrp-datasource/data/LKRPDataSource\";\nimport { lkrpDatasourceTypes } from \"@internal/lkrp-datasource/di/lkrpDatasourceTypes\";\n\nimport { GetVersionCommand } from \"./command/GetVersionCommand\";\nimport { AuthenticateWithDeviceDeviceAction } from \"./device-action/AuthenticateWithDeviceDeviceAction\";\nimport { AuthenticateWithKeypairDeviceAction } from \"./device-action/AuthenticateWithKeypairDeviceAction\";\n\n@injectable()\nexport class LedgerKeyringProtocolBinder {\n constructor(\n @inject(externalTypes.Dmk) private readonly dmk: DeviceManagementKit,\n\n @inject(externalTypes.ApplicationId)\n private readonly applicationId: number,\n\n @inject(externalTypes.CryptoService)\n private readonly cryptoService: CryptoService,\n\n @inject(lkrpDatasourceTypes.LKRPDataSource)\n private readonly lkrpDataSource: LKRPDataSource,\n ) {}\n\n authenticateWithKeypair(args: {\n keypair: KeyPair;\n trustchainId: string;\n }): AuthenticateDAReturnType {\n return new AuthenticateWithKeypairDeviceAction({\n input: {\n lkrpDataSource: this.lkrpDataSource,\n appId: this.applicationId,\n cryptoService: this.cryptoService,\n keypair: args.keypair,\n trustchainId: args.trustchainId,\n },\n }).execute();\n }\n\n authenticateWithDevice(args: {\n keypair: KeyPair;\n clientName: string;\n permissions: Permissions;\n sessionId: DeviceSessionId;\n }): AuthenticateDAReturnType {\n return this.dmk.executeDeviceAction({\n sessionId: args.sessionId,\n deviceAction: new AuthenticateWithDeviceDeviceAction({\n input: {\n lkrpDataSource: this.lkrpDataSource,\n appId: this.applicationId,\n cryptoService: this.cryptoService,\n clientName: args.clientName,\n permissions: args.permissions,\n keypair: args.keypair,\n },\n }),\n });\n }\n\n getVersion(args: {\n skipOpenApp: boolean;\n sessionId: DeviceSessionId;\n }): GetVersionDAReturnType {\n return this.dmk.executeDeviceAction({\n sessionId: args.sessionId,\n deviceAction: new SendCommandInAppDeviceAction({\n input: {\n command: new GetVersionCommand(),\n appName: \"Ledger Sync\",\n requiredUserInteraction: UserInteractionRequired.None,\n skipOpenApp: args.skipOpenApp,\n },\n }),\n });\n }\n\n getAppName(): unknown {\n throw new Error(\"Not implemented\");\n }\n\n getSeedId(): unknown {\n throw new Error(\"Not implemented\");\n }\n\n init(): unknown {\n throw new Error(\"Not implemented\");\n }\n\n parseStream(): unknown {\n throw new Error(\"Not implemented\");\n }\n\n signBlock(): unknown {\n throw new Error(\"Not implemented\");\n }\n\n setTrustedMember(): unknown {\n throw new Error(\"Not implemented\");\n }\n}\n"],
4
+ "sourcesContent": ["import {\n DeviceManagementKit,\n type DeviceSessionId,\n SendCommandInAppDeviceAction,\n UserInteractionRequired,\n} from \"@ledgerhq/device-management-kit\";\nimport { inject, injectable } from \"inversify\";\n\nimport { AuthenticateDAReturnType } from \"@api/app-binder/AuthenticateDeviceActionTypes\";\nimport { GetVersionDAReturnType } from \"@api/app-binder/GetVersionDeviceActionTypes\";\nimport { type CryptoService } from \"@api/crypto/CryptoService\";\nimport { KeyPair } from \"@api/crypto/KeyPair\";\nimport { Permissions } from \"@api/model/Permissions\";\nimport { externalTypes } from \"@internal/externalTypes\";\nimport { type LKRPDataSource } from \"@internal/lkrp-datasource/data/LKRPDataSource\";\nimport { lkrpDatasourceTypes } from \"@internal/lkrp-datasource/di/lkrpDatasourceTypes\";\n\nimport { GetVersionCommand } from \"./command/GetVersionCommand\";\nimport { AuthenticateWithDeviceDeviceAction } from \"./device-action/AuthenticateWithDeviceDeviceAction\";\nimport { AuthenticateWithKeypairDeviceAction } from \"./device-action/AuthenticateWithKeypairDeviceAction\";\n\n@injectable()\nexport class LedgerKeyringProtocolBinder {\n constructor(\n @inject(externalTypes.Dmk) private readonly dmk: DeviceManagementKit,\n\n @inject(externalTypes.ApplicationId)\n private readonly applicationId: number,\n\n @inject(externalTypes.CryptoService)\n private readonly cryptoService: CryptoService,\n\n @inject(lkrpDatasourceTypes.LKRPDataSource)\n private readonly lkrpDataSource: LKRPDataSource,\n ) {}\n\n authenticateWithKeypair(args: {\n keyPair: KeyPair;\n trustchainId: string;\n }): AuthenticateDAReturnType {\n return new AuthenticateWithKeypairDeviceAction({\n input: {\n lkrpDataSource: this.lkrpDataSource,\n appId: this.applicationId,\n cryptoService: this.cryptoService,\n keyPair: args.keyPair,\n trustchainId: args.trustchainId,\n },\n }).execute();\n }\n\n authenticateWithDevice(args: {\n keyPair: KeyPair;\n clientName: string;\n permissions: Permissions;\n sessionId: DeviceSessionId;\n }): AuthenticateDAReturnType {\n return this.dmk.executeDeviceAction({\n sessionId: args.sessionId,\n deviceAction: new AuthenticateWithDeviceDeviceAction({\n input: {\n lkrpDataSource: this.lkrpDataSource,\n appId: this.applicationId,\n cryptoService: this.cryptoService,\n clientName: args.clientName,\n permissions: args.permissions,\n keyPair: args.keyPair,\n },\n }),\n });\n }\n\n getVersion(args: {\n skipOpenApp: boolean;\n sessionId: DeviceSessionId;\n }): GetVersionDAReturnType {\n return this.dmk.executeDeviceAction({\n sessionId: args.sessionId,\n deviceAction: new SendCommandInAppDeviceAction({\n input: {\n command: new GetVersionCommand(),\n appName: \"Ledger Sync\",\n requiredUserInteraction: UserInteractionRequired.None,\n skipOpenApp: args.skipOpenApp,\n },\n }),\n });\n }\n\n getAppName(): unknown {\n throw new Error(\"Not implemented\");\n }\n\n getSeedId(): unknown {\n throw new Error(\"Not implemented\");\n }\n\n init(): unknown {\n throw new Error(\"Not implemented\");\n }\n\n parseStream(): unknown {\n throw new Error(\"Not implemented\");\n }\n\n signBlock(): unknown {\n throw new Error(\"Not implemented\");\n }\n\n setTrustedMember(): unknown {\n throw new Error(\"Not implemented\");\n }\n}\n"],
5
5
  "mappings": "iOAAA,OAGE,gCAAAA,EACA,2BAAAC,MACK,kCACP,OAAS,UAAAC,EAAQ,cAAAC,MAAkB,YAOnC,OAAS,iBAAAC,MAAqB,0BAE9B,OAAS,uBAAAC,MAA2B,mDAEpC,OAAS,qBAAAC,MAAyB,8BAClC,OAAS,sCAAAC,MAA0C,qDACnD,OAAS,uCAAAC,MAA2C,sDAG7C,IAAMC,EAAN,KAAkC,CACvC,YAC8CC,EAG3BC,EAGAC,EAGAC,EACjB,CAV4C,SAAAH,EAG3B,mBAAAC,EAGA,mBAAAC,EAGA,oBAAAC,CAChB,CAEH,wBAAwBC,EAGK,CAC3B,OAAO,IAAIC,EAAoC,CAC7C,MAAO,CACL,eAAgB,KAAK,eACrB,MAAO,KAAK,cACZ,cAAe,KAAK,cACpB,QAASD,EAAK,QACd,aAAcA,EAAK,YACrB,CACF,CAAC,EAAE,QAAQ,CACb,CAEA,uBAAuBA,EAKM,CAC3B,OAAO,KAAK,IAAI,oBAAoB,CAClC,UAAWA,EAAK,UAChB,aAAc,IAAIE,EAAmC,CACnD,MAAO,CACL,eAAgB,KAAK,eACrB,MAAO,KAAK,cACZ,cAAe,KAAK,cACpB,WAAYF,EAAK,WACjB,YAAaA,EAAK,YAClB,QAASA,EAAK,OAChB,CACF,CAAC,CACH,CAAC,CACH,CAEA,WAAWA,EAGgB,CACzB,OAAO,KAAK,IAAI,oBAAoB,CAClC,UAAWA,EAAK,UAChB,aAAc,IAAIG,EAA6B,CAC7C,MAAO,CACL,QAAS,IAAIC,EACb,QAAS,cACT,wBAAyBC,EAAwB,KACjD,YAAaL,EAAK,WACpB,CACF,CAAC,CACH,CAAC,CACH,CAEA,YAAsB,CACpB,MAAM,IAAI,MAAM,iBAAiB,CACnC,CAEA,WAAqB,CACnB,MAAM,IAAI,MAAM,iBAAiB,CACnC,CAEA,MAAgB,CACd,MAAM,IAAI,MAAM,iBAAiB,CACnC,CAEA,aAAuB,CACrB,MAAM,IAAI,MAAM,iBAAiB,CACnC,CAEA,WAAqB,CACnB,MAAM,IAAI,MAAM,iBAAiB,CACnC,CAEA,kBAA4B,CAC1B,MAAM,IAAI,MAAM,iBAAiB,CACnC,CACF,EA1FaL,EAANW,EAAA,CADNC,EAAW,EAGPC,EAAA,EAAAC,EAAOC,EAAc,GAAG,GAExBF,EAAA,EAAAC,EAAOC,EAAc,aAAa,GAGlCF,EAAA,EAAAC,EAAOC,EAAc,aAAa,GAGlCF,EAAA,EAAAC,EAAOE,EAAoB,cAAc,IAVjChB",
6
6
  "names": ["SendCommandInAppDeviceAction", "UserInteractionRequired", "inject", "injectable", "externalTypes", "lkrpDatasourceTypes", "GetVersionCommand", "AuthenticateWithDeviceDeviceAction", "AuthenticateWithKeypairDeviceAction", "LedgerKeyringProtocolBinder", "dmk", "applicationId", "cryptoService", "lkrpDataSource", "args", "AuthenticateWithKeypairDeviceAction", "AuthenticateWithDeviceDeviceAction", "SendCommandInAppDeviceAction", "GetVersionCommand", "UserInteractionRequired", "__decorateClass", "injectable", "__decorateParam", "inject", "externalTypes", "lkrpDatasourceTypes"]
7
7
  }
@@ -1,2 +1,2 @@
1
- import{hexaStringToBuffer as A,UserInteractionRequired as u,XStateDeviceAction as D}from"@ledgerhq/device-management-kit";import{EitherAsync as m,Left as T,Right as E}from"purify-ts";import{assign as p,fromPromise as h,setup as g}from"xstate";import{AddToTrustchainDAState as S,AddToTrustchaineDAStep as d}from"../../../api/app-binder/AddToTrustchainDeviceActionTypes";import{LKRPTrustchainNotReady as k,LKRPUnknownError as I}from"../../../api/model/Errors";import{InitTask as v}from"../../app-binder/task/InitTask";import{ParseStreamToDeviceTask as f}from"../../app-binder/task/ParseStreamToDeviceTask";import{SignBlockTask as b}from"../../app-binder/task/SignBlockTask";import{eitherSeqRecord as l}from"../../utils/eitherSeqRecord";import{required as s}from"../../utils/required";import{raiseAndAssign as c}from"./utils/raiseAndAssign";class U extends D{makeStateMachine(o){const{initCommand:i,parseStream:a,signBlock:y}=this.extractDependencies(o);return g({types:{input:{},context:{},output:{}},actors:{initCommand:h(i),parseStream:h(a),signBlock:h(y)},actions:{assignErrorFromEvent:c(({event:t})=>T(new I(String(t.error))))},guards:{isTustchainEmpty:({context:t})=>t.input.toMaybe().chain(e=>e.trustchain.getAppStream(e.appId)).chain(e=>e.parse().toMaybe()).map(e=>e.length===0).orDefault(!0)}}).createMachine({id:"AddToTrustchainDeviceAction",context:({input:t})=>({input:t,intermediateValue:{requiredUserInteraction:u.None},_internalState:E({sessionKeypair:null})}),initial:"InitSession",states:{InitSession:{entry:p({intermediateValue:{requiredUserInteraction:u.None,step:d.Initialize}}),on:{success:"ParseStream",error:"Error"},invoke:{id:"initCommand",src:"initCommand",input:({context:t})=>t.input.map(e=>e.cryptoService),onError:{actions:"assignErrorFromEvent"},onDone:{actions:c(({event:t})=>t.output.map(e=>({raise:"success",assign:{sessionKeypair:e}})))}}},ParseStream:{entry:p({intermediateValue:{requiredUserInteraction:u.None,step:d.ParseStream}}),on:{success:"CheckApplicationStreamExist",error:"Error"},invoke:{id:"parseStream",src:"parseStream",input:({context:t})=>t.input.chain(e=>l({seedBlock:()=>s(e.trustchain.getRootStream().chain(r=>r.parse().toMaybe()).extract()?.[0],"Missing seed block to parse"),applicationStream:()=>s(e.trustchain.getAppStream(e.appId).extract(),"Missing application stream to parse")})),onError:{actions:"assignErrorFromEvent"},onDone:{actions:c(({event:t})=>t.output.map(()=>({raise:"success"})))}}},CheckApplicationStreamExist:{always:[{target:"AddToNewStream",guard:"isTustchainEmpty"},{target:"AddToExistingStream"}]},AddToExistingStream:{entry:p({intermediateValue:{requiredUserInteraction:S.AddMember,step:d.AddMember}}),on:{success:"Success",error:"Error"},invoke:{id:"signBlock",src:"signBlock",input:({context:t})=>t.input.chain(e=>{const r=e.trustchain.getAppStream(e.appId);return l({cryptoService:e.cryptoService,lkrpDataSource:e.lkrpDataSource,trustchainId:e.trustchain.getId(),jwt:e.jwt,clientName:e.clientName,sessionKeypair:()=>t._internalState.chain(({sessionKeypair:n})=>s(n,"Missing session keypair")),path:()=>s(r.chain(n=>n.getPath()).extract(),"Missing application path"),parent:()=>s(r.chain(n=>n.parse().toMaybe()).chainNullable(n=>n.at(-1)?.hash()).chainNullable(A).extract(),"Missing parent block"),blockFlow:{type:"addMember",data:{name:e.clientName,publicKey:e.keypair.getPublicKey(),permissions:e.permissions}}})}),onError:{actions:"assignErrorFromEvent"},onDone:{actions:c(({event:t})=>t.output.map(()=>({raise:"success"})))}}},AddToNewStream:{entry:p({intermediateValue:{requiredUserInteraction:S.AddMember,step:d.AddMember}}),on:{success:"Success",error:"Error"},invoke:{id:"signBlock",src:"signBlock",input:({context:t})=>t.input.chain(e=>l({lkrpDataSource:e.lkrpDataSource,trustchainId:e.trustchain.getId(),jwt:e.jwt,clientName:e.clientName,sessionKeypair:()=>t._internalState.chain(({sessionKeypair:r})=>s(r,"Missing session keypair")),path:`m/0'/${e.appId}'/0'`,parent:()=>s(e.trustchain.getRootStream().chain(r=>r.parse().toMaybe()).chainNullable(r=>r[0]?.hash()).chainNullable(A).extract(),"Missing init block"),blockFlow:{type:"derive",data:{name:e.clientName,publicKey:e.keypair.getPublicKey(),permissions:e.permissions}}}).chain(()=>T(new k))),onError:{actions:"assignErrorFromEvent"},onDone:{actions:c(({event:t})=>t.output.map(()=>({raise:"success"})))}}},Success:{type:"final"},Error:{type:"final"}},output:({context:t})=>t._internalState.map(e=>{})})}extractDependencies(o){return{initCommand:async i=>m.liftEither(i.input).chain(a=>new v(o,a).run()).run(),parseStream:async i=>m.liftEither(i.input).chain(a=>new f(o).run(a)).run(),signBlock:i=>m.liftEither(i.input).chain(a=>new b(o,a.cryptoService).run(a)).run()}}}export{U as AddToTrustchainDeviceAction};
1
+ import{hexaStringToBuffer as A,UserInteractionRequired as u,XStateDeviceAction as D}from"@ledgerhq/device-management-kit";import{EitherAsync as m,Left as T,Right as E}from"purify-ts";import{assign as p,fromPromise as h,setup as g}from"xstate";import{AddToTrustchainDAState as S,AddToTrustchaineDAStep as d}from"../../../api/app-binder/AddToTrustchainDeviceActionTypes";import{LKRPTrustchainNotReady as k,LKRPUnknownError as I}from"../../../api/model/Errors";import{InitTask as v}from"../../app-binder/task/InitTask";import{ParseStreamToDeviceTask as f}from"../../app-binder/task/ParseStreamToDeviceTask";import{SignBlockTask as b}from"../../app-binder/task/SignBlockTask";import{eitherSeqRecord as l}from"../../utils/eitherSeqRecord";import{required as s}from"../../utils/required";import{raiseAndAssign as c}from"./utils/raiseAndAssign";class U extends D{makeStateMachine(o){const{initCommand:i,parseStream:a,signBlock:y}=this.extractDependencies(o);return g({types:{input:{},context:{},output:{}},actors:{initCommand:h(i),parseStream:h(a),signBlock:h(y)},actions:{assignErrorFromEvent:c(({event:t})=>T(new I(String(t.error))))},guards:{isTustchainEmpty:({context:t})=>t.input.toMaybe().chain(e=>e.trustchain.getAppStream(e.appId)).chain(e=>e.parse().toMaybe()).map(e=>e.length===0).orDefault(!0)}}).createMachine({id:"AddToTrustchainDeviceAction",context:({input:t})=>({input:t,intermediateValue:{requiredUserInteraction:u.None},_internalState:E({sessionKeypair:null})}),initial:"InitSession",states:{InitSession:{entry:p({intermediateValue:{requiredUserInteraction:u.None,step:d.Initialize}}),on:{success:"ParseStream",error:"Error"},invoke:{id:"initCommand",src:"initCommand",input:({context:t})=>t.input.map(e=>e.cryptoService),onError:{actions:"assignErrorFromEvent"},onDone:{actions:c(({event:t})=>t.output.map(e=>({raise:"success",assign:{sessionKeypair:e}})))}}},ParseStream:{entry:p({intermediateValue:{requiredUserInteraction:u.None,step:d.ParseStream}}),on:{success:"CheckApplicationStreamExist",error:"Error"},invoke:{id:"parseStream",src:"parseStream",input:({context:t})=>t.input.chain(e=>l({seedBlock:()=>s(e.trustchain.getRootStream().chain(r=>r.parse().toMaybe()).extract()?.[0],"Missing seed block to parse"),applicationStream:()=>s(e.trustchain.getAppStream(e.appId).extract(),"Missing application stream to parse")})),onError:{actions:"assignErrorFromEvent"},onDone:{actions:c(({event:t})=>t.output.map(()=>({raise:"success"})))}}},CheckApplicationStreamExist:{always:[{target:"AddToNewStream",guard:"isTustchainEmpty"},{target:"AddToExistingStream"}]},AddToExistingStream:{entry:p({intermediateValue:{requiredUserInteraction:S.AddMember,step:d.AddMember}}),on:{success:"Success",error:"Error"},invoke:{id:"signBlock",src:"signBlock",input:({context:t})=>t.input.chain(e=>{const r=e.trustchain.getAppStream(e.appId);return l({cryptoService:e.cryptoService,lkrpDataSource:e.lkrpDataSource,trustchainId:e.trustchain.getId(),jwt:e.jwt,clientName:e.clientName,sessionKeypair:()=>t._internalState.chain(({sessionKeypair:n})=>s(n,"Missing session keyPair")),path:()=>s(r.chain(n=>n.getPath()).extract(),"Missing application path"),parent:()=>s(r.chain(n=>n.parse().toMaybe()).chainNullable(n=>n.at(-1)?.hash()).chainNullable(A).extract(),"Missing parent block"),blockFlow:{type:"addMember",data:{name:e.clientName,publicKey:e.keyPair.getPublicKey(),permissions:e.permissions}}})}),onError:{actions:"assignErrorFromEvent"},onDone:{actions:c(({event:t})=>t.output.map(()=>({raise:"success"})))}}},AddToNewStream:{entry:p({intermediateValue:{requiredUserInteraction:S.AddMember,step:d.AddMember}}),on:{success:"Success",error:"Error"},invoke:{id:"signBlock",src:"signBlock",input:({context:t})=>t.input.chain(e=>l({lkrpDataSource:e.lkrpDataSource,trustchainId:e.trustchain.getId(),jwt:e.jwt,clientName:e.clientName,sessionKeypair:()=>t._internalState.chain(({sessionKeypair:r})=>s(r,"Missing session keyPair")),path:`m/0'/${e.appId}'/0'`,parent:()=>s(e.trustchain.getRootStream().chain(r=>r.parse().toMaybe()).chainNullable(r=>r[0]?.hash()).chainNullable(A).extract(),"Missing init block"),blockFlow:{type:"derive",data:{name:e.clientName,publicKey:e.keyPair.getPublicKey(),permissions:e.permissions}}}).chain(()=>T(new k))),onError:{actions:"assignErrorFromEvent"},onDone:{actions:c(({event:t})=>t.output.map(()=>({raise:"success"})))}}},Success:{type:"final"},Error:{type:"final"}},output:({context:t})=>t._internalState.map(e=>{})})}extractDependencies(o){return{initCommand:async i=>m.liftEither(i.input).chain(a=>new v(o,a).run()).run(),parseStream:async i=>m.liftEither(i.input).chain(a=>new f(o).run(a)).run(),signBlock:i=>m.liftEither(i.input).chain(a=>new b(o,a.cryptoService).run(a)).run()}}}export{U as AddToTrustchainDeviceAction};
2
2
  //# sourceMappingURL=AddToTrustchainDeviceAction.js.map
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../../src/internal/app-binder/device-action/AddToTrustchainDeviceAction.ts"],
4
- "sourcesContent": ["import {\n type DeviceActionStateMachine,\n hexaStringToBuffer,\n type InternalApi,\n type StateMachineTypes,\n UserInteractionRequired,\n XStateDeviceAction,\n} from \"@ledgerhq/device-management-kit\";\nimport { type Either, EitherAsync, Left, Right } from \"purify-ts\";\nimport { assign, fromPromise, setup } from \"xstate\";\n\nimport {\n type AddToTrustchainDAError,\n type AddToTrustchainDAInput,\n type AddToTrustchainDAIntermediateValue,\n type AddToTrustchainDAInternalState,\n type AddToTrustchainDAOutput,\n AddToTrustchainDAState,\n AddToTrustchaineDAStep,\n} from \"@api/app-binder/AddToTrustchainDeviceActionTypes\";\nimport { type CryptoService } from \"@api/crypto/CryptoService\";\nimport { type KeyPair } from \"@api/crypto/KeyPair\";\nimport { LKRPTrustchainNotReady, LKRPUnknownError } from \"@api/model/Errors\";\nimport { InitTask } from \"@internal/app-binder/task/InitTask\";\nimport {\n ParseStreamToDeviceTask,\n type ParseStreamToDeviceTaskInput,\n} from \"@internal/app-binder/task/ParseStreamToDeviceTask\";\nimport {\n SignBlockTask,\n type SignBlockTaskInput,\n} from \"@internal/app-binder/task/SignBlockTask\";\nimport { eitherSeqRecord } from \"@internal/utils/eitherSeqRecord\";\nimport { required } from \"@internal/utils/required\";\n\nimport { raiseAndAssign } from \"./utils/raiseAndAssign\";\n\nexport class AddToTrustchainDeviceAction extends XStateDeviceAction<\n AddToTrustchainDAOutput,\n AddToTrustchainDAInput,\n AddToTrustchainDAError,\n AddToTrustchainDAIntermediateValue,\n AddToTrustchainDAInternalState\n> {\n makeStateMachine(\n internalApi: InternalApi,\n ): DeviceActionStateMachine<\n AddToTrustchainDAOutput,\n AddToTrustchainDAInput,\n AddToTrustchainDAError,\n AddToTrustchainDAIntermediateValue,\n AddToTrustchainDAInternalState\n > {\n type types = StateMachineTypes<\n AddToTrustchainDAOutput,\n AddToTrustchainDAInput,\n AddToTrustchainDAError,\n AddToTrustchainDAIntermediateValue,\n AddToTrustchainDAInternalState\n >;\n\n const { initCommand, parseStream, signBlock } =\n this.extractDependencies(internalApi);\n\n return setup({\n types: {\n input: {} as types[\"input\"],\n context: {} as types[\"context\"],\n output: {} as types[\"output\"],\n },\n\n actors: {\n initCommand: fromPromise(initCommand),\n parseStream: fromPromise(parseStream),\n signBlock: fromPromise(signBlock),\n },\n\n actions: {\n assignErrorFromEvent: raiseAndAssign(\n ({ event }) =>\n Left(\n new LKRPUnknownError(\n String((event as { error?: unknown }).error),\n ),\n ), // NOTE: it should never happen, the error is not typed anymore here\n ),\n },\n\n guards: {\n isTustchainEmpty: ({ context }) =>\n context.input\n .toMaybe()\n .chain((input) => input.trustchain.getAppStream(input.appId))\n .chain((appStream) => appStream.parse().toMaybe())\n .map((blocks) => blocks.length === 0)\n .orDefault(true),\n },\n }).createMachine({\n /** @xstate-layout N4IgpgJg5mDOIC5QEEIQCoHt0CcCusALgMYAWAhgJYB2AImAG6XFjLGGWbUB0AktZUIBlOLE7UAxBC5huNBpgDWsmoIDCmALaby1CAG0ADAF1EoAA6YxHLmZAAPRAEZDAdm6unAFgAcXpwBsAKwAzL7+TgA0IACezq4AnB6GIU4ATAFeaUEBuT5pAL4F0agY2PhEZFR0jMys7OJ8AsKi4hJgODiYONzmADbkhABm3ZpyzRraugYmdpbW4naOCAlJaS4JXgGpCZ6r0XEIPgHc2YaGXiEhOdlXTkUlaFi4BCQUNPRMLGw2PPyCIlgYi4ElgeGILCBRlMSBA80Ei1hy2uXm4IVcXlWZwS5xChiCB0QaQSQW4QVcxMC63SCTShWKIFKzwqb2qnzqP0a-xaQLaHS6OGhcysCNsSMQKLRGKxQUMOJS+MJKzlaPSXlcPkSPkMaQxD0ZT3KryqH1q3waXG4AAVyDhYGAhIQcGByJopDJxgplL1bfbHc7XULYfDfktEKETgEnJ4coZMkEsUqnNqySFgtGgsmsWkvPqmUbKu8al96r9rb6HU6XW7+d1egNhqMfXbKwHNEGLCLQ+KEEEMmTdvHXEFjj4-ErNdxDD4wviciT8gEfHnDS9C2yzaXGjaW-7q6DwZDYB24V3EaBlq4NR4wmnpylvCEfEriScvHHdX4cwF1gEV2U11ZU0S05S0dz9KtXXaTpuhPENzwcRArx8G9LgCe9UkuZ9YiQscyR-LwEwCDVzice4GXzQCTWLDkLR4NRSDAYhFGQcx+mYQZxD3V0AFF7EoIgJDgs8xQvZxozSU4NnxK5sl2KIcIQYlJLSEIFx8Mj0PVcjHgAllqPZc0ywYpiWLYvoON+bjND4gTCCEpwYU7BZRMQhAyIpKS5RkkI5M8JUo1JeN8hHVwdQCBI-wo1d9KLQyt0tfNbKIGgoGs91qBUagvVkMQoGoAAhPpMGY4SXOoMN3KyFC3AfBN0jpLwlUxFDrgSdEwoTTVEn-ZljTizdQJ4JL+JS6g0sgmsYJ6fpBhGHAxjywritK2ZgxEiqe28aduCyZMlzTA7NWai5uBxH90xcLYZ16gsgJoozGhGuzUvSsEIVEMrRU2sT3MyJxTkinxIqvNJRzSALvFOSl1QTdYKSi3S+vXYDaLLZ6xomttoIFL7u1+wJ-EBpcQYpcGAsyDxKXnPs6QSW6qIGkC6O4fMADkwAAd3S6RMs9JRcsofKipKxQ8YQ5ZvDBqcwtSeq6RzJMMTO0JvGB3zfOnBnYo3Zn0cNDnucmnG61mxsFu4JaRdWpzT3KyrtpQvbR0OmdjsUjSyXOc4NJ1BInFp7X+t1tGnoNrm3sPT61uc76Hf+4ngeIsmlwhxTiUMbh8mJJ9PESLZAiDlGHoS4bw6N7Ha0FGO7bjraE9fJPQfJxSwgB3zKX9hJtTjIIigZahMAgOA7EonXUce1z4Nc5YAFoFMOWfSVWVZNXnVxtm8Eki-u+KhqaAFWinjbKvVF9rwDi6KSCWUKVzaK9ODifS-LXdJuFe2e3Vdx-HfBMtnRLSNOhxPxnSTucEcfh8TLgfsjXeg0WYmWYqxdixBOJcGsslQgH866-RxADK8Vxu7dXahFF8kUzofkxEELwWxsg3x3gZBB+syhYNeu-dan8CboidivXYCYUiZFcEqIiWc1TA3OLSTU98kZ3SYXrMOZRDbWRwfjNyTgeG7T4cOHEaYz7p1cCEXaH50JjmjHiNMjCmah0tEIKOQJVES3iLsKcN9fCqU-JcAkiltJkllvkQxtV1gyINI-Yue8WY8Wmo4me8RMy7RzFSK6cZ0gUyMeqf2tDpxpnJH3fuQA */\n\n id: \"AddToTrustchainDeviceAction\",\n context: ({ input }) => ({\n input,\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n },\n _internalState: Right({\n sessionKeypair: null,\n }),\n }),\n\n initial: \"InitSession\",\n states: {\n InitSession: {\n entry: assign({\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n step: AddToTrustchaineDAStep.Initialize,\n },\n }),\n on: { success: \"ParseStream\", error: \"Error\" },\n invoke: {\n id: \"initCommand\",\n src: \"initCommand\",\n input: ({ context }) =>\n context.input.map((input) => input.cryptoService),\n onError: { actions: \"assignErrorFromEvent\" },\n onDone: {\n actions: raiseAndAssign(({ event }) =>\n event.output.map((sessionKeypair) => ({\n raise: \"success\",\n assign: { sessionKeypair },\n })),\n ),\n },\n },\n },\n\n ParseStream: {\n entry: assign({\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n step: AddToTrustchaineDAStep.ParseStream,\n },\n }),\n on: { success: \"CheckApplicationStreamExist\", error: \"Error\" },\n invoke: {\n id: \"parseStream\",\n src: \"parseStream\",\n input: ({ context }) =>\n context.input.chain((input) =>\n eitherSeqRecord({\n seedBlock: () =>\n required(\n input.trustchain\n .getRootStream()\n .chain((stream) => stream.parse().toMaybe())\n .extract()?.[0],\n \"Missing seed block to parse\",\n ),\n applicationStream: () =>\n required(\n input.trustchain.getAppStream(input.appId).extract(),\n \"Missing application stream to parse\",\n ),\n }),\n ),\n onError: { actions: \"assignErrorFromEvent\" },\n onDone: {\n actions: raiseAndAssign(({ event }) =>\n event.output.map(() => ({ raise: \"success\" })),\n ),\n },\n },\n },\n\n CheckApplicationStreamExist: {\n always: [\n { target: \"AddToNewStream\", guard: \"isTustchainEmpty\" },\n { target: \"AddToExistingStream\" },\n ],\n },\n\n AddToExistingStream: {\n entry: assign({\n intermediateValue: {\n requiredUserInteraction: AddToTrustchainDAState.AddMember,\n step: AddToTrustchaineDAStep.AddMember,\n },\n }),\n on: { success: \"Success\", error: \"Error\" },\n invoke: {\n id: \"signBlock\",\n src: \"signBlock\",\n input: ({ context }) =>\n context.input.chain((input) => {\n const appStream = input.trustchain.getAppStream(input.appId);\n return eitherSeqRecord({\n cryptoService: input.cryptoService,\n lkrpDataSource: input.lkrpDataSource,\n trustchainId: input.trustchain.getId(),\n jwt: input.jwt,\n clientName: input.clientName,\n sessionKeypair: () =>\n context._internalState.chain(({ sessionKeypair }) =>\n required(sessionKeypair, \"Missing session keypair\"),\n ),\n path: () =>\n required(\n appStream.chain((stream) => stream.getPath()).extract(),\n \"Missing application path\",\n ),\n parent: () =>\n required(\n appStream\n .chain((stream) => stream.parse().toMaybe())\n .chainNullable((blocks) => blocks.at(-1)?.hash())\n .chainNullable(hexaStringToBuffer)\n .extract(),\n \"Missing parent block\",\n ),\n blockFlow: {\n type: \"addMember\",\n data: {\n name: input.clientName,\n publicKey: input.keypair.getPublicKey(),\n permissions: input.permissions,\n },\n },\n });\n }),\n onError: { actions: \"assignErrorFromEvent\" },\n onDone: {\n actions: raiseAndAssign(({ event }) =>\n event.output.map(() => ({ raise: \"success\" })),\n ),\n },\n },\n },\n\n AddToNewStream: {\n entry: assign({\n intermediateValue: {\n requiredUserInteraction: AddToTrustchainDAState.AddMember,\n step: AddToTrustchaineDAStep.AddMember,\n },\n }),\n on: { success: \"Success\", error: \"Error\" },\n invoke: {\n id: \"signBlock\",\n src: \"signBlock\",\n input: ({ context }) =>\n context.input.chain((input) =>\n eitherSeqRecord({\n lkrpDataSource: input.lkrpDataSource,\n trustchainId: input.trustchain.getId(),\n jwt: input.jwt,\n clientName: input.clientName,\n sessionKeypair: () =>\n context._internalState.chain(({ sessionKeypair }) =>\n required(sessionKeypair, \"Missing session keypair\"),\n ),\n path: `m/0'/${input.appId}'/0'`,\n parent: () =>\n required(\n input.trustchain\n .getRootStream()\n .chain((stream) => stream.parse().toMaybe())\n .chainNullable((blocks) => blocks[0]?.hash())\n .chainNullable(hexaStringToBuffer)\n .extract(),\n \"Missing init block\",\n ),\n blockFlow: {\n type: \"derive\",\n data: {\n name: input.clientName,\n publicKey: input.keypair.getPublicKey(),\n permissions: input.permissions,\n },\n },\n }).chain(() => Left(new LKRPTrustchainNotReady())),\n ),\n onError: { actions: \"assignErrorFromEvent\" },\n onDone: {\n actions: raiseAndAssign(({ event }) =>\n event.output.map(() => ({ raise: \"success\" })),\n ),\n },\n },\n },\n\n Success: { type: \"final\" },\n\n Error: { type: \"final\" },\n },\n\n output: ({ context }) => context._internalState.map((_) => undefined),\n });\n }\n\n extractDependencies(internalApi: InternalApi) {\n return {\n initCommand: async (args: {\n input: Either<AddToTrustchainDAError, CryptoService>;\n }): Promise<Either<AddToTrustchainDAError, KeyPair>> =>\n EitherAsync.liftEither(args.input)\n .chain((cryptoService) =>\n new InitTask(internalApi, cryptoService).run(),\n )\n .run(),\n\n parseStream: async (args: {\n input: Either<AddToTrustchainDAError, ParseStreamToDeviceTaskInput>;\n }) =>\n EitherAsync.liftEither(args.input)\n .chain<AddToTrustchainDAError, unknown>((input) =>\n new ParseStreamToDeviceTask(internalApi).run(input),\n )\n .run(),\n\n signBlock: (args: {\n input: Either<\n AddToTrustchainDAError,\n SignBlockTaskInput & { cryptoService: CryptoService }\n >;\n }): Promise<Either<AddToTrustchainDAError, void>> =>\n EitherAsync.liftEither(args.input)\n .chain((input) =>\n new SignBlockTask(internalApi, input.cryptoService).run(input),\n )\n .run(),\n };\n }\n}\n"],
4
+ "sourcesContent": ["import {\n type DeviceActionStateMachine,\n hexaStringToBuffer,\n type InternalApi,\n type StateMachineTypes,\n UserInteractionRequired,\n XStateDeviceAction,\n} from \"@ledgerhq/device-management-kit\";\nimport { type Either, EitherAsync, Left, Right } from \"purify-ts\";\nimport { assign, fromPromise, setup } from \"xstate\";\n\nimport {\n type AddToTrustchainDAError,\n type AddToTrustchainDAInput,\n type AddToTrustchainDAIntermediateValue,\n type AddToTrustchainDAInternalState,\n type AddToTrustchainDAOutput,\n AddToTrustchainDAState,\n AddToTrustchaineDAStep,\n} from \"@api/app-binder/AddToTrustchainDeviceActionTypes\";\nimport { type CryptoService } from \"@api/crypto/CryptoService\";\nimport { type KeyPair } from \"@api/crypto/KeyPair\";\nimport { LKRPTrustchainNotReady, LKRPUnknownError } from \"@api/model/Errors\";\nimport { InitTask } from \"@internal/app-binder/task/InitTask\";\nimport {\n ParseStreamToDeviceTask,\n type ParseStreamToDeviceTaskInput,\n} from \"@internal/app-binder/task/ParseStreamToDeviceTask\";\nimport {\n SignBlockTask,\n type SignBlockTaskInput,\n} from \"@internal/app-binder/task/SignBlockTask\";\nimport { eitherSeqRecord } from \"@internal/utils/eitherSeqRecord\";\nimport { required } from \"@internal/utils/required\";\n\nimport { raiseAndAssign } from \"./utils/raiseAndAssign\";\n\nexport class AddToTrustchainDeviceAction extends XStateDeviceAction<\n AddToTrustchainDAOutput,\n AddToTrustchainDAInput,\n AddToTrustchainDAError,\n AddToTrustchainDAIntermediateValue,\n AddToTrustchainDAInternalState\n> {\n makeStateMachine(\n internalApi: InternalApi,\n ): DeviceActionStateMachine<\n AddToTrustchainDAOutput,\n AddToTrustchainDAInput,\n AddToTrustchainDAError,\n AddToTrustchainDAIntermediateValue,\n AddToTrustchainDAInternalState\n > {\n type types = StateMachineTypes<\n AddToTrustchainDAOutput,\n AddToTrustchainDAInput,\n AddToTrustchainDAError,\n AddToTrustchainDAIntermediateValue,\n AddToTrustchainDAInternalState\n >;\n\n const { initCommand, parseStream, signBlock } =\n this.extractDependencies(internalApi);\n\n return setup({\n types: {\n input: {} as types[\"input\"],\n context: {} as types[\"context\"],\n output: {} as types[\"output\"],\n },\n\n actors: {\n initCommand: fromPromise(initCommand),\n parseStream: fromPromise(parseStream),\n signBlock: fromPromise(signBlock),\n },\n\n actions: {\n assignErrorFromEvent: raiseAndAssign(\n ({ event }) =>\n Left(\n new LKRPUnknownError(\n String((event as { error?: unknown }).error),\n ),\n ), // NOTE: it should never happen, the error is not typed anymore here\n ),\n },\n\n guards: {\n isTustchainEmpty: ({ context }) =>\n context.input\n .toMaybe()\n .chain((input) => input.trustchain.getAppStream(input.appId))\n .chain((appStream) => appStream.parse().toMaybe())\n .map((blocks) => blocks.length === 0)\n .orDefault(true),\n },\n }).createMachine({\n /** @xstate-layout N4IgpgJg5mDOIC5QEEIQCoHt0CcCusALgMYAWAhgJYB2AImAG6XFjLGGWbUB0AktZUIBlOLE7UAxBC5huNBpgDWsmoIDCmALaby1CAG0ADAF1EoAA6YxHLmZAAPRAEZDAdm6unAFgAcXpwBsAKwAzL7+TgA0IACezq4AnB6GIU4ATAFeaUEBuT5pAL4F0agY2PhEZFR0jMys7OJ8AsKi4hJgODiYONzmADbkhABm3ZpyzRraugYmdpbW4naOCAlJaS4JXgGpCZ6r0XEIPgHc2YaGXiEhOdlXTkUlaFi4BCQUNPRMLGw2PPyCIlgYi4ElgeGILCBRlMSBA80Ei1hy2uXm4IVcXlWZwS5xChiCB0QaQSQW4QVcxMC63SCTShWKIFKzwqb2qnzqP0a-xaQLaHS6OGhcysCNsSMQKLRGKxQUMOJS+MJKzlaPSXlcPkSPkMaQxD0ZT3KryqH1q3waXG4AAVyDhYGAhIQcGByJopDJxgplL1bfbHc7XULYfDfktEKETgEnJ4coZMkEsUqnNqySFgtGgsmsWkvPqmUbKu8al96r9rb6HU6XW7+d1egNhqMfXbKwHNEGLCLQ+KEEEMmTdvHXEFjj4-ErNdxDD4wviciT8gEfHnDS9C2yzaXGjaW-7q6DwZDYB24V3EaBlq4NR4wmnpylvCEfEriScvHHdX4cwF1gEV2U11ZU0S05S0dz9KtXXaTpuhPENzwcRArx8G9LgCe9UkuZ9YiQscyR-LwEwCDVzice4GXzQCTWLDkLR4NRSDAYhFGQcx+mYQZxD3V0AFF7EoIgJDgs8xQvZxozSU4NnxK5sl2KIcIQYlJLSEIFx8Mj0PVcjHgAllqPZc0ywYpiWLYvoON+bjND4gTCCEpwYU7BZRMQhAyIpKS5RkkI5M8JUo1JeN8hHVwdQCBI-wo1d9KLQyt0tfNbKIGgoGs91qBUagvVkMQoGoAAhPpMGY4SXOoMN3KyFC3AfBN0jpLwlUxFDrgSdEwoTTVEn-ZljTizdQJ4JL+JS6g0sgmsYJ6fpBhGHAxjywritK2ZgxEiqe28aduCyZMlzTA7NWai5uBxH90xcLYZ16gsgJoozGhGuzUvSsEIVEMrRU2sT3MyJxTkinxIqvNJRzSALvFOSl1QTdYKSi3S+vXYDaLLZ6xomttoIFL7u1+wJ-EBpcQYpcGAsyDxKXnPs6QSW6qIGkC6O4fMADkwAAd3S6RMs9JRcsofKipKxQ8YQ5ZvDBqcwtSeq6RzJMMTO0JvGB3zfOnBnYo3Zn0cNDnucmnG61mxsFu4JaRdWpzT3KyrtpQvbR0OmdjsUjSyXOc4NJ1BInFp7X+t1tGnoNrm3sPT61uc76Hf+4ngeIsmlwhxTiUMbh8mJJ9PESLZAiDlGHoS4bw6N7Ha0FGO7bjraE9fJPQfJxSwgB3zKX9hJtTjIIigZahMAgOA7EonXUce1z4Nc5YAFoFMOWfSVWVZNXnVxtm8Eki-u+KhqaAFWinjbKvVF9rwDi6KSCWUKVzaK9ODifS-LXdJuFe2e3Vdx-HfBMtnRLSNOhxPxnSTucEcfh8TLgfsjXeg0WYmWYqxdixBOJcGsslQgH866-RxADK8Vxu7dXahFF8kUzofkxEELwWxsg3x3gZBB+syhYNeu-dan8CboidivXYCYUiZFcEqIiWc1TA3OLSTU98kZ3SYXrMOZRDbWRwfjNyTgeG7T4cOHEaYz7p1cCEXaH50JjmjHiNMjCmah0tEIKOQJVES3iLsKcN9fCqU-JcAkiltJkllvkQxtV1gyINI-Yue8WY8Wmo4me8RMy7RzFSK6cZ0gUyMeqf2tDpxpnJH3fuQA */\n\n id: \"AddToTrustchainDeviceAction\",\n context: ({ input }) => ({\n input,\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n },\n _internalState: Right({\n sessionKeypair: null,\n }),\n }),\n\n initial: \"InitSession\",\n states: {\n InitSession: {\n entry: assign({\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n step: AddToTrustchaineDAStep.Initialize,\n },\n }),\n on: { success: \"ParseStream\", error: \"Error\" },\n invoke: {\n id: \"initCommand\",\n src: \"initCommand\",\n input: ({ context }) =>\n context.input.map((input) => input.cryptoService),\n onError: { actions: \"assignErrorFromEvent\" },\n onDone: {\n actions: raiseAndAssign(({ event }) =>\n event.output.map((sessionKeypair) => ({\n raise: \"success\",\n assign: { sessionKeypair },\n })),\n ),\n },\n },\n },\n\n ParseStream: {\n entry: assign({\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n step: AddToTrustchaineDAStep.ParseStream,\n },\n }),\n on: { success: \"CheckApplicationStreamExist\", error: \"Error\" },\n invoke: {\n id: \"parseStream\",\n src: \"parseStream\",\n input: ({ context }) =>\n context.input.chain((input) =>\n eitherSeqRecord({\n seedBlock: () =>\n required(\n input.trustchain\n .getRootStream()\n .chain((stream) => stream.parse().toMaybe())\n .extract()?.[0],\n \"Missing seed block to parse\",\n ),\n applicationStream: () =>\n required(\n input.trustchain.getAppStream(input.appId).extract(),\n \"Missing application stream to parse\",\n ),\n }),\n ),\n onError: { actions: \"assignErrorFromEvent\" },\n onDone: {\n actions: raiseAndAssign(({ event }) =>\n event.output.map(() => ({ raise: \"success\" })),\n ),\n },\n },\n },\n\n CheckApplicationStreamExist: {\n always: [\n { target: \"AddToNewStream\", guard: \"isTustchainEmpty\" },\n { target: \"AddToExistingStream\" },\n ],\n },\n\n AddToExistingStream: {\n entry: assign({\n intermediateValue: {\n requiredUserInteraction: AddToTrustchainDAState.AddMember,\n step: AddToTrustchaineDAStep.AddMember,\n },\n }),\n on: { success: \"Success\", error: \"Error\" },\n invoke: {\n id: \"signBlock\",\n src: \"signBlock\",\n input: ({ context }) =>\n context.input.chain((input) => {\n const appStream = input.trustchain.getAppStream(input.appId);\n return eitherSeqRecord({\n cryptoService: input.cryptoService,\n lkrpDataSource: input.lkrpDataSource,\n trustchainId: input.trustchain.getId(),\n jwt: input.jwt,\n clientName: input.clientName,\n sessionKeypair: () =>\n context._internalState.chain(({ sessionKeypair }) =>\n required(sessionKeypair, \"Missing session keyPair\"),\n ),\n path: () =>\n required(\n appStream.chain((stream) => stream.getPath()).extract(),\n \"Missing application path\",\n ),\n parent: () =>\n required(\n appStream\n .chain((stream) => stream.parse().toMaybe())\n .chainNullable((blocks) => blocks.at(-1)?.hash())\n .chainNullable(hexaStringToBuffer)\n .extract(),\n \"Missing parent block\",\n ),\n blockFlow: {\n type: \"addMember\",\n data: {\n name: input.clientName,\n publicKey: input.keyPair.getPublicKey(),\n permissions: input.permissions,\n },\n },\n });\n }),\n onError: { actions: \"assignErrorFromEvent\" },\n onDone: {\n actions: raiseAndAssign(({ event }) =>\n event.output.map(() => ({ raise: \"success\" })),\n ),\n },\n },\n },\n\n AddToNewStream: {\n entry: assign({\n intermediateValue: {\n requiredUserInteraction: AddToTrustchainDAState.AddMember,\n step: AddToTrustchaineDAStep.AddMember,\n },\n }),\n on: { success: \"Success\", error: \"Error\" },\n invoke: {\n id: \"signBlock\",\n src: \"signBlock\",\n input: ({ context }) =>\n context.input.chain((input) =>\n eitherSeqRecord({\n lkrpDataSource: input.lkrpDataSource,\n trustchainId: input.trustchain.getId(),\n jwt: input.jwt,\n clientName: input.clientName,\n sessionKeypair: () =>\n context._internalState.chain(({ sessionKeypair }) =>\n required(sessionKeypair, \"Missing session keyPair\"),\n ),\n path: `m/0'/${input.appId}'/0'`,\n parent: () =>\n required(\n input.trustchain\n .getRootStream()\n .chain((stream) => stream.parse().toMaybe())\n .chainNullable((blocks) => blocks[0]?.hash())\n .chainNullable(hexaStringToBuffer)\n .extract(),\n \"Missing init block\",\n ),\n blockFlow: {\n type: \"derive\",\n data: {\n name: input.clientName,\n publicKey: input.keyPair.getPublicKey(),\n permissions: input.permissions,\n },\n },\n }).chain(() => Left(new LKRPTrustchainNotReady())),\n ),\n onError: { actions: \"assignErrorFromEvent\" },\n onDone: {\n actions: raiseAndAssign(({ event }) =>\n event.output.map(() => ({ raise: \"success\" })),\n ),\n },\n },\n },\n\n Success: { type: \"final\" },\n\n Error: { type: \"final\" },\n },\n\n output: ({ context }) => context._internalState.map((_) => undefined),\n });\n }\n\n extractDependencies(internalApi: InternalApi) {\n return {\n initCommand: async (args: {\n input: Either<AddToTrustchainDAError, CryptoService>;\n }): Promise<Either<AddToTrustchainDAError, KeyPair>> =>\n EitherAsync.liftEither(args.input)\n .chain((cryptoService) =>\n new InitTask(internalApi, cryptoService).run(),\n )\n .run(),\n\n parseStream: async (args: {\n input: Either<AddToTrustchainDAError, ParseStreamToDeviceTaskInput>;\n }) =>\n EitherAsync.liftEither(args.input)\n .chain<AddToTrustchainDAError, unknown>((input) =>\n new ParseStreamToDeviceTask(internalApi).run(input),\n )\n .run(),\n\n signBlock: (args: {\n input: Either<\n AddToTrustchainDAError,\n SignBlockTaskInput & { cryptoService: CryptoService }\n >;\n }): Promise<Either<AddToTrustchainDAError, void>> =>\n EitherAsync.liftEither(args.input)\n .chain((input) =>\n new SignBlockTask(internalApi, input.cryptoService).run(input),\n )\n .run(),\n };\n }\n}\n"],
5
5
  "mappings": "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",
6
6
  "names": ["hexaStringToBuffer", "UserInteractionRequired", "XStateDeviceAction", "EitherAsync", "Left", "Right", "assign", "fromPromise", "setup", "AddToTrustchainDAState", "AddToTrustchaineDAStep", "LKRPTrustchainNotReady", "LKRPUnknownError", "InitTask", "ParseStreamToDeviceTask", "SignBlockTask", "eitherSeqRecord", "required", "raiseAndAssign", "AddToTrustchainDeviceAction", "internalApi", "initCommand", "parseStream", "signBlock", "event", "context", "input", "appStream", "blocks", "sessionKeypair", "stream", "_", "args", "cryptoService"]
7
7
  }
@@ -1,2 +1,2 @@
1
- import{OpenAppDeviceAction as S,UserInteractionRequired as h,XStateDeviceAction as T}from"@ledgerhq/device-management-kit";import{EitherAsync as d,Left as A,Right as D}from"purify-ts";import{assign as s,fromPromise as m,setup as g}from"xstate";import{AuthenticateDAState as v,AuthenticateDAStep as o}from"../../../api/app-binder/AuthenticateDeviceActionTypes";import{LKRPMissingDataError as l,LKRPTrustchainNotReady as I,LKRPUnknownError as f}from"../../../api/model/Errors";import{AuthenticateTask as k}from"../../app-binder/task/AuthenticateTask";import{ExtractEncryptionKeyTask as M}from"../../app-binder/task/ExtractEncryptionKeyTask";import{SignChallengeWithDeviceTask as w}from"../../app-binder/task/SignChallengeWithDeviceTask";import{eitherSeqRecord as y}from"../../utils/eitherSeqRecord";import{required as r}from"../../utils/required";import{raiseAndAssign as a}from"./utils/raiseAndAssign";import{AddToTrustchainDeviceAction as K}from"./AddToTrustchainDeviceAction";const E="Ledger Sync";class F extends T{makeStateMachine(c){const{deviceAuth:u,getTrustchain:p,extractEncryptionKey:i}=this.extractDependencies(c);return g({types:{input:{},context:{},output:{}},actors:{openAppStateMachine:new S({input:{appName:E}}).makeStateMachine(c),deviceAuth:m(u),getTrustchain:m(p),addToTrustchainStateMachine:new K({input:A(new l("Missing input for GetEncryptionKey"))}).makeStateMachine(c),extractEncryptionKey:m(i)},actions:{assignErrorFromEvent:a(({event:t})=>A(new f(String(t.error))))},guards:{isTrustchainMember:({context:t})=>t._internalState.toMaybe().map(e=>e.wasAddedToTrustchain||e.trustchain?.getAppStream(t.input.appId).mapOrDefault(n=>n.hasMember(t.input.keypair.getPublicKeyToHex()),!1)).extract()??!1}}).createMachine({id:"AuthenticateWithDeviceDeviceAction",context:({input:t})=>({input:t,intermediateValue:{requiredUserInteraction:h.None},_internalState:D({trustchainId:null,jwt:null,trustchain:null,encryptionKey:null,wasAddedToTrustchain:!1})}),initial:"OpenApp",states:{OpenApp:{on:{success:"DeviceAuth",error:"Error"},invoke:{id:"openApp",src:"openAppStateMachine",onSnapshot:{actions:s({intermediateValue:({event:t})=>({step:o.OpenApp,...t.snapshot.context.intermediateValue})})},input:{appName:E},onError:{actions:"assignErrorFromEvent"},onDone:{actions:a(({event:t})=>t.output.map(()=>({raise:"success"})))}}},DeviceAuth:{entry:s({intermediateValue:{step:o.Authenticate,requiredUserInteraction:v.Authenticate}}),on:{success:"GetTrustchain",error:"Error"},invoke:{id:"deviceAuth",src:"deviceAuth",input:({context:t})=>t.input,onError:{actions:"assignErrorFromEvent"},onDone:{actions:a(({event:t})=>t.output.chain(e=>e.trustchainId.caseOf({Nothing:()=>A(new I),Just:n=>D({raise:"success",assign:{jwt:e.jwt,trustchainId:n}})})))}}},GetTrustchain:{entry:s({intermediateValue:{step:o.GetTrustchain,requiredUserInteraction:h.None}}),on:{success:"CheckIsMembers",error:"Error"},invoke:{id:"getTrustchain",src:"getTrustchain",input:({context:t})=>t._internalState.chain(e=>y({lkrpDataSource:t.input.lkrpDataSource,trustchainId:()=>r(e.trustchainId,"Missing Trustchain ID for GetTrustchain"),jwt:()=>r(e.jwt,"Missing JWT for GetTrustchain")})),onError:{actions:"assignErrorFromEvent"},onDone:{actions:a(({event:t})=>t.output.map(e=>({raise:"success",assign:{trustchain:e}})))}}},CheckIsMembers:{always:[{target:"ExtractEncryptionKey",guard:"isTrustchainMember"},{target:"AddToTrustchain"}]},AddToTrustchain:{on:{success:"GetTrustchain",error:"Error"},invoke:{id:"AddToTrustchain",src:"addToTrustchainStateMachine",onSnapshot:{actions:s({intermediateValue:({event:t})=>t.snapshot.context.intermediateValue})},input:({context:t})=>t._internalState.mapLeft(()=>new l("Missing data in the input for AddToTrustchain")).chain(e=>y({lkrpDataSource:t.input.lkrpDataSource,cryptoService:t.input.cryptoService,keypair:t.input.keypair,clientName:t.input.clientName,permissions:t.input.permissions,jwt:()=>r(e.jwt,"Missing JWT for AddToTrustchain"),appId:t.input.appId,trustchain:()=>r(e.trustchain,"Missing Trustchain for AddToTrustchain")})),onError:{actions:"assignErrorFromEvent"},onDone:{actions:a(({event:t})=>t.output.map(()=>({raise:"success",assign:{wasAddedToTrustchain:!0}})))}}},ExtractEncryptionKey:{entry:s({intermediateValue:{step:o.ExtractEncryptionKey,requiredUserInteraction:h.None}}),on:{success:"Success",error:"Error"},invoke:{id:"ExtractEncryptionKey",src:"extractEncryptionKey",input:({context:t})=>({cryptoService:t.input.cryptoService,keypair:t.input.keypair,stream:t._internalState.chain(({trustchain:e})=>r(e?.getAppStream(t.input.appId).extract(),"Missing application stream for ExtractEncryptionKey"))}),onError:{actions:"assignErrorFromEvent"},onDone:{actions:a(({event:t})=>t.output.map(e=>({raise:"success",assign:{encryptionKey:e}})))}}},Success:{type:"final"},Error:{type:"final"}},output:({context:t})=>t._internalState.chain(e=>y({trustchainId:()=>r(e.trustchainId,"Missing Trustchain ID in the output"),jwt:()=>r(e.jwt,"Missing JWT in the output"),applicationPath:()=>r(e.trustchain?.getAppStream(t.input.appId).chain(n=>n.getPath()).extract(),"Missing application path in the output"),encryptionKey:()=>r(e.encryptionKey,"Missing encryption key in the output")}))})}extractDependencies(c){const u=new k,p=new M;return{deviceAuth:({input:i})=>u.run(i.lkrpDataSource,new w(c)),getTrustchain:i=>d.liftEither(i.input).chain(({lkrpDataSource:t,trustchainId:e,jwt:n})=>t.getTrustchainById(e,n)).run(),extractEncryptionKey:async({input:i})=>d.liftEither(i.stream).chain(t=>p.run(i.cryptoService,i.keypair,t))}}}export{F as AuthenticateWithDeviceDeviceAction};
1
+ import{OpenAppDeviceAction as S,UserInteractionRequired as h,XStateDeviceAction as T}from"@ledgerhq/device-management-kit";import{EitherAsync as d,Left as A,Right as D}from"purify-ts";import{assign as s,fromPromise as m,setup as g}from"xstate";import{AuthenticateDAState as v,AuthenticateDAStep as o}from"../../../api/app-binder/AuthenticateDeviceActionTypes";import{LKRPMissingDataError as l,LKRPTrustchainNotReady as I,LKRPUnknownError as f}from"../../../api/model/Errors";import{AuthenticateTask as k}from"../../app-binder/task/AuthenticateTask";import{ExtractEncryptionKeyTask as M}from"../../app-binder/task/ExtractEncryptionKeyTask";import{SignChallengeWithDeviceTask as w}from"../../app-binder/task/SignChallengeWithDeviceTask";import{eitherSeqRecord as y}from"../../utils/eitherSeqRecord";import{required as r}from"../../utils/required";import{raiseAndAssign as a}from"./utils/raiseAndAssign";import{AddToTrustchainDeviceAction as K}from"./AddToTrustchainDeviceAction";const E="Ledger Sync";class F extends T{makeStateMachine(c){const{deviceAuth:u,getTrustchain:p,extractEncryptionKey:i}=this.extractDependencies(c);return g({types:{input:{},context:{},output:{}},actors:{openAppStateMachine:new S({input:{appName:E}}).makeStateMachine(c),deviceAuth:m(u),getTrustchain:m(p),addToTrustchainStateMachine:new K({input:A(new l("Missing input for GetEncryptionKey"))}).makeStateMachine(c),extractEncryptionKey:m(i)},actions:{assignErrorFromEvent:a(({event:t})=>A(new f(String(t.error))))},guards:{isTrustchainMember:({context:t})=>t._internalState.toMaybe().map(e=>e.wasAddedToTrustchain||e.trustchain?.getAppStream(t.input.appId).mapOrDefault(n=>n.hasMember(t.input.keyPair.getPublicKeyToHex()),!1)).extract()??!1}}).createMachine({id:"AuthenticateWithDeviceDeviceAction",context:({input:t})=>({input:t,intermediateValue:{requiredUserInteraction:h.None},_internalState:D({trustchainId:null,jwt:null,trustchain:null,encryptionKey:null,wasAddedToTrustchain:!1})}),initial:"OpenApp",states:{OpenApp:{on:{success:"DeviceAuth",error:"Error"},invoke:{id:"openApp",src:"openAppStateMachine",onSnapshot:{actions:s({intermediateValue:({event:t})=>({step:o.OpenApp,...t.snapshot.context.intermediateValue})})},input:{appName:E},onError:{actions:"assignErrorFromEvent"},onDone:{actions:a(({event:t})=>t.output.map(()=>({raise:"success"})))}}},DeviceAuth:{entry:s({intermediateValue:{step:o.Authenticate,requiredUserInteraction:v.Authenticate}}),on:{success:"GetTrustchain",error:"Error"},invoke:{id:"deviceAuth",src:"deviceAuth",input:({context:t})=>t.input,onError:{actions:"assignErrorFromEvent"},onDone:{actions:a(({event:t})=>t.output.chain(e=>e.trustchainId.caseOf({Nothing:()=>A(new I),Just:n=>D({raise:"success",assign:{jwt:e.jwt,trustchainId:n}})})))}}},GetTrustchain:{entry:s({intermediateValue:{step:o.GetTrustchain,requiredUserInteraction:h.None}}),on:{success:"CheckIsMembers",error:"Error"},invoke:{id:"getTrustchain",src:"getTrustchain",input:({context:t})=>t._internalState.chain(e=>y({lkrpDataSource:t.input.lkrpDataSource,trustchainId:()=>r(e.trustchainId,"Missing Trustchain ID for GetTrustchain"),jwt:()=>r(e.jwt,"Missing JWT for GetTrustchain")})),onError:{actions:"assignErrorFromEvent"},onDone:{actions:a(({event:t})=>t.output.map(e=>({raise:"success",assign:{trustchain:e}})))}}},CheckIsMembers:{always:[{target:"ExtractEncryptionKey",guard:"isTrustchainMember"},{target:"AddToTrustchain"}]},AddToTrustchain:{on:{success:"GetTrustchain",error:"Error"},invoke:{id:"AddToTrustchain",src:"addToTrustchainStateMachine",onSnapshot:{actions:s({intermediateValue:({event:t})=>t.snapshot.context.intermediateValue})},input:({context:t})=>t._internalState.mapLeft(()=>new l("Missing data in the input for AddToTrustchain")).chain(e=>y({lkrpDataSource:t.input.lkrpDataSource,cryptoService:t.input.cryptoService,keyPair:t.input.keyPair,clientName:t.input.clientName,permissions:t.input.permissions,jwt:()=>r(e.jwt,"Missing JWT for AddToTrustchain"),appId:t.input.appId,trustchain:()=>r(e.trustchain,"Missing Trustchain for AddToTrustchain")})),onError:{actions:"assignErrorFromEvent"},onDone:{actions:a(({event:t})=>t.output.map(()=>({raise:"success",assign:{wasAddedToTrustchain:!0}})))}}},ExtractEncryptionKey:{entry:s({intermediateValue:{step:o.ExtractEncryptionKey,requiredUserInteraction:h.None}}),on:{success:"Success",error:"Error"},invoke:{id:"ExtractEncryptionKey",src:"extractEncryptionKey",input:({context:t})=>({cryptoService:t.input.cryptoService,keyPair:t.input.keyPair,stream:t._internalState.chain(({trustchain:e})=>r(e?.getAppStream(t.input.appId).extract(),"Missing application stream for ExtractEncryptionKey"))}),onError:{actions:"assignErrorFromEvent"},onDone:{actions:a(({event:t})=>t.output.map(e=>({raise:"success",assign:{encryptionKey:e}})))}}},Success:{type:"final"},Error:{type:"final"}},output:({context:t})=>t._internalState.chain(e=>y({trustchainId:()=>r(e.trustchainId,"Missing Trustchain ID in the output"),jwt:()=>r(e.jwt,"Missing JWT in the output"),applicationPath:()=>r(e.trustchain?.getAppStream(t.input.appId).chain(n=>n.getPath()).extract(),"Missing application path in the output"),encryptionKey:()=>r(e.encryptionKey,"Missing encryption key in the output")}))})}extractDependencies(c){const u=new k,p=new M;return{deviceAuth:({input:i})=>u.run(i.lkrpDataSource,new w(c)),getTrustchain:i=>d.liftEither(i.input).chain(({lkrpDataSource:t,trustchainId:e,jwt:n})=>t.getTrustchainById(e,n)).run(),extractEncryptionKey:async({input:i})=>d.liftEither(i.stream).chain(t=>p.run(i.cryptoService,i.keyPair,t))}}}export{F as AuthenticateWithDeviceDeviceAction};
2
2
  //# sourceMappingURL=AuthenticateWithDeviceDeviceAction.js.map