@ledgerhq/revault-sdk 0.25.1 → 0.26.1

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.
@@ -1,5 +1,5 @@
1
1
  import { t as Logger } from "./logger-DWLViq7U.js";
2
- import { d as Engine, y as WithOnboarding } from "./types-4CfR5--z.js";
2
+ import { d as Engine, y as WithOnboarding } from "./types-BXkDuD6i.js";
3
3
  import { OnboardingFullStateResponse, OnboardingStep } from "@ledgerhq/revault-api";
4
4
 
5
5
  //#region src/onboarding.d.ts
@@ -13,10 +13,12 @@ declare const STEPS: {
13
13
  }: {
14
14
  engine: Engine<WithOnboarding>;
15
15
  state: OnboardingFullStateResponse;
16
+ externalSigners?: string[];
16
17
  }, logger: Logger) => Promise<{
17
18
  id: string;
18
19
  workspaceName: string;
19
- step: "COMPLETED" | "PENDING_DEVICE_CLAIMS" | "PENDING_MASTER_ADMINS_REGISTRATION" | "PENDING_MASTER_ADMINS_REGISTRATION_INIT" | "PENDING_REVIEW_BY_MASTER_ADMINS" | "PENDING_SEED_PROVISIONING" | "PENDING_SHARED_OWNERS_REGISTRATION" | "PENDING_SHARED_OWNERS_REGISTRATION_INIT" | "PENDING_WORKSPACE_INITIALIZATION" | "PENDING_WRAPPING_KEY_PROVISIONING";
20
+ hsmHostingMode: "HOSTED" | "ON_PREM";
21
+ step: "COMPLETED" | "PENDING_DEVICE_CLAIMS" | "PENDING_EXTERNAL_SIGNERS_REGISTRATION" | "PENDING_MASTER_ADMINS_REGISTRATION" | "PENDING_MASTER_ADMINS_REGISTRATION_INIT" | "PENDING_REVIEW_BY_MASTER_ADMINS" | "PENDING_SEED_PROVISIONING" | "PENDING_SHARED_OWNERS_REGISTRATION" | "PENDING_SHARED_OWNERS_REGISTRATION_INIT" | "PENDING_WORKSPACE_INITIALIZATION" | "PENDING_WRAPPING_KEY_PROVISIONING";
20
22
  claimedDevices: {
21
23
  pubKey: string;
22
24
  deviceUserId: string;
@@ -96,6 +98,21 @@ declare const STEPS: {
96
98
  };
97
99
  signature: string | null;
98
100
  } | null;
101
+ reviewOfExternalSigners: {
102
+ challenge: {
103
+ challengeType: "PSD";
104
+ wActions: string[];
105
+ handshake: string;
106
+ handshakeAttestation: {
107
+ codeHash: string;
108
+ attestationPub: string;
109
+ certificate: string;
110
+ signature: string;
111
+ };
112
+ partitionId: string;
113
+ };
114
+ signature: string | null;
115
+ } | null;
99
116
  }[];
100
117
  sharedOwners: {
101
118
  name: string;
@@ -188,10 +205,12 @@ declare const STEPS: {
188
205
  }: {
189
206
  engine: Engine<WithOnboarding>;
190
207
  state: OnboardingFullStateResponse;
208
+ externalSigners?: string[];
191
209
  }, logger: Logger) => Promise<{
192
210
  id: string;
193
211
  workspaceName: string;
194
- step: "COMPLETED" | "PENDING_DEVICE_CLAIMS" | "PENDING_MASTER_ADMINS_REGISTRATION" | "PENDING_MASTER_ADMINS_REGISTRATION_INIT" | "PENDING_REVIEW_BY_MASTER_ADMINS" | "PENDING_SEED_PROVISIONING" | "PENDING_SHARED_OWNERS_REGISTRATION" | "PENDING_SHARED_OWNERS_REGISTRATION_INIT" | "PENDING_WORKSPACE_INITIALIZATION" | "PENDING_WRAPPING_KEY_PROVISIONING";
212
+ hsmHostingMode: "HOSTED" | "ON_PREM";
213
+ step: "COMPLETED" | "PENDING_DEVICE_CLAIMS" | "PENDING_EXTERNAL_SIGNERS_REGISTRATION" | "PENDING_MASTER_ADMINS_REGISTRATION" | "PENDING_MASTER_ADMINS_REGISTRATION_INIT" | "PENDING_REVIEW_BY_MASTER_ADMINS" | "PENDING_SEED_PROVISIONING" | "PENDING_SHARED_OWNERS_REGISTRATION" | "PENDING_SHARED_OWNERS_REGISTRATION_INIT" | "PENDING_WORKSPACE_INITIALIZATION" | "PENDING_WRAPPING_KEY_PROVISIONING";
195
214
  claimedDevices: {
196
215
  pubKey: string;
197
216
  deviceUserId: string;
@@ -271,6 +290,21 @@ declare const STEPS: {
271
290
  };
272
291
  signature: string | null;
273
292
  } | null;
293
+ reviewOfExternalSigners: {
294
+ challenge: {
295
+ challengeType: "PSD";
296
+ wActions: string[];
297
+ handshake: string;
298
+ handshakeAttestation: {
299
+ codeHash: string;
300
+ attestationPub: string;
301
+ certificate: string;
302
+ signature: string;
303
+ };
304
+ partitionId: string;
305
+ };
306
+ signature: string | null;
307
+ } | null;
274
308
  }[];
