arnaucube
arnaucube/ark-curves-cherry-pickedPublic Self-hosted repository
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}