arnaucube
arnaucube/ark-curves-cherry-pickedPublic Self-hosted repository
ark-curves-cherry-picked/bls12_381/src/curves/tests/mod.rs
bls12_381/src/curves/tests/mod.rsRaw
  1use ark_algebra_test_templates::*;
  2use ark_ec::{AffineRepr, CurveGroup, PrimeGroup};
  3use ark_ff::{fields::Field, One, UniformRand, Zero};
  4use ark_serialize::{CanonicalDeserialize, CanonicalSerialize, Compress, Validate};
  5use ark_std::{rand::Rng, test_rng, vec};
  6
  7use crate::{Bls12_381, Fq, Fq2, Fr, G1Affine, G1Projective, G2Affine, G2Projective};
  8
  9test_group!(g1; G1Projective; sw);
 10test_group!(g2; G2Projective; sw);
 11test_group!(g1_glv; G1Projective; glv);
 12test_group!(g2_glv; G2Projective; glv);
 13test_group!(pairing_output; ark_ec::pairing::PairingOutput<Bls12_381>; msm);
 14test_pairing!(pairing; crate::Bls12_381);
 15test_h2c!(g1_h2c; "./src/curves/tests"; "BLS12381G1"; crate::g1::Config; crate::Fq; crate::Fq; 1);
 16test_h2c!(g2_hc2; "./src/curves/tests"; "BLS12381G2"; crate::g2::Config; crate::Fq2; crate::Fq; 2);
 17
 18#[test]
 19fn test_g1_endomorphism_beta() {
 20    assert!(crate::g1::BETA.pow(&[3u64]).is_one());
 21}
 22
 23#[test]
 24fn test_g1_subgroup_membership_via_endomorphism() {
 25    let mut rng = test_rng();
 26    let generator = G1Projective::rand(&mut rng).into_affine();
 27    assert!(generator.is_in_correct_subgroup_assuming_on_curve());
 28}
 29
 30#[test]
 31fn test_g1_subgroup_non_membership_via_endomorphism() {
 32    let mut rng = test_rng();
 33    loop {
 34        let x = Fq::rand(&mut rng);
 35        let greatest = rng.gen();
 36
 37        if let Some(p) = G1Affine::get_point_from_x_unchecked(x, greatest) {
 38            if !p.mul_bigint(Fr::characteristic()).is_zero() {
 39                assert!(!p.is_in_correct_subgroup_assuming_on_curve());
 40                return;
 41            }
 42        }
 43    }
 44}
 45
 46#[test]
 47fn test_g2_subgroup_membership_via_endomorphism() {
 48    let mut rng = test_rng();
 49    let generator = G2Projective::rand(&mut rng).into_affine();
 50    assert!(generator.is_in_correct_subgroup_assuming_on_curve());
 51}
 52
 53#[test]
 54fn test_g2_subgroup_non_membership_via_endomorphism() {
 55    let mut rng = test_rng();
 56    loop {
 57        let x = Fq2::rand(&mut rng);
 58        let greatest = rng.gen();
 59
 60        if let Some(p) = G2Affine::get_point_from_x_unchecked(x, greatest) {
 61            if !p.mul_bigint(Fr::characteristic()).is_zero() {
 62                assert!(!p.is_in_correct_subgroup_assuming_on_curve());
 63                return;
 64            }
 65        }
 66    }
 67}
 68
 69// Test vectors and macro adapted from https://github.com/zkcrypto/bls12_381/blob/e224ad4ea1babfc582ccd751c2bf128611d10936/src/tests/mod.rs
 70macro_rules! test_vectors {
 71    ($projective:ident, $affine:ident, $compress:expr, $expected:ident) => {
 72        let mut e = $projective::zero();
 73
 74        let mut v = vec![];
 75        {
 76            let mut expected = $expected;
 77            for _ in 0..1000 {
 78                let e_affine = $affine::from(e);
 79                let mut serialized = vec![0u8; e.serialized_size($compress)];
 80                e_affine
 81                    .serialize_with_mode(serialized.as_mut_slice(), $compress)
 82                    .unwrap();
 83                v.extend_from_slice(&serialized[..]);
 84
 85                let mut decoded = serialized;
 86                let len_of_encoding = decoded.len();
 87                (&mut decoded[..]).copy_from_slice(&expected[0..len_of_encoding]);
 88                expected = &expected[len_of_encoding..];
 89                let decoded =
 90                    $affine::deserialize_with_mode(&decoded[..], $compress, Validate::Yes).unwrap();
 91                assert_eq!(e_affine, decoded);
 92
 93                e += &$projective::generator();
 94            }
 95        }
 96
 97        assert_eq!(&v[..], $expected);
 98    };
 99}
100
101#[test]
102fn g1_compressed_valid_test_vectors() {
103    let bytes: &'static [u8] = include_bytes!("g1_compressed_valid_test_vectors.dat");
104    test_vectors!(G1Projective, G1Affine, Compress::Yes, bytes);
105}
106
107#[test]
108fn g1_uncompressed_valid_test_vectors() {
109    let bytes: &'static [u8] = include_bytes!("g1_uncompressed_valid_test_vectors.dat");
110    test_vectors!(G1Projective, G1Affine, Compress::No, bytes);
111}
112
113#[test]
114fn g2_compressed_valid_test_vectors() {
115    let bytes: &'static [u8] = include_bytes!("g2_compressed_valid_test_vectors.dat");
116    test_vectors!(G2Projective, G2Affine, Compress::Yes, bytes);
117}
118
119#[test]
120fn g2_uncompressed_valid_test_vectors() {
121    let bytes: &'static [u8] = include_bytes!("g2_uncompressed_valid_test_vectors.dat");
122    test_vectors!(G2Projective, G2Affine, Compress::No, bytes);
123}