halo2curves_axiom/bn256/
mod.rs

1mod curve;
2mod engine;
3mod fq;
4mod fq12;
5mod fq2;
6mod fq6;
7mod fr;
8
9#[cfg(feature = "asm")]
10mod assembly;
11
12pub use curve::*;
13pub use engine::*;
14pub use fq::*;
15pub use fq12::*;
16pub use fq2::*;
17pub use fq6::*;
18pub use fr::*;
19
20#[cfg(test)]
21mod test {
22    use super::G1 as Bn256Point;
23    use group::GroupEncoding;
24    use pasta_curves::arithmetic::CurveExt;
25    use rand_core::{RngCore, SeedableRng};
26
27    #[test]
28    fn test_consistent_hash_to_curve() {
29        // The goal of this test is to generate test vectors to ensure that the ASM implementation
30        // matches the rust implementation.
31        let num_vecs = 10;
32
33        // Test vectors generated with rust implementation.
34        let expected_results = [
35            "e0c5a6834e0329b4f8bdc91144b3e687ac9d810a8e899415267db9cfbf61e91e",
36            "7052a20bee99cbe054fdd8b2e336db3ed3e9a265229e44ab8197c5eabdef2b0b",
37            "2f058acc133957074ac79e9b9b1867a0cf3d13df7aa7de7f48e9a6be7d96aa6d",
38            "b2ff44a25693b811f35e33feb3e99ad9ba0d06425a3ffd5e79cef63d20143314",
39            "ab2f6d71d2fde51546d8a5782aa9f707e585b84644470f0c876784dbebd30c55",
40            "6a4e0e30f37a8d1b92b8cf08df3735a36b4937ee455a9dc5f9283a13530db144",
41            "f1c69be8c5f5f9e28b0e9f76ab77651a7dcaaae371fbba66450cbcee0ed5b16b",
42            "e86267c2e3355d7a6f664a0ea71374406337d452a3f9a294a0594df53c08df21",
43            "03cf55ca983ecd8a2e2baae18d979d97d688a978d829701c66a14d7c4da58e62",
44            "5302c2cfe3c909e9378d08c951bb33d0813818a1baf734379aac8aaa47f38f0d",
45        ];
46
47        let mut seeded_rng = rand_chacha::ChaChaRng::seed_from_u64(0u64);
48        let uniform_bytes = std::iter::from_fn(|| {
49            let mut bytes = [0u8; 32];
50            seeded_rng.fill_bytes(&mut bytes);
51            Some(bytes)
52        })
53        .take(num_vecs)
54        .collect::<Vec<_>>();
55        let hash = Bn256Point::hash_to_curve("from_uniform_bytes");
56        for i in 0..num_vecs {
57            let p = hash(&uniform_bytes[i]);
58            let expected_result = hex::decode(expected_results[i]).unwrap();
59            assert_eq!(
60                p.to_bytes().as_ref(),
61                &expected_result[..],
62                "hash_to_curve_print failed, expected: {}, got: {}",
63                expected_results[i],
64                hex::encode(p.to_bytes().as_ref())
65            );
66        }
67    }
68}