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 fields::{Field, LegendreSymbol::*, PrimeField},
7 One, UniformRand, Zero,
8};
9use ark_serialize::{buffer_bit_byte_size, CanonicalSerialize};
10use ark_std::{rand::Rng, str::FromStr, test_rng};
11use core::ops::{AddAssign, MulAssign, SubAssign};
12
13use crate::{Fq, FqConfig, Fr, FrConfig};
14
15generate_field_test!(ed_on_bls12_381; mont(4, 4); );
16generate_field_serialization_test!(ed_on_bls12_381;);
17
18#[test]
19fn test_fq_add() {
20 let f1 = Fq::from_str(
21 "18386742314266644595564329008376577163854043021652781768352795308532764650733",
22 )
23 .unwrap();
24 let f2 = Fq::from_str(
25 "39786307610986038981023499868190793548353538256264351797285876981647142458383",
26 )
27 .unwrap();
28 let f3 = Fq::from_str(
29 "5737174750126493097140088368381404874517028777389495743035013590241325924603",
30 )
31 .unwrap();
32 assert!(!f1.is_zero());
33 assert!(!f2.is_zero());
34 assert!(!f3.is_zero());
35 assert_eq!(f1 + &f2, f3);
36}
37
38#[test]
39fn test_fq_add_one() {
40 let f1 = Fq::from_str(
41 "4946875394261337176810256604189376311946643975348516311606738923340201185904",
42 )
43 .unwrap();
44 let f2 = Fq::from_str(
45 "4946875394261337176810256604189376311946643975348516311606738923340201185905",
46 )
47 .unwrap();
48 assert!(!f1.is_zero());
49 assert!(!f2.is_zero());
50 assert_eq!(f1 + &Fq::one(), f2);
51}
52
53#[test]
54fn test_fq_mul() {
55 let f1 = Fq::from_str(
56 "24703123148064348394273033316595937198355721297494556079070134653139656190956",
57 )
58 .unwrap();
59 let f2 = Fq::from_str(
60 "38196797080882758914424853878212529985425118523754343117256179679117054302131",
61 )
62 .unwrap();
63 let f3 = Fq::from_str(
64 "38057113854472161555556064369220825628027487067886761874351491955834635348140",
65 )
66 .unwrap();
67 assert!(!f1.is_zero());
68 assert!(!f2.is_zero());
69 assert!(!f3.is_zero());
70 assert_eq!(f1 * &f2, f3);
71}
72
73#[test]
74fn test_fq_triple_mul() {
75 let f1 = Fq::from_str(
76 "23834398828139479510988224171342199299644042568628082836691700490363123893905",
77 )
78 .unwrap();
79 let f2 = Fq::from_str(
80 "48343809612844640454129919255697536258606705076971130519928764925719046689317",
81 )
82 .unwrap();
83 let f3 = Fq::from_str(
84 "22704845471524346880579660022678666462201713488283356385810726260959369106033",
85 )
86 .unwrap();
87 let f4 = Fq::from_str(
88 "18897508522635316277030308074760673440128491438505204942623624791502972539393",
89 )
90 .unwrap();
91 assert!(!f1.is_zero());
92 assert!(!f2.is_zero());
93 assert!(!f3.is_zero());
94 assert_eq!(f1 * &f2 * &f3, f4);
95}
96
97#[test]
98fn test_fq_div() {
99 let f1 = Fq::from_str(
100 "31892744363926593013886463524057935370302352424137349660481695792871889573091",
101 )
102 .unwrap();
103 let f2 = Fq::from_str(
104 "47695868328933459965610498875668250916462767196500056002116961816137113470902",
105 )
106 .unwrap();
107 let f3 = Fq::from_str(
108 "29049672724678710659792141917402891276693777283079976086581207190825261000580",
109 )
110 .unwrap();
111 assert!(!f1.is_zero());
112 assert!(!f2.is_zero());
113 assert!(!f3.is_zero());
114 assert_eq!(f1 / &f2, f3);
115}
116
117#[test]
118fn test_fq_sub() {
119 let f1 = Fq::from_str(
120 "18695869713129401390241150743745601908470616448391638969502807001833388904079",
121 )
122 .unwrap();
123 let f2 = Fq::from_str(
124 "10105476028534616828778879109836101003805485072436929139123765141153277007373",
125 )
126 .unwrap();
127 let f3 = Fq::from_str(
128 "8590393684594784561462271633909500904665131375954709830379041860680111896706",
129 )
130 .unwrap();
131 assert!(!f1.is_zero());
132 assert!(!f2.is_zero());
133 assert!(!f3.is_zero());
134 assert_eq!(f1 - &f2, f3);
135}
136
137#[test]
138fn test_fq_double_in_place_thrice() {
139 let mut f1 = Fq::from_str(
140 "32768907806651393940832831055386272949401004221411141755415956893066040832473",
141 )
142 .unwrap();
143 let f3 = Fq::from_str(
144 "52407761752706389608871686410346320244445823769178582752913020344774001921732",
145 )
146 .unwrap();
147 assert!(!f1.is_zero());
148 assert!(!f3.is_zero());
149 f1.double_in_place();
150 f1.double_in_place();
151 f1.double_in_place();
152 assert_eq!(f1, f3);
153}
154
155#[test]
156fn test_fq_generate_random_ed_on_bls12_381_point() {
157 let d = Fq::from_str(
158 "19257038036680949359750312669786877991949435402254120286184196891950884077233",
159 )
160 .unwrap();
161 let y = Fq::from_str(
162 "20269054604167148422407276086932743904275456233139568486008667107872965128512",
163 )
164 .unwrap();
165 let x2 = Fq::from_str(
166 "35041048504708632193693740149219726446678304552734087046982753200179718192840",
167 )
168 .unwrap();
169
170 let computed_y2 = y.square();
171 let y2 = Fq::from_str(
172 "22730681238307918419349440108285755984465605552827817317611903495170775437833",
173 )
174 .unwrap();
175 assert_eq!(y2, computed_y2);
176
177 let computed_dy2 = d * &computed_y2;
178 let dy2 = Fq::from_str(
179 "24720347560552809545835752815204882739669031262711919770503096707526812943411",
180 )
181 .unwrap();
182 assert_eq!(dy2, computed_dy2);
183
184 let computed_divisor = computed_dy2 + &Fq::one();
185 let divisor = Fq::from_str(
186 "24720347560552809545835752815204882739669031262711919770503096707526812943412",
187 )
188 .unwrap();
189 assert_eq!(divisor, computed_divisor);
190
191 let computed_x2 = (computed_y2 - &Fq::one()) / &computed_divisor;
192 assert_eq!(x2, computed_x2);
193
194 let x = Fq::from_str(
195 "15337652609730546173818014678723269532482775720866471265774032070871608223361",
196 )
197 .unwrap();
198 let computed_x = computed_x2.sqrt().unwrap();
199 assert_eq!(computed_x.square(), x2);
200 assert_eq!(x, computed_x);
201
202 fn add<'a>(curr: (Fq, Fq), other: &'a (Fq, Fq)) -> (Fq, Fq) {
203 let y1y2 = curr.1 * &other.1;
204 let x1x2 = curr.0 * &other.0;
205 let d = Fq::from_str(
206 "19257038036680949359750312669786877991949435402254120286184196891950884077233",
207 )
208 .unwrap();
209 let dx1x2y1y2 = d * &y1y2 * &x1x2;
210
211 let d1 = Fq::one() + &dx1x2y1y2;
212 let d2 = Fq::one() - &dx1x2y1y2;
213
214 let x1y2 = curr.0 * &other.1;
215 let y1x2 = curr.1 * &other.0;
216
217 let x = (x1y2 + &y1x2) / &d1;
218 let y = (y1y2 + &x1x2) / &d2;
219
220 (x, y)
221 }
222
223 let result = add((x, y), &(x, y));
224 let result = add(result, &result);
225 let result = add(result, &result);
226
227 let point_x = Fq::from_str(
228 "47259664076168047050113154262636619161204477920503059672059915868534495873964",
229 )
230 .unwrap();
231 let point_y = Fq::from_str(
232 "19016409245280491801573912449420132838852726543024859389273314249842195919690",
233 )
234 .unwrap();
235 assert_eq!((point_x, point_y), result);
236}
237
238#[test]
239fn test_fq_square_in_place() {
240 let mut f1 = Fq::from_str(
241 "34864651240005695523200639428464570946052769938774601449735727714436878540682",
242 )
243 .unwrap();
244 let f3 =
245 Fq::from_str("213133100629336594719108316042277780359104840987226496279264105585804377948")
246 .unwrap();
247 assert!(!f1.is_zero());
248 assert!(!f3.is_zero());
249 f1.square_in_place();
250 assert_eq!(f1, f3);
251}
252
253#[test]
254fn test_fq_from_str() {
255 let f1_from_repr = Fq::from(BigInteger::new([
256 0xab8a2535947d1a77,
257 0x9ba74cbfda0bbcda,
258 0xe928b59724d60baf,
259 0x1cccaaeb9bb1680a,
260 ]));
261 let f1 = Fq::from_str(
262 "13026376210409056429264774981357153555336288129100724591327877625017068755575",
263 )
264 .unwrap();
265 let f2_from_repr = Fq::from(BigInteger::new([
266 0x97e9103775d2f35c,
267 0xbe6756b6c587544b,
268 0x6ee38c3afd88ef4b,
269 0x2bacd150f540c677,
270 ]));
271 let f2 = Fq::from_str(
272 "19754794831832707859764530223239420866832328728734160755396495950822165902172",
273 )
274 .unwrap();
275 assert_eq!(f1_from_repr, f1);
276 assert_eq!(f2_from_repr, f2);
277}
278
279#[test]
280fn test_fq_legendre() {
281 assert_eq!(QuadraticResidue, Fq::one().legendre());
282 assert_eq!(Zero, Fq::zero().legendre());
283
284 let e = BigInteger::new([
285 0x0dbc5349cd5664da,
286 0x8ac5b6296e3ae29d,
287 0x127cb819feceaa3b,
288 0x3a6b21fb03867191,
289 ]);
290 assert_eq!(QuadraticResidue, Fq::from(e).legendre());
291 let e = BigInteger::new([
292 0x96341aefd047c045,
293 0x9b5f4254500a4d65,
294 0x1ee08223b68ac240,
295 0x31d9cd545c0ec7c6,
296 ]);
297 assert_eq!(QuadraticNonResidue, Fq::from(e).legendre());
298}
299
300#[test]
301fn test_fr_add() {
302 let f1 = Fr::from(BigInteger::new([
303 0xc81265fb4130fe0c,
304 0xb308836c14e22279,
305 0x699e887f96bff372,
306 0x84ecc7e76c11ad,
307 ]));
308 let f2 = Fr::from(BigInteger::new([
309 0x71875719b422efb8,
310 0x43658e68a93612,
311 0x9fa756be2011e833,
312 0xaa2b2cb08dac497,
313 ]));
314 let f3 = Fr::from(BigInteger::new([
315 0x3999bd14f553edc4,
316 0xb34be8fa7d8b588c,
317 0x945df3db6d1dba5,
318 0xb279f92f046d645,
319 ]));
320 assert_eq!(f1 + &f2, f3);
321}
322
323#[test]
324fn test_fr_mul() {
325 let f1 = Fr::from(BigInteger::new([
326 0xc81265fb4130fe0c,
327 0xb308836c14e22279,
328 0x699e887f96bff372,
329 0x84ecc7e76c11ad,
330 ]));
331 let f2 = Fr::from(BigInteger::new([
332 0x71875719b422efb8,
333 0x43658e68a93612,
334 0x9fa756be2011e833,
335 0xaa2b2cb08dac497,
336 ]));
337 let f3 = Fr::from(BigInteger::new([
338 0x6d6618ac6b4a8381,
339 0x5b9eb35d711ee1da,
340 0xce83310e6ac4105d,
341 0x98032e0f206320a,
342 ]));
343 assert_eq!(f1 * &f2, f3);
344}
345
346#[test]
347fn test_fr_from_str() {
348 let f100_from_repr = Fr::from(BigInteger::new([0x64, 0, 0, 0]));
349 let f100 = Fr::from_str("100").unwrap();
350 assert_eq!(f100_from_repr, f100);
351}