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::{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}