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