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