@ledgerhq/revault-sdk 0.12.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (45) hide show
  1. package/LICENSE.md +202 -0
  2. package/README.md +18 -0
  3. package/lib/bake.cjs +812 -0
  4. package/lib/bake.cjs.map +1 -0
  5. package/lib/bake.d.cts +2659 -0
  6. package/lib/bake.d.ts +2659 -0
  7. package/lib/bake.js +812 -0
  8. package/lib/bake.js.map +1 -0
  9. package/lib/chunk-DPHEFR6E.js +493 -0
  10. package/lib/chunk-DPHEFR6E.js.map +1 -0
  11. package/lib/chunk-QOP5LA3E.cjs +35 -0
  12. package/lib/chunk-QOP5LA3E.cjs.map +1 -0
  13. package/lib/chunk-VCAQTGQE.cjs +493 -0
  14. package/lib/chunk-VCAQTGQE.cjs.map +1 -0
  15. package/lib/chunk-VHZJP75X.js +35 -0
  16. package/lib/chunk-VHZJP75X.js.map +1 -0
  17. package/lib/device.cjs +13 -0
  18. package/lib/device.cjs.map +1 -0
  19. package/lib/device.d.cts +50 -0
  20. package/lib/device.d.ts +50 -0
  21. package/lib/device.js +13 -0
  22. package/lib/device.js.map +1 -0
  23. package/lib/engine.cjs +704 -0
  24. package/lib/engine.cjs.map +1 -0
  25. package/lib/engine.d.cts +18 -0
  26. package/lib/engine.d.ts +18 -0
  27. package/lib/engine.js +704 -0
  28. package/lib/engine.js.map +1 -0
  29. package/lib/index.cjs +1 -0
  30. package/lib/index.cjs.map +1 -0
  31. package/lib/index.d.cts +13 -0
  32. package/lib/index.d.ts +13 -0
  33. package/lib/index.js +1 -0
  34. package/lib/index.js.map +1 -0
  35. package/lib/onboarding.cjs +160 -0
  36. package/lib/onboarding.cjs.map +1 -0
  37. package/lib/onboarding.d.cts +1735 -0
  38. package/lib/onboarding.d.ts +1735 -0
  39. package/lib/onboarding.js +160 -0
  40. package/lib/onboarding.js.map +1 -0
  41. package/lib/types-BYNH6EdK.d.cts +199 -0
  42. package/lib/types-CsvE9Mlb.d.cts +159 -0
  43. package/lib/types-CsvE9Mlb.d.ts +159 -0
  44. package/lib/types-DHZzeq9X.d.ts +199 -0
  45. package/package.json +75 -0
