@learncard/sss-key-manager 0.1.24 → 0.2.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.
Files changed (75) hide show
  1. package/README.md +25 -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 +12 -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-nitro-attestation.d.ts +32 -0
  13. package/dist/escrow-nitro-attestation.d.ts.map +1 -0
  14. package/dist/escrow-pin.d.ts +22 -0
  15. package/dist/escrow-pin.d.ts.map +1 -0
  16. package/dist/index.d.ts +15 -4
  17. package/dist/index.d.ts.map +1 -1
  18. package/dist/key-manager.d.ts +2 -0
  19. package/dist/key-manager.d.ts.map +1 -1
  20. package/dist/qr-login.d.ts.map +1 -1
  21. package/dist/recovery-phrase.d.ts +6 -0
  22. package/dist/recovery-phrase.d.ts.map +1 -1
  23. package/dist/sss-key-manager.cjs.development.js +5564 -353
  24. package/dist/sss-key-manager.cjs.development.js.map +4 -4
  25. package/dist/sss-key-manager.cjs.production.min.js +33 -33
  26. package/dist/sss-key-manager.cjs.production.min.js.map +4 -4
  27. package/dist/sss-key-manager.esm.js +3494 -354
  28. package/dist/sss-key-manager.esm.js.map +4 -4
  29. package/dist/sss-strategy.d.ts +74 -4
  30. package/dist/sss-strategy.d.ts.map +1 -1
  31. package/dist/storage.d.ts +1 -0
  32. package/dist/storage.d.ts.map +1 -1
  33. package/dist/types.d.ts +98 -4
  34. package/dist/types.d.ts.map +1 -1
  35. package/package.json +7 -3
  36. package/src/__fixtures__/escrow-vectors-rust.json +82 -0
  37. package/src/__fixtures__/escrow-vectors.json +103 -0
  38. package/src/__fixtures__/nitro-attestation/bad-signature.cbor.b64 +1 -0
  39. package/src/__fixtures__/nitro-attestation/debug-zero-pcrs.cbor.b64 +1 -0
  40. package/src/__fixtures__/nitro-attestation/legacy-user-data.cbor.b64 +1 -0
  41. package/src/__fixtures__/nitro-attestation/manifest.json +60 -0
  42. package/src/__fixtures__/nitro-attestation/nonce-mismatch.cbor.b64 +1 -0
  43. package/src/__fixtures__/nitro-attestation/root.pem +12 -0
  44. package/src/__fixtures__/nitro-attestation/stale-timestamp.cbor.b64 +1 -0
  45. package/src/__fixtures__/nitro-attestation/tampered-previous-key-ids.cbor.b64 +1 -0
  46. package/src/__fixtures__/nitro-attestation/truncated-chain.cbor.b64 +1 -0
  47. package/src/__fixtures__/nitro-attestation/valid.cbor.b64 +1 -0
  48. package/src/__fixtures__/nitro-attestation/wrong-pcr0.cbor.b64 +1 -0
  49. package/src/__fixtures__/nitro-attestation/wrong-root.cbor.b64 +1 -0
  50. package/src/api-client.test.ts +122 -0
  51. package/src/api-client.ts +107 -116
  52. package/src/atomic-operations.test.ts +56 -16
  53. package/src/atomic-operations.ts +55 -19
  54. package/src/critical-paths.test.ts +51 -1
  55. package/src/email-relay-crypto.test.ts +87 -0
  56. package/src/email-relay-crypto.ts +293 -0
  57. package/src/escrow-attestation.test.ts +90 -0
  58. package/src/escrow-attestation.ts +125 -0
  59. package/src/escrow-crypto.test.ts +381 -0
  60. package/src/escrow-crypto.ts +319 -0
  61. package/src/escrow-nitro-attestation.test.ts +204 -0
  62. package/src/escrow-nitro-attestation.ts +286 -0
  63. package/src/escrow-pin.test.ts +119 -0
  64. package/src/escrow-pin.ts +83 -0
  65. package/src/escrow-vectors.test.ts +198 -0
  66. package/src/index.ts +70 -1
  67. package/src/key-manager.ts +4 -9
  68. package/src/qr-login.ts +22 -15
  69. package/src/recovery-phrase.ts +40 -0
  70. package/src/sss-session-writes.test.ts +109 -0
  71. package/src/sss-strategy.test.ts +2736 -111
  72. package/src/sss-strategy.ts +2226 -224
  73. package/src/storage.test.ts +66 -8
  74. package/src/storage.ts +41 -29
  75. package/src/types.ts +118 -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
 
