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}