use crate::crypto_hash::Blake2Xs;
use snarkvm_curves::AffineCurve;
#[inline]
pub fn hash_to_curve<G: AffineCurve>(input: &str) -> (G, String, usize) {
for k in 0..128 {
let message = format!("{} in {}", input, k);
if let Some(g) = try_hash_to_curve::<G>(&message) {
return (g, message, k);
}
}
panic!("Unable to hash to curve on {}", input)
}
#[inline]
pub fn try_hash_to_curve<G: AffineCurve>(input: &str) -> Option<G> {
debug_assert!(G::SERIALIZED_SIZE > 0);
let digest = Blake2Xs::evaluate(input.as_bytes(), G::SERIALIZED_SIZE as u16, "AleoHtC0".as_bytes());
debug_assert!(digest.len() == G::SERIALIZED_SIZE);
G::from_random_bytes(&digest).and_then(|g| {
debug_assert!(g.is_on_curve());
let g = g.mul_by_cofactor();
debug_assert!(g.is_on_curve());
debug_assert!(g.is_in_correct_subgroup_assuming_on_curve());
(!g.is_zero()).then(|| g)
})
}