ark-curves-cherry-picked/ed_on_bls12_381/src/fields/tests.rs
ed_on_bls12_381/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_bls12_381; mont(4, 4); );
17generate_field_serialization_test!(ed_on_bls12_381;);
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 "5737174750126493097140088368381404874517028777389495743035013590241325924603",
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 "38057113854472161555556064369220825628027487067886761874351491955834635348140",
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 "18897508522635316277030308074760673440128491438505204942623624791502972539393",
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 "29049672724678710659792141917402891276693777283079976086581207190825261000580",
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 "52407761752706389608871686410346320244445823769178582752913020344774001921732",
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_bls12_381_point() {
158 let d = Fq::from_str(
159 "19257038036680949359750312669786877991949435402254120286184196891950884077233",
160 )
161 .unwrap();
162 let y = Fq::from_str(
163 "20269054604167148422407276086932743904275456233139568486008667107872965128512",
164 )
165 .unwrap();
166 let x2 = Fq::from_str(
167 "35041048504708632193693740149219726446678304552734087046982753200179718192840",
168 )
169 .unwrap();
170
171 let computed_y2 = y.square();
172 let y2 = Fq::from_str(
173 "22730681238307918419349440108285755984465605552827817317611903495170775437833",
174 )
175 .unwrap();
176 assert_eq!(y2, computed_y2);
177
178 let computed_dy2 = d * &computed_y2;
179 let dy2 = Fq::from_str(
180 "24720347560552809545835752815204882739669031262711919770503096707526812943411",
181 )
182 .unwrap();
183 assert_eq!(dy2, computed_dy2);
184
185 let computed_divisor = computed_dy2 + &Fq::one();
186 let divisor = Fq::from_str(
187 "24720347560552809545835752815204882739669031262711919770503096707526812943412",
188 )
189 .unwrap();
190 assert_eq!(divisor, computed_divisor);
191
192 let computed_x2 = (computed_y2 - &Fq::one()) / &computed_divisor;
193 assert_eq!(x2, computed_x2);
194
195 let x = Fq::from_str(
196 "15337652609730546173818014678723269532482775720866471265774032070871608223361",
197 )
198 .unwrap();
199 let computed_x = computed_x2.sqrt().unwrap();
200 assert_eq!(computed_x.square(), x2);
201 assert_eq!(x, computed_x);
202
203 fn add<'a>(curr: (Fq, Fq), other: &'a (Fq, Fq)) -> (Fq, Fq) {
204 let y1y2 = curr.1 * &other.1;
205 let x1x2 = curr.0 * &other.0;
206 let d = Fq::from_str(
207 "19257038036680949359750312669786877991949435402254120286184196891950884077233",
208 )
209 .unwrap();
210 let dx1x2y1y2 = d * &y1y2 * &x1x2;
211
212 let d1 = Fq::one() + &dx1x2y1y2;
213 let d2 = Fq::one() - &dx1x2y1y2;
214
215 let x1y2 = curr.0 * &other.1;
216 let y1x2 = curr.1 * &other.0;
217
218 let x = (x1y2 + &y1x2) / &d1;
219 let y = (y1y2 + &x1x2) / &d2;
220
221 (x, y)
222 }
223
224 let result = add((x, y), &(x, y));
225 let result = add(result, &result);
226 let result = add(result, &result);
227
228 let point_x = Fq::from_str(
229 "47259664076168047050113154262636619161204477920503059672059915868534495873964",
230 )
231 .unwrap();
232 let point_y = Fq::from_str(
233 "19016409245280491801573912449420132838852726543024859389273314249842195919690",
234 )
235 .unwrap();
236 assert_eq!((point_x, point_y), result);
237}
238
239#[test]
240fn test_fq_square_in_place() {
241 let mut f1 = Fq::from_str(
242 "34864651240005695523200639428464570946052769938774601449735727714436878540682",
243 )
244 .unwrap();
245 let f3 =
246 Fq::from_str("213133100629336594719108316042277780359104840987226496279264105585804377948")
247 .unwrap();
248 assert!(!f1.is_zero());
249 assert!(!f3.is_zero());
250 f1.square_in_place();
251 assert_eq!(f1, f3);
252}
253
254#[test]
255fn test_fq_from_str() {
256 let f1_from_repr = Fq::from(BigInteger::new([
257 0xab8a2535947d1a77,
258 0x9ba74cbfda0bbcda,
259 0xe928b59724d60baf,
260 0x1cccaaeb9bb1680a,
261 ]));
262 let f1 = Fq::from_str(
263 "13026376210409056429264774981357153555336288129100724591327877625017068755575",
264 )
265 .unwrap();
266 let f2_from_repr = Fq::from(BigInteger::new([
267 0x97e9103775d2f35c,
268 0xbe6756b6c587544b,
269 0x6ee38c3afd88ef4b,
270 0x2bacd150f540c677,
271 ]));
272 let f2 = Fq::from_str(
273 "19754794831832707859764530223239420866832328728734160755396495950822165902172",
274 )
275 .unwrap();
276 assert_eq!(f1_from_repr, f1);
277 assert_eq!(f2_from_repr, f2);
278}
279
280#[test]
281fn test_fq_legendre() {
282 assert_eq!(QuadraticResidue, Fq::one().legendre());
283 assert_eq!(Zero, Fq::zero().legendre());
284
285 let e = BigInteger::new([
286 0x0dbc5349cd5664da,
287 0x8ac5b6296e3ae29d,
288 0x127cb819feceaa3b,
289 0x3a6b21fb03867191,
290 ]);
291 assert_eq!(QuadraticResidue, Fq::from(e).legendre());
292 let e = BigInteger::new([
293 0x96341aefd047c045,
294 0x9b5f4254500a4d65,
295 0x1ee08223b68ac240,
296 0x31d9cd545c0ec7c6,
297 ]);
298 assert_eq!(QuadraticNonResidue, Fq::from(e).legendre());
299}
300
301#[test]
302fn test_fq_bytes() {
303 let f1_from_repr = Fq::from(BigInteger::new([
304 0xab8a2535947d1a77,
305 0x9ba74cbfda0bbcda,
306 0xe928b59724d60baf,
307 0x1cccaaeb9bb1680a,
308 ]));
309
310 let mut f1_bytes = [0u8; 32];
311 f1_from_repr.write(f1_bytes.as_mut()).unwrap();
312
313 let f1 = Fq::read(f1_bytes.as_ref()).unwrap();
314 assert_eq!(f1_from_repr, f1);
315}
316
317#[test]
318fn test_fr_add() {
319 let f1 = Fr::from(BigInteger::new([
320 0xc81265fb4130fe0c,
321 0xb308836c14e22279,
322 0x699e887f96bff372,
323 0x84ecc7e76c11ad,
324 ]));
325 let f2 = Fr::from(BigInteger::new([
326 0x71875719b422efb8,
327 0x43658e68a93612,
328 0x9fa756be2011e833,
329 0xaa2b2cb08dac497,
330 ]));
331 let f3 = Fr::from(BigInteger::new([
332 0x3999bd14f553edc4,
333 0xb34be8fa7d8b588c,
334 0x945df3db6d1dba5,
335 0xb279f92f046d645,
336 ]));
337 assert_eq!(f1 + &f2, f3);
338}
339
340#[test]
341fn test_fr_mul() {
342 let f1 = Fr::from(BigInteger::new([
343 0xc81265fb4130fe0c,
344 0xb308836c14e22279,
345 0x699e887f96bff372,
346 0x84ecc7e76c11ad,
347 ]));
348 let f2 = Fr::from(BigInteger::new([
349 0x71875719b422efb8,
350 0x43658e68a93612,
351 0x9fa756be2011e833,
352 0xaa2b2cb08dac497,
353 ]));
354 let f3 = Fr::from(BigInteger::new([
355 0x6d6618ac6b4a8381,
356 0x5b9eb35d711ee1da,
357 0xce83310e6ac4105d,
358 0x98032e0f206320a,
359 ]));
360 assert_eq!(f1 * &f2, f3);
361}
362
363#[test]
364fn test_fr_bytes() {
365 let f1_from_repr = Fr::from(BigInteger::new([
366 0xc81265fb4130fe0c,
367 0xb308836c14e22279,
368 0x699e887f96bff372,
369 0x84ecc7e76c11ad,
370 ]));
371
372 let mut f1_bytes = [0u8; 32];
373 f1_from_repr.write(f1_bytes.as_mut()).unwrap();
374
375 let f1 = Fr::read(f1_bytes.as_ref()).unwrap();
376 assert_eq!(f1_from_repr, f1);
377}
378
379#[test]
380fn test_fr_from_str() {
381 let f100_from_repr = Fr::from(BigInteger::new([0x64, 0, 0, 0]));
382 let f100 = Fr::from_str("100").unwrap();
383 assert_eq!(f100_from_repr, f100);
384}