@aztec/foundation 0.46.7 → 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/fields/point.d.ts +3 -0
- package/dest/fields/point.d.ts.map +1 -1
- package/dest/fields/point.js +22 -9
- 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/fields/point.ts +23 -8
- 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==
|
package/dest/fields/point.d.ts
CHANGED
|
@@ -160,4 +160,7 @@ export declare class Point {
|
|
|
160
160
|
* @returns Whether it looks like a point.
|
|
161
161
|
*/
|
|
162
162
|
export declare function isPoint(obj: object): obj is Point;
|
|
163
|
+
export declare class NotOnCurveError extends Error {
|
|
164
|
+
constructor(x: Fr);
|
|
165
|
+
}
|
|
163
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,3 +1,4 @@
|
|
|
1
|
+
import { toBigIntBE } from '../bigint-buffer/index.js';
|
|
1
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';
|
|
@@ -66,7 +67,10 @@ export class Point {
|
|
|
66
67
|
*/
|
|
67
68
|
static fromCompressedBuffer(buffer) {
|
|
68
69
|
const reader = BufferReader.asReader(buffer);
|
|
69
|
-
|
|
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);
|
|
70
74
|
}
|
|
71
75
|
/**
|
|
72
76
|
* Create a Point instance from a hex-encoded string.
|
|
@@ -106,9 +110,9 @@ export class Point {
|
|
|
106
110
|
const y = ySquared.sqrt();
|
|
107
111
|
// If y is null, the x-coordinate is not on the curve
|
|
108
112
|
if (y === null) {
|
|
109
|
-
throw new NotOnCurveError();
|
|
113
|
+
throw new NotOnCurveError(x);
|
|
110
114
|
}
|
|
111
|
-
const yPositiveBigInt = y.toBigInt()
|
|
115
|
+
const yPositiveBigInt = y.toBigInt() <= (Fr.MODULUS - 1n) / 2n ? y.toBigInt() : Fr.MODULUS - y.toBigInt();
|
|
112
116
|
const yNegativeBigInt = Fr.MODULUS - yPositiveBigInt;
|
|
113
117
|
// Choose the positive or negative root based on isPositive
|
|
114
118
|
const finalY = sign ? new Fr(yPositiveBigInt) : new Fr(yNegativeBigInt);
|
|
@@ -159,7 +163,16 @@ export class Point {
|
|
|
159
163
|
* @returns A Buffer representation of the Point instance
|
|
160
164
|
*/
|
|
161
165
|
toCompressedBuffer() {
|
|
162
|
-
|
|
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;
|
|
163
176
|
}
|
|
164
177
|
/**
|
|
165
178
|
* Convert the Point instance to a hexadecimal string representation.
|
|
@@ -225,7 +238,7 @@ export class Point {
|
|
|
225
238
|
}
|
|
226
239
|
Point.ZERO = new Point(Fr.ZERO, Fr.ZERO, false);
|
|
227
240
|
Point.SIZE_IN_BYTES = Fr.SIZE_IN_BYTES * 2;
|
|
228
|
-
Point.COMPRESSED_SIZE_IN_BYTES = Fr.SIZE_IN_BYTES
|
|
241
|
+
Point.COMPRESSED_SIZE_IN_BYTES = Fr.SIZE_IN_BYTES;
|
|
229
242
|
/**
|
|
230
243
|
* Does this object look like a point?
|
|
231
244
|
* @param obj - Object to test if it is a point.
|
|
@@ -238,10 +251,10 @@ export function isPoint(obj) {
|
|
|
238
251
|
const point = obj;
|
|
239
252
|
return point.kind === 'point' && point.x !== undefined && point.y !== undefined;
|
|
240
253
|
}
|
|
241
|
-
class NotOnCurveError extends Error {
|
|
242
|
-
constructor() {
|
|
243
|
-
super('The given x-coordinate is not on the Grumpkin curve');
|
|
254
|
+
export class NotOnCurveError extends Error {
|
|
255
|
+
constructor(x) {
|
|
256
|
+
super('The given x-coordinate is not on the Grumpkin curve: ' + x.toString());
|
|
244
257
|
this.name = 'NotOnCurveError';
|
|
245
258
|
}
|
|
246
259
|
}
|
|
247
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
260
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicG9pbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvZmllbGRzL3BvaW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUN2RCxPQUFPLEVBQUUsYUFBYSxFQUFFLGFBQWEsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQ2xFLE9BQU8sRUFBRSxZQUFZLEVBQUUsV0FBVyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFDckYsT0FBTyxFQUFFLEVBQUUsRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUVqQzs7OztHQUlHO0FBQ0gsTUFBTSxPQUFPLEtBQUs7SUFRaEI7SUFDRTs7T0FFRztJQUNhLENBQUs7SUFDckI7O09BRUc7SUFDYSxDQUFLO0lBQ3JCOztPQUVHO0lBQ2EsVUFBbUI7UUFSbkIsTUFBQyxHQUFELENBQUMsQ0FBSTtRQUlMLE1BQUMsR0FBRCxDQUFDLENBQUk7UUFJTCxlQUFVLEdBQVYsVUFBVSxDQUFTO1FBZnJDLHlEQUF5RDtRQUN6QyxTQUFJLEdBQUcsT0FBTyxDQUFDO1FBZ0I3QixpQ0FBaUM7SUFDbkMsQ0FBQztJQUVEOzs7O09BSUc7SUFDSCxNQUFNLENBQUMsTUFBTTtRQUNYLE9BQU8sSUFBSSxFQUFFLENBQUM7WUFDWixJQUFJLENBQUM7Z0JBQ0gsT0FBTyxLQUFLLENBQUMsWUFBWSxDQUFDLEVBQUUsQ0FBQyxNQUFNLEVBQUUsRUFBRSxhQUFhLEVBQUUsQ0FBQyxDQUFDO1lBQzFELENBQUM7WUFBQyxPQUFPLENBQU0sRUFBRSxDQUFDO2dCQUNoQixJQUFJLENBQUMsQ0FBQyxDQUFDLFlBQVksZUFBZSxDQUFDLEVBQUUsQ0FBQztvQkFDcEMsTUFBTSxDQUFDLENBQUM7Z0JBQ1YsQ0FBQztnQkFDRCxzREFBc0Q7Z0JBQ3RELFNBQVM7WUFDWCxDQUFDO1FBQ0gsQ0FBQztJQUNILENBQUM7SUFFRDs7Ozs7O09BTUc7SUFD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
|
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
|
+
];
|
package/src/fields/point.ts
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { toBigIntBE } from '../bigint-buffer/index.js';
|
|
1
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';
|
|
@@ -10,7 +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;
|
|
13
|
-
static COMPRESSED_SIZE_IN_BYTES = Fr.SIZE_IN_BYTES
|
|
14
|
+
static COMPRESSED_SIZE_IN_BYTES = Fr.SIZE_IN_BYTES;
|
|
14
15
|
|
|
15
16
|
/** Used to differentiate this class from AztecAddress */
|
|
16
17
|
public readonly kind = 'point';
|
|
@@ -72,7 +73,12 @@ export class Point {
|
|
|
72
73
|
*/
|
|
73
74
|
static fromCompressedBuffer(buffer: Buffer | BufferReader) {
|
|
74
75
|
const reader = BufferReader.asReader(buffer);
|
|
75
|
-
|
|
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);
|
|
76
82
|
}
|
|
77
83
|
|
|
78
84
|
/**
|
|
@@ -118,10 +124,10 @@ export class Point {
|
|
|
118
124
|
|
|
119
125
|
// If y is null, the x-coordinate is not on the curve
|
|
120
126
|
if (y === null) {
|
|
121
|
-
throw new NotOnCurveError();
|
|
127
|
+
throw new NotOnCurveError(x);
|
|
122
128
|
}
|
|
123
129
|
|
|
124
|
-
const yPositiveBigInt = y.toBigInt()
|
|
130
|
+
const yPositiveBigInt = y.toBigInt() <= (Fr.MODULUS - 1n) / 2n ? y.toBigInt() : Fr.MODULUS - y.toBigInt();
|
|
125
131
|
const yNegativeBigInt = Fr.MODULUS - yPositiveBigInt;
|
|
126
132
|
|
|
127
133
|
// Choose the positive or negative root based on isPositive
|
|
@@ -178,7 +184,16 @@ export class Point {
|
|
|
178
184
|
* @returns A Buffer representation of the Point instance
|
|
179
185
|
*/
|
|
180
186
|
toCompressedBuffer() {
|
|
181
|
-
|
|
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;
|
|
182
197
|
}
|
|
183
198
|
|
|
184
199
|
/**
|
|
@@ -265,9 +280,9 @@ export function isPoint(obj: object): obj is Point {
|
|
|
265
280
|
return point.kind === 'point' && point.x !== undefined && point.y !== undefined;
|
|
266
281
|
}
|
|
267
282
|
|
|
268
|
-
class NotOnCurveError extends Error {
|
|
269
|
-
constructor() {
|
|
270
|
-
super('The given x-coordinate is not on the Grumpkin curve');
|
|
283
|
+
export class NotOnCurveError extends Error {
|
|
284
|
+
constructor(x: Fr) {
|
|
285
|
+
super('The given x-coordinate is not on the Grumpkin curve: ' + x.toString());
|
|
271
286
|
this.name = 'NotOnCurveError';
|
|
272
287
|
}
|
|
273
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;
|