@aztec/foundation 0.46.6 → 0.47.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dest/crypto/keccak/index.d.ts +6 -0
- package/dest/crypto/keccak/index.d.ts.map +1 -1
- package/dest/crypto/keccak/index.js +223 -1
- package/dest/crypto/random/index.d.ts +5 -0
- package/dest/crypto/random/index.d.ts.map +1 -1
- package/dest/crypto/random/index.js +9 -1
- package/dest/fields/fields.d.ts +6 -0
- package/dest/fields/fields.d.ts.map +1 -1
- package/dest/fields/fields.js +36 -15
- package/dest/fields/point.d.ts +33 -0
- package/dest/fields/point.d.ts.map +1 -1
- package/dest/fields/point.js +85 -4
- package/dest/log/log_fn.d.ts +1 -1
- package/dest/log/log_fn.d.ts.map +1 -1
- package/package.json +2 -2
- package/src/crypto/keccak/index.ts +245 -0
- package/src/crypto/random/index.ts +9 -0
- package/src/fields/fields.ts +22 -0
- package/src/fields/point.ts +95 -3
- package/src/log/log_fn.ts +1 -1
|
@@ -17,4 +17,10 @@ export declare function keccak256String(input: string): string;
|
|
|
17
17
|
* @returns The computed Keccak-224 hash as a Buffer.
|
|
18
18
|
*/
|
|
19
19
|
export declare function keccak224(input: Buffer): Buffer;
|
|
20
|
+
/**
|
|
21
|
+
* Computes the Keccak-f1600 permutation of the input.
|
|
22
|
+
* @param state 25 64-bit words.
|
|
23
|
+
* @returns The permuted state.
|
|
24
|
+
*/
|
|
25
|
+
export declare function keccakf1600(state: bigint[]): bigint[];
|
|
20
26
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/crypto/keccak/index.ts"],"names":[],"mappings":";AAEA;;;;;GAKG;AACH,wBAAgB,SAAS,CAAC,KAAK,EAAE,MAAM,UAGtC;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,KAAK,EAAE,MAAM,UAK5C;AAED;;;;;GAKG;AACH,wBAAgB,SAAS,CAAC,KAAK,EAAE,MAAM,UAGtC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/crypto/keccak/index.ts"],"names":[],"mappings":";AAEA;;;;;GAKG;AACH,wBAAgB,SAAS,CAAC,KAAK,EAAE,MAAM,UAGtC;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,KAAK,EAAE,MAAM,UAK5C;AAED;;;;;GAKG;AACH,wBAAgB,SAAS,CAAC,KAAK,EAAE,MAAM,UAGtC;AAED;;;;GAIG;AACH,wBAAgB,WAAW,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,MAAM,EAAE,CA+MrD"}
|
|
@@ -28,4 +28,226 @@ export function keccak224(input) {
|
|
|
28
28
|
const hash = new Keccak(224);
|
|
29
29
|
return hash.update(input).digest();
|
|
30
30
|
}
|
|
31
|
-
|
|
31
|
+
/**
|
|
32
|
+
* Computes the Keccak-f1600 permutation of the input.
|
|
33
|
+
* @param state 25 64-bit words.
|
|
34
|
+
* @returns The permuted state.
|
|
35
|
+
*/
|
|
36
|
+
export function keccakf1600(state) {
|
|
37
|
+
// Ideally we'd assert the size of the state and its constituent elements here.
|
|
38
|
+
// But since this gets included in the browser bundle, we can't use Node's assert module.
|
|
39
|
+
/* The implementation based on the "simple" implementation by Ronny Van Keer. */
|
|
40
|
+
/* Adapted from Barretenberg's CPP implementation. */
|
|
41
|
+
let Eba, Ebe, Ebi, Ebo, Ebu;
|
|
42
|
+
let Ega, Ege, Egi, Ego, Egu;
|
|
43
|
+
let Eka, Eke, Eki, Eko, Eku;
|
|
44
|
+
let Ema, Eme, Emi, Emo, Emu;
|
|
45
|
+
let Esa, Ese, Esi, Eso, Esu;
|
|
46
|
+
let Ba, Be, Bi, Bo, Bu;
|
|
47
|
+
let Da, De, Di, Do, Du;
|
|
48
|
+
let Aba = state[0];
|
|
49
|
+
let Abe = state[1];
|
|
50
|
+
let Abi = state[2];
|
|
51
|
+
let Abo = state[3];
|
|
52
|
+
let Abu = state[4];
|
|
53
|
+
let Aga = state[5];
|
|
54
|
+
let Age = state[6];
|
|
55
|
+
let Agi = state[7];
|
|
56
|
+
let Ago = state[8];
|
|
57
|
+
let Agu = state[9];
|
|
58
|
+
let Aka = state[10];
|
|
59
|
+
let Ake = state[11];
|
|
60
|
+
let Aki = state[12];
|
|
61
|
+
let Ako = state[13];
|
|
62
|
+
let Aku = state[14];
|
|
63
|
+
let Ama = state[15];
|
|
64
|
+
let Ame = state[16];
|
|
65
|
+
let Ami = state[17];
|
|
66
|
+
let Amo = state[18];
|
|
67
|
+
let Amu = state[19];
|
|
68
|
+
let Asa = state[20];
|
|
69
|
+
let Ase = state[21];
|
|
70
|
+
let Asi = state[22];
|
|
71
|
+
let Aso = state[23];
|
|
72
|
+
let Asu = state[24];
|
|
73
|
+
for (let round = 0; round < 24; round += 2) {
|
|
74
|
+
/* Round (round + 0): Axx -> Exx */
|
|
75
|
+
Ba = Aba ^ Aga ^ Aka ^ Ama ^ Asa;
|
|
76
|
+
Be = Abe ^ Age ^ Ake ^ Ame ^ Ase;
|
|
77
|
+
Bi = Abi ^ Agi ^ Aki ^ Ami ^ Asi;
|
|
78
|
+
Bo = Abo ^ Ago ^ Ako ^ Amo ^ Aso;
|
|
79
|
+
Bu = Abu ^ Agu ^ Aku ^ Amu ^ Asu;
|
|
80
|
+
Da = Bu ^ rol(Be, 1n);
|
|
81
|
+
De = Ba ^ rol(Bi, 1n);
|
|
82
|
+
Di = Be ^ rol(Bo, 1n);
|
|
83
|
+
Do = Bi ^ rol(Bu, 1n);
|
|
84
|
+
Du = Bo ^ rol(Ba, 1n);
|
|
85
|
+
Ba = Aba ^ Da;
|
|
86
|
+
Be = rol(Age ^ De, 44n);
|
|
87
|
+
Bi = rol(Aki ^ Di, 43n);
|
|
88
|
+
Bo = rol(Amo ^ Do, 21n);
|
|
89
|
+
Bu = rol(Asu ^ Du, 14n);
|
|
90
|
+
Eba = Ba ^ (~Be & Bi) ^ roundConstants[round];
|
|
91
|
+
Ebe = Be ^ (~Bi & Bo);
|
|
92
|
+
Ebi = Bi ^ (~Bo & Bu);
|
|
93
|
+
Ebo = Bo ^ (~Bu & Ba);
|
|
94
|
+
Ebu = Bu ^ (~Ba & Be);
|
|
95
|
+
Ba = rol(Abo ^ Do, 28n);
|
|
96
|
+
Be = rol(Agu ^ Du, 20n);
|
|
97
|
+
Bi = rol(Aka ^ Da, 3n);
|
|
98
|
+
Bo = rol(Ame ^ De, 45n);
|
|
99
|
+
Bu = rol(Asi ^ Di, 61n);
|
|
100
|
+
Ega = Ba ^ (~Be & Bi);
|
|
101
|
+
Ege = Be ^ (~Bi & Bo);
|
|
102
|
+
Egi = Bi ^ (~Bo & Bu);
|
|
103
|
+
Ego = Bo ^ (~Bu & Ba);
|
|
104
|
+
Egu = Bu ^ (~Ba & Be);
|
|
105
|
+
Ba = rol(Abe ^ De, 1n);
|
|
106
|
+
Be = rol(Agi ^ Di, 6n);
|
|
107
|
+
Bi = rol(Ako ^ Do, 25n);
|
|
108
|
+
Bo = rol(Amu ^ Du, 8n);
|
|
109
|
+
Bu = rol(Asa ^ Da, 18n);
|
|
110
|
+
Eka = Ba ^ (~Be & Bi);
|
|
111
|
+
Eke = Be ^ (~Bi & Bo);
|
|
112
|
+
Eki = Bi ^ (~Bo & Bu);
|
|
113
|
+
Eko = Bo ^ (~Bu & Ba);
|
|
114
|
+
Eku = Bu ^ (~Ba & Be);
|
|
115
|
+
Ba = rol(Abu ^ Du, 27n);
|
|
116
|
+
Be = rol(Aga ^ Da, 36n);
|
|
117
|
+
Bi = rol(Ake ^ De, 10n);
|
|
118
|
+
Bo = rol(Ami ^ Di, 15n);
|
|
119
|
+
Bu = rol(Aso ^ Do, 56n);
|
|
120
|
+
Ema = Ba ^ (~Be & Bi);
|
|
121
|
+
Eme = Be ^ (~Bi & Bo);
|
|
122
|
+
Emi = Bi ^ (~Bo & Bu);
|
|
123
|
+
Emo = Bo ^ (~Bu & Ba);
|
|
124
|
+
Emu = Bu ^ (~Ba & Be);
|
|
125
|
+
Ba = rol(Abi ^ Di, 62n);
|
|
126
|
+
Be = rol(Ago ^ Do, 55n);
|
|
127
|
+
Bi = rol(Aku ^ Du, 39n);
|
|
128
|
+
Bo = rol(Ama ^ Da, 41n);
|
|
129
|
+
Bu = rol(Ase ^ De, 2n);
|
|
130
|
+
Esa = Ba ^ (~Be & Bi);
|
|
131
|
+
Ese = Be ^ (~Bi & Bo);
|
|
132
|
+
Esi = Bi ^ (~Bo & Bu);
|
|
133
|
+
Eso = Bo ^ (~Bu & Ba);
|
|
134
|
+
Esu = Bu ^ (~Ba & Be);
|
|
135
|
+
/* Round (round + 1): Exx -> Axx */
|
|
136
|
+
Ba = Eba ^ Ega ^ Eka ^ Ema ^ Esa;
|
|
137
|
+
Be = Ebe ^ Ege ^ Eke ^ Eme ^ Ese;
|
|
138
|
+
Bi = Ebi ^ Egi ^ Eki ^ Emi ^ Esi;
|
|
139
|
+
Bo = Ebo ^ Ego ^ Eko ^ Emo ^ Eso;
|
|
140
|
+
Bu = Ebu ^ Egu ^ Eku ^ Emu ^ Esu;
|
|
141
|
+
Da = Bu ^ rol(Be, 1n);
|
|
142
|
+
De = Ba ^ rol(Bi, 1n);
|
|
143
|
+
Di = Be ^ rol(Bo, 1n);
|
|
144
|
+
Do = Bi ^ rol(Bu, 1n);
|
|
145
|
+
Du = Bo ^ rol(Ba, 1n);
|
|
146
|
+
Ba = Eba ^ Da;
|
|
147
|
+
Be = rol(Ege ^ De, 44n);
|
|
148
|
+
Bi = rol(Eki ^ Di, 43n);
|
|
149
|
+
Bo = rol(Emo ^ Do, 21n);
|
|
150
|
+
Bu = rol(Esu ^ Du, 14n);
|
|
151
|
+
Aba = Ba ^ (~Be & Bi) ^ roundConstants[round + 1];
|
|
152
|
+
Abe = Be ^ (~Bi & Bo);
|
|
153
|
+
Abi = Bi ^ (~Bo & Bu);
|
|
154
|
+
Abo = Bo ^ (~Bu & Ba);
|
|
155
|
+
Abu = Bu ^ (~Ba & Be);
|
|
156
|
+
Ba = rol(Ebo ^ Do, 28n);
|
|
157
|
+
Be = rol(Egu ^ Du, 20n);
|
|
158
|
+
Bi = rol(Eka ^ Da, 3n);
|
|
159
|
+
Bo = rol(Eme ^ De, 45n);
|
|
160
|
+
Bu = rol(Esi ^ Di, 61n);
|
|
161
|
+
Aga = Ba ^ (~Be & Bi);
|
|
162
|
+
Age = Be ^ (~Bi & Bo);
|
|
163
|
+
Agi = Bi ^ (~Bo & Bu);
|
|
164
|
+
Ago = Bo ^ (~Bu & Ba);
|
|
165
|
+
Agu = Bu ^ (~Ba & Be);
|
|
166
|
+
Ba = rol(Ebe ^ De, 1n);
|
|
167
|
+
Be = rol(Egi ^ Di, 6n);
|
|
168
|
+
Bi = rol(Eko ^ Do, 25n);
|
|
169
|
+
Bo = rol(Emu ^ Du, 8n);
|
|
170
|
+
Bu = rol(Esa ^ Da, 18n);
|
|
171
|
+
Aka = Ba ^ (~Be & Bi);
|
|
172
|
+
Ake = Be ^ (~Bi & Bo);
|
|
173
|
+
Aki = Bi ^ (~Bo & Bu);
|
|
174
|
+
Ako = Bo ^ (~Bu & Ba);
|
|
175
|
+
Aku = Bu ^ (~Ba & Be);
|
|
176
|
+
Ba = rol(Ebu ^ Du, 27n);
|
|
177
|
+
Be = rol(Ega ^ Da, 36n);
|
|
178
|
+
Bi = rol(Eke ^ De, 10n);
|
|
179
|
+
Bo = rol(Emi ^ Di, 15n);
|
|
180
|
+
Bu = rol(Eso ^ Do, 56n);
|
|
181
|
+
Ama = Ba ^ (~Be & Bi);
|
|
182
|
+
Ame = Be ^ (~Bi & Bo);
|
|
183
|
+
Ami = Bi ^ (~Bo & Bu);
|
|
184
|
+
Amo = Bo ^ (~Bu & Ba);
|
|
185
|
+
Amu = Bu ^ (~Ba & Be);
|
|
186
|
+
Ba = rol(Ebi ^ Di, 62n);
|
|
187
|
+
Be = rol(Ego ^ Do, 55n);
|
|
188
|
+
Bi = rol(Eku ^ Du, 39n);
|
|
189
|
+
Bo = rol(Ema ^ Da, 41n);
|
|
190
|
+
Bu = rol(Ese ^ De, 2n);
|
|
191
|
+
Asa = Ba ^ (~Be & Bi);
|
|
192
|
+
Ase = Be ^ (~Bi & Bo);
|
|
193
|
+
Asi = Bi ^ (~Bo & Bu);
|
|
194
|
+
Aso = Bo ^ (~Bu & Ba);
|
|
195
|
+
Asu = Bu ^ (~Ba & Be);
|
|
196
|
+
}
|
|
197
|
+
state[0] = Aba;
|
|
198
|
+
state[1] = Abe;
|
|
199
|
+
state[2] = Abi;
|
|
200
|
+
state[3] = Abo;
|
|
201
|
+
state[4] = Abu;
|
|
202
|
+
state[5] = Aga;
|
|
203
|
+
state[6] = Age;
|
|
204
|
+
state[7] = Agi;
|
|
205
|
+
state[8] = Ago;
|
|
206
|
+
state[9] = Agu;
|
|
207
|
+
state[10] = Aka;
|
|
208
|
+
state[11] = Ake;
|
|
209
|
+
state[12] = Aki;
|
|
210
|
+
state[13] = Ako;
|
|
211
|
+
state[14] = Aku;
|
|
212
|
+
state[15] = Ama;
|
|
213
|
+
state[16] = Ame;
|
|
214
|
+
state[17] = Ami;
|
|
215
|
+
state[18] = Amo;
|
|
216
|
+
state[19] = Amu;
|
|
217
|
+
state[20] = Asa;
|
|
218
|
+
state[21] = Ase;
|
|
219
|
+
state[22] = Asi;
|
|
220
|
+
state[23] = Aso;
|
|
221
|
+
state[24] = Asu;
|
|
222
|
+
return state;
|
|
223
|
+
}
|
|
224
|
+
function rol(x, s) {
|
|
225
|
+
return BigInt.asUintN(64, x << s) | (x >> (64n - s));
|
|
226
|
+
}
|
|
227
|
+
const roundConstants = [
|
|
228
|
+
0x0000000000000001n,
|
|
229
|
+
0x0000000000008082n,
|
|
230
|
+
0x800000000000808an,
|
|
231
|
+
0x8000000080008000n,
|
|
232
|
+
0x000000000000808bn,
|
|
233
|
+
0x0000000080000001n,
|
|
234
|
+
0x8000000080008081n,
|
|
235
|
+
0x8000000000008009n,
|
|
236
|
+
0x000000000000008an,
|
|
237
|
+
0x0000000000000088n,
|
|
238
|
+
0x0000000080008009n,
|
|
239
|
+
0x000000008000000an,
|
|
240
|
+
0x000000008000808bn,
|
|
241
|
+
0x800000000000008bn,
|
|
242
|
+
0x8000000000008089n,
|
|
243
|
+
0x8000000000008003n,
|
|
244
|
+
0x8000000000008002n,
|
|
245
|
+
0x8000000000000080n,
|
|
246
|
+
0x000000000000800an,
|
|
247
|
+
0x800000008000000an,
|
|
248
|
+
0x8000000080008081n,
|
|
249
|
+
0x8000000000008080n,
|
|
250
|
+
0x0000000080000001n,
|
|
251
|
+
0x8000000080008008n,
|
|
252
|
+
];
|
|
253
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvY3J5cHRvL2tlY2Nhay9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBRTlCOzs7OztHQUtHO0FBQ0gsTUFBTSxVQUFVLFNBQVMsQ0FBQyxLQUFhO0lBQ3JDLE1BQU0sSUFBSSxHQUFHLElBQUksTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQzdCLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQztBQUNyQyxDQUFDO0FBRUQ7O0dBRUc7QUFDSCxNQUFNLFVBQVUsZUFBZSxDQUFDLEtBQWE7SUFDM0MsTUFBTSxJQUFJLEdBQUcsSUFBSSxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDN0IsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDO0lBQ2IsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUNuQixPQUFPLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7QUFDNUIsQ0FBQztBQUVEOzs7OztHQUtHO0FBQ0gsTUFBTSxVQUFVLFNBQVMsQ0FBQyxLQUFhO0lBQ3JDLE1BQU0sSUFBSSxHQUFHLElBQUksTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQzdCLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQztBQUNyQyxDQUFDO0FBRUQ7Ozs7R0FJRztBQUNILE1BQU0sVUFBVSxXQUFXLENBQUMsS0FBZTtJQUN6QywrRUFBK0U7SUFDL0UseUZBQXlGO0lBQ3pGLGdGQUFnRjtJQUNoRixxREFBcUQ7SUFDckQsSUFBSSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxDQUFDO0lBQzVCLElBQUksR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsQ0FBQztJQUM1QixJQUFJLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLENBQUM7SUFDNUIsSUFBSSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxDQUFDO0lBQzVCLElBQUksR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsQ0FBQztJQUU1QixJQUFJLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUM7SUFFdkIsSUFBSSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDO0lBRXZCLElBQUksR0FBRyxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNuQixJQUFJLEdBQUcsR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDbkIsSUFBSSxHQUFHLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ25CLElBQUksR0FBRyxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNuQixJQUFJLEdBQUcsR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDbkIsSUFBSSxHQUFHLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ25CLElBQUksR0FBRyxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNuQixJQUFJLEdBQUcsR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDbkIsSUFBSSxHQUFHLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ25CLElBQUksR0FBRyxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNuQixJQUFJLEdBQUcsR0FBRyxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUM7SUFDcEIsSUFBSSxHQUFHLEdBQUcsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0lBQ3BCLElBQUksR0FBRyxHQUFHLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQztJQUNwQixJQUFJLEdBQUcsR0FBRyxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUM7SUFDcEIsSUFBSSxHQUFHLEdBQUcsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0lBQ3BCLElBQUksR0FBRyxHQUFHLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQztJQUNwQixJQUFJLEdBQUcsR0FBRyxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUM7SUFDcEIsSUFBSSxHQUFHLEdBQUcsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0lBQ3BCLElBQUksR0FBRyxHQUFHLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQztJQUNwQixJQUFJLEdBQUcsR0FBRyxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUM7SUFDcEIsSUFBSSxHQUFHLEdBQUcsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0lBQ3BCLElBQUksR0FBRyxHQUFHLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQztJQUNwQixJQUFJLEdBQUcsR0FBRyxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUM7SUFDcEIsSUFBSSxHQUFHLEdBQUcsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0lBQ3BCLElBQUksR0FBRyxHQUFHLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQztJQUVwQixLQUFLLElBQUksS0FBSyxHQUFHLENBQUMsRUFBRSxLQUFLLEdBQUcsRUFBRSxFQUFFLEtBQUssSUFBSSxDQUFDLEVBQUUsQ0FBQztRQUMzQyxtQ0FBbUM7UUFDbkMsRUFBRSxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUM7UUFDakMsRUFBRSxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUM7UUFDakMsRUFBRSxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUM7UUFDakMsRUFBRSxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUM7UUFDakMsRUFBRSxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUM7UUFFakMsRUFBRSxHQUFHLEVBQUUsR0FBRyxHQUFHLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBQ3RCLEVBQUUsR0FBRyxFQUFFLEdBQUcsR0FBRyxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQztRQUN0QixFQUFFLEdBQUcsRUFBRSxHQUFHLEdBQUcsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFDdEIsRUFBRSxHQUFHLEVBQUUsR0FBRyxHQUFHLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBQ3RCLEVBQUUsR0FBRyxFQUFFLEdBQUcsR0FBRyxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQztRQUV0QixFQUFFLEdBQUcsR0FBRyxHQUFHLEVBQUUsQ0FBQztRQUNkLEVBQUUsR0FBRyxHQUFHLENBQUMsR0FBRyxHQUFHLEVBQUUsRUFBRSxHQUFHLENBQUMsQ0FBQztRQUN4QixFQUFFLEdBQUcsR0FBRyxDQUFDLEdBQUcsR0FBRyxFQUFFLEVBQUUsR0FBRyxDQUFDLENBQUM7UUFDeEIsRUFBRSxHQUFHLEdBQUcsQ0FBQyxHQUFHLEdBQUcsRUFBRSxFQUFFLEdBQUcsQ0FBQyxDQUFDO1FBQ3hCLEVBQUUsR0FBRyxHQUFHLENBQUMsR0FBRyxHQUFHLEVBQUUsRUFBRSxHQUFHLENBQUMsQ0FBQztRQUN4QixHQUFHLEdBQUcsRUFBRSxHQUFHLENBQUMsQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDLEdBQUcsY0FBYyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQzlDLEdBQUcsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUMsQ0FBQztRQUN0QixHQUFHLEdBQUcsRUFBRSxHQUFHLENBQUMsQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDLENBQUM7UUFDdEIsR0FBRyxHQUFHLEVBQUUsR0FBRyxDQUFDLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxDQUFDO1FBQ3RCLEdBQUcsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUMsQ0FBQztRQUV0QixFQUFFLEdBQUcsR0FBRyxDQUFDLEdBQUcsR0FBRyxFQUFFLEVBQUUsR0FBRyxDQUFDLENBQUM7UUFDeEIsRUFBRSxHQUFHLEdBQUcsQ0FBQyxHQUFHLEdBQUcsRUFBRSxFQUFFLEdBQUcsQ0FBQyxDQUFDO1FBQ3hCLEVBQUUsR0FBRyxHQUFHLENBQUMsR0FBRyxHQUFHLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQztRQUN2QixFQUFFLEdBQUcsR0FBRyxDQUFDLEdBQUcsR0FBRyxFQUFFLEVBQUUsR0FBRyxDQUFDLENBQUM7UUFDeEIsRUFBRSxHQUFHLEdBQUcsQ0FBQyxHQUFHLEdBQUcsRUFBRSxFQUFFLEdBQUcsQ0FBQyxDQUFDO1FBQ3hCLEdBQUcsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUMsQ0FBQztRQUN0QixHQUFHLEdBQUcsRUFBRSxHQUFHLENBQUMsQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDLENBQUM7UUFDdEIsR0FBRyxHQUFHLEVBQUUsR0FBRyxDQUFDLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxDQUFDO1FBQ3RCLEdBQUcsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUMsQ0FBQztRQUN0QixHQUFHLEdBQUcsRUFBRSxHQUFHLENBQUMsQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDLENBQUM7UUFFdEIsRUFBRSxHQUFHLEdBQUcsQ0FBQyxHQUFHLEdBQUcsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBQ3ZCLEVBQUUsR0FBRyxHQUFHLENBQUMsR0FBRyxHQUFHLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQztRQUN2QixFQUFFLEdBQUcsR0FBRyxDQUFDLEdBQUcsR0FBRyxFQUFFLEVBQUUsR0FBRyxDQUFDLENBQUM7UUFDeEIsRUFBRSxHQUFHLEdBQUcsQ0FBQyxHQUFHLEdBQUcsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBQ3ZCLEVBQUUsR0FBRyxHQUFHLENBQUMsR0FBRyxHQUFHLEVBQUUsRUFBRSxHQUFHLENBQUMsQ0FBQztRQUN4QixHQUFHLEdBQUcsRUFBRSxHQUFHLENBQUMsQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDLENBQUM7UUFDdEIsR0FBRyxHQUFHLEVBQUUsR0FBRyxDQUFDLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxDQUFDO1FBQ3RCLEdBQUcsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUMsQ0FBQztRQUN0QixHQUFHLEdBQUcsRUFBRSxHQUFHLENBQUMsQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDLENBQUM7UUFDdEIsR0FBRyxHQUFHLEVBQUUsR0FBRyxDQUFDLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxDQUFDO1FBRXRCLEVBQUUsR0FBRyxHQUFHLENBQUMsR0FBRyxHQUFHLEVBQUUsRUFBRSxHQUFHLENBQUMsQ0FBQztRQUN4QixFQUFFLEdBQUcsR0FBRyxDQUFDLEdBQUcsR0FBRyxFQUFFLEVBQUUsR0FBRyxDQUFDLENBQUM7UUFDeEIsRUFBRSxHQUFHLEdBQUcsQ0FBQyxHQUFHLEdBQUcsRUFBRSxFQUFFLEdBQUcsQ0FBQyxDQUFDO1FBQ3hCLEVBQUUsR0FBRyxHQUFHLENBQUMsR0FBRyxHQUFHLEVBQUUsRUFBRSxHQUFHLENBQUMsQ0FBQztRQUN4QixFQUFFLEdBQUcsR0FBRyxDQUFDLEdBQUcsR0FBRyxFQUFFLEVBQUUsR0FBRyxDQUFDLENBQUM7UUFDeEIsR0FBRyxHQUFHLEVBQUUsR0FBRyxDQUFDLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxDQUFDO1FBQ3RCLEdBQUcsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUMsQ0FBQztRQUN0QixHQUFHLEdBQUcsRUFBRSxHQUFHLENBQUMsQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDLENBQUM7UUFDdEIsR0FBRyxHQUFHLEVBQUUsR0FBRyxDQUFDLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxDQUFDO1FBQ3RCLEdBQUcsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUMsQ0FBQztRQUV0QixFQUFFLEdBQUcsR0FBRyxDQUFDLEdBQUcsR0FBRyxFQUFFLEVBQUUsR0FBRyxDQUFDLENBQUM7UUFDeEIsRUFBRSxHQUFHLEdBQUcsQ0FBQyxHQUFHLEdBQUcsRUFBRSxFQUFFLEdBQUcsQ0FBQyxDQUFDO1FBQ3hCLEVBQUUsR0FBRyxHQUFHLENBQUMsR0FBRyxHQUFHLEVBQUUsRUFBRSxHQUFHLENBQUMsQ0FBQztRQUN4QixFQUFFLEdBQUcsR0FBRyxDQUFDLEdBQUcsR0FBRyxFQUFFLEVBQUUsR0FBRyxDQUFDLENBQUM7UUFDeEIsRUFBRSxHQUFHLEdBQUcsQ0FBQyxHQUFHLEdBQUcsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBQ3ZCLEdBQUcsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUMsQ0FBQztRQUN0QixHQUFHLEdBQUcsRUFBRSxHQUFHLENBQUMsQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDLENBQUM7UUFDdEIsR0FBRyxHQUFHLEVBQUUsR0FBRyxDQUFDLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxDQUFDO1FBQ3RCLEdBQUcsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUMsQ0FBQztRQUN0QixHQUFHLEdBQUcsRUFBRSxHQUFHLENBQUMsQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDLENBQUM7UUFFdEIsbUNBQW1DO1FBRW5DLEVBQUUsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDO1FBQ2pDLEVBQUUsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDO1FBQ2pDLEVBQUUsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDO1FBQ2pDLEVBQUUsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDO1FBQ2pDLEVBQUUsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDO1FBRWpDLEVBQUUsR0FBRyxFQUFFLEdBQUcsR0FBRyxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQztRQUN0QixFQUFFLEdBQUcsRUFBRSxHQUFHLEdBQUcsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFDdEIsRUFBRSxHQUFHLEVBQUUsR0FBRyxHQUFHLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBQ3RCLEVBQUUsR0FBRyxFQUFFLEdBQUcsR0FBRyxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQztRQUN0QixFQUFFLEdBQUcsRUFBRSxHQUFHLEdBQUcsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFFdEIsRUFBRSxHQUFHLEdBQUcsR0FBRyxFQUFFLENBQUM7UUFDZCxFQUFFLEdBQUcsR0FBRyxDQUFDLEdBQUcsR0FBRyxFQUFFLEVBQUUsR0FBRyxDQUFDLENBQUM7UUFDeEIsRUFBRSxHQUFHLEdBQUcsQ0FBQyxHQUFHLEdBQUcsRUFBRSxFQUFFLEdBQUcsQ0FBQyxDQUFDO1FBQ3hCLEVBQUUsR0FBRyxHQUFHLENBQUMsR0FBRyxHQUFHLEVBQUUsRUFBRSxHQUFHLENBQUMsQ0FBQztRQUN4QixFQUFFLEdBQUcsR0FBRyxDQUFDLEdBQUcsR0FBRyxFQUFFLEVBQUUsR0FBRyxDQUFDLENBQUM7UUFDeEIsR0FBRyxHQUFHLEVBQUUsR0FBRyxDQUFDLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxHQUFHLGNBQWMsQ0FBQyxLQUFLLEdBQUcsQ0FBQyxDQUFDLENBQUM7UUFDbEQsR0FBRyxHQUFHLEVBQUUsR0FBRyxDQUFDLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxDQUFDO1FBQ3RCLEdBQUcsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUMsQ0FBQztRQUN0QixHQUFHLEdBQUcsRUFBRSxHQUFHLENBQUMsQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDLENBQUM7UUFDdEIsR0FBRyxHQUFHLEVBQUUsR0FBRyxDQUFDLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxDQUFDO1FBRXRCLEVBQUUsR0FBRyxHQUFHLENBQUMsR0FBRyxHQUFHLEVBQUUsRUFBRSxHQUFHLENBQUMsQ0FBQztRQUN4QixFQUFFLEdBQUcsR0FBRyxDQUFDLEdBQUcsR0FBRyxFQUFFLEVBQUUsR0FBRyxDQUFDLENBQUM7UUFDeEIsRUFBRSxHQUFHLEdBQUcsQ0FBQyxHQUFHLEdBQUcsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBQ3ZCLEVBQUUsR0FBRyxHQUFHLENBQUMsR0FBRyxHQUFHLEVBQUUsRUFBRSxHQUFHLENBQUMsQ0FBQztRQUN4QixFQUFFLEdBQUcsR0FBRyxDQUFDLEdBQUcsR0FBRyxFQUFFLEVBQUUsR0FBRyxDQUFDLENBQUM7UUFDeEIsR0FBRyxHQUFHLEVBQUUsR0FBRyxDQUFDLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxDQUFDO1FBQ3RCLEdBQUcsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUMsQ0FBQztRQUN0QixHQUFHLEdBQUcsRUFBRSxHQUFHLENBQUMsQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDLENBQUM7UUFDdEIsR0FBRyxHQUFHLEVBQUUsR0FBRyxDQUFDLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxDQUFDO1FBQ3RCLEdBQUcsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUMsQ0FBQztRQUV0QixFQUFFLEdBQUcsR0FBRyxDQUFDLEdBQUcsR0FBRyxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFDdkIsRUFBRSxHQUFHLEdBQUcsQ0FBQyxHQUFHLEdBQUcsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBQ3ZCLEVBQUUsR0FBRyxHQUFHLENBQUMsR0FBRyxHQUFHLEVBQUUsRUFBRSxHQUFHLENBQUMsQ0FBQztRQUN4QixFQUFFLEdBQUcsR0FBRyxDQUFDLEdBQUcsR0FBRyxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFDdkIsRUFBRSxHQUFHLEdBQUcsQ0FBQyxHQUFHLEdBQUcsRUFBRSxFQUFFLEdBQUcsQ0FBQyxDQUFDO1FBQ3hCLEdBQUcsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUMsQ0FBQztRQUN0QixHQUFHLEdBQUcsRUFBRSxHQUFHLENBQUMsQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDLENBQUM7UUFDdEIsR0FBRyxHQUFHLEVBQUUsR0FBRyxDQUFDLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxDQUFDO1FBQ3RCLEdBQUcsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUMsQ0FBQztRQUN0QixHQUFHLEdBQUcsRUFBRSxHQUFHLENBQUMsQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDLENBQUM7UUFFdEIsRUFBRSxHQUFHLEdBQUcsQ0FBQyxHQUFHLEdBQUcsRUFBRSxFQUFFLEdBQUcsQ0FBQyxDQUFDO1FBQ3hCLEVBQUUsR0FBRyxHQUFHLENBQUMsR0FBRyxHQUFHLEVBQUUsRUFBRSxHQUFHLENBQUMsQ0FBQztRQUN4QixFQUFFLEdBQUcsR0FBRyxDQUFDLEdBQUcsR0FBRyxFQUFFLEVBQUUsR0FBRyxDQUFDLENBQUM7UUFDeEIsRUFBRSxHQUFHLEdBQUcsQ0FBQyxHQUFHLEdBQUcsRUFBRSxFQUFFLEdBQUcsQ0FBQyxDQUFDO1FBQ3hCLEVBQUUsR0FBRyxHQUFHLENBQUMsR0FBRyxHQUFHLEVBQUUsRUFBRSxHQUFHLENBQUMsQ0FBQztRQUN4QixHQUFHLEdBQUcsRUFBRSxHQUFHLENBQUMsQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDLENBQUM7UUFDdEIsR0FBRyxHQUFHLEVBQUUsR0FBRyxDQUFDLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxDQUFDO1FBQ3RCLEdBQUcsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUMsQ0FBQztRQUN0QixHQUFHLEdBQUcsRUFBRSxHQUFHLENBQUMsQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDLENBQUM7UUFDdEIsR0FBRyxHQUFHLEVBQUUsR0FBRyxDQUFDLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxDQUFDO1FBRXRCLEVBQUUsR0FBRyxHQUFHLENBQUMsR0FBRyxHQUFHLEVBQUUsRUFBRSxHQUFHLENBQUMsQ0FBQztRQUN4QixFQUFFLEdBQUcsR0FBRyxDQUFDLEdBQUcsR0FBRyxFQUFFLEVBQUUsR0FBRyxDQUFDLENBQUM7UUFDeEIsRUFBRSxHQUFHLEdBQUcsQ0FBQyxHQUFHLEdBQUcsRUFBRSxFQUFFLEdBQUcsQ0FBQyxDQUFDO1FBQ3hCLEVBQUUsR0FBRyxHQUFHLENBQUMsR0FBRyxHQUFHLEVBQUUsRUFBRSxHQUFHLENBQUMsQ0FBQztRQUN4QixFQUFFLEdBQUcsR0FBRyxDQUFDLEdBQUcsR0FBRyxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFDdkIsR0FBRyxHQUFHLEVBQUUsR0FBRyxDQUFDLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxDQUFDO1FBQ3RCLEdBQUcsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUMsQ0FBQztRQUN0QixHQUFHLEdBQUcsRUFBRSxHQUFHLENBQUMsQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDLENBQUM7UUFDdEIsR0FBRyxHQUFHLEVBQUUsR0FBRyxDQUFDLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxDQUFDO1FBQ3RCLEdBQUcsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUMsQ0FBQztJQUN4QixDQUFDO0lBRUQsS0FBSyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQztJQUNmLEtBQUssQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUM7SUFDZixLQUFLLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDO0lBQ2YsS0FBSyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQztJQUNmLEtBQUssQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUM7SUFDZixLQUFLLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDO0lBQ2YsS0FBSyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQztJQUNmLEtBQUssQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUM7SUFDZixLQUFLLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDO0lBQ2YsS0FBSyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQztJQUNmLEtBQUssQ0FBQyxFQUFFLENBQUMsR0FBRyxHQUFHLENBQUM7SUFDaEIsS0FBSyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEdBQUcsQ0FBQztJQUNoQixLQUFLLENBQUMsRUFBRSxDQUFDLEdBQUcsR0FBRyxDQUFDO0lBQ2hCLEtBQUssQ0FBQyxFQUFFLENBQUMsR0FBRyxHQUFHLENBQUM7SUFDaEIsS0FBSyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEdBQUcsQ0FBQztJQUNoQixLQUFLLENBQUMsRUFBRSxDQUFDLEdBQUcsR0FBRyxDQUFDO0lBQ2hCLEtBQUssQ0FBQyxFQUFFLENBQUMsR0FBRyxHQUFHLENBQUM7SUFDaEIsS0FBSyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEdBQUcsQ0FBQztJQUNoQixLQUFLLENBQUMsRUFBRSxDQUFDLEdBQUcsR0FBRyxDQUFDO0lBQ2hCLEtBQUssQ0FBQyxFQUFFLENBQUMsR0FBRyxHQUFHLENBQUM7SUFDaEIsS0FBSyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEdBQUcsQ0FBQztJQUNoQixLQUFLLENBQUMsRUFBRSxDQUFDLEdBQUcsR0FBRyxDQUFDO0lBQ2hCLEtBQUssQ0FBQyxFQUFFLENBQUMsR0FBRyxHQUFHLENBQUM7SUFDaEIsS0FBSyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEdBQUcsQ0FBQztJQUNoQixLQUFLLENBQUMsRUFBRSxDQUFDLEdBQUcsR0FBRyxDQUFDO0lBRWhCLE9BQU8sS0FBSyxDQUFDO0FBQ2YsQ0FBQztBQUVELFNBQVMsR0FBRyxDQUFDLENBQVMsRUFBRSxDQUFTO0lBQy9CLE9BQU8sTUFBTSxDQUFDLE9BQU8sQ0FBQyxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDdkQsQ0FBQztBQUVELE1BQU0sY0FBYyxHQUFhO0lBQy9CLG1CQUFtQjtJQUNuQixtQkFBbUI7SUFDbkIsbUJBQW1CO0lBQ25CLG1CQUFtQjtJQUNuQixtQkFBbUI7SUFDbkIsbUJBQW1CO0lBQ25CLG1CQUFtQjtJQUNuQixtQkFBbUI7SUFDbkIsbUJBQW1CO0lBQ25CLG1CQUFtQjtJQUNuQixtQkFBbUI7SUFDbkIsbUJBQW1CO0lBQ25CLG1CQUFtQjtJQUNuQixtQkFBbUI7SUFDbkIsbUJBQW1CO0lBQ25CLG1CQUFtQjtJQUNuQixtQkFBbUI7SUFDbkIsbUJBQW1CO0lBQ25CLG1CQUFtQjtJQUNuQixtQkFBbUI7SUFDbkIsbUJBQW1CO0lBQ25CLG1CQUFtQjtJQUNuQixtQkFBbUI7SUFDbkIsbUJBQW1CO0NBQ3BCLENBQUMifQ==
|
|
@@ -16,4 +16,9 @@ export declare const randomInt: (max: number) => number;
|
|
|
16
16
|
* TODO(#3949): This is insecure as it's modulo biased. Nuke or safeguard before mainnet.
|
|
17
17
|
*/
|
|
18
18
|
export declare const randomBigInt: (max: bigint) => bigint;
|
|
19
|
+
/**
|
|
20
|
+
* Generate a random boolean value.
|
|
21
|
+
* @returns A random boolean value.
|
|
22
|
+
*/
|
|
23
|
+
export declare const randomBoolean: () => boolean;
|
|
19
24
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/crypto/random/index.ts"],"names":[],"mappings":";AAmBA,eAAO,MAAM,WAAW,QAAS,MAAM,WA8BtC,CAAC;AAEF;;;;;;GAMG;AACH,eAAO,MAAM,SAAS,QAAS,MAAM,WAIpC,CAAC;AAEF;;;;;;GAMG;AACH,eAAO,MAAM,YAAY,QAAS,MAAM,WAIvC,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/crypto/random/index.ts"],"names":[],"mappings":";AAmBA,eAAO,MAAM,WAAW,QAAS,MAAM,WA8BtC,CAAC;AAEF;;;;;;GAMG;AACH,eAAO,MAAM,SAAS,QAAS,MAAM,WAIpC,CAAC;AAEF;;;;;;GAMG;AACH,eAAO,MAAM,YAAY,QAAS,MAAM,WAIvC,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,aAAa,eAGzB,CAAC"}
|
|
@@ -64,4 +64,12 @@ export const randomBigInt = (max) => {
|
|
|
64
64
|
const randomBigInt = BigInt(`0x${randomBuffer.toString('hex')}`); // Convert buffer to a large integer.
|
|
65
65
|
return randomBigInt % max; // Use modulo to ensure the result is less than max.
|
|
66
66
|
};
|
|
67
|
-
|
|
67
|
+
/**
|
|
68
|
+
* Generate a random boolean value.
|
|
69
|
+
* @returns A random boolean value.
|
|
70
|
+
*/
|
|
71
|
+
export const randomBoolean = () => {
|
|
72
|
+
const randomByte = randomBytes(1)[0]; // Generate a single random byte.
|
|
73
|
+
return randomByte % 2 === 0; // Use modulo to determine if the byte is even or odd.
|
|
74
|
+
};
|
|
75
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvY3J5cHRvL3JhbmRvbS9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLFVBQVUsTUFBTSxRQUFRLENBQUM7QUFDaEMsT0FBTyxNQUFNLE1BQU0sYUFBYSxDQUFDO0FBRWpDLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBRWhFLG9DQUFvQztBQUNwQywwRUFBMEU7QUFDMUUsTUFBTSxTQUFTLEdBQUcsS0FBSyxDQUFDO0FBRXhCLE1BQU0sWUFBWSxHQUFHLEdBQUcsRUFBRTtJQUN4QixJQUFJLE9BQU8sTUFBTSxLQUFLLFdBQVcsSUFBSSxNQUFNLENBQUMsTUFBTSxFQUFFLENBQUM7UUFDbkQsT0FBTyxNQUFNLENBQUMsTUFBTSxDQUFDO0lBQ3ZCLENBQUM7SUFDRCxJQUFJLE9BQU8sSUFBSSxLQUFLLFdBQVcsSUFBSSxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7UUFDL0MsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDO0lBQ3JCLENBQUM7SUFDRCxPQUFPLFNBQVMsQ0FBQztBQUNuQixDQUFDLENBQUM7QUFFRixNQUFNLENBQUMsTUFBTSxXQUFXLEdBQUcsQ0FBQyxHQUFXLEVBQUUsRUFBRTtJQUN6QyxNQUFNLFNBQVMsR0FBRyxtQkFBbUIsQ0FBQyxXQUFXLEVBQUUsQ0FBQztJQUVwRCxJQUFJLFNBQVMsQ0FBQyxlQUFlLEVBQUUsRUFBRSxDQUFDO1FBQ2hDLE9BQU8sU0FBUyxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUNqQyxDQUFDO0lBRUQsSUFBSSxNQUFNLEVBQUUsQ0FBQztRQUNYLE9BQU8sVUFBVSxDQUFDLFdBQVcsQ0FBQyxHQUFHLENBQVcsQ0FBQztJQUMvQyxDQUFDO0lBRUQsTUFBTSxNQUFNLEdBQUcsWUFBWSxFQUFFLENBQUM7SUFDOUIsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO1FBQ1osTUFBTSxJQUFJLEtBQUssQ0FBQyxvQ0FBb0MsQ0FBQyxDQUFDO0lBQ3hELENBQUM7SUFFRCxNQUFNLEdBQUcsR0FBRyxNQUFNLENBQUMsV0FBVyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQ3BDLElBQUksR0FBRyxHQUFHLFNBQVMsRUFBRSxDQUFDO1FBQ3BCLCtDQUErQztRQUMvQyxvR0FBb0c7UUFDcEcsS0FBSyxJQUFJLFNBQVMsR0FBRyxDQUFDLEVBQUUsU0FBUyxHQUFHLEdBQUcsRUFBRSxTQUFTLElBQUksU0FBUyxFQUFFLENBQUM7WUFDaEUsa0VBQWtFO1lBQ2xFLHNDQUFzQztZQUN0QyxNQUFNLENBQUMsZUFBZSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsU0FBUyxFQUFFLFNBQVMsR0FBRyxTQUFTLENBQUMsQ0FBQyxDQUFDO1FBQ3RFLENBQUM7SUFDSCxDQUFDO1NBQU0sQ0FBQztRQUNOLE1BQU0sQ0FBQyxlQUFlLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDOUIsQ0FBQztJQUVELE9BQU8sR0FBRyxDQUFDO0FBQ2IsQ0FBQyxDQUFDO0FBRUY7Ozs7OztHQU1HO0FBQ0gsTUFBTSxDQUFDLE1BQU0sU0FBUyxHQUFHLENBQUMsR0FBVyxFQUFFLEVBQUU7SUFDdkMsTUFBTSxZQUFZLEdBQUcsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsdUNBQXVDO0lBQzVFLE1BQU0sU0FBUyxHQUFHLFFBQVEsQ0FBQyxZQUFZLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMscUNBQXFDO0lBQ25HLE9BQU8sU0FBUyxHQUFHLEdBQUcsQ0FBQyxDQUFDLG9EQUFvRDtBQUM5RSxDQUFDLENBQUM7QUFFRjs7Ozs7O0dBTUc7QUFDSCxNQUFNLENBQUMsTUFBTSxZQUFZLEdBQUcsQ0FBQyxHQUFXLEVBQUUsRUFBRTtJQUMxQyxNQUFNLFlBQVksR0FBRyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyx1Q0FBdUM7SUFDNUUsTUFBTSxZQUFZLEdBQUcsTUFBTSxDQUFDLEtBQUssWUFBWSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxxQ0FBcUM7SUFDdkcsT0FBTyxZQUFZLEdBQUcsR0FBRyxDQUFDLENBQUMsb0RBQW9EO0FBQ2pGLENBQUMsQ0FBQztBQUVGOzs7R0FHRztBQUNILE1BQU0sQ0FBQyxNQUFNLGFBQWEsR0FBRyxHQUFHLEVBQUU7SUFDaEMsTUFBTSxVQUFVLEdBQUcsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsaUNBQWlDO0lBQ3ZFLE9BQU8sVUFBVSxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxzREFBc0Q7QUFDckYsQ0FBQyxDQUFDIn0=
|
package/dest/fields/fields.d.ts
CHANGED
|
@@ -69,6 +69,7 @@ export declare class Fr extends BaseField {
|
|
|
69
69
|
static ZERO: Fr;
|
|
70
70
|
static ONE: Fr;
|
|
71
71
|
static MODULUS: bigint;
|
|
72
|
+
static MAX_FIELD_VALUE: Fr;
|
|
72
73
|
constructor(value: number | bigint | boolean | Fr | Buffer);
|
|
73
74
|
[inspect.custom](): string;
|
|
74
75
|
protected modulus(): bigint;
|
|
@@ -91,6 +92,11 @@ export declare class Fr extends BaseField {
|
|
|
91
92
|
mul(rhs: Fr): Fr;
|
|
92
93
|
div(rhs: Fr): Fr;
|
|
93
94
|
ediv(rhs: Fr): Fr;
|
|
95
|
+
/**
|
|
96
|
+
* Computes a square root of the field element.
|
|
97
|
+
* @returns A square root of the field element (null if it does not exist).
|
|
98
|
+
*/
|
|
99
|
+
sqrt(): Fr | null;
|
|
94
100
|
toJSON(): {
|
|
95
101
|
type: string;
|
|
96
102
|
value: `0x${string}`;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fields.d.ts","sourceRoot":"","sources":["../../src/fields/fields.ts"],"names":[],"mappings":";;
|
|
1
|
+
{"version":3,"file":"fields.d.ts","sourceRoot":"","sources":["../../src/fields/fields.ts"],"names":[],"mappings":"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"}
|
package/dest/fields/fields.js
CHANGED
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
var _a;
|
|
2
|
+
import { BarretenbergSync } from '@aztec/bb.js';
|
|
1
3
|
import { inspect } from 'util';
|
|
2
4
|
import { toBigIntBE, toBufferBE } from '../bigint-buffer/index.js';
|
|
3
5
|
import { randomBytes } from '../crypto/random/index.js';
|
|
@@ -153,22 +155,22 @@ export class Fr extends BaseField {
|
|
|
153
155
|
return `Fr<${this.toString()}>`;
|
|
154
156
|
}
|
|
155
157
|
modulus() {
|
|
156
|
-
return
|
|
158
|
+
return _a.MODULUS;
|
|
157
159
|
}
|
|
158
160
|
static random() {
|
|
159
|
-
return random(
|
|
161
|
+
return random(_a);
|
|
160
162
|
}
|
|
161
163
|
static zero() {
|
|
162
|
-
return
|
|
164
|
+
return _a.ZERO;
|
|
163
165
|
}
|
|
164
166
|
static isZero(value) {
|
|
165
167
|
return value.isZero();
|
|
166
168
|
}
|
|
167
169
|
static fromBuffer(buffer) {
|
|
168
|
-
return fromBuffer(buffer,
|
|
170
|
+
return fromBuffer(buffer, _a);
|
|
169
171
|
}
|
|
170
172
|
static fromBufferReduce(buffer) {
|
|
171
|
-
return fromBufferReduce(buffer,
|
|
173
|
+
return fromBufferReduce(buffer, _a);
|
|
172
174
|
}
|
|
173
175
|
/**
|
|
174
176
|
* Creates a Fr instance from a hex string.
|
|
@@ -176,24 +178,24 @@ export class Fr extends BaseField {
|
|
|
176
178
|
* @returns the Fr instance
|
|
177
179
|
*/
|
|
178
180
|
static fromString(buf) {
|
|
179
|
-
return fromHexString(buf,
|
|
181
|
+
return fromHexString(buf, _a);
|
|
180
182
|
}
|
|
181
183
|
/** Arithmetic */
|
|
182
184
|
add(rhs) {
|
|
183
|
-
return new
|
|
185
|
+
return new _a((this.toBigInt() + rhs.toBigInt()) % _a.MODULUS);
|
|
184
186
|
}
|
|
185
187
|
square() {
|
|
186
|
-
return new
|
|
188
|
+
return new _a((this.toBigInt() * this.toBigInt()) % _a.MODULUS);
|
|
187
189
|
}
|
|
188
190
|
negate() {
|
|
189
|
-
return new
|
|
191
|
+
return new _a(_a.MODULUS - this.toBigInt());
|
|
190
192
|
}
|
|
191
193
|
sub(rhs) {
|
|
192
194
|
const result = this.toBigInt() - rhs.toBigInt();
|
|
193
|
-
return new
|
|
195
|
+
return new _a(result < 0 ? result + _a.MODULUS : result);
|
|
194
196
|
}
|
|
195
197
|
mul(rhs) {
|
|
196
|
-
return new
|
|
198
|
+
return new _a((this.toBigInt() * rhs.toBigInt()) % _a.MODULUS);
|
|
197
199
|
}
|
|
198
200
|
div(rhs) {
|
|
199
201
|
if (rhs.isZero()) {
|
|
@@ -207,7 +209,24 @@ export class Fr extends BaseField {
|
|
|
207
209
|
if (rhs.isZero()) {
|
|
208
210
|
throw new Error('Division by zero');
|
|
209
211
|
}
|
|
210
|
-
return new
|
|
212
|
+
return new _a(this.toBigInt() / rhs.toBigInt());
|
|
213
|
+
}
|
|
214
|
+
/**
|
|
215
|
+
* Computes a square root of the field element.
|
|
216
|
+
* @returns A square root of the field element (null if it does not exist).
|
|
217
|
+
*/
|
|
218
|
+
sqrt() {
|
|
219
|
+
const wasm = BarretenbergSync.getSingleton().getWasm();
|
|
220
|
+
wasm.writeMemory(0, this.toBuffer());
|
|
221
|
+
wasm.call('bn254_fr_sqrt', 0, _a.SIZE_IN_BYTES);
|
|
222
|
+
const isSqrtBuf = Buffer.from(wasm.getMemorySlice(_a.SIZE_IN_BYTES, _a.SIZE_IN_BYTES + 1));
|
|
223
|
+
const isSqrt = isSqrtBuf[0] === 1;
|
|
224
|
+
if (!isSqrt) {
|
|
225
|
+
// Field element is not a quadratic residue mod p so it has no square root.
|
|
226
|
+
return null;
|
|
227
|
+
}
|
|
228
|
+
const rootBuf = Buffer.from(wasm.getMemorySlice(_a.SIZE_IN_BYTES + 1, _a.SIZE_IN_BYTES * 2 + 1));
|
|
229
|
+
return _a.fromBuffer(rootBuf);
|
|
211
230
|
}
|
|
212
231
|
toJSON() {
|
|
213
232
|
return {
|
|
@@ -216,9 +235,11 @@ export class Fr extends BaseField {
|
|
|
216
235
|
};
|
|
217
236
|
}
|
|
218
237
|
}
|
|
219
|
-
|
|
220
|
-
Fr.
|
|
238
|
+
_a = Fr;
|
|
239
|
+
Fr.ZERO = new _a(0n);
|
|
240
|
+
Fr.ONE = new _a(1n);
|
|
221
241
|
Fr.MODULUS = 0x30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001n;
|
|
242
|
+
Fr.MAX_FIELD_VALUE = new _a(_a.MODULUS - 1n);
|
|
222
243
|
// For deserializing JSON.
|
|
223
244
|
TypeRegistry.register('Fr', Fr);
|
|
224
245
|
/**
|
|
@@ -326,4 +347,4 @@ if (process.env.NODE_ENV === 'test') {
|
|
|
326
347
|
// `addEqualityTesters` doesn't seem to be in the types yet.
|
|
327
348
|
expect.addEqualityTesters([areFieldsEqual]);
|
|
328
349
|
}
|
|
329
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmllbGRzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2ZpZWxkcy9maWVsZHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUUvQixPQUFPLEVBQUUsVUFBVSxFQUFFLFVBQVUsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBQ25FLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUN4RCxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sK0JBQStCLENBQUM7QUFDN0QsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLCtCQUErQixDQUFDO0FBRTdELE1BQU0sV0FBVyxHQUFHLE1BQU0sQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUM7QUFlckM7Ozs7O0dBS0c7QUFDSCxNQUFlLFNBQVM7SUFLdEI7OztTQUdLO0lBQ0wsSUFBSSxLQUFLO1FBQ1AsT0FBTyxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7SUFDekIsQ0FBQztJQUVELGlDQUFpQztJQUNqQyxJQUFJLElBQUk7UUFDTixPQUFPLFNBQVMsQ0FBQyxhQUFhLENBQUM7SUFDakMsQ0FBQztJQUVELFlBQXNCLEtBQXFEO1FBQ3pFLElBQUksS0FBSyxZQUFZLE1BQU0sRUFBRSxDQUFDO1lBQzVCLElBQUksS0FBSyxDQUFDLE1BQU0sR0FBRyxTQUFTLENBQUMsYUFBYSxFQUFFLENBQUM7Z0JBQzNDLE1BQU0sSUFBSSxLQUFLLENBQUMsZ0JBQWdCLEtBQUssQ0FBQyxNQUFNLFlBQVksU0FBUyxDQUFDLGFBQWEsRUFBRSxDQUFDLENBQUM7WUFDckYsQ0FBQztZQUNELElBQUksQ0FBQyxRQUFRO2dCQUNYLEtBQUssQ0FBQyxNQUFNLEtBQUssU0FBUyxDQUFDLGFBQWE7b0JBQ3RDLENBQUMsQ0FBQyxLQUFLO29CQUNQLENBQUMsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsTUFBTSxDQUFD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
|
|
350
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmllbGRzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2ZpZWxkcy9maWVsZHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLGNBQWMsQ0FBQztBQUVoRCxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBRS9CLE9BQU8sRUFBRSxVQUFVLEVBQUUsVUFBVSxFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFDbkUsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBQ3hELE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSwrQkFBK0IsQ0FBQztBQUM3RCxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sK0JBQStCLENBQUM7QUFFN0QsTUFBTSxXQUFXLEdBQUcsTUFBTSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQztBQWVyQzs7Ozs7R0FLRztBQUNILE1BQWUsU0FBUztJQUt0Qjs7O1NBR0s7SUFDTCxJQUFJLEtBQUs7UUFDUCxPQUFPLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztJQUN6QixDQUFDO0lBRUQsaUNBQWlDO0lBQ2pDLElBQUksSUFBSTtRQUNOLE9BQU8sU0FBUyxDQUFDLGFBQWEsQ0FBQztJQUNqQyxDQUFDO0lBRUQsWUFBc0IsS0FBcUQ7UUFDekUsSUFBSSxLQUFLLFlBQVksTUFBTSxFQUFFLENBQUM7WUFDNUIsSUFBSSxLQUFLLENBQUMsTUFBTSxHQUFHLFNBQVMsQ0FBQyxhQUFhLEVBQUUsQ0FBQztnQkFDM0MsTUFBTSxJQUFJLEtBQUssQ0FBQyxnQkFBZ0IsS0FBSyxDQUFDLE1BQU0sWUFBWSxTQUFTLENBQUMsYUFBYSxFQUFFLENBQUMsQ0FBQztZQUNyRixDQUFDO1lBQ0QsSUFBSSxDQUFDLFFBQVE7Z0JBQ1gsS0FBSyxDQUFDLE1BQU0sS0FBSyxTQUFTLENBQUMsYUFBYTtvQkFDdEMsQ0FBQyxDQUFDLEtBQUs7b0JBQ1As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
|
package/dest/fields/point.d.ts
CHANGED
|
@@ -21,6 +21,7 @@ export declare class Point {
|
|
|
21
21
|
readonly isInfinite: boolean;
|
|
22
22
|
static ZERO: Point;
|
|
23
23
|
static SIZE_IN_BYTES: number;
|
|
24
|
+
static COMPRESSED_SIZE_IN_BYTES: number;
|
|
24
25
|
/** Used to differentiate this class from AztecAddress */
|
|
25
26
|
readonly kind = "point";
|
|
26
27
|
constructor(
|
|
@@ -50,6 +51,14 @@ export declare class Point {
|
|
|
50
51
|
* @returns A Point instance.
|
|
51
52
|
*/
|
|
52
53
|
static fromBuffer(buffer: Buffer | BufferReader): Point;
|
|
54
|
+
/**
|
|
55
|
+
* Create a Point instance from a compressed buffer.
|
|
56
|
+
* The input 'buffer' should have exactly 33 bytes representing the x coordinate and the sign of the y coordinate.
|
|
57
|
+
*
|
|
58
|
+
* @param buffer - The buffer containing the x coordinate and the sign of the y coordinate.
|
|
59
|
+
* @returns A Point instance.
|
|
60
|
+
*/
|
|
61
|
+
static fromCompressedBuffer(buffer: Buffer | BufferReader): Point;
|
|
53
62
|
/**
|
|
54
63
|
* Create a Point instance from a hex-encoded string.
|
|
55
64
|
* The input 'address' should be prefixed with '0x' or not, and have exactly 128 hex characters representing the x and y coordinates.
|
|
@@ -65,6 +74,22 @@ export declare class Point {
|
|
|
65
74
|
*/
|
|
66
75
|
toFields(): Fr[];
|
|
67
76
|
static fromFields(fields: Fr[] | FieldReader): Point;
|
|
77
|
+
/**
|
|
78
|
+
* Uses the x coordinate and isPositive flag (+/-) to reconstruct the point.
|
|
79
|
+
* @dev The y coordinate can be derived from the x coordinate and the "sign" flag by solving the grumpkin curve
|
|
80
|
+
* equation for y.
|
|
81
|
+
* @param x - The x coordinate of the point
|
|
82
|
+
* @param sign - The "sign" of the y coordinate - note that this is not a sign as is known in integer arithmetic.
|
|
83
|
+
* Instead it is a boolean flag that determines whether the y coordinate is <= (Fr.MODULUS - 1) / 2
|
|
84
|
+
* @returns The point as an array of 2 fields
|
|
85
|
+
*/
|
|
86
|
+
static fromXAndSign(x: Fr, sign: boolean): Point;
|
|
87
|
+
/**
|
|
88
|
+
* Returns the x coordinate and the sign of the y coordinate.
|
|
89
|
+
* @dev The y sign can be determined by checking if the y coordinate is greater than half of the modulus.
|
|
90
|
+
* @returns The x coordinate and the sign of the y coordinate.
|
|
91
|
+
*/
|
|
92
|
+
toXAndSign(): [Fr, boolean];
|
|
68
93
|
/**
|
|
69
94
|
* Returns the contents of the point as BigInts.
|
|
70
95
|
* @returns The point as BigInts
|
|
@@ -85,6 +110,11 @@ export declare class Point {
|
|
|
85
110
|
* is not considered a valid public key and the extra byte would raise DA cost.
|
|
86
111
|
*/
|
|
87
112
|
toBuffer(): Buffer;
|
|
113
|
+
/**
|
|
114
|
+
* Converts the Point instance to a compressed Buffer representation of the coordinates.
|
|
115
|
+
* @returns A Buffer representation of the Point instance
|
|
116
|
+
*/
|
|
117
|
+
toCompressedBuffer(): Buffer;
|
|
88
118
|
/**
|
|
89
119
|
* Convert the Point instance to a hexadecimal string representation.
|
|
90
120
|
* The output string is prefixed with '0x' and consists of exactly 128 hex characters,
|
|
@@ -130,4 +160,7 @@ export declare class Point {
|
|
|
130
160
|
* @returns Whether it looks like a point.
|
|
131
161
|
*/
|
|
132
162
|
export declare function isPoint(obj: object): obj is Point;
|
|
163
|
+
export declare class NotOnCurveError extends Error {
|
|
164
|
+
constructor(x: Fr);
|
|
165
|
+
}
|
|
133
166
|
//# sourceMappingURL=point.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"point.d.ts","sourceRoot":"","sources":["../../src/fields/point.ts"],"names":[],"mappings":";
|
|
1
|
+
{"version":3,"file":"point.d.ts","sourceRoot":"","sources":["../../src/fields/point.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,YAAY,EAAE,WAAW,EAAqB,MAAM,uBAAuB,CAAC;AACrF,OAAO,EAAE,EAAE,EAAE,MAAM,aAAa,CAAC;AAEjC;;;;GAIG;AACH,qBAAa,KAAK;IASd;;OAEG;aACa,CAAC,EAAE,EAAE;IACrB;;OAEG;aACa,CAAC,EAAE,EAAE;IACrB;;OAEG;aACa,UAAU,EAAE,OAAO;IAnBrC,MAAM,CAAC,IAAI,QAAsC;IACjD,MAAM,CAAC,aAAa,SAAwB;IAC5C,MAAM,CAAC,wBAAwB,SAAoB;IAEnD,yDAAyD;IACzD,SAAgB,IAAI,WAAW;;IAG7B;;OAEG;IACa,CAAC,EAAE,EAAE;IACrB;;OAEG;IACa,CAAC,EAAE,EAAE;IACrB;;OAEG;IACa,UAAU,EAAE,OAAO;IAKrC;;;;OAIG;IACH,MAAM,CAAC,MAAM;IAcb;;;;;;OAMG;IACH,MAAM,CAAC,UAAU,CAAC,MAAM,EAAE,MAAM,GAAG,YAAY;IAK/C;;;;;;OAMG;IACH,MAAM,CAAC,oBAAoB,CAAC,MAAM,EAAE,MAAM,GAAG,YAAY;IAUzD;;;;;;;OAOG;IACH,MAAM,CAAC,UAAU,CAAC,OAAO,EAAE,MAAM;IAIjC;;;OAGG;IACH,QAAQ;IAIR,MAAM,CAAC,UAAU,CAAC,MAAM,EAAE,EAAE,EAAE,GAAG,WAAW;IAK5C;;;;;;;;OAQG;IACH,MAAM,CAAC,YAAY,CAAC,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,OAAO;IAsBxC;;;;OAIG;IACH,UAAU,IAAI,CAAC,EAAE,EAAE,OAAO,CAAC;IAI3B;;;OAGG;IACH,SAAS;;;;;IAQT;;;;;;;;;OASG;IACH,QAAQ;IAWR;;;OAGG;IACH,kBAAkB;IAalB;;;;;;OAMG;IACH,QAAQ;IAIR;;;;;;;OAOG;IACH,aAAa;IAKb,YAAY;;;;;IAMZ;;;;;;OAMG;IACH,MAAM,CAAC,GAAG,EAAE,KAAK;IAIjB,MAAM;IAIN,IAAI;IAIJ;;;OAGG;IACH,IAAW,GAAG,YAEb;IAED,YAAY;CAYb;AAED;;;;GAIG;AACH,wBAAgB,OAAO,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,IAAI,KAAK,CAMjD;AAED,qBAAa,eAAgB,SAAQ,KAAK;gBAC5B,CAAC,EAAE,EAAE;CAIlB"}
|
package/dest/fields/point.js
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { toBigIntBE } from '../bigint-buffer/index.js';
|
|
2
|
+
import { poseidon2Hash, randomBoolean } from '../crypto/index.js';
|
|
2
3
|
import { BufferReader, FieldReader, serializeToBuffer } from '../serialize/index.js';
|
|
3
4
|
import { Fr } from './fields.js';
|
|
4
5
|
/**
|
|
@@ -33,8 +34,18 @@ export class Point {
|
|
|
33
34
|
* @returns A randomly generated Point instance.
|
|
34
35
|
*/
|
|
35
36
|
static random() {
|
|
36
|
-
|
|
37
|
-
|
|
37
|
+
while (true) {
|
|
38
|
+
try {
|
|
39
|
+
return Point.fromXAndSign(Fr.random(), randomBoolean());
|
|
40
|
+
}
|
|
41
|
+
catch (e) {
|
|
42
|
+
if (!(e instanceof NotOnCurveError)) {
|
|
43
|
+
throw e;
|
|
44
|
+
}
|
|
45
|
+
// The random point is not on the curve - we try again
|
|
46
|
+
continue;
|
|
47
|
+
}
|
|
48
|
+
}
|
|
38
49
|
}
|
|
39
50
|
/**
|
|
40
51
|
* Create a Point instance from a given buffer or BufferReader.
|
|
@@ -47,6 +58,20 @@ export class Point {
|
|
|
47
58
|
const reader = BufferReader.asReader(buffer);
|
|
48
59
|
return new this(Fr.fromBuffer(reader), Fr.fromBuffer(reader), false);
|
|
49
60
|
}
|
|
61
|
+
/**
|
|
62
|
+
* Create a Point instance from a compressed buffer.
|
|
63
|
+
* The input 'buffer' should have exactly 33 bytes representing the x coordinate and the sign of the y coordinate.
|
|
64
|
+
*
|
|
65
|
+
* @param buffer - The buffer containing the x coordinate and the sign of the y coordinate.
|
|
66
|
+
* @returns A Point instance.
|
|
67
|
+
*/
|
|
68
|
+
static fromCompressedBuffer(buffer) {
|
|
69
|
+
const reader = BufferReader.asReader(buffer);
|
|
70
|
+
const value = toBigIntBE(reader.readBytes(Point.COMPRESSED_SIZE_IN_BYTES));
|
|
71
|
+
const x = new Fr(value & ((1n << 255n) - 1n));
|
|
72
|
+
const sign = (value & (1n << 255n)) !== 0n;
|
|
73
|
+
return this.fromXAndSign(x, sign);
|
|
74
|
+
}
|
|
50
75
|
/**
|
|
51
76
|
* Create a Point instance from a hex-encoded string.
|
|
52
77
|
* The input 'address' should be prefixed with '0x' or not, and have exactly 128 hex characters representing the x and y coordinates.
|
|
@@ -69,6 +94,39 @@ export class Point {
|
|
|
69
94
|
const reader = FieldReader.asReader(fields);
|
|
70
95
|
return new this(reader.readField(), reader.readField(), reader.readBoolean());
|
|
71
96
|
}
|
|
97
|
+
/**
|
|
98
|
+
* Uses the x coordinate and isPositive flag (+/-) to reconstruct the point.
|
|
99
|
+
* @dev The y coordinate can be derived from the x coordinate and the "sign" flag by solving the grumpkin curve
|
|
100
|
+
* equation for y.
|
|
101
|
+
* @param x - The x coordinate of the point
|
|
102
|
+
* @param sign - The "sign" of the y coordinate - note that this is not a sign as is known in integer arithmetic.
|
|
103
|
+
* Instead it is a boolean flag that determines whether the y coordinate is <= (Fr.MODULUS - 1) / 2
|
|
104
|
+
* @returns The point as an array of 2 fields
|
|
105
|
+
*/
|
|
106
|
+
static fromXAndSign(x, sign) {
|
|
107
|
+
// Calculate y^2 = x^3 - 17
|
|
108
|
+
const ySquared = x.square().mul(x).sub(new Fr(17));
|
|
109
|
+
// Calculate the square root of ySquared
|
|
110
|
+
const y = ySquared.sqrt();
|
|
111
|
+
// If y is null, the x-coordinate is not on the curve
|
|
112
|
+
if (y === null) {
|
|
113
|
+
throw new NotOnCurveError(x);
|
|
114
|
+
}
|
|
115
|
+
const yPositiveBigInt = y.toBigInt() <= (Fr.MODULUS - 1n) / 2n ? y.toBigInt() : Fr.MODULUS - y.toBigInt();
|
|
116
|
+
const yNegativeBigInt = Fr.MODULUS - yPositiveBigInt;
|
|
117
|
+
// Choose the positive or negative root based on isPositive
|
|
118
|
+
const finalY = sign ? new Fr(yPositiveBigInt) : new Fr(yNegativeBigInt);
|
|
119
|
+
// Create and return the new Point
|
|
120
|
+
return new this(x, finalY, false);
|
|
121
|
+
}
|
|
122
|
+
/**
|
|
123
|
+
* Returns the x coordinate and the sign of the y coordinate.
|
|
124
|
+
* @dev The y sign can be determined by checking if the y coordinate is greater than half of the modulus.
|
|
125
|
+
* @returns The x coordinate and the sign of the y coordinate.
|
|
126
|
+
*/
|
|
127
|
+
toXAndSign() {
|
|
128
|
+
return [this.x, this.y.toBigInt() <= (Fr.MODULUS - 1n) / 2n];
|
|
129
|
+
}
|
|
72
130
|
/**
|
|
73
131
|
* Returns the contents of the point as BigInts.
|
|
74
132
|
* @returns The point as BigInts
|
|
@@ -100,6 +158,22 @@ export class Point {
|
|
|
100
158
|
}
|
|
101
159
|
return buf;
|
|
102
160
|
}
|
|
161
|
+
/**
|
|
162
|
+
* Converts the Point instance to a compressed Buffer representation of the coordinates.
|
|
163
|
+
* @returns A Buffer representation of the Point instance
|
|
164
|
+
*/
|
|
165
|
+
toCompressedBuffer() {
|
|
166
|
+
const [x, sign] = this.toXAndSign();
|
|
167
|
+
// Here we leverage that Fr fits into 254 bits (log2(Fr.MODULUS) < 254) and given that we serialize Fr to 32 bytes
|
|
168
|
+
// and we use big-endian the 2 most significant bits are never populated. Hence we can use one of the bits as
|
|
169
|
+
// a sign bit.
|
|
170
|
+
const compressedValue = x.toBigInt() + (sign ? 2n ** 255n : 0n);
|
|
171
|
+
const buf = serializeToBuffer(compressedValue);
|
|
172
|
+
if (buf.length !== Point.COMPRESSED_SIZE_IN_BYTES) {
|
|
173
|
+
throw new Error(`Invalid buffer length for compressed Point: ${buf.length}`);
|
|
174
|
+
}
|
|
175
|
+
return buf;
|
|
176
|
+
}
|
|
103
177
|
/**
|
|
104
178
|
* Convert the Point instance to a hexadecimal string representation.
|
|
105
179
|
* The output string is prefixed with '0x' and consists of exactly 128 hex characters,
|
|
@@ -164,6 +238,7 @@ export class Point {
|
|
|
164
238
|
}
|
|
165
239
|
Point.ZERO = new Point(Fr.ZERO, Fr.ZERO, false);
|
|
166
240
|
Point.SIZE_IN_BYTES = Fr.SIZE_IN_BYTES * 2;
|
|
241
|
+
Point.COMPRESSED_SIZE_IN_BYTES = Fr.SIZE_IN_BYTES;
|
|
167
242
|
/**
|
|
168
243
|
* Does this object look like a point?
|
|
169
244
|
* @param obj - Object to test if it is a point.
|
|
@@ -176,4 +251,10 @@ export function isPoint(obj) {
|
|
|
176
251
|
const point = obj;
|
|
177
252
|
return point.kind === 'point' && point.x !== undefined && point.y !== undefined;
|
|
178
253
|
}
|
|
179
|
-
|
|
254
|
+
export class NotOnCurveError extends Error {
|
|
255
|
+
constructor(x) {
|
|
256
|
+
super('The given x-coordinate is not on the Grumpkin curve: ' + x.toString());
|
|
257
|
+
this.name = 'NotOnCurveError';
|
|
258
|
+
}
|
|
259
|
+
}
|
|
260
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicG9pbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvZmllbGRzL3BvaW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUN2RCxPQUFPLEVBQUUsYUFBYSxFQUFFLGFBQWEsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQ2xFLE9BQU8sRUFBRSxZQUFZLEVBQUUsV0FBVyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFDckYsT0FBTyxFQUFFLEVBQUUsRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUVqQzs7OztHQUlHO0FBQ0gsTUFBTSxPQUFPLEtBQUs7SUFRaEI7SUFDRTs7T0FFRztJQUNhLENBQUs7SUFDckI7O09BRUc7SUFDYSxDQUFLO0lBQ3JCOztPQUVHO0lBQ2EsVUFBbUI7UUFSbkIsTUFBQyxHQUFELENBQUMsQ0FBSTtRQUlMLE1BQUMsR0FBRCxDQUFDLENBQUk7UUFJTCxlQUFVLEdBQVYsVUFBVSxDQUFTO1FBZnJDLHlEQUF5RDtRQUN6QyxTQUFJLEdBQUcsT0FBTyxDQUFDO1FBZ0I3QixpQ0FBaUM7SUFDbkMsQ0FBQztJQUVEOzs7O09BSUc7SUFDSCxNQUFNLENBQUMsTUFBTTtRQUNYLE9BQU8sSUFBSSxFQUFFLENBQUM7WUFDWixJQUFJLENBQUM7Z0JBQ0gsT0FBTyxLQUFLLENBQUMsWUFBWSxDQUFDLEVBQUUsQ0FBQyxNQUFNLEVBQUUsRUFBRSxhQUFhLEVBQUUsQ0FBQyxDQUFDO1lBQzFELENBQUM7WUFBQyxPQUFPLENBQU0sRUFBRSxDQUFDO2dCQUNoQixJQUFJLENBQUMsQ0FBQyxDQUFDLFlBQVksZUFBZSxDQUFDLEVBQUUsQ0FBQztvQkFDcEMsTUFBTSxDQUFDLENBQUM7Z0JBQ1YsQ0FBQztnQkFDRCxzREFBc0Q7Z0JBQ3RELFNBQVM7WUFDWCxDQUFDO1FBQ0gsQ0FBQztJQUNILENBQUM7SUFFRDs7Ozs7O09BTUc7SUFDSCxNQUFNLENBQUMsVUFBVSxDQUFDLE1BQTZCO1FBQzdDLE1BQU0sTUFBTSxHQUFHLFlBQVksQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDN0MsT0FBTyxJQUFJLElBQUksQ0FBQyxFQUFFLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxFQUFFLEVBQUUsQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDLEVBQUUsS0FBSyxDQUFDLENBQUM7SUFDdkUsQ0FBQztJQUVEOzs7Ozs7T0FNRztJQUNILE1BQU0sQ0FBQyxvQkFBb0IsQ0FBQyxNQUE2QjtRQUN2RCxNQUFNLE1BQU0sR0FBRyxZQUFZLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQzdDLE1BQU0sS0FBSyxHQUFHLFVBQVUsQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyx3QkFBd0IsQ0FBQyxDQUFDLENBQUM7UUFFM0UsTUFBTSxDQUFDLEdBQUcsSUFBSSxFQUFFLENBQUMsS0FBSyxHQUFHLENBQUMsQ0FBQyxFQUFFLElBQUksSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQztRQUM5QyxNQUFNLElBQUksR0FBRyxDQUFDLEtBQUssR0FBRyxDQUFDLEVBQUUsSUFBSSxJQUFJLENBQUMsQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUUzQyxPQUFPLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDO0lBQ3BDLENBQUM7SUFFRDs7Ozs7OztPQU9HO0lBQ0gsTUFBTSxDQUFDLFVBQVUsQ0FBQyxPQUFlO1FBQy9CLE9BQU8sSUFBSSxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUM7SUFDMUUsQ0FBQztJQUVEOzs7T0FHRztJQUNILFFBQVE7UUFDTixPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQyxFQUFFLElBQUksRUFBRSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDO0lBQ25ELENBQUM7SUFFRCxNQUFNLENBQUMsVUFBVSxDQUFDLE1BQTBCO1FBQzFDLE1BQU0sTUFBTSxHQUFHLFdBQVcsQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDNUMsT0FBTyxJQUFJLElBQUksQ0FBQyxNQUFNLENBQUMsU0FBUyxFQUFFLEVBQUUsTUFBTSxDQUFDLFNBQVMsRUFBRSxFQUFFLE1BQU0sQ0FBQyxXQUFXLEVBQUUsQ0FBQyxDQUFDO0lBQ2hGLENBQUM7SUFFRDs7Ozs7Ozs7T0FRRztJQUNILE1BQU0sQ0FBQyxZQUFZLENBQUMsQ0FBSyxFQUFFLElBQWE7UUFDdEMsMkJBQTJCO1FBQzNCLE1BQU0sUUFBUSxHQUFHLENBQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFFbkQsd0NBQXdDO1FBQ3hDLE1BQU0sQ0FBQyxHQUFHLFFBQVEsQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUUxQixxREFBcUQ7UUFDckQsSUFBSSxDQUFDLEtBQUssSUFBSSxFQUFFLENBQUM7WUFDZixNQUFNLElBQUksZUFBZSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQy9CLENBQUM7UUFFRCxNQUFNLGVBQWUsR0FBRyxDQUFDLENBQUMsUUFBUSxFQUFFLElBQUksQ0FBQyxFQUFFLENBQUMsT0FBTyxHQUFHLEVBQUUsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsT0FBTyxHQUFHLENBQUMsQ0FBQyxRQUFRLEVBQUUsQ0FBQztRQUMxRyxNQUFNLGVBQWUsR0FBRyxFQUFFLENBQUMsT0FBTyxHQUFHLGVBQWUsQ0FBQztRQUVyRCwyREFBMkQ7UUFDM0QsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxlQUFlLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUMsZUFBZSxDQUFDLENBQUM7UUFFeEUsa0NBQWtDO1FBQ2xDLE9BQU8sSUFBSSxJQUFJLENBQUMsQ0FBQyxFQUFFLE1BQU0sRUFBRSxLQUFLLENBQUMsQ0FBQztJQUNwQyxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNILFVBQVU7UUFDUixPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLFFBQVEsRUFBRSxJQUFJLENBQUMsRUFBRSxDQUFDLE9BQU8sR0FBRyxFQUFFLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQztJQUMvRCxDQUFDO0lBRUQ7OztPQUdHO0lBQ0gsU0FBUztRQUNQLE9BQU87WUFDTCxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxRQUFRLEVBQUU7WUFDcEIsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsUUFBUSxFQUFFO1lBQ3BCLFVBQVUsRUFBRSxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUU7U0FDdEMsQ0FBQztJQUNKLENBQUM7SUFFRDs7Ozs7Ozs7O09BU0c7SUFDSCxRQUFRO1FBQ04sSUFBSSxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7WUFDcEIsTUFBTSxJQUFJLEtBQUssQ0FBQyx5REFBeUQsQ0FBQyxDQUFDO1FBQzdFLENBQUM7UUFDRCxNQUFNLEdBQUcsR0FBRyxpQkFBaUIsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDaEQsSUFBSSxHQUFHLENBQUMsTUFBTSxLQUFLLEtBQUssQ0FBQyxhQUFhLEVBQUUsQ0FBQztZQUN2QyxNQUFNLElBQUksS0FBSyxDQUFDLG9DQUFvQyxHQUFHLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQztRQUNwRSxDQUFDO1FBQ0QsT0FBTyxHQUFHLENBQUM7SUFDYixDQUFDO0lBRUQ7OztPQUdHO0lBQ0gsa0JBQWtCO1FBQ2hCLE1BQU0sQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLEdBQUcsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO1FBQ3BDLGtIQUFrSDtRQUNsSCw2R0FBNkc7UUFDN0csY0FBYztRQUNkLE1BQU0sZUFBZSxHQUFHLENBQUMsQ0FBQyxRQUFRLEVBQUUsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDaEUsTUFBTSxHQUFHLEdBQUcsaUJBQWlCLENBQUMsZUFBZSxDQUFDLENBQUM7UUFDL0MsSUFBSSxHQUFHLENBQUMsTUFBTSxLQUFLLEtBQUssQ0FBQyx3QkFBd0IsRUFBRSxDQUFDO1lBQ2xELE1BQU0sSUFBSSxLQUFLLENBQUMsK0NBQStDLEdBQUcsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDO1FBQy9FLENBQUM7UUFDRCxPQUFPLEdBQUcsQ0FBQztJQUNiLENBQUM7SUFFRDs7Ozs7O09BTUc7SUFDSCxRQUFRO1FBQ04sT0FBTyxJQUFJLEdBQUcsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUNoRCxDQUFDO0lBRUQ7Ozs7Ozs7T0FPRztJQUNILGFBQWE7UUFDWCxNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7UUFDNUIsT0FBTyxHQUFHLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO0lBQ2xELENBQUM7SUFFRCxZQUFZO1FBQ1YsOEJBQThCO1FBQzlCLE9BQU8sRUFBRSxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUMsRUFBRSxXQUFXLEVBQUUsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO1FBQzlELDZCQUE2QjtJQUMvQixDQUFDO0lBRUQ7Ozs7OztPQU1HO0lBQ0gsTUFBTSxDQUFDLEdBQVU7UUFDZixPQUFPLElBQUksQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDdEQsQ0FBQztJQUVELE1BQU07UUFDSixPQUFPLElBQUksQ0FBQyxDQUFDLENBQUMsTUFBTSxFQUFFLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQztJQUM1QyxDQUFDO0lBRUQsSUFBSTtRQUNGLE9BQU8sYUFBYSxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDO0lBQ3hDLENBQUM7SUFFRDs7O09BR0c7SUFDSCxJQUFXLEdBQUc7UUFDWixPQUFPLElBQUksQ0FBQyxDQUFDLENBQUMsTUFBTSxFQUFFLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyxNQUFNLEVBQUUsSUFBSSxJQUFJLENBQUMsVUFBVSxDQUFDO0lBQy9ELENBQUM7SUFFRCxZQUFZO1FBQ1YsK0VBQStFO1FBQy9FLElBQUksSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDO1lBQ2IsT0FBTyxJQUFJLENBQUM7UUFDZCxDQUFDO1FBRUQsb0NBQW9DO1FBQ3BDLE1BQU0sQ0FBQyxHQUFHLElBQUksRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQ3JCLE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUMsTUFBTSxFQUFFLENBQUM7UUFDNUIsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUMvQyxPQUFPLEdBQUcsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDekIsQ0FBQzs7QUEvUE0sVUFBSSxHQUFHLElBQUksS0FBSyxDQUFDLEVBQUUsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLElBQUksRUFBRSxLQUFLLENBQUMsQUFBckMsQ0FBc0M7QUFDMUMsbUJBQWEsR0FBRyxFQUFFLENBQUMsYUFBYSxHQUFHLENBQUMsQUFBdkIsQ0FBd0I7QUFDckMsOEJBQXdCLEdBQUcsRUFBRSxDQUFDLGFBQWEsQUFBbkIsQ0FBb0I7QUFnUXJEOzs7O0dBSUc7QUFDSCxNQUFNLFVBQVUsT0FBTyxDQUFDLEdBQVc7SUFDakMsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDO1FBQ1QsT0FBTyxLQUFLLENBQUM7SUFDZixDQUFDO0lBQ0QsTUFBTSxLQUFLLEdBQUcsR0FBWSxDQUFDO0lBQzNCLE9BQU8sS0FBSyxDQUFDLElBQUksS0FBSyxPQUFPLElBQUksS0FBSyxDQUFDLENBQUMsS0FBSyxTQUFTLElBQUksS0FBSyxDQUFDLENBQUMsS0FBSyxTQUFTLENBQUM7QUFDbEYsQ0FBQztBQUVELE1BQU0sT0FBTyxlQUFnQixTQUFRLEtBQUs7SUFDeEMsWUFBWSxDQUFLO1FBQ2YsS0FBSyxDQUFDLHVEQUF1RCxHQUFHLENBQUMsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDO1FBQzlFLElBQUksQ0FBQyxJQUFJLEdBQUcsaUJBQWlCLENBQUM7SUFDaEMsQ0FBQztDQUNGIn0=
|
package/dest/log/log_fn.d.ts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
/** Structured log data to include with the message. */
|
|
2
2
|
export type LogData = Record<string, string | number | bigint | boolean | {
|
|
3
3
|
toString(): string;
|
|
4
|
-
}>;
|
|
4
|
+
} | undefined>;
|
|
5
5
|
/** A callable logger instance. */
|
|
6
6
|
export type LogFn = (msg: string, data?: LogData) => void;
|
|
7
7
|
//# sourceMappingURL=log_fn.d.ts.map
|
package/dest/log/log_fn.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"log_fn.d.ts","sourceRoot":"","sources":["../../src/log/log_fn.ts"],"names":[],"mappings":"AAAA,uDAAuD;AACvD,MAAM,MAAM,OAAO,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG;IAAE,QAAQ,IAAI,MAAM,CAAA;CAAE,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"log_fn.d.ts","sourceRoot":"","sources":["../../src/log/log_fn.ts"],"names":[],"mappings":"AAAA,uDAAuD;AACvD,MAAM,MAAM,OAAO,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG;IAAE,QAAQ,IAAI,MAAM,CAAA;CAAE,GAAG,SAAS,CAAC,CAAC;AAE9G,kCAAkC;AAClC,MAAM,MAAM,KAAK,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,OAAO,KAAK,IAAI,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@aztec/foundation",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.47.0",
|
|
4
4
|
"packageManager": "yarn@3.4.1",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./dest/index.js",
|
|
@@ -88,7 +88,7 @@
|
|
|
88
88
|
]
|
|
89
89
|
},
|
|
90
90
|
"dependencies": {
|
|
91
|
-
"@aztec/bb.js": "0.
|
|
91
|
+
"@aztec/bb.js": "0.47.0",
|
|
92
92
|
"@koa/cors": "^5.0.0",
|
|
93
93
|
"@noble/curves": "^1.2.0",
|
|
94
94
|
"bn.js": "^5.2.1",
|
|
@@ -31,3 +31,248 @@ export function keccak224(input: Buffer) {
|
|
|
31
31
|
const hash = new Keccak(224);
|
|
32
32
|
return hash.update(input).digest();
|
|
33
33
|
}
|
|
34
|
+
|
|
35
|
+
/**
|
|
36
|
+
* Computes the Keccak-f1600 permutation of the input.
|
|
37
|
+
* @param state 25 64-bit words.
|
|
38
|
+
* @returns The permuted state.
|
|
39
|
+
*/
|
|
40
|
+
export function keccakf1600(state: bigint[]): bigint[] {
|
|
41
|
+
// Ideally we'd assert the size of the state and its constituent elements here.
|
|
42
|
+
// But since this gets included in the browser bundle, we can't use Node's assert module.
|
|
43
|
+
/* The implementation based on the "simple" implementation by Ronny Van Keer. */
|
|
44
|
+
/* Adapted from Barretenberg's CPP implementation. */
|
|
45
|
+
let Eba, Ebe, Ebi, Ebo, Ebu;
|
|
46
|
+
let Ega, Ege, Egi, Ego, Egu;
|
|
47
|
+
let Eka, Eke, Eki, Eko, Eku;
|
|
48
|
+
let Ema, Eme, Emi, Emo, Emu;
|
|
49
|
+
let Esa, Ese, Esi, Eso, Esu;
|
|
50
|
+
|
|
51
|
+
let Ba, Be, Bi, Bo, Bu;
|
|
52
|
+
|
|
53
|
+
let Da, De, Di, Do, Du;
|
|
54
|
+
|
|
55
|
+
let Aba = state[0];
|
|
56
|
+
let Abe = state[1];
|
|
57
|
+
let Abi = state[2];
|
|
58
|
+
let Abo = state[3];
|
|
59
|
+
let Abu = state[4];
|
|
60
|
+
let Aga = state[5];
|
|
61
|
+
let Age = state[6];
|
|
62
|
+
let Agi = state[7];
|
|
63
|
+
let Ago = state[8];
|
|
64
|
+
let Agu = state[9];
|
|
65
|
+
let Aka = state[10];
|
|
66
|
+
let Ake = state[11];
|
|
67
|
+
let Aki = state[12];
|
|
68
|
+
let Ako = state[13];
|
|
69
|
+
let Aku = state[14];
|
|
70
|
+
let Ama = state[15];
|
|
71
|
+
let Ame = state[16];
|
|
72
|
+
let Ami = state[17];
|
|
73
|
+
let Amo = state[18];
|
|
74
|
+
let Amu = state[19];
|
|
75
|
+
let Asa = state[20];
|
|
76
|
+
let Ase = state[21];
|
|
77
|
+
let Asi = state[22];
|
|
78
|
+
let Aso = state[23];
|
|
79
|
+
let Asu = state[24];
|
|
80
|
+
|
|
81
|
+
for (let round = 0; round < 24; round += 2) {
|
|
82
|
+
/* Round (round + 0): Axx -> Exx */
|
|
83
|
+
Ba = Aba ^ Aga ^ Aka ^ Ama ^ Asa;
|
|
84
|
+
Be = Abe ^ Age ^ Ake ^ Ame ^ Ase;
|
|
85
|
+
Bi = Abi ^ Agi ^ Aki ^ Ami ^ Asi;
|
|
86
|
+
Bo = Abo ^ Ago ^ Ako ^ Amo ^ Aso;
|
|
87
|
+
Bu = Abu ^ Agu ^ Aku ^ Amu ^ Asu;
|
|
88
|
+
|
|
89
|
+
Da = Bu ^ rol(Be, 1n);
|
|
90
|
+
De = Ba ^ rol(Bi, 1n);
|
|
91
|
+
Di = Be ^ rol(Bo, 1n);
|
|
92
|
+
Do = Bi ^ rol(Bu, 1n);
|
|
93
|
+
Du = Bo ^ rol(Ba, 1n);
|
|
94
|
+
|
|
95
|
+
Ba = Aba ^ Da;
|
|
96
|
+
Be = rol(Age ^ De, 44n);
|
|
97
|
+
Bi = rol(Aki ^ Di, 43n);
|
|
98
|
+
Bo = rol(Amo ^ Do, 21n);
|
|
99
|
+
Bu = rol(Asu ^ Du, 14n);
|
|
100
|
+
Eba = Ba ^ (~Be & Bi) ^ roundConstants[round];
|
|
101
|
+
Ebe = Be ^ (~Bi & Bo);
|
|
102
|
+
Ebi = Bi ^ (~Bo & Bu);
|
|
103
|
+
Ebo = Bo ^ (~Bu & Ba);
|
|
104
|
+
Ebu = Bu ^ (~Ba & Be);
|
|
105
|
+
|
|
106
|
+
Ba = rol(Abo ^ Do, 28n);
|
|
107
|
+
Be = rol(Agu ^ Du, 20n);
|
|
108
|
+
Bi = rol(Aka ^ Da, 3n);
|
|
109
|
+
Bo = rol(Ame ^ De, 45n);
|
|
110
|
+
Bu = rol(Asi ^ Di, 61n);
|
|
111
|
+
Ega = Ba ^ (~Be & Bi);
|
|
112
|
+
Ege = Be ^ (~Bi & Bo);
|
|
113
|
+
Egi = Bi ^ (~Bo & Bu);
|
|
114
|
+
Ego = Bo ^ (~Bu & Ba);
|
|
115
|
+
Egu = Bu ^ (~Ba & Be);
|
|
116
|
+
|
|
117
|
+
Ba = rol(Abe ^ De, 1n);
|
|
118
|
+
Be = rol(Agi ^ Di, 6n);
|
|
119
|
+
Bi = rol(Ako ^ Do, 25n);
|
|
120
|
+
Bo = rol(Amu ^ Du, 8n);
|
|
121
|
+
Bu = rol(Asa ^ Da, 18n);
|
|
122
|
+
Eka = Ba ^ (~Be & Bi);
|
|
123
|
+
Eke = Be ^ (~Bi & Bo);
|
|
124
|
+
Eki = Bi ^ (~Bo & Bu);
|
|
125
|
+
Eko = Bo ^ (~Bu & Ba);
|
|
126
|
+
Eku = Bu ^ (~Ba & Be);
|
|
127
|
+
|
|
128
|
+
Ba = rol(Abu ^ Du, 27n);
|
|
129
|
+
Be = rol(Aga ^ Da, 36n);
|
|
130
|
+
Bi = rol(Ake ^ De, 10n);
|
|
131
|
+
Bo = rol(Ami ^ Di, 15n);
|
|
132
|
+
Bu = rol(Aso ^ Do, 56n);
|
|
133
|
+
Ema = Ba ^ (~Be & Bi);
|
|
134
|
+
Eme = Be ^ (~Bi & Bo);
|
|
135
|
+
Emi = Bi ^ (~Bo & Bu);
|
|
136
|
+
Emo = Bo ^ (~Bu & Ba);
|
|
137
|
+
Emu = Bu ^ (~Ba & Be);
|
|
138
|
+
|
|
139
|
+
Ba = rol(Abi ^ Di, 62n);
|
|
140
|
+
Be = rol(Ago ^ Do, 55n);
|
|
141
|
+
Bi = rol(Aku ^ Du, 39n);
|
|
142
|
+
Bo = rol(Ama ^ Da, 41n);
|
|
143
|
+
Bu = rol(Ase ^ De, 2n);
|
|
144
|
+
Esa = Ba ^ (~Be & Bi);
|
|
145
|
+
Ese = Be ^ (~Bi & Bo);
|
|
146
|
+
Esi = Bi ^ (~Bo & Bu);
|
|
147
|
+
Eso = Bo ^ (~Bu & Ba);
|
|
148
|
+
Esu = Bu ^ (~Ba & Be);
|
|
149
|
+
|
|
150
|
+
/* Round (round + 1): Exx -> Axx */
|
|
151
|
+
|
|
152
|
+
Ba = Eba ^ Ega ^ Eka ^ Ema ^ Esa;
|
|
153
|
+
Be = Ebe ^ Ege ^ Eke ^ Eme ^ Ese;
|
|
154
|
+
Bi = Ebi ^ Egi ^ Eki ^ Emi ^ Esi;
|
|
155
|
+
Bo = Ebo ^ Ego ^ Eko ^ Emo ^ Eso;
|
|
156
|
+
Bu = Ebu ^ Egu ^ Eku ^ Emu ^ Esu;
|
|
157
|
+
|
|
158
|
+
Da = Bu ^ rol(Be, 1n);
|
|
159
|
+
De = Ba ^ rol(Bi, 1n);
|
|
160
|
+
Di = Be ^ rol(Bo, 1n);
|
|
161
|
+
Do = Bi ^ rol(Bu, 1n);
|
|
162
|
+
Du = Bo ^ rol(Ba, 1n);
|
|
163
|
+
|
|
164
|
+
Ba = Eba ^ Da;
|
|
165
|
+
Be = rol(Ege ^ De, 44n);
|
|
166
|
+
Bi = rol(Eki ^ Di, 43n);
|
|
167
|
+
Bo = rol(Emo ^ Do, 21n);
|
|
168
|
+
Bu = rol(Esu ^ Du, 14n);
|
|
169
|
+
Aba = Ba ^ (~Be & Bi) ^ roundConstants[round + 1];
|
|
170
|
+
Abe = Be ^ (~Bi & Bo);
|
|
171
|
+
Abi = Bi ^ (~Bo & Bu);
|
|
172
|
+
Abo = Bo ^ (~Bu & Ba);
|
|
173
|
+
Abu = Bu ^ (~Ba & Be);
|
|
174
|
+
|
|
175
|
+
Ba = rol(Ebo ^ Do, 28n);
|
|
176
|
+
Be = rol(Egu ^ Du, 20n);
|
|
177
|
+
Bi = rol(Eka ^ Da, 3n);
|
|
178
|
+
Bo = rol(Eme ^ De, 45n);
|
|
179
|
+
Bu = rol(Esi ^ Di, 61n);
|
|
180
|
+
Aga = Ba ^ (~Be & Bi);
|
|
181
|
+
Age = Be ^ (~Bi & Bo);
|
|
182
|
+
Agi = Bi ^ (~Bo & Bu);
|
|
183
|
+
Ago = Bo ^ (~Bu & Ba);
|
|
184
|
+
Agu = Bu ^ (~Ba & Be);
|
|
185
|
+
|
|
186
|
+
Ba = rol(Ebe ^ De, 1n);
|
|
187
|
+
Be = rol(Egi ^ Di, 6n);
|
|
188
|
+
Bi = rol(Eko ^ Do, 25n);
|
|
189
|
+
Bo = rol(Emu ^ Du, 8n);
|
|
190
|
+
Bu = rol(Esa ^ Da, 18n);
|
|
191
|
+
Aka = Ba ^ (~Be & Bi);
|
|
192
|
+
Ake = Be ^ (~Bi & Bo);
|
|
193
|
+
Aki = Bi ^ (~Bo & Bu);
|
|
194
|
+
Ako = Bo ^ (~Bu & Ba);
|
|
195
|
+
Aku = Bu ^ (~Ba & Be);
|
|
196
|
+
|
|
197
|
+
Ba = rol(Ebu ^ Du, 27n);
|
|
198
|
+
Be = rol(Ega ^ Da, 36n);
|
|
199
|
+
Bi = rol(Eke ^ De, 10n);
|
|
200
|
+
Bo = rol(Emi ^ Di, 15n);
|
|
201
|
+
Bu = rol(Eso ^ Do, 56n);
|
|
202
|
+
Ama = Ba ^ (~Be & Bi);
|
|
203
|
+
Ame = Be ^ (~Bi & Bo);
|
|
204
|
+
Ami = Bi ^ (~Bo & Bu);
|
|
205
|
+
Amo = Bo ^ (~Bu & Ba);
|
|
206
|
+
Amu = Bu ^ (~Ba & Be);
|
|
207
|
+
|
|
208
|
+
Ba = rol(Ebi ^ Di, 62n);
|
|
209
|
+
Be = rol(Ego ^ Do, 55n);
|
|
210
|
+
Bi = rol(Eku ^ Du, 39n);
|
|
211
|
+
Bo = rol(Ema ^ Da, 41n);
|
|
212
|
+
Bu = rol(Ese ^ De, 2n);
|
|
213
|
+
Asa = Ba ^ (~Be & Bi);
|
|
214
|
+
Ase = Be ^ (~Bi & Bo);
|
|
215
|
+
Asi = Bi ^ (~Bo & Bu);
|
|
216
|
+
Aso = Bo ^ (~Bu & Ba);
|
|
217
|
+
Asu = Bu ^ (~Ba & Be);
|
|
218
|
+
}
|
|
219
|
+
|
|
220
|
+
state[0] = Aba;
|
|
221
|
+
state[1] = Abe;
|
|
222
|
+
state[2] = Abi;
|
|
223
|
+
state[3] = Abo;
|
|
224
|
+
state[4] = Abu;
|
|
225
|
+
state[5] = Aga;
|
|
226
|
+
state[6] = Age;
|
|
227
|
+
state[7] = Agi;
|
|
228
|
+
state[8] = Ago;
|
|
229
|
+
state[9] = Agu;
|
|
230
|
+
state[10] = Aka;
|
|
231
|
+
state[11] = Ake;
|
|
232
|
+
state[12] = Aki;
|
|
233
|
+
state[13] = Ako;
|
|
234
|
+
state[14] = Aku;
|
|
235
|
+
state[15] = Ama;
|
|
236
|
+
state[16] = Ame;
|
|
237
|
+
state[17] = Ami;
|
|
238
|
+
state[18] = Amo;
|
|
239
|
+
state[19] = Amu;
|
|
240
|
+
state[20] = Asa;
|
|
241
|
+
state[21] = Ase;
|
|
242
|
+
state[22] = Asi;
|
|
243
|
+
state[23] = Aso;
|
|
244
|
+
state[24] = Asu;
|
|
245
|
+
|
|
246
|
+
return state;
|
|
247
|
+
}
|
|
248
|
+
|
|
249
|
+
function rol(x: bigint, s: bigint) {
|
|
250
|
+
return BigInt.asUintN(64, x << s) | (x >> (64n - s));
|
|
251
|
+
}
|
|
252
|
+
|
|
253
|
+
const roundConstants: bigint[] = [
|
|
254
|
+
0x0000000000000001n,
|
|
255
|
+
0x0000000000008082n,
|
|
256
|
+
0x800000000000808an,
|
|
257
|
+
0x8000000080008000n,
|
|
258
|
+
0x000000000000808bn,
|
|
259
|
+
0x0000000080000001n,
|
|
260
|
+
0x8000000080008081n,
|
|
261
|
+
0x8000000000008009n,
|
|
262
|
+
0x000000000000008an,
|
|
263
|
+
0x0000000000000088n,
|
|
264
|
+
0x0000000080008009n,
|
|
265
|
+
0x000000008000000an,
|
|
266
|
+
0x000000008000808bn,
|
|
267
|
+
0x800000000000008bn,
|
|
268
|
+
0x8000000000008089n,
|
|
269
|
+
0x8000000000008003n,
|
|
270
|
+
0x8000000000008002n,
|
|
271
|
+
0x8000000000000080n,
|
|
272
|
+
0x000000000000800an,
|
|
273
|
+
0x800000008000000an,
|
|
274
|
+
0x8000000080008081n,
|
|
275
|
+
0x8000000000008080n,
|
|
276
|
+
0x0000000080000001n,
|
|
277
|
+
0x8000000080008008n,
|
|
278
|
+
];
|
|
@@ -74,3 +74,12 @@ export const randomBigInt = (max: bigint) => {
|
|
|
74
74
|
const randomBigInt = BigInt(`0x${randomBuffer.toString('hex')}`); // Convert buffer to a large integer.
|
|
75
75
|
return randomBigInt % max; // Use modulo to ensure the result is less than max.
|
|
76
76
|
};
|
|
77
|
+
|
|
78
|
+
/**
|
|
79
|
+
* Generate a random boolean value.
|
|
80
|
+
* @returns A random boolean value.
|
|
81
|
+
*/
|
|
82
|
+
export const randomBoolean = () => {
|
|
83
|
+
const randomByte = randomBytes(1)[0]; // Generate a single random byte.
|
|
84
|
+
return randomByte % 2 === 0; // Use modulo to determine if the byte is even or odd.
|
|
85
|
+
};
|
package/src/fields/fields.ts
CHANGED
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
import { BarretenbergSync } from '@aztec/bb.js';
|
|
2
|
+
|
|
1
3
|
import { inspect } from 'util';
|
|
2
4
|
|
|
3
5
|
import { toBigIntBE, toBufferBE } from '../bigint-buffer/index.js';
|
|
@@ -197,6 +199,7 @@ export class Fr extends BaseField {
|
|
|
197
199
|
static ZERO = new Fr(0n);
|
|
198
200
|
static ONE = new Fr(1n);
|
|
199
201
|
static MODULUS = 0x30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001n;
|
|
202
|
+
static MAX_FIELD_VALUE = new Fr(this.MODULUS - 1n);
|
|
200
203
|
|
|
201
204
|
constructor(value: number | bigint | boolean | Fr | Buffer) {
|
|
202
205
|
super(value);
|
|
@@ -280,6 +283,25 @@ export class Fr extends BaseField {
|
|
|
280
283
|
return new Fr(this.toBigInt() / rhs.toBigInt());
|
|
281
284
|
}
|
|
282
285
|
|
|
286
|
+
/**
|
|
287
|
+
* Computes a square root of the field element.
|
|
288
|
+
* @returns A square root of the field element (null if it does not exist).
|
|
289
|
+
*/
|
|
290
|
+
sqrt(): Fr | null {
|
|
291
|
+
const wasm = BarretenbergSync.getSingleton().getWasm();
|
|
292
|
+
wasm.writeMemory(0, this.toBuffer());
|
|
293
|
+
wasm.call('bn254_fr_sqrt', 0, Fr.SIZE_IN_BYTES);
|
|
294
|
+
const isSqrtBuf = Buffer.from(wasm.getMemorySlice(Fr.SIZE_IN_BYTES, Fr.SIZE_IN_BYTES + 1));
|
|
295
|
+
const isSqrt = isSqrtBuf[0] === 1;
|
|
296
|
+
if (!isSqrt) {
|
|
297
|
+
// Field element is not a quadratic residue mod p so it has no square root.
|
|
298
|
+
return null;
|
|
299
|
+
}
|
|
300
|
+
|
|
301
|
+
const rootBuf = Buffer.from(wasm.getMemorySlice(Fr.SIZE_IN_BYTES + 1, Fr.SIZE_IN_BYTES * 2 + 1));
|
|
302
|
+
return Fr.fromBuffer(rootBuf);
|
|
303
|
+
}
|
|
304
|
+
|
|
283
305
|
toJSON() {
|
|
284
306
|
return {
|
|
285
307
|
type: 'Fr',
|
package/src/fields/point.ts
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { toBigIntBE } from '../bigint-buffer/index.js';
|
|
2
|
+
import { poseidon2Hash, randomBoolean } from '../crypto/index.js';
|
|
2
3
|
import { BufferReader, FieldReader, serializeToBuffer } from '../serialize/index.js';
|
|
3
4
|
import { Fr } from './fields.js';
|
|
4
5
|
|
|
@@ -10,6 +11,7 @@ import { Fr } from './fields.js';
|
|
|
10
11
|
export class Point {
|
|
11
12
|
static ZERO = new Point(Fr.ZERO, Fr.ZERO, false);
|
|
12
13
|
static SIZE_IN_BYTES = Fr.SIZE_IN_BYTES * 2;
|
|
14
|
+
static COMPRESSED_SIZE_IN_BYTES = Fr.SIZE_IN_BYTES;
|
|
13
15
|
|
|
14
16
|
/** Used to differentiate this class from AztecAddress */
|
|
15
17
|
public readonly kind = 'point';
|
|
@@ -37,8 +39,17 @@ export class Point {
|
|
|
37
39
|
* @returns A randomly generated Point instance.
|
|
38
40
|
*/
|
|
39
41
|
static random() {
|
|
40
|
-
|
|
41
|
-
|
|
42
|
+
while (true) {
|
|
43
|
+
try {
|
|
44
|
+
return Point.fromXAndSign(Fr.random(), randomBoolean());
|
|
45
|
+
} catch (e: any) {
|
|
46
|
+
if (!(e instanceof NotOnCurveError)) {
|
|
47
|
+
throw e;
|
|
48
|
+
}
|
|
49
|
+
// The random point is not on the curve - we try again
|
|
50
|
+
continue;
|
|
51
|
+
}
|
|
52
|
+
}
|
|
42
53
|
}
|
|
43
54
|
|
|
44
55
|
/**
|
|
@@ -53,6 +64,23 @@ export class Point {
|
|
|
53
64
|
return new this(Fr.fromBuffer(reader), Fr.fromBuffer(reader), false);
|
|
54
65
|
}
|
|
55
66
|
|
|
67
|
+
/**
|
|
68
|
+
* Create a Point instance from a compressed buffer.
|
|
69
|
+
* The input 'buffer' should have exactly 33 bytes representing the x coordinate and the sign of the y coordinate.
|
|
70
|
+
*
|
|
71
|
+
* @param buffer - The buffer containing the x coordinate and the sign of the y coordinate.
|
|
72
|
+
* @returns A Point instance.
|
|
73
|
+
*/
|
|
74
|
+
static fromCompressedBuffer(buffer: Buffer | BufferReader) {
|
|
75
|
+
const reader = BufferReader.asReader(buffer);
|
|
76
|
+
const value = toBigIntBE(reader.readBytes(Point.COMPRESSED_SIZE_IN_BYTES));
|
|
77
|
+
|
|
78
|
+
const x = new Fr(value & ((1n << 255n) - 1n));
|
|
79
|
+
const sign = (value & (1n << 255n)) !== 0n;
|
|
80
|
+
|
|
81
|
+
return this.fromXAndSign(x, sign);
|
|
82
|
+
}
|
|
83
|
+
|
|
56
84
|
/**
|
|
57
85
|
* Create a Point instance from a hex-encoded string.
|
|
58
86
|
* The input 'address' should be prefixed with '0x' or not, and have exactly 128 hex characters representing the x and y coordinates.
|
|
@@ -78,6 +106,46 @@ export class Point {
|
|
|
78
106
|
return new this(reader.readField(), reader.readField(), reader.readBoolean());
|
|
79
107
|
}
|
|
80
108
|
|
|
109
|
+
/**
|
|
110
|
+
* Uses the x coordinate and isPositive flag (+/-) to reconstruct the point.
|
|
111
|
+
* @dev The y coordinate can be derived from the x coordinate and the "sign" flag by solving the grumpkin curve
|
|
112
|
+
* equation for y.
|
|
113
|
+
* @param x - The x coordinate of the point
|
|
114
|
+
* @param sign - The "sign" of the y coordinate - note that this is not a sign as is known in integer arithmetic.
|
|
115
|
+
* Instead it is a boolean flag that determines whether the y coordinate is <= (Fr.MODULUS - 1) / 2
|
|
116
|
+
* @returns The point as an array of 2 fields
|
|
117
|
+
*/
|
|
118
|
+
static fromXAndSign(x: Fr, sign: boolean) {
|
|
119
|
+
// Calculate y^2 = x^3 - 17
|
|
120
|
+
const ySquared = x.square().mul(x).sub(new Fr(17));
|
|
121
|
+
|
|
122
|
+
// Calculate the square root of ySquared
|
|
123
|
+
const y = ySquared.sqrt();
|
|
124
|
+
|
|
125
|
+
// If y is null, the x-coordinate is not on the curve
|
|
126
|
+
if (y === null) {
|
|
127
|
+
throw new NotOnCurveError(x);
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
const yPositiveBigInt = y.toBigInt() <= (Fr.MODULUS - 1n) / 2n ? y.toBigInt() : Fr.MODULUS - y.toBigInt();
|
|
131
|
+
const yNegativeBigInt = Fr.MODULUS - yPositiveBigInt;
|
|
132
|
+
|
|
133
|
+
// Choose the positive or negative root based on isPositive
|
|
134
|
+
const finalY = sign ? new Fr(yPositiveBigInt) : new Fr(yNegativeBigInt);
|
|
135
|
+
|
|
136
|
+
// Create and return the new Point
|
|
137
|
+
return new this(x, finalY, false);
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
/**
|
|
141
|
+
* Returns the x coordinate and the sign of the y coordinate.
|
|
142
|
+
* @dev The y sign can be determined by checking if the y coordinate is greater than half of the modulus.
|
|
143
|
+
* @returns The x coordinate and the sign of the y coordinate.
|
|
144
|
+
*/
|
|
145
|
+
toXAndSign(): [Fr, boolean] {
|
|
146
|
+
return [this.x, this.y.toBigInt() <= (Fr.MODULUS - 1n) / 2n];
|
|
147
|
+
}
|
|
148
|
+
|
|
81
149
|
/**
|
|
82
150
|
* Returns the contents of the point as BigInts.
|
|
83
151
|
* @returns The point as BigInts
|
|
@@ -111,6 +179,23 @@ export class Point {
|
|
|
111
179
|
return buf;
|
|
112
180
|
}
|
|
113
181
|
|
|
182
|
+
/**
|
|
183
|
+
* Converts the Point instance to a compressed Buffer representation of the coordinates.
|
|
184
|
+
* @returns A Buffer representation of the Point instance
|
|
185
|
+
*/
|
|
186
|
+
toCompressedBuffer() {
|
|
187
|
+
const [x, sign] = this.toXAndSign();
|
|
188
|
+
// Here we leverage that Fr fits into 254 bits (log2(Fr.MODULUS) < 254) and given that we serialize Fr to 32 bytes
|
|
189
|
+
// and we use big-endian the 2 most significant bits are never populated. Hence we can use one of the bits as
|
|
190
|
+
// a sign bit.
|
|
191
|
+
const compressedValue = x.toBigInt() + (sign ? 2n ** 255n : 0n);
|
|
192
|
+
const buf = serializeToBuffer(compressedValue);
|
|
193
|
+
if (buf.length !== Point.COMPRESSED_SIZE_IN_BYTES) {
|
|
194
|
+
throw new Error(`Invalid buffer length for compressed Point: ${buf.length}`);
|
|
195
|
+
}
|
|
196
|
+
return buf;
|
|
197
|
+
}
|
|
198
|
+
|
|
114
199
|
/**
|
|
115
200
|
* Convert the Point instance to a hexadecimal string representation.
|
|
116
201
|
* The output string is prefixed with '0x' and consists of exactly 128 hex characters,
|
|
@@ -194,3 +279,10 @@ export function isPoint(obj: object): obj is Point {
|
|
|
194
279
|
const point = obj as Point;
|
|
195
280
|
return point.kind === 'point' && point.x !== undefined && point.y !== undefined;
|
|
196
281
|
}
|
|
282
|
+
|
|
283
|
+
export class NotOnCurveError extends Error {
|
|
284
|
+
constructor(x: Fr) {
|
|
285
|
+
super('The given x-coordinate is not on the Grumpkin curve: ' + x.toString());
|
|
286
|
+
this.name = 'NotOnCurveError';
|
|
287
|
+
}
|
|
288
|
+
}
|
package/src/log/log_fn.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/** Structured log data to include with the message. */
|
|
2
|
-
export type LogData = Record<string, string | number | bigint | boolean | { toString(): string }>;
|
|
2
|
+
export type LogData = Record<string, string | number | bigint | boolean | { toString(): string } | undefined>;
|
|
3
3
|
|
|
4
4
|
/** A callable logger instance. */
|
|
5
5
|
export type LogFn = (msg: string, data?: LogData) => void;
|