@learncard/sss-key-manager 0.1.24 → 0.2.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 (56) hide show
  1. package/README.md +12 -95
  2. package/dist/api-client.d.ts +44 -7
  3. package/dist/api-client.d.ts.map +1 -1
  4. package/dist/atomic-operations.d.ts +10 -2
  5. package/dist/atomic-operations.d.ts.map +1 -1
  6. package/dist/email-relay-crypto.d.ts +49 -0
  7. package/dist/email-relay-crypto.d.ts.map +1 -0
  8. package/dist/escrow-attestation.d.ts +8 -0
  9. package/dist/escrow-attestation.d.ts.map +1 -0
  10. package/dist/escrow-crypto.d.ts +52 -0
  11. package/dist/escrow-crypto.d.ts.map +1 -0
  12. package/dist/escrow-pin.d.ts +22 -0
  13. package/dist/escrow-pin.d.ts.map +1 -0
  14. package/dist/index.d.ts +13 -4
  15. package/dist/index.d.ts.map +1 -1
  16. package/dist/key-manager.d.ts +2 -0
  17. package/dist/key-manager.d.ts.map +1 -1
  18. package/dist/qr-login.d.ts.map +1 -1
  19. package/dist/recovery-phrase.d.ts +6 -0
  20. package/dist/recovery-phrase.d.ts.map +1 -1
  21. package/dist/sss-key-manager.cjs.development.js +2891 -355
  22. package/dist/sss-key-manager.cjs.development.js.map +4 -4
  23. package/dist/sss-key-manager.cjs.production.min.js +33 -33
  24. package/dist/sss-key-manager.cjs.production.min.js.map +4 -4
  25. package/dist/sss-key-manager.esm.js +2891 -355
  26. package/dist/sss-key-manager.esm.js.map +4 -4
  27. package/dist/sss-strategy.d.ts +74 -4
  28. package/dist/sss-strategy.d.ts.map +1 -1
  29. package/dist/storage.d.ts +1 -0
  30. package/dist/storage.d.ts.map +1 -1
  31. package/dist/types.d.ts +87 -4
  32. package/dist/types.d.ts.map +1 -1
  33. package/package.json +2 -2
  34. package/src/api-client.test.ts +122 -0
  35. package/src/api-client.ts +107 -116
  36. package/src/atomic-operations.test.ts +56 -16
  37. package/src/atomic-operations.ts +55 -19
  38. package/src/critical-paths.test.ts +51 -1
  39. package/src/email-relay-crypto.test.ts +87 -0
  40. package/src/email-relay-crypto.ts +293 -0
  41. package/src/escrow-attestation.test.ts +85 -0
  42. package/src/escrow-attestation.ts +64 -0
  43. package/src/escrow-crypto.test.ts +381 -0
  44. package/src/escrow-crypto.ts +319 -0
  45. package/src/escrow-pin.test.ts +119 -0
  46. package/src/escrow-pin.ts +83 -0
  47. package/src/index.ts +63 -1
  48. package/src/key-manager.ts +4 -9
  49. package/src/qr-login.ts +22 -15
  50. package/src/recovery-phrase.ts +40 -0
  51. package/src/sss-session-writes.test.ts +109 -0
  52. package/src/sss-strategy.test.ts +2642 -110
  53. package/src/sss-strategy.ts +2186 -224
  54. package/src/storage.test.ts +66 -8
  55. package/src/storage.ts +41 -29
  56. package/src/types.ts +107 -6
package/README.md CHANGED
@@ -15,6 +15,7 @@ This package provides a secure, self-hosted alternative to Web3Auth Single Facto
15
15
  - Password-based (Argon2id KDF)
16
16
  - Passkey/WebAuthn PRF (coming soon)
17
17
  - Backup file export/import
18
+ - Enclave escrow recovery with a seven-day waiting period (explicit attestation policy required)
18
19
  - **Migration**: Seamless migration from Web3Auth SFA
19
20
 
20
21
  ## Installation
@@ -25,75 +26,22 @@ bun add @learncard/sss-key-manager
25
26
 
26
27
  ## Usage
27
28
 
28
- ### Basic Setup
29
+ ### AuthCoordinator Setup
29
30
 
30
31
  ```typescript
31
- import { createSSSKeyManager } from '@learncard/sss-key-manager';
32
+ import { createSSSStrategy } from '@learncard/sss-key-manager';
32
33
 
33
- const keyManager = createSSSKeyManager({
34
+ const keyDerivation = createSSSStrategy({
34
35
  serverUrl: 'https://your-lca-api.com',
35
- authProvider: {
36
- getIdToken: async () => firebaseUser.getIdToken(),
37
- getCurrentUser: async () => ({
38
- id: firebaseUser.uid,
39
- email: firebaseUser.email,
40
- providerType: 'firebase',
41
- }),
42
- getProviderType: () => 'firebase',
43
- signOut: async () => firebaseAuth.signOut(),
44
- },
45
36
  });
46
37
  ```
47
38
 
48
- ### New User Setup
39
+ Use this strategy with LearnCard's `AuthCoordinator`, which obtains a fresh DID challenge for every
40
+ protected write.
49
41
 
50
- ```typescript
51
- // Generate new key and split into shares
52
- const privateKey = await keyManager.setupNewKey();
53
- console.log('DID:', deriveDid(privateKey));
54
- ```
55
-
56
- ### Returning User
57
-
58
- ```typescript
59
- // Reconstruct key from device + server shares
60
- const privateKey = await keyManager.connect();
61
- ```
62
-
63
- ### Migration from Web3Auth
64
-
65
- ```typescript
66
- // Extract key from Web3Auth and migrate to SSS
67
- const web3AuthPrivateKey = await web3Auth.provider.request({ method: 'eth_private_key' });
68
- await keyManager.migrate(web3AuthPrivateKey);
69
- ```
70
-
71
- ### Recovery
72
-
73
- ```typescript
74
- // Add password recovery
75
- await keyManager.addRecoveryMethod({
76
- type: 'password',
77
- password: userPassword,
78
- });
79
-
80
- // Recover with password
81
- const privateKey = await keyManager.recover({
82
- type: 'password',
83
- password: userPassword,
84
- });
85
-
86
- // Export backup file
87
- const backup = await keyManager.exportBackup(backupPassword);
88
- downloadFile('wallet.lcbackup', JSON.stringify(backup));
89
-
90
- // Import backup file
91
- const privateKey = await keyManager.recover({
92
- type: 'backup',
93
- fileContents: backupFileJson,
94
- password: backupPassword,
95
- });
96
- ```
42
+ > `createSSSKeyManager` and `SSSApiClient` are deprecated compatibility exports. Their legacy write
43
+ > methods fail closed because they cannot satisfy the hardened DID-challenge routes. Migrate callers
44
+ > to `createSSSStrategy`.
97
45
 
98
46
  ## Architecture
99
47
 
@@ -131,41 +79,10 @@ The package is designed to work with any authentication provider:
131
79
 
132
80
  ## API Reference
133
81
 
134
- ### `createSSSKeyManager(config)`
135
-
136
- Creates a new SSS Key Manager instance.
137
-
138
- ### `keyManager.connect()`
139
-
140
- Reconstructs the private key from device and auth shares.
141
-
142
- ### `keyManager.setupNewKey()`
143
-
144
- Generates a new private key and splits it into shares.
145
-
146
- ### `keyManager.setupWithKey(privateKey, primaryDid?)`
147
-
148
- Sets up SSS with an existing private key (used for migration).
149
-
150
- ### `keyManager.migrate(privateKey)`
151
-
152
- Migrates from Web3Auth to SSS, preserving the existing key.
153
-
154
- ### `keyManager.addRecoveryMethod(method)`
155
-
156
- Adds a recovery method (password, passkey, or backup).
157
-
158
- ### `keyManager.recover(method)`
159
-
160
- Recovers the private key using a recovery method.
161
-
162
- ### `keyManager.exportBackup(password)`
163
-
164
- Exports an encrypted backup file.
165
-
166
- ### `keyManager.getSecurityLevel()`
82
+ ### `createSSSStrategy(config)`
167
83
 
168
- Returns the current security level based on configured recovery methods.
84
+ Creates the SSS key-derivation strategy used by `AuthCoordinator` for setup, migration, recovery,
85
+ and DID-authorized server writes.
169
86
 
170
87
  ## Four shares
171
88
 
@@ -1,19 +1,23 @@
1
1
  /**
2
2
  * API client for SSS Key Manager server routes
3
3
  */
4
- import type { AuthProvider, ServerEncryptedShare, RecoveryMethodInfo, EncryptedShare, SecurityLevel } from './types';
4
+ import type { AuthProvider, AuthProviderType, ServerEncryptedShare, RecoveryMethodInfo, EncryptedShare, SecurityLevel, SssActivationState, IdentityRecoverySession } from './types';
5
+ import type { EmailRelayBranding } from './email-relay-crypto';
5
6
  export interface GetAuthShareResponse {
6
7
  authShare: ServerEncryptedShare | null;
7
8
  primaryDid: string | null;
8
9
  securityLevel: SecurityLevel;
9
10
  recoveryMethods: RecoveryMethodInfo[];
10
11
  keyProvider: 'web3auth' | 'sss';
12
+ shareVersion: number;
11
13
  maskedRecoveryEmail?: string | null;
14
+ sssActivationState: SssActivationState;
12
15
  }
