arcium-primitives 0.4.5

Arcium primitives
Documentation
pub use merlin::Transcript as MerlinTranscript;
use rand::SeedableRng;

use super::Transcript;
use crate::{
    hashing::flatten_slices_with_length_prefixes,
    random::{BaseRng, Seed},
    types::{identifiers::ProtocolInfo, SessionId},
};

impl Transcript for MerlinTranscript {
    type Rng = merlin::TranscriptRng;

    fn new(protocol_info: &'static ProtocolInfo, session_id: &SessionId) -> Self {
        let mut t = merlin::Transcript::new(protocol_info.name().as_bytes());
        t.append_message(b"session_id", session_id.as_ref());
        t
    }

    fn append_with<T: AsRef<[u8]>>(&mut self, label: &'static [u8], message: &T) {
        self.append_message(label, message.as_ref());
    }

    fn append_many_with<T: AsRef<[u8]>>(&mut self, label: &'static [u8], values: &[T]) {
        let concatenated = flatten_slices_with_length_prefixes(values);
        self.append_message(label, &concatenated);
    }

    fn extract(&mut self, label: &'static [u8]) -> Seed {
        let mut seed = Seed::default();
        self.challenge_bytes(label, seed.as_mut());
        seed
    }

    fn extract_rng(&mut self, label: &'static [u8]) -> Self::Rng {
        let seed = self.extract(label);
        self.build_rng().finalize(&mut BaseRng::from_seed(seed))
    }
}