ark_algebra_test_templates/h2c/
mod.rs1pub 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 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 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}