@ledgerhq/device-trusted-app-kit-ledger-keyring-protocol 0.0.0-transactionInspector-resolutionObj-20250916113438 → 0.0.0-trusted-names-native-transfer-1-20260121120757
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/lib/cjs/api/app-binder/AddToTrustchainDeviceActionTypes.js.map +1 -1
- package/lib/cjs/api/crypto/CryptoService.js.map +1 -1
- package/lib/cjs/api/model/Errors.js +1 -1
- package/lib/cjs/api/model/Errors.js.map +1 -1
- package/lib/cjs/internal/app-binder/LedgerKeyringProtocolBinder.js +1 -1
- package/lib/cjs/internal/app-binder/LedgerKeyringProtocolBinder.js.map +1 -1
- package/lib/cjs/internal/app-binder/command/GetAppNameCommand.js +1 -1
- package/lib/cjs/internal/app-binder/command/GetAppNameCommand.js.map +2 -2
- package/lib/cjs/internal/app-binder/command/GetSeedIdCommand.js +1 -1
- package/lib/cjs/internal/app-binder/command/GetSeedIdCommand.js.map +2 -2
- package/lib/cjs/internal/app-binder/command/GetSeedIdCommand.test.js +3 -3
- package/lib/cjs/internal/app-binder/command/GetSeedIdCommand.test.js.map +3 -3
- package/lib/cjs/internal/app-binder/command/GetVersionCommand.js +1 -1
- package/lib/cjs/internal/app-binder/command/GetVersionCommand.js.map +2 -2
- package/lib/cjs/internal/app-binder/command/InitCommand.js +1 -1
- package/lib/cjs/internal/app-binder/command/InitCommand.js.map +2 -2
- package/lib/cjs/internal/app-binder/command/InitCommand.test.js +1 -1
- package/lib/cjs/internal/app-binder/command/InitCommand.test.js.map +3 -3
- package/lib/cjs/internal/app-binder/command/ParseBlockSignatureCommand.js +1 -1
- package/lib/cjs/internal/app-binder/command/ParseBlockSignatureCommand.js.map +2 -2
- package/lib/cjs/internal/app-binder/command/ParseBlockSignatureCommand.test.js +1 -1
- package/lib/cjs/internal/app-binder/command/ParseBlockSignatureCommand.test.js.map +3 -3
- package/lib/cjs/internal/app-binder/command/ParseStreamBlockCommand.js +1 -1
- package/lib/cjs/internal/app-binder/command/ParseStreamBlockCommand.js.map +2 -2
- package/lib/cjs/internal/app-binder/command/ParseStreamBlockCommand.test.js +1 -1
- package/lib/cjs/internal/app-binder/command/ParseStreamBlockCommand.test.js.map +3 -3
- package/lib/cjs/internal/app-binder/command/ParseStreamBlockHeader.js +1 -1
- package/lib/cjs/internal/app-binder/command/ParseStreamBlockHeader.js.map +2 -2
- package/lib/cjs/internal/app-binder/command/ParseStreamBlockHeader.test.js +1 -1
- package/lib/cjs/internal/app-binder/command/ParseStreamBlockHeader.test.js.map +3 -3
- package/lib/cjs/internal/app-binder/command/SetTrustedMemberCommand.js +1 -1
- package/lib/cjs/internal/app-binder/command/SetTrustedMemberCommand.js.map +2 -2
- package/lib/cjs/internal/app-binder/command/SetTrustedMemberCommand.test.js +1 -1
- package/lib/cjs/internal/app-binder/command/SetTrustedMemberCommand.test.js.map +3 -3
- package/lib/cjs/internal/app-binder/command/SignBlockHeader.js +1 -1
- package/lib/cjs/internal/app-binder/command/SignBlockHeader.js.map +2 -2
- package/lib/cjs/internal/app-binder/command/SignBlockHeader.test.js +1 -1
- package/lib/cjs/internal/app-binder/command/SignBlockHeader.test.js.map +3 -3
- package/lib/cjs/internal/app-binder/command/SignBlockSignatureCommand.js +1 -1
- package/lib/cjs/internal/app-binder/command/SignBlockSignatureCommand.js.map +2 -2
- package/lib/cjs/internal/app-binder/command/SignBlockSignatureCommand.test.js +1 -1
- package/lib/cjs/internal/app-binder/command/SignBlockSignatureCommand.test.js.map +3 -3
- package/lib/cjs/internal/app-binder/command/SignBlockSingleCommand.js +1 -1
- package/lib/cjs/internal/app-binder/command/SignBlockSingleCommand.js.map +2 -2
- package/lib/cjs/internal/app-binder/command/SignBlockSingleCommand.test.js +1 -1
- package/lib/cjs/internal/app-binder/command/SignBlockSingleCommand.test.js.map +3 -3
- package/lib/cjs/internal/app-binder/device-action/AddToTrustchainDeviceAction.js +1 -1
- package/lib/cjs/internal/app-binder/device-action/AddToTrustchainDeviceAction.js.map +1 -1
- package/lib/cjs/internal/app-binder/device-action/AuthenticateWithDeviceDeviceAction.js +1 -1
- package/lib/cjs/internal/app-binder/device-action/AuthenticateWithDeviceDeviceAction.js.map +1 -1
- package/lib/cjs/internal/app-binder/device-action/AuthenticateWithKeypairDeviceAction.js +1 -1
- package/lib/cjs/internal/app-binder/device-action/AuthenticateWithKeypairDeviceAction.js.map +2 -2
- package/lib/cjs/internal/app-binder/device-action/models/AuthenticateWithDeviceDeviceActionTypes.js.map +1 -1
- package/lib/cjs/internal/app-binder/device-action/models/AuthenticateWithKeypairDeviceActionTypes.js +1 -1
- package/lib/cjs/internal/app-binder/device-action/models/AuthenticateWithKeypairDeviceActionTypes.js.map +1 -1
- package/lib/cjs/internal/app-binder/task/ExtractEncryptionKeyTask.js.map +2 -2
- package/lib/cjs/internal/app-binder/task/SignChallengeWithKeypairTask.js +1 -1
- package/lib/cjs/internal/app-binder/task/SignChallengeWithKeypairTask.js.map +2 -2
- package/lib/cjs/internal/app-binder/task/SignChallengeWithKeypairTask.test.js +1 -1
- package/lib/cjs/internal/app-binder/task/SignChallengeWithKeypairTask.test.js.map +2 -2
- package/lib/cjs/internal/use-cases/authentication/AuthenticateUseCase.js +1 -1
- package/lib/cjs/internal/use-cases/authentication/AuthenticateUseCase.js.map +1 -1
- package/lib/cjs/internal/use-cases/authentication/DecryptDataUseCase.js.map +1 -1
- package/lib/cjs/internal/use-cases/authentication/EncryptDataUseCase.js.map +1 -1
- package/lib/cjs/internal/utils/LKRPBlockStream.js +1 -1
- package/lib/cjs/internal/utils/LKRPBlockStream.js.map +2 -2
- package/lib/cjs/internal/utils/LKRPCommand.js +2 -2
- package/lib/cjs/internal/utils/LKRPCommand.js.map +3 -3
- package/lib/cjs/internal/utils/LKRPCommand.test.js +2 -2
- package/lib/cjs/internal/utils/LKRPCommand.test.js.map +3 -3
- package/lib/cjs/package.json +36 -32
- package/lib/esm/api/app-binder/AddToTrustchainDeviceActionTypes.js.map +1 -1
- package/lib/esm/api/crypto/CryptoService.js.map +1 -1
- package/lib/esm/api/model/Errors.js +1 -1
- package/lib/esm/api/model/Errors.js.map +1 -1
- package/lib/esm/internal/app-binder/LedgerKeyringProtocolBinder.js +1 -1
- package/lib/esm/internal/app-binder/LedgerKeyringProtocolBinder.js.map +1 -1
- package/lib/esm/internal/app-binder/command/GetAppNameCommand.js +1 -1
- package/lib/esm/internal/app-binder/command/GetAppNameCommand.js.map +2 -2
- package/lib/esm/internal/app-binder/command/GetSeedIdCommand.js +1 -1
- package/lib/esm/internal/app-binder/command/GetSeedIdCommand.js.map +2 -2
- package/lib/esm/internal/app-binder/command/GetSeedIdCommand.test.js +3 -3
- package/lib/esm/internal/app-binder/command/GetSeedIdCommand.test.js.map +3 -3
- package/lib/esm/internal/app-binder/command/GetVersionCommand.js +1 -1
- package/lib/esm/internal/app-binder/command/GetVersionCommand.js.map +2 -2
- package/lib/esm/internal/app-binder/command/InitCommand.js +1 -1
- package/lib/esm/internal/app-binder/command/InitCommand.js.map +2 -2
- package/lib/esm/internal/app-binder/command/InitCommand.test.js +1 -1
- package/lib/esm/internal/app-binder/command/InitCommand.test.js.map +3 -3
- package/lib/esm/internal/app-binder/command/ParseBlockSignatureCommand.js +1 -1
- package/lib/esm/internal/app-binder/command/ParseBlockSignatureCommand.js.map +2 -2
- package/lib/esm/internal/app-binder/command/ParseBlockSignatureCommand.test.js +1 -1
- package/lib/esm/internal/app-binder/command/ParseBlockSignatureCommand.test.js.map +3 -3
- package/lib/esm/internal/app-binder/command/ParseStreamBlockCommand.js +1 -1
- package/lib/esm/internal/app-binder/command/ParseStreamBlockCommand.js.map +2 -2
- package/lib/esm/internal/app-binder/command/ParseStreamBlockCommand.test.js +1 -1
- package/lib/esm/internal/app-binder/command/ParseStreamBlockCommand.test.js.map +3 -3
- package/lib/esm/internal/app-binder/command/ParseStreamBlockHeader.js +1 -1
- package/lib/esm/internal/app-binder/command/ParseStreamBlockHeader.js.map +2 -2
- package/lib/esm/internal/app-binder/command/ParseStreamBlockHeader.test.js +1 -1
- package/lib/esm/internal/app-binder/command/ParseStreamBlockHeader.test.js.map +3 -3
- package/lib/esm/internal/app-binder/command/SetTrustedMemberCommand.js +1 -1
- package/lib/esm/internal/app-binder/command/SetTrustedMemberCommand.js.map +2 -2
- package/lib/esm/internal/app-binder/command/SetTrustedMemberCommand.test.js +1 -1
- package/lib/esm/internal/app-binder/command/SetTrustedMemberCommand.test.js.map +3 -3
- package/lib/esm/internal/app-binder/command/SignBlockHeader.js +1 -1
- package/lib/esm/internal/app-binder/command/SignBlockHeader.js.map +2 -2
- package/lib/esm/internal/app-binder/command/SignBlockHeader.test.js +1 -1
- package/lib/esm/internal/app-binder/command/SignBlockHeader.test.js.map +3 -3
- package/lib/esm/internal/app-binder/command/SignBlockSignatureCommand.js +1 -1
- package/lib/esm/internal/app-binder/command/SignBlockSignatureCommand.js.map +2 -2
- package/lib/esm/internal/app-binder/command/SignBlockSignatureCommand.test.js +1 -1
- package/lib/esm/internal/app-binder/command/SignBlockSignatureCommand.test.js.map +3 -3
- package/lib/esm/internal/app-binder/command/SignBlockSingleCommand.js +1 -1
- package/lib/esm/internal/app-binder/command/SignBlockSingleCommand.js.map +2 -2
- package/lib/esm/internal/app-binder/command/SignBlockSingleCommand.test.js +1 -1
- package/lib/esm/internal/app-binder/command/SignBlockSingleCommand.test.js.map +3 -3
- package/lib/esm/internal/app-binder/device-action/AddToTrustchainDeviceAction.js +1 -1
- package/lib/esm/internal/app-binder/device-action/AddToTrustchainDeviceAction.js.map +1 -1
- package/lib/esm/internal/app-binder/device-action/AuthenticateWithDeviceDeviceAction.js +1 -1
- package/lib/esm/internal/app-binder/device-action/AuthenticateWithDeviceDeviceAction.js.map +1 -1
- package/lib/esm/internal/app-binder/device-action/AuthenticateWithKeypairDeviceAction.js +1 -1
- package/lib/esm/internal/app-binder/device-action/AuthenticateWithKeypairDeviceAction.js.map +2 -2
- package/lib/esm/internal/app-binder/task/ExtractEncryptionKeyTask.js.map +2 -2
- package/lib/esm/internal/app-binder/task/SignChallengeWithKeypairTask.js +1 -1
- package/lib/esm/internal/app-binder/task/SignChallengeWithKeypairTask.js.map +2 -2
- package/lib/esm/internal/app-binder/task/SignChallengeWithKeypairTask.test.js +1 -1
- package/lib/esm/internal/app-binder/task/SignChallengeWithKeypairTask.test.js.map +2 -2
- package/lib/esm/internal/use-cases/authentication/AuthenticateUseCase.js.map +1 -1
- package/lib/esm/internal/use-cases/authentication/DecryptDataUseCase.js.map +1 -1
- package/lib/esm/internal/use-cases/authentication/EncryptDataUseCase.js.map +1 -1
- package/lib/esm/internal/utils/LKRPBlockStream.js +2 -2
- package/lib/esm/internal/utils/LKRPBlockStream.js.map +2 -2
- package/lib/esm/internal/utils/LKRPCommand.js +2 -2
- package/lib/esm/internal/utils/LKRPCommand.js.map +3 -3
- package/lib/esm/internal/utils/LKRPCommand.test.js +2 -2
- package/lib/esm/internal/utils/LKRPCommand.test.js.map +3 -3
- package/lib/esm/package.json +36 -32
- package/lib/types/api/app-binder/AddToTrustchainDeviceActionTypes.d.ts +1 -1
- package/lib/types/internal/app-binder/LedgerKeyringProtocolBinder.d.ts +2 -2
- package/lib/types/internal/app-binder/command/GetAppNameCommand.d.ts +1 -0
- package/lib/types/internal/app-binder/command/GetAppNameCommand.d.ts.map +1 -1
- package/lib/types/internal/app-binder/command/GetSeedIdCommand.d.ts +1 -0
- package/lib/types/internal/app-binder/command/GetSeedIdCommand.d.ts.map +1 -1
- package/lib/types/internal/app-binder/command/GetVersionCommand.d.ts +1 -0
- package/lib/types/internal/app-binder/command/GetVersionCommand.d.ts.map +1 -1
- package/lib/types/internal/app-binder/command/InitCommand.d.ts +1 -0
- package/lib/types/internal/app-binder/command/InitCommand.d.ts.map +1 -1
- package/lib/types/internal/app-binder/command/ParseBlockSignatureCommand.d.ts +1 -0
- package/lib/types/internal/app-binder/command/ParseBlockSignatureCommand.d.ts.map +1 -1
- package/lib/types/internal/app-binder/command/ParseStreamBlockCommand.d.ts +1 -0
- package/lib/types/internal/app-binder/command/ParseStreamBlockCommand.d.ts.map +1 -1
- package/lib/types/internal/app-binder/command/ParseStreamBlockHeader.d.ts +1 -0
- package/lib/types/internal/app-binder/command/ParseStreamBlockHeader.d.ts.map +1 -1
- package/lib/types/internal/app-binder/command/SetTrustedMemberCommand.d.ts +1 -0
- package/lib/types/internal/app-binder/command/SetTrustedMemberCommand.d.ts.map +1 -1
- package/lib/types/internal/app-binder/command/SignBlockHeader.d.ts +1 -0
- package/lib/types/internal/app-binder/command/SignBlockHeader.d.ts.map +1 -1
- package/lib/types/internal/app-binder/command/SignBlockSignatureCommand.d.ts +1 -0
- package/lib/types/internal/app-binder/command/SignBlockSignatureCommand.d.ts.map +1 -1
- package/lib/types/internal/app-binder/command/SignBlockSingleCommand.d.ts +1 -0
- package/lib/types/internal/app-binder/command/SignBlockSingleCommand.d.ts.map +1 -1
- package/lib/types/internal/app-binder/device-action/AuthenticateWithDeviceDeviceAction.d.ts +1 -1
- package/lib/types/internal/app-binder/device-action/AuthenticateWithKeypairDeviceAction.d.ts +2 -2
- package/lib/types/internal/app-binder/device-action/models/AuthenticateWithDeviceDeviceActionTypes.d.ts +1 -1
- package/lib/types/internal/app-binder/device-action/models/AuthenticateWithKeypairDeviceActionTypes.d.ts +1 -1
- package/lib/types/internal/app-binder/task/ExtractEncryptionKeyTask.d.ts +1 -1
- package/lib/types/internal/app-binder/task/SignChallengeWithKeypairTask.d.ts +2 -2
- package/lib/types/internal/use-cases/authentication/AuthenticateUseCase.d.ts +1 -1
- package/lib/types/internal/utils/LKRPBlockStream.d.ts +1 -1
- package/lib/types/internal/utils/LKRPCommand.d.ts.map +1 -1
- package/lib/types/tsconfig.prod.tsbuildinfo +1 -1
- package/package.json +31 -27
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../../src/internal/app-binder/task/ExtractEncryptionKeyTask.ts"],
|
|
4
|
-
"sourcesContent": ["import { type CryptoService } from \"@api/crypto/CryptoService\";\nimport { type KeyPair } from \"@api/crypto/KeyPair\";\nimport { LKRPUnknownError } from \"@api/model/Errors\";\nimport { type LKRPBlockStream } from \"@internal/utils/LKRPBlockStream\";\n\nexport class ExtractEncryptionKeyTask {\n async run(\n cryptoService: CryptoService,\n
|
|
4
|
+
"sourcesContent": ["import { type CryptoService } from \"@api/crypto/CryptoService\";\nimport { type KeyPair } from \"@api/crypto/KeyPair\";\nimport { LKRPUnknownError } from \"@api/model/Errors\";\nimport { type LKRPBlockStream } from \"@internal/utils/LKRPBlockStream\";\n\nexport class ExtractEncryptionKeyTask {\n async run(\n cryptoService: CryptoService,\n keyPair: KeyPair,\n stream: LKRPBlockStream,\n ) {\n // TODO additional derivations should be supported:\n // https://github.com/LedgerHQ/ledger-live/blob/develop/libs/hw-ledger-key-ring-protocol/src/Device.ts#L216...L226\n // Probably not needed for Ledger Sync\n return (await stream.getPublishedKey(cryptoService, keyPair))\n .map((key) => key.privateKey)\n .toEither(\n new LKRPUnknownError(\n \"There is no encryption key for the current member in the application stream.\",\n ),\n );\n }\n}\n"],
|
|
5
5
|
"mappings": "AAEA,OAAS,oBAAAA,MAAwB,oBAG1B,MAAMC,CAAyB,CACpC,MAAM,IACJC,EACAC,EACAC,EACA,CAIA,OAAQ,MAAMA,EAAO,gBAAgBF,EAAeC,CAAO,GACxD,IAAKE,GAAQA,EAAI,UAAU,EAC3B,SACC,IAAIL,EACF,8EACF,CACF,CACJ,CACF",
|
|
6
|
-
"names": ["LKRPUnknownError", "ExtractEncryptionKeyTask", "cryptoService", "
|
|
6
|
+
"names": ["LKRPUnknownError", "ExtractEncryptionKeyTask", "cryptoService", "keyPair", "stream", "key"]
|
|
7
7
|
}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{bufferToHexaString as o,ByteArrayParser as s,hexaStringToBuffer as g}from"@ledgerhq/device-management-kit";import{EitherAsync as
|
|
1
|
+
import{bufferToHexaString as o,ByteArrayParser as s,hexaStringToBuffer as g}from"@ledgerhq/device-management-kit";import{EitherAsync as h,Left as p,Maybe as c}from"purify-ts";import{HashAlgo as y}from"../../../api/crypto/CryptoService";import{SigFormat as m}from"../../../api/crypto/KeyPair";import{LKRPMissingDataError as i,LKRPUnknownError as u}from"../../../api/model/Errors";import{eitherSeqRecord as x}from"../../utils/eitherSeqRecord";class S{constructor(r,n,a){this.cryptoService=r;this.keyPair=n;this.trustchainId=a}run(r){const n=this.getAttestation(),a=this.getCredential(this.keyPair.getPublicKeyToHex());return h.liftEither(this.getUnsignedChallengeTLV(r.tlv)).map(e=>this.cryptoService.hash(e,y.SHA256)).map(e=>this.keyPair.sign(e,m.DER)).map(e=>o(e,!1)).map(e=>({challenge:r.json,signature:{attestation:n,credential:a,signature:e}})).mapLeft(e=>e instanceof i?e:new u(String(e)))}getAttestation(){const r=new TextEncoder().encode(this.trustchainId),n=Uint8Array.from([2,r.length,...r]);return o(n,!1)}getCredential(r){return{version:0,curveId:33,signAlgorithm:1,publicKey:r}}getUnsignedChallengeTLV(r){const n=new s(g(r)??new Uint8Array),a=new Map(function*(){for(;;){const t=n.extractFieldTLVEncoded();if(!t)break;yield[t.tag,t.value]}}());if(a.size>10)return p(new i("Challenge TLV contains unexpected data"));const e=(t,l)=>c.fromNullable(a.get(t)).toEither(new i(`Missing ${l} field`));return x({payloadType:()=>e(1,"Payload type"),version:()=>e(2,"Version"),challengeExpiry:()=>e(22,"Challenge expiry"),host:()=>e(32,"Host"),protocolVersion:()=>e(96,"Protocol version"),curveId:()=>e(50,"Curve ID"),publicKey:()=>e(51,"Public key"),challengeData:()=>e(18,"Challenge data"),signAlgorithm:()=>e(20,"Sign algorithm"),rpSignatureField:()=>e(21,"RP signature field")}).map(t=>Uint8Array.from([[1,t.payloadType.length,...t.payloadType],[2,t.version.length,...t.version],[18,t.challengeData.length,...t.challengeData],[22,t.challengeExpiry.length,...t.challengeExpiry],[32,t.host.length,...t.host],[96,t.protocolVersion.length,...t.protocolVersion]].flat()))}}export{S as SignChallengeWithKeypairTask};
|
|
2
2
|
//# sourceMappingURL=SignChallengeWithKeypairTask.js.map
|
|
@@ -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
|
|
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": ["bufferToHexaString", "ByteArrayParser", "hexaStringToBuffer", "EitherAsync", "Left", "Maybe", "HashAlgo", "SigFormat", "LKRPMissingDataError", "LKRPUnknownError", "eitherSeqRecord", "SignChallengeWithKeypairTask", "cryptoService", "
|
|
6
|
+
"names": ["bufferToHexaString", "ByteArrayParser", "hexaStringToBuffer", "EitherAsync", "Left", "Maybe", "HashAlgo", "SigFormat", "LKRPMissingDataError", "LKRPUnknownError", "eitherSeqRecord", "SignChallengeWithKeypairTask", "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
|
-
import{hexaStringToBuffer as f}from"@ledgerhq/device-management-kit";import{Curve as o}from"../../../api/crypto/CryptoService";import{NobleCryptoService as b}from"../../../api/crypto/noble/NobleCryptoService";import{LKRPMissingDataError as l}from"../../../api/model/Errors";import{SignChallengeWithKeypairTask as n}from"./SignChallengeWithKeypairTask";const r=new b;describe("SignChallengeWithKeypairTask",()=>{it("should sign a challenge with a
|
|
1
|
+
import{hexaStringToBuffer as f}from"@ledgerhq/device-management-kit";import{Curve as o}from"../../../api/crypto/CryptoService";import{NobleCryptoService as b}from"../../../api/crypto/noble/NobleCryptoService";import{LKRPMissingDataError as l}from"../../../api/model/Errors";import{SignChallengeWithKeypairTask as n}from"./SignChallengeWithKeypairTask";const r=new b;describe("SignChallengeWithKeypairTask",()=>{it("should sign a challenge with a keyPair",async()=>{const{challenge:e,keyPair:a,trustchainId:c}=d(),i=await new n(r,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 n(r,a,c).run(e).run()).ifLeft(t=>expect(t).toBeInstanceOf(l))})});function d({privateKey:e="b21ef366414b1aaba29b9576b7c1a661d663cfd8b4f998257dddbf7dc60d315d",trustchainId:a="00b7588b1916c06765462ebf4506744fe25ed1db819652e2deba721389789cdc37",tlv:c="0101070201001210bb1ea0c98526e1ea2deb7c7537f2989514010115473045022038632e8fa245483f0ecdbaa4ca0d455a03e7510da269d2089fed0d5cfa69d3d6022100c2f938d60bf1c34e96a2d332822a86059d90ec26ea222189cd9731834a5c151216046878ab74202b7472757374636861696e2d6261636b656e642e6170692e6177732e7374672e6c64672d746563682e636f6d320121332103cb7628e7248ddf9c07da54b979f16bf081fb3d173aac0992ad2a44ef6a388ae2600401000000"}={}){return{challenge:{tlv:c,json:{}},keyPair:r.importKeyPair(f(e),o.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
|
|
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,OAAS,sBAAAA,MAA0B,kCAEnC,OAAS,SAAAC,MAAa,4BACtB,OAAS,sBAAAC,MAA0B,uCACnC,OAAS,wBAAAC,MAA4B,oBAGrC,OAAS,gCAAAC,MAAoC,iCAE7C,MAAMC,EAAgB,IAAIH,EAE1B,SAAS,+BAAgC,IAAM,CAC7C,GAAG,yCAA0C,SAAY,CAEvD,KAAM,CAAE,UAAAI,EAAW,QAAAC,EAAS,aAAAC,CAAa,EAAIC,EAAc,EAQrDC,EAAS,MALF,IAAIN,EACfC,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,IAAIL,EACfC,EACAE,EACAC,CACF,EAC0B,IAAIF,CAAS,EAAE,IAAI,GAGtC,OAAQM,GACb,OAAOA,CAAK,EAAE,eAAeT,CAAoB,CACnD,CACF,CAAC,CACH,CAAC,EAED,SAASM,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,cACrBL,EAAmBa,CAAU,EAC7BZ,EAAM,IACR,EACA,aAAAO,CACF,CACF",
|
|
6
|
-
"names": ["hexaStringToBuffer", "Curve", "NobleCryptoService", "LKRPMissingDataError", "SignChallengeWithKeypairTask", "cryptoService", "challenge", "
|
|
6
|
+
"names": ["hexaStringToBuffer", "Curve", "NobleCryptoService", "LKRPMissingDataError", "SignChallengeWithKeypairTask", "cryptoService", "challenge", "keyPair", "trustchainId", "getParameters", "result", "payload", "error", "privateKey", "tlv"]
|
|
7
7
|
}
|
|
@@ -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
|
|
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": "iOAAA,OACE,sBAAAA,MAEK,kCACP,OAAS,UAAAC,EAAQ,cAAAC,MAAkB,YACnC,OAAS,MAAAC,MAAU,OAInB,OAAS,wBAAAC,MAA4B,oBAErC,OAAS,kBAAAC,MAAsB,yCAaxB,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,WAAYC,EAAG,CACb,OAAQC,EAAmB,MAC3B,MAAO,IAAIC,EACT,mEACF,CACF,CAAC,EACD,OAAQ,IAAG,EACb,CACF,CACF,EA3BaN,EAANO,EAAA,CADNC,EAAW,EAGPC,EAAA,EAAAC,EAAOC,EAAe,UAAU,IAFxBX",
|
|
6
6
|
"names": ["DeviceActionStatus", "inject", "injectable", "of", "LKRPMissingDataError", "appBinderTypes", "AuthenticateUseCase", "appBinder", "input", "sessionId", "of", "DeviceActionStatus", "LKRPMissingDataError", "__decorateClass", "injectable", "__decorateParam", "inject", "appBinderTypes"]
|
|
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
|
|
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": "iOAAA,OAAS,mBAAAA,MAAuB,kCAChC,OAAS,UAAAC,EAAQ,cAAAC,MAAkB,YACnC,OAAS,SAAAC,MAAa,YAEtB,OAEE,SAAAC,EACA,kBAAAC,EACA,YAAAC,MACK,4BACP,OAAS,oBAAAC,MAAwB,oBACjC,OAAS,iBAAAC,MAAqB,0BAC9B,OAAS,mBAAAC,MAAuB,kCAGzB,IAAMC,EAAN,KAAyB,CAC9B,YAEUC,EACR,CADQ,mBAAAA,CACP,CAGH,MAAM,QACJC,EACAC,EACqB,CACrB,MAAMC,EAAS,IAAIC,EAAgBF,CAAI,EACvC,GAAIC,EAAO,gBAAgB,IAAM,EAC/B,MAAM,IAAIE,EAAiB,mCAAmC,EAEhE,MAAMC,EAAW,CAACC,EAA+BC,IAC/CC,EAAM,aAAaF,CAAK,EAAE,SACxB,IAAIF,EAAiB,WAAWG,CAAK,QAAQ,CAC/C,EAEF,OAAOE,EAAgB,CACrB,mBAAoB,IAClBJ,EAASH,EAAO,qBAAqB,EAAE,EAAG,sBAAsB,EAClE,GAAI,IAAMG,EAASH,EAAO,qBAAqB,EAAE,EAAG,IAAI,EACxD,IAAK,IAAMG,EAASH,EAAO,qBAAqB,EAAE,EAAG,KAAK,EAC1D,cAAe,IACbG,EACEH,EAAO,qBAAqBA,EAAO,2BAA2B,CAAC,EAC/D,gBACF,CACJ,CAAC,EACE,IAAI,MAAO,CAAE,mBAAAQ,EAAoB,GAAAC,EAAI,IAAAC,EAAK,cAAAC,CAAc,IAAM,CAM7D,MAAMC,EACJ,MALiB,KAAK,cAAc,cACpCd,EACAe,EAAM,IACR,EAEmB,mBAAmBL,CAAkB,EAGlDM,EAAM,KAAK,cAAc,KAC7B,IAAI,WACJF,EAAa,MAAM,CAAC,EACpBG,EAAS,MACX,EAGMC,EAAe,KAAK,cAAc,mBACtCF,EACAG,EAAe,UACjB,EACMC,EAAa,IAAI,WAAW,CAAC,GAAGP,EAAe,GAAGD,CAAG,CAAC,EAE5D,OADkB,MAAMM,EAAa,QAAQP,EAAIS,CAAU,CAE7D,CAAC,EACA,OAAO,CACN,KAAOC,GAAU,CACf,MAAMA,CACR,EACA,MAAQC,GAAcA,CACxB,CAAC,CACL,CACF,EA/DaxB,EAANyB,EAAA,CADNC,EAAW,EAGPC,EAAA,EAAAC,EAAOC,EAAc,aAAa,IAF1B7B",
|
|
6
6
|
"names": ["ByteArrayParser", "inject", "injectable", "Maybe", "Curve", "EncryptionAlgo", "HashAlgo", "LKRPParsingError", "externalTypes", "eitherSeqRecord", "DecryptDataUseCase", "cryptoService", "encryptionKey", "data", "parser", "ByteArrayParser", "LKRPParsingError", "required", "value", "field", "Maybe", "eitherSeqRecord", "ephemeralPublicKey", "iv", "tag", "encryptedData", "sharedSecret", "Curve", "key", "HashAlgo", "symmetricKey", "EncryptionAlgo", "ciphertext", "error", "cleartext", "__decorateClass", "injectable", "__decorateParam", "inject", "externalTypes"]
|
|
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
|
|
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": "iOAAA,OAAS,oBAAAA,MAAwB,kCACjC,OAAS,UAAAC,EAAQ,cAAAC,MAAkB,YAEnC,OAEE,SAAAC,EACA,kBAAAC,EACA,YAAAC,MACK,4BACP,OAAS,qBAAAC,MAAyB,kBAClC,OAAS,iBAAAC,MAAqB,0BAGvB,IAAMC,EAAN,KAAyB,CAC9B,YAEUC,EACR,CADQ,mBAAAA,CACP,CAEH,MAAM,QACJC,EACAC,EACqB,CAErB,MAAMC,EAAa,KAAK,cAAc,cACpCF,EACAG,EAAM,IACR,EACMC,EAAmB,MAAM,KAAK,cAAc,cAAcD,EAAM,IAAI,EACpEE,EAAe,MAAMH,EAAW,mBACpCE,EAAiB,aAAa,CAChC,EAGME,EAAM,KAAK,cAAc,KAC7B,IAAI,WACJD,EAAa,MAAM,CAAC,EACpBE,EAAS,MACX,EAGMC,EAAK,KAAK,cAAc,YAAY,EAAE,EAOtCC,EAAa,MAJE,KAAK,cAAc,mBACtCH,EACAI,EAAe,UACjB,EACsC,QAAQF,EAAIP,CAAI,EAChDU,EAAgBF,EAAW,SAAS,EAAG,CAACG,CAAiB,EACzDC,EAAMJ,EAAW,SAAS,CAACG,CAAiB,EAGlD,OAAO,IAAIE,EAAiB,EACzB,kBAAkB,CAAC,EACnB,gBAAgBV,EAAiB,aAAa,CAAC,EAC/C,gBAAgBI,CAAE,EAClB,gBAAgBK,CAAG,EACnB,gBAAgBF,CAAa,EAC7B,MAAM,CACX,CACF,EAhDab,EAANiB,EAAA,CADNC,EAAW,EAGPC,EAAA,EAAAC,EAAOC,EAAc,aAAa,IAF1BrB",
|
|
6
6
|
"names": ["ByteArrayBuilder", "inject", "injectable", "Curve", "EncryptionAlgo", "HashAlgo", "AES256_BLOCK_SIZE", "externalTypes", "EncryptDataUseCase", "cryptoService", "encryptionKey", "data", "privateKey", "Curve", "ephemeralKeypair", "sharedSecret", "key", "HashAlgo", "iv", "ciphertext", "EncryptionAlgo", "encryptedData", "AES256_BLOCK_SIZE", "tag", "ByteArrayBuilder", "__decorateClass", "injectable", "__decorateParam", "inject", "externalTypes"]
|
|
7
7
|
}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{bufferToHexaString as
|
|
1
|
+
import{bufferToHexaString as l,hexaStringToBuffer as u}from"@ledgerhq/device-management-kit";import{Either as y,Just as c,Maybe as f,MaybeAsync as b,Nothing as n,Right as P}from"purify-ts";import{EncryptionAlgo as g}from"../../api/crypto/CryptoService";import{CommandTags as h}from"../models/Tags";import{LKRPBlock as m}from"./LKRPBlock";import{TLVParser as d}from"./TLVParser";class p{constructor(e,a){this.bytes=e;this.blocks=a?c(P(a)):n}validation=n;blocks=n;path=n;static fromHex(e){return new p(u(e)??new Uint8Array)}static fromData(e,a){const t=[];let r=a??l(crypto.getRandomValues(new Uint8Array(32)),!1);for(const s of e){const i=m.fromData({...s,parent:r});r=i.hash(),t.push(i)}const o=t.reduce((s,i)=>new Uint8Array([...s,...i.toU8A()]),new Uint8Array);return new p(o,t)}toU8A(){return this.bytes}toString(){return l(this.bytes,!1)}parse(){return this.blocks.orDefaultLazy(()=>{const e=new d(this.bytes),a=[];for(;!e.state.isDone;){const r=e.state.offset,o=e.parseBlockData().map(s=>{const i=e.state.offset;return new m(this.bytes.slice(r,i),s)});if(a.push(o),o.isLeft())break}const t=y.sequence(a);return this.blocks=c(t),t})}toHuman(){return this.parse().map(e=>e.map(a=>a.toHuman())).chain(y.sequence).map(e=>e.join(`
|
|
2
2
|
|
|
3
|
-
`))}async validate(e){return this.validation.orDefaultLazy(async()=>this.parse().map(t=>t.map(r=>r.parse().map(({parent:o})=>({parent:o,hash:()=>r.hash()})))).chain(y.sequence).toMaybe().map(async t=>{if(e&&t[0]&&e!==t[0].parent)return!1;for await(const[r,o]of t.entries()){const s=t[r+1];if(s&&o.hash()!==s.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.Derive:return c(e.path);case h.Seed:return c("m/0'");default:return n}})}),this.path}getMemberBlock(e){return this.parse().toMaybe().chain(a=>{for(const t of a){const r=t.parse();if(r.isRight()){const o=r.extract();for(const s of o.commands){const i=s.getPublicKey();if(i.isJust()&&i.extract()===e)return f.of(o)}}}return n})}hasMember(e){return this.getMemberBlock(e).isJust()}async getPublishedKey(e,a){return b.liftMaybe(this.getMemberBlock(a.getPublicKeyToHex()).chain(t=>{for(const r of t.commands){const o=r.getEncryptedPublishedKey();if(o.isJust())return o}return n})).map(async t=>{const r=(await a.deriveSharedSecret(t.ephemeralPublicKey)).slice(1),s=await e.importSymmetricKey(r,g.AES256_GCM).decrypt(t.initializationVector,t.encryptedXpriv);return{privateKey:s.slice(0,32),chainCode:s.slice(32)}})}}export{
|
|
3
|
+
`))}async validate(e){return this.validation.orDefaultLazy(async()=>this.parse().map(t=>t.map(r=>r.parse().map(({parent:o})=>({parent:o,hash:()=>r.hash()})))).chain(y.sequence).toMaybe().map(async t=>{if(e&&t[0]&&e!==t[0].parent)return!1;for await(const[r,o]of t.entries()){const s=t[r+1];if(s&&o.hash()!==s.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.Derive:return c(e.path);case h.Seed:return c("m/0'");default:return n}})}),this.path}getMemberBlock(e){return this.parse().toMaybe().chain(a=>{for(const t of a){const r=t.parse();if(r.isRight()){const o=r.extract();for(const s of o.commands){const i=s.getPublicKey();if(i.isJust()&&i.extract()===e)return f.of(o)}}}return n})}hasMember(e){return this.getMemberBlock(e).isJust()}async getPublishedKey(e,a){return b.liftMaybe(this.getMemberBlock(a.getPublicKeyToHex()).chain(t=>{for(const r of t.commands){const o=r.getEncryptedPublishedKey();if(o.isJust())return o}return n})).map(async t=>{const r=(await a.deriveSharedSecret(t.ephemeralPublicKey)).slice(1),s=await e.importSymmetricKey(r,g.AES256_GCM).decrypt(t.initializationVector,t.encryptedXpriv);return{privateKey:s.slice(0,32),chainCode:s.slice(32)}})}}export{p as 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
|
|
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": ["bufferToHexaString", "hexaStringToBuffer", "Either", "Just", "Maybe", "MaybeAsync", "Nothing", "Right", "EncryptionAlgo", "CommandTags", "LKRPBlock", "TLVParser", "LKRPBlockStream", "bytes", "blocks", "hex", "blocksData", "parentHash", "hash", "blockData", "block", "acc", "parser", "parsed", "start", "data", "end", "streamParentHash", "parent", "index", "nextBlock", "commands", "command", "member", "parsedBlock", "pubkey", "cryptoService", "
|
|
6
|
+
"names": ["bufferToHexaString", "hexaStringToBuffer", "Either", "Just", "Maybe", "MaybeAsync", "Nothing", "Right", "EncryptionAlgo", "CommandTags", "LKRPBlock", "TLVParser", "LKRPBlockStream", "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,3 +1,3 @@
|
|
|
1
|
-
import{bufferToHexaString as
|
|
2
|
-
`))}getPublicKey(){switch(this.bytes[0]){case n.AddMember:case n.PublishKey:return this.parse().toMaybe().chain(e=>{switch(e.type){case n.AddMember:return
|
|
1
|
+
import{bufferToHexaString as y,ByteArrayBuilder as a,hexaStringToBuffer as f}from"@ledgerhq/device-management-kit";import{Just as c,Maybe as p,Nothing as s,Right as b}from"purify-ts";import{CommandTags as n,GeneralTags as r}from"../models/Tags";import{derivationPathAsBytes as u}from"./derivationPath";import{TLVParser as l}from"./TLVParser";class m{constructor(e,t){this.bytes=e;this.data=t?c(b(t)):s}data;static fromHex(e){return new m(f(e)??new Uint8Array)}static fromData(e){const t=new a;switch(e.type){case n.Seed:t.encodeInTLVFromBuffer(r.Bytes,e.topic).encodeInTLVFromUInt16(r.Int,e.protocolVersion).encodeInTLVFromBuffer(r.PublicKey,e.groupKey).encodeInTLVFromBuffer(r.Bytes,e.initializationVector).encodeInTLVFromBuffer(r.Bytes,e.encryptedXpriv).encodeInTLVFromBuffer(r.PublicKey,e.ephemeralPublicKey);break;case n.AddMember:{const o=new ArrayBuffer(4);new DataView(o).setUint32(0,e.permissions),t.encodeInTLVFromAscii(r.String,e.name).encodeInTLVFromBuffer(r.PublicKey,e.publicKey).encodeInTLVFromBuffer(r.Int,new Uint8Array(o));break}case n.PublishKey:t.encodeInTLVFromBuffer(r.Bytes,e.initializationVector).encodeInTLVFromBuffer(r.Bytes,e.encryptedXpriv).encodeInTLVFromBuffer(r.PublicKey,e.recipient).encodeInTLVFromBuffer(r.PublicKey,e.ephemeralPublicKey);break;case n.Derive:t.encodeInTLVFromBuffer(r.Bytes,u(e.path)).encodeInTLVFromBuffer(r.PublicKey,e.groupKey).encodeInTLVFromBuffer(r.Bytes,e.initializationVector).encodeInTLVFromBuffer(r.Bytes,e.encryptedXpriv).encodeInTLVFromBuffer(r.PublicKey,e.ephemeralPublicKey);break}const i=t.build();return new m(new Uint8Array([e.type,i.length,...i]),e)}static bytesFromUnsignedData(e){const t=new a;switch(e.type){case n.AddMember:{const o=new ArrayBuffer(4);new DataView(o).setUint32(0,e.permissions),t.encodeInTLVFromAscii(r.String,e.name).encodeInTLVFromBuffer(r.PublicKey,e.publicKey).encodeInTLVFromBuffer(r.Int,new Uint8Array(o));break}case n.PublishKey:t.encodeInTLVFromBuffer(r.Bytes,new Uint8Array).encodeInTLVFromBuffer(r.Bytes,new Uint8Array).encodeInTLVFromBuffer(r.PublicKey,e.recipient).encodeInTLVFromBuffer(r.PublicKey,new Uint8Array);break;case n.Derive:t.encodeInTLVFromBuffer(r.Bytes,u(e.path));break}const i=t.build();return new Uint8Array([e.type,i.length,...i])}toString(){return y(this.bytes,!1)}toU8A(){return this.bytes}parse(){return this.data.orDefaultLazy(()=>{const e=new l(this.bytes).parseCommandData();return this.data=c(e),e})}toHuman(){return this.parse().map(e=>Object.entries(e).map(([t,i])=>t==="type"?`${n[i]}(0x${i?.toString(16).padStart(2,"0")}):`:` ${t}: ${i instanceof Uint8Array?y(i,!1):i}`).join(`
|
|
2
|
+
`))}getPublicKey(){switch(this.bytes[0]){case n.AddMember:case n.PublishKey:return this.parse().toMaybe().chain(e=>{switch(e.type){case n.AddMember:return c(e.publicKey);case n.PublishKey:return c(e.recipient);default:return s}}).map(e=>y(e,!1));default:return s}}getEncryptedPublishedKey(){switch(this.bytes[0]){case n.Seed:case n.Derive:case n.PublishKey:return this.parse().toMaybe().chain(e=>{switch(e.type){case n.Seed:case n.Derive:case n.PublishKey:return p.of({...e});default:return s}});default:return s}}}export{m as LKRPCommand};
|
|
3
3
|
//# sourceMappingURL=LKRPCommand.js.map
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../src/internal/utils/LKRPCommand.ts"],
|
|
4
|
-
"sourcesContent": ["import {\n bufferToHexaString,\n ByteArrayBuilder,\n hexaStringToBuffer,\n} from \"@ledgerhq/device-management-kit\";\nimport { type Either, Just, Maybe, Nothing, Right } from \"purify-ts\";\n\nimport { type LKRPParsingError } from \"@api/model/Errors\";\nimport {\n type LKRPCommandData,\n type UnsignedCommandData,\n} from \"@internal/models/LKRPCommandTypes\";\nimport { CommandTags, GeneralTags } from \"@internal/models/Tags\";\nimport { type EncryptedPublishedKey } from \"@internal/models/Types\";\n\nimport { derivationPathAsBytes } from \"./derivationPath\";\nimport { TLVParser } from \"./TLVParser\";\n\nexport class LKRPCommand {\n private data: Maybe<Either<LKRPParsingError, LKRPCommandData>>;\n\n constructor(\n private bytes: Uint8Array,\n data?: LKRPCommandData,\n ) {\n this.data = data ? Just(Right(data)) : Nothing;\n }\n\n static fromHex(hex: string): LKRPCommand {\n return new LKRPCommand(hexaStringToBuffer(hex) ?? new Uint8Array());\n }\n\n static fromData(data: LKRPCommandData): LKRPCommand {\n const tlv = new ByteArrayBuilder();\n switch (data.type) {\n case CommandTags.Seed:\n tlv\n .encodeInTLVFromBuffer(GeneralTags.Bytes, data.topic)\n .encodeInTLVFromUInt16(GeneralTags.Int, data.protocolVersion)\n .encodeInTLVFromBuffer(GeneralTags.PublicKey, data.groupKey)\n .encodeInTLVFromBuffer(GeneralTags.Bytes, data.initializationVector)\n .encodeInTLVFromBuffer(GeneralTags.Bytes, data.encryptedXpriv)\n .encodeInTLVFromBuffer(\n GeneralTags.PublicKey,\n data.ephemeralPublicKey,\n );\n break;\n\n case CommandTags.AddMember
|
|
5
|
-
"mappings": "AAAA,OACE,sBAAAA,EACA,oBAAAC,EACA,sBAAAC,MACK,kCACP,OAAsB,QAAAC,EAAM,SAAAC,EAAO,WAAAC,EAAS,SAAAC,MAAa,YAOzD,OAAS,eAAAC,EAAa,eAAAC,MAAmB,wBAGzC,OAAS,yBAAAC,MAA6B,mBACtC,OAAS,aAAAC,MAAiB,cAEnB,MAAMC,CAAY,CAGvB,YACUC,EACRC,EACA,CAFQ,WAAAD,EAGR,KAAK,KAAOC,EAAOV,EAAKG,EAAMO,CAAI,CAAC,EAAIR,CACzC,CAPQ,KASR,OAAO,QAAQS,EAA0B,CACvC,OAAO,IAAIH,EAAYT,EAAmBY,CAAG,GAAK,IAAI,UAAY,CACpE,CAEA,OAAO,SAASD,EAAoC,CAClD,MAAME,EAAM,IAAId,EAChB,OAAQY,EAAK,KAAM,CACjB,KAAKN,EAAY,KACfQ,EACG,sBAAsBP,EAAY,MAAOK,EAAK,KAAK,EACnD,sBAAsBL,EAAY,IAAKK,EAAK,eAAe,EAC3D,sBAAsBL,EAAY,UAAWK,EAAK,QAAQ,EAC1D,sBAAsBL,EAAY,MAAOK,EAAK,oBAAoB,EAClE,sBAAsBL,EAAY,MAAOK,EAAK,cAAc,EAC5D,sBACCL,EAAY,UACZK,EAAK,kBACP,EACF,MAEF,KAAKN,EAAY,
|
|
6
|
-
"names": ["bufferToHexaString", "ByteArrayBuilder", "hexaStringToBuffer", "Just", "Maybe", "Nothing", "Right", "CommandTags", "GeneralTags", "derivationPathAsBytes", "TLVParser", "LKRPCommand", "bytes", "data", "hex", "tlv", "key", "value", "str"]
|
|
4
|
+
"sourcesContent": ["import {\n bufferToHexaString,\n ByteArrayBuilder,\n hexaStringToBuffer,\n} from \"@ledgerhq/device-management-kit\";\nimport { type Either, Just, Maybe, Nothing, Right } from \"purify-ts\";\n\nimport { type LKRPParsingError } from \"@api/model/Errors\";\nimport {\n type LKRPCommandData,\n type UnsignedCommandData,\n} from \"@internal/models/LKRPCommandTypes\";\nimport { CommandTags, GeneralTags } from \"@internal/models/Tags\";\nimport { type EncryptedPublishedKey } from \"@internal/models/Types\";\n\nimport { derivationPathAsBytes } from \"./derivationPath\";\nimport { TLVParser } from \"./TLVParser\";\n\nexport class LKRPCommand {\n private data: Maybe<Either<LKRPParsingError, LKRPCommandData>>;\n\n constructor(\n private bytes: Uint8Array,\n data?: LKRPCommandData,\n ) {\n this.data = data ? Just(Right(data)) : Nothing;\n }\n\n static fromHex(hex: string): LKRPCommand {\n return new LKRPCommand(hexaStringToBuffer(hex) ?? new Uint8Array());\n }\n\n static fromData(data: LKRPCommandData): LKRPCommand {\n const tlv = new ByteArrayBuilder();\n switch (data.type) {\n case CommandTags.Seed:\n tlv\n .encodeInTLVFromBuffer(GeneralTags.Bytes, data.topic)\n .encodeInTLVFromUInt16(GeneralTags.Int, data.protocolVersion)\n .encodeInTLVFromBuffer(GeneralTags.PublicKey, data.groupKey)\n .encodeInTLVFromBuffer(GeneralTags.Bytes, data.initializationVector)\n .encodeInTLVFromBuffer(GeneralTags.Bytes, data.encryptedXpriv)\n .encodeInTLVFromBuffer(\n GeneralTags.PublicKey,\n data.ephemeralPublicKey,\n );\n break;\n\n case CommandTags.AddMember: {\n const permissions = new ArrayBuffer(4);\n new DataView(permissions).setUint32(0, data.permissions);\n tlv\n .encodeInTLVFromAscii(GeneralTags.String, data.name)\n .encodeInTLVFromBuffer(GeneralTags.PublicKey, data.publicKey)\n .encodeInTLVFromBuffer(GeneralTags.Int, new Uint8Array(permissions));\n break;\n }\n\n case CommandTags.PublishKey:\n tlv\n .encodeInTLVFromBuffer(GeneralTags.Bytes, data.initializationVector)\n .encodeInTLVFromBuffer(GeneralTags.Bytes, data.encryptedXpriv)\n .encodeInTLVFromBuffer(GeneralTags.PublicKey, data.recipient)\n .encodeInTLVFromBuffer(\n GeneralTags.PublicKey,\n data.ephemeralPublicKey,\n );\n break;\n\n case CommandTags.Derive:\n tlv\n .encodeInTLVFromBuffer(\n GeneralTags.Bytes,\n derivationPathAsBytes(data.path),\n )\n .encodeInTLVFromBuffer(GeneralTags.PublicKey, data.groupKey)\n .encodeInTLVFromBuffer(GeneralTags.Bytes, data.initializationVector)\n .encodeInTLVFromBuffer(GeneralTags.Bytes, data.encryptedXpriv)\n .encodeInTLVFromBuffer(\n GeneralTags.PublicKey,\n data.ephemeralPublicKey,\n );\n break;\n }\n\n const bytes = tlv.build();\n return new LKRPCommand(\n new Uint8Array([data.type, bytes.length, ...bytes]),\n data,\n );\n }\n\n static bytesFromUnsignedData(data: UnsignedCommandData): Uint8Array {\n const tlv = new ByteArrayBuilder();\n switch (data.type) {\n case CommandTags.AddMember: {\n // NOTE: encode the permission bytes array with DataView because\n // ByteArrayBuilder.encodeInTLVFromUInt32 doesn't seem to work with negative numbers\n // ByteArrayBuilder.add32BitIntToData doesn't seem to work with number > 0x7fffffff\n const permissions = new ArrayBuffer(4);\n new DataView(permissions).setUint32(0, data.permissions);\n tlv\n .encodeInTLVFromAscii(GeneralTags.String, data.name)\n .encodeInTLVFromBuffer(GeneralTags.PublicKey, data.publicKey)\n .encodeInTLVFromBuffer(GeneralTags.Int, new Uint8Array(permissions));\n break;\n }\n\n case CommandTags.PublishKey:\n tlv\n .encodeInTLVFromBuffer(GeneralTags.Bytes, new Uint8Array()) // Empty IV\n .encodeInTLVFromBuffer(GeneralTags.Bytes, new Uint8Array()) // Empty encryptedXpriv\n .encodeInTLVFromBuffer(GeneralTags.PublicKey, data.recipient)\n .encodeInTLVFromBuffer(GeneralTags.PublicKey, new Uint8Array()); // Empty ephemeralPublicKey\n break;\n\n case CommandTags.Derive:\n tlv.encodeInTLVFromBuffer(\n GeneralTags.Bytes,\n derivationPathAsBytes(data.path),\n );\n break;\n }\n\n const bytes = tlv.build();\n return new Uint8Array([data.type, bytes.length, ...bytes]);\n }\n\n toString(): string {\n return bufferToHexaString(this.bytes, false);\n }\n\n toU8A(): Uint8Array {\n return this.bytes;\n }\n\n parse(): Either<LKRPParsingError, LKRPCommandData> {\n return this.data.orDefaultLazy(() => {\n const data = new TLVParser(this.bytes).parseCommandData();\n this.data = Just(data);\n return data;\n });\n }\n\n toHuman(): Either<LKRPParsingError, string> {\n return this.parse().map((data) =>\n Object.entries(data)\n .map(([key, value]) => {\n if (key === \"type\") {\n return `${CommandTags[value as CommandTags]}(0x${value?.toString(16).padStart(2, \"0\")}):`;\n }\n return ` ${key}: ${value instanceof Uint8Array ? bufferToHexaString(value, false) : value}`;\n })\n .join(\"\\n\"),\n );\n }\n\n getPublicKey(): Maybe<string> {\n switch (this.bytes[0]) {\n case CommandTags.AddMember:\n case CommandTags.PublishKey:\n return this.parse()\n .toMaybe()\n .chain((data) => {\n switch (data.type) {\n case CommandTags.AddMember:\n return Just(data.publicKey);\n case CommandTags.PublishKey:\n return Just(data.recipient);\n default:\n return Nothing;\n }\n })\n .map((str) => bufferToHexaString(str, false));\n\n default:\n return Nothing;\n }\n }\n\n getEncryptedPublishedKey(): Maybe<EncryptedPublishedKey> {\n switch (this.bytes[0]) {\n case CommandTags.Seed:\n case CommandTags.Derive:\n case CommandTags.PublishKey:\n return this.parse()\n .toMaybe()\n .chain((data) => {\n switch (data.type) {\n case CommandTags.Seed:\n case CommandTags.Derive:\n case CommandTags.PublishKey:\n return Maybe.of({ ...data });\n default:\n return Nothing;\n }\n });\n default:\n return Nothing;\n }\n }\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["bufferToHexaString", "ByteArrayBuilder", "hexaStringToBuffer", "Just", "Maybe", "Nothing", "Right", "CommandTags", "GeneralTags", "derivationPathAsBytes", "TLVParser", "LKRPCommand", "bytes", "data", "hex", "tlv", "permissions", "key", "value", "str"]
|
|
7
7
|
}
|
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
import{Just as
|
|
2
|
-
`)))}),it("should fail for invalid command bytes format",()=>{const
|
|
1
|
+
import{Just as a,Left as d,Nothing as m,Right as f}from"purify-ts";import{LKRPParsingError as s}from"../../api/model/Errors";import{Permissions as c}from"../../api/model/Permissions";import{CommandTags as r,GeneralTags as e}from"../models/Tags";import{LKRPCommand as n}from"./LKRPCommand";describe("LKRPCommand",()=>{describe("fromData",()=>{it("should encode add member permissions correctly",()=>{const x=Uint8Array.from([2,191,92,13,155,240,244,149,22,40,90,210,3,146,196,196,184,113,20,246,196,140,132,115,6,222,31,231,243,147,78,67,193]),t=n.fromData({type:r.AddMember,name:"OWNER",publicKey:x,permissions:c.OWNER}),o=n.fromData({type:r.AddMember,name:"READER",publicKey:x,permissions:c.CAN_ENCRYPT}),i=n.fromData({type:r.AddMember,name:"DAPP",publicKey:x,permissions:c.OWNER&~c.CAN_ADD_BLOCK});expect(t.toString()).toBe(["11 30","04 05 4f 57 4e 45 52","06 21 02 bf 5c 0d 9b f0 f4 95 16 28 5a d2 03 92 c4 c4 b8 71 14 f6 c4 8c 84 73 06 de 1f e7 f3 93 4e 43 c1","01 04 ff ff ff ff"].join("").replace(/ /g,"")),expect(o.toString()).toBe(["11 31","04 06 52 45 41 44 45 52","06 21 02 bf 5c 0d 9b f0 f4 95 16 28 5a d2 03 92 c4 c4 b8 71 14 f6 c4 8c 84 73 06 de 1f e7 f3 93 4e 43 c1","01 04 00 00 00 01"].join("").replace(/ /g,"")),expect(i.toString()).toBe(["11 2f","04 04 44 41 50 50","06 21 02 bf 5c 0d 9b f0 f4 95 16 28 5a d2 03 92 c4 c4 b8 71 14 f6 c4 8c 84 73 06 de 1f e7 f3 93 4e 43 c1","01 04 ff ff ff fb"].join("").replace(/ /g,""))})}),describe("bytesFromUnsignedData",()=>{it("should encode add member permissions correctly",()=>{const x=Uint8Array.from([2,191,92,13,155,240,244,149,22,40,90,210,3,146,196,196,184,113,20,246,196,140,132,115,6,222,31,231,243,147,78,67,193]),t=n.bytesFromUnsignedData({type:r.AddMember,name:"OWNER",publicKey:x,permissions:c.OWNER}),o=n.bytesFromUnsignedData({type:r.AddMember,name:"READER",publicKey:x,permissions:c.CAN_ENCRYPT}),i=n.bytesFromUnsignedData({type:r.AddMember,name:"DAPP",publicKey:x,permissions:c.OWNER&~c.CAN_ADD_BLOCK});expect(t).toEqual(Uint8Array.from([[17,48],[4,5,79,87,78,69,82],[6,33,2,191,92,13,155,240,244,149,22,40,90,210,3,146,196,196,184,113,20,246,196,140,132,115,6,222,31,231,243,147,78,67,193],[1,4,255,255,255,255]].flat())),expect(o).toEqual(Uint8Array.from([[17,49],[4,6,82,69,65,68,69,82],[6,33,2,191,92,13,155,240,244,149,22,40,90,210,3,146,196,196,184,113,20,246,196,140,132,115,6,222,31,231,243,147,78,67,193],[1,4,0,0,0,1]].flat())),expect(i).toEqual(Uint8Array.from([[17,47],[4,4,68,65,80,80],[6,33,2,191,92,13,155,240,244,149,22,40,90,210,3,146,196,196,184,113,20,246,196,140,132,115,6,222,31,231,243,147,78,67,193],[1,4,255,255,255,251]].flat()))})}),describe("toString",()=>{it("should return the hex of the bytes of the command",()=>{const x="0102030405060708",t=n.fromHex(x);expect(t.toString()).toBe(x)})}),describe("toU8A",()=>{it("should return the bytes of the command",()=>{const x=new Uint8Array([1,2,3,4,5,6,7,8]),t=new n(x);expect(t.toU8A()).toBe(x)})}),describe("parse",()=>{it("should parse the command data correctly",()=>{const x=new Uint8Array([e.Bytes,3,1,2,3,e.Int,2,1,2,e.PublicKey,3,2,4,6,e.Bytes,3,3,5,7,e.Bytes,3,4,8,16,e.PublicKey,3,10,11,12]),t=new n(new Uint8Array([r.Seed,x.length,...x]));expect(t.parse()).toStrictEqual(f({type:r.Seed,topic:new Uint8Array([1,2,3]),protocolVersion:258,groupKey:new Uint8Array([2,4,6]),initializationVector:new Uint8Array([3,5,7]),encryptedXpriv:new Uint8Array([4,8,16]),ephemeralPublicKey:new Uint8Array([10,11,12])}))}),it("should fail with invalid command bytes",()=>{const x=new n(new Uint8Array([r.Seed,1,1]));expect(x.parse()).toStrictEqual(d(new s("Invalid end of TLV, expected length")))})}),describe("getPublicKey",()=>{it("should return the public key for AddMember command",()=>{const x=new Uint8Array([e.String,3,65,66,67,e.PublicKey,3,4,5,6,e.Int,1,1]),t=new n(new Uint8Array([r.AddMember,x.length,...x]));expect(t.getPublicKey()).toStrictEqual(a("040506"))}),it("should return the public key for PublishKey commands",()=>{const x=new Uint8Array([e.Bytes,3,1,2,3,e.Bytes,3,4,5,6,e.PublicKey,3,7,8,9,e.PublicKey,3,10,11,12]),t=new n(new Uint8Array([r.PublishKey,x.length,...x]));expect(t.getPublicKey()).toEqual(a("070809"))}),it("should return undefined for other command types",()=>{const x=new n(new Uint8Array([r.Seed]));expect(x.getPublicKey()).toEqual(m)})}),describe("toHuman",()=>{it("should return a string representation of the command",()=>{const x=new Uint8Array([e.Bytes,3,1,2,3,e.Bytes,3,4,5,6,e.PublicKey,3,7,8,9,e.PublicKey,3,10,11,12]),t=new n(new Uint8Array([r.PublishKey,x.length,...x]));expect(t.toHuman()).toStrictEqual(f(["PublishKey(0x12):"," initializationVector: 010203"," encryptedXpriv: 040506"," recipient: 070809"," ephemeralPublicKey: 0a0b0c"].join(`
|
|
2
|
+
`)))}),it("should fail for invalid command bytes format",()=>{const x=new n(new Uint8Array([r.Seed,1,1]));expect(x.toHuman()).toStrictEqual(d(new s("Invalid end of TLV, expected length")))})})});
|
|
3
3
|
//# sourceMappingURL=LKRPCommand.test.js.map
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../src/internal/utils/LKRPCommand.test.ts"],
|
|
4
|
-
"sourcesContent": ["import { Just, Left, Nothing, Right } from \"purify-ts\";\n\nimport { LKRPParsingError } from \"@api/model/Errors\";\nimport { CommandTags, GeneralTags } from \"@internal/models/Tags\";\n\nimport { LKRPCommand } from \"./LKRPCommand\";\n\ndescribe(\"LKRPCommand\", () => {\n describe(\"toString\", () => {\n it(\"should return the hex of the bytes of the command\", () => {\n // WHEN\n const hex = \"0102030405060708\";\n const command = LKRPCommand.fromHex(hex);\n // THEN\n expect(command.toString()).toBe(hex);\n });\n });\n\n describe(\"toU8A\", () => {\n it(\"should return the bytes of the command\", () => {\n // WHEN\n const bytes = new Uint8Array([1, 2, 3, 4, 5, 6, 7, 8]);\n const command = new LKRPCommand(bytes);\n // THEN\n expect(command.toU8A()).toBe(bytes);\n });\n });\n\n describe(\"parse\", () => {\n it(\"should parse the command data correctly\", () => {\n // GIVEN\n const value = new Uint8Array([\n ...[GeneralTags.Bytes, 3, 0x01, 0x02, 0x03], // Topic\n ...[GeneralTags.Int, 2, 0x01, 0x02], // Protocol Version\n ...[GeneralTags.PublicKey, 3, 0x02, 0x04, 0x06], // Group Key\n ...[GeneralTags.Bytes, 3, 0x03, 0x05, 0x07], // Initialization Vector\n ...[GeneralTags.Bytes, 3, 0x04, 0x08, 0x10], // Encrypted xpriv\n ...[GeneralTags.PublicKey, 3, 0x0a, 0x0b, 0x0c], // Ephemeral Public Key\n ]);\n // WHEN\n const command = new LKRPCommand(\n new Uint8Array([CommandTags.Seed, value.length, ...value]),\n );\n // THEN\n expect(command.parse()).toStrictEqual(\n Right({\n type: CommandTags.Seed,\n topic: new Uint8Array([0x01, 0x02, 0x03]),\n protocolVersion: 258,\n groupKey: new Uint8Array([0x02, 0x04, 0x06]),\n initializationVector: new Uint8Array([0x03, 0x05, 0x07]),\n encryptedXpriv: new Uint8Array([0x04, 0x08, 0x10]),\n ephemeralPublicKey: new Uint8Array([0x0a, 0x0b, 0x0c]),\n }),\n );\n });\n\n it(\"should fail with invalid command bytes\", () => {\n // WHEN\n const command = new LKRPCommand(\n new Uint8Array([CommandTags.Seed, 1, ...[0x01]]),\n );\n // THEN\n expect(command.parse()).toStrictEqual(\n Left(new LKRPParsingError(\"Invalid end of TLV, expected length\")),\n );\n });\n });\n\n describe(\"getPublicKey\", () => {\n it(\"should return the public key for AddMember command\", () => {\n // GIVEN\n const addMemberValue = new Uint8Array([\n ...[GeneralTags.String, 3, 0x41, 0x42, 0x43], // Name \"ABC\"\n ...[GeneralTags.PublicKey, 3, 0x04, 0x05, 0x06], // Public Key\n ...[GeneralTags.Int, 1, 0x01], // Permissions\n ]);\n\n // WHEN\n const addMemberCmd = new LKRPCommand(\n new Uint8Array([\n CommandTags.AddMember,\n addMemberValue.length,\n ...addMemberValue,\n ]),\n );\n\n // THEN\n expect(addMemberCmd.getPublicKey()).toStrictEqual(Just(\"040506\"));\n });\n\n it(\"should return the public key for PublishKey commands\", () => {\n // GIVEN\n const publishKeyValue = new Uint8Array([\n ...[GeneralTags.Bytes, 3, 0x01, 0x02, 0x03], // Initialization Vector\n ...[GeneralTags.Bytes, 3, 0x04, 0x05, 0x06], // Encrypted xpriv\n ...[GeneralTags.PublicKey, 3, 0x07, 0x08, 0x09], // Recipient\n ...[GeneralTags.PublicKey, 3, 0x0a, 0x0b, 0x0c], // Ephemeral Public Key\n ]);\n // WHEN\n const publishKeyCmd = new LKRPCommand(\n new Uint8Array([\n CommandTags.PublishKey,\n publishKeyValue.length,\n ...publishKeyValue,\n ]),\n );\n // THEN\n expect(publishKeyCmd.getPublicKey()).toEqual(Just(\"070809\"));\n });\n\n it(\"should return undefined for other command types\", () => {\n // WHEN\n const command = new LKRPCommand(new Uint8Array([CommandTags.Seed]));\n // THEN\n expect(command.getPublicKey()).toEqual(Nothing);\n });\n });\n\n describe(\"toHuman\", () => {\n it(\"should return a string representation of the command\", () => {\n // GIVEN\n const value = new Uint8Array([\n ...[GeneralTags.Bytes, 3, 0x01, 0x02, 0x03], // Initialization Vector\n ...[GeneralTags.Bytes, 3, 0x04, 0x05, 0x06], // Encrypted xpriv\n ...[GeneralTags.PublicKey, 3, 0x07, 0x08, 0x09], // Recipient\n ...[GeneralTags.PublicKey, 3, 0x0a, 0x0b, 0x0c], // Ephemeral Public Key\n ]);\n // WHEN\n const command = new LKRPCommand(\n new Uint8Array([CommandTags.PublishKey, value.length, ...value]),\n );\n // THEN\n expect(command.toHuman()).toStrictEqual(\n Right(\n [\n `PublishKey(0x12):`,\n ` initializationVector: 010203`,\n ` encryptedXpriv: 040506`,\n ` recipient: 070809`,\n ` ephemeralPublicKey: 0a0b0c`,\n ].join(\"\\n\"),\n ),\n );\n });\n\n it(\"should fail for invalid command bytes format\", () => {\n // WHEN\n const command = new LKRPCommand(\n new Uint8Array([CommandTags.Seed, 1, ...[0x01]]),\n );\n // THEN\n expect(command.toHuman()).toStrictEqual(\n Left(new LKRPParsingError(\"Invalid end of TLV, expected length\")),\n );\n });\n });\n});\n"],
|
|
5
|
-
"mappings": "AAAA,OAAS,QAAAA,EAAM,QAAAC,EAAM,WAAAC,EAAS,SAAAC,MAAa,YAE3C,OAAS,oBAAAC,MAAwB,oBACjC,OAAS,eAAAC,EAAa,eAAAC,MAAmB,wBAEzC,OAAS,eAAAC,MAAmB,gBAE5B,SAAS,cAAe,IAAM,CAC5B,SAAS,WAAY,IAAM,CACzB,GAAG,oDAAqD,IAAM,CAE5D,MAAMC,EAAM,mBACNC,
|
|
6
|
-
"names": ["Just", "Left", "Nothing", "Right", "LKRPParsingError", "CommandTags", "GeneralTags", "LKRPCommand", "hex", "command", "bytes", "value", "addMemberValue", "addMemberCmd", "publishKeyValue", "publishKeyCmd"]
|
|
4
|
+
"sourcesContent": ["import { Just, Left, Nothing, Right } from \"purify-ts\";\n\nimport { LKRPParsingError } from \"@api/model/Errors\";\nimport { Permissions } from \"@api/model/Permissions\";\nimport { CommandTags, GeneralTags } from \"@internal/models/Tags\";\n\nimport { LKRPCommand } from \"./LKRPCommand\";\n\ndescribe(\"LKRPCommand\", () => {\n describe(\"fromData\", () => {\n it(\"should encode add member permissions correctly\", () => {\n // GIVEN\n const publicKey = Uint8Array.from([\n 0x02, 0xbf, 0x5c, 0x0d, 0x9b, 0xf0, 0xf4, 0x95, 0x16, 0x28, 0x5a, 0xd2,\n 0x03, 0x92, 0xc4, 0xc4, 0xb8, 0x71, 0x14, 0xf6, 0xc4, 0x8c, 0x84, 0x73,\n 0x06, 0xde, 0x1f, 0xe7, 0xf3, 0x93, 0x4e, 0x43, 0xc1,\n ]);\n // WHEN\n const addOwner = LKRPCommand.fromData({\n type: CommandTags.AddMember,\n name: \"OWNER\",\n publicKey,\n permissions: Permissions.OWNER,\n });\n const addReader = LKRPCommand.fromData({\n type: CommandTags.AddMember,\n name: \"READER\",\n publicKey,\n permissions: Permissions.CAN_ENCRYPT,\n });\n const dapp = LKRPCommand.fromData({\n type: CommandTags.AddMember,\n name: \"DAPP\",\n publicKey,\n permissions: Permissions.OWNER & ~Permissions.CAN_ADD_BLOCK,\n });\n // THEN\n expect(addOwner.toString()).toBe(\n [\n \"11 30\", // header\n \"04 05 4f 57 4e 45 52\", // name\n \"06 21 02 bf 5c 0d 9b f0 f4 95 16 28 5a d2 03 92 c4 c4 b8 71 14 f6 c4 8c 84 73 06 de 1f e7 f3 93 4e 43 c1\", // public key\n \"01 04 ff ff ff ff\", // permissions (OWNER)\n ]\n .join(\"\")\n .replace(/ /g, \"\"),\n );\n expect(addReader.toString()).toBe(\n [\n \"11 31\", // header\n \"04 06 52 45 41 44 45 52\", // name\n \"06 21 02 bf 5c 0d 9b f0 f4 95 16 28 5a d2 03 92 c4 c4 b8 71 14 f6 c4 8c 84 73 06 de 1f e7 f3 93 4e 43 c1\", // public key\n \"01 04 00 00 00 01\", // permissions (CAN_ENCRYPT)\n ]\n .join(\"\")\n .replace(/ /g, \"\"),\n );\n expect(dapp.toString()).toBe(\n [\n \"11 2f\", // header\n \"04 04 44 41 50 50\", // name\n \"06 21 02 bf 5c 0d 9b f0 f4 95 16 28 5a d2 03 92 c4 c4 b8 71 14 f6 c4 8c 84 73 06 de 1f e7 f3 93 4e 43 c1\", // public key\n \"01 04 ff ff ff fb\", // permissions (OWNER & ~CAN_ADD_BLOCK)\n ]\n .join(\"\")\n .replace(/ /g, \"\"),\n );\n });\n });\n\n describe(\"bytesFromUnsignedData\", () => {\n it(\"should encode add member permissions correctly\", () => {\n // GIVEN\n const publicKey = Uint8Array.from([\n 0x02, 0xbf, 0x5c, 0x0d, 0x9b, 0xf0, 0xf4, 0x95, 0x16, 0x28, 0x5a, 0xd2,\n 0x03, 0x92, 0xc4, 0xc4, 0xb8, 0x71, 0x14, 0xf6, 0xc4, 0x8c, 0x84, 0x73,\n 0x06, 0xde, 0x1f, 0xe7, 0xf3, 0x93, 0x4e, 0x43, 0xc1,\n ]);\n // WHEN\n const addOwner = LKRPCommand.bytesFromUnsignedData({\n type: CommandTags.AddMember,\n name: \"OWNER\",\n publicKey,\n permissions: Permissions.OWNER,\n });\n const addReader = LKRPCommand.bytesFromUnsignedData({\n type: CommandTags.AddMember,\n name: \"READER\",\n publicKey,\n permissions: Permissions.CAN_ENCRYPT,\n });\n const dapp = LKRPCommand.bytesFromUnsignedData({\n type: CommandTags.AddMember,\n name: \"DAPP\",\n publicKey,\n permissions: Permissions.OWNER & ~Permissions.CAN_ADD_BLOCK,\n });\n // THEN\n expect(addOwner).toEqual(\n Uint8Array.from(\n [\n [0x11, 0x30], // header\n [0x04, 0x05, 0x4f, 0x57, 0x4e, 0x45, 0x52], // name\n [\n // public key\n 0x06, 0x21, 0x02, 0xbf, 0x5c, 0x0d, 0x9b, 0xf0, 0xf4, 0x95, 0x16,\n 0x28, 0x5a, 0xd2, 0x03, 0x92, 0xc4, 0xc4, 0xb8, 0x71, 0x14, 0xf6,\n 0xc4, 0x8c, 0x84, 0x73, 0x06, 0xde, 0x1f, 0xe7, 0xf3, 0x93, 0x4e,\n 0x43, 0xc1,\n ],\n [0x01, 0x04, 0xff, 0xff, 0xff, 0xff], // permissions (OWNER)\n ].flat(),\n ),\n );\n expect(addReader).toEqual(\n Uint8Array.from(\n [\n [0x11, 0x31], // header\n [0x04, 0x06, 0x52, 0x45, 0x41, 0x44, 0x45, 0x52], // name\n [\n // public key\n 0x06, 0x21, 0x02, 0xbf, 0x5c, 0x0d, 0x9b, 0xf0, 0xf4, 0x95, 0x16,\n 0x28, 0x5a, 0xd2, 0x03, 0x92, 0xc4, 0xc4, 0xb8, 0x71, 0x14, 0xf6,\n 0xc4, 0x8c, 0x84, 0x73, 0x06, 0xde, 0x1f, 0xe7, 0xf3, 0x93, 0x4e,\n 0x43, 0xc1,\n ],\n [0x01, 0x04, 0x00, 0x00, 0x00, 0x01], // permissions (CAN_ENCRYPT)\n ].flat(),\n ),\n );\n expect(dapp).toEqual(\n Uint8Array.from(\n [\n [0x11, 0x2f], // header\n [0x04, 0x04, 0x44, 0x41, 0x50, 0x50], // name\n [\n // public key\n 0x06, 0x21, 0x02, 0xbf, 0x5c, 0x0d, 0x9b, 0xf0, 0xf4, 0x95, 0x16,\n 0x28, 0x5a, 0xd2, 0x03, 0x92, 0xc4, 0xc4, 0xb8, 0x71, 0x14, 0xf6,\n 0xc4, 0x8c, 0x84, 0x73, 0x06, 0xde, 0x1f, 0xe7, 0xf3, 0x93, 0x4e,\n 0x43, 0xc1,\n ],\n [0x01, 0x04, 0xff, 0xff, 0xff, 0xfb], // permissions (OWNER & ~CAN_ADD_BLOCK)\n ].flat(),\n ),\n );\n });\n });\n\n describe(\"toString\", () => {\n it(\"should return the hex of the bytes of the command\", () => {\n // WHEN\n const hex = \"0102030405060708\";\n const command = LKRPCommand.fromHex(hex);\n // THEN\n expect(command.toString()).toBe(hex);\n });\n });\n\n describe(\"toU8A\", () => {\n it(\"should return the bytes of the command\", () => {\n // WHEN\n const bytes = new Uint8Array([1, 2, 3, 4, 5, 6, 7, 8]);\n const command = new LKRPCommand(bytes);\n // THEN\n expect(command.toU8A()).toBe(bytes);\n });\n });\n\n describe(\"parse\", () => {\n it(\"should parse the command data correctly\", () => {\n // GIVEN\n const value = new Uint8Array([\n ...[GeneralTags.Bytes, 3, 0x01, 0x02, 0x03], // Topic\n ...[GeneralTags.Int, 2, 0x01, 0x02], // Protocol Version\n ...[GeneralTags.PublicKey, 3, 0x02, 0x04, 0x06], // Group Key\n ...[GeneralTags.Bytes, 3, 0x03, 0x05, 0x07], // Initialization Vector\n ...[GeneralTags.Bytes, 3, 0x04, 0x08, 0x10], // Encrypted xpriv\n ...[GeneralTags.PublicKey, 3, 0x0a, 0x0b, 0x0c], // Ephemeral Public Key\n ]);\n // WHEN\n const command = new LKRPCommand(\n new Uint8Array([CommandTags.Seed, value.length, ...value]),\n );\n // THEN\n expect(command.parse()).toStrictEqual(\n Right({\n type: CommandTags.Seed,\n topic: new Uint8Array([0x01, 0x02, 0x03]),\n protocolVersion: 258,\n groupKey: new Uint8Array([0x02, 0x04, 0x06]),\n initializationVector: new Uint8Array([0x03, 0x05, 0x07]),\n encryptedXpriv: new Uint8Array([0x04, 0x08, 0x10]),\n ephemeralPublicKey: new Uint8Array([0x0a, 0x0b, 0x0c]),\n }),\n );\n });\n\n it(\"should fail with invalid command bytes\", () => {\n // WHEN\n const command = new LKRPCommand(\n new Uint8Array([CommandTags.Seed, 1, ...[0x01]]),\n );\n // THEN\n expect(command.parse()).toStrictEqual(\n Left(new LKRPParsingError(\"Invalid end of TLV, expected length\")),\n );\n });\n });\n\n describe(\"getPublicKey\", () => {\n it(\"should return the public key for AddMember command\", () => {\n // GIVEN\n const addMemberValue = new Uint8Array([\n ...[GeneralTags.String, 3, 0x41, 0x42, 0x43], // Name \"ABC\"\n ...[GeneralTags.PublicKey, 3, 0x04, 0x05, 0x06], // Public Key\n ...[GeneralTags.Int, 1, 0x01], // Permissions\n ]);\n\n // WHEN\n const addMemberCmd = new LKRPCommand(\n new Uint8Array([\n CommandTags.AddMember,\n addMemberValue.length,\n ...addMemberValue,\n ]),\n );\n\n // THEN\n expect(addMemberCmd.getPublicKey()).toStrictEqual(Just(\"040506\"));\n });\n\n it(\"should return the public key for PublishKey commands\", () => {\n // GIVEN\n const publishKeyValue = new Uint8Array([\n ...[GeneralTags.Bytes, 3, 0x01, 0x02, 0x03], // Initialization Vector\n ...[GeneralTags.Bytes, 3, 0x04, 0x05, 0x06], // Encrypted xpriv\n ...[GeneralTags.PublicKey, 3, 0x07, 0x08, 0x09], // Recipient\n ...[GeneralTags.PublicKey, 3, 0x0a, 0x0b, 0x0c], // Ephemeral Public Key\n ]);\n // WHEN\n const publishKeyCmd = new LKRPCommand(\n new Uint8Array([\n CommandTags.PublishKey,\n publishKeyValue.length,\n ...publishKeyValue,\n ]),\n );\n // THEN\n expect(publishKeyCmd.getPublicKey()).toEqual(Just(\"070809\"));\n });\n\n it(\"should return undefined for other command types\", () => {\n // WHEN\n const command = new LKRPCommand(new Uint8Array([CommandTags.Seed]));\n // THEN\n expect(command.getPublicKey()).toEqual(Nothing);\n });\n });\n\n describe(\"toHuman\", () => {\n it(\"should return a string representation of the command\", () => {\n // GIVEN\n const value = new Uint8Array([\n ...[GeneralTags.Bytes, 3, 0x01, 0x02, 0x03], // Initialization Vector\n ...[GeneralTags.Bytes, 3, 0x04, 0x05, 0x06], // Encrypted xpriv\n ...[GeneralTags.PublicKey, 3, 0x07, 0x08, 0x09], // Recipient\n ...[GeneralTags.PublicKey, 3, 0x0a, 0x0b, 0x0c], // Ephemeral Public Key\n ]);\n // WHEN\n const command = new LKRPCommand(\n new Uint8Array([CommandTags.PublishKey, value.length, ...value]),\n );\n // THEN\n expect(command.toHuman()).toStrictEqual(\n Right(\n [\n `PublishKey(0x12):`,\n ` initializationVector: 010203`,\n ` encryptedXpriv: 040506`,\n ` recipient: 070809`,\n ` ephemeralPublicKey: 0a0b0c`,\n ].join(\"\\n\"),\n ),\n );\n });\n\n it(\"should fail for invalid command bytes format\", () => {\n // WHEN\n const command = new LKRPCommand(\n new Uint8Array([CommandTags.Seed, 1, ...[0x01]]),\n );\n // THEN\n expect(command.toHuman()).toStrictEqual(\n Left(new LKRPParsingError(\"Invalid end of TLV, expected length\")),\n );\n });\n });\n});\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["Just", "Left", "Nothing", "Right", "LKRPParsingError", "Permissions", "CommandTags", "GeneralTags", "LKRPCommand", "publicKey", "addOwner", "addReader", "dapp", "hex", "command", "bytes", "value", "addMemberValue", "addMemberCmd", "publishKeyValue", "publishKeyCmd"]
|
|
7
7
|
}
|
package/lib/esm/package.json
CHANGED
|
@@ -1,56 +1,60 @@
|
|
|
1
1
|
{
|
|
2
|
-
"
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
2
|
+
"dependencies": {
|
|
3
|
+
"@ledgerhq/device-management-kit": "workspace:*",
|
|
4
|
+
"@ledgerhq/signer-utils": "workspace:*",
|
|
5
|
+
"@noble/ciphers": "^1.3.0",
|
|
6
|
+
"@noble/curves": "^1.9.7",
|
|
7
|
+
"@noble/hashes": "^1.8.0",
|
|
8
|
+
"inversify": "catalog:",
|
|
9
|
+
"purify-ts": "catalog:",
|
|
10
|
+
"reflect-metadata": "catalog:",
|
|
11
|
+
"rxjs": "catalog:",
|
|
12
|
+
"xstate": "catalog:"
|
|
13
|
+
},
|
|
14
|
+
"devDependencies": {
|
|
15
|
+
"@ledgerhq/eslint-config-dsdk": "workspace:*",
|
|
16
|
+
"@ledgerhq/ldmk-tool": "workspace:*",
|
|
17
|
+
"@ledgerhq/prettier-config-dsdk": "workspace:*",
|
|
18
|
+
"@ledgerhq/tsconfig-dsdk": "workspace:*",
|
|
19
|
+
"@ledgerhq/vitest-config-dmk": "workspace:*"
|
|
20
|
+
},
|
|
6
21
|
"exports": {
|
|
7
22
|
".": {
|
|
8
|
-
"types": "./lib/types/index.d.ts",
|
|
9
23
|
"import": "./lib/esm/index.js",
|
|
10
|
-
"require": "./lib/cjs/index.js"
|
|
24
|
+
"require": "./lib/cjs/index.js",
|
|
25
|
+
"types": "./lib/types/index.d.ts"
|
|
11
26
|
},
|
|
12
27
|
"./*": {
|
|
13
|
-
"types": "./lib/types/*",
|
|
14
28
|
"import": "./lib/esm/*",
|
|
15
|
-
"require": "./lib/cjs/*"
|
|
29
|
+
"require": "./lib/cjs/*",
|
|
30
|
+
"types": "./lib/types/*"
|
|
16
31
|
}
|
|
17
32
|
},
|
|
18
33
|
"files": [
|
|
19
34
|
"./lib"
|
|
20
35
|
],
|
|
36
|
+
"license": "Apache-2.0",
|
|
37
|
+
"name": "@ledgerhq/device-trusted-app-kit-ledger-keyring-protocol",
|
|
38
|
+
"private": false,
|
|
39
|
+
"repository": {
|
|
40
|
+
"type": "git",
|
|
41
|
+
"url": "https://github.com/LedgerHQ/device-sdk-ts.git"
|
|
42
|
+
},
|
|
21
43
|
"scripts": {
|
|
22
|
-
"prebuild": "rimraf lib",
|
|
23
44
|
"build": "pnpm ldmk-tool build --entryPoints src/index.ts,src/**/*.ts --tsconfig tsconfig.prod.json",
|
|
24
45
|
"dev": "concurrently \"pnpm watch:builds\" \"pnpm watch:types\"",
|
|
25
|
-
"watch:builds": "pnpm ldmk-tool watch --entryPoints src/index.ts,src/**/*.ts --tsconfig tsconfig.prod.json",
|
|
26
|
-
"watch:types": "concurrently \"tsc --watch -p tsconfig.prod.json\" \"tsc-alias --watch -p tsconfig.prod.json\"",
|
|
27
46
|
"lint": "eslint",
|
|
28
47
|
"lint:fix": "pnpm lint --fix",
|
|
29
48
|
"postpack": "find . -name '*.tgz' -exec cp {} ../../dist/ \\; ",
|
|
49
|
+
"prebuild": "rimraf lib",
|
|
30
50
|
"prettier": "prettier . --check",
|
|
31
51
|
"prettier:fix": "prettier . --write",
|
|
32
|
-
"typecheck": "tsc --noEmit",
|
|
33
52
|
"test": "vitest run --passWithNoTests",
|
|
53
|
+
"test:coverage": "vitest run --coverage --passWithNoTests",
|
|
34
54
|
"test:watch": "vitest --passWithNoTests",
|
|
35
|
-
"
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
"@ledgerhq/device-management-kit": "workspace:*",
|
|
39
|
-
"@ledgerhq/signer-utils": "workspace:*",
|
|
40
|
-
"@noble/ciphers": "^1.3.0",
|
|
41
|
-
"@noble/curves": "^1.9.7",
|
|
42
|
-
"@noble/hashes": "^1.8.0",
|
|
43
|
-
"inversify": "catalog:",
|
|
44
|
-
"purify-ts": "catalog:",
|
|
45
|
-
"reflect-metadata": "catalog:",
|
|
46
|
-
"rxjs": "catalog:",
|
|
47
|
-
"xstate": "catalog:"
|
|
55
|
+
"typecheck": "tsc --noEmit",
|
|
56
|
+
"watch:builds": "pnpm ldmk-tool watch --entryPoints src/index.ts,src/**/*.ts --tsconfig tsconfig.prod.json",
|
|
57
|
+
"watch:types": "concurrently \"tsc --watch -p tsconfig.prod.json\" \"tsc-alias --watch -p tsconfig.prod.json\""
|
|
48
58
|
},
|
|
49
|
-
"
|
|
50
|
-
"@ledgerhq/eslint-config-dsdk": "workspace:*",
|
|
51
|
-
"@ledgerhq/ldmk-tool": "workspace:*",
|
|
52
|
-
"@ledgerhq/prettier-config-dsdk": "workspace:*",
|
|
53
|
-
"@ledgerhq/tsconfig-dsdk": "workspace:*",
|
|
54
|
-
"@ledgerhq/vitest-config-dmk": "workspace:*"
|
|
55
|
-
}
|
|
59
|
+
"version": "0.0.0-trusted-names-native-transfer-1-20260121120757"
|
|
56
60
|
}
|
|
@@ -12,7 +12,7 @@ export type AddToTrustchainDAOutput = undefined;
|
|
|
12
12
|
export type AddToTrustchainDAInput = Either<LKRPMissingDataError, {
|
|
13
13
|
readonly lkrpDataSource: LKRPDataSource;
|
|
14
14
|
readonly cryptoService: CryptoService;
|
|
15
|
-
readonly
|
|
15
|
+
readonly keyPair: KeyPair;
|
|
16
16
|
readonly jwt: JWT;
|
|
17
17
|
readonly appId: number;
|
|
18
18
|
readonly trustchain: Trustchain;
|
|
@@ -12,11 +12,11 @@ export declare class LedgerKeyringProtocolBinder {
|
|
|
12
12
|
private readonly lkrpDataSource;
|
|
13
13
|
constructor(dmk: DeviceManagementKit, applicationId: number, cryptoService: CryptoService, lkrpDataSource: LKRPDataSource);
|
|
14
14
|
authenticateWithKeypair(args: {
|
|
15
|
-
|
|
15
|
+
keyPair: KeyPair;
|
|
16
16
|
trustchainId: string;
|
|
17
17
|
}): AuthenticateDAReturnType;
|
|
18
18
|
authenticateWithDevice(args: {
|
|
19
|
-
|
|
19
|
+
keyPair: KeyPair;
|
|
20
20
|
clientName: string;
|
|
21
21
|
permissions: Permissions;
|
|
22
22
|
sessionId: DeviceSessionId;
|
|
@@ -5,6 +5,7 @@ export type GetAppNameCommandResponse = {
|
|
|
5
5
|
};
|
|
6
6
|
export type GetAppNameCommandArgs = undefined;
|
|
7
7
|
export declare class GetAppNameCommand implements Command<GetAppNameCommandResponse, GetAppNameCommandArgs, LedgerKeyringProtocolErrorCodes> {
|
|
8
|
+
readonly name = "getAppName";
|
|
8
9
|
private readonly errorHelper;
|
|
9
10
|
getApdu(): Apdu;
|
|
10
11
|
parseResponse(apduResponse: ApduResponse): CommandResult<GetAppNameCommandResponse, LedgerKeyringProtocolErrorCodes>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"GetAppNameCommand.d.ts","sourceRoot":"","sources":["../../../../../src/internal/app-binder/command/GetAppNameCommand.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,IAAI,EAIT,KAAK,YAAY,EACjB,KAAK,OAAO,EACZ,KAAK,aAAa,EAGnB,MAAM,iCAAiC,CAAC;AAIzC,OAAO,EAEL,KAAK,+BAA+B,EAErC,MAAM,qCAAqC,CAAC;AAE7C,MAAM,MAAM,yBAAyB,GAAG;IACtC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;CACvB,CAAC;AAEF,MAAM,MAAM,qBAAqB,GAAG,SAAS,CAAC;AAE9C,qBAAa,iBACX,YACE,OAAO,CACL,yBAAyB,EACzB,qBAAqB,EACrB,+BAA+B,CAChC;IAEH,OAAO,CAAC,QAAQ,CAAC,WAAW,CAG6B;IAEzD,OAAO,IAAI,IAAI;IAYf,aAAa,CACX,YAAY,EAAE,YAAY,GACzB,aAAa,CAAC,yBAAyB,EAAE,+BAA+B,CAAC;CAmB7E"}
|
|
1
|
+
{"version":3,"file":"GetAppNameCommand.d.ts","sourceRoot":"","sources":["../../../../../src/internal/app-binder/command/GetAppNameCommand.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,IAAI,EAIT,KAAK,YAAY,EACjB,KAAK,OAAO,EACZ,KAAK,aAAa,EAGnB,MAAM,iCAAiC,CAAC;AAIzC,OAAO,EAEL,KAAK,+BAA+B,EAErC,MAAM,qCAAqC,CAAC;AAE7C,MAAM,MAAM,yBAAyB,GAAG;IACtC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;CACvB,CAAC;AAEF,MAAM,MAAM,qBAAqB,GAAG,SAAS,CAAC;AAE9C,qBAAa,iBACX,YACE,OAAO,CACL,yBAAyB,EACzB,qBAAqB,EACrB,+BAA+B,CAChC;IAEH,QAAQ,CAAC,IAAI,gBAAgB;IAC7B,OAAO,CAAC,QAAQ,CAAC,WAAW,CAG6B;IAEzD,OAAO,IAAI,IAAI;IAYf,aAAa,CACX,YAAY,EAAE,YAAY,GACzB,aAAa,CAAC,yBAAyB,EAAE,+BAA+B,CAAC;CAmB7E"}
|
|
@@ -15,6 +15,7 @@ export type GetSeedIdCommandArgs = {
|
|
|
15
15
|
};
|
|
16
16
|
export declare class GetSeedIdCommand implements Command<GetSeedIdCommandResponse, GetSeedIdCommandArgs, LedgerKeyringProtocolErrorCodes> {
|
|
17
17
|
private readonly args;
|
|
18
|
+
readonly name = "getSeedId";
|
|
18
19
|
private readonly errorHelper;
|
|
19
20
|
constructor(args: GetSeedIdCommandArgs);
|
|
20
21
|
getApdu(): Apdu;
|