ark-curves-cherry-picked/ed_on_bn254/src/fields/tests.rs
ed_on_bn254/src/fields/tests.rsRaw
1use crate::{Fq, Fr};
2use ark_ff::{
3 biginteger::BigInteger256 as BigInteger,
4 bytes::{FromBytes, ToBytes},
5 fields::{Field, LegendreSymbol::*, SquareRootField},
6 test_rng, One, Zero,
7};
8
9use ark_curve_tests::fields::*;
10
11use core::str::FromStr;
12use rand::Rng;
13
14#[test]
15fn test_fr() {
16 let mut rng = test_rng();
17 let a: Fr = rng.gen();
18 let b: Fr = rng.gen();
19 field_test(a, b);
20 primefield_test::<Fr>();
21}
22
23#[test]
24fn test_fq() {
25 let mut rng = test_rng();
26 let a: Fq = rng.gen();
27 let b: Fq = rng.gen();
28 field_test(a, b);
29 primefield_test::<Fq>();
30}
31
32#[test]
33fn test_fq_add() {
34 let f1 = Fq::from_str(
35 "18386742314266644595564329008376577163854043021652781768352795308532764650733",
36 )
37 .unwrap();
38 let f2 = Fq::from_str(
39 "39786307610986038981023499868190793548353538256264351797285876981647142458383",
40 )
41 .unwrap();
42 let f3 = Fq::from_str(
43 "14396564181574133132095017386052820535110852477085064878242263917028290117882",
44 )
45 .unwrap();
46 assert!(!f1.is_zero());
47 assert!(!f2.is_zero());
48 assert!(!f3.is_zero());
49 assert_eq!(f1 + &f2, f3);
50}
51
52#[test]
53fn test_fq_add_one() {
54 let f1 = Fq::from_str(
55 "4946875394261337176810256604189376311946643975348516311606738923340201185904",
56 )
57 .unwrap();
58 let f2 = Fq::from_str(
59 "4946875394261337176810256604189376311946643975348516311606738923340201185905",
60 )
61 .unwrap();
62 assert!(!f1.is_zero());
63 assert!(!f2.is_zero());
64 assert_eq!(f1 + &Fq::one(), f2);
65}
66
67#[test]
68fn test_fq_mul() {
69 let f1 = Fq::from_str(
70 "24703123148064348394273033316595937198355721297494556079070134653139656190956",
71 )
72 .unwrap();
73 let f2 = Fq::from_str(
74 "38196797080882758914424853878212529985425118523754343117256179679117054302131",
75 )
76 .unwrap();
77 let f3 = Fq::from_str(
78 "1321267396236123309645330145349353750536542060403774171357889269349508194307",
79 )
80 .unwrap();
81 assert!(!f1.is_zero());
82 assert!(!f2.is_zero());
83 assert!(!f3.is_zero());
84 assert_eq!(f1 * &f2, f3);
85}
86
87#[test]
88fn test_fq_triple_mul() {
89 let f1 = Fq::from_str(
90 "23834398828139479510988224171342199299644042568628082836691700490363123893905",
91 )
92 .unwrap();
93 let f2 = Fq::from_str(
94 "48343809612844640454129919255697536258606705076971130519928764925719046689317",
95 )
96 .unwrap();
97 let f3 = Fq::from_str(
98 "22704845471524346880579660022678666462201713488283356385810726260959369106033",
99 )
100 .unwrap();
101 let f4 = Fq::from_str(
102 "7747776931431194635550680695131420638163057297019399136408144301550822179875",
103 )
104 .unwrap();
105 assert!(!f1.is_zero());
106 assert!(!f2.is_zero());
107 assert!(!f3.is_zero());
108 assert_eq!(f1 * &f2 * &f3, f4);
109}
110
111#[test]
112fn test_fq_div() {
113 let f1 = Fq::from_str(
114 "31892744363926593013886463524057935370302352424137349660481695792871889573091",
115 )
116 .unwrap();
117 let f2 = Fq::from_str(
118 "47695868328933459965610498875668250916462767196500056002116961816137113470902",
119 )
120 .unwrap();
121 let f3 = Fq::from_str(
122 "7301086967624450577859019086314322648061398679982346993011603220910508457334",
123 )
124 .unwrap();
125 assert!(!f1.is_zero());
126 assert!(!f2.is_zero());
127 assert!(!f3.is_zero());
128 assert_eq!(f1 / &f2, f3);
129}
130
131#[test]
132fn test_fq_sub() {
133 let f1 = Fq::from_str(
134 "18695869713129401390241150743745601908470616448391638969502807001833388904079",
135 )
136 .unwrap();
137 let f2 = Fq::from_str(
138 "10105476028534616828778879109836101003805485072436929139123765141153277007373",
139 )
140 .unwrap();
141 let f3 = Fq::from_str(
142 "8590393684594784561462271633909500904665131375954709830379041860680111896706",
143 )
144 .unwrap();
145 assert!(!f1.is_zero());
146 assert!(!f2.is_zero());
147 assert!(!f3.is_zero());
148 assert_eq!(f1 - &f2, f3);
149}
150
151#[test]
152fn test_fq_double_in_place() {
153 let mut f1 = Fq::from_str(
154 "29729289787452206300641229002276778748586801323231253291984198106063944136114",
155 )
156 .unwrap();
157 let f3 = Fq::from_str(
158 "15682093831225862156789646514039007320076873845630437896571987838976271280994",
159 )
160 .unwrap();
161 assert!(!f1.is_zero());
162 assert!(!f3.is_zero());
163 f1.double_in_place();
164 assert_eq!(f1, f3);
165}
166
167#[test]
168fn test_fq_double_in_place_thrice() {
169 let mut f1 = Fq::from_str(
170 "32768907806651393940832831055386272949401004221411141755415956893066040832473",
171 )
172 .unwrap();
173 let f3 = Fq::from_str(
174 "21380590862979124081952185245260157621176025366712756262647409092194433207997",
175 )
176 .unwrap();
177 assert!(!f1.is_zero());
178 assert!(!f3.is_zero());
179 f1.double_in_place();
180 f1.double_in_place();
181 f1.double_in_place();
182 assert_eq!(f1, f3);
183}
184
185#[test]
186fn test_fq_generate_random_ed_on_bn254_point() {
187 let a = Fq::from_str("168700").unwrap();
188
189 let d = Fq::from_str("168696").unwrap();
190 let y = Fq::from_str(
191 "19987327827845206670850937090314462639017692512983955920885166014935289314257",
192 )
193 .unwrap();
194 let x2 = Fq::from_str(
195 "2144239075372598103060889495211040948751593385312551803225522963913923559328",
196 )
197 .unwrap();
198
199 let computed_y2 = y.square();
200 let y2 = Fq::from_str(
201 "11134206686211572308995578277928848431421308813024790181507137950838333998633",
202 )
203 .unwrap();
204 assert_eq!(y2, computed_y2);
205
206 let computed_dy2 = d * &computed_y2;
207 let dy2 =
208 Fq::from_str("345576003677591687256955722467813448317229128849323754147891993737799010947")
209 .unwrap();
210 assert_eq!(dy2, computed_dy2);
211
212 let computed_divisor = computed_dy2 - a;
213 let divisor =
214 Fq::from_str("345576003677591687256955722467813448317229128849323754147891993737798842247")
215 .unwrap();
216 assert_eq!(divisor, computed_divisor);
217
218 let computed_x2 = (computed_y2 - &Fq::one()) / &computed_divisor;
219 assert_eq!(x2, computed_x2);
220
221 let x = Fq::from_str(
222 "4801447892755635304907919953550459075619191823587157449340656925102682829025",
223 )
224 .unwrap();
225 let computed_x = computed_x2.sqrt().unwrap();
226 assert_eq!(computed_x.square(), x2);
227 assert_eq!(x, computed_x);
228
229 fn add<'a>(curr: (Fq, Fq), other: &'a (Fq, Fq)) -> (Fq, Fq) {
230 let y1y2 = curr.1 * &other.1;
231 let x1x2 = curr.0 * &other.0;
232 let a = Fq::from_str("168700").unwrap();
233 let d = Fq::from_str("168696").unwrap();
234 let dx1x2y1y2 = d * &y1y2 * &x1x2;
235
236 let d1 = Fq::one() + &dx1x2y1y2;
237 let d2 = Fq::one() - &dx1x2y1y2;
238
239 let x1y2 = curr.0 * &other.1;
240 let y1x2 = curr.1 * &other.0;
241
242 let x = (x1y2 + &y1x2) / &d1;
243 let y = (y1y2 - a * &x1x2) / &d2;
244
245 (x, y)
246 }
247
248 let result = add((x, y), &(x, y));
249 let result = add(result, &result);
250 let result = add(result, &result);
251
252 let point_x =
253 Fq::from_str("380676173762867192861894055350059333852732198308367125138259398265363727587")
254 .unwrap();
255 let point_y = Fq::from_str(
256 "8435074244857818446059206728316702149733931432112984450960434710303841866985",
257 )
258 .unwrap();
259 assert_eq!((point_x, point_y), result);
260}
261
262#[test]
263fn test_fq_square_in_place() {
264 let mut f1 = Fq::from_str(
265 "6060110850233386730847324622937480088943976359504617699731744947670229990461",
266 )
267 .unwrap();
268 let f3 = Fq::from_str(
269 "17018926051730832095053393285350575966874590491719897015583930476179087429684",
270 )
271 .unwrap();
272 assert!(!f1.is_zero());
273 assert!(!f3.is_zero());
274 f1.square_in_place();
275 assert_eq!(f1, f3);
276}
277
278#[test]
279fn test_fq_sqrt() {
280 let f1 = Fq::from_str(
281 "5830207146824777307592559303161432403393380070279905260050870500920682305217",
282 )
283 .unwrap();
284 let f3 = Fq::from_str(
285 "2108183130040740552565127577293974960058698876185401671087892009247563211475",
286 )
287 .unwrap();
288 assert_eq!(f1.sqrt().unwrap(), f3);
289}
290
291#[test]
292fn test_fq_from_str() {
293 let f1_from_repr = Fq::from(BigInteger([
294 0xab8a2535947d1a77,
295 0x9ba74cbfda0bbcda,
296 0xe928b59724d60baf,
297 0x1cccaaeb9bb1680a,
298 ]));
299 let f1 = Fq::from_str(
300 "13026376210409056429264774981357153555336288129100724591327877625017068755575",
301 )
302 .unwrap();
303 let f2_from_repr = Fq::from(BigInteger([
304 0x97e9103775d2f35c,
305 0xbe6756b6c587544b,
306 0x6ee38c3afd88ef4b,
307 0x2bacd150f540c677,
308 ]));
309 let f2 = Fq::from_str(
310 "19754794831832707859764530223239420866832328728734160755396495950822165902172",
311 )
312 .unwrap();
313 assert_eq!(f1_from_repr, f1);
314 assert_eq!(f2_from_repr, f2);
315}
316
317#[test]
318fn test_fq_legendre() {
319 assert_eq!(QuadraticResidue, Fq::one().legendre());
320 assert_eq!(Zero, Fq::zero().legendre());
321
322 let e = BigInteger([
323 0x2e8de1a676c03be8,
324 0x73350d34fe25a560,
325 0x7ea085919029688e,
326 0x1d0868cb993cf28,
327 ]);
328 assert_eq!(QuadraticResidue, Fq::from(e).legendre());
329 let e = BigInteger([
330 0x891d8cc23c8d0706,
331 0xe91800e007db2698,
332 0xfff380321e9ac7a7,
333 0x2659e28bd17eab6,
334 ]);
335 assert_eq!(QuadraticNonResidue, Fq::from(e).legendre());
336}
337
338#[test]
339fn test_fq_bytes() {
340 let f1_from_repr = Fq::from(BigInteger([
341 0xab8a2535947d1a77,
342 0x9ba74cbfda0bbcda,
343 0xe928b59724d60baf,
344 0x1cccaaeb9bb1680a,
345 ]));
346
347 let mut f1_bytes = [0u8; 32];
348 f1_from_repr.write(f1_bytes.as_mut()).unwrap();
349
350 let f1 = Fq::read(f1_bytes.as_ref()).unwrap();
351 assert_eq!(f1_from_repr, f1);
352}
353
354#[test]
355fn test_fr_add() {
356 let f1 = Fr::from(BigInteger([
357 0xccfc9a195e0f5c46,
358 0xaed4874d13fb1285,
359 0x27368f86ca2848eb,
360 0x4f8adcfeb44fccc,
361 ]));
362 let f2 = Fr::from(BigInteger([
363 0x661ff05bf8570851,
364 0x1b171f4c59be97ef,
365 0x5d2ce7f9b4d701f3,
366 0x1e0e794623e0f68,
367 ]));
368 let f3 = Fr::from(BigInteger([
369 0xcba9f2991d453da6,
370 0x1eacb8e13498bc6a,
371 0x4d596ec9aecf1fd3,
372 0xcd0b95f15cd82f,
373 ]));
374 assert_eq!(f1 + &f2, f3);
375}
376
377#[test]
378fn test_fr_mul() {
379 let f1 = Fr::from(BigInteger([
380 0xc2964d2dd5fb980f,
381 0xbab64d599c57e496,
382 0x39cae13e7d1d4f78,
383 0x1aa995aa4de205c,
384 ]));
385 let f2 = Fr::from(BigInteger([
386 0xc256e720cd43533b,
387 0x3bfbadf6247e13bb,
388 0x94c3d63a53714f63,
389 0x10f8a7bf74efd57,
390 ]));
391 let f3 = Fr::from(BigInteger([
392 0x5eac88be41e0e1fd,
393 0x57aab36675b11e24,
394 0x835582d896b4d13f,
395 0x4808736e213036e,
396 ]));
397 assert_eq!(f1 * &f2, f3);
398}
399#[test]
400fn test_fr_bytes() {
401 let f1_from_repr = Fr::from(BigInteger([
402 0xc81265fb4130fe0c,
403 0xb308836c14e22279,
404 0x699e887f96bff372,
405 0x84ecc7e76c11ad,
406 ]));
407
408 let mut f1_bytes = [0u8; 32];
409 f1_from_repr.write(f1_bytes.as_mut()).unwrap();
410
411 let f1 = Fr::read(f1_bytes.as_ref()).unwrap();
412 assert_eq!(f1_from_repr, f1);
413}
414
415#[test]
416fn test_fr_from_str() {
417 let f100_from_repr = Fr::from(BigInteger([0x64, 0, 0, 0]));
418 let f100 = Fr::from_str("100").unwrap();
419 assert_eq!(f100_from_repr, f100);
420}