275
309
  sharedOwners: {
276
310
  name: string;
@@ -363,10 +397,12 @@ declare const STEPS: {
363
397
  }: {
364
398
  engine: Engine<WithOnboarding>;
365
399
  state: OnboardingFullStateResponse;
400
+ externalSigners?: string[];
366
401
  }) => Promise<{
367
402
  id: string;
368
403
  workspaceName: string;
369
- step: "COMPLETED" | "PENDING_DEVICE_CLAIMS" | "PENDING_MASTER_ADMINS_REGISTRATION" | "PENDING_MASTER_ADMINS_REGISTRATION_INIT" | "PENDING_REVIEW_BY_MASTER_ADMINS" | "PENDING_SEED_PROVISIONING" | "PENDING_SHARED_OWNERS_REGISTRATION" | "PENDING_SHARED_OWNERS_REGISTRATION_INIT" | "PENDING_WORKSPACE_INITIALIZATION" | "PENDING_WRAPPING_KEY_PROVISIONING";
404
+ hsmHostingMode: "HOSTED" | "ON_PREM";
405
+ step: "COMPLETED" | "PENDING_DEVICE_CLAIMS" | "PENDING_EXTERNAL_SIGNERS_REGISTRATION" | "PENDING_MASTER_ADMINS_REGISTRATION" | "PENDING_MASTER_ADMINS_REGISTRATION_INIT" | "PENDING_REVIEW_BY_MASTER_ADMINS" | "PENDING_SEED_PROVISIONING" | "PENDING_SHARED_OWNERS_REGISTRATION" | "PENDING_SHARED_OWNERS_REGISTRATION_INIT" | "PENDING_WORKSPACE_INITIALIZATION" | "PENDING_WRAPPING_KEY_PROVISIONING";
370
406
  claimedDevices: {
371
407
  pubKey: string;
372
408
  deviceUserId: string;
@@ -446,6 +482,21 @@ declare const STEPS: {
446
482
  };
447
483
  signature: string | null;
448
484
  } | null;
485
+ reviewOfExternalSigners: {
486
+ challenge: {
487
+ challengeType: "PSD";
488
+ wActions: string[];
489
+ handshake: string;
490
+ handshakeAttestation: {
491
+ codeHash: string;
492
+ attestationPub: string;
493
+ certificate: string;
494
+ signature: string;
495
+ };
496
+ partitionId: string;
497
+ };
498
+ signature: string | null;
499
+ } | null;
449
500
  }[];
450
501
  sharedOwners: {
451
502
  name: string;
@@ -538,10 +589,12 @@ declare const STEPS: {
538
589
  }: {
539
590
  engine: Engine<WithOnboarding>;
540
591
  state: OnboardingFullStateResponse;
592
+ externalSigners?: string[];
541
593
  }, logger: Logger) => Promise<{
542
594
  id: string;
543
595
  workspaceName: string;
544
- step: "COMPLETED" | "PENDING_DEVICE_CLAIMS" | "PENDING_MASTER_ADMINS_REGISTRATION" | "PENDING_MASTER_ADMINS_REGISTRATION_INIT" | "PENDING_REVIEW_BY_MASTER_ADMINS" | "PENDING_SEED_PROVISIONING" | "PENDING_SHARED_OWNERS_REGISTRATION" | "PENDING_SHARED_OWNERS_REGISTRATION_INIT" | "PENDING_WORKSPACE_INITIALIZATION" | "PENDING_WRAPPING_KEY_PROVISIONING";
596
+ hsmHostingMode: "HOSTED" | "ON_PREM";
597
+ step: "COMPLETED" | "PENDING_DEVICE_CLAIMS" | "PENDING_EXTERNAL_SIGNERS_REGISTRATION" | "PENDING_MASTER_ADMINS_REGISTRATION" | "PENDING_MASTER_ADMINS_REGISTRATION_INIT" | "PENDING_REVIEW_BY_MASTER_ADMINS" | "PENDING_SEED_PROVISIONING" | "PENDING_SHARED_OWNERS_REGISTRATION" | "PENDING_SHARED_OWNERS_REGISTRATION_INIT" | "PENDING_WORKSPACE_INITIALIZATION" | "PENDING_WRAPPING_KEY_PROVISIONING";
545
598
  claimedDevices: {
546
599
  pubKey: string;
547
600
  deviceUserId: string;
@@ -621,6 +674,21 @@ declare const STEPS: {
621
674
  };
622
675
  signature: string | null;
623
676
  } | null;
677
+ reviewOfExternalSigners: {
678
+ challenge: {
679
+ challengeType: "PSD";
680
+ wActions: string[];
681
+ handshake: string;
682
+ handshakeAttestation: {
683
+ codeHash: string;
684
+ attestationPub: string;
685
+ certificate: string;
686
+ signature: string;
687
+ };
688
+ partitionId: string;
689
+ };
690
+ signature: string | null;
691
+ } | null;
624
692
  }[];
625
693
  sharedOwners: {
626
694
  name: string;
@@ -713,10 +781,12 @@ declare const STEPS: {
713
781
  }: {
714
782
  engine: Engine<WithOnboarding>;
715
783
  state: OnboardingFullStateResponse;
784
+ externalSigners?: string[];
716
785
  }) => Promise<{
717
786
  id: string;
718
787
  workspaceName: string;
719
- step: "COMPLETED" | "PENDING_DEVICE_CLAIMS" | "PENDING_MASTER_ADMINS_REGISTRATION" | "PENDING_MASTER_ADMINS_REGISTRATION_INIT" | "PENDING_REVIEW_BY_MASTER_ADMINS" | "PENDING_SEED_PROVISIONING" | "PENDING_SHARED_OWNERS_REGISTRATION" | "PENDING_SHARED_OWNERS_REGISTRATION_INIT" | "PENDING_WORKSPACE_INITIALIZATION" | "PENDING_WRAPPING_KEY_PROVISIONING";
788
+ hsmHostingMode: "HOSTED" | "ON_PREM";
789
+ step: "COMPLETED" | "PENDING_DEVICE_CLAIMS" | "PENDING_EXTERNAL_SIGNERS_REGISTRATION" | "PENDING_MASTER_ADMINS_REGISTRATION" | "PENDING_MASTER_ADMINS_REGISTRATION_INIT" | "PENDING_REVIEW_BY_MASTER_ADMINS" | "PENDING_SEED_PROVISIONING" | "PENDING_SHARED_OWNERS_REGISTRATION" | "PENDING_SHARED_OWNERS_REGISTRATION_INIT" | "PENDING_WORKSPACE_INITIALIZATION" | "PENDING_WRAPPING_KEY_PROVISIONING";
720
790
  claimedDevices: {
721
791
  pubKey: string;
722
792
  deviceUserId: string;
@@ -796,6 +866,21 @@ declare const STEPS: {
796
866
  };
797
867
  signature: string | null;
798
868
  } | null;
869
+ reviewOfExternalSigners: {
870
+ challenge: {
871
+ challengeType: "PSD";
872
+ wActions: string[];
873
+ handshake: string;
874
+ handshakeAttestation: {
875
+ codeHash: string;
876
+ attestationPub: string;
877
+ certificate: string;
878
+ signature: string;
879
+ };
880
+ partitionId: string;
881
+ };
882
+ signature: string | null;
883
+ } | null;
799
884
  }[];
