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 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_bn254; mont(4, 4); );
16generate_field_serialization_test!(ed_on_bn254;);
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 "14396564181574133132095017386052820535110852477085064878242263917028290117882",
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 "1321267396236123309645330145349353750536542060403774171357889269349508194307",
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 "7747776931431194635550680695131420638163057297019399136408144301550822179875",
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 "7301086967624450577859019086314322648061398679982346993011603220910508457334",
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 "21380590862979124081952185245260157621176025366712756262647409092194433207997",
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_bn254_point() {
157 let a = Fq::from_str("168700").unwrap();
158
159 let d = Fq::from_str("168696").unwrap();
160 let y = Fq::from_str(
161 "19987327827845206670850937090314462639017692512983955920885166014935289314257",
162 )
163 .unwrap();
164 let x2 = Fq::from_str(
165 "2144239075372598103060889495211040948751593385312551803225522963913923559328",
166 )
167 .unwrap();
168
169 let computed_y2 = y.square();
170 let y2 = Fq::from_str(
171 "11134206686211572308995578277928848431421308813024790181507137950838333998633",
172 )
173 .unwrap();
174 assert_eq!(y2, computed_y2);
175
176 let computed_dy2 = d * &computed_y2;
177 let dy2 =
178 Fq::from_str("345576003677591687256955722467813448317229128849323754147891993737799010947")
179 .unwrap();
180 assert_eq!(dy2, computed_dy2);
181
182 let computed_divisor = computed_dy2 - a;
183 let divisor =
184 Fq::from_str("345576003677591687256955722467813448317229128849323754147891993737798842247")
185 .unwrap();
186 assert_eq!(divisor, computed_divisor);
187
188 let computed_x2 = (computed_y2 - &Fq::one()) / &computed_divisor;
189 assert_eq!(x2, computed_x2);
190
191 let x = Fq::from_str(
192 "4801447892755635304907919953550459075619191823587157449340656925102682829025",
193 )
194 .unwrap();
195 let computed_x = computed_x2.sqrt().unwrap();
196 assert_eq!(computed_x.square(), x2);
197 assert_eq!(x, computed_x);
198
199 fn add<'a>(curr: (Fq, Fq), other: &'a (Fq, Fq)) -> (Fq, Fq) {
200 let y1y2 = curr.1 * &other.1;
201 let x1x2 = curr.0 * &other.0;
202 let a = Fq::from_str("168700").unwrap();
203 let d = Fq::from_str("168696").unwrap();
204 let dx1x2y1y2 = d * &y1y2 * &x1x2;
205
206 let d1 = Fq::one() + &dx1x2y1y2;
207 let d2 = Fq::one() - &dx1x2y1y2;
208
209 let x1y2 = curr.0 * &other.1;
210 let y1x2 = curr.1 * &other.0;
211
212 let x = (x1y2 + &y1x2) / &d1;
213 let y = (y1y2 - a * &x1x2) / &d2;
214
215 (x, y)
216 }
217
218 let result = add((x, y), &(x, y));
219 let result = add(result, &result);
220 let result = add(result, &result);
221
222 let point_x =
223 Fq::from_str("380676173762867192861894055350059333852732198308367125138259398265363727587")
224 .unwrap();
225 let point_y = Fq::from_str(
226 "8435074244857818446059206728316702149733931432112984450960434710303841866985",
227 )
228 .unwrap();
229 assert_eq!((point_x, point_y), result);
230}
231
232#[test]
233fn test_fq_square_in_place() {
234 let mut f1 = Fq::from_str(
235 "6060110850233386730847324622937480088943976359504617699731744947670229990461",
236 )
237 .unwrap();
238 let f3 = Fq::from_str(
239 "17018926051730832095053393285350575966874590491719897015583930476179087429684",
240 )
241 .unwrap();
242 assert!(!f1.is_zero());
243 assert!(!f3.is_zero());
244 f1.square_in_place();
245 assert_eq!(f1, f3);
246}
247
248#[test]
249fn test_fq_from_str() {
250 let f1_from_repr = Fq::from(BigInteger::new([
251 0xab8a2535947d1a77,
252 0x9ba74cbfda0bbcda,
253 0xe928b59724d60baf,
254 0x1cccaaeb9bb1680a,
255 ]));
256 let f1 = Fq::from_str(
257 "13026376210409056429264774981357153555336288129100724591327877625017068755575",
258 )
259 .unwrap();
260 let f2_from_repr = Fq::from(BigInteger::new([
261 0x97e9103775d2f35c,
262 0xbe6756b6c587544b,
263 0x6ee38c3afd88ef4b,
264 0x2bacd150f540c677,
265 ]));
266 let f2 = Fq::from_str(
267 "19754794831832707859764530223239420866832328728734160755396495950822165902172",
268 )
269 .unwrap();
270 assert_eq!(f1_from_repr, f1);
271 assert_eq!(f2_from_repr, f2);
272}
273
274#[test]
275fn test_fq_legendre() {
276 assert_eq!(QuadraticResidue, Fq::one().legendre());
277 assert_eq!(Zero, Fq::zero().legendre());
278
279 let e = BigInteger::new([
280 0x2e8de1a676c03be8,
281 0x73350d34fe25a560,
282 0x7ea085919029688e,
283 0x1d0868cb993cf28,
284 ]);
285 assert_eq!(QuadraticResidue, Fq::from(e).legendre());
286 let e = BigInteger::new([
287 0x891d8cc23c8d0706,
288 0xe91800e007db2698,
289 0xfff380321e9ac7a7,
290 0x2659e28bd17eab6,
291 ]);
292 assert_eq!(QuadraticNonResidue, Fq::from(e).legendre());
293}
294
295#[test]
296fn test_fr_add() {
297 let f1 = Fr::from(BigInteger::new([
298 0xccfc9a195e0f5c46,
299 0xaed4874d13fb1285,
300 0x27368f86ca2848eb,
301 0x4f8adcfeb44fccc,
302 ]));
303 let f2 = Fr::from(BigInteger::new([
304 0x661ff05bf8570851,
305 0x1b171f4c59be97ef,
306 0x5d2ce7f9b4d701f3,
307 0x1e0e794623e0f68,
308 ]));
309 let f3 = Fr::from(BigInteger::new([
310 0xcba9f2991d453da6,
311 0x1eacb8e13498bc6a,
312 0x4d596ec9aecf1fd3,
313 0xcd0b95f15cd82f,
314 ]));
315 assert_eq!(f1 + &f2, f3);
316}
317
318#[test]
319fn test_fr_mul() {
320 let f1 = Fr::from(BigInteger::new([
321 0xc2964d2dd5fb980f,
322 0xbab64d599c57e496,
323 0x39cae13e7d1d4f78,
324 0x1aa995aa4de205c,
325 ]));
326 let f2 = Fr::from(BigInteger::new([
327 0xc256e720cd43533b,
328 0x3bfbadf6247e13bb,
329 0x94c3d63a53714f63,
330 0x10f8a7bf74efd57,
331 ]));
332 let f3 = Fr::from(BigInteger::new([
333 0x5eac88be41e0e1fd,
334 0x57aab36675b11e24,
335 0x835582d896b4d13f,
336 0x4808736e213036e,
337 ]));
338 assert_eq!(f1 * &f2, f3);
339}
340
341#[test]
342fn test_fr_from_str() {
343 let f100_from_repr = Fr::from(BigInteger::new([0x64, 0, 0, 0]));
344 let f100 = Fr::from_str("100").unwrap();
345 assert_eq!(f100_from_repr, f100);
346}