@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.
- package/README.md +25 -95
- package/dist/api-client.d.ts +44 -7
- package/dist/api-client.d.ts.map +1 -1
- package/dist/atomic-operations.d.ts +10 -2
- package/dist/atomic-operations.d.ts.map +1 -1
- package/dist/email-relay-crypto.d.ts +49 -0
- package/dist/email-relay-crypto.d.ts.map +1 -0
- package/dist/escrow-attestation.d.ts +12 -0
- package/dist/escrow-attestation.d.ts.map +1 -0
- package/dist/escrow-crypto.d.ts +52 -0
- package/dist/escrow-crypto.d.ts.map +1 -0
- package/dist/escrow-nitro-attestation.d.ts +32 -0
- package/dist/escrow-nitro-attestation.d.ts.map +1 -0
- package/dist/escrow-pin.d.ts +22 -0
- package/dist/escrow-pin.d.ts.map +1 -0
- package/dist/index.d.ts +15 -4
- package/dist/index.d.ts.map +1 -1
- package/dist/key-manager.d.ts +2 -0
- package/dist/key-manager.d.ts.map +1 -1
- package/dist/qr-login.d.ts.map +1 -1
- package/dist/recovery-phrase.d.ts +6 -0
- package/dist/recovery-phrase.d.ts.map +1 -1
- package/dist/sss-key-manager.cjs.development.js +5564 -353
- package/dist/sss-key-manager.cjs.development.js.map +4 -4
- package/dist/sss-key-manager.cjs.production.min.js +33 -33
- package/dist/sss-key-manager.cjs.production.min.js.map +4 -4
- package/dist/sss-key-manager.esm.js +3494 -354
- package/dist/sss-key-manager.esm.js.map +4 -4
- package/dist/sss-strategy.d.ts +74 -4
- package/dist/sss-strategy.d.ts.map +1 -1
- package/dist/storage.d.ts +1 -0
- package/dist/storage.d.ts.map +1 -1
- package/dist/types.d.ts +98 -4
- package/dist/types.d.ts.map +1 -1
- package/package.json +7 -3
- package/src/__fixtures__/escrow-vectors-rust.json +82 -0
- package/src/__fixtures__/escrow-vectors.json +103 -0
- package/src/__fixtures__/nitro-attestation/bad-signature.cbor.b64 +1 -0
- package/src/__fixtures__/nitro-attestation/debug-zero-pcrs.cbor.b64 +1 -0
- package/src/__fixtures__/nitro-attestation/legacy-user-data.cbor.b64 +1 -0
- package/src/__fixtures__/nitro-attestation/manifest.json +60 -0
- package/src/__fixtures__/nitro-attestation/nonce-mismatch.cbor.b64 +1 -0
- package/src/__fixtures__/nitro-attestation/root.pem +12 -0
- package/src/__fixtures__/nitro-attestation/stale-timestamp.cbor.b64 +1 -0
- package/src/__fixtures__/nitro-attestation/tampered-previous-key-ids.cbor.b64 +1 -0
- package/src/__fixtures__/nitro-attestation/truncated-chain.cbor.b64 +1 -0
- package/src/__fixtures__/nitro-attestation/valid.cbor.b64 +1 -0
- package/src/__fixtures__/nitro-attestation/wrong-pcr0.cbor.b64 +1 -0
- package/src/__fixtures__/nitro-attestation/wrong-root.cbor.b64 +1 -0
- package/src/api-client.test.ts +122 -0
- package/src/api-client.ts +107 -116
- package/src/atomic-operations.test.ts +56 -16
- package/src/atomic-operations.ts +55 -19
- package/src/critical-paths.test.ts +51 -1
- package/src/email-relay-crypto.test.ts +87 -0
- package/src/email-relay-crypto.ts +293 -0
- package/src/escrow-attestation.test.ts +90 -0
- package/src/escrow-attestation.ts +125 -0
- package/src/escrow-crypto.test.ts +381 -0
- package/src/escrow-crypto.ts +319 -0
- package/src/escrow-nitro-attestation.test.ts +204 -0
- package/src/escrow-nitro-attestation.ts +286 -0
- package/src/escrow-pin.test.ts +119 -0
- package/src/escrow-pin.ts +83 -0
- package/src/escrow-vectors.test.ts +198 -0
- package/src/index.ts +70 -1
- package/src/key-manager.ts +4 -9
- package/src/qr-login.ts +22 -15
- package/src/recovery-phrase.ts +40 -0
- package/src/sss-session-writes.test.ts +109 -0
- package/src/sss-strategy.test.ts +2736 -111
- package/src/sss-strategy.ts +2226 -224
- package/src/storage.test.ts +66 -8
- package/src/storage.ts +41 -29
- 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
|
-
###
|
|
29
|
+
### AuthCoordinator Setup
|
|
29
30
|
|
|
30
31
|
```typescript
|
|
31
|
-
import {
|
|
32
|
+
import { createSSSStrategy } from '@learncard/sss-key-manager';
|
|
32
33
|
|
|
33
|
-
const
|
|
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
|
-
|
|
39
|
+
Use this strategy with LearnCard's `AuthCoordinator`, which obtains a fresh DID challenge for every
|
|
40
|
+
protected write.
|
|
49
41
|
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
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
|
-
### `
|
|
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
|
-
|
|
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
|
|
package/dist/api-client.d.ts
CHANGED
|
@@ -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
|
-
|
|
36
|
-
|
|
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
|
-
|
|
43
|
-
|
|
44
|
-
|
|
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
|
package/dist/api-client.d.ts.map
CHANGED
|
@@ -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,
|
|
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.
|
|
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.
|
|
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
|
|
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
|
package/dist/index.d.ts.map
CHANGED
|
@@ -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,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/dist/key-manager.d.ts
CHANGED
|
@@ -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;
|
|
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"}
|
package/dist/qr-login.d.ts.map
CHANGED
|
@@ -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;
|
|
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"}
|