primitives/transcripts/
protocol_transcript.rs1use 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}