elliptic_curve/hash2curve/
hash2field.rs1mod expand_msg;
6
7pub use expand_msg::{xmd::*, xof::*, *};
8
9use crate::{Error, Result};
10use generic_array::{typenum::Unsigned, ArrayLength, GenericArray};
11
12pub trait FromOkm {
14 type Length: ArrayLength<u8>;
16
17 fn from_okm(data: &GenericArray<u8, Self::Length>) -> Self;
19}
20
21#[doc(hidden)]
35pub fn hash_to_field<'a, E, T>(data: &[&[u8]], domain: &'a [&'a [u8]], out: &mut [T]) -> Result<()>
36where
37 E: ExpandMsg<'a>,
38 T: FromOkm + Default,
39{
40 let len_in_bytes = T::Length::to_usize().checked_mul(out.len()).ok_or(Error)?;
41 let mut tmp = GenericArray::<u8, <T as FromOkm>::Length>::default();
42 let mut expander = E::expand_message(data, domain, len_in_bytes)?;
43 for o in out.iter_mut() {
44 expander.fill_bytes(&mut tmp);
45 *o = T::from_okm(&tmp);
46 }
47 Ok(())
48}