ark_algebra_test_templates/h2c/
mod.rs

1pub mod json;
2extern crate hex;
3extern crate serde_json;
4extern crate sha2;
5pub use hex::decode;
6pub use serde_json::from_reader;
7pub use sha2::Sha256;
8
9#[macro_export]
10macro_rules! test_h2c {
11    ($mod_name: ident; $test_path: literal; $test_name: literal; $group: ty; $field: ty; $base_prime_field: ty; $m: literal) => {
12        mod $mod_name {
13            use ark_ff::PrimeField;
14
15            extern crate std;
16            use ark_ec::{
17                hashing::{
18                    curve_maps::wb::WBMap, map_to_curve_hasher::MapToCurveBasedHasher, HashToCurve,
19                },
20                short_weierstrass::{Affine, Projective},
21            };
22            use ark_ff::{
23                field_hashers::{DefaultFieldHasher, HashToField},
24                fields::Field,
25                One, UniformRand, Zero,
26            };
27            use ark_std::{format, string::String, vec::*};
28            use std::{
29                fs::{read_dir, File},
30                io::BufReader,
31            };
32            use $crate::{decode, Sha256};
33
34            use $crate::json::SuiteVector;
35            #[test]
36            fn test_h2c() {
37                let filename = format!("{}/{}_XMD-SHA-256_SSWU_RO_.json", $test_path, $test_name);
38
39                let file = File::open(filename).unwrap();
40                let data: SuiteVector = $crate::from_reader(BufReader::new(file)).unwrap();
41
42                assert_eq!(data.hash, "sha256");
43                let dst = data.dst.as_bytes();
44                let hasher;
45                let g1_mapper = MapToCurveBasedHasher::<
46                    Projective<$group>,
47                    DefaultFieldHasher<Sha256, 128>,
48                    WBMap<$group>,
49                >::new(dst)
50                .unwrap();
51                hasher = <DefaultFieldHasher<Sha256, 128> as HashToField<$field>>::new(dst);
52
53                for v in data.vectors.iter() {
54                    // first, hash-to-field tests
55                    let got: [$base_prime_field; { 2 * $m }] =
56                        hasher.hash_to_field(&v.msg.as_bytes());
57                    let want: Vec<$base_prime_field> =
58                        v.u.iter().map(read_fq_vec).flatten().collect();
59                    assert_eq!(got[..], *want);
60
61                    // then, test curve points
62                    let x = read_fq_vec(&v.p.x);
63                    let y = read_fq_vec(&v.p.y);
64                    let got = g1_mapper.hash(&v.msg.as_bytes()).unwrap();
65                    let want = Affine::<$group>::new_unchecked(
66                        <$field>::from_base_prime_field_elems(x).unwrap(),
67                        <$field>::from_base_prime_field_elems(y).unwrap(),
68                    );
69                    assert!(got.is_on_curve());
70                    assert!(want.is_on_curve());
71                    assert_eq!(got, want);
72                }
73            }
74            pub fn read_fq_vec(input: &String) -> Vec<$base_prime_field> {
75                input
76                    .split(",")
77                    .map(|f| {
78                        <$base_prime_field>::from_be_bytes_mod_order(
79                            &decode(f.trim_start_matches("0x")).unwrap(),
80                        )
81                    })
82                    .collect()
83            }
84        }
85    };
86}