arnaucube
arnaucube/ark-curves-cherry-pickedPublic Self-hosted repository
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}