ironfish_primitives/
keys.rs

1use blake2b_simd::{Hash as Blake2bHash, Params as Blake2bParams};
2
3pub const PRF_EXPAND_PERSONALIZATION: &[u8; 16] = b"Zcash_ExpandSeed";
4
5/// PRF^expand(sk, t) := BLAKE2b-512("Zcash_ExpandSeed", sk || t)
6pub fn prf_expand(sk: &[u8], t: &[u8]) -> Blake2bHash {
7    prf_expand_vec(sk, &[t])
8}
9
10pub fn prf_expand_vec(sk: &[u8], ts: &[&[u8]]) -> Blake2bHash {
11    let mut h = Blake2bParams::new()
12        .hash_length(64)
13        .personal(PRF_EXPAND_PERSONALIZATION)
14        .to_state();
15    h.update(sk);
16    for t in ts {
17        h.update(t);
18    }
19    h.finalize()
20}
21
22/// An outgoing viewing key
23#[derive(Clone, Copy, Debug, PartialEq)]
24pub struct OutgoingViewingKey(pub [u8; 32]);