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