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