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}