1use crate::inner_types::{elliptic_curve::hash2curve::ExpandMsgXof, G1Projective, Scalar};
6use digest::{ExtendableOutput, Update, XofReader};
7use sha3::Shake256;
8
9const TO_SCALAR_DST: &[u8] = b"OBERON_BLS12381FQ_XOF:SHAKE-256_";
10const TO_CURVE_DST: &[u8] = b"OBERON_BLS12381G1_XOF:SHAKE-256_SSWU_RO_";
11
12pub fn hash_to_scalar(data: &[&[u8]]) -> Scalar {
13 let mut hasher = Shake256::default();
14 hasher.update(TO_SCALAR_DST);
15 for slice in data {
16 hasher.update(slice);
17 }
18 let mut reader = hasher.finalize_xof();
19 let mut data = [0u8; 48];
20 reader.read(&mut data);
21 Scalar::from_okm(&data)
22}
23
24pub fn hash_to_scalars(data: &[&[u8]], out: &mut [Scalar]) {
25 let mut hasher = Shake256::default();
26 hasher.update(TO_SCALAR_DST);
27 for slice in data {
28 hasher.update(slice);
29 }
30 let mut reader = hasher.finalize_xof();
31 let mut data = [0u8; 48];
32 for s in out {
33 reader.read(&mut data);
34 *s = Scalar::from_okm(&data);
35 }
36}
37
38pub fn hash_to_curve(data: &[u8]) -> G1Projective {
39 G1Projective::hash::<ExpandMsgXof<Shake256>>(data, TO_CURVE_DST)
40}