13
16
  export interface StoreAuthShareInput {
14
17
  authShare: ServerEncryptedShare;
15
18
  primaryDid: string;
16
19
  securityLevel?: SecurityLevel;
20
+ sssActivationState?: 'provisional';
17
21
  }
18
22
  export interface StoreRecoveryShareInput {
19
23
  type: 'passkey' | 'backup' | 'phrase' | 'email';
@@ -21,29 +25,62 @@ export interface StoreRecoveryShareInput {
21
25
  credentialId?: string;
22
26
  shareVersion?: number;
23
27
  }
28
+ export interface RecoverySessionMaterial {
29
+ authShare: ServerEncryptedShare;
30
+ encryptedShare?: EncryptedShare;
31
+ primaryDid: string;
32
+ shareVersion: number;
33
+ rebindSessionToken: string;
34
+ }
24
35
  export interface ApiClientConfig {
25
36
  serverUrl: string;
26
37
  authProvider: AuthProvider;
38
+ escrowRelayPublicKey?: string;
39
+ escrowRelayKeyId?: string;
40
+ emailBranding?: EmailRelayBranding;
27
41
  }
42
+ /** @deprecated Use `createSSSStrategy`, which implements the hardened DID-challenge flow. */
28
43
  export declare class SSSApiClient {
29
44
  private serverUrl;
30
45
  private authProvider;
31
46
  constructor(config: ApiClientConfig);
32
47
  private getAuthHeaders;
33
- private getContactMethodFromUser;
34
48
  getAuthShare(): Promise<GetAuthShareResponse | null>;
35
- storeAuthShare(input: StoreAuthShareInput): Promise<void>;
36
- addRecoveryMethod(input: StoreRecoveryShareInput): Promise<void>;
49
+ /** @deprecated Requires DID-challenge authorization. Use `createSSSStrategy`. */
50
+ storeAuthShare(_input: StoreAuthShareInput): Promise<void>;
51
+ /** @deprecated Requires DID-challenge authorization. Use `createSSSStrategy`. */
52
+ addRecoveryMethod(_input: StoreRecoveryShareInput): Promise<void>;
37
53
  getRecoveryShare(type: 'passkey' | 'backup' | 'phrase' | 'email', credentialId?: string): Promise<{
38
54
  encryptedShare?: EncryptedShare;
39
55
  shareVersion?: number;
40
56
  } | null>;
57
+ startIdentityRecovery(email: string): Promise<void>;
58
+ verifyIdentityRecovery(email: string, code: string): Promise<IdentityRecoverySession>;
59
+ useIdentityRecoverySession(recoverySessionToken: string, type: StoreRecoveryShareInput['type'], credentialId?: string): Promise<RecoverySessionMaterial>;
60
+ completeIdentityRecoveryRebind(input: {
61
+ recoverySessionToken: string;
62
+ newAuthToken: string;
63
+ providerType: AuthProviderType;
64
+ primaryDid: string;
65
+ authShare: ServerEncryptedShare;
66
+ didAuthVp: string;
67
+ }): Promise<{
68
+ shareVersion: number;
69
+ recoveryMethodsRequireConfirmation: string[];
70
+ }>;
71
+ /** @deprecated Requires DID-challenge authorization. Use `createSSSStrategy`. */
41
72
  markMigrated(): Promise<void>;
42
- sendEmailBackupShare(emailShare: string, overrideEmail?: string): Promise<void>;
43
- addRecoveryEmail(email: string): Promise<void>;
44
- verifyRecoveryEmail(code: string): Promise<{
73
+ /** @deprecated Requires DID-challenge authorization. Use `createSSSStrategy`. */
74
+ activate(): Promise<void>;
75
+ /** @deprecated Requires DID-challenge authorization. Use `createSSSStrategy`. */
76
+ sendEmailBackupShare(_emailShare: string, _overrideEmail?: string): Promise<void>;
77
+ /** @deprecated Requires DID-challenge authorization. Use `createSSSStrategy`. */
78
+ addRecoveryEmail(_email: string): Promise<void>;
79
+ /** @deprecated Requires DID-challenge authorization. Use `createSSSStrategy`. */
80
+ verifyRecoveryEmail(_code: string): Promise<{
45
81
  maskedEmail: string;
46
82
  }>;
83
+ /** @deprecated Requires DID-challenge authorization. Use `createSSSStrategy`. */
47
84
  deleteUserKey(): Promise<void>;
48
85
  }
49
86
  //# sourceMappingURL=api-client.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"api-client.d.ts","sourceRoot":"","sources":["../src/api-client.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EACR,YAAY,EAGZ,oBAAoB,EACpB,kBAAkB,EAClB,cAAc,EACd,aAAa,EAChB,MAAM,SAAS,CAAC;AAEjB,MAAM,WAAW,oBAAoB;IACjC,SAAS,EAAE,oBAAoB,GAAG,IAAI,CAAC;IACvC,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,aAAa,EAAE,aAAa,CAAC;IAC7B,eAAe,EAAE,kBAAkB,EAAE,CAAC;IACtC,WAAW,EAAE,UAAU,GAAG,KAAK,CAAC;IAChC,mBAAmB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CACvC;AAED,MAAM,WAAW,mBAAmB;IAChC,SAAS,EAAE,oBAAoB,CAAC;IAChC,UAAU,EAAE,MAAM,CAAC;IACnB,aAAa,CAAC,EAAE,aAAa,CAAC;CACjC;AAED,MAAM,WAAW,uBAAuB;IACpC,IAAI,EAAE,SAAS,GAAG,QAAQ,GAAG,QAAQ,GAAG,OAAO,CAAC;IAChD,cAAc,CAAC,EAAE,cAAc,CAAC;IAChC,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,YAAY,CAAC,EAAE,MAAM,CAAC;CACzB;AAED,MAAM,WAAW,eAAe;IAC5B,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,EAAE,YAAY,CAAC;CAC9B;AAED,qBAAa,YAAY;IACrB,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,YAAY,CAAe;gBAEvB,MAAM,EAAE,eAAe;YAKrB,cAAc;YAQd,wBAAwB;IAahC,YAAY,IAAI,OAAO,CAAC,oBAAoB,GAAG,IAAI,CAAC;IAoBpD,cAAc,CAAC,KAAK,EAAE,mBAAmB,GAAG,OAAO,CAAC,IAAI,CAAC;IAkBzD,iBAAiB,CAAC,KAAK,EAAE,uBAAuB,GAAG,OAAO,CAAC,IAAI,CAAC;IAkBhE,gBAAgB,CAClB,IAAI,EAAE,SAAS,GAAG,QAAQ,GAAG,QAAQ,GAAG,OAAO,EAC/C,YAAY,CAAC,EAAE,MAAM,GACtB,OAAO,CAAC;QAAE,cAAc,CAAC,EAAE,cAAc,CAAC;QAAC,YAAY,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI,CAAC;IA+BvE,YAAY,IAAI,OAAO,CAAC,IAAI,CAAC;IAe7B,oBAAoB,CAAC,UAAU,EAAE,MAAM,EAAE,aAAa,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAgC/E,gBAAgB,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAgB9C,mBAAmB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC;QAAE,WAAW,EAAE,MAAM,CAAA;KAAE,CAAC;IAkBnE,aAAa,IAAI,OAAO,CAAC,IAAI,CAAC;CAcvC"}
1
+ {"version":3,"file":"api-client.d.ts","sourceRoot":"","sources":["../src/api-client.ts"],"names":[],"mappings":"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"}
@@ -18,6 +18,7 @@ export interface AtomicUpdateOptions {
18
18
  export interface StorageOperations {
19
19
  storeDevice: (share: string) => Promise<void>;
20
20
  storeAuth: (share: string) => Promise<void>;
21
+ clearDevice?: () => Promise<void>;
21
22
  getDevice?: () => Promise<string | null>;
22
23
  getAuth?: () => Promise<string | null>;
23
24
  }
@@ -33,6 +34,10 @@ export declare class AtomicUpdateError extends Error {
33
34
  readonly cause?: Error | undefined;
34
35
  constructor(message: string, phase: 'split' | 'verify' | 'store_device' | 'store_auth' | 'verify_stored', rolledBack: boolean, cause?: Error | undefined);
35
36
  }
37
+ /** A write was explicitly rejected, rather than its outcome being unknown. */
38
+ export declare class ShareWriteRejectedError extends Error {
39
+ constructor(message: string);
40
+ }
36
41
  /**
37
42
  * Split a private key into shares and verify ALL combinations reconstruct correctly.
38
43
  *
@@ -49,13 +54,16 @@ export declare function splitAndVerify(privateKey: string): Promise<AtomicSplitR
49
54
  *
50
55
  * This function ensures that either:
51
56
  * 1. Both device and auth shares are updated successfully, OR
52
- * 2. The previous state is restored (rollback)
57
+ * 2. A rejected write restores the previous state (rollback), OR
58
+ * 3. An indeterminate write preserves the new device share for reconciliation
53
59
  *
54
60
  * The operation flow:
55
61
  * 1. Generate and verify new shares
56
62
  * 2. Store device share locally
57
63
  * 3. Store auth share on server
58
- * 4. If step 3 fails, rollback step 2
64
+ * 4. Roll back only if step 3 throws ShareWriteRejectedError. Network failures
65
+ * may happen after commit and must never destroy the new device share.
66
+ * Callers can stage storeDevice in a separate entry to retain both versions.
59
67
  *
60
68
  * @param privateKey - The private key to split
61
69
  * @param storage - Storage operations for device and auth shares
@@ -1 +1 @@
1
- {"version":3,"file":"atomic-operations.d.ts","sourceRoot":"","sources":["../src/atomic-operations.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAA0C,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AAE/E,MAAM,WAAW,iBAAiB;IAC9B,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,SAAS,CAAC;IAClB,QAAQ,EAAE,OAAO,CAAC;CACrB;AAED,MAAM,WAAW,mBAAmB;IAChC,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,UAAU,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,CAAC;CACzC;AAED,MAAM,WAAW,iBAAiB;IAC9B,WAAW,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAC9C,SAAS,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAC5C,SAAS,CAAC,EAAE,MAAM,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;IACzC,OAAO,CAAC,EAAE,MAAM,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;CAC1C;AAED,qBAAa,sBAAuB,SAAQ,KAAK;aAGzB,WAAW,EAAE,MAAM;aACnB,QAAQ,EAAE,MAAM;aAChB,GAAG,EAAE,MAAM;gBAH3B,OAAO,EAAE,MAAM,EACC,WAAW,EAAE,MAAM,EACnB,QAAQ,EAAE,MAAM,EAChB,GAAG,EAAE,MAAM;CAKlC;AAED,qBAAa,iBAAkB,SAAQ,KAAK;aAGpB,KAAK,EAAE,OAAO,GAAG,QAAQ,GAAG,cAAc,GAAG,YAAY,GAAG,eAAe;aAC3E,UAAU,EAAE,OAAO;aACnB,KAAK,CAAC,EAAE,KAAK;gBAH7B,OAAO,EAAE,MAAM,EACC,KAAK,EAAE,OAAO,GAAG,QAAQ,GAAG,cAAc,GAAG,YAAY,GAAG,eAAe,EAC3E,UAAU,EAAE,OAAO,EACnB,KAAK,CAAC,EAAE,KAAK,YAAA;CAKpC;AAED;;;;;;;;;GASG;AACH,wBAAsB,cAAc,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,iBAAiB,CAAC,CA+BnF;AAED;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAsB,iBAAiB,CACnC,UAAU,EAAE,MAAM,EAClB,OAAO,EAAE,iBAAiB,EAC1B,OAAO,GAAE,mBAAwB,GAClC,OAAO,CAAC,SAAS,CAAC,CAuDpB;AAED;;;;;;;;;;GAUG;AACH,wBAAsB,kBAAkB,CACpC,OAAO,EAAE,IAAI,CAAC,iBAAiB,EAAE,WAAW,GAAG,SAAS,CAAC,EACzD,WAAW,EAAE,MAAM,EACnB,iBAAiB,EAAE,CAAC,UAAU,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,CAAC,GAC3D,OAAO,CAAC;IACP,OAAO,EAAE,OAAO,CAAC;IACjB,cAAc,EAAE,OAAO,CAAC;IACxB,YAAY,EAAE,OAAO,CAAC;IACtB,UAAU,EAAE,OAAO,CAAC;IACpB,KAAK,CAAC,EAAE,MAAM,CAAC;CAClB,CAAC,CA6CD;AAED;;;;;;;;;;;GAWG;AACH,wBAAsB,cAAc,CAChC,aAAa,EAAE,MAAM,EACrB,aAAa,EAAE,MAAM,EACrB,OAAO,EAAE,iBAAiB,EAC1B,OAAO,GAAE,mBAAwB,GAClC,OAAO,CAAC;IACP,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,SAAS,CAAC;CACxB,CAAC,CAWD"}
1
+ {"version":3,"file":"atomic-operations.d.ts","sourceRoot":"","sources":["../src/atomic-operations.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAA0C,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AAE/E,MAAM,WAAW,iBAAiB;IAC9B,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,SAAS,CAAC;IAClB,QAAQ,EAAE,OAAO,CAAC;CACrB;AAED,MAAM,WAAW,mBAAmB;IAChC,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,UAAU,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,CAAC;CACzC;AAED,MAAM,WAAW,iBAAiB;IAC9B,WAAW,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAC9C,SAAS,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAC5C,WAAW,CAAC,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAClC,SAAS,CAAC,EAAE,MAAM,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;IACzC,OAAO,CAAC,EAAE,MAAM,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;CAC1C;AAED,qBAAa,sBAAuB,SAAQ,KAAK;aAGzB,WAAW,EAAE,MAAM;aACnB,QAAQ,EAAE,MAAM;aAChB,GAAG,EAAE,MAAM;gBAH3B,OAAO,EAAE,MAAM,EACC,WAAW,EAAE,MAAM,EACnB,QAAQ,EAAE,MAAM,EAChB,GAAG,EAAE,MAAM;CAKlC;AAED,qBAAa,iBAAkB,SAAQ,KAAK;aAGpB,KAAK,EAAE,OAAO,GAAG,QAAQ,GAAG,cAAc,GAAG,YAAY,GAAG,eAAe;aAC3E,UAAU,EAAE,OAAO;aACnB,KAAK,CAAC,EAAE,KAAK;gBAH7B,OAAO,EAAE,MAAM,EACC,KAAK,EAAE,OAAO,GAAG,QAAQ,GAAG,cAAc,GAAG,YAAY,GAAG,eAAe,EAC3E,UAAU,EAAE,OAAO,EACnB,KAAK,CAAC,EAAE,KAAK,YAAA;CAKpC;AAED,8EAA8E;AAC9E,qBAAa,uBAAwB,SAAQ,KAAK;gBAClC,OAAO,EAAE,MAAM;CAI9B;AAED;;;;;;;;;GASG;AACH,wBAAsB,cAAc,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,iBAAiB,CAAC,CA+BnF;AAED;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,wBAAsB,iBAAiB,CACnC,UAAU,EAAE,MAAM,EAClB,OAAO,EAAE,iBAAiB,EAC1B,OAAO,GAAE,mBAAwB,GAClC,OAAO,CAAC,SAAS,CAAC,CA+EpB;AAED;;;;;;;;;;GAUG;AACH,wBAAsB,kBAAkB,CACpC,OAAO,EAAE,IAAI,CAAC,iBAAiB,EAAE,WAAW,GAAG,SAAS,CAAC,EACzD,WAAW,EAAE,MAAM,EACnB,iBAAiB,EAAE,CAAC,UAAU,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,CAAC,GAC3D,OAAO,CAAC;IACP,OAAO,EAAE,OAAO,CAAC;IACjB,cAAc,EAAE,OAAO,CAAC;IACxB,YAAY,EAAE,OAAO,CAAC;IACtB,UAAU,EAAE,OAAO,CAAC;IACpB,KAAK,CAAC,EAAE,MAAM,CAAC;CAClB,CAAC,CA6CD;AAED;;;;;;;;;;;GAWG;AACH,wBAAsB,cAAc,CAChC,aAAa,EAAE,MAAM,EACrB,aAAa,EAAE,MAAM,EACrB,OAAO,EAAE,iBAAiB,EAC1B,OAAO,GAAE,mBAAwB,GAClC,OAAO,CAAC;IACP,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,SAAS,CAAC;CACxB,CAAC,CAWD"}
@@ -0,0 +1,49 @@
1
+ /**
2
+ * Browser-compatible encryption for recovery-key delivery.
3
+ *
4
+ * This is an HPKE-style construction using Web Crypto primitives:
5
+ * ephemeral P-256 ECDH, HKDF-SHA-256, and AES-256-GCM. The relay public key
6
+ * is pinned in tenant/runtime configuration; only the isolated relay has the
7
+ * matching PKCS#8 private key.
8
+ */
9
+ export declare const EMAIL_RELAY_ENVELOPE_VERSION: 1;
10
+ export declare const EMAIL_RELAY_ALGORITHM: "P-256-HKDF-SHA256-AES-256-GCM";
11
+ export interface EmailRelayBranding {
12
+ brandName?: string;
13
+ logoUrl?: string;
14
+ logoAlt?: string;
15
+ primaryColor?: string;
16
+ primaryTextColor?: string;
17
+ supportEmail?: string;
18
+ websiteUrl?: string;
19
+ appUrl?: string;
20
+ fromDomain?: string;
21
+ copyrightHolder?: string;
22
+ }
23
+ export interface EmailRelayPlaintext {
24
+ version: typeof EMAIL_RELAY_ENVELOPE_VERSION;
25
+ targetEmail: string;
26
+ recoveryKey: string;
27
+ confirmationCode: string;
28
+ branding?: EmailRelayBranding;
29
+ }
30
+ export interface EmailRelayEnvelope {
31
+ version: typeof EMAIL_RELAY_ENVELOPE_VERSION;
32
+ algorithm: typeof EMAIL_RELAY_ALGORITHM;
33
+ keyId: string;
34
+ ephemeralPublicKey: string;
35
+ salt: string;
36
+ iv: string;
37
+ ciphertext: string;
38
+ }
39
+ /** Validate an untrusted encrypted envelope before attempting decryption. */
40
+ export declare const parseEmailRelayEnvelope: (value: unknown) => EmailRelayEnvelope;
41
+ /** Validate decrypted relay plaintext and copy only recognized fields. */
42
+ export declare const parseEmailRelayPlaintext: (value: unknown) => EmailRelayPlaintext;
43
+ /** Generate a uniformly distributed six-digit confirmation code in the browser. */
44
+ export declare const generateEmailRelayConfirmationCode: () => string;
45
+ /** Encrypt a complete recovery-email payload to a pinned relay SPKI public key. */
46
+ export declare const encryptEmailRelayPayload: (input: Omit<EmailRelayPlaintext, "version">, publicKeyBase64: string, keyId: string) => Promise<EmailRelayEnvelope>;
47
+ /** Decrypt an envelope using the relay's PKCS#8 P-256 private key. */
48
+ export declare const decryptEmailRelayPayload: (value: unknown, privateKeyBase64: string) => Promise<EmailRelayPlaintext>;
49
+ //# sourceMappingURL=email-relay-crypto.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"email-relay-crypto.d.ts","sourceRoot":"","sources":["../src/email-relay-crypto.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAIH,eAAO,MAAM,4BAA4B,EAAG,CAAU,CAAC;AACvD,eAAO,MAAM,qBAAqB,EAAG,+BAAwC,CAAC;AAc9E,MAAM,WAAW,kBAAkB;IAC/B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,eAAe,CAAC,EAAE,MAAM,CAAC;CAC5B;AAED,MAAM,WAAW,mBAAmB;IAChC,OAAO,EAAE,OAAO,4BAA4B,CAAC;IAC7C,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;IACpB,gBAAgB,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,EAAE,kBAAkB,CAAC;CACjC;AAED,MAAM,WAAW,kBAAkB;IAC/B,OAAO,EAAE,OAAO,4BAA4B,CAAC;IAC7C,SAAS,EAAE,OAAO,qBAAqB,CAAC;IACxC,KAAK,EAAE,MAAM,CAAC;IACd,kBAAkB,EAAE,MAAM,CAAC;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,EAAE,EAAE,MAAM,CAAC;IACX,UAAU,EAAE,MAAM,CAAC;CACtB;AAwDD,6EAA6E;AAC7E,eAAO,MAAM,uBAAuB,GAAI,OAAO,OAAO,KAAG,kBAqBxD,CAAC;AAEF,0EAA0E;AAC1E,eAAO,MAAM,wBAAwB,GAAI,OAAO,OAAO,KAAG,mBAwBzD,CAAC;AAyBF,mFAAmF;AACnF,eAAO,MAAM,kCAAkC,QAAO,MAUrD,CAAC;AAEF,mFAAmF;AACnF,eAAO,MAAM,wBAAwB,GACjC,OAAO,IAAI,CAAC,mBAAmB,EAAE,SAAS,CAAC,EAC3C,iBAAiB,MAAM,EACvB,OAAO,MAAM,KACd,OAAO,CAAC,kBAAkB,CAmD5B,CAAC;AAEF,sEAAsE;AACtE,eAAO,MAAM,wBAAwB,GACjC,OAAO,OAAO,EACd,kBAAkB,MAAM,KACzB,OAAO,CAAC,mBAAmB,CAgC7B,CAAC"}
@@ -0,0 +1,8 @@
1
+ import type { EscrowAttestationPolicy } from './types';
2
+ /** Parse untrusted attestation data and enforce an explicit enclave trust policy. */
3
+ export declare const verifyEnclaveAttestation: (attestation: unknown, policy: EscrowAttestationPolicy) => Promise<{
4
+ publicKey: string;
5
+ keyId: string;
6
+ mode: "software" | "nitro";
7
+ }>;
8
+ //# sourceMappingURL=escrow-attestation.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"escrow-attestation.d.ts","sourceRoot":"","sources":["../src/escrow-attestation.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,SAAS,CAAC;AAiBvD,qFAAqF;AACrF,eAAO,MAAM,wBAAwB,GACjC,aAAa,OAAO,EACpB,QAAQ,uBAAuB,KAChC,OAAO,CAAC;IAAE,SAAS,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,UAAU,GAAG,OAAO,CAAA;CAAE,CAyC1E,CAAC"}
@@ -0,0 +1,52 @@
1
+ /** Supported escrow wire-format version. */
2
+ export declare const ESCROW_ENVELOPE_VERSION: 1;
3
+ /** Cryptographic suite used by escrow envelopes. */
4
+ export declare const ESCROW_ALGORITHM: "P-256-HKDF-SHA256-AES-256-GCM";
5
+ /** HKDF info for client-to-enclave escrow blobs. */
6
+ export declare const ESCROW_BLOB_INFO = "learncard-escrow-blob-v1";
7
+ /** HKDF info for enclave-to-client release envelopes. */
8
+ export declare const ESCROW_RELEASE_INFO = "learncard-escrow-release-v1";
9
+ /** Recipient key identifier used when sealing a release. */
10
+ export declare const ESCROW_CLIENT_KEY_ID: "client";
11
+ /** Encrypted escrow payload with authenticated version, algorithm, and key ID. */
12
+ export interface EscrowEnvelope {
13
+ version: typeof ESCROW_ENVELOPE_VERSION;
14
+ algorithm: typeof ESCROW_ALGORITHM;
15
+ keyId: string;
16
+ ephemeralPublicKey: string;
17
+ salt: string;
18
+ iv: string;
19
+ ciphertext: string;
20
+ }
21
+ /** Recovery share bound to an identity and a positive share version. */
22
+ export interface EscrowBlobPlaintext {
23
+ version: typeof ESCROW_ENVELOPE_VERSION;
24
+ recoveryShare: string;
25
+ did: string;
26
+ shareVersion: number;
27
+ pinVerifier?: string;
28
+ }
29
+ /** Released recovery share additionally bound to its recovery hold. */
30
+ export interface EscrowReleasePlaintext extends EscrowBlobPlaintext {
31
+ holdId: string;
32
+ }
33
+ /** Validate an untrusted envelope before decryption, copying only recognized fields. */
34
+ export declare const parseEscrowEnvelope: (value: unknown) => EscrowEnvelope;
35
+ /** Validate blob plaintext, normalize hex to lowercase, and omit unknown fields. */
36
+ export declare const parseEscrowBlobPlaintext: (value: unknown) => EscrowBlobPlaintext;
37
+ /** Validate release plaintext, including its hold ID, and omit unknown fields. */
38
+ export declare const parseEscrowReleasePlaintext: (value: unknown) => EscrowReleasePlaintext;
39
+ /** Generate an extractable P-256 ECDH pair as base64 SPKI and PKCS#8 keys. */
40
+ export declare const generateEscrowKeyPair: () => Promise<{
41
+ publicKey: string;
42
+ privateKey: string;
43
+ }>;
44
+ /** Validate and encrypt a recovery share to the enclave's SPKI public key. */
45
+ export declare const encryptEscrowBlob: (input: Omit<EscrowBlobPlaintext, "version">, enclavePublicKeySpkiB64: string, keyId: string) => Promise<EscrowEnvelope>;
46
+ /** Decrypt and validate a blob using the enclave's PKCS#8 private key. */
47
+ export declare const decryptEscrowBlob: (envelope: unknown, enclavePrivateKeyPkcs8B64: string) => Promise<EscrowBlobPlaintext>;
48
+ /** Validate and seal a release to the recovering client's ephemeral SPKI public key. */
49
+ export declare const sealEscrowRelease: (input: Omit<EscrowReleasePlaintext, "version">, clientEphemeralPublicKeySpkiB64: string) => Promise<EscrowEnvelope>;
50
+ /** Open and validate a release using the recovering client's ephemeral PKCS#8 private key. */
51
+ export declare const openEscrowRelease: (envelope: unknown, clientEphemeralPrivateKeyPkcs8B64: string) => Promise<EscrowReleasePlaintext>;
52
+ //# sourceMappingURL=escrow-crypto.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"escrow-crypto.d.ts","sourceRoot":"","sources":["../src/escrow-crypto.ts"],"names":[],"mappings":"AAQA,4CAA4C;AAC5C,eAAO,MAAM,uBAAuB,EAAG,CAAU,CAAC;AAClD,oDAAoD;AACpD,eAAO,MAAM,gBAAgB,EAAG,+BAAwC,CAAC;AACzE,oDAAoD;AACpD,eAAO,MAAM,gBAAgB,6BAA6B,CAAC;AAC3D,yDAAyD;AACzD,eAAO,MAAM,mBAAmB,gCAAgC,CAAC;AACjE,4DAA4D;AAC5D,eAAO,MAAM,oBAAoB,EAAG,QAAiB,CAAC;AAEtD,kFAAkF;AAClF,MAAM,WAAW,cAAc;IAC3B,OAAO,EAAE,OAAO,uBAAuB,CAAC;IACxC,SAAS,EAAE,OAAO,gBAAgB,CAAC;IACnC,KAAK,EAAE,MAAM,CAAC;IACd,kBAAkB,EAAE,MAAM,CAAC;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,EAAE,EAAE,MAAM,CAAC;IACX,UAAU,EAAE,MAAM,CAAC;CACtB;AAED,wEAAwE;AACxE,MAAM,WAAW,mBAAmB;IAChC,OAAO,EAAE,OAAO,uBAAuB,CAAC;IACxC,aAAa,EAAE,MAAM,CAAC;IACtB,GAAG,EAAE,MAAM,CAAC;IACZ,YAAY,EAAE,MAAM,CAAC;IACrB,WAAW,CAAC,EAAE,MAAM,CAAC;CACxB;AAED,uEAAuE;AACvE,MAAM,WAAW,sBAAuB,SAAQ,mBAAmB;IAC/D,MAAM,EAAE,MAAM,CAAC;CAClB;AA+BD,wFAAwF;AACxF,eAAO,MAAM,mBAAmB,GAAI,OAAO,OAAO,KAAG,cAkBpD,CAAC;AAEF,oFAAoF;AACpF,eAAO,MAAM,wBAAwB,GAAI,OAAO,OAAO,KAAG,mBA+BzD,CAAC;AAEF,kFAAkF;AAClF,eAAO,MAAM,2BAA2B,GAAI,OAAO,OAAO,KAAG,sBAQ5D,CAAC;AA0BF,8EAA8E;AAC9E,eAAO,MAAM,qBAAqB,QAAa,OAAO,CAAC;IACnD,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;CACtB,CAUA,CAAC;AA8FF,8EAA8E;AAC9E,eAAO,MAAM,iBAAiB,GAC1B,OAAO,IAAI,CAAC,mBAAmB,EAAE,SAAS,CAAC,EAC3C,yBAAyB,MAAM,EAC/B,OAAO,MAAM,KACd,OAAO,CAAC,cAAc,CASxB,CAAC;AAEF,0EAA0E;AAC1E,eAAO,MAAM,iBAAiB,GAC1B,UAAU,OAAO,EACjB,2BAA2B,MAAM,KAClC,OAAO,CAAC,mBAAmB,CAGzB,CAAC;AAEN,wFAAwF;AACxF,eAAO,MAAM,iBAAiB,GAC1B,OAAO,IAAI,CAAC,sBAAsB,EAAE,SAAS,CAAC,EAC9C,iCAAiC,MAAM,KACxC,OAAO,CAAC,cAAc,CASxB,CAAC;AAEF,8FAA8F;AAC9F,eAAO,MAAM,iBAAiB,GAC1B,UAAU,OAAO,EACjB,mCAAmC,MAAM,KAC1C,OAAO,CAAC,sBAAsB,CAG5B,CAAC"}
@@ -0,0 +1,22 @@
1
+ export declare const PIN_MIN_LENGTH = 6;
2
+ export declare const PIN_MAX_LENGTH = 12;
3
+ export declare const ESCROW_PIN_MAX_ATTEMPTS = 10;
4
+ /** Normalize compatibility digits before removing formatting and non-digits. */
5
+ export declare const normalizePin: (raw: string) => string;
6
+ /** Validate the normalized PIN, rejecting full-length sequential and repeated digits. */
7
+ export declare const validatePin: (pin: string) => {
8
+ ok: true;
9
+ } | {
10
+ ok: false;
11
+ reason: "length" | "trivial";
12
+ };
13
+ /** Generate a public, random 16-byte salt encoded as standard base64. */
14
+ export declare const generatePinSalt: () => string;
15
+ /** Derive the enclave proof using the shared default Argon2id parameters. */
16
+ export declare const derivePinProof: (pin: string, pinSaltBase64: string) => Promise<string>;
17
+ /**
18
+ * Compare valid hex bytes without an early exit on differing contents.
19
+ * Format and length are public; JavaScript runtimes cannot guarantee constant-time execution.
20
+ */
21
+ export declare const constantTimeEqualHex: (a: string, b: string) => boolean;
22
+ //# sourceMappingURL=escrow-pin.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"escrow-pin.d.ts","sourceRoot":"","sources":["../src/escrow-pin.ts"],"names":[],"mappings":"AAQA,eAAO,MAAM,cAAc,IAAI,CAAC;AAChC,eAAO,MAAM,cAAc,KAAK,CAAC;AACjC,eAAO,MAAM,uBAAuB,KAAK,CAAC;AAc1C,gFAAgF;AAChF,eAAO,MAAM,YAAY,GAAI,KAAK,MAAM,KAAG,MACQ,CAAC;AAEpD,yFAAyF;AACzF,eAAO,MAAM,WAAW,GACpB,KAAK,MAAM,KACZ;IAAE,EAAE,EAAE,IAAI,CAAA;CAAE,GAAG;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,MAAM,EAAE,QAAQ,GAAG,SAAS,CAAA;CAgB1D,CAAC;AAEF,yEAAyE;AACzE,eAAO,MAAM,eAAe,QAAO,MACkC,CAAC;AAEtE,6EAA6E;AAC7E,eAAO,MAAM,cAAc,GAAU,KAAK,MAAM,EAAE,eAAe,MAAM,KAAG,OAAO,CAAC,MAAM,CAUvF,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,oBAAoB,GAAI,GAAG,MAAM,EAAE,GAAG,MAAM,KAAG,OAY3D,CAAC"}
package/dist/index.d.ts CHANGED
@@ -9,18 +9,27 @@ export { splitPrivateKey, reconstructPrivateKey, reconstructFromShares, SSS_TOTA
9
9
  export { storeDeviceShare, getDeviceShare, hasDeviceShare, deleteDeviceShare, clearAllShares, listAllDeviceShares, storeShareVersion, getShareVersion, isPublicComputerMode, setPublicComputerMode, createAdaptiveStorage, } from './storage';
10
10
  export type { DeviceShareEntry } from './storage';
11
11
  export { encryptWithPassword, decryptWithPassword, deriveKeyFromPassword, generateEd25519PrivateKey, hexToBytes, bytesToHex, bufferToBase64, base64ToBuffer, DEFAULT_KDF_PARAMS, } from './crypto';
12
+ export { EMAIL_RELAY_ALGORITHM, EMAIL_RELAY_ENVELOPE_VERSION, encryptEmailRelayPayload, decryptEmailRelayPayload, generateEmailRelayConfirmationCode, parseEmailRelayEnvelope, parseEmailRelayPlaintext, } from './email-relay-crypto';
13
+ export type { EmailRelayBranding, EmailRelayEnvelope, EmailRelayPlaintext, } from './email-relay-crypto';
14
+ export { ESCROW_ENVELOPE_VERSION, ESCROW_ALGORITHM, ESCROW_BLOB_INFO, ESCROW_RELEASE_INFO, ESCROW_CLIENT_KEY_ID, parseEscrowEnvelope, parseEscrowBlobPlaintext, parseEscrowReleasePlaintext, generateEscrowKeyPair, encryptEscrowBlob, decryptEscrowBlob, sealEscrowRelease, openEscrowRelease, } from './escrow-crypto';
15
+ export type { EscrowEnvelope, EscrowBlobPlaintext, EscrowReleasePlaintext } from './escrow-crypto';
16
+ export { verifyEnclaveAttestation } from './escrow-attestation';
17
+ export type { EscrowAttestationPolicy, EscrowHoldStatus, EscrowRecoveryStart } from './types';
18
+ export type { EscrowEnrollmentOptions, EscrowEnrollmentState, EscrowPinStatus } from './types';
19
+ export { EscrowPinMismatchError, EscrowPinLockedError, EscrowPinThrottledError, EscrowHoldRestartThrottledError, EscrowPinUnavailableError, } from './types';
20
+ export { PIN_MIN_LENGTH, PIN_MAX_LENGTH, ESCROW_PIN_MAX_ATTEMPTS, normalizePin, validatePin, generatePinSalt, derivePinProof, constantTimeEqualHex, } from './escrow-pin';
12
21
  export { createPasskeyCredential, deriveKeyFromPasskey, encryptShareWithPasskey, decryptShareWithPasskey, isWebAuthnSupported, isPRFSupported, } from './passkey';
13
22
  export type { PasskeyCredential, PasskeyEncryptedShare } from './passkey';
14
- export { shareToRecoveryPhrase, recoveryPhraseToShare, generateRecoveryPhrase, validateRecoveryPhrase, countWords, } from './recovery-phrase';
23
+ export { shareToRecoveryPhrase, recoveryPhraseToShare, generateRecoveryPhrase, validateRecoveryPhrase, countWords, buildRecoveryPhraseChallengeOptions, } from './recovery-phrase';
15
24
  export type { RecoveryPhraseData } from './recovery-phrase';
16
- export { splitAndVerify, atomicShareUpdate, verifyStoredShares, atomicRecovery, ShareVerificationError, AtomicUpdateError, } from './atomic-operations';
25
+ export { splitAndVerify, atomicShareUpdate, verifyStoredShares, atomicRecovery, ShareVerificationError, AtomicUpdateError, ShareWriteRejectedError, } from './atomic-operations';
17
26
  export type { AtomicSplitResult, AtomicUpdateOptions, StorageOperations, } from './atomic-operations';
18
- export { createSSSStrategy } from './sss-strategy';
27
+ export { createSSSStrategy, IdentityRecoverySessionConsumedError, EscrowRequestError, } from './sss-strategy';
19
28
  export type { SSSStorageFunctions, SSSStrategyConfig } from './sss-strategy';
20
29
  export { generateEphemeralKeypair, encryptShareForTransfer, decryptShareFromTransfer, } from './qr-crypto';
21
30
  export type { EphemeralKeypair, EncryptedSharePayload } from './qr-crypto';
22
31
  export { createQrLoginSession, pollQrLoginSession, pollUntilApproved, getQrLoginSessionInfo, approveQrLoginSession, notifyDevicesForQrSession, } from './qr-login';
23
32
  export type { QrLoginSession, QrLoginSessionInfo, QrLoginClientConfig, QrPayload, PollResult, NotifyDevicesResult, } from './qr-login';
24
33
  export { AuthSessionError } from './types';
25
- export type { SSSKeyManagerConfig, SSSKeyDerivationProvider, KeyDerivationProvider, KeyDerivationStrategy, SSSKeyDerivationStrategy, ServerKeyStatus, AuthProvider, AuthUser, AuthProviderType, ContactMethod, ContactMethodType, RecoveryMethod, RecoveryMethodType, RecoveryMethodInfo, RecoveryInput, RecoveryResult, RecoverySetupInput, RecoverySetupResult, PasskeyRecoveryMethod, BackupFileRecoveryMethod, RecoveryPhraseRecoveryMethod, SecurityLevel, BackupFile, EncryptedShare, ServerEncryptedShare, UserKeyRecord, AuthProviderMapping, } from './types';
34
+ export type { SSSKeyManagerConfig, SSSKeyDerivationProvider, KeyDerivationProvider, KeyDerivationStrategy, SSSKeyDerivationStrategy, ServerKeyStatus, AuthProvider, AuthUser, AuthProviderType, DidAuthVpSigner, ContactMethod, ContactMethodType, RecoveryMethod, RecoveryMethodType, RecoveryMethodInfo, RecoveryInput, RecoveryResult, RecoverySetupInput, RecoverySetupResult, RecoveryConfirmationInput, PasskeyRecoveryMethod, BackupFileRecoveryMethod, RecoveryPhraseRecoveryMethod, SecurityLevel, BackupFile, EncryptedShare, ServerEncryptedShare, UserKeyRecord, AuthProviderMapping, } from './types';
26
35
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,aAAa,EAAE,mBAAmB,EAAE,MAAM,eAAe,CAAC;AACnE,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAE5C,OAAO,EACH,eAAe,EACf,qBAAqB,EACrB,qBAAqB,EACrB,gBAAgB,EAChB,aAAa,GAChB,MAAM,OAAO,CAAC;AAEf,OAAO,EACH,gBAAgB,EAChB,cAAc,EACd,cAAc,EACd,iBAAiB,EACjB,cAAc,EACd,mBAAmB,EACnB,iBAAiB,EACjB,eAAe,EACf,oBAAoB,EACpB,qBAAqB,EACrB,qBAAqB,GACxB,MAAM,WAAW,CAAC;AAEnB,YAAY,EAAE,gBAAgB,EAAE,MAAM,WAAW,CAAC;AAElD,OAAO,EACH,mBAAmB,EACnB,mBAAmB,EACnB,qBAAqB,EACrB,yBAAyB,EACzB,UAAU,EACV,UAAU,EACV,cAAc,EACd,cAAc,EACd,kBAAkB,GACrB,MAAM,UAAU,CAAC;AAElB,OAAO,EACH,uBAAuB,EACvB,oBAAoB,EACpB,uBAAuB,EACvB,uBAAuB,EACvB,mBAAmB,EACnB,cAAc,GACjB,MAAM,WAAW,CAAC;AAEnB,YAAY,EAAE,iBAAiB,EAAE,qBAAqB,EAAE,MAAM,WAAW,CAAC;AAE1E,OAAO,EACH,qBAAqB,EACrB,qBAAqB,EACrB,sBAAsB,EACtB,sBAAsB,EACtB,UAAU,GACb,MAAM,mBAAmB,CAAC;AAE3B,YAAY,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AAE5D,OAAO,EACH,cAAc,EACd,iBAAiB,EACjB,kBAAkB,EAClB,cAAc,EACd,sBAAsB,EACtB,iBAAiB,GACpB,MAAM,qBAAqB,CAAC;AAE7B,YAAY,EACR,iBAAiB,EACjB,mBAAmB,EACnB,iBAAiB,GACpB,MAAM,qBAAqB,CAAC;AAE7B,OAAO,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AAEnD,YAAY,EAAE,mBAAmB,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AAE7E,OAAO,EACH,wBAAwB,EACxB,uBAAuB,EACvB,wBAAwB,GAC3B,MAAM,aAAa,CAAC;AAErB,YAAY,EAAE,gBAAgB,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAC;AAE3E,OAAO,EACH,oBAAoB,EACpB,kBAAkB,EAClB,iBAAiB,EACjB,qBAAqB,EACrB,qBAAqB,EACrB,yBAAyB,GAC5B,MAAM,YAAY,CAAC;AAEpB,YAAY,EACR,cAAc,EACd,kBAAkB,EAClB,mBAAmB,EACnB,SAAS,EACT,UAAU,EACV,mBAAmB,GACtB,MAAM,YAAY,CAAC;AAMpB,OAAO,EAAE,gBAAgB,EAAE,MAAM,SAAS,CAAC;AAE3C,YAAY,EACR,mBAAmB,EACnB,wBAAwB,EACxB,qBAAqB,EACrB,qBAAqB,EACrB,wBAAwB,EACxB,eAAe,EACf,YAAY,EACZ,QAAQ,EACR,gBAAgB,EAChB,aAAa,EACb,iBAAiB,EACjB,cAAc,EACd,kBAAkB,EAClB,kBAAkB,EAClB,aAAa,EACb,cAAc,EACd,kBAAkB,EAClB,mBAAmB,EACnB,qBAAqB,EACrB,wBAAwB,EACxB,4BAA4B,EAC5B,aAAa,EACb,UAAU,EACV,cAAc,EACd,oBAAoB,EACpB,aAAa,EACb,mBAAmB,GACtB,MAAM,SAAS,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,aAAa,EAAE,mBAAmB,EAAE,MAAM,eAAe,CAAC;AACnE,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAE5C,OAAO,EACH,eAAe,EACf,qBAAqB,EACrB,qBAAqB,EACrB,gBAAgB,EAChB,aAAa,GAChB,MAAM,OAAO,CAAC;AAEf,OAAO,EACH,gBAAgB,EAChB,cAAc,EACd,cAAc,EACd,iBAAiB,EACjB,cAAc,EACd,mBAAmB,EACnB,iBAAiB,EACjB,eAAe,EACf,oBAAoB,EACpB,qBAAqB,EACrB,qBAAqB,GACxB,MAAM,WAAW,CAAC;AAEnB,YAAY,EAAE,gBAAgB,EAAE,MAAM,WAAW,CAAC;AAElD,OAAO,EACH,mBAAmB,EACnB,mBAAmB,EACnB,qBAAqB,EACrB,yBAAyB,EACzB,UAAU,EACV,UAAU,EACV,cAAc,EACd,cAAc,EACd,kBAAkB,GACrB,MAAM,UAAU,CAAC;AAElB,OAAO,EACH,qBAAqB,EACrB,4BAA4B,EAC5B,wBAAwB,EACxB,wBAAwB,EACxB,kCAAkC,EAClC,uBAAuB,EACvB,wBAAwB,GAC3B,MAAM,sBAAsB,CAAC;AAE9B,YAAY,EACR,kBAAkB,EAClB,kBAAkB,EAClB,mBAAmB,GACtB,MAAM,sBAAsB,CAAC;AAE9B,OAAO,EACH,uBAAuB,EACvB,gBAAgB,EAChB,gBAAgB,EAChB,mBAAmB,EACnB,oBAAoB,EACpB,mBAAmB,EACnB,wBAAwB,EACxB,2BAA2B,EAC3B,qBAAqB,EACrB,iBAAiB,EACjB,iBAAiB,EACjB,iBAAiB,EACjB,iBAAiB,GACpB,MAAM,iBAAiB,CAAC;AAEzB,YAAY,EAAE,cAAc,EAAE,mBAAmB,EAAE,sBAAsB,EAAE,MAAM,iBAAiB,CAAC;AACnG,OAAO,EAAE,wBAAwB,EAAE,MAAM,sBAAsB,CAAC;AAChE,YAAY,EAAE,uBAAuB,EAAE,gBAAgB,EAAE,mBAAmB,EAAE,MAAM,SAAS,CAAC;AAC9F,YAAY,EAAE,uBAAuB,EAAE,qBAAqB,EAAE,eAAe,EAAE,MAAM,SAAS,CAAC;AAC/F,OAAO,EACH,sBAAsB,EACtB,oBAAoB,EACpB,uBAAuB,EACvB,+BAA+B,EAC/B,yBAAyB,GAC5B,MAAM,SAAS,CAAC;AACjB,OAAO,EACH,cAAc,EACd,cAAc,EACd,uBAAuB,EACvB,YAAY,EACZ,WAAW,EACX,eAAe,EACf,cAAc,EACd,oBAAoB,GACvB,MAAM,cAAc,CAAC;AAEtB,OAAO,EACH,uBAAuB,EACvB,oBAAoB,EACpB,uBAAuB,EACvB,uBAAuB,EACvB,mBAAmB,EACnB,cAAc,GACjB,MAAM,WAAW,CAAC;AAEnB,YAAY,EAAE,iBAAiB,EAAE,qBAAqB,EAAE,MAAM,WAAW,CAAC;AAE1E,OAAO,EACH,qBAAqB,EACrB,qBAAqB,EACrB,sBAAsB,EACtB,sBAAsB,EACtB,UAAU,EACV,mCAAmC,GACtC,MAAM,mBAAmB,CAAC;AAE3B,YAAY,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AAE5D,OAAO,EACH,cAAc,EACd,iBAAiB,EACjB,kBAAkB,EAClB,cAAc,EACd,sBAAsB,EACtB,iBAAiB,EACjB,uBAAuB,GAC1B,MAAM,qBAAqB,CAAC;AAE7B,YAAY,EACR,iBAAiB,EACjB,mBAAmB,EACnB,iBAAiB,GACpB,MAAM,qBAAqB,CAAC;AAE7B,OAAO,EACH,iBAAiB,EACjB,oCAAoC,EACpC,kBAAkB,GACrB,MAAM,gBAAgB,CAAC;AAExB,YAAY,EAAE,mBAAmB,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AAE7E,OAAO,EACH,wBAAwB,EACxB,uBAAuB,EACvB,wBAAwB,GAC3B,MAAM,aAAa,CAAC;AAErB,YAAY,EAAE,gBAAgB,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAC;AAE3E,OAAO,EACH,oBAAoB,EACpB,kBAAkB,EAClB,iBAAiB,EACjB,qBAAqB,EACrB,qBAAqB,EACrB,yBAAyB,GAC5B,MAAM,YAAY,CAAC;AAEpB,YAAY,EACR,cAAc,EACd,kBAAkB,EAClB,mBAAmB,EACnB,SAAS,EACT,UAAU,EACV,mBAAmB,GACtB,MAAM,YAAY,CAAC;AAMpB,OAAO,EAAE,gBAAgB,EAAE,MAAM,SAAS,CAAC;AAE3C,YAAY,EACR,mBAAmB,EACnB,wBAAwB,EACxB,qBAAqB,EACrB,qBAAqB,EACrB,wBAAwB,EACxB,eAAe,EACf,YAAY,EACZ,QAAQ,EACR,gBAAgB,EAChB,eAAe,EACf,aAAa,EACb,iBAAiB,EACjB,cAAc,EACd,kBAAkB,EAClB,kBAAkB,EAClB,aAAa,EACb,cAAc,EACd,kBAAkB,EAClB,mBAAmB,EACnB,yBAAyB,EACzB,qBAAqB,EACrB,wBAAwB,EACxB,4BAA4B,EAC5B,aAAa,EACb,UAAU,EACV,cAAc,EACd,oBAAoB,EACpB,aAAa,EACb,mBAAmB,GACtB,MAAM,SAAS,CAAC"}
@@ -2,6 +2,7 @@
2
2
  * SSS Key Manager - Main class
3
3
  */
4
4
  import type { SSSKeyManagerConfig, SSSKeyDerivationProvider, RecoveryMethod, RecoveryMethodInfo, SecurityLevel, BackupFile } from './types';
5
+ /** @deprecated Use `createSSSStrategy` with AuthCoordinator. */
5
6
  export declare class SSSKeyManager implements SSSKeyDerivationProvider {
6
7
  readonly name = "sss";
7
8
  private config;
@@ -26,5 +27,6 @@ export declare class SSSKeyManager implements SSSKeyDerivationProvider {
26
27
  clearLocalData(): Promise<void>;
27
28
  deleteAccount(): Promise<void>;
28
29
  }
30
+ /** @deprecated Use `createSSSStrategy` with AuthCoordinator. */
29
31
  export declare function createSSSKeyManager(config: SSSKeyManagerConfig): SSSKeyManager;
30
32
  //# sourceMappingURL=key-manager.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"key-manager.d.ts","sourceRoot":"","sources":["../src/key-manager.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EACR,mBAAmB,EACnB,wBAAwB,EACxB,cAAc,EACd,kBAAkB,EAClB,aAAa,EACb,UAAU,EAEb,MAAM,SAAS,CAAC;AA4BjB,qBAAa,aAAc,YAAW,wBAAwB;IAC1D,QAAQ,CAAC,IAAI,SAAS;IAEtB,OAAO,CAAC,MAAM,CAAsB;IACpC,OAAO,CAAC,SAAS,CAAe;IAChC,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,iBAAiB,CAAuB;gBAEpC,MAAM,EAAE,mBAAmB;IAQvC,aAAa,IAAI,OAAO;IAIlB,WAAW,IAAI,OAAO,CAAC,OAAO,CAAC;IAI/B,OAAO,IAAI,OAAO,CAAC,MAAM,CAAC;IA4B1B,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAK3B,WAAW,IAAI,OAAO,CAAC,MAAM,CAAC;IAM9B,YAAY,CAAC,UAAU,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAqBpE,OAAO,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAK1C,UAAU,IAAI,OAAO,CAAC,OAAO,CAAC;IAK9B,iBAAiB,CAAC,MAAM,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC;IAqCxD,sBAAsB,IAAI,OAAO,CAAC,MAAM,CAAC;IAWzC,kBAAkB,IAAI,OAAO,CAAC,kBAAkB,EAAE,CAAC;IAKnD,OAAO,CAAC,MAAM,EAAE,cAAc,GAAG,OAAO,CAAC,MAAM,CAAC;IA2FhD,gBAAgB,IAAI,OAAO,CAAC,aAAa,CAAC;IAK1C,YAAY,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC;IAuBnD,cAAc,IAAI,OAAO,CAAC,IAAI,CAAC;IAM/B,aAAa,IAAI,OAAO,CAAC,IAAI,CAAC;CAMvC;AAED,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,mBAAmB,GAAG,aAAa,CAE9E"}
1
+ {"version":3,"file":"key-manager.d.ts","sourceRoot":"","sources":["../src/key-manager.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EACR,mBAAmB,EACnB,wBAAwB,EACxB,cAAc,EACd,kBAAkB,EAClB,aAAa,EACb,UAAU,EAEb,MAAM,SAAS,CAAC;AAqBjB,gEAAgE;AAChE,qBAAa,aAAc,YAAW,wBAAwB;IAC1D,QAAQ,CAAC,IAAI,SAAS;IAEtB,OAAO,CAAC,MAAM,CAAsB;IACpC,OAAO,CAAC,SAAS,CAAe;IAChC,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,iBAAiB,CAAuB;gBAEpC,MAAM,EAAE,mBAAmB;IAQvC,aAAa,IAAI,OAAO;IAIlB,WAAW,IAAI,OAAO,CAAC,OAAO,CAAC;IAI/B,OAAO,IAAI,OAAO,CAAC,MAAM,CAAC;IA4B1B,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAK3B,WAAW,IAAI,OAAO,CAAC,MAAM,CAAC;IAM9B,YAAY,CAAC,UAAU,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAqBpE,OAAO,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAK1C,UAAU,IAAI,OAAO,CAAC,OAAO,CAAC;IAK9B,iBAAiB,CAAC,MAAM,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC;IAqCxD,sBAAsB,IAAI,OAAO,CAAC,MAAM,CAAC;IAWzC,kBAAkB,IAAI,OAAO,CAAC,kBAAkB,EAAE,CAAC;IAKnD,OAAO,CAAC,MAAM,EAAE,cAAc,GAAG,OAAO,CAAC,MAAM,CAAC;IA2FhD,gBAAgB,IAAI,OAAO,CAAC,aAAa,CAAC;IAK1C,YAAY,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC;IAuBnD,cAAc,IAAI,OAAO,CAAC,IAAI,CAAC;IAM/B,aAAa,IAAI,OAAO,CAAC,IAAI,CAAC;CAMvC;AAED,gEAAgE;AAChE,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,mBAAmB,GAAG,aAAa,CAE9E"}
@@ -1 +1 @@
1
- {"version":3,"file":"qr-login.d.ts","sourceRoot":"","sources":["../src/qr-login.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAUH,OAAO,KAAK,EAAE,gBAAgB,EAAyB,MAAM,aAAa,CAAC;AAM3E,MAAM,WAAW,cAAc;IAC3B,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,gBAAgB,EAAE,MAAM,CAAC;CAC5B;AAED,MAAM,WAAW,kBAAkB;IAC/B,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,SAAS,GAAG,UAAU,CAAC;IAC/B,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,WAAW,CAAC,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,WAAW,mBAAmB;IAChC,SAAS,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,SAAS;IACtB,+BAA+B;IAC/B,SAAS,EAAE,MAAM,CAAC;IAElB,iDAAiD;IACjD,SAAS,EAAE,MAAM,CAAC;IAElB,+BAA+B;IAC/B,SAAS,EAAE,MAAM,CAAC;CACrB;AAED,4EAA4E;AAC5E,MAAM,MAAM,UAAU,GAChB;IAAE,MAAM,EAAE,SAAS,CAAA;CAAE,GACrB;IAAE,MAAM,EAAE,UAAU,CAAC;IAAC,WAAW,EAAE,MAAM,CAAC;IAAC,WAAW,EAAE,MAAM,CAAC;IAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAAC,YAAY,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC;AAoBpH;;;;;GAKG;AACH,eAAO,MAAM,oBAAoB,GAC7B,QAAQ,mBAAmB,KAC5B,OAAO,CAAC;IACP,OAAO,EAAE,cAAc,CAAC;IACxB,gBAAgB,EAAE,gBAAgB,CAAC;IACnC,SAAS,EAAE,SAAS,CAAC;CACxB,CAsBA,CAAC;AAEF;;;;;;;;GAQG;AACH,eAAO,MAAM,kBAAkB,GAC3B,QAAQ,mBAAmB,EAC3B,WAAW,MAAM,EACjB,qBAAqB,SAAS,KAC/B,OAAO,CAAC,UAAU,CAkCpB,CAAC;AAEF;;;;;;;;;GASG;AACH,eAAO,MAAM,iBAAiB,GAC1B,QAAQ,mBAAmB,EAC3B,WAAW,MAAM,EACjB,qBAAqB,SAAS,EAC9B,UAAU;IACN,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;IACnC,MAAM,CAAC,EAAE,WAAW,CAAC;CACxB,KACF,OAAO,CAAC;IAAE,WAAW,EAAE,MAAM,CAAC;IAAC,WAAW,EAAE,MAAM,CAAC;IAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAAC,YAAY,CAAC,EAAE,MAAM,CAAA;CAAE,CAwCnG,CAAC;AAMF;;;;;GAKG;AACH,eAAO,MAAM,qBAAqB,GAC9B,QAAQ,mBAAmB,EAC3B,QAAQ,MAAM,KACf,OAAO,CAAC,kBAAkB,CAW5B,CAAC;AAEF;;;;;;;;;;;;GAYG;AACH,eAAO,MAAM,qBAAqB,GAC9B,QAAQ,mBAAmB,EAC3B,WAAW,MAAM,EACjB,aAAa,MAAM,EACnB,aAAa,MAAM,EACnB,oBAAoB,MAAM,EAC1B,cAAc,MAAM,EACpB,eAAe,MAAM,KACtB,OAAO,CAAC,IAAI,CAoBd,CAAC;AAMF,MAAM,WAAW,mBAAmB;IAChC,IAAI,EAAE,OAAO,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;CACvB;AAED;;;;;;;;GAQG;AACH,eAAO,MAAM,yBAAyB,GAClC,QAAQ,mBAAmB,EAC3B,WAAW,MAAM,EACjB,WAAW,MAAM,EACjB,WAAW,MAAM,EACjB,eAAc,MAAmB,KAClC,OAAO,CAAC,mBAAmB,CAqB7B,CAAC"}
1
+ {"version":3,"file":"qr-login.d.ts","sourceRoot":"","sources":["../src/qr-login.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAUH,OAAO,KAAK,EAAE,gBAAgB,EAAyB,MAAM,aAAa,CAAC;AAM3E,MAAM,WAAW,cAAc;IAC3B,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,gBAAgB,EAAE,MAAM,CAAC;CAC5B;AAED,MAAM,WAAW,kBAAkB;IAC/B,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,SAAS,GAAG,UAAU,CAAC;IAC/B,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,WAAW,CAAC,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,WAAW,mBAAmB;IAChC,SAAS,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,SAAS;IACtB,+BAA+B;IAC/B,SAAS,EAAE,MAAM,CAAC;IAElB,iDAAiD;IACjD,SAAS,EAAE,MAAM,CAAC;IAElB,+BAA+B;IAC/B,SAAS,EAAE,MAAM,CAAC;CACrB;AAED,4EAA4E;AAC5E,MAAM,MAAM,UAAU,GAChB;IAAE,MAAM,EAAE,SAAS,CAAA;CAAE,GACrB;IACI,MAAM,EAAE,UAAU,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,YAAY,CAAC,EAAE,MAAM,CAAC;CACzB,CAAC;AAYR;;;;;GAKG;AACH,eAAO,MAAM,oBAAoB,GAC7B,QAAQ,mBAAmB,KAC5B,OAAO,CAAC;IACP,OAAO,EAAE,cAAc,CAAC;IACxB,gBAAgB,EAAE,gBAAgB,CAAC;IACnC,SAAS,EAAE,SAAS,CAAC;CACxB,CAsBA,CAAC;AAEF;;;;;;;;GAQG;AACH,eAAO,MAAM,kBAAkB,GAC3B,QAAQ,mBAAmB,EAC3B,WAAW,MAAM,EACjB,qBAAqB,SAAS,KAC/B,OAAO,CAAC,UAAU,CAkCpB,CAAC;AAEF;;;;;;;;;GASG;AACH,eAAO,MAAM,iBAAiB,GAC1B,QAAQ,mBAAmB,EAC3B,WAAW,MAAM,EACjB,qBAAqB,SAAS,EAC9B,UAAU;IACN,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;IACnC,MAAM,CAAC,EAAE,WAAW,CAAC;CACxB,KACF,OAAO,CAAC;IACP,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,YAAY,CAAC,EAAE,MAAM,CAAC;CACzB,CA4CA,CAAC;AAMF;;;;;GAKG;AACH,eAAO,MAAM,qBAAqB,GAC9B,QAAQ,mBAAmB,EAC3B,QAAQ,MAAM,KACf,OAAO,CAAC,kBAAkB,CAW5B,CAAC;AAEF;;;;;;;;;;;;GAYG;AACH,eAAO,MAAM,qBAAqB,GAC9B,QAAQ,mBAAmB,EAC3B,WAAW,MAAM,EACjB,aAAa,MAAM,EACnB,aAAa,MAAM,EACnB,oBAAoB,MAAM,EAC1B,cAAc,MAAM,EACpB,eAAe,MAAM,KACtB,OAAO,CAAC,IAAI,CAoBd,CAAC;AAMF,MAAM,WAAW,mBAAmB;IAChC,IAAI,EAAE,OAAO,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;CACvB;AAED;;;;;;;;GAQG;AACH,eAAO,MAAM,yBAAyB,GAClC,QAAQ,mBAAmB,EAC3B,WAAW,MAAM,EACjB,WAAW,MAAM,EACjB,WAAW,MAAM,EACjB,eAAc,MAAmB,KAClC,OAAO,CAAC,mBAAmB,CAqB7B,CAAC"}
@@ -11,4 +11,10 @@ export declare function recoveryPhraseToShare(phrase: string): Promise<string>;
11
11
  export declare function generateRecoveryPhrase(shareHex: string): Promise<RecoveryPhraseData>;
12
12
  export declare function validateRecoveryPhrase(phrase: string): Promise<boolean>;
13
13
  export declare function countWords(phrase: string): number;
14
+ /**
15
+ * Builds tap-to-confirm choices for each challenged word: the correct word plus
16
+ * `optionCount - 1` decoys, shuffled. Decoys never appear anywhere in the phrase,
17
+ * so a choice can only be right for its own position.
18
+ */
19
+ export declare function buildRecoveryPhraseChallengeOptions(phrase: string, challengeWordIndices: number[], optionCount?: number): Promise<string[][]>;
14
20
  //# sourceMappingURL=recovery-phrase.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"recovery-phrase.d.ts","sourceRoot":"","sources":["../src/recovery-phrase.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH,MAAM,WAAW,kBAAkB;IAC/B,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;CACpB;AAkCD,wBAAsB,qBAAqB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAc7E;AAED,wBAAsB,qBAAqB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAoD3E;AAED,wBAAsB,sBAAsB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,kBAAkB,CAAC,CAG1F;AAED,wBAAsB,sBAAsB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAO7E;AAED,wBAAgB,UAAU,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAKjD"}
1
+ {"version":3,"file":"recovery-phrase.d.ts","sourceRoot":"","sources":["../src/recovery-phrase.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH,MAAM,WAAW,kBAAkB;IAC/B,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;CACpB;AAkCD,wBAAsB,qBAAqB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAc7E;AAED,wBAAsB,qBAAqB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAoD3E;AAED,wBAAsB,sBAAsB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,kBAAkB,CAAC,CAG1F;AAED,wBAAsB,sBAAsB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAO7E;AAED,wBAAgB,UAAU,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAKjD;AAYD;;;;GAIG;AACH,wBAAsB,mCAAmC,CACrD,MAAM,EAAE,MAAM,EACd,oBAAoB,EAAE,MAAM,EAAE,EAC9B,WAAW,SAAI,GAChB,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAmBrB"}