@@ -0,0 +1,160 @@
1
+ // src/onboarding.ts
2
+ var roleLabels = {
3
+ WRAPPING_KEY_OWNER: "Wrapping Key",
4
+ MASTER_ADMIN: "Admin",
5
+ SHARED_OWNER: "Shared Owner"
6
+ };
7
+ var STEPS = {
8
+ /**
9
+ * Devices claiming
10
+ */
11
+ PENDING_DEVICE_CLAIMS: async ({ state, engine }, logger) => {
12
+ const roles = ["WRAPPING_KEY_OWNER", "MASTER_ADMIN", "SHARED_OWNER"];
13
+ const promises = [];
14
+ for (const role of roles) {
15
+ const roleIndex = roles.indexOf(role);
16
+ const nbAlreadyClaimed = state.claimedDevices.filter((c) => c.role === role).length;
17
+ for (let i = nbAlreadyClaimed; i < 3; i++) {
18
+ const index = roleIndex * 3 + i + 1;
19
+ const deviceName = `${roleLabels[role]} ${index}`;
20
+ const promise = engine.withDeviceIndex(index).claimDevice({ role, deviceName }).then(() => logger.info(`Claimed ${deviceName}`));
21
+ promises.push(promise);
22
+ }
23
+ }
24
+ await Promise.all(promises);
25
+ return engine.client.onboarding.commitDeviceClaims.mutate({ onboardingId: state.id });
26
+ },
27
+ /**
28
+ * Wrapping Key provisioning
29
+ */
30
+ PENDING_WRAPPING_KEY_PROVISIONING: async ({ state, engine }, logger) => {
31
+ const { id: onboardingId } = state;
32
+ state = await engine.client.onboarding.startWrappingKeyProvisioning.mutate({ onboardingId });
33
+ const wrappingKey = state.wrappingKey;
34
+ const toCollect = state.claimedDevices.filter((claimed) => {
35
+ if (claimed.role !== "WRAPPING_KEY_OWNER") return false;
36
+ const inFragment = !!state.wrappingKey?.fragments.find((f) => f.pubKey === claimed.pubKey);
37
+ return !inFragment;
38
+ }).map((c) => Number(c.deviceName.replace(roleLabels.WRAPPING_KEY_OWNER, "")));
39
+ await Promise.all(
40
+ toCollect.map(
41
+ (index) => engine.withDeviceIndex(index).collectWrappingKeyFragment(wrappingKey).then(() => logger.info(`Collected Wrapping Key ${index}`))
42
+ )
43
+ );
44
+ return engine.client.onboarding.commitWrappingKey.mutate({ onboardingId });
45
+ },
46
+ /**
47
+ * Init Master Admins registration
48
+ */
49
+ PENDING_MASTER_ADMINS_REGISTRATION_INIT: async ({ engine, state }) => engine.client.onboarding.startMasterAdminsRegistration.mutate({ onboardingId: state.id }),
50
+ /**
51
+ * Master Admins registration
52
+ */
53
+ PENDING_MASTER_ADMINS_REGISTRATION: async ({ state, engine }, logger) => {
54
+ const { id: onboardingId } = state;
55
+ const toRegister = state.claimedDevices.filter((claimed) => {
56
+ if (claimed.role !== "MASTER_ADMIN") return false;
57
+ const hasRegistered = !!state.masterAdmins.find((a) => a.pubKey === claimed.pubKey);
58
+ return !hasRegistered;
59
+ }).map((c) => Number(c.deviceName.replace(roleLabels.MASTER_ADMIN, "")));
60
+ await Promise.all(
61
+ toRegister.map(async (index) => {
62
+ const name = `${roleLabels.MASTER_ADMIN} ${index}`;
63
+ await engine.withDeviceIndex(index).registerDevice({ role: "ADMIN", name });
64
+ logger.info(`Registered ${name}`);
65
+ })
66
+ );
67
+ return engine.client.onboarding.createMasterAdminGroup.mutate({ onboardingId });
68
+ },
69
+ /**
70
+ * Init Shared Owners registration
71
+ */
72
+ PENDING_SHARED_OWNERS_REGISTRATION_INIT: async ({ engine, state }) => engine.client.onboarding.startSharedOwnersRegistration.mutate({ onboardingId: state.id }),
73
+ /**
74
+ * Shared Owners registration
75
+ */
76
+ PENDING_SHARED_OWNERS_REGISTRATION: async ({ state, engine }, logger) => {
77
+ const { id: onboardingId } = state;
78
+ const toRegister = state.claimedDevices.filter((claimed) => {
79
+ if (claimed.role !== "SHARED_OWNER") return false;
80
+ const hasRegistered = !!state.sharedOwners.find((a) => a.pubKey === claimed.pubKey);
81
+ return !hasRegistered;
82
+ }).map((c) => Number(c.deviceName.replace(roleLabels.SHARED_OWNER, "")));
83
+ await Promise.all(
84
+ toRegister.map(async (index) => {
85
+ const name = `${roleLabels.SHARED_OWNER} ${index}`;
86
+ await engine.withDeviceIndex(index).registerDevice({ role: "SHARED_OWNER", name });
87
+ logger.info(`Registered ${name}`);
88
+ })
89
+ );
90
+ return engine.client.onboarding.commitSharedOwnersRegistration.mutate({ onboardingId });
91
+ },
92
+ /**
93
+ * Review by master admins
94
+ */
95
+ PENDING_REVIEW_BY_MASTER_ADMINS: async ({ state, engine }, logger) => {
96
+ const { id: onboardingId } = state;
97
+ state = await engine.client.onboarding.startReviewByMasterAdmins.mutate({ onboardingId });
98
+ const toCollect = state.masterAdmins.filter((admin) => !admin.review?.signature);
99
+ await Promise.all(
100
+ toCollect.map(async (admin) => {
101
+ const index = Number(admin.name.replace(roleLabels.MASTER_ADMIN, ""));
102
+ const challenge = admin.review.challenge;
103
+ await engine.withDeviceIndex(index).reviewSharedOwner(challenge);
104
+ logger.info(`Approved with ${admin.name}`);
105
+ })
106
+ );
107
+ return engine.client.onboarding.commitReviewByMasterAdmins.mutate({ onboardingId });
108
+ },
109
+ /**
110
+ * Seed provisioning
111
+ */
112
+ PENDING_SEED_PROVISIONING: async ({ state, engine }, logger) => {
113
+ const { id: onboardingId } = state;
114
+ state = await engine.client.onboarding.startSeedProvisioning.mutate({ onboardingId });
115
+ const toCollect = state.sharedOwners.filter((so) => !so.review?.seedFragment);
116
+ await Promise.all(
117
+ toCollect.map(async (so) => {
118
+ const index = Number(so.name.replace(roleLabels.SHARED_OWNER, ""));
119
+ const challenge = so.review.seedChallenge;
120
+ await engine.withDeviceIndex(index).collectSeedFragment(challenge);
121
+ logger.info(`Collected fragment for ${so.name}`);
122
+ })
123
+ );
124
+ return engine.client.onboarding.commitSeedProvisioning.mutate({ onboardingId });
125
+ },
126
+ /**
127
+ * Workspace initialization
128
+ */
129
+ PENDING_WORKSPACE_INITIALIZATION: async ({ state, engine }) => engine.client.onboarding.initializeWorkspace.mutate({ onboardingId: state.id }),
130
+ /**
131
+ * Onboarding completed
132
+ */
133
+ COMPLETED: async ({ state }) => state
134
+ };
135
+ var STEPS_LIST = Object.values(STEPS);
136
+ async function onboard({
137
+ engine,
138
+ untilStep
139
+ }, logger) {
140
+ const { __onboardingId } = engine;
141
+ logger.info(`Joining onboarding ${__onboardingId}`);
142
+ let state = await engine.client.onboarding.getOnboarding.query({
143
+ onboardingId: __onboardingId
144
+ });
145
+ for (const step of STEPS_LIST.slice(STEPS_LIST.indexOf(STEPS[state.step]))) {
146
+ if (untilStep && state.step === untilStep) {
147
+ logger.info("Skipping the rest of the onboarding");
148
+ break;
149
+ }
150
+ const index = STEPS_LIST.indexOf(step);
151
+ const stepProgress = `${(index + 1).toString().padStart(2, "0")}/${STEPS_LIST.length}`;
152
+ logger.info(`(${stepProgress}) ${step.name}`);
153
+ state = await step({ engine, state }, logger);
154
+ }
155
+ }
156
+ export {
157
+ STEPS,
158
+ onboard
159
+ };
160
+ //# sourceMappingURL=onboarding.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/onboarding.ts"],"sourcesContent":["import type {\n ClaimedRole,\n OnboardingFullStateResponse,\n OnboardingStep,\n} from \"@ledgerhq/revault-api\";\n\nimport type { Logger } from \"@/types\";\n\nimport type { Engine, WithOnboarding } from \"./engine/types\";\n\ntype StepAction = (\n options: {\n engine: Engine<WithOnboarding>;\n state: OnboardingFullStateResponse;\n },\n logger: Logger,\n) => Promise<OnboardingFullStateResponse>;\n\nconst roleLabels: Record<ClaimedRole, string> = {\n WRAPPING_KEY_OWNER: \"Wrapping Key\",\n MASTER_ADMIN: \"Admin\",\n SHARED_OWNER: \"Shared Owner\",\n};\n\nexport const STEPS = {\n /**\n * Devices claiming\n */\n PENDING_DEVICE_CLAIMS: async ({ state, engine }, logger) => {\n const roles: ClaimedRole[] = [\"WRAPPING_KEY_OWNER\", \"MASTER_ADMIN\", \"SHARED_OWNER\"];\n const promises: Promise<void>[] = [];\n for (const role of roles) {\n const roleIndex = roles.indexOf(role);\n const nbAlreadyClaimed = state.claimedDevices.filter((c) => c.role === role).length;\n for (let i = nbAlreadyClaimed; i < 3; i++) {\n const index = roleIndex * 3 + i + 1;\n const deviceName = `${roleLabels[role]} ${index}`;\n const promise = engine\n .withDeviceIndex(index)\n .claimDevice({ role, deviceName })\n .then(() => logger.info(`Claimed ${deviceName}`));\n promises.push(promise);\n }\n }\n await Promise.all(promises);\n return engine.client.onboarding.commitDeviceClaims.mutate({ onboardingId: state.id });\n },\n\n /**\n * Wrapping Key provisioning\n */\n PENDING_WRAPPING_KEY_PROVISIONING: async ({ state, engine }, logger) => {\n const { id: onboardingId } = state;\n state = await engine.client.onboarding.startWrappingKeyProvisioning.mutate({ onboardingId });\n const wrappingKey = state.wrappingKey!;\n const toCollect = state.claimedDevices\n .filter((claimed) => {\n if (claimed.role !== \"WRAPPING_KEY_OWNER\") return false;\n const inFragment = !!state.wrappingKey?.fragments.find((f) => f.pubKey === claimed.pubKey);\n return !inFragment;\n })\n .map((c) => Number(c.deviceName.replace(roleLabels.WRAPPING_KEY_OWNER, \"\")));\n await Promise.all(\n toCollect.map((index) =>\n engine\n .withDeviceIndex(index)\n .collectWrappingKeyFragment(wrappingKey)\n .then(() => logger.info(`Collected Wrapping Key ${index}`)),\n ),\n );\n return engine.client.onboarding.commitWrappingKey.mutate({ onboardingId });\n },\n\n /**\n * Init Master Admins registration\n */\n PENDING_MASTER_ADMINS_REGISTRATION_INIT: async ({ engine, state }) =>\n engine.client.onboarding.startMasterAdminsRegistration.mutate({ onboardingId: state.id }),\n\n /**\n * Master Admins registration\n */\n PENDING_MASTER_ADMINS_REGISTRATION: async ({ state, engine }, logger) => {\n const { id: onboardingId } = state;\n const toRegister = state.claimedDevices\n .filter((claimed) => {\n if (claimed.role !== \"MASTER_ADMIN\") return false;\n const hasRegistered = !!state.masterAdmins.find((a) => a.pubKey === claimed.pubKey);\n return !hasRegistered;\n })\n .map((c) => Number(c.deviceName.replace(roleLabels.MASTER_ADMIN, \"\")));\n await Promise.all(\n toRegister.map(async (index) => {\n const name = `${roleLabels.MASTER_ADMIN} ${index}`;\n await engine.withDeviceIndex(index).registerDevice({ role: \"ADMIN\", name });\n logger.info(`Registered ${name}`);\n }),\n );\n return engine.client.onboarding.createMasterAdminGroup.mutate({ onboardingId });\n },\n\n /**\n * Init Shared Owners registration\n */\n PENDING_SHARED_OWNERS_REGISTRATION_INIT: async ({ engine, state }) =>\n engine.client.onboarding.startSharedOwnersRegistration.mutate({ onboardingId: state.id }),\n\n /**\n * Shared Owners registration\n */\n PENDING_SHARED_OWNERS_REGISTRATION: async ({ state, engine }, logger) => {\n const { id: onboardingId } = state;\n const toRegister = state.claimedDevices\n .filter((claimed) => {\n if (claimed.role !== \"SHARED_OWNER\") return false;\n const hasRegistered = !!state.sharedOwners.find((a) => a.pubKey === claimed.pubKey);\n return !hasRegistered;\n })\n .map((c) => Number(c.deviceName.replace(roleLabels.SHARED_OWNER, \"\")));\n await Promise.all(\n toRegister.map(async (index) => {\n const name = `${roleLabels.SHARED_OWNER} ${index}`;\n await engine.withDeviceIndex(index).registerDevice({ role: \"SHARED_OWNER\", name });\n logger.info(`Registered ${name}`);\n }),\n );\n return engine.client.onboarding.commitSharedOwnersRegistration.mutate({ onboardingId });\n },\n\n /**\n * Review by master admins\n */\n PENDING_REVIEW_BY_MASTER_ADMINS: async ({ state, engine }, logger) => {\n const { id: onboardingId } = state;\n state = await engine.client.onboarding.startReviewByMasterAdmins.mutate({ onboardingId });\n const toCollect = state.masterAdmins.filter((admin) => !admin.review?.signature);\n await Promise.all(\n toCollect.map(async (admin) => {\n const index = Number(admin.name.replace(roleLabels.MASTER_ADMIN, \"\"));\n const challenge = admin.review!.challenge;\n await engine.withDeviceIndex(index).reviewSharedOwner(challenge);\n logger.info(`Approved with ${admin.name}`);\n }),\n );\n return engine.client.onboarding.commitReviewByMasterAdmins.mutate({ onboardingId });\n },\n\n /**\n * Seed provisioning\n */\n PENDING_SEED_PROVISIONING: async ({ state, engine }, logger) => {\n const { id: onboardingId } = state;\n state = await engine.client.onboarding.startSeedProvisioning.mutate({ onboardingId });\n const toCollect = state.sharedOwners.filter((so) => !so.review?.seedFragment);\n await Promise.all(\n toCollect.map(async (so) => {\n const index = Number(so.name.replace(roleLabels.SHARED_OWNER, \"\"));\n const challenge = so.review!.seedChallenge;\n await engine.withDeviceIndex(index).collectSeedFragment(challenge);\n logger.info(`Collected fragment for ${so.name}`);\n }),\n );\n return engine.client.onboarding.commitSeedProvisioning.mutate({ onboardingId });\n },\n\n /**\n * Workspace initialization\n */\n PENDING_WORKSPACE_INITIALIZATION: async ({ state, engine }) =>\n engine.client.onboarding.initializeWorkspace.mutate({ onboardingId: state.id }),\n\n /**\n * Onboarding completed\n */\n COMPLETED: async ({ state }) => state,\n} as const satisfies Record<OnboardingStep, StepAction>;\n\nconst STEPS_LIST = Object.values(STEPS);\n\nexport async function onboard(\n {\n engine,\n untilStep,\n }: {\n engine: Engine<WithOnboarding>;\n untilStep?: OnboardingStep;\n },\n logger: Logger,\n): Promise<void> {\n const { __onboardingId } = engine;\n logger.info(`Joining onboarding ${__onboardingId}`);\n let state = await engine.client.onboarding.getOnboarding.query({\n onboardingId: __onboardingId,\n });\n\n for (const step of STEPS_LIST.slice(STEPS_LIST.indexOf(STEPS[state.step]))) {\n if (untilStep && state.step === untilStep) {\n logger.info(\"Skipping the rest of the onboarding\");\n break;\n }\n const index = STEPS_LIST.indexOf(step);\n const stepProgress = `${(index + 1).toString().padStart(2, \"0\")}/${STEPS_LIST.length}`;\n logger.info(`(${stepProgress}) ${step.name}`);\n state = await step({ engine, state }, logger);\n }\n}\n"],"mappings":"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","names":[]}
@@ -0,0 +1,199 @@
1
+ import { AppRouter, VaultRequestResponse, ApiChallenge, PsdUserCreationVaultRequestResponse, ClaimedRole, WrappingKeyResponse, PsdChallenge, OnboardingSeedChallenge } from '@ledgerhq/revault-api';
2
+ import { D as Device } from './types-CsvE9Mlb.cjs';
3
+ import { TRPCClient } from '@trpc/client';
4
+ import { inferRouterOutputs, inferRouterInputs } from '@trpc/server';
5
+
6
+ type TRPCClientOptions = {
7
+ baseUrl: string;
8
+ debugAuthToken?: string;
9
+ rootAuthToken?: string;
10
+ apiAccessToken?: string;
11
+ psdAuth?: string;
12
+ };
13
+ type RevaultApiTRPCClient = TRPCClient<AppRouter>;
14
+ type RouterInputs = inferRouterInputs<AppRouter>;
15
+ type RouterOutputs = inferRouterOutputs<AppRouter>;
16
+
17
+ type EngineOptions = {
18
+ /**
19
+ * revault-api URL
20
+ */
21
+ baseUrl: string;
22
+ /**
23
+ * device-api URL
24
+ */
25
+ deviceApiUrl: string;
26
+ /**
27
+ * salt used by device-api
28
+ */
29
+ salt: string;
30
+ /**
31
+ * seed generation function used for device-api device spawn
32
+ */
33
+ genSeed: (p: {
34
+ salt: string;
35
+ index: number;
36
+ }) => string;
37
+ };
38
+ type EngineBase = {
39
+ /**
40
+ * revault-api client
41
+ */
42
+ client: RevaultApiTRPCClient;
43
+ /**
44
+ * Create a new revault-api client with the given options overriding the base ones
45
+ */
46
+ createClient: (opts: Partial<TRPCClientOptions>) => RevaultApiTRPCClient;
47
+ };
48
+ type EnhanceWithDevice<T> = T extends WithDevice | WithApiUser ? unknown : {
49
+ /**
50
+ * Mark the engine as targeting the given transport id for PSD communication.
51
+ * See `@ledgerhq/hw-transport` for more information.
52
+ *
53
+ * @param string transportId
54
+ */
55
+ withTransportId: (transportId: string) => Engine<T & WithDevice>;
56
+ /**
57
+ * Mark the engine as using device-api (for dev & test purposes) with the given device index.
58
+ *
59
+ * @param number deviceIndex
60
+ */
61
+ withDeviceIndex: (deviceIndex: number) => Engine<T & WithDevice>;
62
+ };
63
+ type EnhanceWithApiUser<T> = T extends WithDevice | WithApiUser | WithOnboarding ? unknown : {
64
+ /**
65
+ * Mark the engine as targeting API user
66
+ */
67
+ withApiUser: () => Engine<T & WithApiUser>;
68
+ };
69
+ type EnhanceWithOnboarding<T> = T extends WithOnboarding | WithWorkspace | WithApiUser ? unknown : {
70
+ /**
71
+ * Target the given onboarding id
72
+ *
73
+ * @param string Onboarding id
74
+ */
75
+ withOnboarding: (onboardingId: string) => Engine<T & WithOnboarding>;
76
+ };
77
+ type EnhanceWithWorkspace<T> = T extends WithWorkspace | WithOnboarding ? unknown : {
78
+ /**
79
+ * Target the given workspace
80
+ *
81
+ * @param string Workspace name
82
+ */
83
+ withWorkspace: (workspaceName: string) => Engine<T & WithWorkspace>;
84
+ };
85
+ type Decorate<T, TCond, TExtend> = T extends TCond ? TExtend : unknown;
86
+ type Engine<T = unknown> = T & EngineBase & EnhanceWithDevice<T> & EnhanceWithApiUser<T> & EnhanceWithOnboarding<T> & EnhanceWithWorkspace<T> & Decorate<T, WithDevice, DecorateWithDevice<T>> & Decorate<T, WithWorkspace, DecorateWithWorkspace<T>> & Decorate<T, WithDevice & WithOnboarding, DecorateWithDeviceAndOnboarding>;
87
+ type WithDevice = {
88
+ device: Device;
89
+ };
90
+ type DecorateWithDevice<T> = T extends WithWorkspace ? unknown : {
91
+ getWorkspaces: () => Promise<string[]>;
92
+ };
93
+ type WithApiUser = {
94
+ __isApiUser: true;
95
+ };
96
+ type RegisterOnboardingDeviceParams = {
97
+ role: "ADMIN" | "SHARED_OWNER";
98
+ name: string;
99
+ };
100
+ type WithOnboarding = {
101
+ __onboardingId: string;
102
+ };
103
+ type DecorateWithDeviceAndOnboarding = {
104
+ /**
105
+ * Claim the device as part of the onboarding
106
+ */
107
+ claimDevice: (p: {
108
+ role: ClaimedRole;
109
+ deviceName: string;
110
+ }) => Promise<void>;
111
+ /**
112
+ * Collect fragment of wrapping key
113
+ */
114
+ collectWrappingKeyFragment: (wrappingKey: WrappingKeyResponse) => Promise<void>;
115
+ /**
116
+ * Register device (either Admin or Shared-Owner)
117
+ */
118
+ registerDevice: (p: RegisterOnboardingDeviceParams) => Promise<void>;
119
+ /**
120
+ * Review Shared-Owner with Admin
121
+ */
122
+ reviewSharedOwner: (challenge: PsdChallenge) => Promise<void>;
123
+ /**
124
+ * Collect master seed fragment
125
+ */
126
+ collectSeedFragment: (challenge: OnboardingSeedChallenge) => Promise<void>;
127
+ };
128
+ type WithWorkspace = {
129
+ __workspaceName: string;
130
+ };
131
+ type DecorateWithWorkspace<T> = T extends WithPsdAuth | WithApiAuth ? DecorateWithWorkspaceAuthenticated<T> : DecorateWithWorkspaceUnauthenticated<T> & (T extends WithDevice ? DecorateWithDeviceAndWorkspaceUnauthenticated<T> : T extends WithApiUser ? DecorateWithApiUserAndWorkspaceUnauthenticated<T> : unknown);
132
+ type DecorateWithWorkspaceUnauthenticated<T> = {
133
+ /**
134
+ * Directly pass a PsdAuth token
135
+ */
136
+ withPsdToken: (token: string) => Engine<T & WithPsdAuth>;
137
+ };
138
+ type DecorateWithWorkspaceAuthenticated<T> = T extends WithDevice ? DecorateWithWorkspacePsdAuthenticated : T extends WithApiUser ? DecorateWithWorkspaceApiAuthenticated : unknown;
139
+ type ApproveRequestParams = {
140
+ onScreenDisplayed?: () => void;
141
+ };
142
+ type DecorateWithWorkspacePsdAuthenticated = {
143
+ /**
144
+ * Approve the given request
145
+ */
146
+ approve: (request: VaultRequestResponse, params?: ApproveRequestParams) => Promise<VaultRequestResponse>;
147
+ /**
148
+ * Reject the given request
149
+ */
150
+ reject: (request: VaultRequestResponse) => Promise<VaultRequestResponse>;
151
+ };
152
+ type DecorateWithWorkspaceApiAuthenticated = {
153
+ /**
154
+ * Get API challenge for the given request
155
+ */
156
+ getChallenge: (request: VaultRequestResponse) => Promise<ApiChallenge["payload"]>;
157
+ /**
158
+ * Approve the given request
159
+ */
160
+ approve: (request: VaultRequestResponse, signature: string) => Promise<VaultRequestResponse>;
161
+ /**
162
+ * Reject the given request
163
+ */
164
+ reject: (request: VaultRequestResponse, signature: string) => Promise<VaultRequestResponse>;
165
+ };
166
+ type DecorateWithDeviceAndWorkspaceUnauthenticated<T> = {
167
+ /**
168
+ * Login using the workspace & device that the engine are targeting
169
+ */
170
+ login: (opts?: {
171
+ validityDurationSecs?: number;
172
+ onScreenDisplayed?: () => void;
173
+ }) => Promise<Engine<T & WithPsdAuth>>;
174
+ /**
175
+ * Register the current device
176
+ */
177
+ register: (p: {
178
+ requestId: string;
179
+ role: "ADMIN" | "OPERATOR";
180
+ name: string;
181
+ }) => Promise<PsdUserCreationVaultRequestResponse>;
182
+ };
183
+ type WithPsdAuth = {
184
+ __psdToken: string;
185
+ };
186
+ type DecorateWithApiUserAndWorkspaceUnauthenticated<T> = {
187
+ /**
188
+ * Login using the workspace that the engine target and the given credentials
189
+ */
190
+ login: (credentials: {
191
+ apiKeyId: string;
192
+ apiKeySecret: string;
193
+ }) => Promise<Engine<T & WithApiAuth>>;
194
+ };
195
+ type WithApiAuth = {
196
+ __apiAuth: RouterOutputs["auth"]["authenticate"];
197
+ };
198
+
199
+ 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, RouterInputs as o };
@@ -0,0 +1,159 @@
1
+ import { PsdAuthChallengeResponse, PubKey, HsmCertificate, PsdPairingData } from '@ledgerhq/revault-api';
2
+
3
+ type Device = {
4
+ /**
5
+ * Authenticate (resolve challenge for login)
6
+ */
7
+ authenticate: (opts: {
8
+ challenge: PsdAuthChallengeResponse;
9
+ workspaceName: string;
10
+ }) => Promise<string>;
11
+ /**
12
+ * Finalize pairing
13
+ */
14
+ finalizePairingHandshake: (opts: {
15
+ handshake: string;
16
+ ciphertext: string;
17
+ }) => Promise<string>;
18
+ /**
19
+ * Generate seed fragment from Shared-Owner device
20
+ */
21
+ generateSeedFragment: () => Promise<string>;
22
+ /**
23
+ * Generate Wrapping Key fragment from Wrapping-Key Owner device
24
+ */
25
+ generateWrappingKeyFragment: () => Promise<string>;
26
+ /**
27
+ * Get device attestation
28
+ */
29
+ getAttestation: () => Promise<{
30
+ attestation: {
31
+ codeHash: string;
32
+ attestationPub: string;
33
+ certificate: string;
34
+ };
35
+ buffer: Buffer;
36
+ }>;
37
+ /**
38
+ * Get device confidentiality key
39
+ */
40
+ getConfidentialityKey: () => Promise<{
41
+ confidentialityKeyCurve25519: string;
42
+ confidentialityKeySignature: string;
43
+ }>;
44
+ /**
45
+ * Get device confidentiality public key
46
+ */
47
+ getConfidentialityPubKey: () => Promise<{
48
+ pubKey: string;
49
+ signature: string;
50
+ }>;
51
+ /**
52
+ * Get device user id (the 16 chars user identifier displayed on Vault app)
53
+ */
54
+ getDeviceUserId: () => Promise<string>;
55
+ /**
56
+ * Get device U2F public key
57
+ */
58
+ getU2FPubKey: () => Promise<{
59
+ pubKey: string;
60
+ signature: string;
61
+ }>;
62
+ /**
63
+ * Get device validation public key
64
+ */
65
+ getValidationPubKey: () => Promise<{
66
+ pubKey: string;
67
+ signature: string;
68
+ }>;
69
+ /**
70
+ * Check is device has partition pairing
71
+ */
72
+ hasPairing: () => Promise<boolean>;
73
+ /**
74
+ * Initialize pairing handshake
75
+ */
76
+ initPairingHandshake: () => Promise<{
77
+ pubKey: string;
78
+ signature: string;
79
+ }>;
80
+ /**
81
+ * Open session
82
+ */
83
+ openSession: (opts: {
84
+ secureChannel: {
85
+ pubKey: PubKey;
86
+ certificate: HsmCertificate;
87
+ };
88
+ }) => Promise<void>;
89
+ /**
90
+ * Register device
91
+ */
92
+ register: (opts: {
93
+ challenge: string;
94
+ u2fRegisterData: string;
95
+ name: string;
96
+ role: "ADMIN" | "SHARED_OWNER" | "OPERATOR";
97
+ }) => Promise<{
98
+ u2fRegister: Buffer;
99
+ keyHandle: Buffer;
100
+ rfu: number;
101
+ pubKey: string;
102
+ }>;
103
+ /**
104
+ * Register data
105
+ */
106
+ registerData: (opts: {
107
+ challenge: string;
108
+ }) => Promise<string>;
109
+ /**
110
+ * Inject partition pairing
111
+ */
112
+ setPairing: (opts: {
113
+ pairing: PsdPairingData;
114
+ }) => Promise<void>;
115
+ /**
116
+ * Start KK pattern (related to noise channel)
117
+ */
118
+ startKKPatternAsResponder: (opts: {
119
+ handshake: string;
120
+ handshakeAttestation: HsmCertificate;
121
+ partitionId: string;
122
+ }) => Promise<{
123
+ handshake: string;
124
+ signature: string;
125
+ }>;
126
+ /**
127
+ * Start K pattern (related to noise channel)
128
+ */
129
+ startKPatternAsResponder: (opts: {
130
+ handshake: string;
131
+ handshakeAttestation: HsmCertificate;
132
+ partitionId: string;
133
+ }) => Promise<void>;
134
+ /**
135
+ * Approve with device
136
+ */
137
+ validateVaultOperation: (opts: {
138
+ actions: string[];
139
+ }) => Promise<string>;
140
+ /**
141
+ * Send arbitrary APDU
142
+ * apduCommand in HEX string format
143
+ */
144
+ sendAPDU: (apduCommand: string) => Promise<string>;
145
+ /**
146
+ * Poll device until it's plugged-on
147
+ *
148
+ */
149
+ poll: () => Promise<{
150
+ isAppOpened: boolean;
151
+ }>;
152
+ /**
153
+ * Returned when app is opened
154
+ * appName in string format
155
+ */
156
+ pollApp: (name: string) => Promise<string>;
157
+ };
158
+
159
+ export type { Device as D };