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