oberon/
util.rs

1/*
2    Copyright Michael Lodder. All Rights Reserved.
3    SPDX-License-Identifier: Apache-2.0
4*/
5use 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}