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))
}
}