@aztec/wallet-sdk 0.0.1-commit.6d3c34e β†’ 0.0.1-commit.7035c9bd6

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 (77) hide show
  1. package/README.md +218 -355
  2. package/dest/base-wallet/base_wallet.d.ts +71 -13
  3. package/dest/base-wallet/base_wallet.d.ts.map +1 -1
  4. package/dest/base-wallet/base_wallet.js +168 -25
  5. package/dest/base-wallet/index.d.ts +3 -2
  6. package/dest/base-wallet/index.d.ts.map +1 -1
  7. package/dest/base-wallet/index.js +1 -0
  8. package/dest/base-wallet/utils.d.ts +49 -0
  9. package/dest/base-wallet/utils.d.ts.map +1 -0
  10. package/dest/base-wallet/utils.js +131 -0
  11. package/dest/crypto.d.ts +73 -27
  12. package/dest/crypto.d.ts.map +1 -1
  13. package/dest/crypto.js +219 -41
  14. package/dest/emoji_alphabet.d.ts +35 -0
  15. package/dest/emoji_alphabet.d.ts.map +1 -0
  16. package/dest/emoji_alphabet.js +299 -0
  17. package/dest/extension/handlers/background_connection_handler.d.ts +158 -0
  18. package/dest/extension/handlers/background_connection_handler.d.ts.map +1 -0
  19. package/dest/extension/handlers/background_connection_handler.js +258 -0
  20. package/dest/extension/handlers/content_script_connection_handler.d.ts +56 -0
  21. package/dest/extension/handlers/content_script_connection_handler.d.ts.map +1 -0
  22. package/dest/extension/handlers/content_script_connection_handler.js +174 -0
  23. package/dest/extension/handlers/index.d.ts +12 -0
  24. package/dest/extension/handlers/index.d.ts.map +1 -0
  25. package/dest/extension/handlers/index.js +10 -0
  26. package/dest/extension/handlers/internal_message_types.d.ts +63 -0
  27. package/dest/extension/handlers/internal_message_types.d.ts.map +1 -0
  28. package/dest/extension/handlers/internal_message_types.js +22 -0
  29. package/dest/extension/provider/extension_provider.d.ts +107 -0
  30. package/dest/extension/provider/extension_provider.d.ts.map +1 -0
  31. package/dest/extension/provider/extension_provider.js +160 -0
  32. package/dest/extension/provider/extension_wallet.d.ts +132 -0
  33. package/dest/extension/provider/extension_wallet.d.ts.map +1 -0
  34. package/dest/extension/provider/extension_wallet.js +278 -0
  35. package/dest/extension/provider/index.d.ts +3 -0
  36. package/dest/extension/provider/index.d.ts.map +1 -0
  37. package/dest/{providers/extension β†’ extension/provider}/index.js +0 -1
  38. package/dest/manager/index.d.ts +2 -7
  39. package/dest/manager/index.d.ts.map +1 -1
  40. package/dest/manager/index.js +0 -4
  41. package/dest/manager/types.d.ts +108 -5
  42. package/dest/manager/types.d.ts.map +1 -1
  43. package/dest/manager/types.js +17 -1
  44. package/dest/manager/wallet_manager.d.ts +50 -7
  45. package/dest/manager/wallet_manager.d.ts.map +1 -1
  46. package/dest/manager/wallet_manager.js +178 -29
  47. package/dest/types.d.ts +55 -15
  48. package/dest/types.d.ts.map +1 -1
  49. package/dest/types.js +10 -2
  50. package/package.json +18 -11
  51. package/src/base-wallet/base_wallet.ts +222 -46
  52. package/src/base-wallet/index.ts +2 -1
  53. package/src/base-wallet/utils.ts +238 -0
  54. package/src/crypto.ts +263 -47
  55. package/src/emoji_alphabet.ts +317 -0
  56. package/src/extension/handlers/background_connection_handler.ts +423 -0
  57. package/src/extension/handlers/content_script_connection_handler.ts +246 -0
  58. package/src/extension/handlers/index.ts +25 -0
  59. package/src/extension/handlers/internal_message_types.ts +69 -0
  60. package/src/extension/provider/extension_provider.ts +233 -0
  61. package/src/extension/provider/extension_wallet.ts +329 -0
  62. package/src/extension/provider/index.ts +7 -0
  63. package/src/manager/index.ts +3 -9
  64. package/src/manager/types.ts +112 -4
  65. package/src/manager/wallet_manager.ts +202 -31
  66. package/src/types.ts +57 -14
  67. package/dest/providers/extension/extension_provider.d.ts +0 -17
  68. package/dest/providers/extension/extension_provider.d.ts.map +0 -1
  69. package/dest/providers/extension/extension_provider.js +0 -56
  70. package/dest/providers/extension/extension_wallet.d.ts +0 -95
  71. package/dest/providers/extension/extension_wallet.d.ts.map +0 -1
  72. package/dest/providers/extension/extension_wallet.js +0 -225
  73. package/dest/providers/extension/index.d.ts +0 -5
  74. package/dest/providers/extension/index.d.ts.map +0 -1
  75. package/src/providers/extension/extension_provider.ts +0 -72
  76. package/src/providers/extension/extension_wallet.ts +0 -275
  77. package/src/providers/extension/index.ts +0 -11
