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