@@ -115,6 +63,19 @@ const privateKey = await keyManager.recover({
115
63
 
116
64
  ## Security Model
117
65
 
66
+ ### Nitro attestation trust policy
67
+
68
+ Nitro enrollment verifies a nonce-bound COSE ES384 document, the certificate chain against a
69
+ pinned root DER SHA-256 (AWS Nitro Root G1 by default), and one complete PCR0/1/2 tuple.
70
+ Configure `pinnedMeasurements: [{ pcr0, pcr1, pcr2, imageSha384? }]` with 48-byte hex PCRs.
71
+ Legacy `{ imageSha384 }` entries remain type-compatible but **never match**; they cannot authorize
72
+ enrollment. `rootCertificateSha256` is an explicit trust-anchor override (test roots must never be
73
+ used in production). `maxAgeMs` defaults to 300000; future timestamps allow at most 60 seconds skew.
74
+ The escrow P-256 SPKI comes only from signed `user_data`, not the NSM `public_key` used for KMS.
75
+ `verifyEnclaveAttestation(attestation, policy, nonce)` requires the expected 32-byte nonce in Nitro
76
+ mode. The strategy sends a fresh hex nonce on each attestation GET; software mode ignores the nonce
77
+ and continues to require a pinned public key.
78
+
118
79
  - **Device Share**: Encrypted with non-extractable AES-GCM key stored in IndexedDB
119
80
  - **Auth Share**: Server-side envelope encryption (DEK + KMS-encrypted DEK)
120
81
  - **Recovery Share**: Password-based uses Argon2id KDF with secure parameters
@@ -131,41 +92,10 @@ The package is designed to work with any authentication provider:
131
92
 
132
93
  ## API Reference
133
94
 
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()`
95
+ ### `createSSSStrategy(config)`
167
96
 
168
- Returns the current security level based on configured recovery methods.
97
+ Creates the SSS key-derivation strategy used by `AuthCoordinator` for setup, migration, recovery,
98
+ and DID-authorized server writes.
169
99
 
170
100
  ## Four shares
171
101
 
@@ -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,12 @@
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, nonce?: Uint8Array) => Promise<{
4
+ publicKey: string;
5
+ keyId: string;
6
+ /** P9.1: retired keyIds still accepted for decrypt. In nitro mode this is
7
+ * the value bound inside the signed attestation document, cross-checked
8
+ * against the plaintext field below — never the plaintext alone. */
9
+ previousKeyIds: string[];
10
+ mode: "software" | "nitro";
11
+ }>;
12
+ //# 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;AAkBvD,qFAAqF;AACrF,eAAO,MAAM,wBAAwB,GACjC,aAAa,OAAO,EACpB,QAAQ,uBAAuB,EAC/B,QAAQ,UAAU,KACnB,OAAO,CAAC;IACP,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;IACd;;wEAEoE;IACpE,cAAc,EAAE,MAAM,EAAE,CAAC;IACzB,IAAI,EAAE,UAAU,GAAG,OAAO,CAAC;CAC9B,CA4FA,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,32 @@
1
+ import 'reflect-metadata';
2
+ import type { EscrowAttestationPolicy } from './types';
3
+ export type NitroAttestationReason = 'cbor' | 'cose' | 'alg' | 'chain' | 'root' | 'signature' | 'pcr' | 'debug' | 'nonce' | 'freshness' | 'user-data';
4
+ /** A fail-closed attestation failure with a stable, non-sensitive reason. */
5
+ export declare class NitroAttestationError extends Error {
6
+ readonly reason: NitroAttestationReason;
7
+ constructor(reason: NitroAttestationReason);
8
+ }
9
+ type NitroPolicy = Extract<EscrowAttestationPolicy, {
10
+ mode: 'nitro';
11
+ }>;
12
+ /** Verify signed NSM evidence before trusting its P-256 escrow key (not public_key/KMS key). */
13
+ export declare const verifyNitroAttestationDocument: (documentB64: string, { expectedNonce, policy, now, }: {
14
+ expectedNonce: Uint8Array;
15
+ policy: NitroPolicy;
16
+ now?: number;
17
+ }) => Promise<{
18
+ escrowPublicKeySpkiB64: string;
19
+ /** P9.1: the enclave's own current keyId, bound inside this same signed
20
+ * document. `undefined` for the legacy user_data format, which never
21
+ * carried a keyId — callers must not silently trust a plaintext keyId in
22
+ * that case any more than they did before this field existed. */
23
+ keyId: string | undefined;
24
+ /** P9.1: retired keyIds the enclave still accepts for decrypt only, bound
25
+ * inside this same signed document. Empty for the legacy user_data format. */
26
+ previousKeyIds: string[];
27
+ pcrs: Record<number, string>;
28
+ timestamp: number;
29
+ moduleId: string;
30
+ }>;
31
+ export {};
32
+ //# sourceMappingURL=escrow-nitro-attestation.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"escrow-nitro-attestation.d.ts","sourceRoot":"","sources":["../src/escrow-nitro-attestation.ts"],"names":[],"mappings":"AAAA,OAAO,kBAAkB,CAAC;AAS1B,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,SAAS,CAAC;AAEvD,MAAM,MAAM,sBAAsB,GAC5B,MAAM,GACN,MAAM,GACN,KAAK,GACL,OAAO,GACP,MAAM,GACN,WAAW,GACX,KAAK,GACL,OAAO,GACP,OAAO,GACP,WAAW,GACX,WAAW,CAAC;AAElB,6EAA6E;AAC7E,qBAAa,qBAAsB,SAAQ,KAAK;aAChB,MAAM,EAAE,sBAAsB;gBAA9B,MAAM,EAAE,sBAAsB;CAI7D;AAGD,KAAK,WAAW,GAAG,OAAO,CAAC,uBAAuB,EAAE;IAAE,IAAI,EAAE,OAAO,CAAA;CAAE,CAAC,CAAC;AA2EvE,gGAAgG;AAChG,eAAO,MAAM,8BAA8B,GACvC,aAAa,MAAM,EACnB,iCAIG;IACC,aAAa,EAAE,UAAU,CAAC;IAC1B,MAAM,EAAE,WAAW,CAAC;IACpB,GAAG,CAAC,EAAE,MAAM,CAAC;CAChB,KACF,OAAO,CAAC;IACP,sBAAsB,EAAE,MAAM,CAAC;IAC/B;;;qEAGiE;IACjE,KAAK,EAAE,MAAM,GAAG,SAAS,CAAC;IAC1B;kFAC8E;IAC9E,cAAc,EAAE,MAAM,EAAE,CAAC;IACzB,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC7B,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;CACpB,CAwJA,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,29 @@ 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 { verifyNitroAttestationDocument, NitroAttestationError } from './escrow-nitro-attestation';
18
+ export type { NitroAttestationReason } from './escrow-nitro-attestation';
19
+ export type { EscrowAttestationPolicy, EscrowHoldStatus, EscrowRecoveryStart } from './types';
20
+ export type { EscrowEnrollmentOptions, EscrowEnrollmentState, EscrowBlobStaleReason, EscrowPinStatus, } from './types';
21
+ export { EscrowPinMismatchError, EscrowPinLockedError, EscrowPinThrottledError, EscrowHoldRestartThrottledError, EscrowPinUnavailableError, } from './types';
22
+ export { PIN_MIN_LENGTH, PIN_MAX_LENGTH, ESCROW_PIN_MAX_ATTEMPTS, normalizePin, validatePin, generatePinSalt, derivePinProof, constantTimeEqualHex, } from './escrow-pin';
12
23
  export { createPasskeyCredential, deriveKeyFromPasskey, encryptShareWithPasskey, decryptShareWithPasskey, isWebAuthnSupported, isPRFSupported, } from './passkey';
13
24
  export type { PasskeyCredential, PasskeyEncryptedShare } from './passkey';
14
- export { shareToRecoveryPhrase, recoveryPhraseToShare, generateRecoveryPhrase, validateRecoveryPhrase, countWords, } from './recovery-phrase';
25
+ export { shareToRecoveryPhrase, recoveryPhraseToShare, generateRecoveryPhrase, validateRecoveryPhrase, countWords, buildRecoveryPhraseChallengeOptions, } from './recovery-phrase';
15
26
  export type { RecoveryPhraseData } from './recovery-phrase';
16
- export { splitAndVerify, atomicShareUpdate, verifyStoredShares, atomicRecovery, ShareVerificationError, AtomicUpdateError, } from './atomic-operations';
27
+ export { splitAndVerify, atomicShareUpdate, verifyStoredShares, atomicRecovery, ShareVerificationError, AtomicUpdateError, ShareWriteRejectedError, } from './atomic-operations';
17
28
  export type { AtomicSplitResult, AtomicUpdateOptions, StorageOperations, } from './atomic-operations';
18
- export { createSSSStrategy } from './sss-strategy';
29
+ export { createSSSStrategy, IdentityRecoverySessionConsumedError, EscrowRequestError, } from './sss-strategy';
19
30
  export type { SSSStorageFunctions, SSSStrategyConfig } from './sss-strategy';
20
31
  export { generateEphemeralKeypair, encryptShareForTransfer, decryptShareFromTransfer, } from './qr-crypto';
21
32
  export type { EphemeralKeypair, EncryptedSharePayload } from './qr-crypto';
22
33
  export { createQrLoginSession, pollQrLoginSession, pollUntilApproved, getQrLoginSessionInfo, approveQrLoginSession, notifyDevicesForQrSession, } from './qr-login';
23
34
  export type { QrLoginSession, QrLoginSessionInfo, QrLoginClientConfig, QrPayload, PollResult, NotifyDevicesResult, } from './qr-login';
24
35
  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';
36
+ 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
37
  //# 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":"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"}
@@ -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"}