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