@aztec/foundation 5.0.0-private.20260318 → 5.0.0-rc.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/dest/bigint-buffer/index.d.ts +1 -1
- package/dest/bigint-buffer/index.d.ts.map +1 -1
- package/dest/bigint-buffer/index.js +6 -1
- package/dest/branded-types/block_number.d.ts +3 -3
- package/dest/branded-types/block_number.d.ts.map +1 -1
- package/dest/branded-types/block_number.js +15 -4
- package/dest/branded-types/buffer32_hash.d.ts +27 -0
- package/dest/branded-types/buffer32_hash.d.ts.map +1 -0
- package/dest/branded-types/buffer32_hash.js +12 -0
- package/dest/branded-types/checkpoint_number.d.ts +9 -3
- package/dest/branded-types/checkpoint_number.d.ts.map +1 -1
- package/dest/branded-types/checkpoint_number.js +11 -0
- package/dest/branded-types/epoch.d.ts +2 -2
- package/dest/branded-types/epoch.d.ts.map +1 -1
- package/dest/branded-types/index.d.ts +2 -1
- package/dest/branded-types/index.d.ts.map +1 -1
- package/dest/branded-types/index.js +1 -0
- package/dest/branded-types/index_within_checkpoint.d.ts +2 -2
- package/dest/branded-types/index_within_checkpoint.d.ts.map +1 -1
- package/dest/branded-types/slot.d.ts +5 -2
- package/dest/branded-types/slot.d.ts.map +1 -1
- package/dest/branded-types/slot.js +3 -0
- package/dest/buffer/buffer16.d.ts +3 -1
- package/dest/buffer/buffer16.d.ts.map +1 -1
- package/dest/buffer/buffer32.d.ts +28 -61
- package/dest/buffer/buffer32.d.ts.map +1 -1
- package/dest/buffer/buffer32.js +29 -63
- package/dest/collection/array.d.ts +11 -1
- package/dest/collection/array.d.ts.map +1 -1
- package/dest/collection/array.js +33 -0
- package/dest/collection/index.d.ts +3 -1
- package/dest/collection/index.d.ts.map +1 -1
- package/dest/collection/index.js +2 -0
- package/dest/collection/lru_map.d.ts +41 -0
- package/dest/collection/lru_map.d.ts.map +1 -0
- package/dest/collection/lru_map.js +119 -0
- package/dest/collection/lru_set.d.ts +35 -0
- package/dest/collection/lru_set.d.ts.map +1 -0
- package/dest/collection/lru_set.js +95 -0
- package/dest/committable/committable.js +1 -1
- package/dest/config/env_var.d.ts +2 -2
- package/dest/config/env_var.d.ts.map +1 -1
- package/dest/config/index.d.ts +47 -30
- package/dest/config/index.d.ts.map +1 -1
- package/dest/config/index.js +30 -45
- package/dest/config/network_config.d.ts +11 -55
- package/dest/config/network_config.d.ts.map +1 -1
- package/dest/config/network_name.d.ts +2 -2
- package/dest/config/network_name.d.ts.map +1 -1
- package/dest/config/network_name.js +1 -3
- package/dest/config/secret_value.d.ts +2 -2
- package/dest/config/secret_value.d.ts.map +1 -1
- package/dest/crypto/aes128/index.d.ts +2 -1
- package/dest/crypto/aes128/index.d.ts.map +1 -1
- package/dest/crypto/aes128/index.js +11 -2
- package/dest/crypto/bls/bn254_keystore.d.ts +9 -176
- package/dest/crypto/bls/bn254_keystore.d.ts.map +1 -1
- package/dest/crypto/bls/bn254_keystore.js +0 -17
- package/dest/crypto/poseidon/index.d.ts +1 -1
- package/dest/crypto/poseidon/index.d.ts.map +1 -1
- package/dest/crypto/poseidon/index.js +40 -33
- package/dest/crypto/schnorr/index.d.ts +8 -7
- package/dest/crypto/schnorr/index.d.ts.map +1 -1
- package/dest/crypto/schnorr/index.js +6 -6
- package/dest/crypto/schnorr/signature.d.ts +9 -29
- package/dest/crypto/schnorr/signature.d.ts.map +1 -1
- package/dest/crypto/schnorr/signature.js +20 -36
- package/dest/curves/bls12/field.d.ts +3 -3
- package/dest/curves/bls12/field.d.ts.map +1 -1
- package/dest/curves/bls12/field.js +0 -5
- package/dest/curves/bls12/point.d.ts +2 -2
- package/dest/curves/bls12/point.d.ts.map +1 -1
- package/dest/curves/bn254/field.d.ts +23 -19
- package/dest/curves/bn254/field.d.ts.map +1 -1
- package/dest/curves/bn254/field.js +23 -17
- package/dest/curves/grumpkin/point.d.ts +14 -28
- package/dest/curves/grumpkin/point.d.ts.map +1 -1
- package/dest/curves/grumpkin/point.js +29 -43
- package/dest/eth-address/index.d.ts +2 -2
- package/dest/eth-address/index.d.ts.map +1 -1
- package/dest/eth-address/index.js +0 -3
- package/dest/eth-signature/eth_signature.d.ts +2 -2
- package/dest/eth-signature/eth_signature.d.ts.map +1 -1
- package/dest/fifo/fifo_frame_reader.d.ts +41 -0
- package/dest/fifo/fifo_frame_reader.d.ts.map +1 -0
- package/dest/fifo/fifo_frame_reader.js +74 -0
- package/dest/fifo/index.d.ts +2 -0
- package/dest/fifo/index.d.ts.map +1 -0
- package/dest/fifo/index.js +1 -0
- package/dest/fifo_set/fifo_set.d.ts +15 -0
- package/dest/fifo_set/fifo_set.d.ts.map +1 -0
- package/dest/fifo_set/fifo_set.js +39 -0
- package/dest/fifo_set/index.d.ts +2 -0
- package/dest/fifo_set/index.d.ts.map +1 -0
- package/dest/fifo_set/index.js +1 -0
- package/dest/json-rpc/client/fetch.d.ts +1 -1
- package/dest/json-rpc/client/fetch.d.ts.map +1 -1
- package/dest/json-rpc/client/fetch.js +4 -3
- package/dest/json-rpc/client/safe_json_rpc_client.d.ts +1 -1
- package/dest/json-rpc/client/safe_json_rpc_client.d.ts.map +1 -1
- package/dest/json-rpc/client/safe_json_rpc_client.js +2 -2
- package/dest/json-rpc/client/undici.d.ts +1 -1
- package/dest/json-rpc/client/undici.d.ts.map +1 -1
- package/dest/json-rpc/client/undici.js +5 -3
- package/dest/json-rpc/fixtures/test_state.d.ts +4 -8
- package/dest/json-rpc/fixtures/test_state.d.ts.map +1 -1
- package/dest/json-rpc/fixtures/test_state.js +57 -17
- package/dest/json-rpc/server/safe_json_rpc_server.d.ts +8 -3
- package/dest/json-rpc/server/safe_json_rpc_server.d.ts.map +1 -1
- package/dest/json-rpc/server/safe_json_rpc_server.js +27 -13
- package/dest/log/pino-logger.d.ts +1 -1
- package/dest/log/pino-logger.d.ts.map +1 -1
- package/dest/log/pino-logger.js +17 -2
- package/dest/noir/noir_package_config.d.ts +19 -104
- package/dest/noir/noir_package_config.d.ts.map +1 -1
- package/dest/noir/noir_package_config.js +1 -1
- package/dest/queue/batch_queue.d.ts +1 -1
- package/dest/queue/batch_queue.d.ts.map +1 -1
- package/dest/queue/batch_queue.js +1 -0
- package/dest/retry/index.d.ts +31 -3
- package/dest/retry/index.d.ts.map +1 -1
- package/dest/retry/index.js +44 -2
- package/dest/schemas/api.d.ts +12 -10
- package/dest/schemas/api.d.ts.map +1 -1
- package/dest/schemas/api.js +7 -1
- package/dest/schemas/parse.d.ts +4 -4
- package/dest/schemas/parse.d.ts.map +1 -1
- package/dest/schemas/parse.js +6 -5
- package/dest/schemas/schemas.d.ts +15 -15
- package/dest/schemas/types.d.ts +3 -3
- package/dest/schemas/types.d.ts.map +1 -1
- package/dest/schemas/utils.d.ts +7 -11
- package/dest/schemas/utils.d.ts.map +1 -1
- package/dest/schemas/utils.js +2 -18
- package/dest/serialize/buffer_sink.d.ts +134 -0
- package/dest/serialize/buffer_sink.d.ts.map +1 -0
- package/dest/serialize/buffer_sink.js +297 -0
- package/dest/serialize/index.d.ts +2 -1
- package/dest/serialize/index.d.ts.map +1 -1
- package/dest/serialize/index.js +1 -0
- package/dest/string/index.js +1 -1
- package/dest/timer/index.d.ts +2 -2
- package/dest/timer/index.d.ts.map +1 -1
- package/dest/timer/index.js +1 -1
- package/dest/timer/timeout.d.ts +3 -1
- package/dest/timer/timeout.d.ts.map +1 -1
- package/dest/timer/timeout.js +26 -0
- package/dest/transport/dispatch/create_dispatch_proxy.d.ts +11 -2
- package/dest/transport/dispatch/create_dispatch_proxy.d.ts.map +1 -1
- package/dest/transport/index.d.ts +1 -2
- package/dest/transport/index.d.ts.map +1 -1
- package/dest/transport/index.js +0 -1
- package/dest/trees/balanced_merkle_tree_root.d.ts +2 -3
- package/dest/trees/balanced_merkle_tree_root.d.ts.map +1 -1
- package/dest/trees/balanced_merkle_tree_root.js +2 -3
- package/dest/trees/hasher.d.ts +3 -2
- package/dest/trees/hasher.d.ts.map +1 -1
- package/dest/trees/hasher.js +5 -5
- package/dest/trees/indexed_merkle_tree_calculator.d.ts +1 -1
- package/dest/trees/indexed_merkle_tree_calculator.d.ts.map +1 -1
- package/dest/trees/indexed_merkle_tree_calculator.js +5 -1
- package/dest/trees/membership_witness.d.ts +2 -2
- package/dest/trees/membership_witness.d.ts.map +1 -1
- package/dest/trees/merkle_tree_calculator.d.ts +4 -2
- package/dest/trees/merkle_tree_calculator.d.ts.map +1 -1
- package/dest/trees/merkle_tree_calculator.js +1 -5
- package/dest/trees/sibling_path.d.ts +5 -4
- package/dest/trees/sibling_path.d.ts.map +1 -1
- package/dest/trees/sibling_path.js +10 -8
- package/dest/trees/unbalanced_merkle_tree_root.d.ts +2 -3
- package/dest/trees/unbalanced_merkle_tree_root.d.ts.map +1 -1
- package/dest/trees/unbalanced_merkle_tree_root.js +2 -3
- package/dest/types/index.d.ts +23 -1
- package/dest/types/index.d.ts.map +1 -1
- package/dest/types/index.js +15 -0
- package/package.json +6 -4
- package/src/bigint-buffer/index.ts +6 -1
- package/src/branded-types/block_number.ts +20 -2
- package/src/branded-types/buffer32_hash.ts +38 -0
- package/src/branded-types/checkpoint_number.ts +16 -1
- package/src/branded-types/epoch.ts +1 -1
- package/src/branded-types/index.ts +1 -0
- package/src/branded-types/index_within_checkpoint.ts +1 -1
- package/src/branded-types/slot.ts +6 -1
- package/src/buffer/buffer16.ts +3 -0
- package/src/buffer/buffer32.ts +39 -68
- package/src/collection/array.ts +34 -0
- package/src/collection/index.ts +2 -0
- package/src/collection/lru_map.ts +143 -0
- package/src/collection/lru_set.ts +115 -0
- package/src/committable/committable.ts +1 -1
- package/src/config/env_var.ts +36 -22
- package/src/config/index.ts +102 -97
- package/src/config/network_name.ts +2 -5
- package/src/config/secret_value.ts +1 -1
- package/src/crypto/aes128/index.ts +11 -2
- package/src/crypto/bls/bn254_keystore.ts +0 -23
- package/src/crypto/poseidon/index.ts +42 -34
- package/src/crypto/schnorr/index.ts +9 -8
- package/src/crypto/schnorr/signature.ts +17 -46
- package/src/curves/bls12/field.ts +0 -7
- package/src/curves/bn254/field.ts +35 -34
- package/src/curves/grumpkin/point.ts +23 -40
- package/src/eth-address/index.ts +0 -4
- package/src/fifo/fifo_frame_reader.ts +98 -0
- package/src/fifo/index.ts +1 -0
- package/src/fifo_set/fifo_set.ts +52 -0
- package/src/fifo_set/index.ts +1 -0
- package/src/json-rpc/client/fetch.ts +4 -3
- package/src/json-rpc/client/safe_json_rpc_client.ts +2 -2
- package/src/json-rpc/client/undici.ts +5 -3
- package/src/json-rpc/fixtures/test_state.ts +10 -10
- package/src/json-rpc/server/safe_json_rpc_server.ts +31 -13
- package/src/log/pino-logger.ts +19 -2
- package/src/noir/noir_package_config.ts +32 -20
- package/src/queue/batch_queue.ts +1 -0
- package/src/retry/index.ts +66 -4
- package/src/schemas/api.ts +25 -25
- package/src/schemas/parse.ts +9 -6
- package/src/schemas/schemas.ts +4 -4
- package/src/schemas/types.ts +2 -2
- package/src/schemas/utils.ts +4 -38
- package/src/serialize/buffer_sink.ts +350 -0
- package/src/serialize/index.ts +1 -0
- package/src/string/index.ts +1 -1
- package/src/timer/index.ts +1 -1
- package/src/timer/timeout.ts +31 -0
- package/src/transport/dispatch/create_dispatch_proxy.ts +11 -1
- package/src/transport/index.ts +0 -1
- package/src/trees/balanced_merkle_tree_root.ts +2 -5
- package/src/trees/hasher.ts +6 -3
- package/src/trees/indexed_merkle_tree_calculator.ts +5 -1
- package/src/trees/merkle_tree_calculator.ts +4 -10
- package/src/trees/sibling_path.ts +11 -6
- package/src/trees/unbalanced_merkle_tree_root.ts +2 -5
- package/src/types/index.ts +47 -0
- package/dest/crypto/serialize.d.ts +0 -51
- package/dest/crypto/serialize.d.ts.map +0 -1
- package/dest/crypto/serialize.js +0 -68
- package/dest/transport/dispatch/create_dispatch_fn.d.ts +0 -25
- package/dest/transport/dispatch/create_dispatch_fn.d.ts.map +0 -1
- package/dest/transport/dispatch/create_dispatch_fn.js +0 -17
- package/src/crypto/serialize.ts +0 -85
- package/src/transport/dispatch/create_dispatch_fn.ts +0 -35
|
@@ -20,186 +20,28 @@ declare const bn254KeystoreSchema: z.ZodObject<{
|
|
|
20
20
|
c: z.ZodNumber;
|
|
21
21
|
prf: z.ZodString;
|
|
22
22
|
salt: z.ZodString;
|
|
23
|
-
},
|
|
24
|
-
dklen: number;
|
|
25
|
-
c: number;
|
|
26
|
-
prf: string;
|
|
27
|
-
salt: string;
|
|
28
|
-
}, {
|
|
29
|
-
dklen: number;
|
|
30
|
-
c: number;
|
|
31
|
-
prf: string;
|
|
32
|
-
salt: string;
|
|
33
|
-
}>;
|
|
23
|
+
}, z.core.$strip>;
|
|
34
24
|
message: z.ZodString;
|
|
35
|
-
},
|
|
36
|
-
function: "pbkdf2";
|
|
37
|
-
params: {
|
|
38
|
-
dklen: number;
|
|
39
|
-
c: number;
|
|
40
|
-
prf: string;
|
|
41
|
-
salt: string;
|
|
42
|
-
};
|
|
43
|
-
message: string;
|
|
44
|
-
}, {
|
|
45
|
-
function: "pbkdf2";
|
|
46
|
-
params: {
|
|
47
|
-
dklen: number;
|
|
48
|
-
c: number;
|
|
49
|
-
prf: string;
|
|
50
|
-
salt: string;
|
|
51
|
-
};
|
|
52
|
-
message: string;
|
|
53
|
-
}>;
|
|
25
|
+
}, z.core.$strip>;
|
|
54
26
|
checksum: z.ZodObject<{
|
|
55
27
|
function: z.ZodLiteral<"sha256">;
|
|
56
|
-
params: z.ZodObject<{},
|
|
28
|
+
params: z.ZodObject<{}, z.core.$strip>;
|
|
57
29
|
message: z.ZodString;
|
|
58
|
-
},
|
|
59
|
-
function: "sha256";
|
|
60
|
-
params: {};
|
|
61
|
-
message: string;
|
|
62
|
-
}, {
|
|
63
|
-
function: "sha256";
|
|
64
|
-
params: {};
|
|
65
|
-
message: string;
|
|
66
|
-
}>;
|
|
30
|
+
}, z.core.$strip>;
|
|
67
31
|
cipher: z.ZodObject<{
|
|
68
32
|
function: z.ZodLiteral<"aes-128-ctr">;
|
|
69
33
|
params: z.ZodObject<{
|
|
70
34
|
iv: z.ZodString;
|
|
71
|
-
},
|
|
72
|
-
iv: string;
|
|
73
|
-
}, {
|
|
74
|
-
iv: string;
|
|
75
|
-
}>;
|
|
35
|
+
}, z.core.$strip>;
|
|
76
36
|
message: z.ZodString;
|
|
77
|
-
},
|
|
78
|
-
|
|
79
|
-
params: {
|
|
80
|
-
iv: string;
|
|
81
|
-
};
|
|
82
|
-
message: string;
|
|
83
|
-
}, {
|
|
84
|
-
function: "aes-128-ctr";
|
|
85
|
-
params: {
|
|
86
|
-
iv: string;
|
|
87
|
-
};
|
|
88
|
-
message: string;
|
|
89
|
-
}>;
|
|
90
|
-
}, "strip", z.ZodTypeAny, {
|
|
91
|
-
kdf: {
|
|
92
|
-
function: "pbkdf2";
|
|
93
|
-
params: {
|
|
94
|
-
dklen: number;
|
|
95
|
-
c: number;
|
|
96
|
-
prf: string;
|
|
97
|
-
salt: string;
|
|
98
|
-
};
|
|
99
|
-
message: string;
|
|
100
|
-
};
|
|
101
|
-
checksum: {
|
|
102
|
-
function: "sha256";
|
|
103
|
-
params: {};
|
|
104
|
-
message: string;
|
|
105
|
-
};
|
|
106
|
-
cipher: {
|
|
107
|
-
function: "aes-128-ctr";
|
|
108
|
-
params: {
|
|
109
|
-
iv: string;
|
|
110
|
-
};
|
|
111
|
-
message: string;
|
|
112
|
-
};
|
|
113
|
-
}, {
|
|
114
|
-
kdf: {
|
|
115
|
-
function: "pbkdf2";
|
|
116
|
-
params: {
|
|
117
|
-
dklen: number;
|
|
118
|
-
c: number;
|
|
119
|
-
prf: string;
|
|
120
|
-
salt: string;
|
|
121
|
-
};
|
|
122
|
-
message: string;
|
|
123
|
-
};
|
|
124
|
-
checksum: {
|
|
125
|
-
function: "sha256";
|
|
126
|
-
params: {};
|
|
127
|
-
message: string;
|
|
128
|
-
};
|
|
129
|
-
cipher: {
|
|
130
|
-
function: "aes-128-ctr";
|
|
131
|
-
params: {
|
|
132
|
-
iv: string;
|
|
133
|
-
};
|
|
134
|
-
message: string;
|
|
135
|
-
};
|
|
136
|
-
}>;
|
|
37
|
+
}, z.core.$strip>;
|
|
38
|
+
}, z.core.$strip>;
|
|
137
39
|
description: z.ZodOptional<z.ZodString>;
|
|
138
40
|
pubkey: z.ZodString;
|
|
139
41
|
path: z.ZodString;
|
|
140
42
|
uuid: z.ZodString;
|
|
141
43
|
version: z.ZodNumber;
|
|
142
|
-
},
|
|
143
|
-
crypto: {
|
|
144
|
-
kdf: {
|
|
145
|
-
function: "pbkdf2";
|
|
146
|
-
params: {
|
|
147
|
-
dklen: number;
|
|
148
|
-
c: number;
|
|
149
|
-
prf: string;
|
|
150
|
-
salt: string;
|
|
151
|
-
};
|
|
152
|
-
message: string;
|
|
153
|
-
};
|
|
154
|
-
checksum: {
|
|
155
|
-
function: "sha256";
|
|
156
|
-
params: {};
|
|
157
|
-
message: string;
|
|
158
|
-
};
|
|
159
|
-
cipher: {
|
|
160
|
-
function: "aes-128-ctr";
|
|
161
|
-
params: {
|
|
162
|
-
iv: string;
|
|
163
|
-
};
|
|
164
|
-
message: string;
|
|
165
|
-
};
|
|
166
|
-
};
|
|
167
|
-
description?: string | undefined;
|
|
168
|
-
pubkey: string;
|
|
169
|
-
path: string;
|
|
170
|
-
uuid: string;
|
|
171
|
-
version: number;
|
|
172
|
-
}, {
|
|
173
|
-
crypto: {
|
|
174
|
-
kdf: {
|
|
175
|
-
function: "pbkdf2";
|
|
176
|
-
params: {
|
|
177
|
-
dklen: number;
|
|
178
|
-
c: number;
|
|
179
|
-
prf: string;
|
|
180
|
-
salt: string;
|
|
181
|
-
};
|
|
182
|
-
message: string;
|
|
183
|
-
};
|
|
184
|
-
checksum: {
|
|
185
|
-
function: "sha256";
|
|
186
|
-
params: {};
|
|
187
|
-
message: string;
|
|
188
|
-
};
|
|
189
|
-
cipher: {
|
|
190
|
-
function: "aes-128-ctr";
|
|
191
|
-
params: {
|
|
192
|
-
iv: string;
|
|
193
|
-
};
|
|
194
|
-
message: string;
|
|
195
|
-
};
|
|
196
|
-
};
|
|
197
|
-
description?: string | undefined;
|
|
198
|
-
pubkey: string;
|
|
199
|
-
path: string;
|
|
200
|
-
uuid: string;
|
|
201
|
-
version: number;
|
|
202
|
-
}>;
|
|
44
|
+
}, z.core.$strip>;
|
|
203
45
|
/**
|
|
204
46
|
* Error thrown when BN254 keystore operations fail
|
|
205
47
|
*/
|
|
@@ -283,14 +125,5 @@ export declare function decryptBn254Keystore(filePath: string, password: string)
|
|
|
283
125
|
* @throws Bn254KeystoreError if decryption fails or checksum is invalid
|
|
284
126
|
*/
|
|
285
127
|
export declare function decryptBn254KeystoreFromObject(keystore: Bn254Keystore, password: string): string;
|
|
286
|
-
/**
|
|
287
|
-
* Validates that a decrypted private key matches the public key in the keystore.
|
|
288
|
-
*
|
|
289
|
-
* @param privateKeyHex - Decrypted private key (0x-prefixed)
|
|
290
|
-
* @param expectedPubkey - Expected public key from keystore
|
|
291
|
-
* @param computePublicKey - Function to compute public key from private key
|
|
292
|
-
* @returns true if keys match, false otherwise
|
|
293
|
-
*/
|
|
294
|
-
export declare function verifyBn254Keypair(privateKeyHex: string, expectedPubkey: string, computePublicKey: (privateKey: string) => string): boolean;
|
|
295
128
|
export {};
|
|
296
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
129
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYm4yNTRfa2V5c3RvcmUuZC50cyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9jcnlwdG8vYmxzL2JuMjU0X2tleXN0b3JlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUlBLE9BQU8sRUFBRSxDQUFDLEVBQUUsTUFBTSxLQUFLLENBQUM7QUFFeEI7Ozs7Ozs7O0dBUUc7QUFFSDs7R0FFRztBQUNILFFBQUEsTUFBTSxtQkFBbUI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztpQkE4QnZCLENBQUM7QUFFSDs7R0FFRztBQUNILHFCQUFhLGtCQUFtQixTQUFRLEtBQUs7SUFHekIsS0FBSyxDQUFDO0lBRnhCLFlBQ0UsT0FBTyxFQUFFLE1BQU0sRUFDQyxLQUFLLENBQUMsbUJBQU8sRUFJOUI7Q0FDRjtBQUVELE1BQU0sTUFBTSxhQUFhLEdBQUcsQ0FBQyxDQUFDLEtBQUssQ0FBQyxPQUFPLG1CQUFtQixDQUFDLENBQUM7QUFFaEU7OztHQUdHO0FBQ0gsTUFBTSxXQUFXLHNCQUFzQjtJQUNyQyxNQUFNLEVBQUU7UUFDTixHQUFHLEVBQUU7WUFDSCxRQUFRLEVBQUUsUUFBUSxDQUFDO1lBQ25CLE1BQU0sRUFBRTtnQkFDTixLQUFLLEVBQUUsTUFBTSxDQUFDO2dCQUNkLENBQUMsRUFBRSxNQUFNLENBQUM7Z0JBQ1YsR0FBRyxFQUFFLE1BQU0sQ0FBQztnQkFDWixJQUFJLEVBQUUsTUFBTSxDQUFDO2FBQ2QsQ0FBQztZQUNGLE9BQU8sRUFBRSxNQUFNLENBQUM7U0FDakIsQ0FBQztRQUNGLFFBQVEsRUFBRTtZQUNSLFFBQVEsRUFBRSxRQUFRLENBQUM7WUFDbkIsTUFBTSxFQUFFLE1BQU0sQ0FBQyxNQUFNLEVBQUUsS0FBSyxDQUFDLENBQUM7WUFDOUIsT0FBTyxFQUFFLE1BQU0sQ0FBQztTQUNqQixDQUFDO1FBQ0YsTUFBTSxFQUFFO1lBQ04sUUFBUSxFQUFFLGFBQWEsQ0FBQztZQUN4QixNQUFNLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLE1BQU0sQ0FBQzthQUNaLENBQUM7WUFDRixPQUFPLEVBQUUsTUFBTSxDQUFDO1NBQ2pCLENBQUM7S0FDSCxDQUFDO0lBQ0YsV0FBVyxFQUFFLE1BQU0sQ0FBQztJQUNwQixNQUFNLEVBQUUsTUFBTSxDQUFDO0lBQ2YsSUFBSSxFQUFFLE1BQU0sQ0FBQztJQUNiLElBQUksRUFBRSxNQUFNLENBQUM7SUFDYixPQUFPLEVBQUUsTUFBTSxDQUFDO0NBQ2pCO0FBRUQ7Ozs7Ozs7Ozs7OztHQVlHO0FBQ0gsd0JBQWdCLG1CQUFtQixDQUNqQyxRQUFRLEVBQUUsTUFBTSxFQUNoQixhQUFhLEVBQUUsTUFBTSxFQUNyQixTQUFTLEVBQUUsTUFBTSxFQUNqQixjQUFjLEVBQUUsTUFBTSxHQUNyQixhQUFhLENBOENmO0FBRUQ7Ozs7OztHQU1HO0FBQ0gsd0JBQWdCLGlCQUFpQixDQUFDLFFBQVEsRUFBRSxNQUFNLEdBQUcsYUFBYSxDQWdCakU7QUFFRDs7Ozs7OztHQU9HO0FBQ0gsd0JBQWdCLG9CQUFvQixDQUFDLFFBQVEsRUFBRSxNQUFNLEVBQUUsUUFBUSxFQUFFLE1BQU0sR0FBRyxNQUFNLENBRy9FO0FBRUQ7Ozs7Ozs7R0FPRztBQUNILHdCQUFnQiw4QkFBOEIsQ0FBQyxRQUFRLEVBQUUsYUFBYSxFQUFFLFFBQVEsRUFBRSxNQUFNLEdBQUcsTUFBTSxDQWlEaEcifQ==
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"bn254_keystore.d.ts","sourceRoot":"","sources":["../../../src/crypto/bls/bn254_keystore.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB;;;;;;;;GAQG;AAEH;;GAEG;AACH,QAAA,MAAM,mBAAmB
|
|
1
|
+
{"version":3,"file":"bn254_keystore.d.ts","sourceRoot":"","sources":["../../../src/crypto/bls/bn254_keystore.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB;;;;;;;;GAQG;AAEH;;GAEG;AACH,QAAA,MAAM,mBAAmB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBA8BvB,CAAC;AAEH;;GAEG;AACH,qBAAa,kBAAmB,SAAQ,KAAK;IAGzB,KAAK,CAAC;IAFxB,YACE,OAAO,EAAE,MAAM,EACC,KAAK,CAAC,mBAAO,EAI9B;CACF;AAED,MAAM,MAAM,aAAa,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,mBAAmB,CAAC,CAAC;AAEhE;;;GAGG;AACH,MAAM,WAAW,sBAAsB;IACrC,MAAM,EAAE;QACN,GAAG,EAAE;YACH,QAAQ,EAAE,QAAQ,CAAC;YACnB,MAAM,EAAE;gBACN,KAAK,EAAE,MAAM,CAAC;gBACd,CAAC,EAAE,MAAM,CAAC;gBACV,GAAG,EAAE,MAAM,CAAC;gBACZ,IAAI,EAAE,MAAM,CAAC;aACd,CAAC;YACF,OAAO,EAAE,MAAM,CAAC;SACjB,CAAC;QACF,QAAQ,EAAE;YACR,QAAQ,EAAE,QAAQ,CAAC;YACnB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;YAC9B,OAAO,EAAE,MAAM,CAAC;SACjB,CAAC;QACF,MAAM,EAAE;YACN,QAAQ,EAAE,aAAa,CAAC;YACxB,MAAM,EAAE;gBACN,EAAE,EAAE,MAAM,CAAC;aACZ,CAAC;YACF,OAAO,EAAE,MAAM,CAAC;SACjB,CAAC;KACH,CAAC;IACF,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;CACjB;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,mBAAmB,CACjC,QAAQ,EAAE,MAAM,EAChB,aAAa,EAAE,MAAM,EACrB,SAAS,EAAE,MAAM,EACjB,cAAc,EAAE,MAAM,GACrB,aAAa,CA8Cf;AAED;;;;;;GAMG;AACH,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,MAAM,GAAG,aAAa,CAgBjE;AAED;;;;;;;GAOG;AACH,wBAAgB,oBAAoB,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,CAG/E;AAED;;;;;;;GAOG;AACH,wBAAgB,8BAA8B,CAAC,QAAQ,EAAE,aAAa,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,CAiDhG"}
|
|
@@ -199,20 +199,3 @@ import { z } from 'zod';
|
|
|
199
199
|
throw new Bn254KeystoreError(`Failed to decrypt keystore: ${String(error)}`, error);
|
|
200
200
|
}
|
|
201
201
|
}
|
|
202
|
-
/**
|
|
203
|
-
* Validates that a decrypted private key matches the public key in the keystore.
|
|
204
|
-
*
|
|
205
|
-
* @param privateKeyHex - Decrypted private key (0x-prefixed)
|
|
206
|
-
* @param expectedPubkey - Expected public key from keystore
|
|
207
|
-
* @param computePublicKey - Function to compute public key from private key
|
|
208
|
-
* @returns true if keys match, false otherwise
|
|
209
|
-
*/ export function verifyBn254Keypair(privateKeyHex, expectedPubkey, computePublicKey) {
|
|
210
|
-
try {
|
|
211
|
-
const computedPubkey = computePublicKey(privateKeyHex);
|
|
212
|
-
const normalizedExpected = expectedPubkey.toLowerCase().replace(/^0x/i, '');
|
|
213
|
-
const normalizedComputed = computedPubkey.toLowerCase().replace(/^0x/i, '');
|
|
214
|
-
return normalizedExpected === normalizedComputed;
|
|
215
|
-
} catch {
|
|
216
|
-
return false;
|
|
217
|
-
}
|
|
218
|
-
}
|
|
@@ -20,4 +20,4 @@ export declare function poseidon2HashWithSeparator(input: Fieldable[], separator
|
|
|
20
20
|
*/
|
|
21
21
|
export declare function poseidon2Permutation(input: Fieldable[]): Promise<Fr[]>;
|
|
22
22
|
export declare function poseidon2HashBytes(input: Buffer): Promise<Fr>;
|
|
23
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
23
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguZC50cyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9jcnlwdG8vcG9zZWlkb24vaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBRUEsT0FBTyxFQUFFLEVBQUUsRUFBRSxNQUFNLDZCQUE2QixDQUFDO0FBQ2pELE9BQU8sRUFBRSxLQUFLLFNBQVMsRUFBcUIsTUFBTSw4QkFBOEIsQ0FBQztBQXNCakY7Ozs7R0FJRztBQUNILHdCQUFnQixhQUFhLENBQUMsS0FBSyxFQUFFLFNBQVMsRUFBRSxHQUFHLE9BQU8sQ0FBQyxFQUFFLENBQUMsQ0FFN0Q7QUFFRDs7Ozs7R0FLRztBQUNILHdCQUFnQiwwQkFBMEIsQ0FBQyxLQUFLLEVBQUUsU0FBUyxFQUFFLEVBQUUsU0FBUyxFQUFFLE1BQU0sR0FBRyxPQUFPLENBQUMsRUFBRSxDQUFDLENBSTdGO0FBRUQ7Ozs7R0FJRztBQUNILHdCQUFzQixvQkFBb0IsQ0FBQyxLQUFLLEVBQUUsU0FBUyxFQUFFLEdBQUcsT0FBTyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBaUI1RTtBQUVELHdCQUFnQixrQkFBa0IsQ0FBQyxLQUFLLEVBQUUsTUFBTSxHQUFHLE9BQU8sQ0FBQyxFQUFFLENBQUMsQ0FZN0QifQ==
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/crypto/poseidon/index.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,EAAE,EAAE,MAAM,6BAA6B,CAAC;AACjD,OAAO,EAAE,KAAK,SAAS,EAAqB,MAAM,8BAA8B,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/crypto/poseidon/index.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,EAAE,EAAE,MAAM,6BAA6B,CAAC;AACjD,OAAO,EAAE,KAAK,SAAS,EAAqB,MAAM,8BAA8B,CAAC;AAsBjF;;;;GAIG;AACH,wBAAgB,aAAa,CAAC,KAAK,EAAE,SAAS,EAAE,GAAG,OAAO,CAAC,EAAE,CAAC,CAE7D;AAED;;;;;GAKG;AACH,wBAAgB,0BAA0B,CAAC,KAAK,EAAE,SAAS,EAAE,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,EAAE,CAAC,CAI7F;AAED;;;;GAIG;AACH,wBAAsB,oBAAoB,CAAC,KAAK,EAAE,SAAS,EAAE,GAAG,OAAO,CAAC,EAAE,EAAE,CAAC,CAiB5E;AAED,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,EAAE,CAAC,CAY7D"}
|
|
@@ -1,33 +1,40 @@
|
|
|
1
|
-
import { Barretenberg } from '@aztec/bb.js';
|
|
1
|
+
import { Barretenberg, BarretenbergSync } from '@aztec/bb.js';
|
|
2
2
|
import { Fr } from '../../curves/bn254/field.js';
|
|
3
3
|
import { serializeToFields } from '../../serialize/serialize.js';
|
|
4
|
+
const IS_BROWSER = typeof self !== 'undefined';
|
|
5
|
+
async function poseidon2HashFields(inputFields) {
|
|
6
|
+
if (IS_BROWSER) {
|
|
7
|
+
await BarretenbergSync.initSingleton();
|
|
8
|
+
const api = BarretenbergSync.getSingleton();
|
|
9
|
+
const response = api.poseidon2Hash({
|
|
10
|
+
inputs: inputFields.map((i)=>i.toBuffer())
|
|
11
|
+
});
|
|
12
|
+
return Fr.fromBuffer(Buffer.from(response.hash));
|
|
13
|
+
} else {
|
|
14
|
+
await Barretenberg.initSingleton();
|
|
15
|
+
const api = Barretenberg.getSingleton();
|
|
16
|
+
const response = await api.poseidon2Hash({
|
|
17
|
+
inputs: inputFields.map((i)=>i.toBuffer())
|
|
18
|
+
});
|
|
19
|
+
return Fr.fromBuffer(Buffer.from(response.hash));
|
|
20
|
+
}
|
|
21
|
+
}
|
|
4
22
|
/**
|
|
5
23
|
* Create a poseidon hash (field) from an array of input fields.
|
|
6
24
|
* @param input - The input fields to hash.
|
|
7
25
|
* @returns The poseidon hash.
|
|
8
|
-
*/ export
|
|
9
|
-
|
|
10
|
-
await Barretenberg.initSingleton();
|
|
11
|
-
const api = Barretenberg.getSingleton();
|
|
12
|
-
const response = await api.poseidon2Hash({
|
|
13
|
-
inputs: inputFields.map((i)=>i.toBuffer())
|
|
14
|
-
});
|
|
15
|
-
return Fr.fromBuffer(Buffer.from(response.hash));
|
|
26
|
+
*/ export function poseidon2Hash(input) {
|
|
27
|
+
return poseidon2HashFields(serializeToFields(input));
|
|
16
28
|
}
|
|
17
29
|
/**
|
|
18
30
|
* Create a poseidon hash (field) from an array of input fields and a domain separator.
|
|
19
31
|
* @param input - The input fields to hash.
|
|
20
32
|
* @param separator - The domain separator.
|
|
21
33
|
* @returns The poseidon hash.
|
|
22
|
-
*/ export
|
|
34
|
+
*/ export function poseidon2HashWithSeparator(input, separator) {
|
|
23
35
|
const inputFields = serializeToFields(input);
|
|
24
36
|
inputFields.unshift(new Fr(separator));
|
|
25
|
-
|
|
26
|
-
const api = Barretenberg.getSingleton();
|
|
27
|
-
const response = await api.poseidon2Hash({
|
|
28
|
-
inputs: inputFields.map((i)=>i.toBuffer())
|
|
29
|
-
});
|
|
30
|
-
return Fr.fromBuffer(Buffer.from(response.hash));
|
|
37
|
+
return poseidon2HashFields(inputFields);
|
|
31
38
|
}
|
|
32
39
|
/**
|
|
33
40
|
* Runs a Poseidon2 permutation.
|
|
@@ -35,18 +42,23 @@ import { serializeToFields } from '../../serialize/serialize.js';
|
|
|
35
42
|
* @returns the output state, size 4.
|
|
36
43
|
*/ export async function poseidon2Permutation(input) {
|
|
37
44
|
const inputFields = serializeToFields(input);
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
45
|
+
if (IS_BROWSER) {
|
|
46
|
+
await BarretenbergSync.initSingleton();
|
|
47
|
+
const api = BarretenbergSync.getSingleton();
|
|
48
|
+
const response = api.poseidon2Permutation({
|
|
49
|
+
inputs: inputFields.map((i)=>i.toBuffer())
|
|
50
|
+
});
|
|
51
|
+
return response.outputs.map((o)=>Fr.fromBuffer(Buffer.from(o)));
|
|
52
|
+
} else {
|
|
53
|
+
await Barretenberg.initSingleton();
|
|
54
|
+
const api = Barretenberg.getSingleton();
|
|
55
|
+
const response = await api.poseidon2Permutation({
|
|
56
|
+
inputs: inputFields.map((i)=>i.toBuffer())
|
|
57
|
+
});
|
|
58
|
+
return response.outputs.map((o)=>Fr.fromBuffer(Buffer.from(o)));
|
|
59
|
+
}
|
|
48
60
|
}
|
|
49
|
-
export
|
|
61
|
+
export function poseidon2HashBytes(input) {
|
|
50
62
|
const inputFields = [];
|
|
51
63
|
for(let i = 0; i < input.length; i += 31){
|
|
52
64
|
const fieldBytes = Buffer.alloc(32, 0);
|
|
@@ -55,10 +67,5 @@ export async function poseidon2HashBytes(input) {
|
|
|
55
67
|
fieldBytes.reverse();
|
|
56
68
|
inputFields.push(Fr.fromBuffer(fieldBytes));
|
|
57
69
|
}
|
|
58
|
-
|
|
59
|
-
const api = Barretenberg.getSingleton();
|
|
60
|
-
const response = await api.poseidon2Hash({
|
|
61
|
-
inputs: inputFields.map((i)=>i.toBuffer())
|
|
62
|
-
});
|
|
63
|
-
return Fr.fromBuffer(Buffer.from(response.hash));
|
|
70
|
+
return poseidon2HashFields(inputFields);
|
|
64
71
|
}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import type { Fr } from '@aztec/foundation/curves/bn254';
|
|
1
2
|
import type { GrumpkinScalar } from '@aztec/foundation/curves/grumpkin';
|
|
2
3
|
import { Point } from '@aztec/foundation/curves/grumpkin';
|
|
3
4
|
import { SchnorrSignature } from './signature.js';
|
|
@@ -13,19 +14,19 @@ export declare class Schnorr {
|
|
|
13
14
|
*/
|
|
14
15
|
computePublicKey(privateKey: GrumpkinScalar): Promise<Point>;
|
|
15
16
|
/**
|
|
16
|
-
* Constructs a Schnorr signature
|
|
17
|
-
* @param msg -
|
|
17
|
+
* Constructs a Schnorr signature over a 32-byte message field element.
|
|
18
|
+
* @param msg - The message hash, as a grumpkin base field element.
|
|
18
19
|
* @param privateKey - The private key of the signer.
|
|
19
20
|
* @returns A Schnorr signature of the form (s, e).
|
|
20
21
|
*/
|
|
21
|
-
constructSignature(msg:
|
|
22
|
+
constructSignature(msg: Fr, privateKey: GrumpkinScalar): Promise<SchnorrSignature>;
|
|
22
23
|
/**
|
|
23
|
-
* Verifies a Schnorr signature
|
|
24
|
-
* @param msg -
|
|
24
|
+
* Verifies a Schnorr signature against a Grumpkin public key.
|
|
25
|
+
* @param msg - The message hash, as a grumpkin base field element.
|
|
25
26
|
* @param pubKey - The Grumpkin public key of the signer.
|
|
26
27
|
* @param sig - The Schnorr signature.
|
|
27
28
|
* @returns True or false.
|
|
28
29
|
*/
|
|
29
|
-
verifySignature(msg:
|
|
30
|
+
verifySignature(msg: Fr, pubKey: Point, sig: SchnorrSignature): Promise<boolean>;
|
|
30
31
|
}
|
|
31
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
32
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguZC50cyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9jcnlwdG8vc2Nobm9yci9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFDQSxPQUFPLEtBQUssRUFBRSxFQUFFLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQztBQUN6RCxPQUFPLEtBQUssRUFBRSxjQUFjLEVBQUUsTUFBTSxtQ0FBbUMsQ0FBQztBQUN4RSxPQUFPLEVBQUUsS0FBSyxFQUFFLE1BQU0sbUNBQW1DLENBQUM7QUFFMUQsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFFbEQsY0FBYyxnQkFBZ0IsQ0FBQztBQUUvQjs7R0FFRztBQUNILHFCQUFhLE9BQU87SUFDbEI7Ozs7T0FJRztJQUNVLGdCQUFnQixDQUFDLFVBQVUsRUFBRSxjQUFjLEdBQUcsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUt4RTtJQUVEOzs7OztPQUtHO0lBQ1Usa0JBQWtCLENBQUMsR0FBRyxFQUFFLEVBQUUsRUFBRSxVQUFVLEVBQUUsY0FBYyw2QkFRbEU7SUFFRDs7Ozs7O09BTUc7SUFDVSxlQUFlLENBQUMsR0FBRyxFQUFFLEVBQUUsRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFLEdBQUcsRUFBRSxnQkFBZ0Isb0JBVXpFO0NBQ0YifQ==
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/crypto/schnorr/index.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,mCAAmC,CAAC;AACxE,OAAO,EAAE,KAAK,EAAE,MAAM,mCAAmC,CAAC;AAE1D,OAAO,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAElD,cAAc,gBAAgB,CAAC;AAE/B;;GAEG;AACH,qBAAa,OAAO;IAClB;;;;OAIG;IACU,gBAAgB,CAAC,UAAU,EAAE,cAAc,GAAG,OAAO,CAAC,KAAK,CAAC,CAKxE;IAED;;;;;OAKG;IACU,kBAAkB,CAAC,GAAG,EAAE,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/crypto/schnorr/index.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,EAAE,EAAE,MAAM,gCAAgC,CAAC;AACzD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,mCAAmC,CAAC;AACxE,OAAO,EAAE,KAAK,EAAE,MAAM,mCAAmC,CAAC;AAE1D,OAAO,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAElD,cAAc,gBAAgB,CAAC;AAE/B;;GAEG;AACH,qBAAa,OAAO;IAClB;;;;OAIG;IACU,gBAAgB,CAAC,UAAU,EAAE,cAAc,GAAG,OAAO,CAAC,KAAK,CAAC,CAKxE;IAED;;;;;OAKG;IACU,kBAAkB,CAAC,GAAG,EAAE,EAAE,EAAE,UAAU,EAAE,cAAc,6BAQlE;IAED;;;;;;OAMG;IACU,eAAe,CAAC,GAAG,EAAE,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,EAAE,gBAAgB,oBAUzE;CACF"}
|
|
@@ -21,15 +21,15 @@ export * from './signature.js';
|
|
|
21
21
|
]));
|
|
22
22
|
}
|
|
23
23
|
/**
|
|
24
|
-
* Constructs a Schnorr signature
|
|
25
|
-
* @param msg -
|
|
24
|
+
* Constructs a Schnorr signature over a 32-byte message field element.
|
|
25
|
+
* @param msg - The message hash, as a grumpkin base field element.
|
|
26
26
|
* @param privateKey - The private key of the signer.
|
|
27
27
|
* @returns A Schnorr signature of the form (s, e).
|
|
28
28
|
*/ async constructSignature(msg, privateKey) {
|
|
29
29
|
await BarretenbergSync.initSingleton();
|
|
30
30
|
const api = BarretenbergSync.getSingleton();
|
|
31
31
|
const response = api.schnorrConstructSignature({
|
|
32
|
-
|
|
32
|
+
messageField: msg.toBuffer(),
|
|
33
33
|
privateKey: privateKey.toBuffer()
|
|
34
34
|
});
|
|
35
35
|
return new SchnorrSignature(Buffer.from([
|
|
@@ -38,8 +38,8 @@ export * from './signature.js';
|
|
|
38
38
|
]));
|
|
39
39
|
}
|
|
40
40
|
/**
|
|
41
|
-
* Verifies a Schnorr signature
|
|
42
|
-
* @param msg -
|
|
41
|
+
* Verifies a Schnorr signature against a Grumpkin public key.
|
|
42
|
+
* @param msg - The message hash, as a grumpkin base field element.
|
|
43
43
|
* @param pubKey - The Grumpkin public key of the signer.
|
|
44
44
|
* @param sig - The Schnorr signature.
|
|
45
45
|
* @returns True or false.
|
|
@@ -47,7 +47,7 @@ export * from './signature.js';
|
|
|
47
47
|
await BarretenbergSync.initSingleton();
|
|
48
48
|
const api = BarretenbergSync.getSingleton();
|
|
49
49
|
const response = api.schnorrVerifySignature({
|
|
50
|
-
|
|
50
|
+
messageField: msg.toBuffer(),
|
|
51
51
|
publicKey: {
|
|
52
52
|
x: pubKey.x.toBuffer(),
|
|
53
53
|
y: pubKey.y.toBuffer()
|
|
@@ -1,5 +1,4 @@
|
|
|
1
1
|
import { Fr } from '@aztec/foundation/curves/bn254';
|
|
2
|
-
import { BufferReader } from '@aztec/foundation/serialize';
|
|
3
2
|
import type { Signature } from '../signature/index.js';
|
|
4
3
|
/**
|
|
5
4
|
* Schnorr signature used for transactions.
|
|
@@ -11,28 +10,7 @@ export declare class SchnorrSignature implements Signature {
|
|
|
11
10
|
* The size of the signature in bytes.
|
|
12
11
|
*/
|
|
13
12
|
static SIZE: number;
|
|
14
|
-
/**
|
|
15
|
-
* An empty signature.
|
|
16
|
-
*/
|
|
17
|
-
static EMPTY: SchnorrSignature;
|
|
18
13
|
constructor(buffer: Buffer);
|
|
19
|
-
/**
|
|
20
|
-
* Determines if the provided signature is valid or not.
|
|
21
|
-
* @param signature - The data to be checked.
|
|
22
|
-
* @returns Boolean indicating if the provided data is a valid schnorr signature.
|
|
23
|
-
*/
|
|
24
|
-
static isSignature(signature: string): boolean;
|
|
25
|
-
/**
|
|
26
|
-
* Constructs a SchnorrSignature from the provided string.
|
|
27
|
-
* @param signature - The string to be converted to a schnorr signature.
|
|
28
|
-
* @returns The constructed schnorr signature.
|
|
29
|
-
*/
|
|
30
|
-
static fromString(signature: string): SchnorrSignature;
|
|
31
|
-
/**
|
|
32
|
-
* Generates a random schnorr signature.
|
|
33
|
-
* @returns The randomly constructed signature.
|
|
34
|
-
*/
|
|
35
|
-
static random(): SchnorrSignature;
|
|
36
14
|
/**
|
|
37
15
|
* Returns the 's' component of the signature.
|
|
38
16
|
* @returns A buffer containing the signature's 's' component.
|
|
@@ -48,12 +26,6 @@ export declare class SchnorrSignature implements Signature {
|
|
|
48
26
|
* @returns A buffer containing the signature.
|
|
49
27
|
*/
|
|
50
28
|
toBuffer(): Buffer<ArrayBufferLike>;
|
|
51
|
-
/**
|
|
52
|
-
* Deserializes from a buffer.
|
|
53
|
-
* @param buffer - The buffer representation of the object.
|
|
54
|
-
* @returns The new object.
|
|
55
|
-
*/
|
|
56
|
-
static fromBuffer(buffer: Buffer | BufferReader): SchnorrSignature;
|
|
57
29
|
/**
|
|
58
30
|
* Returns the full signature as a hex string.
|
|
59
31
|
* @returns A string containing the signature in hex format.
|
|
@@ -64,5 +36,13 @@ export declare class SchnorrSignature implements Signature {
|
|
|
64
36
|
* @returns The signature components as an array of three fields
|
|
65
37
|
*/
|
|
66
38
|
toFields(): Fr[];
|
|
39
|
+
/**
|
|
40
|
+
* Splits the signature into the four 128-bit limbs that Noir's `EmbeddedCurveScalar` consumes:
|
|
41
|
+
* `[s.lo, s.hi, e.lo, e.hi]`, where each component scalar is encoded as `lo + hi * 2^128`.
|
|
42
|
+
*
|
|
43
|
+
* Each 32-byte big-endian component is sliced into its top 16 bytes (`hi`) and bottom 16 bytes
|
|
44
|
+
* (`lo`); each half is zero-padded into a 32-byte buffer and decoded as `Fr` (big-endian).
|
|
45
|
+
*/
|
|
46
|
+
toLimbFields(): [Fr, Fr, Fr, Fr];
|
|
67
47
|
}
|
|
68
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
48
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2lnbmF0dXJlLmQudHMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvY3J5cHRvL3NjaG5vcnIvc2lnbmF0dXJlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxFQUFFLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQztBQUdwRCxPQUFPLEtBQUssRUFBRSxTQUFTLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUV2RDs7O0dBR0c7QUFDSCxxQkFBYSxnQkFBaUIsWUFBVyxTQUFTO0lBTXBDLE9BQU8sQ0FBQyxNQUFNO0lBTDFCOztPQUVHO0lBQ0gsT0FBYyxJQUFJLFNBQU07SUFFeEIsWUFBb0IsTUFBTSxFQUFFLE1BQU0sRUFJakM7SUFFRDs7O09BR0c7SUFDSCxJQUFJLENBQUMsNEJBRUo7SUFFRDs7O09BR0c7SUFDSCxJQUFJLENBQUMsNEJBRUo7SUFFRDs7O09BR0c7SUFDSCxRQUFRLDRCQUVQO0lBRUQ7OztPQUdHO0lBQ0gsUUFBUSxXQUVQO0lBRUQ7OztPQUdHO0lBQ0gsUUFBUSxJQUFJLEVBQUUsRUFBRSxDQVlmO0lBRUQ7Ozs7OztPQU1HO0lBQ0gsWUFBWSxJQUFJLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDLENBTy9CO0NBQ0YifQ==
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"signature.d.ts","sourceRoot":"","sources":["../../../src/crypto/schnorr/signature.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"signature.d.ts","sourceRoot":"","sources":["../../../src/crypto/schnorr/signature.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,EAAE,EAAE,MAAM,gCAAgC,CAAC;AAGpD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AAEvD;;;GAGG;AACH,qBAAa,gBAAiB,YAAW,SAAS;IAMpC,OAAO,CAAC,MAAM;IAL1B;;OAEG;IACH,OAAc,IAAI,SAAM;IAExB,YAAoB,MAAM,EAAE,MAAM,EAIjC;IAED;;;OAGG;IACH,IAAI,CAAC,4BAEJ;IAED;;;OAGG;IACH,IAAI,CAAC,4BAEJ;IAED;;;OAGG;IACH,QAAQ,4BAEP;IAED;;;OAGG;IACH,QAAQ,WAEP;IAED;;;OAGG;IACH,QAAQ,IAAI,EAAE,EAAE,CAYf;IAED;;;;;;OAMG;IACH,YAAY,IAAI,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,CAO/B;CACF"}
|
|
@@ -1,6 +1,5 @@
|
|
|
1
|
-
import { randomBytes } from '@aztec/foundation/crypto/random';
|
|
2
1
|
import { Fr } from '@aztec/foundation/curves/bn254';
|
|
3
|
-
import {
|
|
2
|
+
import { mapTuple } from '@aztec/foundation/serialize';
|
|
4
3
|
/**
|
|
5
4
|
* Schnorr signature used for transactions.
|
|
6
5
|
* @see cpp/barretenberg/cpp/src/barretenberg/crypto/schnorr/schnorr.hpp
|
|
@@ -9,9 +8,6 @@ import { BufferReader, mapTuple } from '@aztec/foundation/serialize';
|
|
|
9
8
|
/**
|
|
10
9
|
* The size of the signature in bytes.
|
|
11
10
|
*/ static SIZE = 64;
|
|
12
|
-
/**
|
|
13
|
-
* An empty signature.
|
|
14
|
-
*/ static EMPTY = new SchnorrSignature(Buffer.alloc(64));
|
|
15
11
|
constructor(buffer){
|
|
16
12
|
this.buffer = buffer;
|
|
17
13
|
if (buffer.length !== SchnorrSignature.SIZE) {
|
|
@@ -19,29 +15,6 @@ import { BufferReader, mapTuple } from '@aztec/foundation/serialize';
|
|
|
19
15
|
}
|
|
20
16
|
}
|
|
21
17
|
/**
|
|
22
|
-
* Determines if the provided signature is valid or not.
|
|
23
|
-
* @param signature - The data to be checked.
|
|
24
|
-
* @returns Boolean indicating if the provided data is a valid schnorr signature.
|
|
25
|
-
*/ static isSignature(signature) {
|
|
26
|
-
return /^(0x)?[0-9a-f]{128}$/i.test(signature);
|
|
27
|
-
}
|
|
28
|
-
/**
|
|
29
|
-
* Constructs a SchnorrSignature from the provided string.
|
|
30
|
-
* @param signature - The string to be converted to a schnorr signature.
|
|
31
|
-
* @returns The constructed schnorr signature.
|
|
32
|
-
*/ static fromString(signature) {
|
|
33
|
-
if (!SchnorrSignature.isSignature(signature)) {
|
|
34
|
-
throw new Error(`Invalid signature string: ${signature}`);
|
|
35
|
-
}
|
|
36
|
-
return new SchnorrSignature(Buffer.from(signature.replace(/^0x/i, ''), 'hex'));
|
|
37
|
-
}
|
|
38
|
-
/**
|
|
39
|
-
* Generates a random schnorr signature.
|
|
40
|
-
* @returns The randomly constructed signature.
|
|
41
|
-
*/ static random() {
|
|
42
|
-
return new SchnorrSignature(randomBytes(64));
|
|
43
|
-
}
|
|
44
|
-
/**
|
|
45
18
|
* Returns the 's' component of the signature.
|
|
46
19
|
* @returns A buffer containing the signature's 's' component.
|
|
47
20
|
*/ get s() {
|
|
@@ -60,14 +33,6 @@ import { BufferReader, mapTuple } from '@aztec/foundation/serialize';
|
|
|
60
33
|
return this.buffer;
|
|
61
34
|
}
|
|
62
35
|
/**
|
|
63
|
-
* Deserializes from a buffer.
|
|
64
|
-
* @param buffer - The buffer representation of the object.
|
|
65
|
-
* @returns The new object.
|
|
66
|
-
*/ static fromBuffer(buffer) {
|
|
67
|
-
const reader = BufferReader.asReader(buffer);
|
|
68
|
-
return new SchnorrSignature(reader.readBytes(SchnorrSignature.SIZE));
|
|
69
|
-
}
|
|
70
|
-
/**
|
|
71
36
|
* Returns the full signature as a hex string.
|
|
72
37
|
* @returns A string containing the signature in hex format.
|
|
73
38
|
*/ toString() {
|
|
@@ -90,4 +55,23 @@ import { BufferReader, mapTuple } from '@aztec/foundation/serialize';
|
|
|
90
55
|
buf3
|
|
91
56
|
], Fr.fromBuffer);
|
|
92
57
|
}
|
|
58
|
+
/**
|
|
59
|
+
* Splits the signature into the four 128-bit limbs that Noir's `EmbeddedCurveScalar` consumes:
|
|
60
|
+
* `[s.lo, s.hi, e.lo, e.hi]`, where each component scalar is encoded as `lo + hi * 2^128`.
|
|
61
|
+
*
|
|
62
|
+
* Each 32-byte big-endian component is sliced into its top 16 bytes (`hi`) and bottom 16 bytes
|
|
63
|
+
* (`lo`); each half is zero-padded into a 32-byte buffer and decoded as `Fr` (big-endian).
|
|
64
|
+
*/ toLimbFields() {
|
|
65
|
+
const limb = (start)=>{
|
|
66
|
+
const buf = Buffer.alloc(32);
|
|
67
|
+
this.buffer.copy(buf, 16, start, start + 16);
|
|
68
|
+
return Fr.fromBuffer(buf);
|
|
69
|
+
};
|
|
70
|
+
return [
|
|
71
|
+
limb(16),
|
|
72
|
+
limb(0),
|
|
73
|
+
limb(48),
|
|
74
|
+
limb(32)
|
|
75
|
+
];
|
|
76
|
+
}
|
|
93
77
|
}
|
|
@@ -92,7 +92,7 @@ export declare class BLS12Fr extends BLS12Field {
|
|
|
92
92
|
sqrt(): BLS12Fr | null;
|
|
93
93
|
pow(rhs: bigint): BLS12Fr;
|
|
94
94
|
toJSON(): `0x${string}`;
|
|
95
|
-
static get schema(): import("zod").ZodType<BLS12Fr,
|
|
95
|
+
static get schema(): import("zod").ZodType<BLS12Fr, string, import("zod/v4/core").$ZodTypeInternals<BLS12Fr, string>>;
|
|
96
96
|
}
|
|
97
97
|
/**
|
|
98
98
|
* Fq field class.
|
|
@@ -143,6 +143,6 @@ export declare class BLS12Fq extends BLS12Field {
|
|
|
143
143
|
sqrt(): BLS12Fq | null;
|
|
144
144
|
pow(rhs: bigint): BLS12Fq;
|
|
145
145
|
toJSON(): `0x${string}`;
|
|
146
|
-
static get schema(): import("zod").ZodType<BLS12Fq,
|
|
146
|
+
static get schema(): import("zod").ZodType<BLS12Fq, string, import("zod/v4/core").$ZodTypeInternals<BLS12Fq, string>>;
|
|
147
147
|
}
|
|
148
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
148
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmllbGQuZC50cyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9jdXJ2ZXMvYmxzMTIvZmllbGQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBRUEsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUsvQixPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sa0NBQWtDLENBQUM7QUFDaEUsT0FBTyxFQUFFLEVBQUUsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBY3ZDOztHQUVHO0FBQ0gsOEJBQXNCLFVBQVU7SUFDOUIsT0FBTyxDQUFDLFFBQVEsQ0FBQyxDQUFTO0lBQzFCLE9BQU8sQ0FBQyxRQUFRLENBQUMsQ0FBUztJQUUxQixTQUFTLGFBQWEsS0FBSyxFQUFFLE1BQU0sR0FBRyxNQUFNLEdBQUcsTUFBTSxFQWlCcEQ7SUFFRCxTQUFTLENBQUMsUUFBUSxDQUFDLE9BQU8sSUFBSSxNQUFNLENBQUM7SUFDckMsU0FBUyxDQUFDLFFBQVEsQ0FBQyxJQUFJLElBQUksTUFBTSxDQUFDO0lBRWxDOztPQUVHO0lBQ0gsUUFBUSxJQUFJLE1BQU0sQ0FLakI7SUFFRCxRQUFRLElBQUksS0FBSyxNQUFNLEVBQUUsQ0FFeEI7SUFFRCxRQUFRLElBQUksTUFBTSxDQVFqQjtJQUVELFlBQVksSUFBSTtRQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsQ0FBQTtLQUFFLENBVWxDO0lBRUQsTUFBTSxDQUFDLEdBQUcsRUFBRSxVQUFVLEdBQUcsT0FBTyxDQUUvQjtJQUVELEVBQUUsQ0FBQyxHQUFHLEVBQUUsVUFBVSxHQUFHLE9BQU8sQ0FFM0I7SUFFRCxNQUFNLElBQUksT0FBTyxDQUVoQjtJQUVELE9BQU8sSUFBSSxPQUFPLENBRWpCO0lBRUQsVUFBVSxJQUFJLE9BQU8sQ0FJcEI7SUFFRCxjQUFjLElBQUksTUFBTSxDQUV2QjtJQUVELE9BQU8sU0FFTjtDQUNGO0FBa0REOzs7R0FHRztBQUNILHFCQUFhLE9BQVEsU0FBUSxVQUFVO0lB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
|