@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.
- package/LICENSE.md +202 -0
- package/README.md +18 -0
- package/lib/bake.cjs +812 -0
- package/lib/bake.cjs.map +1 -0
- package/lib/bake.d.cts +2659 -0
- package/lib/bake.d.ts +2659 -0
- package/lib/bake.js +812 -0
- package/lib/bake.js.map +1 -0
- package/lib/chunk-DPHEFR6E.js +493 -0
- package/lib/chunk-DPHEFR6E.js.map +1 -0
- package/lib/chunk-QOP5LA3E.cjs +35 -0
- package/lib/chunk-QOP5LA3E.cjs.map +1 -0
- package/lib/chunk-VCAQTGQE.cjs +493 -0
- package/lib/chunk-VCAQTGQE.cjs.map +1 -0
- package/lib/chunk-VHZJP75X.js +35 -0
- package/lib/chunk-VHZJP75X.js.map +1 -0
- package/lib/device.cjs +13 -0
- package/lib/device.cjs.map +1 -0
- package/lib/device.d.cts +50 -0
- package/lib/device.d.ts +50 -0
- package/lib/device.js +13 -0
- package/lib/device.js.map +1 -0
- package/lib/engine.cjs +704 -0
- package/lib/engine.cjs.map +1 -0
- package/lib/engine.d.cts +18 -0
- package/lib/engine.d.ts +18 -0
- package/lib/engine.js +704 -0
- package/lib/engine.js.map +1 -0
- package/lib/index.cjs +1 -0
- package/lib/index.cjs.map +1 -0
- package/lib/index.d.cts +13 -0
- package/lib/index.d.ts +13 -0
- package/lib/index.js +1 -0
- package/lib/index.js.map +1 -0
- package/lib/onboarding.cjs +160 -0
- package/lib/onboarding.cjs.map +1 -0
- package/lib/onboarding.d.cts +1735 -0
- package/lib/onboarding.d.ts +1735 -0
- package/lib/onboarding.js +160 -0
- package/lib/onboarding.js.map +1 -0
- package/lib/types-BYNH6EdK.d.cts +199 -0
- package/lib/types-CsvE9Mlb.d.cts +159 -0
- package/lib/types-CsvE9Mlb.d.ts +159 -0
- package/lib/types-DHZzeq9X.d.ts +199 -0
- 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":";AAkBA,IAAM,aAA0C;AAAA,EAC9C,oBAAoB;AAAA,EACpB,cAAc;AAAA,EACd,cAAc;AAChB;AAEO,IAAM,QAAQ;AAAA;AAAA;AAAA;AAAA,EAInB,uBAAuB,OAAO,EAAE,OAAO,OAAO,GAAG,WAAW;AAC1D,UAAM,QAAuB,CAAC,sBAAsB,gBAAgB,cAAc;AAClF,UAAM,WAA4B,CAAC;AACnC,eAAW,QAAQ,OAAO;AACxB,YAAM,YAAY,MAAM,QAAQ,IAAI;AACpC,YAAM,mBAAmB,MAAM,eAAe,OAAO,CAAC,MAAM,EAAE,SAAS,IAAI,EAAE;AAC7E,eAAS,IAAI,kBAAkB,IAAI,GAAG,KAAK;AACzC,cAAM,QAAQ,YAAY,IAAI,IAAI;AAClC,cAAM,aAAa,GAAG,WAAW,IAAI,CAAC,IAAI,KAAK;AAC/C,cAAM,UAAU,OACb,gBAAgB,KAAK,EACrB,YAAY,EAAE,MAAM,WAAW,CAAC,EAChC,KAAK,MAAM,OAAO,KAAK,WAAW,UAAU,EAAE,CAAC;AAClD,iBAAS,KAAK,OAAO;AAAA,MACvB;AAAA,IACF;AACA,UAAM,QAAQ,IAAI,QAAQ;AAC1B,WAAO,OAAO,OAAO,WAAW,mBAAmB,OAAO,EAAE,cAAc,MAAM,GAAG,CAAC;AAAA,EACtF;AAAA;AAAA;AAAA;AAAA,EAKA,mCAAmC,OAAO,EAAE,OAAO,OAAO,GAAG,WAAW;AACtE,UAAM,EAAE,IAAI,aAAa,IAAI;AAC7B,YAAQ,MAAM,OAAO,OAAO,WAAW,6BAA6B,OAAO,EAAE,aAAa,CAAC;AAC3F,UAAM,cAAc,MAAM;AAC1B,UAAM,YAAY,MAAM,eACrB,OAAO,CAAC,YAAY;AACnB,UAAI,QAAQ,SAAS,qBAAsB,QAAO;AAClD,YAAM,aAAa,CAAC,CAAC,MAAM,aAAa,UAAU,KAAK,CAAC,MAAM,EAAE,WAAW,QAAQ,MAAM;AACzF,aAAO,CAAC;AAAA,IACV,CAAC,EACA,IAAI,CAAC,MAAM,OAAO,EAAE,WAAW,QAAQ,WAAW,oBAAoB,EAAE,CAAC,CAAC;AAC7E,UAAM,QAAQ;AAAA,MACZ,UAAU;AAAA,QAAI,CAAC,UACb,OACG,gBAAgB,KAAK,EACrB,2BAA2B,WAAW,EACtC,KAAK,MAAM,OAAO,KAAK,0BAA0B,KAAK,EAAE,CAAC;AAAA,MAC9D;AAAA,IACF;AACA,WAAO,OAAO,OAAO,WAAW,kBAAkB,OAAO,EAAE,aAAa,CAAC;AAAA,EAC3E;AAAA;AAAA;AAAA;AAAA,EAKA,yCAAyC,OAAO,EAAE,QAAQ,MAAM,MAC9D,OAAO,OAAO,WAAW,8BAA8B,OAAO,EAAE,cAAc,MAAM,GAAG,CAAC;AAAA;AAAA;AAAA;AAAA,EAK1F,oCAAoC,OAAO,EAAE,OAAO,OAAO,GAAG,WAAW;AACvE,UAAM,EAAE,IAAI,aAAa,IAAI;AAC7B,UAAM,aAAa,MAAM,eACtB,OAAO,CAAC,YAAY;AACnB,UAAI,QAAQ,SAAS,eAAgB,QAAO;AAC5C,YAAM,gBAAgB,CAAC,CAAC,MAAM,aAAa,KAAK,CAAC,MAAM,EAAE,WAAW,QAAQ,MAAM;AAClF,aAAO,CAAC;AAAA,IACV,CAAC,EACA,IAAI,CAAC,MAAM,OAAO,EAAE,WAAW,QAAQ,WAAW,cAAc,EAAE,CAAC,CAAC;AACvE,UAAM,QAAQ;AAAA,MACZ,WAAW,IAAI,OAAO,UAAU;AAC9B,cAAM,OAAO,GAAG,WAAW,YAAY,IAAI,KAAK;AAChD,cAAM,OAAO,gBAAgB,KAAK,EAAE,eAAe,EAAE,MAAM,SAAS,KAAK,CAAC;AAC1E,eAAO,KAAK,cAAc,IAAI,EAAE;AAAA,MAClC,CAAC;AAAA,IACH;AACA,WAAO,OAAO,OAAO,WAAW,uBAAuB,OAAO,EAAE,aAAa,CAAC;AAAA,EAChF;AAAA;AAAA;AAAA;AAAA,EAKA,yCAAyC,OAAO,EAAE,QAAQ,MAAM,MAC9D,OAAO,OAAO,WAAW,8BAA8B,OAAO,EAAE,cAAc,MAAM,GAAG,CAAC;AAAA;AAAA;AAAA;AAAA,EAK1F,oCAAoC,OAAO,EAAE,OAAO,OAAO,GAAG,WAAW;AACvE,UAAM,EAAE,IAAI,aAAa,IAAI;AAC7B,UAAM,aAAa,MAAM,eACtB,OAAO,CAAC,YAAY;AACnB,UAAI,QAAQ,SAAS,eAAgB,QAAO;AAC5C,YAAM,gBAAgB,CAAC,CAAC,MAAM,aAAa,KAAK,CAAC,MAAM,EAAE,WAAW,QAAQ,MAAM;AAClF,aAAO,CAAC;AAAA,IACV,CAAC,EACA,IAAI,CAAC,MAAM,OAAO,EAAE,WAAW,QAAQ,WAAW,cAAc,EAAE,CAAC,CAAC;AACvE,UAAM,QAAQ;AAAA,MACZ,WAAW,IAAI,OAAO,UAAU;AAC9B,cAAM,OAAO,GAAG,WAAW,YAAY,IAAI,KAAK;AAChD,cAAM,OAAO,gBAAgB,KAAK,EAAE,eAAe,EAAE,MAAM,gBAAgB,KAAK,CAAC;AACjF,eAAO,KAAK,cAAc,IAAI,EAAE;AAAA,MAClC,CAAC;AAAA,IACH;AACA,WAAO,OAAO,OAAO,WAAW,+BAA+B,OAAO,EAAE,aAAa,CAAC;AAAA,EACxF;AAAA;AAAA;AAAA;AAAA,EAKA,iCAAiC,OAAO,EAAE,OAAO,OAAO,GAAG,WAAW;AACpE,UAAM,EAAE,IAAI,aAAa,IAAI;AAC7B,YAAQ,MAAM,OAAO,OAAO,WAAW,0BAA0B,OAAO,EAAE,aAAa,CAAC;AACxF,UAAM,YAAY,MAAM,aAAa,OAAO,CAAC,UAAU,CAAC,MAAM,QAAQ,SAAS;AAC/E,UAAM,QAAQ;AAAA,MACZ,UAAU,IAAI,OAAO,UAAU;AAC7B,cAAM,QAAQ,OAAO,MAAM,KAAK,QAAQ,WAAW,cAAc,EAAE,CAAC;AACpE,cAAM,YAAY,MAAM,OAAQ;AAChC,cAAM,OAAO,gBAAgB,KAAK,EAAE,kBAAkB,SAAS;AAC/D,eAAO,KAAK,iBAAiB,MAAM,IAAI,EAAE;AAAA,MAC3C,CAAC;AAAA,IACH;AACA,WAAO,OAAO,OAAO,WAAW,2BAA2B,OAAO,EAAE,aAAa,CAAC;AAAA,EACpF;AAAA;AAAA;AAAA;AAAA,EAKA,2BAA2B,OAAO,EAAE,OAAO,OAAO,GAAG,WAAW;AAC9D,UAAM,EAAE,IAAI,aAAa,IAAI;AAC7B,YAAQ,MAAM,OAAO,OAAO,WAAW,sBAAsB,OAAO,EAAE,aAAa,CAAC;AACpF,UAAM,YAAY,MAAM,aAAa,OAAO,CAAC,OAAO,CAAC,GAAG,QAAQ,YAAY;AAC5E,UAAM,QAAQ;AAAA,MACZ,UAAU,IAAI,OAAO,OAAO;AAC1B,cAAM,QAAQ,OAAO,GAAG,KAAK,QAAQ,WAAW,cAAc,EAAE,CAAC;AACjE,cAAM,YAAY,GAAG,OAAQ;AAC7B,cAAM,OAAO,gBAAgB,KAAK,EAAE,oBAAoB,SAAS;AACjE,eAAO,KAAK,0BAA0B,GAAG,IAAI,EAAE;AAAA,MACjD,CAAC;AAAA,IACH;AACA,WAAO,OAAO,OAAO,WAAW,uBAAuB,OAAO,EAAE,aAAa,CAAC;AAAA,EAChF;AAAA;AAAA;AAAA;AAAA,EAKA,kCAAkC,OAAO,EAAE,OAAO,OAAO,MACvD,OAAO,OAAO,WAAW,oBAAoB,OAAO,EAAE,cAAc,MAAM,GAAG,CAAC;AAAA;AAAA;AAAA;AAAA,EAKhF,WAAW,OAAO,EAAE,MAAM,MAAM;AAClC;AAEA,IAAM,aAAa,OAAO,OAAO,KAAK;AAEtC,eAAsB,QACpB;AAAA,EACE;AAAA,EACA;AACF,GAIA,QACe;AACf,QAAM,EAAE,eAAe,IAAI;AAC3B,SAAO,KAAK,sBAAsB,cAAc,EAAE;AAClD,MAAI,QAAQ,MAAM,OAAO,OAAO,WAAW,cAAc,MAAM;AAAA,IAC7D,cAAc;AAAA,EAChB,CAAC;AAED,aAAW,QAAQ,WAAW,MAAM,WAAW,QAAQ,MAAM,MAAM,IAAI,CAAC,CAAC,GAAG;AAC1E,QAAI,aAAa,MAAM,SAAS,WAAW;AACzC,aAAO,KAAK,qCAAqC;AACjD;AAAA,IACF;AACA,UAAM,QAAQ,WAAW,QAAQ,IAAI;AACrC,UAAM,eAAe,IAAI,QAAQ,GAAG,SAAS,EAAE,SAAS,GAAG,GAAG,CAAC,IAAI,WAAW,MAAM;AACpF,WAAO,KAAK,IAAI,YAAY,KAAK,KAAK,IAAI,EAAE;AAC5C,YAAQ,MAAM,KAAK,EAAE,QAAQ,MAAM,GAAG,MAAM;AAAA,EAC9C;AACF;","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 };
|