800
885
  sharedOwners: {
801
886
  name: string;
@@ -888,10 +973,12 @@ declare const STEPS: {
888
973
  }: {
889
974
  engine: Engine<WithOnboarding>;
890
975
  state: OnboardingFullStateResponse;
976
+ externalSigners?: string[];
891
977
  }, logger: Logger) => Promise<{
892
978
  id: string;
893
979
  workspaceName: string;
894
- step: "COMPLETED" | "PENDING_DEVICE_CLAIMS" | "PENDING_MASTER_ADMINS_REGISTRATION" | "PENDING_MASTER_ADMINS_REGISTRATION_INIT" | "PENDING_REVIEW_BY_MASTER_ADMINS" | "PENDING_SEED_PROVISIONING" | "PENDING_SHARED_OWNERS_REGISTRATION" | "PENDING_SHARED_OWNERS_REGISTRATION_INIT" | "PENDING_WORKSPACE_INITIALIZATION" | "PENDING_WRAPPING_KEY_PROVISIONING";
980
+ hsmHostingMode: "HOSTED" | "ON_PREM";
981
+ step: "COMPLETED" | "PENDING_DEVICE_CLAIMS" | "PENDING_EXTERNAL_SIGNERS_REGISTRATION" | "PENDING_MASTER_ADMINS_REGISTRATION" | "PENDING_MASTER_ADMINS_REGISTRATION_INIT" | "PENDING_REVIEW_BY_MASTER_ADMINS" | "PENDING_SEED_PROVISIONING" | "PENDING_SHARED_OWNERS_REGISTRATION" | "PENDING_SHARED_OWNERS_REGISTRATION_INIT" | "PENDING_WORKSPACE_INITIALIZATION" | "PENDING_WRAPPING_KEY_PROVISIONING";
895
982
  claimedDevices: {
896
983
  pubKey: string;
897
984
  deviceUserId: string;
@@ -971,6 +1058,21 @@ declare const STEPS: {
971
1058
  };
972
1059
  signature: string | null;
973
1060
  } | null;
1061
+ reviewOfExternalSigners: {
1062
+ challenge: {
1063
+ challengeType: "PSD";
1064
+ wActions: string[];
1065
+ handshake: string;
1066
+ handshakeAttestation: {
1067
+ codeHash: string;
1068
+ attestationPub: string;
1069
+ certificate: string;
1070
+ signature: string;
1071
+ };
1072
+ partitionId: string;
1073
+ };
1074
+ signature: string | null;
1075
+ } | null;
974
1076
  }[];
975
1077
  sharedOwners: {
976
1078
  name: string;
@@ -1063,10 +1165,12 @@ declare const STEPS: {
1063
1165
  }: {
1064
1166
  engine: Engine<WithOnboarding>;
1065
1167
  state: OnboardingFullStateResponse;
1168
+ externalSigners?: string[];
1066
1169
  }, logger: Logger) => Promise<{
1067
1170
  id: string;
1068
1171
  workspaceName: string;
1069
- step: "COMPLETED" | "PENDING_DEVICE_CLAIMS" | "PENDING_MASTER_ADMINS_REGISTRATION" | "PENDING_MASTER_ADMINS_REGISTRATION_INIT" | "PENDING_REVIEW_BY_MASTER_ADMINS" | "PENDING_SEED_PROVISIONING" | "PENDING_SHARED_OWNERS_REGISTRATION" | "PENDING_SHARED_OWNERS_REGISTRATION_INIT" | "PENDING_WORKSPACE_INITIALIZATION" | "PENDING_WRAPPING_KEY_PROVISIONING";
1172
+ hsmHostingMode: "HOSTED" | "ON_PREM";
1173
+ step: "COMPLETED" | "PENDING_DEVICE_CLAIMS" | "PENDING_EXTERNAL_SIGNERS_REGISTRATION" | "PENDING_MASTER_ADMINS_REGISTRATION" | "PENDING_MASTER_ADMINS_REGISTRATION_INIT" | "PENDING_REVIEW_BY_MASTER_ADMINS" | "PENDING_SEED_PROVISIONING" | "PENDING_SHARED_OWNERS_REGISTRATION" | "PENDING_SHARED_OWNERS_REGISTRATION_INIT" | "PENDING_WORKSPACE_INITIALIZATION" | "PENDING_WRAPPING_KEY_PROVISIONING";
1070
1174
  claimedDevices: {
1071
1175
  pubKey: string;
1072
1176
  deviceUserId: string;
@@ -1146,6 +1250,21 @@ declare const STEPS: {
1146
1250
  };
1147
1251
  signature: string | null;
1148
1252
  } | null;
1253
+ reviewOfExternalSigners: {
1254
+ challenge: {
1255
+ challengeType: "PSD";
1256
+ wActions: string[];
1257
+ handshake: string;
1258
+ handshakeAttestation: {
1259
+ codeHash: string;
1260
+ attestationPub: string;
1261
+ certificate: string;
1262
+ signature: string;
1263
+ };
1264
+ partitionId: string;
1265
+ };
1266
+ signature: string | null;
1267
+ } | null;
1149
1268
  }[];
