@ledgerhq/revault-sdk 0.21.8 → 0.21.10
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/bake.cjs +9 -9
- package/lib/bake.d.cts +2 -2
- package/lib/bake.d.ts +2 -2
- package/lib/bake.js +1 -1
- package/lib/{chunk-IHGVWOD7.js → chunk-AXI72NFY.js} +8 -4
- package/lib/chunk-AXI72NFY.js.map +1 -0
- package/lib/{chunk-I6B5U4JR.cjs → chunk-LH4QQXUH.cjs} +9 -5
- package/lib/chunk-LH4QQXUH.cjs.map +1 -0
- package/lib/engine.cjs +43 -24
- package/lib/engine.cjs.map +1 -1
- package/lib/engine.d.cts +4 -4
- package/lib/engine.d.ts +4 -4
- package/lib/engine.js +41 -22
- package/lib/engine.js.map +1 -1
- package/lib/index.d.cts +1 -1
- package/lib/index.d.ts +1 -1
- package/lib/onboarding.d.cts +2 -2
- package/lib/onboarding.d.ts +2 -2
- package/lib/{types-Ct-F-l82.d.cts → types-CpGEbAxh.d.cts} +4 -1
- package/lib/{types-Ct-F-l82.d.ts → types-CpGEbAxh.d.ts} +4 -1
- package/lib/{types-pUN38HdE.d.cts → types-DOi2cwia.d.cts} +11 -5
- package/lib/{types-Dkr4g0qP.d.ts → types-StrV0mJs.d.ts} +11 -5
- package/lib/types.d.cts +1 -1
- package/lib/types.d.ts +1 -1
- package/package.json +14 -14
- package/lib/chunk-I6B5U4JR.cjs.map +0 -1
- package/lib/chunk-IHGVWOD7.js.map +0 -1
package/lib/engine.js
CHANGED
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
import {
|
|
2
|
+
buildTrpcContext,
|
|
2
3
|
fetchAll,
|
|
3
4
|
fetchAllCursor
|
|
4
|
-
} from "./chunk-
|
|
5
|
+
} from "./chunk-AXI72NFY.js";
|
|
5
6
|
import {
|
|
6
7
|
APPID_VAULT_ADMINISTRATOR,
|
|
7
8
|
PAGINATED_STATUS,
|
|
@@ -358,12 +359,15 @@ var createClient = (options) => {
|
|
|
358
359
|
httpLink({
|
|
359
360
|
url: `${options.baseUrl}/trpc`,
|
|
360
361
|
transformer: superjson,
|
|
361
|
-
headers() {
|
|
362
|
+
headers(opts) {
|
|
363
|
+
const contextHeaders = opts.op.context?.headers || {};
|
|
362
364
|
return {
|
|
363
365
|
...options.debugAuthToken ? { "x-revault-debug-auth-token": options.debugAuthToken } : {},
|
|
364
366
|
...options.rootAuthToken ? { "x-revault-root-auth-token": options.rootAuthToken } : {},
|
|
365
367
|
...options.psdAuth ? { Authorization: `PsdAuth ${options.psdAuth}` } : {},
|
|
366
|
-
...options.apiAccessToken ? { Authorization: `Bearer ${options.apiAccessToken}` } : {}
|
|
368
|
+
...options.apiAccessToken ? { Authorization: `Bearer ${options.apiAccessToken}` } : {},
|
|
369
|
+
// Merge in any headers passed via context
|
|
370
|
+
...contextHeaders
|
|
367
371
|
};
|
|
368
372
|
}
|
|
369
373
|
})
|
|
@@ -631,11 +635,14 @@ function createEngine(options, logger) {
|
|
|
631
635
|
return {
|
|
632
636
|
login: async function(opts) {
|
|
633
637
|
const { pubKey } = await device.getU2FPubKey();
|
|
634
|
-
const challenge = await client2.auth.psd.generateChallenge.mutate(
|
|
635
|
-
|
|
636
|
-
|
|
637
|
-
|
|
638
|
-
|
|
638
|
+
const challenge = await client2.auth.psd.generateChallenge.mutate(
|
|
639
|
+
{
|
|
640
|
+
pubKey,
|
|
641
|
+
workspaceName: __workspaceName
|
|
642
|
+
},
|
|
643
|
+
buildTrpcContext({ correlationId: opts?.correlationId })
|
|
644
|
+
);
|
|
645
|
+
await opts?.onScreenDisplayed?.();
|
|
639
646
|
const authentication = await device.authenticate({
|
|
640
647
|
challenge,
|
|
641
648
|
workspaceName: __workspaceName
|
|
@@ -646,7 +653,10 @@ function createEngine(options, logger) {
|
|
|
646
653
|
authentication,
|
|
647
654
|
validityDurationSecs: opts?.validityDurationSecs
|
|
648
655
|
};
|
|
649
|
-
const { token } = await client2.auth.psd.authenticate.mutate(
|
|
656
|
+
const { token } = await client2.auth.psd.authenticate.mutate(
|
|
657
|
+
{ ...authPayload },
|
|
658
|
+
buildTrpcContext({ correlationId: opts?.correlationId })
|
|
659
|
+
);
|
|
650
660
|
const withPsdAuth = {
|
|
651
661
|
__psdToken: token
|
|
652
662
|
};
|
|
@@ -683,12 +693,15 @@ function createEngine(options, logger) {
|
|
|
683
693
|
(engine2) => {
|
|
684
694
|
const { client: client2, __workspaceName } = engine2;
|
|
685
695
|
return {
|
|
686
|
-
login: async function(credentials) {
|
|
687
|
-
const res = await client2.auth.authenticate.mutate(
|
|
688
|
-
|
|
689
|
-
|
|
690
|
-
|
|
691
|
-
|
|
696
|
+
login: async function(credentials, opts) {
|
|
697
|
+
const res = await client2.auth.authenticate.mutate(
|
|
698
|
+
{
|
|
699
|
+
apiKeyId: credentials.apiKeyId,
|
|
700
|
+
apiKeySecret: credentials.apiKeySecret,
|
|
701
|
+
workspace: __workspaceName
|
|
702
|
+
},
|
|
703
|
+
buildTrpcContext({ correlationId: opts?.correlationId })
|
|
704
|
+
);
|
|
692
705
|
const withApiAuth = {
|
|
693
706
|
__apiAuth: res
|
|
694
707
|
};
|
|
@@ -718,7 +731,7 @@ function createEngine(options, logger) {
|
|
|
718
731
|
handshakeAttestation: challenge.handshakeAttestation,
|
|
719
732
|
partitionId: challenge.partitionId
|
|
720
733
|
});
|
|
721
|
-
params?.onScreenDisplayed?.();
|
|
734
|
+
await params?.onScreenDisplayed?.();
|
|
722
735
|
const signature = await device.validateVaultOperation({
|
|
723
736
|
actions: challenge.wActions
|
|
724
737
|
});
|
|
@@ -729,14 +742,20 @@ function createEngine(options, logger) {
|
|
|
729
742
|
const { challenge } = await client2.requests.getChallenge.query({ id: request.id });
|
|
730
743
|
invariant2(challenge.challengeType === "PSD", "Challenge type must be PSD");
|
|
731
744
|
const signature = await approveChallenge(challenge, params);
|
|
732
|
-
return client2.requests.approve.mutate(
|
|
733
|
-
|
|
734
|
-
|
|
735
|
-
|
|
745
|
+
return client2.requests.approve.mutate(
|
|
746
|
+
{
|
|
747
|
+
id: request.id,
|
|
748
|
+
data: { challengeType: "PSD", signature }
|
|
749
|
+
},
|
|
750
|
+
buildTrpcContext(params)
|
|
751
|
+
);
|
|
736
752
|
},
|
|
737
753
|
approveChallenge,
|
|
738
|
-
reject: (request) => {
|
|
739
|
-
return client2.requests.reject.mutate(
|
|
754
|
+
reject: (request, opts) => {
|
|
755
|
+
return client2.requests.reject.mutate(
|
|
756
|
+
{ id: request.id, data: null },
|
|
757
|
+
buildTrpcContext(opts)
|
|
758
|
+
);
|
|
740
759
|
}
|
|
741
760
|
};
|
|
742
761
|
});
|
package/lib/engine.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/engine/index.ts","../src/device/real-device.ts","../src/trpc.ts"],"sourcesContent":["import type {\n ApiChallenge,\n ClaimedRole,\n OnboardingSeedChallenge,\n PsdChallenge,\n UserRegistrationChallenge,\n UserRegistrationChallengeResponse,\n UserRegistrationDeviceData,\n UserRegistrationResponse,\n VaultRequestResponse,\n WrappingKeyResponse,\n} from \"@ledgerhq/revault-api\";\nimport invariant from \"invariant\";\n\nimport { createApiDevice, type Device } from \"@/device\";\nimport { createRealDevice } from \"@/device/real-device\";\nimport type { Logger } from \"@/logger\";\nimport { createClient, type TRPCClientOptions } from \"@/trpc\";\n\nimport type {\n ApproveRequestParams,\n DecorateWithApiUserAndWorkspaceUnauthenticated,\n DecorateWithDevice,\n DecorateWithDeviceAndOnboarding,\n DecorateWithDeviceAndWorkspaceUnauthenticated,\n DecorateWithWorkspaceApiAuthenticated,\n DecorateWithWorkspacePsdAuthenticated,\n DecorateWithWorkspaceUnauthenticated,\n Engine,\n EngineBase,\n EngineOptions,\n RegisterOnboardingDeviceParams,\n WithApiAuth,\n WithApiUser,\n WithDevice,\n WithOnboarding,\n WithPsdAuth,\n WithWorkspace,\n} from \"./types\";\n\nexport { fetchAll, fetchAllCursor } from \"../utils\";\nexport type * from \"./types\";\n\nasync function genericRegister<T>({\n device,\n name,\n role,\n getChallenge,\n submitChallenge,\n}: {\n device: Device;\n name: string;\n role: \"ADMIN\" | \"SHARED_OWNER\" | \"OPERATOR\";\n getChallenge: (p: {\n pubKey: string;\n deviceData: UserRegistrationDeviceData;\n }) => Promise<UserRegistrationChallenge>;\n submitChallenge: (p: {\n pubKey: string;\n challengeResponse: UserRegistrationChallengeResponse;\n }) => Promise<T>;\n}): Promise<T> {\n const [attestation, u2fPubKey, confidentialityKey] = await Promise.all([\n device.getAttestation(),\n device.getU2FPubKey(),\n device.getConfidentialityPubKey(),\n ]);\n const ephemeralPubKey = await device.initPairingHandshake();\n const deviceData: UserRegistrationDeviceData = {\n name,\n pubKey: u2fPubKey.pubKey,\n psdModel: \"STAX\",\n confidentialityKey: confidentialityKey.pubKey,\n psdEphemeralKey: ephemeralPubKey.pubKey,\n psdEphemeralKeyAttestation: {\n ...attestation.attestation,\n signature: ephemeralPubKey.signature,\n },\n };\n const challenge = await getChallenge({ pubKey: u2fPubKey.pubKey, deviceData });\n const pairingPayload = await device.finalizePairingHandshake({\n handshake: challenge.handshake,\n partitionId: challenge.ciphertext,\n handshakeAttestation: challenge.handshakeAttestation,\n });\n const register = await device.register({\n challenge: challenge.challenge,\n u2fRegisterData: challenge.u2fRegisterData,\n name,\n role,\n });\n const validationPubKey = await device.getValidationPubKey();\n const registerData = await device.registerData({ challenge: challenge.challenge });\n const attestationOffset = 67 + register.u2fRegister.readInt8(66);\n const u2fRegister = Buffer.concat([\n register.u2fRegister.slice(0, attestationOffset),\n Buffer.from([attestation.buffer.length]),\n attestation.buffer,\n register.u2fRegister.slice(attestationOffset),\n ]).toString(\"hex\");\n const challengeResponse: UserRegistrationChallengeResponse = {\n registerData,\n certificate: {\n ...attestation.attestation,\n signature: validationPubKey.signature,\n },\n u2fRegister,\n u2fKeyHandle: register.keyHandle.toString(\"hex\"),\n validationKey: validationPubKey.pubKey,\n pairingPayload,\n };\n return submitChallenge({ pubKey: u2fPubKey.pubKey, challengeResponse });\n}\n\nexport function createEngine(options: EngineOptions, logger: Logger): Engine {\n const clientOptions: TRPCClientOptions = {\n baseUrl: options.baseUrl,\n };\n const client = createClient(clientOptions);\n const apiDevice = createApiDevice(options, logger);\n\n const base: EngineBase = {\n client,\n createClient: (overrides) => createClient({ ...clientOptions, ...overrides }),\n };\n\n const withDeviceIndex: Engine[\"withDeviceIndex\"] = function <T>(\n this: Engine<T>,\n deviceIndex: number,\n ) {\n const device = apiDevice.with(deviceIndex);\n const withPsd: WithDevice = { device };\n return decorateEngine({ ...this, ...withPsd } as Engine<T & WithDevice>);\n };\n\n const withTransportId: Engine[\"withTransportId\"] = function <T>(\n this: Engine<T>,\n transportId: string,\n ) {\n const device = createRealDevice({ transportId }, logger);\n const withPsd: WithDevice = { device };\n return decorateEngine({ ...this, ...withPsd } as Engine<T & WithDevice>);\n };\n\n const withApiUser: Engine[\"withApiUser\"] = function <T>(this: Engine<T>) {\n const withApiUser: WithApiUser = { __isApiUser: true };\n return decorateEngine({ ...this, ...withApiUser } as Engine<T & WithApiUser>);\n };\n\n const withWorkspace: Engine[\"withWorkspace\"] = function <T>(\n this: Engine<T>,\n workspaceName: string,\n ) {\n const withWorkspace: WithWorkspace = { __workspaceName: workspaceName };\n return decorateEngine({ ...this, ...withWorkspace } as Engine<T & WithWorkspace>);\n };\n\n const withOnboarding: Engine[\"withOnboarding\"] = function <T>(\n this: Engine<T>,\n onboardingId: string,\n ) {\n const withOnboarding: WithOnboarding = { __onboardingId: onboardingId };\n return decorateEngine({ ...this, ...withOnboarding } as Engine<T & WithOnboarding>);\n };\n\n function decorateEngine<T>(\n engine: Engine<\n T &\n Partial<\n WithDevice & WithOnboarding & WithWorkspace & WithPsdAuth & WithApiUser & WithApiAuth\n >\n >,\n ): Engine<T> {\n function decorate<TEnhanced, TDecoration>(\n decorator: (engine: EngineBase & TEnhanced) => TDecoration,\n ): void {\n Object.assign(engine, decorator(engine as EngineBase & TEnhanced));\n }\n\n // DecorateWithDevice\n // -------------------------------------------------------------------------\n if (engine.device) {\n decorate<WithDevice, DecorateWithDevice<T>>(\n (engine) =>\n ({\n getWorkspaces: async (): Promise<string[]> => {\n const { device, client } = engine;\n const { pubKey } = await device.getU2FPubKey();\n const { workspaceNames } = await client.auth.psd.findWorkspaceNames.query({ pubKey });\n return workspaceNames;\n },\n }) satisfies DecorateWithDevice<T>,\n );\n }\n\n // DecorateWithWorkspaceUnauthenticated\n // -------------------------------------------------------------------------\n if (engine.__workspaceName && !engine.__psdToken && !engine.__apiAuth) {\n decorate<WithWorkspace, DecorateWithWorkspaceUnauthenticated<T>>((engine) => {\n const { __workspaceName } = engine;\n return {\n withPsdToken: function <T>(this: Engine<T>, token: string): Engine<T & WithPsdAuth> {\n const withPsdAuth: WithPsdAuth = { __psdToken: token };\n const psdAuth = `${__workspaceName}:${token}`;\n const client = engine.createClient({ psdAuth });\n return decorateEngine({ ...this, client, ...withPsdAuth } as Engine<T & WithPsdAuth>);\n },\n } satisfies DecorateWithWorkspaceUnauthenticated<T>;\n });\n }\n\n // DecorateWithDeviceAndOnboarding\n // -------------------------------------------------------------------------\n if (engine.device && engine.__onboardingId) {\n decorate<WithDevice & WithOnboarding, DecorateWithDeviceAndOnboarding>((engine) => {\n const { device, client, __onboardingId } = engine;\n async function enforcePairing(): Promise<void> {\n if (await device.hasPairing()) return;\n const [{ pubKey }, confidentialityKey] = await Promise.all([\n device.getU2FPubKey(),\n device.getConfidentialityKey(),\n ]);\n const pairing = await client.onboarding.pairDevicePartition.mutate({\n pubKey,\n onboardingId: __onboardingId,\n data: {\n confidentialityKeyCurve25519: confidentialityKey.confidentialityKeyCurve25519,\n confidentialityKeySignature: confidentialityKey.confidentialityKeySignature,\n },\n });\n await device.setPairing({ pairing });\n }\n return {\n claimDevice: async (params: { role: ClaimedRole; deviceName: string }): Promise<void> => {\n const { role, deviceName } = params;\n const [{ pubKey }, { pubKey: confidentialityKey }] = await Promise.all([\n device.getU2FPubKey(),\n device.getConfidentialityPubKey(),\n ]);\n await client.onboarding.claimDevice.mutate({\n onboardingId: __onboardingId,\n claim: { role, pubKey, deviceName, confidentialityKey },\n });\n },\n\n collectWrappingKeyFragment: async (wrappingKey: WrappingKeyResponse): Promise<void> => {\n const [{ pubKey }, confidentialityKey] = await Promise.all([\n device.getU2FPubKey(),\n device.getConfidentialityPubKey(),\n ]);\n await device.openSession({\n secureChannel: {\n pubKey: wrappingKey.ephemeralPubKey,\n certificate: wrappingKey.ephemeralCertificate,\n },\n });\n const { attestation } = await device.getAttestation();\n const blob = await device.generateWrappingKeyFragment();\n await client.onboarding.submitWrappingKeyFragment.mutate({\n pubKey,\n onboardingId: __onboardingId,\n fragment: {\n blob,\n ephemeralPubKey: confidentialityKey.pubKey,\n ephemeralCertificate: {\n ...attestation,\n signature: confidentialityKey.signature,\n },\n },\n });\n },\n\n registerDevice: async (params: RegisterOnboardingDeviceParams): Promise<void> => {\n const { role, name } = params;\n const getChallengeMutation =\n role === \"ADMIN\"\n ? client.onboarding.generateMasterAdminRegistrationChallenge\n : client.onboarding.generateSharedOwnerRegistrationChallenge;\n const submitChallengeMutation =\n role === \"ADMIN\"\n ? client.onboarding.submitMasterAdminRegistration\n : client.onboarding.submitSharedOwnerRegistration;\n await genericRegister({\n device: device,\n name,\n role,\n getChallenge: ({ pubKey, deviceData }) =>\n getChallengeMutation.mutate({\n onboardingId: __onboardingId,\n pubKey,\n deviceData,\n }),\n submitChallenge: ({ pubKey, challengeResponse }) =>\n submitChallengeMutation.mutate({\n onboardingId: engine.__onboardingId,\n pubKey,\n // FIXME this should be renamed to `challengeResponse` on backend side\n response: challengeResponse,\n }),\n });\n },\n\n reviewSharedOwner: async (challenge: PsdChallenge): Promise<void> => {\n await enforcePairing();\n const { pubKey } = await device.getU2FPubKey();\n await device.startKPatternAsResponder({\n handshake: challenge.handshake,\n handshakeAttestation: challenge.handshakeAttestation,\n partitionId: challenge.partitionId,\n });\n const signature = await device.validateVaultOperation({\n actions: challenge.wActions,\n });\n await client.onboarding.submitReviewByMasterAdminSignature.mutate({\n onboardingId: __onboardingId,\n pubKey,\n signature,\n });\n },\n\n collectSeedFragment: async (challenge: OnboardingSeedChallenge): Promise<void> => {\n await enforcePairing();\n const [{ pubKey }, { attestation }] = await Promise.all([\n device.getU2FPubKey(),\n device.getAttestation(),\n ]);\n await device.startKPatternAsResponder({\n handshake: challenge.handshake,\n handshakeAttestation: challenge.handshakeAttestation,\n partitionId: challenge.partitionId,\n });\n const challengeResponse = await device.validateVaultOperation({\n actions: challenge.wActions,\n });\n const kkPattern = await device.startKKPatternAsResponder({\n partitionId: challenge.partitionId,\n handshake: challenge.kkHandshake,\n handshakeAttestation: challenge.kkHandshakeAttestation,\n });\n const approverBlob = await device.generateSeedFragment();\n await client.onboarding.submitSeedFragment.mutate({\n onboardingId: __onboardingId,\n pubKey,\n seedFragment: {\n challengeResponse,\n approverBlob,\n handshake: kkPattern.handshake,\n handshakeAttestation: {\n ...attestation,\n signature: kkPattern.signature,\n },\n },\n });\n },\n } satisfies DecorateWithDeviceAndOnboarding;\n });\n }\n\n // DecorateWithDeviceAndWorkspaceUnauthenticated\n // -------------------------------------------------------------------------\n if (engine.device && engine.__workspaceName && !engine.__psdToken) {\n decorate<WithDevice & WithWorkspace, DecorateWithDeviceAndWorkspaceUnauthenticated<T>>(\n (engine) => {\n const { device, client, __workspaceName } = engine;\n return {\n login: async function <T>(\n this: Engine<T>,\n opts?: { validityDurationSecs?: number; onScreenDisplayed?: () => void },\n ): Promise<Engine<T & WithPsdAuth>> {\n const { pubKey } = await device.getU2FPubKey();\n const challenge = await client.auth.psd.generateChallenge.mutate({\n pubKey,\n workspaceName: __workspaceName,\n });\n opts?.onScreenDisplayed?.();\n const authentication = await device.authenticate({\n challenge,\n workspaceName: __workspaceName,\n });\n const authPayload = {\n workspaceName: __workspaceName,\n pubKey,\n authentication,\n validityDurationSecs: opts?.validityDurationSecs,\n };\n const { token } = await client.auth.psd.authenticate.mutate({ ...authPayload });\n const withPsdAuth: WithPsdAuth = {\n __psdToken: token,\n };\n const psdAuth = `${engine.__workspaceName}:${token}`;\n const __authClient = engine.createClient({ psdAuth });\n return decorateEngine({ ...this, client: __authClient, ...withPsdAuth } as Engine<\n T & WithPsdAuth\n >);\n },\n\n register: (\n registration: UserRegistrationResponse,\n ): Promise<UserRegistrationResponse> => {\n return genericRegister({\n device,\n name: registration.name,\n role: registration.role,\n getChallenge: async ({ deviceData }) => {\n const challenge = await client.userRegistrations.generateChallenge.mutate({\n id: registration.id,\n workspaceName: __workspaceName,\n deviceData,\n });\n return challenge;\n },\n submitChallenge: ({ challengeResponse }) =>\n client.userRegistrations.submitChallenge.mutate({\n workspaceName: __workspaceName,\n id: registration.id,\n challengeResponse,\n }),\n });\n },\n } satisfies DecorateWithDeviceAndWorkspaceUnauthenticated<T>;\n },\n );\n }\n\n // DecorateWithApiUserAndWorkspaceUnauthenticated\n // -------------------------------------------------------------------------\n if (engine.__workspaceName && engine.__isApiUser && !engine.__apiAuth) {\n decorate<WithWorkspace & WithApiUser, DecorateWithApiUserAndWorkspaceUnauthenticated<T>>(\n (engine) => {\n const { client, __workspaceName } = engine;\n return {\n login: async function <T>(\n this: Engine<T>,\n credentials: {\n apiKeyId: string;\n apiKeySecret: string;\n },\n ): Promise<Engine<T & WithApiAuth>> {\n const res = await client.auth.authenticate.mutate({\n apiKeyId: credentials.apiKeyId,\n apiKeySecret: credentials.apiKeySecret,\n workspace: __workspaceName,\n });\n const withApiAuth: WithApiAuth = {\n __apiAuth: res,\n };\n const __authClient = engine.createClient({ apiAccessToken: res.accessToken });\n return decorateEngine({ ...this, client: __authClient, ...withApiAuth } as Engine<\n T & WithApiAuth\n >);\n },\n } satisfies DecorateWithApiUserAndWorkspaceUnauthenticated<T>;\n },\n );\n }\n\n // DecorateWithWorkspacePsdAuthenticated\n // -------------------------------------------------------------------------\n if (engine.device && engine.__workspaceName && engine.__psdToken) {\n decorate<WithDevice & WithWorkspace, DecorateWithWorkspacePsdAuthenticated>((engine) => {\n const { client, device } = engine;\n\n async function enforcePairing(): Promise<void> {\n if (await device.hasPairing()) return;\n const confidentialityKey = await device.getConfidentialityKey();\n const pairing = await client.debug.pairDevicePartition.mutate({\n confidentialityKeyCurve25519: confidentialityKey.confidentialityKeyCurve25519,\n confidentialityKeySignature: confidentialityKey.confidentialityKeySignature,\n });\n await device.setPairing({ pairing });\n }\n\n const approveChallenge = async (\n challenge: PsdChallenge,\n params?: ApproveRequestParams,\n ): Promise<string> => {\n await enforcePairing();\n await device.startKPatternAsResponder({\n handshake: challenge.handshake,\n handshakeAttestation: challenge.handshakeAttestation,\n partitionId: challenge.partitionId,\n });\n params?.onScreenDisplayed?.();\n const signature = await device.validateVaultOperation({\n actions: challenge.wActions,\n });\n return signature;\n };\n\n return {\n approve: async (\n request: VaultRequestResponse,\n params?: ApproveRequestParams,\n ): Promise<VaultRequestResponse> => {\n const { challenge } = await client.requests.getChallenge.query({ id: request.id });\n invariant(challenge.challengeType === \"PSD\", \"Challenge type must be PSD\");\n const signature = await approveChallenge(challenge, params);\n return client.requests.approve.mutate({\n id: request.id,\n data: { challengeType: \"PSD\", signature },\n });\n },\n\n approveChallenge,\n\n reject: (request: VaultRequestResponse): Promise<VaultRequestResponse> => {\n return client.requests.reject.mutate({ id: request.id, data: null });\n },\n } satisfies DecorateWithWorkspacePsdAuthenticated;\n });\n }\n\n // DecorateWithWorkspaceApiAuthenticated\n // -------------------------------------------------------------------------\n if (engine.__workspaceName && engine.__apiAuth) {\n decorate<WithWorkspace & WithApiAuth, DecorateWithWorkspaceApiAuthenticated>((engine) => {\n const { client } = engine;\n return {\n getChallenge: async (request: VaultRequestResponse): Promise<ApiChallenge[\"payload\"]> => {\n const { challenge } = await client.requests.getChallenge.query({ id: request.id });\n invariant(challenge.challengeType === \"API\", \"Challenge type must be API\");\n return challenge.payload;\n },\n\n approve: (\n request: VaultRequestResponse,\n signature: string,\n ): Promise<VaultRequestResponse> => {\n return client.requests.approve.mutate({\n id: request.id,\n data: { challengeType: \"API\", signature },\n });\n },\n\n reject: (\n request: VaultRequestResponse,\n signature: string,\n ): Promise<VaultRequestResponse> => {\n return client.requests.reject.mutate({\n id: request.id,\n data: { challengeType: \"API\", signature },\n });\n },\n } satisfies DecorateWithWorkspaceApiAuthenticated;\n });\n }\n\n return engine;\n }\n\n return {\n ...base,\n withDeviceIndex,\n withTransportId,\n withApiUser,\n withWorkspace,\n withOnboarding,\n };\n}\n","import { DisconnectedDevice, LockedDeviceError } from \"@ledgerhq/errors\";\nimport type Transport from \"@ledgerhq/hw-transport\";\nimport type { HsmCertificate } from \"@ledgerhq/revault-api\";\nimport invariant from \"invariant\";\nimport { from, lastValueFrom } from \"rxjs\";\n\nimport type { Logger } from \"@/logger\";\n\nimport {\n APPID_VAULT_ADMINISTRATOR,\n PAGINATED_STATUS,\n PATHS,\n SCRIPT_IDS,\n STATUS_LENGTH,\n STR_ROLES,\n STREAMING_NEXT_ACTION,\n STREAMING_RESPONSE,\n} from \"./constants\";\nimport { withDevicePolling } from \"./device-access\";\nimport type { Device } from \"./types\";\nimport { isTransportStatusError } from \"./utils\";\n\nconst MAX_CHUNK_LENGTH = 250;\n\ntype Options = {\n transportId: string;\n};\n\nconst FIXME_NOT_IMPLEMENTED =\n (fnName: string): (() => Promise<never>) =>\n async () => {\n throw new Error(`Not implemented: ${fnName}`);\n };\n\nconst getPathFromPathString = (pathString: string): number[] => {\n const parts = pathString.split(\"'/\").map((part) => parseInt(part, 10));\n return parts.map((part) => (part | 0x80000000) >>> 0);\n};\n\nconst splitChunks = (chunk: number, buffer: Buffer): Buffer[] => {\n const chunks = [];\n for (let i = 0, size = chunk; i < buffer.length; i += size, size = chunk) {\n chunks.push(buffer.slice(i, i + size));\n }\n return chunks;\n};\n\nconst removeStatus = (result: Buffer): Buffer => result.slice(0, result.length - STATUS_LENGTH);\n\nconst sendByChunk = async (\n transport: Transport,\n command: number[], // eg [0xe0, 0x45, 0x00, 0x00]\n data: Buffer,\n chunkSize: number = MAX_CHUNK_LENGTH,\n): Promise<Buffer> => {\n const chunks = splitChunks(chunkSize, data);\n let response = Buffer.from([]);\n for (let i = 0; i < chunks.length; i++) {\n const chunk = chunks[i];\n const apdu = [...command];\n // command is 0xe0,0x45,0x00,0x00 for first chunk, then it's 0xe0,0x45,0x80,0x00\n /* v8 ignore next -- @preserve */\n apdu[2] = i && 0x80;\n response = (await transport.send(apdu[0]!, apdu[1]!, apdu[2], apdu[3]!, chunk, [\n 0x9000,\n ...PAGINATED_STATUS,\n ])) as Buffer<ArrayBuffer>;\n }\n return response;\n};\n\nconst buildAttestation = (params: {\n handshake: string;\n handshakeAttestation: HsmCertificate;\n partitionId: string;\n}): Buffer => {\n const sigBuffer = Buffer.from(params.handshakeAttestation.signature, \"base64\");\n const sigLengthBuffer = Buffer.alloc(1);\n sigLengthBuffer.writeUIntBE(sigBuffer.length, 0, 1);\n\n const certBuffer = Buffer.from(params.handshakeAttestation.certificate, \"base64\");\n const certLengthBuffer = Buffer.alloc(1);\n certLengthBuffer.writeUIntBE(certBuffer.length, 0, 1);\n\n const pubBuffer = Buffer.from(params.handshakeAttestation.attestationPub, \"base64\");\n\n const certChainData = Buffer.concat([\n sigLengthBuffer,\n sigBuffer,\n pubBuffer,\n certLengthBuffer,\n certBuffer,\n ]);\n\n const cliMsgBuffer = Buffer.from(params.handshake, \"hex\");\n const cliMsgLengthBuffer = Buffer.alloc(1);\n cliMsgLengthBuffer.writeUIntBE(cliMsgBuffer.length, 0, 1);\n\n const pidBuffer = Buffer.from(params.partitionId, \"hex\");\n const pidLengthBuffer = Buffer.alloc(1);\n pidLengthBuffer.writeUIntBE(pidBuffer.length, 0, 1);\n\n const certChainDataLengthBuff = Buffer.alloc(2);\n certChainDataLengthBuff.writeUInt16BE(certChainData.length, 0);\n\n const data = Buffer.concat([\n cliMsgLengthBuffer,\n cliMsgBuffer,\n certChainDataLengthBuff,\n certChainData,\n pidLengthBuffer,\n pidBuffer,\n ]);\n\n const totalLengthBuffer = Buffer.alloc(2);\n totalLengthBuffer.writeUInt16BE(data.length, 0);\n\n const toSend = Buffer.concat([totalLengthBuffer, data]);\n\n return toSend;\n};\n\ntype RetryOnError = (err: Error) => boolean;\n/* v8 ignore next -- @preserve */\nconst genericRetryOnError: RetryOnError = (err) => {\n // device is locked\n if (err instanceof LockedDeviceError) return true;\n // user is on dashboard when receiving a Vault app apdu\n if (isTransportStatusError(err) && err.statusCode === 0x6d09) return true;\n // VG-24797 error that can happen in BLE in some situations (still unclear)\n if (err instanceof DisconnectedDevice) return true;\n\n // for everything else, we don't want to retry\n return false;\n};\n\nexport function createRealDevice(options: Options, logger: Logger): Device {\n const { transportId } = options;\n\n async function run<T>(\n job: (transport: Transport) => Promise<T>,\n retryOnError: RetryOnError = genericRetryOnError,\n ): Promise<T> {\n return lastValueFrom(\n withDevicePolling(transportId)<T>((transport) => from(job(transport)), retryOnError),\n );\n }\n\n /* v8 ignore next -- @preserve */\n const noRetry = (): boolean => false;\n /* v8 ignore next -- @preserve */\n const alwaysRetry = (): boolean => true;\n const poll = async (\n opts: { retryOnError?: RetryOnError } = {},\n ): Promise<{ isAppOpened: boolean }> => {\n // waiting for device to be turned on\n await run(\n // eslint-disable-next-line @typescript-eslint/no-empty-function\n async (_transport) => {},\n opts.retryOnError ?? alwaysRetry,\n );\n // checking if app is opened: should return directly on getPubKey\n try {\n await getPublicKey(PATHS.U2F, { secp256k1: true, retryOnError: noRetry });\n return { isAppOpened: true };\n } catch (err) {\n if (isTransportStatusError(err) && genericRetryOnError(err)) {\n return { isAppOpened: false };\n }\n throw err;\n }\n };\n\n const pollApp = async (appName: string): Promise<string> => {\n const res = await run((transport) =>\n transport.send(0xe0, 0xd8, 0x00, 0x00, Buffer.from(appName, \"utf8\")),\n );\n // little delay to give time to the app to be fully opened\n await new Promise((r) => setTimeout(r, 1e3));\n return res.toString(\"hex\");\n };\n\n const getPublicKey = async (\n pathString: string,\n { secp256k1, retryOnError }: { secp256k1: boolean; retryOnError?: RetryOnError },\n ): Promise<{ pubKey: string; signature: string }> => {\n logger.info(`[device] getPublicKey (${pathString})`);\n const path = getPathFromPathString(pathString);\n const data = Buffer.concat([\n Buffer.from([path.length]),\n ...path.map((derivation) => {\n const buf = Buffer.alloc(4);\n buf.writeUInt32BE(derivation, 0);\n return buf;\n }),\n ]);\n const curve = secp256k1 ? 0x01 : 0x02;\n const response = await run(\n (transport) => transport.send(0xe0, 0x40, curve, 0x00, data),\n retryOnError ?? genericRetryOnError,\n );\n const pubKeyLength = response.readInt8(0);\n const pubKey = response\n .slice(1, pubKeyLength + 1)\n .toString(\"hex\")\n .toUpperCase();\n const signature = response\n .slice(pubKeyLength + 1, response.length - STATUS_LENGTH)\n .toString(\"base64\");\n return { pubKey, signature };\n };\n\n const device: Device = {\n authenticate: async ({ challenge: { challenge, name, role, keyHandle }, workspaceName }) => {\n logger.info(`[device] Authenticate`);\n invariant(role !== \"READ_ONLY_API_KEY\", \"Invalid role for authenticate: READ_ONLY_API_KEY\");\n const applicationBuffer = Buffer.from(APPID_VAULT_ADMINISTRATOR, \"hex\");\n const nameBuffer = Buffer.from(name);\n const workspaceBuffer = Buffer.from(workspaceName);\n\n const keyHandleData = Buffer.concat([\n Buffer.from(STR_ROLES[role], \"hex\"),\n Buffer.from([nameBuffer.length]),\n nameBuffer,\n Buffer.from([workspaceBuffer.length]),\n workspaceBuffer,\n ]);\n\n const keyHandleDataLength = Buffer.alloc(2);\n keyHandleDataLength.writeUInt16BE(keyHandleData.length, 0);\n\n const data = Buffer.concat([\n Buffer.from(challenge, \"base64\"),\n applicationBuffer,\n Buffer.from([keyHandle.length]),\n Buffer.from(keyHandle, \"hex\"),\n keyHandleDataLength,\n keyHandleData,\n ]);\n\n const authentication = await run((transport) =>\n sendByChunk(transport, [0xe0, 0x02, 0x00, 0x00], data),\n );\n\n return removeStatus(authentication).toString(\"hex\");\n },\n\n finalizePairingHandshake: async (params: {\n handshake: string;\n partitionId: string;\n handshakeAttestation: HsmCertificate;\n }): Promise<string> => {\n const bufWithStatus = await run((transport) =>\n sendByChunk(transport, [0xe0, 0x47, 0x00, 0x02], buildAttestation(params)),\n );\n return removeStatus(bufWithStatus).toString(\"hex\");\n },\n\n generateSeedFragment: FIXME_NOT_IMPLEMENTED(\"generateSeedFragment\"),\n generateWrappingKeyFragment: FIXME_NOT_IMPLEMENTED(\"generateWrappingKeyFragment\"),\n getAttestation: async (): Promise<{\n attestation: {\n codeHash: string;\n attestationPub: string;\n certificate: string;\n };\n buffer: Buffer;\n }> => {\n const bufWithStatus = await run((transport) => transport.send(0xe0, 0x41, 0x00, 0x00));\n const buffer = removeStatus(bufWithStatus);\n const certLen = buffer.readInt8(32 + 65 + 1);\n return {\n attestation: {\n codeHash: buffer.slice(0, 32).toString(\"base64\"),\n attestationPub: buffer.slice(32, 32 + 65).toString(\"base64\"),\n certificate: buffer.slice(32 + 65, 32 + 65 + 2 + certLen).toString(\"base64\"),\n },\n buffer,\n };\n },\n getConfidentialityKey: async () => {\n logger.info(`[device] getConfidentialityKey`);\n const bufWithStatus = await run((transport) => transport.send(0xe0, 0x4d, 0x00, 0x00));\n const buf = removeStatus(bufWithStatus);\n const keyLength = buf[0]!;\n const key = buf.slice(1, 1 + keyLength);\n const sig = buf.slice(1 + keyLength + 1);\n return {\n confidentialityKeyCurve25519: key.toString(\"hex\"),\n confidentialityKeySignature: sig.toString(\"hex\"),\n };\n },\n getConfidentialityPubKey: () => getPublicKey(PATHS.CONFIDENTIALITY, { secp256k1: true }),\n getDeviceUserId: FIXME_NOT_IMPLEMENTED(\"getDeviceUserId\"),\n getU2FPubKey: () => getPublicKey(PATHS.U2F, { secp256k1: false }),\n getValidationPubKey: () => getPublicKey(PATHS.VALIDATION, { secp256k1: true }),\n hasPairing: async () => {\n logger.info(`[device] hasPairing`);\n const apdu = [0xe0, 0x51, 0x00, 0x00, 0xb5];\n const res = await run((transport) => transport.exchange(Buffer.from(apdu)));\n const hex = Buffer.from(res).toString(\"hex\");\n\n // 6f45 => this error means that there is no partition ID on the device\n // if no error, it means there is (at least) one\n //\n // 6a87 => TEMPORARY hack because Stax apparently does not implement\n // the \"get partition id\" APDU, so it returns \"incorrect length\"\n // easier to just assume that in this case there is no partition,\n // and try to insert one anyway (done on revault onboarding)\n //\n return hex !== \"6f45\" && hex !== \"6a87\";\n },\n\n initPairingHandshake: async (): Promise<{ pubKey: string; signature: string }> => {\n const res = await run((transport) => transport.send(0xe0, 0x46, 0x00, 0x00));\n const pubKeyLength = res.readInt8(0);\n const pubKey = res\n .slice(1, pubKeyLength + 1)\n .toString(\"hex\")\n .toUpperCase();\n const signature = res.slice(pubKeyLength + 1, res.length - STATUS_LENGTH).toString(\"base64\");\n return { pubKey, signature };\n },\n\n openSession: FIXME_NOT_IMPLEMENTED(\"openSession\"),\n\n register: async (params: {\n challenge: string;\n u2fRegisterData: string;\n name: string;\n role: \"ADMIN\" | \"SHARED_OWNER\" | \"OPERATOR\";\n }): Promise<{\n u2fRegister: Buffer;\n keyHandle: Buffer;\n rfu: number;\n pubKey: string;\n }> => {\n const { challenge: strChallenge, u2fRegisterData: _, name, role } = params;\n const challenge = Buffer.from(strChallenge, \"hex\");\n\n invariant(challenge.length === 32, \"challenge hex is expected to have 32 bytes\");\n const applicationBuf = Buffer.from(APPID_VAULT_ADMINISTRATOR, \"hex\");\n invariant(applicationBuf.length === 32, \"application hex is expected to have 32 bytes\");\n\n const userNameBuff = Buffer.from(name);\n\n const keyHandleData = Buffer.concat([\n Buffer.from(STR_ROLES[role], \"hex\"),\n Buffer.from([userNameBuff.length]),\n userNameBuff,\n ]);\n\n const keyHandleDataLength = Buffer.alloc(2);\n keyHandleDataLength.writeUInt16BE(keyHandleData.length, 0);\n\n const data = Buffer.concat([challenge, applicationBuf, keyHandleDataLength, keyHandleData]);\n\n const response = await run((transport) =>\n sendByChunk(transport, [0xe0, 0x01, 0x00, 0x00], data),\n );\n\n let i = 0;\n const rfu = response.slice(i, i + 1)[0]!;\n i += 1;\n const pubKey = response.slice(i, i + 65).toString(\"hex\");\n i += 65;\n const keyHandleLength = response.slice(i, i + 1)[0]!;\n i++;\n const keyHandle = response.slice(i, i + keyHandleLength);\n i += keyHandleLength;\n return {\n u2fRegister: removeStatus(response),\n keyHandle,\n rfu,\n pubKey,\n };\n },\n registerData: async (params: { challenge: string }): Promise<string> => {\n const { challenge: strChallenge } = params;\n const challenge = Buffer.from(strChallenge, \"hex\");\n invariant(challenge.length === 32, \"challenge hex is expected to have 32 bytes\");\n const response = await run((transport) => transport.send(0xe0, 0x03, 0x00, 0x00, challenge));\n return removeStatus(response).toString(\"hex\");\n },\n\n setPairing: async ({ pairing }) => {\n logger.info(`[device] setPairing`);\n const psdPayload = Buffer.from(pairing.blob, \"base64\");\n const length = Buffer.alloc(2);\n length.writeUInt16BE(psdPayload.length, 0);\n const final = Buffer.concat([length, psdPayload]);\n await run((transport) => sendByChunk(transport, [0xe0, 0x4e, 0x00, 0x00], final));\n },\n startKKPatternAsResponder: FIXME_NOT_IMPLEMENTED(\"startKKPatternAsResponder\"),\n startKPatternAsResponder: async (params) => {\n logger.info(`[device] startKPatternAsResponder`);\n const data = buildAttestation(params);\n await run((transport) =>\n sendByChunk(transport, [0xe0, 0x49, 0x00, SCRIPT_IDS.ACCOUNT_MANAGER_SESSION], data),\n );\n },\n validateVaultOperation: async (params) => {\n logger.info(`[device] validateVaultOperation`);\n const path = getPathFromPathString(PATHS.VALIDATION);\n const paths = Buffer.concat([\n Buffer.from([path.length]),\n ...path.map((derivation) => {\n const buf = Buffer.alloc(4);\n buf.writeUInt32BE(derivation, 0);\n return buf;\n }),\n ]);\n\n let nextActionId = 1;\n let finalResponse: Buffer | null = null;\n\n while (!finalResponse) {\n const screen = Buffer.from(params.actions[nextActionId - 1]!, \"base64\");\n const length = Buffer.alloc(2);\n length.writeUInt16BE(screen.length, 0);\n const data = Buffer.concat([paths, length, screen]);\n const response = await run((transport) =>\n sendByChunk(transport, [0xe0, 0x45, 0x00, 0x00], data),\n );\n const responseType = response.readInt8(0);\n let responseStatus = response.readUInt16BE(response.length - 2);\n switch (responseType) {\n case STREAMING_NEXT_ACTION:\n nextActionId = response.readUIntBE(1, 2);\n break;\n case STREAMING_RESPONSE:\n finalResponse = response.slice(3, response.length - 2);\n while (responseStatus !== 0x9000) {\n /* v8 ignore next -- @preserve */ {\n const resp = await run((transport) => transport.send(0x00, 0xc0, 0x00, 0x00));\n responseStatus = resp.readUInt16BE(resp.length - 2);\n finalResponse = Buffer.concat([finalResponse, removeStatus(resp)]);\n }\n }\n break;\n /* v8 ignore next -- @preserve */\n default:\n throw new Error(`Invalid response type: ${responseType}`);\n }\n }\n return finalResponse.toString(\"base64\");\n },\n\n sendAPDU: async (apduCommand: string) => {\n const res = await run((transport) => transport.exchange(Buffer.from(apduCommand, \"hex\")));\n return Buffer.from(res).toString(\"hex\");\n },\n getVersion: async () => {\n const res = await run((transport) => transport.send(0xb0, 0x01, 0x00, 0x00));\n const appNameLen = res.readInt8(1);\n const appVersionLen = res.readInt8(2 + appNameLen);\n const appVersionHex = res.slice(2 + 1 + appNameLen, 2 + appNameLen + appVersionLen + 1);\n\n const appVersion = Buffer.from(appVersionHex).toString();\n\n return appVersion;\n },\n poll,\n pollApp,\n };\n return device;\n}\n","import type { AppRouter } from \"@ledgerhq/revault-api\";\nimport { createTRPCClient, httpLink, type TRPCClient } from \"@trpc/client\";\nimport type { inferRouterInputs, inferRouterOutputs } from \"@trpc/server\";\nimport superjson from \"superjson\";\n\nexport type TRPCClientOptions = {\n baseUrl: string;\n debugAuthToken?: string;\n rootAuthToken?: string;\n apiAccessToken?: string;\n psdAuth?: string;\n};\n\nexport type RevaultApiTRPCClient = TRPCClient<AppRouter>;\n\nexport type RouterInputs = inferRouterInputs<AppRouter>;\nexport type RouterOutputs = inferRouterOutputs<AppRouter>;\n\nexport const createClient = (options: TRPCClientOptions): RevaultApiTRPCClient => {\n const trpc = createTRPCClient<AppRouter>({\n links: [\n httpLink({\n url: `${options.baseUrl}/trpc`,\n transformer: superjson,\n headers() {\n return {\n ...(options.debugAuthToken\n ? { \"x-revault-debug-auth-token\": options.debugAuthToken }\n : {}),\n ...(options.rootAuthToken\n ? { \"x-revault-root-auth-token\": options.rootAuthToken }\n : {}),\n ...(options.psdAuth ? { Authorization: `PsdAuth ${options.psdAuth}` } : {}),\n ...(options.apiAccessToken\n ? { Authorization: `Bearer ${options.apiAccessToken}` }\n : {}),\n };\n },\n }),\n ],\n });\n return trpc;\n};\n"],"mappings":"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","names":["invariant","withApiUser","withWorkspace","withOnboarding","engine","client","invariant"]}
|
|
1
|
+
{"version":3,"sources":["../src/engine/index.ts","../src/device/real-device.ts","../src/trpc.ts"],"sourcesContent":["import type {\n ApiChallenge,\n ClaimedRole,\n OnboardingSeedChallenge,\n PsdChallenge,\n UserRegistrationChallenge,\n UserRegistrationChallengeResponse,\n UserRegistrationDeviceData,\n UserRegistrationResponse,\n VaultRequestResponse,\n WrappingKeyResponse,\n} from \"@ledgerhq/revault-api\";\nimport invariant from \"invariant\";\n\nimport { createApiDevice, type Device } from \"@/device\";\nimport { createRealDevice } from \"@/device/real-device\";\nimport type { Logger } from \"@/logger\";\nimport { createClient, type TRPCClientOptions } from \"@/trpc\";\n\nimport { buildTrpcContext } from \"../utils\";\nimport type {\n ApproveRequestParams,\n CorrelationIdOpts,\n DecorateWithApiUserAndWorkspaceUnauthenticated,\n DecorateWithDevice,\n DecorateWithDeviceAndOnboarding,\n DecorateWithDeviceAndWorkspaceUnauthenticated,\n DecorateWithWorkspaceApiAuthenticated,\n DecorateWithWorkspacePsdAuthenticated,\n DecorateWithWorkspaceUnauthenticated,\n Engine,\n EngineBase,\n EngineOptions,\n RegisterOnboardingDeviceParams,\n WithApiAuth,\n WithApiUser,\n WithDevice,\n WithOnboarding,\n WithPsdAuth,\n WithWorkspace,\n} from \"./types\";\n\nexport { fetchAll, fetchAllCursor } from \"../utils\";\nexport type * from \"./types\";\n\nasync function genericRegister<T>({\n device,\n name,\n role,\n getChallenge,\n submitChallenge,\n}: {\n device: Device;\n name: string;\n role: \"ADMIN\" | \"SHARED_OWNER\" | \"OPERATOR\";\n getChallenge: (p: {\n pubKey: string;\n deviceData: UserRegistrationDeviceData;\n }) => Promise<UserRegistrationChallenge>;\n submitChallenge: (p: {\n pubKey: string;\n challengeResponse: UserRegistrationChallengeResponse;\n }) => Promise<T>;\n}): Promise<T> {\n const [attestation, u2fPubKey, confidentialityKey] = await Promise.all([\n device.getAttestation(),\n device.getU2FPubKey(),\n device.getConfidentialityPubKey(),\n ]);\n const ephemeralPubKey = await device.initPairingHandshake();\n const deviceData: UserRegistrationDeviceData = {\n name,\n pubKey: u2fPubKey.pubKey,\n psdModel: \"STAX\",\n confidentialityKey: confidentialityKey.pubKey,\n psdEphemeralKey: ephemeralPubKey.pubKey,\n psdEphemeralKeyAttestation: {\n ...attestation.attestation,\n signature: ephemeralPubKey.signature,\n },\n };\n const challenge = await getChallenge({ pubKey: u2fPubKey.pubKey, deviceData });\n const pairingPayload = await device.finalizePairingHandshake({\n handshake: challenge.handshake,\n partitionId: challenge.ciphertext,\n handshakeAttestation: challenge.handshakeAttestation,\n });\n const register = await device.register({\n challenge: challenge.challenge,\n u2fRegisterData: challenge.u2fRegisterData,\n name,\n role,\n });\n const validationPubKey = await device.getValidationPubKey();\n const registerData = await device.registerData({ challenge: challenge.challenge });\n const attestationOffset = 67 + register.u2fRegister.readInt8(66);\n const u2fRegister = Buffer.concat([\n register.u2fRegister.slice(0, attestationOffset),\n Buffer.from([attestation.buffer.length]),\n attestation.buffer,\n register.u2fRegister.slice(attestationOffset),\n ]).toString(\"hex\");\n const challengeResponse: UserRegistrationChallengeResponse = {\n registerData,\n certificate: {\n ...attestation.attestation,\n signature: validationPubKey.signature,\n },\n u2fRegister,\n u2fKeyHandle: register.keyHandle.toString(\"hex\"),\n validationKey: validationPubKey.pubKey,\n pairingPayload,\n };\n return submitChallenge({ pubKey: u2fPubKey.pubKey, challengeResponse });\n}\n\nexport function createEngine(options: EngineOptions, logger: Logger): Engine {\n const clientOptions: TRPCClientOptions = {\n baseUrl: options.baseUrl,\n };\n const client = createClient(clientOptions);\n const apiDevice = createApiDevice(options, logger);\n\n const base: EngineBase = {\n client,\n createClient: (overrides) => createClient({ ...clientOptions, ...overrides }),\n };\n\n const withDeviceIndex: Engine[\"withDeviceIndex\"] = function <T>(\n this: Engine<T>,\n deviceIndex: number,\n ) {\n const device = apiDevice.with(deviceIndex);\n const withPsd: WithDevice = { device };\n return decorateEngine({ ...this, ...withPsd } as Engine<T & WithDevice>);\n };\n\n const withTransportId: Engine[\"withTransportId\"] = function <T>(\n this: Engine<T>,\n transportId: string,\n ) {\n const device = createRealDevice({ transportId }, logger);\n const withPsd: WithDevice = { device };\n return decorateEngine({ ...this, ...withPsd } as Engine<T & WithDevice>);\n };\n\n const withApiUser: Engine[\"withApiUser\"] = function <T>(this: Engine<T>) {\n const withApiUser: WithApiUser = { __isApiUser: true };\n return decorateEngine({ ...this, ...withApiUser } as Engine<T & WithApiUser>);\n };\n\n const withWorkspace: Engine[\"withWorkspace\"] = function <T>(\n this: Engine<T>,\n workspaceName: string,\n ) {\n const withWorkspace: WithWorkspace = { __workspaceName: workspaceName };\n return decorateEngine({ ...this, ...withWorkspace } as Engine<T & WithWorkspace>);\n };\n\n const withOnboarding: Engine[\"withOnboarding\"] = function <T>(\n this: Engine<T>,\n onboardingId: string,\n ) {\n const withOnboarding: WithOnboarding = { __onboardingId: onboardingId };\n return decorateEngine({ ...this, ...withOnboarding } as Engine<T & WithOnboarding>);\n };\n\n function decorateEngine<T>(\n engine: Engine<\n T &\n Partial<\n WithDevice & WithOnboarding & WithWorkspace & WithPsdAuth & WithApiUser & WithApiAuth\n >\n >,\n ): Engine<T> {\n function decorate<TEnhanced, TDecoration>(\n decorator: (engine: EngineBase & TEnhanced) => TDecoration,\n ): void {\n Object.assign(engine, decorator(engine as EngineBase & TEnhanced));\n }\n\n // DecorateWithDevice\n // -------------------------------------------------------------------------\n if (engine.device) {\n decorate<WithDevice, DecorateWithDevice<T>>(\n (engine) =>\n ({\n getWorkspaces: async (): Promise<string[]> => {\n const { device, client } = engine;\n const { pubKey } = await device.getU2FPubKey();\n const { workspaceNames } = await client.auth.psd.findWorkspaceNames.query({ pubKey });\n return workspaceNames;\n },\n }) satisfies DecorateWithDevice<T>,\n );\n }\n\n // DecorateWithWorkspaceUnauthenticated\n // -------------------------------------------------------------------------\n if (engine.__workspaceName && !engine.__psdToken && !engine.__apiAuth) {\n decorate<WithWorkspace, DecorateWithWorkspaceUnauthenticated<T>>((engine) => {\n const { __workspaceName } = engine;\n return {\n withPsdToken: function <T>(this: Engine<T>, token: string): Engine<T & WithPsdAuth> {\n const withPsdAuth: WithPsdAuth = { __psdToken: token };\n const psdAuth = `${__workspaceName}:${token}`;\n const client = engine.createClient({ psdAuth });\n return decorateEngine({ ...this, client, ...withPsdAuth } as Engine<T & WithPsdAuth>);\n },\n } satisfies DecorateWithWorkspaceUnauthenticated<T>;\n });\n }\n\n // DecorateWithDeviceAndOnboarding\n // -------------------------------------------------------------------------\n if (engine.device && engine.__onboardingId) {\n decorate<WithDevice & WithOnboarding, DecorateWithDeviceAndOnboarding>((engine) => {\n const { device, client, __onboardingId } = engine;\n async function enforcePairing(): Promise<void> {\n if (await device.hasPairing()) return;\n const [{ pubKey }, confidentialityKey] = await Promise.all([\n device.getU2FPubKey(),\n device.getConfidentialityKey(),\n ]);\n const pairing = await client.onboarding.pairDevicePartition.mutate({\n pubKey,\n onboardingId: __onboardingId,\n data: {\n confidentialityKeyCurve25519: confidentialityKey.confidentialityKeyCurve25519,\n confidentialityKeySignature: confidentialityKey.confidentialityKeySignature,\n },\n });\n await device.setPairing({ pairing });\n }\n return {\n claimDevice: async (params: { role: ClaimedRole; deviceName: string }): Promise<void> => {\n const { role, deviceName } = params;\n const [{ pubKey }, { pubKey: confidentialityKey }] = await Promise.all([\n device.getU2FPubKey(),\n device.getConfidentialityPubKey(),\n ]);\n await client.onboarding.claimDevice.mutate({\n onboardingId: __onboardingId,\n claim: { role, pubKey, deviceName, confidentialityKey },\n });\n },\n\n collectWrappingKeyFragment: async (wrappingKey: WrappingKeyResponse): Promise<void> => {\n const [{ pubKey }, confidentialityKey] = await Promise.all([\n device.getU2FPubKey(),\n device.getConfidentialityPubKey(),\n ]);\n await device.openSession({\n secureChannel: {\n pubKey: wrappingKey.ephemeralPubKey,\n certificate: wrappingKey.ephemeralCertificate,\n },\n });\n const { attestation } = await device.getAttestation();\n const blob = await device.generateWrappingKeyFragment();\n await client.onboarding.submitWrappingKeyFragment.mutate({\n pubKey,\n onboardingId: __onboardingId,\n fragment: {\n blob,\n ephemeralPubKey: confidentialityKey.pubKey,\n ephemeralCertificate: {\n ...attestation,\n signature: confidentialityKey.signature,\n },\n },\n });\n },\n\n registerDevice: async (params: RegisterOnboardingDeviceParams): Promise<void> => {\n const { role, name } = params;\n const getChallengeMutation =\n role === \"ADMIN\"\n ? client.onboarding.generateMasterAdminRegistrationChallenge\n : client.onboarding.generateSharedOwnerRegistrationChallenge;\n const submitChallengeMutation =\n role === \"ADMIN\"\n ? client.onboarding.submitMasterAdminRegistration\n : client.onboarding.submitSharedOwnerRegistration;\n await genericRegister({\n device: device,\n name,\n role,\n getChallenge: ({ pubKey, deviceData }) =>\n getChallengeMutation.mutate({\n onboardingId: __onboardingId,\n pubKey,\n deviceData,\n }),\n submitChallenge: ({ pubKey, challengeResponse }) =>\n submitChallengeMutation.mutate({\n onboardingId: engine.__onboardingId,\n pubKey,\n // FIXME this should be renamed to `challengeResponse` on backend side\n response: challengeResponse,\n }),\n });\n },\n\n reviewSharedOwner: async (challenge: PsdChallenge): Promise<void> => {\n await enforcePairing();\n const { pubKey } = await device.getU2FPubKey();\n await device.startKPatternAsResponder({\n handshake: challenge.handshake,\n handshakeAttestation: challenge.handshakeAttestation,\n partitionId: challenge.partitionId,\n });\n const signature = await device.validateVaultOperation({\n actions: challenge.wActions,\n });\n await client.onboarding.submitReviewByMasterAdminSignature.mutate({\n onboardingId: __onboardingId,\n pubKey,\n signature,\n });\n },\n\n collectSeedFragment: async (challenge: OnboardingSeedChallenge): Promise<void> => {\n await enforcePairing();\n const [{ pubKey }, { attestation }] = await Promise.all([\n device.getU2FPubKey(),\n device.getAttestation(),\n ]);\n await device.startKPatternAsResponder({\n handshake: challenge.handshake,\n handshakeAttestation: challenge.handshakeAttestation,\n partitionId: challenge.partitionId,\n });\n const challengeResponse = await device.validateVaultOperation({\n actions: challenge.wActions,\n });\n const kkPattern = await device.startKKPatternAsResponder({\n partitionId: challenge.partitionId,\n handshake: challenge.kkHandshake,\n handshakeAttestation: challenge.kkHandshakeAttestation,\n });\n const approverBlob = await device.generateSeedFragment();\n await client.onboarding.submitSeedFragment.mutate({\n onboardingId: __onboardingId,\n pubKey,\n seedFragment: {\n challengeResponse,\n approverBlob,\n handshake: kkPattern.handshake,\n handshakeAttestation: {\n ...attestation,\n signature: kkPattern.signature,\n },\n },\n });\n },\n } satisfies DecorateWithDeviceAndOnboarding;\n });\n }\n\n // DecorateWithDeviceAndWorkspaceUnauthenticated\n // -------------------------------------------------------------------------\n if (engine.device && engine.__workspaceName && !engine.__psdToken) {\n decorate<WithDevice & WithWorkspace, DecorateWithDeviceAndWorkspaceUnauthenticated<T>>(\n (engine) => {\n const { device, client, __workspaceName } = engine;\n return {\n login: async function <T>(\n this: Engine<T>,\n opts?: {\n validityDurationSecs?: number;\n onScreenDisplayed?: () => void | Promise<void>;\n correlationId?: string;\n },\n ): Promise<Engine<T & WithPsdAuth>> {\n const { pubKey } = await device.getU2FPubKey();\n const challenge = await client.auth.psd.generateChallenge.mutate(\n {\n pubKey,\n workspaceName: __workspaceName,\n },\n buildTrpcContext({ correlationId: opts?.correlationId }),\n );\n await opts?.onScreenDisplayed?.();\n const authentication = await device.authenticate({\n challenge,\n workspaceName: __workspaceName,\n });\n const authPayload = {\n workspaceName: __workspaceName,\n pubKey,\n authentication,\n validityDurationSecs: opts?.validityDurationSecs,\n };\n const { token } = await client.auth.psd.authenticate.mutate(\n { ...authPayload },\n buildTrpcContext({ correlationId: opts?.correlationId }),\n );\n const withPsdAuth: WithPsdAuth = {\n __psdToken: token,\n };\n const psdAuth = `${engine.__workspaceName}:${token}`;\n const __authClient = engine.createClient({ psdAuth });\n return decorateEngine({ ...this, client: __authClient, ...withPsdAuth } as Engine<\n T & WithPsdAuth\n >);\n },\n\n register: (\n registration: UserRegistrationResponse,\n ): Promise<UserRegistrationResponse> => {\n return genericRegister({\n device,\n name: registration.name,\n role: registration.role,\n getChallenge: async ({ deviceData }) => {\n const challenge = await client.userRegistrations.generateChallenge.mutate({\n id: registration.id,\n workspaceName: __workspaceName,\n deviceData,\n });\n return challenge;\n },\n submitChallenge: ({ challengeResponse }) =>\n client.userRegistrations.submitChallenge.mutate({\n workspaceName: __workspaceName,\n id: registration.id,\n challengeResponse,\n }),\n });\n },\n } satisfies DecorateWithDeviceAndWorkspaceUnauthenticated<T>;\n },\n );\n }\n\n // DecorateWithApiUserAndWorkspaceUnauthenticated\n // -------------------------------------------------------------------------\n if (engine.__workspaceName && engine.__isApiUser && !engine.__apiAuth) {\n decorate<WithWorkspace & WithApiUser, DecorateWithApiUserAndWorkspaceUnauthenticated<T>>(\n (engine) => {\n const { client, __workspaceName } = engine;\n return {\n login: async function <T>(\n this: Engine<T>,\n credentials: {\n apiKeyId: string;\n apiKeySecret: string;\n },\n opts?: { correlationId?: string },\n ): Promise<Engine<T & WithApiAuth>> {\n const res = await client.auth.authenticate.mutate(\n {\n apiKeyId: credentials.apiKeyId,\n apiKeySecret: credentials.apiKeySecret,\n workspace: __workspaceName,\n },\n buildTrpcContext({ correlationId: opts?.correlationId }),\n );\n const withApiAuth: WithApiAuth = {\n __apiAuth: res,\n };\n const __authClient = engine.createClient({ apiAccessToken: res.accessToken });\n return decorateEngine({ ...this, client: __authClient, ...withApiAuth } as Engine<\n T & WithApiAuth\n >);\n },\n } satisfies DecorateWithApiUserAndWorkspaceUnauthenticated<T>;\n },\n );\n }\n\n // DecorateWithWorkspacePsdAuthenticated\n // -------------------------------------------------------------------------\n if (engine.device && engine.__workspaceName && engine.__psdToken) {\n decorate<WithDevice & WithWorkspace, DecorateWithWorkspacePsdAuthenticated>((engine) => {\n const { client, device } = engine;\n\n async function enforcePairing(): Promise<void> {\n if (await device.hasPairing()) return;\n const confidentialityKey = await device.getConfidentialityKey();\n const pairing = await client.debug.pairDevicePartition.mutate({\n confidentialityKeyCurve25519: confidentialityKey.confidentialityKeyCurve25519,\n confidentialityKeySignature: confidentialityKey.confidentialityKeySignature,\n });\n await device.setPairing({ pairing });\n }\n\n const approveChallenge = async (\n challenge: PsdChallenge,\n params?: ApproveRequestParams,\n ): Promise<string> => {\n await enforcePairing();\n await device.startKPatternAsResponder({\n handshake: challenge.handshake,\n handshakeAttestation: challenge.handshakeAttestation,\n partitionId: challenge.partitionId,\n });\n await params?.onScreenDisplayed?.();\n const signature = await device.validateVaultOperation({\n actions: challenge.wActions,\n });\n return signature;\n };\n\n return {\n approve: async (\n request: VaultRequestResponse,\n params?: ApproveRequestParams,\n ): Promise<VaultRequestResponse> => {\n const { challenge } = await client.requests.getChallenge.query({ id: request.id });\n invariant(challenge.challengeType === \"PSD\", \"Challenge type must be PSD\");\n const signature = await approveChallenge(challenge, params);\n return client.requests.approve.mutate(\n {\n id: request.id,\n data: { challengeType: \"PSD\", signature },\n },\n buildTrpcContext(params),\n );\n },\n\n approveChallenge,\n\n reject: (\n request: VaultRequestResponse,\n opts?: CorrelationIdOpts,\n ): Promise<VaultRequestResponse> => {\n return client.requests.reject.mutate(\n { id: request.id, data: null },\n buildTrpcContext(opts),\n );\n },\n } satisfies DecorateWithWorkspacePsdAuthenticated;\n });\n }\n\n // DecorateWithWorkspaceApiAuthenticated\n // -------------------------------------------------------------------------\n if (engine.__workspaceName && engine.__apiAuth) {\n decorate<WithWorkspace & WithApiAuth, DecorateWithWorkspaceApiAuthenticated>((engine) => {\n const { client } = engine;\n return {\n getChallenge: async (request: VaultRequestResponse): Promise<ApiChallenge[\"payload\"]> => {\n const { challenge } = await client.requests.getChallenge.query({ id: request.id });\n invariant(challenge.challengeType === \"API\", \"Challenge type must be API\");\n return challenge.payload;\n },\n\n approve: (\n request: VaultRequestResponse,\n signature: string,\n ): Promise<VaultRequestResponse> => {\n return client.requests.approve.mutate({\n id: request.id,\n data: { challengeType: \"API\", signature },\n });\n },\n\n reject: (\n request: VaultRequestResponse,\n signature: string,\n ): Promise<VaultRequestResponse> => {\n return client.requests.reject.mutate({\n id: request.id,\n data: { challengeType: \"API\", signature },\n });\n },\n } satisfies DecorateWithWorkspaceApiAuthenticated;\n });\n }\n\n return engine;\n }\n\n return {\n ...base,\n withDeviceIndex,\n withTransportId,\n withApiUser,\n withWorkspace,\n withOnboarding,\n };\n}\n","import { DisconnectedDevice, LockedDeviceError } from \"@ledgerhq/errors\";\nimport type Transport from \"@ledgerhq/hw-transport\";\nimport type { HsmCertificate } from \"@ledgerhq/revault-api\";\nimport invariant from \"invariant\";\nimport { from, lastValueFrom } from \"rxjs\";\n\nimport type { Logger } from \"@/logger\";\n\nimport {\n APPID_VAULT_ADMINISTRATOR,\n PAGINATED_STATUS,\n PATHS,\n SCRIPT_IDS,\n STATUS_LENGTH,\n STR_ROLES,\n STREAMING_NEXT_ACTION,\n STREAMING_RESPONSE,\n} from \"./constants\";\nimport { withDevicePolling } from \"./device-access\";\nimport type { Device } from \"./types\";\nimport { isTransportStatusError } from \"./utils\";\n\nconst MAX_CHUNK_LENGTH = 250;\n\ntype Options = {\n transportId: string;\n};\n\nconst FIXME_NOT_IMPLEMENTED =\n (fnName: string): (() => Promise<never>) =>\n async () => {\n throw new Error(`Not implemented: ${fnName}`);\n };\n\nconst getPathFromPathString = (pathString: string): number[] => {\n const parts = pathString.split(\"'/\").map((part) => parseInt(part, 10));\n return parts.map((part) => (part | 0x80000000) >>> 0);\n};\n\nconst splitChunks = (chunk: number, buffer: Buffer): Buffer[] => {\n const chunks = [];\n for (let i = 0, size = chunk; i < buffer.length; i += size, size = chunk) {\n chunks.push(buffer.slice(i, i + size));\n }\n return chunks;\n};\n\nconst removeStatus = (result: Buffer): Buffer => result.slice(0, result.length - STATUS_LENGTH);\n\nconst sendByChunk = async (\n transport: Transport,\n command: number[], // eg [0xe0, 0x45, 0x00, 0x00]\n data: Buffer,\n chunkSize: number = MAX_CHUNK_LENGTH,\n): Promise<Buffer> => {\n const chunks = splitChunks(chunkSize, data);\n let response = Buffer.from([]);\n for (let i = 0; i < chunks.length; i++) {\n const chunk = chunks[i];\n const apdu = [...command];\n // command is 0xe0,0x45,0x00,0x00 for first chunk, then it's 0xe0,0x45,0x80,0x00\n /* v8 ignore next -- @preserve */\n apdu[2] = i && 0x80;\n response = (await transport.send(apdu[0]!, apdu[1]!, apdu[2], apdu[3]!, chunk, [\n 0x9000,\n ...PAGINATED_STATUS,\n ])) as Buffer<ArrayBuffer>;\n }\n return response;\n};\n\nconst buildAttestation = (params: {\n handshake: string;\n handshakeAttestation: HsmCertificate;\n partitionId: string;\n}): Buffer => {\n const sigBuffer = Buffer.from(params.handshakeAttestation.signature, \"base64\");\n const sigLengthBuffer = Buffer.alloc(1);\n sigLengthBuffer.writeUIntBE(sigBuffer.length, 0, 1);\n\n const certBuffer = Buffer.from(params.handshakeAttestation.certificate, \"base64\");\n const certLengthBuffer = Buffer.alloc(1);\n certLengthBuffer.writeUIntBE(certBuffer.length, 0, 1);\n\n const pubBuffer = Buffer.from(params.handshakeAttestation.attestationPub, \"base64\");\n\n const certChainData = Buffer.concat([\n sigLengthBuffer,\n sigBuffer,\n pubBuffer,\n certLengthBuffer,\n certBuffer,\n ]);\n\n const cliMsgBuffer = Buffer.from(params.handshake, \"hex\");\n const cliMsgLengthBuffer = Buffer.alloc(1);\n cliMsgLengthBuffer.writeUIntBE(cliMsgBuffer.length, 0, 1);\n\n const pidBuffer = Buffer.from(params.partitionId, \"hex\");\n const pidLengthBuffer = Buffer.alloc(1);\n pidLengthBuffer.writeUIntBE(pidBuffer.length, 0, 1);\n\n const certChainDataLengthBuff = Buffer.alloc(2);\n certChainDataLengthBuff.writeUInt16BE(certChainData.length, 0);\n\n const data = Buffer.concat([\n cliMsgLengthBuffer,\n cliMsgBuffer,\n certChainDataLengthBuff,\n certChainData,\n pidLengthBuffer,\n pidBuffer,\n ]);\n\n const totalLengthBuffer = Buffer.alloc(2);\n totalLengthBuffer.writeUInt16BE(data.length, 0);\n\n const toSend = Buffer.concat([totalLengthBuffer, data]);\n\n return toSend;\n};\n\ntype RetryOnError = (err: Error) => boolean;\n/* v8 ignore next -- @preserve */\nconst genericRetryOnError: RetryOnError = (err) => {\n // device is locked\n if (err instanceof LockedDeviceError) return true;\n // user is on dashboard when receiving a Vault app apdu\n if (isTransportStatusError(err) && err.statusCode === 0x6d09) return true;\n // VG-24797 error that can happen in BLE in some situations (still unclear)\n if (err instanceof DisconnectedDevice) return true;\n\n // for everything else, we don't want to retry\n return false;\n};\n\nexport function createRealDevice(options: Options, logger: Logger): Device {\n const { transportId } = options;\n\n async function run<T>(\n job: (transport: Transport) => Promise<T>,\n retryOnError: RetryOnError = genericRetryOnError,\n ): Promise<T> {\n return lastValueFrom(\n withDevicePolling(transportId)<T>((transport) => from(job(transport)), retryOnError),\n );\n }\n\n /* v8 ignore next -- @preserve */\n const noRetry = (): boolean => false;\n /* v8 ignore next -- @preserve */\n const alwaysRetry = (): boolean => true;\n const poll = async (\n opts: { retryOnError?: RetryOnError } = {},\n ): Promise<{ isAppOpened: boolean }> => {\n // waiting for device to be turned on\n await run(\n // eslint-disable-next-line @typescript-eslint/no-empty-function\n async (_transport) => {},\n opts.retryOnError ?? alwaysRetry,\n );\n // checking if app is opened: should return directly on getPubKey\n try {\n await getPublicKey(PATHS.U2F, { secp256k1: true, retryOnError: noRetry });\n return { isAppOpened: true };\n } catch (err) {\n if (isTransportStatusError(err) && genericRetryOnError(err)) {\n return { isAppOpened: false };\n }\n throw err;\n }\n };\n\n const pollApp = async (appName: string): Promise<string> => {\n const res = await run((transport) =>\n transport.send(0xe0, 0xd8, 0x00, 0x00, Buffer.from(appName, \"utf8\")),\n );\n // little delay to give time to the app to be fully opened\n await new Promise((r) => setTimeout(r, 1e3));\n return res.toString(\"hex\");\n };\n\n const getPublicKey = async (\n pathString: string,\n { secp256k1, retryOnError }: { secp256k1: boolean; retryOnError?: RetryOnError },\n ): Promise<{ pubKey: string; signature: string }> => {\n logger.info(`[device] getPublicKey (${pathString})`);\n const path = getPathFromPathString(pathString);\n const data = Buffer.concat([\n Buffer.from([path.length]),\n ...path.map((derivation) => {\n const buf = Buffer.alloc(4);\n buf.writeUInt32BE(derivation, 0);\n return buf;\n }),\n ]);\n const curve = secp256k1 ? 0x01 : 0x02;\n const response = await run(\n (transport) => transport.send(0xe0, 0x40, curve, 0x00, data),\n retryOnError ?? genericRetryOnError,\n );\n const pubKeyLength = response.readInt8(0);\n const pubKey = response\n .slice(1, pubKeyLength + 1)\n .toString(\"hex\")\n .toUpperCase();\n const signature = response\n .slice(pubKeyLength + 1, response.length - STATUS_LENGTH)\n .toString(\"base64\");\n return { pubKey, signature };\n };\n\n const device: Device = {\n authenticate: async ({ challenge: { challenge, name, role, keyHandle }, workspaceName }) => {\n logger.info(`[device] Authenticate`);\n invariant(role !== \"READ_ONLY_API_KEY\", \"Invalid role for authenticate: READ_ONLY_API_KEY\");\n const applicationBuffer = Buffer.from(APPID_VAULT_ADMINISTRATOR, \"hex\");\n const nameBuffer = Buffer.from(name);\n const workspaceBuffer = Buffer.from(workspaceName);\n\n const keyHandleData = Buffer.concat([\n Buffer.from(STR_ROLES[role], \"hex\"),\n Buffer.from([nameBuffer.length]),\n nameBuffer,\n Buffer.from([workspaceBuffer.length]),\n workspaceBuffer,\n ]);\n\n const keyHandleDataLength = Buffer.alloc(2);\n keyHandleDataLength.writeUInt16BE(keyHandleData.length, 0);\n\n const data = Buffer.concat([\n Buffer.from(challenge, \"base64\"),\n applicationBuffer,\n Buffer.from([keyHandle.length]),\n Buffer.from(keyHandle, \"hex\"),\n keyHandleDataLength,\n keyHandleData,\n ]);\n\n const authentication = await run((transport) =>\n sendByChunk(transport, [0xe0, 0x02, 0x00, 0x00], data),\n );\n\n return removeStatus(authentication).toString(\"hex\");\n },\n\n finalizePairingHandshake: async (params: {\n handshake: string;\n partitionId: string;\n handshakeAttestation: HsmCertificate;\n }): Promise<string> => {\n const bufWithStatus = await run((transport) =>\n sendByChunk(transport, [0xe0, 0x47, 0x00, 0x02], buildAttestation(params)),\n );\n return removeStatus(bufWithStatus).toString(\"hex\");\n },\n\n generateSeedFragment: FIXME_NOT_IMPLEMENTED(\"generateSeedFragment\"),\n generateWrappingKeyFragment: FIXME_NOT_IMPLEMENTED(\"generateWrappingKeyFragment\"),\n getAttestation: async (): Promise<{\n attestation: {\n codeHash: string;\n attestationPub: string;\n certificate: string;\n };\n buffer: Buffer;\n }> => {\n const bufWithStatus = await run((transport) => transport.send(0xe0, 0x41, 0x00, 0x00));\n const buffer = removeStatus(bufWithStatus);\n const certLen = buffer.readInt8(32 + 65 + 1);\n return {\n attestation: {\n codeHash: buffer.slice(0, 32).toString(\"base64\"),\n attestationPub: buffer.slice(32, 32 + 65).toString(\"base64\"),\n certificate: buffer.slice(32 + 65, 32 + 65 + 2 + certLen).toString(\"base64\"),\n },\n buffer,\n };\n },\n getConfidentialityKey: async () => {\n logger.info(`[device] getConfidentialityKey`);\n const bufWithStatus = await run((transport) => transport.send(0xe0, 0x4d, 0x00, 0x00));\n const buf = removeStatus(bufWithStatus);\n const keyLength = buf[0]!;\n const key = buf.slice(1, 1 + keyLength);\n const sig = buf.slice(1 + keyLength + 1);\n return {\n confidentialityKeyCurve25519: key.toString(\"hex\"),\n confidentialityKeySignature: sig.toString(\"hex\"),\n };\n },\n getConfidentialityPubKey: () => getPublicKey(PATHS.CONFIDENTIALITY, { secp256k1: true }),\n getDeviceUserId: FIXME_NOT_IMPLEMENTED(\"getDeviceUserId\"),\n getU2FPubKey: () => getPublicKey(PATHS.U2F, { secp256k1: false }),\n getValidationPubKey: () => getPublicKey(PATHS.VALIDATION, { secp256k1: true }),\n hasPairing: async () => {\n logger.info(`[device] hasPairing`);\n const apdu = [0xe0, 0x51, 0x00, 0x00, 0xb5];\n const res = await run((transport) => transport.exchange(Buffer.from(apdu)));\n const hex = Buffer.from(res).toString(\"hex\");\n\n // 6f45 => this error means that there is no partition ID on the device\n // if no error, it means there is (at least) one\n //\n // 6a87 => TEMPORARY hack because Stax apparently does not implement\n // the \"get partition id\" APDU, so it returns \"incorrect length\"\n // easier to just assume that in this case there is no partition,\n // and try to insert one anyway (done on revault onboarding)\n //\n return hex !== \"6f45\" && hex !== \"6a87\";\n },\n\n initPairingHandshake: async (): Promise<{ pubKey: string; signature: string }> => {\n const res = await run((transport) => transport.send(0xe0, 0x46, 0x00, 0x00));\n const pubKeyLength = res.readInt8(0);\n const pubKey = res\n .slice(1, pubKeyLength + 1)\n .toString(\"hex\")\n .toUpperCase();\n const signature = res.slice(pubKeyLength + 1, res.length - STATUS_LENGTH).toString(\"base64\");\n return { pubKey, signature };\n },\n\n openSession: FIXME_NOT_IMPLEMENTED(\"openSession\"),\n\n register: async (params: {\n challenge: string;\n u2fRegisterData: string;\n name: string;\n role: \"ADMIN\" | \"SHARED_OWNER\" | \"OPERATOR\";\n }): Promise<{\n u2fRegister: Buffer;\n keyHandle: Buffer;\n rfu: number;\n pubKey: string;\n }> => {\n const { challenge: strChallenge, u2fRegisterData: _, name, role } = params;\n const challenge = Buffer.from(strChallenge, \"hex\");\n\n invariant(challenge.length === 32, \"challenge hex is expected to have 32 bytes\");\n const applicationBuf = Buffer.from(APPID_VAULT_ADMINISTRATOR, \"hex\");\n invariant(applicationBuf.length === 32, \"application hex is expected to have 32 bytes\");\n\n const userNameBuff = Buffer.from(name);\n\n const keyHandleData = Buffer.concat([\n Buffer.from(STR_ROLES[role], \"hex\"),\n Buffer.from([userNameBuff.length]),\n userNameBuff,\n ]);\n\n const keyHandleDataLength = Buffer.alloc(2);\n keyHandleDataLength.writeUInt16BE(keyHandleData.length, 0);\n\n const data = Buffer.concat([challenge, applicationBuf, keyHandleDataLength, keyHandleData]);\n\n const response = await run((transport) =>\n sendByChunk(transport, [0xe0, 0x01, 0x00, 0x00], data),\n );\n\n let i = 0;\n const rfu = response.slice(i, i + 1)[0]!;\n i += 1;\n const pubKey = response.slice(i, i + 65).toString(\"hex\");\n i += 65;\n const keyHandleLength = response.slice(i, i + 1)[0]!;\n i++;\n const keyHandle = response.slice(i, i + keyHandleLength);\n i += keyHandleLength;\n return {\n u2fRegister: removeStatus(response),\n keyHandle,\n rfu,\n pubKey,\n };\n },\n registerData: async (params: { challenge: string }): Promise<string> => {\n const { challenge: strChallenge } = params;\n const challenge = Buffer.from(strChallenge, \"hex\");\n invariant(challenge.length === 32, \"challenge hex is expected to have 32 bytes\");\n const response = await run((transport) => transport.send(0xe0, 0x03, 0x00, 0x00, challenge));\n return removeStatus(response).toString(\"hex\");\n },\n\n setPairing: async ({ pairing }) => {\n logger.info(`[device] setPairing`);\n const psdPayload = Buffer.from(pairing.blob, \"base64\");\n const length = Buffer.alloc(2);\n length.writeUInt16BE(psdPayload.length, 0);\n const final = Buffer.concat([length, psdPayload]);\n await run((transport) => sendByChunk(transport, [0xe0, 0x4e, 0x00, 0x00], final));\n },\n startKKPatternAsResponder: FIXME_NOT_IMPLEMENTED(\"startKKPatternAsResponder\"),\n startKPatternAsResponder: async (params) => {\n logger.info(`[device] startKPatternAsResponder`);\n const data = buildAttestation(params);\n await run((transport) =>\n sendByChunk(transport, [0xe0, 0x49, 0x00, SCRIPT_IDS.ACCOUNT_MANAGER_SESSION], data),\n );\n },\n validateVaultOperation: async (params) => {\n logger.info(`[device] validateVaultOperation`);\n const path = getPathFromPathString(PATHS.VALIDATION);\n const paths = Buffer.concat([\n Buffer.from([path.length]),\n ...path.map((derivation) => {\n const buf = Buffer.alloc(4);\n buf.writeUInt32BE(derivation, 0);\n return buf;\n }),\n ]);\n\n let nextActionId = 1;\n let finalResponse: Buffer | null = null;\n\n while (!finalResponse) {\n const screen = Buffer.from(params.actions[nextActionId - 1]!, \"base64\");\n const length = Buffer.alloc(2);\n length.writeUInt16BE(screen.length, 0);\n const data = Buffer.concat([paths, length, screen]);\n const response = await run((transport) =>\n sendByChunk(transport, [0xe0, 0x45, 0x00, 0x00], data),\n );\n const responseType = response.readInt8(0);\n let responseStatus = response.readUInt16BE(response.length - 2);\n switch (responseType) {\n case STREAMING_NEXT_ACTION:\n nextActionId = response.readUIntBE(1, 2);\n break;\n case STREAMING_RESPONSE:\n finalResponse = response.slice(3, response.length - 2);\n while (responseStatus !== 0x9000) {\n /* v8 ignore next -- @preserve */ {\n const resp = await run((transport) => transport.send(0x00, 0xc0, 0x00, 0x00));\n responseStatus = resp.readUInt16BE(resp.length - 2);\n finalResponse = Buffer.concat([finalResponse, removeStatus(resp)]);\n }\n }\n break;\n /* v8 ignore next -- @preserve */\n default:\n throw new Error(`Invalid response type: ${responseType}`);\n }\n }\n return finalResponse.toString(\"base64\");\n },\n\n sendAPDU: async (apduCommand: string) => {\n const res = await run((transport) => transport.exchange(Buffer.from(apduCommand, \"hex\")));\n return Buffer.from(res).toString(\"hex\");\n },\n getVersion: async () => {\n const res = await run((transport) => transport.send(0xb0, 0x01, 0x00, 0x00));\n const appNameLen = res.readInt8(1);\n const appVersionLen = res.readInt8(2 + appNameLen);\n const appVersionHex = res.slice(2 + 1 + appNameLen, 2 + appNameLen + appVersionLen + 1);\n\n const appVersion = Buffer.from(appVersionHex).toString();\n\n return appVersion;\n },\n poll,\n pollApp,\n };\n return device;\n}\n","import type { AppRouter } from \"@ledgerhq/revault-api\";\nimport { createTRPCClient, httpLink, type TRPCClient } from \"@trpc/client\";\nimport type { inferRouterInputs, inferRouterOutputs } from \"@trpc/server\";\nimport superjson from \"superjson\";\n\nexport type TRPCClientOptions = {\n baseUrl: string;\n debugAuthToken?: string;\n rootAuthToken?: string;\n apiAccessToken?: string;\n psdAuth?: string;\n};\n\nexport type RevaultApiTRPCClient = TRPCClient<AppRouter>;\n\nexport type RouterInputs = inferRouterInputs<AppRouter>;\nexport type RouterOutputs = inferRouterOutputs<AppRouter>;\n\nexport type TRPCContext = { context: Record<string, unknown> } | undefined;\n\nexport const createClient = (options: TRPCClientOptions): RevaultApiTRPCClient => {\n const trpc = createTRPCClient<AppRouter>({\n links: [\n httpLink({\n url: `${options.baseUrl}/trpc`,\n transformer: superjson,\n headers(opts) {\n // Extract headers from the operation context\n const contextHeaders = (opts.op.context?.headers as Record<string, string>) || {};\n\n return {\n ...(options.debugAuthToken\n ? { \"x-revault-debug-auth-token\": options.debugAuthToken }\n : {}),\n ...(options.rootAuthToken\n ? { \"x-revault-root-auth-token\": options.rootAuthToken }\n : {}),\n ...(options.psdAuth ? { Authorization: `PsdAuth ${options.psdAuth}` } : {}),\n ...(options.apiAccessToken\n ? { Authorization: `Bearer ${options.apiAccessToken}` }\n : {}),\n // Merge in any headers passed via context\n ...contextHeaders,\n };\n },\n }),\n ],\n });\n return trpc;\n};\n"],"mappings":"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","names":["invariant","withApiUser","withWorkspace","withOnboarding","engine","client","invariant"]}
|
package/lib/index.d.cts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
export { L as Logger } from './logger-C-TPbnjv.cjs';
|
|
2
|
-
export { R as RevaultApiTRPCClient, a as RouterInputs, b as RouterOutputs } from './types-
|
|
2
|
+
export { R as RevaultApiTRPCClient, a as RouterInputs, b as RouterOutputs, T as TRPCContext } from './types-CpGEbAxh.cjs';
|
|
3
3
|
export * from '@ledgerhq/revault-api';
|
|
4
4
|
import '@trpc/client';
|
|
5
5
|
import '@trpc/server';
|
package/lib/index.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
export { L as Logger } from './logger-C-TPbnjv.js';
|
|
2
|
-
export { R as RevaultApiTRPCClient, a as RouterInputs, b as RouterOutputs } from './types-
|
|
2
|
+
export { R as RevaultApiTRPCClient, a as RouterInputs, b as RouterOutputs, T as TRPCContext } from './types-CpGEbAxh.js';
|
|
3
3
|
export * from '@ledgerhq/revault-api';
|
|
4
4
|
import '@trpc/client';
|
|
5
5
|
import '@trpc/server';
|
package/lib/onboarding.d.cts
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import { OnboardingFullStateResponse, OnboardingStep } from '@ledgerhq/revault-api';
|
|
2
2
|
import { L as Logger } from './logger-C-TPbnjv.cjs';
|
|
3
|
-
import { E as Engine, W as WithOnboarding } from './types-
|
|
3
|
+
import { E as Engine, W as WithOnboarding } from './types-DOi2cwia.cjs';
|
|
4
4
|
import './types-DJfbanPz.cjs';
|
|
5
|
-
import './types-
|
|
5
|
+
import './types-CpGEbAxh.cjs';
|
|
6
6
|
import '@trpc/client';
|
|
7
7
|
import '@trpc/server';
|
|
8
8
|
|
package/lib/onboarding.d.ts
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import { OnboardingFullStateResponse, OnboardingStep } from '@ledgerhq/revault-api';
|
|
2
2
|
import { L as Logger } from './logger-C-TPbnjv.js';
|
|
3
|
-
import { E as Engine, W as WithOnboarding } from './types-
|
|
3
|
+
import { E as Engine, W as WithOnboarding } from './types-StrV0mJs.js';
|
|
4
4
|
import './types-DJfbanPz.js';
|
|
5
|
-
import './types-
|
|
5
|
+
import './types-CpGEbAxh.js';
|
|
6
6
|
import '@trpc/client';
|
|
7
7
|
import '@trpc/server';
|
|
8
8
|
|
|
@@ -12,5 +12,8 @@ type TRPCClientOptions = {
|
|
|
12
12
|
type RevaultApiTRPCClient = TRPCClient<AppRouter>;
|
|
13
13
|
type RouterInputs = inferRouterInputs<AppRouter>;
|
|
14
14
|
type RouterOutputs = inferRouterOutputs<AppRouter>;
|
|
15
|
+
type TRPCContext = {
|
|
16
|
+
context: Record<string, unknown>;
|
|
17
|
+
} | undefined;
|
|
15
18
|
|
|
16
|
-
export type { RevaultApiTRPCClient as R,
|
|
19
|
+
export type { RevaultApiTRPCClient as R, TRPCContext as T, RouterInputs as a, RouterOutputs as b, TRPCClientOptions as c };
|
|
@@ -12,5 +12,8 @@ type TRPCClientOptions = {
|
|
|
12
12
|
type RevaultApiTRPCClient = TRPCClient<AppRouter>;
|
|
13
13
|
type RouterInputs = inferRouterInputs<AppRouter>;
|
|
14
14
|
type RouterOutputs = inferRouterOutputs<AppRouter>;
|
|
15
|
+
type TRPCContext = {
|
|
16
|
+
context: Record<string, unknown>;
|
|
17
|
+
} | undefined;
|
|
15
18
|
|
|
16
|
-
export type { RevaultApiTRPCClient as R,
|
|
19
|
+
export type { RevaultApiTRPCClient as R, TRPCContext as T, RouterInputs as a, RouterOutputs as b, TRPCClientOptions as c };
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { VaultRequestResponse, PsdChallenge, ApiChallenge, UserRegistrationResponse, ClaimedRole, WrappingKeyResponse, OnboardingSeedChallenge } from '@ledgerhq/revault-api';
|
|
2
2
|
import { D as Device } from './types-DJfbanPz.cjs';
|
|
3
|
-
import { R as RevaultApiTRPCClient,
|
|
3
|
+
import { R as RevaultApiTRPCClient, c as TRPCClientOptions, b as RouterOutputs } from './types-CpGEbAxh.cjs';
|
|
4
4
|
|
|
5
5
|
type EngineOptions = {
|
|
6
6
|
/**
|
|
@@ -124,9 +124,12 @@ type DecorateWithWorkspaceUnauthenticated<T> = {
|
|
|
124
124
|
withPsdToken: (token: string) => Engine<T & WithPsdAuth>;
|
|
125
125
|
};
|
|
126
126
|
type DecorateWithWorkspaceAuthenticated<T> = T extends WithDevice ? DecorateWithWorkspacePsdAuthenticated : T extends WithApiUser ? DecorateWithWorkspaceApiAuthenticated : unknown;
|
|
127
|
-
type
|
|
128
|
-
|
|
127
|
+
type CorrelationIdOpts = {
|
|
128
|
+
correlationId?: string;
|
|
129
129
|
};
|
|
130
|
+
type ApproveRequestParams = {
|
|
131
|
+
onScreenDisplayed?: () => void | Promise<void>;
|
|
132
|
+
} & CorrelationIdOpts;
|
|
130
133
|
type DecorateWithWorkspacePsdAuthenticated = {
|
|
131
134
|
/**
|
|
132
135
|
* Approve the given request
|
|
@@ -161,7 +164,8 @@ type DecorateWithDeviceAndWorkspaceUnauthenticated<T> = {
|
|
|
161
164
|
*/
|
|
162
165
|
login: (opts?: {
|
|
163
166
|
validityDurationSecs?: number;
|
|
164
|
-
onScreenDisplayed?: () => void
|
|
167
|
+
onScreenDisplayed?: () => void | Promise<void>;
|
|
168
|
+
correlationId?: string;
|
|
165
169
|
}) => Promise<Engine<T & WithPsdAuth>>;
|
|
166
170
|
/**
|
|
167
171
|
* Register the current device
|
|
@@ -178,10 +182,12 @@ type DecorateWithApiUserAndWorkspaceUnauthenticated<T> = {
|
|
|
178
182
|
login: (credentials: {
|
|
179
183
|
apiKeyId: string;
|
|
180
184
|
apiKeySecret: string;
|
|
185
|
+
}, options?: {
|
|
186
|
+
correlationId?: string;
|
|
181
187
|
}) => Promise<Engine<T & WithApiAuth>>;
|
|
182
188
|
};
|
|
183
189
|
type WithApiAuth = {
|
|
184
190
|
__apiAuth: RouterOutputs["auth"]["authenticate"];
|
|
185
191
|
};
|
|
186
192
|
|
|
187
|
-
export type { ApproveRequestParams as A, DecorateWithDevice as D, Engine as E, RegisterOnboardingDeviceParams as R, WithOnboarding as W, EngineOptions as a, EngineBase as b, WithDevice as c, WithApiUser as d, DecorateWithDeviceAndOnboarding as e, WithWorkspace as f, DecorateWithWorkspace as g, DecorateWithWorkspaceUnauthenticated as h, DecorateWithWorkspacePsdAuthenticated as i, DecorateWithWorkspaceApiAuthenticated as j, DecorateWithDeviceAndWorkspaceUnauthenticated as k, WithPsdAuth as l, DecorateWithApiUserAndWorkspaceUnauthenticated as m, WithApiAuth as n };
|
|
193
|
+
export type { ApproveRequestParams as A, CorrelationIdOpts as C, DecorateWithDevice as D, Engine as E, RegisterOnboardingDeviceParams as R, WithOnboarding as W, EngineOptions as a, EngineBase as b, WithDevice as c, WithApiUser as d, DecorateWithDeviceAndOnboarding as e, WithWorkspace as f, DecorateWithWorkspace as g, DecorateWithWorkspaceUnauthenticated as h, DecorateWithWorkspacePsdAuthenticated as i, DecorateWithWorkspaceApiAuthenticated as j, DecorateWithDeviceAndWorkspaceUnauthenticated as k, WithPsdAuth as l, DecorateWithApiUserAndWorkspaceUnauthenticated as m, WithApiAuth as n };
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { VaultRequestResponse, PsdChallenge, ApiChallenge, UserRegistrationResponse, ClaimedRole, WrappingKeyResponse, OnboardingSeedChallenge } from '@ledgerhq/revault-api';
|
|
2
2
|
import { D as Device } from './types-DJfbanPz.js';
|
|
3
|
-
import { R as RevaultApiTRPCClient,
|
|
3
|
+
import { R as RevaultApiTRPCClient, c as TRPCClientOptions, b as RouterOutputs } from './types-CpGEbAxh.js';
|
|
4
4
|
|
|
5
5
|
type EngineOptions = {
|
|
6
6
|
/**
|
|
@@ -124,9 +124,12 @@ type DecorateWithWorkspaceUnauthenticated<T> = {
|
|
|
124
124
|
withPsdToken: (token: string) => Engine<T & WithPsdAuth>;
|
|
125
125
|
};
|
|
126
126
|
type DecorateWithWorkspaceAuthenticated<T> = T extends WithDevice ? DecorateWithWorkspacePsdAuthenticated : T extends WithApiUser ? DecorateWithWorkspaceApiAuthenticated : unknown;
|
|
127
|
-
type
|
|
128
|
-
|
|
127
|
+
type CorrelationIdOpts = {
|
|
128
|
+
correlationId?: string;
|
|
129
129
|
};
|
|
130
|
+
type ApproveRequestParams = {
|
|
131
|
+
onScreenDisplayed?: () => void | Promise<void>;
|
|
132
|
+
} & CorrelationIdOpts;
|
|
130
133
|
type DecorateWithWorkspacePsdAuthenticated = {
|
|
131
134
|
/**
|
|
132
135
|
* Approve the given request
|
|
@@ -161,7 +164,8 @@ type DecorateWithDeviceAndWorkspaceUnauthenticated<T> = {
|
|
|
161
164
|
*/
|
|
162
165
|
login: (opts?: {
|
|
163
166
|
validityDurationSecs?: number;
|
|
164
|
-
onScreenDisplayed?: () => void
|
|
167
|
+
onScreenDisplayed?: () => void | Promise<void>;
|
|
168
|
+
correlationId?: string;
|
|
165
169
|
}) => Promise<Engine<T & WithPsdAuth>>;
|
|
166
170
|
/**
|
|
167
171
|
* Register the current device
|
|
@@ -178,10 +182,12 @@ type DecorateWithApiUserAndWorkspaceUnauthenticated<T> = {
|
|
|
178
182
|
login: (credentials: {
|
|
179
183
|
apiKeyId: string;
|
|
180
184
|
apiKeySecret: string;
|
|
185
|
+
}, options?: {
|
|
186
|
+
correlationId?: string;
|
|
181
187
|
}) => Promise<Engine<T & WithApiAuth>>;
|
|
182
188
|
};
|
|
183
189
|
type WithApiAuth = {
|
|
184
190
|
__apiAuth: RouterOutputs["auth"]["authenticate"];
|
|
185
191
|
};
|
|
186
192
|
|
|
187
|
-
export type { ApproveRequestParams as A, DecorateWithDevice as D, Engine as E, RegisterOnboardingDeviceParams as R, WithOnboarding as W, EngineOptions as a, EngineBase as b, WithDevice as c, WithApiUser as d, DecorateWithDeviceAndOnboarding as e, WithWorkspace as f, DecorateWithWorkspace as g, DecorateWithWorkspaceUnauthenticated as h, DecorateWithWorkspacePsdAuthenticated as i, DecorateWithWorkspaceApiAuthenticated as j, DecorateWithDeviceAndWorkspaceUnauthenticated as k, WithPsdAuth as l, DecorateWithApiUserAndWorkspaceUnauthenticated as m, WithApiAuth as n };
|
|
193
|
+
export type { ApproveRequestParams as A, CorrelationIdOpts as C, DecorateWithDevice as D, Engine as E, RegisterOnboardingDeviceParams as R, WithOnboarding as W, EngineOptions as a, EngineBase as b, WithDevice as c, WithApiUser as d, DecorateWithDeviceAndOnboarding as e, WithWorkspace as f, DecorateWithWorkspace as g, DecorateWithWorkspaceUnauthenticated as h, DecorateWithWorkspacePsdAuthenticated as i, DecorateWithWorkspaceApiAuthenticated as j, DecorateWithDeviceAndWorkspaceUnauthenticated as k, WithPsdAuth as l, DecorateWithApiUserAndWorkspaceUnauthenticated as m, WithApiAuth as n };
|
package/lib/types.d.cts
CHANGED
package/lib/types.d.ts
CHANGED