@@ -0,0 +1,131 @@
1
+ import { MAX_ENQUEUED_CALLS_PER_CALL } from '@aztec/constants';
2
+ import { makeTuple } from '@aztec/foundation/array';
3
+ import { Fr } from '@aztec/foundation/curves/bn254';
4
+ import { displayDebugLogs } from '@aztec/pxe/client/lazy';
5
+ import { generateSimulatedProvingResult } from '@aztec/pxe/simulator';
6
+ import { ClaimedLengthArray, CountedPublicCallRequest, PrivateCircuitPublicInputs, PublicCallRequest } from '@aztec/stdlib/kernel';
7
+ import { ChonkProof } from '@aztec/stdlib/proofs';
8
+ import { HashedValues, PrivateCallExecutionResult, PrivateExecutionResult, Tx, TxContext, TxSimulationResult } from '@aztec/stdlib/tx';
9
+ /**
10
+ * Splits an execution payload into a leading prefix of public static calls
11
+ * (eligible for direct node simulation) and the remaining calls.
12
+ *
13
+ * Only a leading run of public static calls is eligible for optimization.
14
+ * Any non-public-static call may enqueue public state mutations
15
+ * (e.g. private calls can enqueue public calls), so all calls that follow
16
+ * must go through the normal simulation path to see the correct state.
17
+ *
18
+ */ export function extractOptimizablePublicStaticCalls(payload) {
19
+ const splitIndex = payload.calls.findIndex((call)=>!call.isPublicStatic());
20
+ const boundary = splitIndex === -1 ? payload.calls.length : splitIndex;
21
+ return {
22
+ optimizableCalls: payload.calls.slice(0, boundary),
23
+ remainingCalls: payload.calls.slice(boundary)
24
+ };
25
+ }
26
+ /**
27
+ * Simulates a batch of public static calls by bypassing account entrypoint and private execution,
28
+ * directly constructing a minimal Tx and calling node.simulatePublicCalls.
29
+ *
30
+ * @param node - The Aztec node to simulate on.
31
+ * @param publicStaticCalls - Array of public static function calls (max MAX_ENQUEUED_CALLS_PER_CALL).
32
+ * @param from - The account address making the calls.
33
+ * @param chainInfo - Chain information (chainId and version).
34
+ * @param gasSettings - Gas settings for the transaction.
35
+ * @param blockHeader - Block header to use as anchor.
36
+ * @param skipFeeEnforcement - Whether to skip fee enforcement during simulation.
37
+ * @returns TxSimulationResult with public return values.
38
+ */ async function simulateBatchViaNode(node, publicStaticCalls, from, chainInfo, gasSettings, blockHeader, skipFeeEnforcement, getContractName) {
39
+ const txContext = new TxContext(chainInfo.chainId, chainInfo.version, gasSettings);
40
+ const publicFunctionCalldata = [];
41
+ for (const call of publicStaticCalls){
42
+ const calldata = await HashedValues.fromCalldata([
43
+ call.selector.toField(),
44
+ ...call.args
45
+ ]);
46
+ publicFunctionCalldata.push(calldata);
47
+ }
48
+ const publicCallRequests = makeTuple(MAX_ENQUEUED_CALLS_PER_CALL, (i)=>{
49
+ const call = publicStaticCalls[i];
50
+ if (!call) {
51
+ return CountedPublicCallRequest.empty();
52
+ }
53
+ const publicCallRequest = new PublicCallRequest(from, call.to, call.isStatic, publicFunctionCalldata[i].hash);
54
+ // Counter starts at 1 (minRevertibleSideEffectCounter) so all calls are revertible
55
+ return new CountedPublicCallRequest(publicCallRequest, i + 1);
56
+ });
57
+ const publicCallRequestsArray = new ClaimedLengthArray(publicCallRequests, publicStaticCalls.length);
58
+ const publicInputs = PrivateCircuitPublicInputs.from({
59
+ ...PrivateCircuitPublicInputs.empty(),
60
+ anchorBlockHeader: blockHeader,
61
+ txContext: txContext,
62
+ publicCallRequests: publicCallRequestsArray,
63
+ startSideEffectCounter: new Fr(0),
64
+ endSideEffectCounter: new Fr(publicStaticCalls.length + 1)
65
+ });
66
+ // Minimal entrypoint structure β€” no real private execution, just public call requests
67
+ const emptyEntrypoint = new PrivateCallExecutionResult(Buffer.alloc(0), Buffer.alloc(0), new Map(), publicInputs, [], new Map(), [], [], [], [], []);
68
+ const privateResult = new PrivateExecutionResult(emptyEntrypoint, Fr.random(), publicFunctionCalldata);
69
+ const provingResult = await generateSimulatedProvingResult(privateResult, (_contractAddress, _functionSelector)=>Promise.resolve(''), node, 1);
70
+ provingResult.publicInputs.feePayer = from;
71
+ const tx = await Tx.create({
72
+ data: provingResult.publicInputs,
73
+ chonkProof: ChonkProof.empty(),
74
+ contractClassLogFields: [],
75
+ publicFunctionCalldata: publicFunctionCalldata
76
+ });
77
+ const publicOutput = await node.simulatePublicCalls(tx, skipFeeEnforcement);
78
+ if (publicOutput.revertReason) {
79
+ throw publicOutput.revertReason;
80
+ }
81
+ // Display debug logs from the public simulation.
82
+ await displayDebugLogs(publicOutput.debugLogs, getContractName);
83
+ return new TxSimulationResult(privateResult, provingResult.publicInputs, publicOutput, undefined);
84
+ }
85
+ /**
86
+ * Simulates public static calls by splitting them into batches of MAX_ENQUEUED_CALLS_PER_CALL
87
+ * and sending each batch directly to the node.
88
+ *
89
+ * @param node - The Aztec node to simulate on.
90
+ * @param publicStaticCalls - Array of public static function calls to optimize.
91
+ * @param from - The account address making the calls.
92
+ * @param chainInfo - Chain information (chainId and version).
93
+ * @param gasSettings - Gas settings for the transaction.
94
+ * @param blockHeader - Block header to use as anchor.
95
+ * @param skipFeeEnforcement - Whether to skip fee enforcement during simulation.
96
+ * @returns Array of TxSimulationResult, one per batch.
97
+ */ export async function simulateViaNode(node, publicStaticCalls, from, chainInfo, gasSettings, blockHeader, skipFeeEnforcement = true, getContractName) {
98
+ const batches = [];
99
+ for(let i = 0; i < publicStaticCalls.length; i += MAX_ENQUEUED_CALLS_PER_CALL){
100
+ batches.push(publicStaticCalls.slice(i, i + MAX_ENQUEUED_CALLS_PER_CALL));
101
+ }
102
+ const results = [];
103
+ for (const batch of batches){
104
+ const result = await simulateBatchViaNode(node, batch, from, chainInfo, gasSettings, blockHeader, skipFeeEnforcement, getContractName);
105
+ results.push(result);
106
+ }
107
+ return results;
108
+ }
109
+ /**
110
+ * Merges simulation results from the optimized (public static) and normal paths.
111
+ * Since optimized calls are always a leading prefix, return values are simply
112
+ * concatenated: optimized first, then normal.
113
+ * Stats are taken from the normal result only (the optimized path doesn't produce them).
114
+ *
115
+ * @param optimizedResults - Results from optimized public static call batches.
116
+ * @param normalResult - Result from normal simulation (null if all calls were optimized).
117
+ * @returns A single TxSimulationResult with return values in original call order.
118
+ */ export function buildMergedSimulationResult(optimizedResults, normalResult) {
119
+ const optimizedReturnValues = optimizedResults.flatMap((r)=>r.publicOutput?.publicReturnValues ?? []);
120
+ const normalReturnValues = normalResult?.publicOutput?.publicReturnValues ?? [];
121
+ const allReturnValues = [
122
+ ...optimizedReturnValues,
123
+ ...normalReturnValues
124
+ ];
125
+ const baseResult = normalResult ?? optimizedResults[0];
126
+ const mergedPublicOutput = baseResult.publicOutput ? {
127
+ ...baseResult.publicOutput,
128
+ publicReturnValues: allReturnValues
129
+ } : undefined;
130
+ return new TxSimulationResult(baseResult.privateExecutionResult, baseResult.publicInputs, mergedPublicOutput, normalResult?.stats);
131
+ }
package/dest/crypto.d.ts CHANGED
@@ -36,11 +36,23 @@ export interface SecureKeyPair {
36
36
  /** Private key - keep secret, used for key derivation */
37
37
  privateKey: CryptoKey;
38
38
  }
