ark-crypto-primitives 0.6.0

A library of useful cryptographic primitives
Documentation
use crate::{prf::PRF, Error};
#[cfg(not(feature = "std"))]
use ark_std::vec::Vec;
use blake2::{Blake2s256 as B2s, Blake2sMac};
use digest::Digest;

#[cfg(feature = "constraints")]
pub mod constraints;

#[derive(Clone)]
pub struct Blake2s;

impl PRF for Blake2s {
    type Input = [u8; 32];
    type Output = [u8; 32];
    type Seed = [u8; 32];

    fn evaluate(seed: &Self::Seed, input: &Self::Input) -> Result<Self::Output, Error> {
        let eval_time = start_timer!(|| "Blake2s::Eval");
        let mut h = B2s::new();
        h.update(seed.as_ref());
        h.update(input.as_ref());
        let mut result = [0u8; 32];
        result.copy_from_slice(&h.finalize());
        end_timer!(eval_time);
        Ok(result)
    }
}

#[derive(Clone)]
pub struct Blake2sWithParameterBlock {
    pub output_size: u8,
    pub key_size: u8,
    pub salt: [u8; 8],
    pub personalization: [u8; 8],
}

impl Blake2sWithParameterBlock {
    pub fn evaluate(&self, input: &[u8]) -> Vec<u8> {
        use digest::{typenum::U32, FixedOutput, Update};
        let eval_time = start_timer!(|| "Blake2sWithParameterBlock::Eval");
        let mut h =
            Blake2sMac::<U32>::new_with_salt_and_personal(&[], &self.salt, &self.personalization)
                .unwrap();
        h.update(input.as_ref());
        end_timer!(eval_time);
        h.finalize_fixed().into_iter().collect()
    }
}