ark-curves-cherry-picked/bls12_377/src/curves/tests.rs
bls12_377/src/curves/tests.rsRaw
1#![allow(unused_imports)]
2use ark_ff::{
3 fields::{Field, FpParameters, PrimeField, SquareRootField},
4 test_rng, One, Zero,
5};
6use ark_serialize::CanonicalSerialize;
7
8use ark_ec::{models::SWModelParameters, AffineCurve, PairingEngine, ProjectiveCurve};
9use core::ops::{AddAssign, MulAssign};
10use rand::Rng;
11
12use crate::{g1, g2, Bls12_377, Fq, Fq12, Fq2, Fr, G1Affine, G1Projective, G2Affine, G2Projective};
13
14use ark_curve_tests::{
15 curves::{curve_tests, sw_tests},
16 groups::group_test,
17};
18
19#[test]
20fn test_g1_projective_curve() {
21 curve_tests::<G1Projective>();
22
23 sw_tests::<g1::Parameters>();
24}
25
26#[test]
27fn test_g1_projective_group() {
28 let mut rng = test_rng();
29 let a: G1Projective = rng.gen();
30 let b: G1Projective = rng.gen();
31 group_test(a, b);
32}
33
34#[test]
35fn test_g1_generator() {
36 let generator = G1Affine::prime_subgroup_generator();
37 assert!(generator.is_on_curve());
38 assert!(generator.is_in_correct_subgroup_assuming_on_curve());
39}
40
41#[test]
42fn test_g2_projective_curve() {
43 curve_tests::<G2Projective>();
44
45 sw_tests::<g2::Parameters>();
46}
47
48#[test]
49fn test_g2_projective_group() {
50 let mut rng = test_rng();
51 let a: G2Projective = rng.gen();
52 let b: G2Projective = rng.gen();
53 group_test(a, b);
54}
55
56#[test]
57fn test_g2_generator() {
58 let generator = G2Affine::prime_subgroup_generator();
59 assert!(generator.is_on_curve());
60 assert!(generator.is_in_correct_subgroup_assuming_on_curve());
61}
62
63#[test]
64fn test_bilinearity() {
65 let mut rng = test_rng();
66 let a: G1Projective = rng.gen();
67 let b: G2Projective = rng.gen();
68 let s: Fr = rng.gen();
69
70 let mut sa = a;
71 sa.mul_assign(s);
72 let mut sb = b;
73 sb.mul_assign(s);
74
75 let ans1 = Bls12_377::pairing(sa, b);
76 let ans2 = Bls12_377::pairing(a, sb);
77 let ans3 = Bls12_377::pairing(a, b).pow(s.into_repr());
78
79 assert_eq!(ans1, ans2);
80 assert_eq!(ans2, ans3);
81
82 assert_ne!(ans1, Fq12::one());
83 assert_ne!(ans2, Fq12::one());
84 assert_ne!(ans3, Fq12::one());
85
86 assert_eq!(ans1.pow(Fr::characteristic()), Fq12::one());
87 assert_eq!(ans2.pow(Fr::characteristic()), Fq12::one());
88 assert_eq!(ans3.pow(Fr::characteristic()), Fq12::one());
89}
90
91#[test]
92fn test_g1_generator_raw() {
93 let mut x = Fq::zero();
94 let mut i = 0;
95 loop {
96 // y^2 = x^3 + b
97 let mut rhs = x;
98 rhs.square_in_place();
99 rhs.mul_assign(&x);
100 rhs.add_assign(&g1::Parameters::COEFF_B);
101
102 if let Some(y) = rhs.sqrt() {
103 let p = G1Affine::new(x, if y < -y { y } else { -y }, false);
104 assert!(!p.is_in_correct_subgroup_assuming_on_curve());
105
106 let g1 = p.scale_by_cofactor();
107 if !g1.is_zero() {
108 assert_eq!(i, 1);
109 let g1 = G1Affine::from(g1);
110
111 assert!(g1.is_in_correct_subgroup_assuming_on_curve());
112
113 assert_eq!(g1, G1Affine::prime_subgroup_generator());
114 break;
115 }
116 }
117
118 i += 1;
119 x.add_assign(&Fq::one());
120 }
121}