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