39
+ /**
40
+ * Session keys derived from ECDH key exchange.
41
+ *
42
+ * Contains both the encryption key and the verification hash (verificationHash)
43
+ * computed from a separate HMAC key.
44
+ */
45
+ export interface SessionKeys {
46
+ /** AES-256-GCM key for message encryption/decryption */
47
+ encryptionKey: CryptoKey;
48
+ /** Hex-encoded verificationHash for verification */
49
+ verificationHash: string;
50
+ }
39
51
  /**
40
52
  * Generates an ECDH P-256 key pair for key exchange.
41
53
  *
42
- * The generated key pair can be used to derive a shared secret with another
43
- * party's public key using {@link deriveSharedKey}.
54
+ * The generated key pair can be used to derive session keys with another
55
+ * party's public key using {@link deriveSessionKeys}.
44
56
  *
45
57
  * @returns A new ECDH key pair
46
58
  *
@@ -72,65 +84,71 @@ export declare function exportPublicKey(publicKey: CryptoKey): Promise<ExportedP
72
84
  /**
73
85
  * Imports a public key from JWK format.
74
86
  *
75
- * Used to import the other party's public key for deriving a shared secret.
87
+ * Used to import the other party's public key for deriving session keys.
76
88
  *
77
89
  * @param exported - The public key in JWK format
78
- * @returns A CryptoKey that can be used with {@link deriveSharedKey}
90
+ * @returns A CryptoKey that can be used with {@link deriveSessionKeys}
79
91
  *
80
92
  * @example
81
93
  * ```typescript
82
- * // Receive exported public key from other party
83
- * const theirPublicKey = await importPublicKey(receivedPublicKey);
84
- * const sharedKey = await deriveSharedKey(myPrivateKey, theirPublicKey);
94
+ * // App side: receive wallet's public key and derive session
95
+ * const walletPublicKey = await importPublicKey(receivedWalletKey);
96
+ * const session = await deriveSessionKeys(appKeyPair, walletPublicKey, true);
85
97
  * ```
86
98
  */
