primitives/transcripts/
protocol_transcript.rs

1use std::num::Wrapping;
2
3use serde::Serialize;
4
5use crate::{
6    transcripts::{FolkloreTranscript, Transcript},
7    types::SessionId,
8};
9
10#[derive(Debug, Clone)]
11pub struct ProtocolTranscript<T = FolkloreTranscript>
12where
13    T: Transcript,
14{
15    transcript: T,
16    counter: Wrapping<u64>,
17}
18
19impl<T: Transcript> ProtocolTranscript<T> {
20    pub fn new(label: &'static [u8]) -> Self {
21        Self {
22            transcript: T::new(label),
23            counter: Wrapping(0),
24        }
25    }
26
27    pub fn new_with_session_id(label: &'static [u8], session_id: &SessionId) -> Self {
28        Self {
29            transcript: T::new_with_session_id(label, session_id),
30            counter: Wrapping(0),
31        }
32    }
33
34    pub fn append<S: AsRef<[u8]>>(&mut self, value: S) {
35        self.transcript.append_many(
36            b"msg",
37            &[self.counter.0.to_le_bytes().as_ref(), value.as_ref()],
38        );
39    }
40
41    pub fn append_many<S: AsRef<[u8]>>(&mut self, values: &[S]) {
42        self.transcript.append_many(
43            b"msg",
44            [self.counter.0.to_le_bytes().as_ref()]
45                .into_iter()
46                .chain(values.iter().map(AsRef::as_ref))
47                .collect::<Vec<&[u8]>>()
48                .as_slice(),
49        );
50    }
51
52    pub fn extract<S: AsMut<[u8]>>(&mut self, label: &'static [u8], dest: &mut S) {
53        self.transcript.extract(label, dest)
54    }
55
56    pub fn derive_rng(&mut self, label: &'static [u8]) -> T::Rng {
57        self.transcript.derive_rng(label)
58    }
59
60    pub fn append_serializable<S: Serialize>(&mut self, value: &S) {
61        let serialized = bincode::serialize(value).unwrap();
62        self.append(&serialized);
63    }
64}