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