sapling_crypto/
util.rs

1use blake2b_simd::Params;
2use ff::Field;
3use rand_core::{CryptoRng, RngCore};
4
5use super::{note_encryption::Zip212Enforcement, Rseed};
6
7pub fn hash_to_scalar(persona: &[u8], a: &[u8], b: &[u8]) -> jubjub::Fr {
8    let mut hasher = Params::new().hash_length(64).personal(persona).to_state();
9    hasher.update(a);
10    hasher.update(b);
11    let ret = hasher.finalize();
12    jubjub::Fr::from_bytes_wide(ret.as_array())
13}
14
15pub fn generate_random_rseed<R: RngCore + CryptoRng>(
16    zip212_enforcement: Zip212Enforcement,
17    rng: &mut R,
18) -> Rseed {
19    generate_random_rseed_internal(zip212_enforcement, rng)
20}
21
22pub(crate) fn generate_random_rseed_internal<R: RngCore>(
23    zip212_enforcement: Zip212Enforcement,
24    rng: &mut R,
25) -> Rseed {
26    match zip212_enforcement {
27        Zip212Enforcement::Off => Rseed::BeforeZip212(jubjub::Fr::random(rng)),
28        Zip212Enforcement::GracePeriod | Zip212Enforcement::On => {
29            let mut buffer = [0u8; 32];
30            rng.fill_bytes(&mut buffer);
31            Rseed::AfterZip212(buffer)
32        }
33    }
34}