87
99
  export declare function importPublicKey(exported: ExportedPublicKey): Promise<CryptoKey>;
88
100
  /**
89
- * Derives a shared AES-256-GCM key from ECDH key exchange.
101
+ * Derives session keys from ECDH key exchange using HKDF.
90
102
  *
91
- * Both parties will derive the same shared key when using their own private key
92
- * and the other party's public key. This is the core of ECDH key agreement.
103
+ * This is the main key derivation function that produces:
104
+ * 1. An AES-256-GCM encryption key (first 256 bits)
105
+ * 2. An HMAC key for verificationHash computation (second 256 bits)
106
+ * 3. A verificationHash computed as HMAC(hmacKey, "aztec-wallet-verification-verificationHash")
93
107
  *
94
- * @param privateKey - Your ECDH private key
95
- * @param publicKey - The other party's ECDH public key
96
- * @returns An AES-256-GCM key for encryption/decryption
108
+ * The keys are derived using a single HKDF call that produces 512 bits,
109
+ * then split into the two keys.
110
+ *
111
+ * @param ownKeyPair - The caller's ECDH key pair (private for ECDH, public for salt)
112
+ * @param peerPublicKey - The peer's ECDH public key (for ECDH and salt)
113
+ * @param isApp - true if caller is the app, false if caller is the wallet
114
+ * @returns Session keys containing encryption key and verificationHash
97
115
  *
98
116
  * @example
99
117
  * ```typescript
100
- * // Both parties derive the same key
101
- * const sharedKeyA = await deriveSharedKey(privateKeyA, publicKeyB);
102
- * const sharedKeyB = await deriveSharedKey(privateKeyB, publicKeyA);
103
- * // sharedKeyA and sharedKeyB are equivalent
118
+ * // App side
119
+ * const sessionA = await deriveSessionKeys(appKeyPair, walletPublicKey, true);
120
+ * // Wallet side
121
+ * const sessionB = await deriveSessionKeys(walletKeyPair, appPublicKey, false);
122
+ * // sessionA.verificationHash === sessionB.verificationHash
104
123
  * ```
105
124
  */
