ark-curves-cherry-picked/bls12_381/src/curves/tests.rs
bls12_381/src/curves/tests.rsRaw
1#![allow(unused_imports)]
2use ark_ec::{
3 models::SWModelParameters,
4 short_weierstrass_jacobian::{GroupAffine, GroupProjective},
5 AffineCurve, PairingEngine, ProjectiveCurve,
6};
7use ark_ff::{
8 fields::{Field, FpParameters, PrimeField, SquareRootField},
9 BitIteratorBE, One, UniformRand, Zero,
10};
11use ark_serialize::CanonicalSerialize;
12use ark_std::rand::Rng;
13use ark_std::test_rng;
14use core::ops::{AddAssign, MulAssign};
15
16use crate::{g1, g2, Bls12_381, Fq, Fq12, Fq2, Fr, G1Affine, G1Projective, G2Affine, G2Projective};
17use ark_algebra_test_templates::{curves::*, groups::*};
18use ark_ec::group::Group;
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_381::pairing(sa, b);
77 let ans2 = Bls12_381::pairing(a, sb);
78 let ans3 = Bls12_381::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, 4);
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}
123
124#[test]
125fn test_g1_endomorphism_beta() {
126 assert!(g1::BETA.pow(&[3u64]).is_one());
127}
128
129#[test]
130fn test_g1_subgroup_membership_via_endomorphism() {
131 let mut rng = test_rng();
132 let generator = G1Projective::rand(&mut rng).into_affine();
133 assert!(generator.is_in_correct_subgroup_assuming_on_curve());
134}
135
136#[test]
137fn test_g1_subgroup_non_membership_via_endomorphism() {
138 let mut rng = test_rng();
139 loop {
140 let x = Fq::rand(&mut rng);
141 let greatest = rng.gen();
142
143 if let Some(p) = G1Affine::get_point_from_x(x, greatest) {
144 if !p.into_projective().mul(Fr::characteristic()).is_zero() {
145 assert!(!p.is_in_correct_subgroup_assuming_on_curve());
146 return;
147 }
148 }
149 }
150}
151
152#[test]
153fn test_g2_subgroup_membership_via_endomorphism() {
154 let mut rng = test_rng();
155 let generator = G2Projective::rand(&mut rng).into_affine();
156 assert!(generator.is_in_correct_subgroup_assuming_on_curve());
157}
158
159#[test]
160fn test_g2_subgroup_non_membership_via_endomorphism() {
161 let mut rng = test_rng();
162 loop {
163 let x = Fq2::rand(&mut rng);
164 let greatest = rng.gen();
165
166 if let Some(p) = G2Affine::get_point_from_x(x, greatest) {
167 if !p.into_projective().mul(Fr::characteristic()).is_zero() {
168 assert!(!p.is_in_correct_subgroup_assuming_on_curve());
169 return;
170 }
171 }
172 }
173}