1150
1269
  sharedOwners: {
1151
1270
  name: string;
@@ -1229,19 +1348,19 @@ declare const STEPS: {
1229
1348
  createdAt: Date;
1230
1349
  completedAt: Date | null;
1231
1350
  }>;
1232
- /**
1233
- * Seed provisioning
1234
- */
1235
- readonly PENDING_SEED_PROVISIONING: ({
1351
+ readonly PENDING_EXTERNAL_SIGNERS_REGISTRATION: ({
1236
1352
  state,
1237
- engine
1353
+ engine,
1354
+ externalSigners
1238
1355
  }: {
1239
1356
  engine: Engine<WithOnboarding>;
1240
1357
  state: OnboardingFullStateResponse;
1358
+ externalSigners?: string[];
1241
1359
  }, logger: Logger) => Promise<{
1242
1360
  id: string;
1243
1361
  workspaceName: string;
1244
- step: "COMPLETED" | "PENDING_DEVICE_CLAIMS" | "PENDING_MASTER_ADMINS_REGISTRATION" | "PENDING_MASTER_ADMINS_REGISTRATION_INIT" | "PENDING_REVIEW_BY_MASTER_ADMINS" | "PENDING_SEED_PROVISIONING" | "PENDING_SHARED_OWNERS_REGISTRATION" | "PENDING_SHARED_OWNERS_REGISTRATION_INIT" | "PENDING_WORKSPACE_INITIALIZATION" | "PENDING_WRAPPING_KEY_PROVISIONING";
1362
+ hsmHostingMode: "HOSTED" | "ON_PREM";
1363
+ step: "COMPLETED" | "PENDING_DEVICE_CLAIMS" | "PENDING_EXTERNAL_SIGNERS_REGISTRATION" | "PENDING_MASTER_ADMINS_REGISTRATION" | "PENDING_MASTER_ADMINS_REGISTRATION_INIT" | "PENDING_REVIEW_BY_MASTER_ADMINS" | "PENDING_SEED_PROVISIONING" | "PENDING_SHARED_OWNERS_REGISTRATION" | "PENDING_SHARED_OWNERS_REGISTRATION_INIT" | "PENDING_WORKSPACE_INITIALIZATION" | "PENDING_WRAPPING_KEY_PROVISIONING";
1245
1364
  claimedDevices: {
1246
1365
  pubKey: string;
1247
1366
  deviceUserId: string;
@@ -1321,6 +1440,21 @@ declare const STEPS: {
1321
1440
  };
1322
1441
  signature: string | null;
1323
1442
  } | null;
1443
+ reviewOfExternalSigners: {
1444
+ challenge: {
1445
+ challengeType: "PSD";
1446
+ wActions: string[];
1447
+ handshake: string;
1448
+ handshakeAttestation: {
1449
+ codeHash: string;
1450
+ attestationPub: string;
1451
+ certificate: string;
1452
+ signature: string;
1453
+ };
1454
+ partitionId: string;
1455
+ };
1456
+ signature: string | null;
1457
+ } | null;
1324
1458
  }[];
1325
1459
  sharedOwners: {
1326
1460
  name: string;
@@ -1405,18 +1539,20 @@ declare const STEPS: {
1405
1539
  completedAt: Date | null;
1406
1540
  }>;
1407
1541
  /**
1408
- * Workspace initialization
1542
+ * Seed provisioning
1409
1543
  */
1410
- readonly PENDING_WORKSPACE_INITIALIZATION: ({
1544
+ readonly PENDING_SEED_PROVISIONING: ({
1411
1545
  state,
1412
1546
  engine
1413
1547
  }: {
1414
1548
  engine: Engine<WithOnboarding>;
1415
1549
  state: OnboardingFullStateResponse;
1416
- }) => Promise<{
1550
+ externalSigners?: string[];
1551
+ }, logger: Logger) => Promise<{
1417
1552
  id: string;
1418
1553
  workspaceName: string;
1419
- step: "COMPLETED" | "PENDING_DEVICE_CLAIMS" | "PENDING_MASTER_ADMINS_REGISTRATION" | "PENDING_MASTER_ADMINS_REGISTRATION_INIT" | "PENDING_REVIEW_BY_MASTER_ADMINS" | "PENDING_SEED_PROVISIONING" | "PENDING_SHARED_OWNERS_REGISTRATION" | "PENDING_SHARED_OWNERS_REGISTRATION_INIT" | "PENDING_WORKSPACE_INITIALIZATION" | "PENDING_WRAPPING_KEY_PROVISIONING";
1554
+ hsmHostingMode: "HOSTED" | "ON_PREM";
1555
+ step: "COMPLETED" | "PENDING_DEVICE_CLAIMS" | "PENDING_EXTERNAL_SIGNERS_REGISTRATION" | "PENDING_MASTER_ADMINS_REGISTRATION" | "PENDING_MASTER_ADMINS_REGISTRATION_INIT" | "PENDING_REVIEW_BY_MASTER_ADMINS" | "PENDING_SEED_PROVISIONING" | "PENDING_SHARED_OWNERS_REGISTRATION" | "PENDING_SHARED_OWNERS_REGISTRATION_INIT" | "PENDING_WORKSPACE_INITIALIZATION" | "PENDING_WRAPPING_KEY_PROVISIONING";
1420
1556
  claimedDevices: {
1421
1557
  pubKey: string;
1422
1558
  deviceUserId: string;
@@ -1496,6 +1632,21 @@ declare const STEPS: {
1496
1632
  };
1497
1633
  signature: string | null;
1498
1634
  } | null;
1635
+ reviewOfExternalSigners: {
1636
+ challenge: {
1637
+ challengeType: "PSD";
1638
+ wActions: string[];
1639
+ handshake: string;
1640
+ handshakeAttestation: {
1641
+ codeHash: string;
1642
+ attestationPub: string;
1643
+ certificate: string;
1644
+ signature: string;
1645
+ };
1646
+ partitionId: string;
1647
+ };
1648
+ signature: string | null;
1649
+ } | null;
1499
1650
  }[];
1500
1651
  sharedOwners: {
1501
1652
  name: string;
@@ -1580,17 +1731,20 @@ declare const STEPS: {
1580
1731
  completedAt: Date | null;
1581
1732
  }>;
1582
1733
  /**
1583
- * Onboarding completed
1734
+ * Workspace initialization
1584
1735
  */
1585
- readonly COMPLETED: ({
1586
- state
1736
+ readonly PENDING_WORKSPACE_INITIALIZATION: ({
1737
+ state,
1738
+ engine
1587
1739
  }: {
1588
1740
  engine: Engine<WithOnboarding>;
1589
1741
  state: OnboardingFullStateResponse;
1742
+ externalSigners?: string[];
1590
1743
  }) => Promise<{
1591
1744
  id: string;
1592
1745
  workspaceName: string;
1593
- step: "COMPLETED" | "PENDING_DEVICE_CLAIMS" | "PENDING_MASTER_ADMINS_REGISTRATION" | "PENDING_MASTER_ADMINS_REGISTRATION_INIT" | "PENDING_REVIEW_BY_MASTER_ADMINS" | "PENDING_SEED_PROVISIONING" | "PENDING_SHARED_OWNERS_REGISTRATION" | "PENDING_SHARED_OWNERS_REGISTRATION_INIT" | "PENDING_WORKSPACE_INITIALIZATION" | "PENDING_WRAPPING_KEY_PROVISIONING";
1746
+ hsmHostingMode: "HOSTED" | "ON_PREM";
1747
+ step: "COMPLETED" | "PENDING_DEVICE_CLAIMS" | "PENDING_EXTERNAL_SIGNERS_REGISTRATION" | "PENDING_MASTER_ADMINS_REGISTRATION" | "PENDING_MASTER_ADMINS_REGISTRATION_INIT" | "PENDING_REVIEW_BY_MASTER_ADMINS" | "PENDING_SEED_PROVISIONING" | "PENDING_SHARED_OWNERS_REGISTRATION" | "PENDING_SHARED_OWNERS_REGISTRATION_INIT" | "PENDING_WORKSPACE_INITIALIZATION" | "PENDING_WRAPPING_KEY_PROVISIONING";
1594
1748
  claimedDevices: {
1595
1749
  pubKey: string;
1596
1750
  deviceUserId: string;
@@ -1670,6 +1824,21 @@ declare const STEPS: {
1670
1824
  };
1671
1825
  signature: string | null;
1672
1826
  } | null;
1827
+ reviewOfExternalSigners: {
1828
+ challenge: {
1829
+ challengeType: "PSD";
1830
+ wActions: string[];
1831
+ handshake: string;
1832
+ handshakeAttestation: {
1833
+ codeHash: string;
1834
+ attestationPub: string;
1835
+ certificate: string;
1836
+ signature: string;
1837
+ };
1838
+ partitionId: string;
1839
+ };
1840
+ signature: string | null;
1841
+ } | null;
1673
1842
  }[];
1674
1843
  sharedOwners: {
1675
1844
  name: string;
@@ -1754,11 +1923,9 @@ declare const STEPS: {
1754
1923
  completedAt: Date | null;
1755
1924
  }>;
1756
1925
  };
1757
- declare function onboard({
1758
- engine,
1759
- untilStep
1760
- }: {
1926
+ declare function onboard(opts: {
1761
1927
  engine: Engine<WithOnboarding>;
1928
+ externalSigners?: string[];
1762
1929
  untilStep?: OnboardingStep;
1763
1930
  }, logger: Logger): Promise<void>;
1764
1931
  //#endregion
package/lib/onboarding.js CHANGED
@@ -1,4 +1,5 @@
1
1
  import invariant from "invariant";
2
+ import { match } from "ts-pattern";
2
3
  //#region src/onboarding.ts
3
4
  const roleLabels = {
4
5
  WRAPPING_KEY_OWNER: "Wrapping Key",
@@ -57,20 +58,32 @@ const deviceNameToIndex = (name) => {
57
58
  invariant(index !== void 0, `Unknown device ${name}`);
58
59
  return index;
59
60
  };
61
+ const checkHsmHostingMode = (state, expectedMode) => {
62
+ /* v8 ignore next -- @preserve */
63
+ if (state.hsmHostingMode !== expectedMode) throw new Error(`HSM hosting mode should be ${expectedMode} but is ${state.hsmHostingMode}`);
64
+ };
65
+ /* v8 ignore next -- @preserve */
66
+ const checkExternalSigners = (state, externalSigners) => {
67
+ const hasExternalSigners = externalSigners && externalSigners.length > 0;
68
+ const errorMessage = match(state.hsmHostingMode).with("HOSTED", () => !hasExternalSigners ? null : "Hosted HSM does not support external signers").with("ON_PREM", () => hasExternalSigners ? null : "On-premises HSM requires at least 1 external signer").exhaustive();
69
+ if (errorMessage !== null) throw new Error(errorMessage);
70
+ };
60
71
  const STEPS = {
61
72
  PENDING_DEVICE_CLAIMS: async ({ state, engine }, logger) => {
62
73
  const promises = [];
63
- for (const device of devices)
64
- /* v8 ignore else -- @preserve */
65
- if (state.claimedDevices.find(
66
- /* v8 ignore next -- @preserve */
67
- (c) => c.deviceName === device.name
68
- ) === void 0) {
69
- const promise = engine.withDeviceIndex(device.index).claimDevice({
70
- role: device.role,
71
- deviceName: device.name
72
- }).then(() => logger.info(`Claimed ${device.name}`));
73
- promises.push(promise);
74
+ for (const device of devices) {
75
+ if (state.hsmHostingMode === "ON_PREM" && device.role === "SHARED_OWNER") continue;
76
+ /* v8 ignore else -- @preserve */
77
+ if (state.claimedDevices.find(
78
+ /* v8 ignore next -- @preserve */
79
+ (c) => c.deviceName === device.name
80
+ ) === void 0) {
81
+ const promise = engine.withDeviceIndex(device.index).claimDevice({
82
+ role: device.role,
83
+ deviceName: device.name
84
+ }).then(() => logger.info(`Claimed ${device.name}`));
85
+ promises.push(promise);
86
+ }
74
87
  }
75
88
  await Promise.all(promises);
76
89
  return engine.client.onboarding.commitDeviceClaims.mutate({ onboardingId: state.id });
@@ -111,8 +124,12 @@ const STEPS = {
111
124
  }));
112
125
  return engine.client.onboarding.createMasterAdminGroup.mutate({ onboardingId });
113
126
  },
114
- PENDING_SHARED_OWNERS_REGISTRATION_INIT: async ({ engine, state }) => engine.client.onboarding.startSharedOwnersRegistration.mutate({ onboardingId: state.id }),
127
+ PENDING_SHARED_OWNERS_REGISTRATION_INIT: async ({ engine, state }) => {
128
+ checkHsmHostingMode(state, "HOSTED");
129
+ return engine.client.onboarding.startSharedOwnersRegistration.mutate({ onboardingId: state.id });
130
+ },
115
131
  PENDING_SHARED_OWNERS_REGISTRATION: async ({ state, engine }, logger) => {
132
+ checkHsmHostingMode(state, "HOSTED");
116
133
  const { id: onboardingId } = state;
117
134
  const toRegister = state.claimedDevices.filter((claimed) => {
118
135
  if (claimed.role !== "SHARED_OWNER") return false;
@@ -143,7 +160,25 @@ const STEPS = {
143
160
  }));
144
161
  return engine.client.onboarding.commitReviewByMasterAdmins.mutate({ onboardingId });
145
162
  },
163
+ PENDING_EXTERNAL_SIGNERS_REGISTRATION: async ({ state, engine, externalSigners }, logger) => {
164
+ checkHsmHostingMode(state, "ON_PREM");
165
+ invariant(externalSigners && externalSigners.length > 0, "External signers must exist");
166
+ const { id: onboardingId } = state;
167
+ state = await engine.client.onboarding.startExternalSignersRegistration.mutate({
168
+ onboardingId,
169
+ externalSigners
170
+ });
171
+ const toCollect = state.masterAdmins.filter((admin) => !admin.reviewOfExternalSigners?.signature);
172
+ await Promise.all(toCollect.map(async (admin) => {
173
+ const index = deviceNameToIndex(admin.name);
174
+ const challenge = admin.reviewOfExternalSigners?.challenge;
175
+ await engine.withDeviceIndex(index).reviewExternalSigners(challenge);
176
+ logger.info(`Approved with ${admin.name}`);
177
+ }));
178
+ return engine.client.onboarding.commitExternalSignersRegistration.mutate({ onboardingId });
179
+ },
146
180
  PENDING_SEED_PROVISIONING: async ({ state, engine }, logger) => {
181
+ checkHsmHostingMode(state, "HOSTED");
147
182
  const { id: onboardingId } = state;
148
183
  state = await engine.client.onboarding.startSeedProvisioning.mutate({ onboardingId });
149
184
  const toCollect = state.sharedOwners.filter((so) => !so.review?.seedFragment);
@@ -155,24 +190,25 @@ const STEPS = {
155
190
  }));
156
191
  return engine.client.onboarding.commitSeedProvisioning.mutate({ onboardingId });
157
192
  },
158
- PENDING_WORKSPACE_INITIALIZATION: async ({ state, engine }) => engine.client.onboarding.initializeWorkspace.mutate({ onboardingId: state.id }),
159
- COMPLETED: async ({ state }) => state
193
+ PENDING_WORKSPACE_INITIALIZATION: async ({ state, engine }) => engine.client.onboarding.initializeWorkspace.mutate({ onboardingId: state.id })
160
194
  };
161
- const STEPS_LIST = Object.values(STEPS);
162
- async function onboard({ engine, untilStep }, logger) {
195
+ async function onboard(opts, logger) {
196
+ const { engine, externalSigners, untilStep } = opts;
163
197
  const { __onboardingId } = engine;
164
198
  logger.info(`Joining onboarding ${__onboardingId}`);
165
199
  let state = await engine.client.onboarding.getOnboarding.query({ onboardingId: __onboardingId });
166
- for (const step of STEPS_LIST.slice(STEPS_LIST.indexOf(STEPS[state.step]))) {
200
+ checkExternalSigners(state, externalSigners);
201
+ while (state.step !== "COMPLETED") {
167
202
  if (untilStep && state.step === untilStep) {
168
203
  logger.info("Skipping the rest of the onboarding");
169
204
  break;
170
205
  }
171
- const stepProgress = `${(STEPS_LIST.indexOf(step) + 1).toString().padStart(2, "0")}/${STEPS_LIST.length}`;
172
- logger.info(`(${stepProgress}) ${step.name}`);
206
+ const step = STEPS[state.step];
207
+ logger.info(step.name);
173
208
  state = await step({
174
209
  engine,
175
- state
210
+ state,
211
+ externalSigners
176
212
  }, logger);
177
213
  }
178
214
  }
@@ -1 +1 @@
1
- {"version":3,"file":"onboarding.js","names":[],"sources":["../src/onboarding.ts"],"sourcesContent":["import type {\n ClaimedRole,\n OnboardingFullStateResponse,\n OnboardingStep,\n} from \"@ledgerhq/revault-api\";\nimport invariant from \"invariant\";\n\nimport type { Logger } from \"@/logger\";\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\nconst devices: { index: number; role: ClaimedRole; name: string }[] = [\n { index: 1, role: \"WRAPPING_KEY_OWNER\", name: `${roleLabels.WRAPPING_KEY_OWNER} 1` },\n { index: 2, role: \"WRAPPING_KEY_OWNER\", name: `${roleLabels.WRAPPING_KEY_OWNER} 2` },\n { index: 3, role: \"WRAPPING_KEY_OWNER\", name: `${roleLabels.WRAPPING_KEY_OWNER} 3` },\n { index: 4, role: \"MASTER_ADMIN\", name: `${roleLabels.MASTER_ADMIN} 1` },\n { index: 5, role: \"MASTER_ADMIN\", name: `${roleLabels.MASTER_ADMIN} 2` },\n { index: 6, role: \"MASTER_ADMIN\", name: `${roleLabels.MASTER_ADMIN} 3` },\n { index: 7, role: \"SHARED_OWNER\", name: `${roleLabels.SHARED_OWNER} 1` },\n { index: 8, role: \"SHARED_OWNER\", name: `${roleLabels.SHARED_OWNER} 2` },\n { index: 9, role: \"SHARED_OWNER\", name: `${roleLabels.SHARED_OWNER} 3` },\n];\n\nconst deviceNameToIndex = (name: string): number => {\n const index = devices.find((d) => d.name === name)?.index;\n invariant(index !== undefined, `Unknown device ${name}`);\n return index;\n};\n\nexport const STEPS = {\n /**\n * Devices claiming\n */\n PENDING_DEVICE_CLAIMS: async ({ state, engine }, logger) => {\n const promises: Promise<void>[] = [];\n for (const device of devices) {\n /* v8 ignore else -- @preserve */\n if (\n state.claimedDevices.find(\n /* v8 ignore next -- @preserve */\n (c) => c.deviceName === device.name,\n ) === undefined\n ) {\n const promise = engine\n .withDeviceIndex(device.index)\n .claimDevice({ role: device.role, deviceName: device.name })\n .then(() => logger.info(`Claimed ${device.name}`));\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(\n /* v8 ignore next -- @preserve */\n (f) => f.pubKey === claimed.pubKey,\n );\n return !inFragment;\n })\n .map((c) => {\n const index = deviceNameToIndex(c.deviceName);\n return index;\n });\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.filter((claimed) => {\n if (claimed.role !== \"MASTER_ADMIN\") return false;\n const hasRegistered = !!state.masterAdmins.find(\n /* v8 ignore next -- @preserve */\n (a) => a.pubKey === claimed.pubKey,\n );\n return !hasRegistered;\n });\n await Promise.all(\n toRegister.map(async ({ deviceName: name }) => {\n const index = deviceNameToIndex(name);\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.filter((claimed) => {\n if (claimed.role !== \"SHARED_OWNER\") return false;\n const hasRegistered = !!state.sharedOwners.find(\n /* v8 ignore next -- @preserve */ (a) => a.pubKey === claimed.pubKey,\n );\n return !hasRegistered;\n });\n await Promise.all(\n toRegister.map(async ({ deviceName: name }) => {\n const index = deviceNameToIndex(name);\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 = deviceNameToIndex(admin.name);\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 = deviceNameToIndex(so.name);\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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"}
1
+ {"version":3,"file":"onboarding.js","names":[],"sources":["../src/onboarding.ts"],"sourcesContent":["import type {\n ClaimedRole,\n HsmHostingMode,\n OnboardingFullStateResponse,\n OnboardingStep,\n} from \"@ledgerhq/revault-api\";\nimport invariant from \"invariant\";\nimport { match } from \"ts-pattern\";\n\nimport type { Logger } from \"@/logger\";\n\nimport type { Engine, WithOnboarding } from \"./engine/types\";\n\ntype StepAction = (\n options: {\n engine: Engine<WithOnboarding>;\n state: OnboardingFullStateResponse;\n externalSigners?: string[];\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\nconst devices: { index: number; role: ClaimedRole; name: string }[] = [\n { index: 1, role: \"WRAPPING_KEY_OWNER\", name: `${roleLabels.WRAPPING_KEY_OWNER} 1` },\n { index: 2, role: \"WRAPPING_KEY_OWNER\", name: `${roleLabels.WRAPPING_KEY_OWNER} 2` },\n { index: 3, role: \"WRAPPING_KEY_OWNER\", name: `${roleLabels.WRAPPING_KEY_OWNER} 3` },\n { index: 4, role: \"MASTER_ADMIN\", name: `${roleLabels.MASTER_ADMIN} 1` },\n { index: 5, role: \"MASTER_ADMIN\", name: `${roleLabels.MASTER_ADMIN} 2` },\n { index: 6, role: \"MASTER_ADMIN\", name: `${roleLabels.MASTER_ADMIN} 3` },\n { index: 7, role: \"SHARED_OWNER\", name: `${roleLabels.SHARED_OWNER} 1` },\n { index: 8, role: \"SHARED_OWNER\", name: `${roleLabels.SHARED_OWNER} 2` },\n { index: 9, role: \"SHARED_OWNER\", name: `${roleLabels.SHARED_OWNER} 3` },\n];\n\nconst deviceNameToIndex = (name: string): number => {\n const index = devices.find((d) => d.name === name)?.index;\n invariant(index !== undefined, `Unknown device ${name}`);\n return index;\n};\n\nconst checkHsmHostingMode = (\n state: OnboardingFullStateResponse,\n expectedMode: HsmHostingMode,\n): void => {\n /* v8 ignore next -- @preserve */\n if (state.hsmHostingMode !== expectedMode) {\n throw new Error(`HSM hosting mode should be ${expectedMode} but is ${state.hsmHostingMode}`);\n }\n};\n\n/* v8 ignore next -- @preserve */\nconst checkExternalSigners = (\n state: OnboardingFullStateResponse,\n externalSigners: string[] | undefined,\n): void => {\n const hasExternalSigners = externalSigners && externalSigners.length > 0;\n const errorMessage = match(state.hsmHostingMode)\n .with(\"HOSTED\", () =>\n !hasExternalSigners ? null : \"Hosted HSM does not support external signers\",\n )\n .with(\"ON_PREM\", () =>\n hasExternalSigners ? null : \"On-premises HSM requires at least 1 external signer\",\n )\n .exhaustive();\n if (errorMessage !== null) {\n throw new Error(errorMessage);\n }\n};\n\nexport const STEPS = {\n /**\n * Devices claiming\n */\n PENDING_DEVICE_CLAIMS: async ({ state, engine }, logger) => {\n const promises: Promise<void>[] = [];\n for (const device of devices) {\n if (state.hsmHostingMode === \"ON_PREM\" && device.role === \"SHARED_OWNER\") {\n continue;\n }\n /* v8 ignore else -- @preserve */\n if (\n state.claimedDevices.find(\n /* v8 ignore next -- @preserve */\n (c) => c.deviceName === device.name,\n ) === undefined\n ) {\n const promise = engine\n .withDeviceIndex(device.index)\n .claimDevice({ role: device.role, deviceName: device.name })\n .then(() => logger.info(`Claimed ${device.name}`));\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(\n /* v8 ignore next -- @preserve */\n (f) => f.pubKey === claimed.pubKey,\n );\n return !inFragment;\n })\n .map((c) => {\n const index = deviceNameToIndex(c.deviceName);\n return index;\n });\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.filter((claimed) => {\n if (claimed.role !== \"MASTER_ADMIN\") return false;\n const hasRegistered = !!state.masterAdmins.find(\n /* v8 ignore next -- @preserve */\n (a) => a.pubKey === claimed.pubKey,\n );\n return !hasRegistered;\n });\n await Promise.all(\n toRegister.map(async ({ deviceName: name }) => {\n const index = deviceNameToIndex(name);\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 checkHsmHostingMode(state, \"HOSTED\");\n return engine.client.onboarding.startSharedOwnersRegistration.mutate({\n onboardingId: state.id,\n });\n },\n\n /**\n * Shared Owners registration\n */\n PENDING_SHARED_OWNERS_REGISTRATION: async ({ state, engine }, logger) => {\n checkHsmHostingMode(state, \"HOSTED\");\n const { id: onboardingId } = state;\n const toRegister = state.claimedDevices.filter((claimed) => {\n if (claimed.role !== \"SHARED_OWNER\") return false;\n const hasRegistered = !!state.sharedOwners.find(\n /* v8 ignore next -- @preserve */ (a) => a.pubKey === claimed.pubKey,\n );\n return !hasRegistered;\n });\n await Promise.all(\n toRegister.map(async ({ deviceName: name }) => {\n const index = deviceNameToIndex(name);\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 = deviceNameToIndex(admin.name);\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 PENDING_EXTERNAL_SIGNERS_REGISTRATION: async ({ state, engine, externalSigners }, logger) => {\n checkHsmHostingMode(state, \"ON_PREM\");\n invariant(externalSigners && externalSigners.length > 0, \"External signers must exist\");\n const { id: onboardingId } = state;\n state = await engine.client.onboarding.startExternalSignersRegistration.mutate({\n onboardingId,\n externalSigners,\n });\n const toCollect = state.masterAdmins.filter(\n (admin) => !admin.reviewOfExternalSigners?.signature,\n );\n await Promise.all(\n toCollect.map(async (admin) => {\n const index = deviceNameToIndex(admin.name);\n const challenge = admin.reviewOfExternalSigners?.challenge;\n await engine.withDeviceIndex(index).reviewExternalSigners(challenge!); // same as review for shared owner, but with different challenge\n logger.info(`Approved with ${admin.name}`);\n }),\n );\n return engine.client.onboarding.commitExternalSignersRegistration.mutate({ onboardingId });\n },\n\n /**\n * Seed provisioning\n */\n PENDING_SEED_PROVISIONING: async ({ state, engine }, logger) => {\n checkHsmHostingMode(state, \"HOSTED\");\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 = deviceNameToIndex(so.name);\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} as const satisfies Record<Exclude<OnboardingStep, \"COMPLETED\">, StepAction>;\n\nexport async function onboard(\n opts: {\n engine: Engine<WithOnboarding>;\n externalSigners?: string[];\n untilStep?: OnboardingStep;\n },\n logger: Logger,\n): Promise<void> {\n const { engine, externalSigners, untilStep } = opts;\n\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 checkExternalSigners(state, externalSigners);\n\n while (state.step !== \"COMPLETED\") {\n if (untilStep && state.step === untilStep) {\n logger.info(\"Skipping the rest of the onboarding\");\n break;\n }\n const step = STEPS[state.step];\n logger.info(step.name);\n state = await step({ engine, state, externalSigners }, logger);\n }\n}\n"],"mappings":"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"}
@@ -114,6 +114,10 @@ type DecorateWithDeviceAndOnboarding = {
114
114
  * Review Shared-Owner with Admin
115
115
  */
116
116
  reviewSharedOwner: (challenge: PsdChallenge, params?: OnboardingOperationParams) => Promise<void>;
117
+ /**
118
+ * Review external signer with Admin
119
+ */
120
+ reviewExternalSigners: (challenge: PsdChallenge, params?: OnboardingOperationParams) => Promise<void>;
117
121
  /**
118
122
  * Collect master seed fragment
119
123
  */
@@ -114,6 +114,10 @@ type DecorateWithDeviceAndOnboarding = {
114
114
  * Review Shared-Owner with Admin
115
115
  */
116
116
  reviewSharedOwner: (challenge: PsdChallenge, params?: OnboardingOperationParams) => Promise<void>;
117
+ /**
118
+ * Review external signer with Admin
119
+ */
120
+ reviewExternalSigners: (challenge: PsdChallenge, params?: OnboardingOperationParams) => Promise<void>;
117
121
  /**
118
122
  * Collect master seed fragment
119
123
  */
@@ -82,5 +82,3 @@ Object.defineProperty(exports, "fetchAllCursor", {
82
82
  return fetchAllCursor;
83
83
  }
84
84
  });
85
-
86
- //# sourceMappingURL=utils-DbSFXp4c.cjs.map
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ledgerhq/revault-sdk",
3
- "version": "0.25.1",
3
+ "version": "0.26.1",
4
4
  "license": "Apache-2.0",
5
5
  "type": "module",
6
6
  "files": [
@@ -61,9 +61,9 @@
61
61
  "rxjs": "^7.8.2",
62
62
  "superjson": "^2.2.6",
63
63
  "ts-pattern": "^5.9.0",
64
- "uuid": "^13.0.0",
64
+ "uuid": "^14.0.0",
65
65
  "zod": "^4.3.6",
66
- "@ledgerhq/revault-api": "1.56.0"
66
+ "@ledgerhq/revault-api": "1.58.0"
67
67
  },
68
68
  "devDependencies": {
69
69
  "@eslint/js": "^9.39.4",