106
- export declare function deriveSharedKey(privateKey: CryptoKey, publicKey: CryptoKey): Promise<CryptoKey>;
125
+ export declare function deriveSessionKeys(ownKeyPair: SecureKeyPair, peerPublicKey: CryptoKey, isApp: boolean): Promise<SessionKeys>;
107
126
  /**
108
127
  * Encrypts data using AES-256-GCM.
109
128
  *
110
- * The data is JSON serialized before encryption. A random 12-byte IV is
111
- * generated for each encryption operation.
129
+ * A random 12-byte IV is generated for each encryption operation.
112
130
  *
113
131
  * AES-GCM provides both confidentiality and authenticity - any tampering
114
132
  * with the ciphertext will cause decryption to fail.
115
133
  *
116
- * @param key - The AES-GCM key (from {@link deriveSharedKey})
117
- * @param data - The data to encrypt (will be JSON serialized)
134
+ * @param key - The AES-GCM key (from {@link deriveSessionKeys})
135
+ * @param data - The string data to encrypt (caller is responsible for serialization)
118
136
  * @returns The encrypted payload with IV and ciphertext
119
137
  *
120
138
  * @example
121
139
  * ```typescript
122
- * const encrypted = await encrypt(sharedKey, { action: 'transfer', amount: 100 });
140
+ * const encrypted = await encrypt(session.encryptionKey, JSON.stringify({ action: 'transfer', amount: 100 }));
123
141
  * // encrypted.iv and encrypted.ciphertext are base64 strings
124
142
  * ```
125
143
  */
126
- export declare function encrypt(key: CryptoKey, data: unknown): Promise<EncryptedPayload>;
144
+ export declare function encrypt(key: CryptoKey, data: string): Promise<EncryptedPayload>;
127
145
  /**
128
146
  * Decrypts data using AES-256-GCM.
129
147
  *
130
148
  * The decrypted data is JSON parsed before returning.
131
149
  *
132
150
  * @typeParam T - The expected type of the decrypted data
133
- * @param key - The AES-GCM key (from {@link deriveSharedKey})
151
+ * @param key - The AES-GCM key (from {@link deriveSessionKeys})
134
152
  * @param payload - The encrypted payload from {@link encrypt}
135
153
  * @returns The decrypted and parsed data
136
154
  *
@@ -138,9 +156,37 @@ export declare function encrypt(key: CryptoKey, data: unknown): Promise<Encrypte
138
156
  *
139
157
  * @example
140
158
  * ```typescript
141
- * const decrypted = await decrypt<{ action: string; amount: number }>(sharedKey, encrypted);
159
+ * const decrypted = await decrypt<{ action: string; amount: number }>(session.encryptionKey, encrypted);
142
160
  * console.log(decrypted.action); // 'transfer'
143
161
  * ```
144
162
  */
145
163
  export declare function decrypt<T = unknown>(key: CryptoKey, payload: EncryptedPayload): Promise<T>;
