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