146
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3J5cHRvLmQudHMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvY3J5cHRvLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQW1DQTs7OztHQUlHO0FBQ0gsTUFBTSxXQUFXLGlCQUFpQjtJQUNoQyxnREFBZ0Q7SUFDaEQsR0FBRyxFQUFFLE1BQU0sQ0FBQztJQUNaLGtDQUFrQztJQUNsQyxHQUFHLEVBQUUsTUFBTSxDQUFDO0lBQ1osdUNBQXVDO0lBQ3ZDLENBQUMsRUFBRSxNQUFNLENBQUM7SUFDVix1Q0FBdUM7SUFDdkMsQ0FBQyxFQUFFLE1BQU0sQ0FBQztDQUNYO0FBRUQ7Ozs7R0FJRztBQUNILE1BQU0sV0FBVyxnQkFBZ0I7SUFDL0IsdURBQXVEO0lBQ3ZELEVBQUUsRUFBRSxNQUFNLENBQUM7SUFDWCxrQ0FBa0M7SUFDbEMsVUFBVSxFQUFFLE1BQU0sQ0FBQztDQUNwQjtBQUVEOzs7OztHQUtHO0FBQ0gsTUFBTSxXQUFXLGFBQWE7SUFDNUIsaUNBQWlDO0lBQ2pDLFNBQVMsRUFBRSxTQUFTLENBQUM7SUFDckIseURBQXlEO0lBQ3pELFVBQVUsRUFBRSxTQUFTLENBQUM7Q0FDdkI7QUFFRDs7Ozs7Ozs7Ozs7Ozs7R0FjRztBQUNILHdCQUFzQixlQUFlLElBQUksT0FBTyxDQUFDLGFBQWEsQ0FBQyxDQWE5RDtBQUVEOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUNILHdCQUFzQixlQUFlLENBQUMsU0FBUyxFQUFFLFNBQVMsR0FBRyxPQUFPLENBQUMsaUJBQWlCLENBQUMsQ0FRdEY7QUFFRDs7Ozs7Ozs7Ozs7Ozs7R0FjRztBQUNILHdCQUFnQixlQUFlLENBQUMsUUFBUSxFQUFFLGlCQUFpQixHQUFHLE9BQU8sQ0FBQyxTQUFTLENBQUMsQ0FnQi9FO0FBRUQ7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBaUJHO0FBQ0gsd0JBQWdCLGVBQWUsQ0FBQyxVQUFVLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRSxTQUFTLEdBQUcsT0FBTyxDQUFDLFNBQVMsQ0FBQyxDQWMvRjtBQUVEOzs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FrQkc7QUFDSCx3QkFBc0IsT0FBTyxDQUFDLEdBQUcsRUFBRSxTQUFTLEVBQUUsSUFBSSxFQUFFLE9BQU8sR0FBRyxPQUFPLENBQUMsZ0JBQWdCLENBQUMsQ0FVdEY7QUFFRDs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FpQkc7QUFDSCx3QkFBc0IsT0FBTyxDQUFDLENBQUMsR0FBRyxPQUFPLEVBQUUsR0FBRyxFQUFFLFNBQVMsRUFBRSxPQUFPLEVBQUUsZ0JBQWdCLEdBQUcsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQVFoRyJ9
164
+ /**
165
+ * Default grid size for emoji verification display.
166
+ * 3x3 grid = 9 emojis = 72 bits of security.
167
+ */
168
+ export declare const DEFAULT_EMOJI_GRID_SIZE = 9;
169
+ /**
170
+ * Converts a hex hash to an emoji sequence for visual verification.
171
+ *
172
+ * This is used for verification - both the dApp and wallet
173
+ * independently compute the same emoji sequence from the derived keys.
174
+ * Users can visually compare the sequences to detect interception.
175
+ *
176
+ * With a 256-emoji alphabet and 9 emojis (3x3 grid), this provides
177
+ * 72 bits of security (9 * 8 = 72 bits), making brute-force attacks
178
+ * computationally infeasible.
179
+ *
180
+ * @param hash - Hex string from verification hash (64 chars = 32 bytes)
181
+ * @param count - Number of emojis to generate (default: 9 for 3x3 grid)
182
+ * @returns A string of emojis representing the hash
183
+ *
184
+ * @example
185
+ * ```typescript
186
+ * const session = await deriveSessionKeys(...);
187
+ * const emoji = hashToEmoji(session.verificationHash); // e.g., "πŸ”΅πŸ¦‹πŸŽ―πŸΌπŸŒŸπŸŽ²πŸ¦ŠπŸΈπŸ’Ž"
188
+ * // Display as 3x3 grid to user for verification
189
+ * ```
190
+ */
191
+ export declare function hashToEmoji(hash: string, count?: number): string;
192
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3J5cHRvLmQudHMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvY3J5cHRvLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQThEQTs7OztHQUlHO0FBQ0gsTUFBTSxXQUFXLGlCQUFpQjtJQUNoQyxnREFBZ0Q7SUFDaEQsR0FBRyxFQUFFLE1BQU0sQ0FBQztJQUNaLGtDQUFrQztJQUNsQyxHQUFHLEVBQUUsTUFBTSxDQUFDO0lBQ1osdUNBQXVDO0lBQ3ZDLENBQUMsRUFBRSxNQUFNLENBQUM7SUFDVix1Q0FBdUM7SUFDdkMsQ0FBQyxFQUFFLE1BQU0sQ0FBQztDQUNYO0FBRUQ7Ozs7R0FJRztBQUNILE1BQU0sV0FBVyxnQkFBZ0I7SUFDL0IsdURBQXVEO0lBQ3ZELEVBQUUsRUFBRSxNQUFNLENBQUM7SUFDWCxrQ0FBa0M7SUFDbEMsVUFBVSxFQUFFLE1BQU0sQ0FBQztDQUNwQjtBQUVEOzs7OztHQUtHO0FBQ0gsTUFBTSxXQUFXLGFBQWE7SUFDNUIsaUNBQWlDO0lBQ2pDLFNBQVMsRUFBRSxTQUFTLENBQUM7SUFDckIseURBQXlEO0lBQ3pELFVBQVUsRUFBRSxTQUFTLENBQUM7Q0FDdkI7QUFFRDs7Ozs7R0FLRztBQUNILE1BQU0sV0FBVyxXQUFXO0lBQzFCLHdEQUF3RDtJQUN4RCxhQUFhLEVBQUUsU0FBUyxDQUFDO0lBQ3pCLG9EQUFvRDtJQUNwRCxnQkFBZ0IsRUFBRSxNQUFNLENBQUM7Q0FDMUI7QUFTRDs7Ozs7Ozs7Ozs7Ozs7R0FjRztBQUNILHdCQUFzQixlQUFlLElBQUksT0FBTyxDQUFDLGFBQWEsQ0FBQyxDQWE5RDtBQUVEOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUNILHdCQUFzQixlQUFlLENBQUMsU0FBUyxFQUFFLFNBQVMsR0FBRyxPQUFPLENBQUMsaUJBQWlCLENBQUMsQ0FRdEY7QUFFRDs7Ozs7Ozs7Ozs7Ozs7R0FjRztBQUNILHdCQUFnQixlQUFlLENBQUMsUUFBUSxFQUFFLGlCQUFpQixHQUFHLE9BQU8sQ0FBQyxTQUFTLENBQUMsQ0FnQi9FO0FBc0REOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0F3Qkc7QUFDSCx3QkFBc0IsaUJBQWlCLENBQ3JDLFVBQVUsRUFBRSxhQUFhLEVBQ3pCLGFBQWEsRUFBRSxTQUFTLEVBQ3hCLEtBQUssRUFBRSxPQUFPLEdBQ2IsT0FBTyxDQUFDLFdBQVcsQ0FBQyxDQXdEdEI7QUFFRDs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FpQkc7QUFDSCx3QkFBc0IsT0FBTyxDQUFDLEdBQUcsRUFBRSxTQUFTLEVBQUUsSUFBSSxFQUFFLE1BQU0sR0FBRyxPQUFPLENBQUMsZ0JBQWdCLENBQUMsQ0FVckY7QUFFRDs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FpQkc7QUFDSCx3QkFBc0IsT0FBTyxDQUFDLENBQUMsR0FBRyxPQUFPLEVBQUUsR0FBRyxFQUFFLFNBQVMsRUFBRSxPQUFPLEVBQUUsZ0JBQWdCLEdBQUcsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQVFoRztBQXdERDs7O0dBR0c7QUFDSCxlQUFPLE1BQU0sdUJBQXVCLElBQUksQ0FBQztBQUV6Qzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBcUJHO0FBQ0gsd0JBQWdCLFdBQVcsQ0FBQyxJQUFJLEVBQUUsTUFBTSxFQUFFLEtBQUssR0FBRSxNQUFnQyxHQUFHLE1BQU0sQ0FPekYifQ==
@@ -1 +1 @@
1
- {"version":3,"file":"crypto.d.ts","sourceRoot":"","sources":["../src/crypto.ts"],"names":[],"mappings":"AAmCA;;;;GAIG;AACH,MAAM,WAAW,iBAAiB;IAChC,gDAAgD;IAChD,GAAG,EAAE,MAAM,CAAC;IACZ,kCAAkC;IAClC,GAAG,EAAE,MAAM,CAAC;IACZ,uCAAuC;IACvC,CAAC,EAAE,MAAM,CAAC;IACV,uCAAuC;IACvC,CAAC,EAAE,MAAM,CAAC;CACX;AAED;;;;GAIG;AACH,MAAM,WAAW,gBAAgB;IAC/B,uDAAuD;IACvD,EAAE,EAAE,MAAM,CAAC;IACX,kCAAkC;IAClC,UAAU,EAAE,MAAM,CAAC;CACpB;AAED;;;;;GAKG;AACH,MAAM,WAAW,aAAa;IAC5B,iCAAiC;IACjC,SAAS,EAAE,SAAS,CAAC;IACrB,yDAAyD;IACzD,UAAU,EAAE,SAAS,CAAC;CACvB;AAED;;;;;;;;;;;;;;GAcG;AACH,wBAAsB,eAAe,IAAI,OAAO,CAAC,aAAa,CAAC,CAa9D;AAED;;;;;;;;;;;;;;;GAeG;AACH,wBAAsB,eAAe,CAAC,SAAS,EAAE,SAAS,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAQtF;AAED;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,eAAe,CAAC,QAAQ,EAAE,iBAAiB,GAAG,OAAO,CAAC,SAAS,CAAC,CAgB/E;AAED;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,eAAe,CAAC,UAAU,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS,GAAG,OAAO,CAAC,SAAS,CAAC,CAc/F;AAED;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAsB,OAAO,CAAC,GAAG,EAAE,SAAS,EAAE,IAAI,EAAE,OAAO,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAUtF;AAED;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAsB,OAAO,CAAC,CAAC,GAAG,OAAO,EAAE,GAAG,EAAE,SAAS,EAAE,OAAO,EAAE,gBAAgB,GAAG,OAAO,CAAC,CAAC,CAAC,CAQhG"}
1
+ {"version":3,"file":"crypto.d.ts","sourceRoot":"","sources":["../src/crypto.ts"],"names":[],"mappings":"AA8DA;;;;GAIG;AACH,MAAM,WAAW,iBAAiB;IAChC,gDAAgD;IAChD,GAAG,EAAE,MAAM,CAAC;IACZ,kCAAkC;IAClC,GAAG,EAAE,MAAM,CAAC;IACZ,uCAAuC;IACvC,CAAC,EAAE,MAAM,CAAC;IACV,uCAAuC;IACvC,CAAC,EAAE,MAAM,CAAC;CACX;AAED;;;;GAIG;AACH,MAAM,WAAW,gBAAgB;IAC/B,uDAAuD;IACvD,EAAE,EAAE,MAAM,CAAC;IACX,kCAAkC;IAClC,UAAU,EAAE,MAAM,CAAC;CACpB;AAED;;;;;GAKG;AACH,MAAM,WAAW,aAAa;IAC5B,iCAAiC;IACjC,SAAS,EAAE,SAAS,CAAC;IACrB,yDAAyD;IACzD,UAAU,EAAE,SAAS,CAAC;CACvB;AAED;;;;;GAKG;AACH,MAAM,WAAW,WAAW;IAC1B,wDAAwD;IACxD,aAAa,EAAE,SAAS,CAAC;IACzB,oDAAoD;IACpD,gBAAgB,EAAE,MAAM,CAAC;CAC1B;AASD;;;;;;;;;;;;;;GAcG;AACH,wBAAsB,eAAe,IAAI,OAAO,CAAC,aAAa,CAAC,CAa9D;AAED;;;;;;;;;;;;;;;GAeG;AACH,wBAAsB,eAAe,CAAC,SAAS,EAAE,SAAS,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAQtF;AAED;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,eAAe,CAAC,QAAQ,EAAE,iBAAiB,GAAG,OAAO,CAAC,SAAS,CAAC,CAgB/E;AAsDD;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,wBAAsB,iBAAiB,CACrC,UAAU,EAAE,aAAa,EACzB,aAAa,EAAE,SAAS,EACxB,KAAK,EAAE,OAAO,GACb,OAAO,CAAC,WAAW,CAAC,CAwDtB;AAED;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAsB,OAAO,CAAC,GAAG,EAAE,SAAS,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAUrF;AAED;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAsB,OAAO,CAAC,CAAC,GAAG,OAAO,EAAE,GAAG,EAAE,SAAS,EAAE,OAAO,EAAE,gBAAgB,GAAG,OAAO,CAAC,CAAC,CAAC,CAQhG;AAwDD;;;GAGG;AACH,eAAO,MAAM,uBAAuB,IAAI,CAAC;AAEzC;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,GAAE,MAAgC,GAAG,MAAM,CAOzF"}