1use sha2::{Digest, Sha256};
5use sl_transcript::TranscriptProtocol;
6
7pub struct Sha256Transcript(Sha256);
8
9impl TranscriptProtocol for Sha256Transcript {
10 fn new(label: &'static [u8]) -> Self {
11 let mut hasher = Sha256::new();
12 hasher.update((label.len() as u64).to_le_bytes());
13 hasher.update(label);
14 Self(hasher)
15 }
16
17 fn append_message(&mut self, label: &'static [u8], message: &[u8]) {
18 self.0.update((label.len() as u64).to_le_bytes());
19 self.0.update(label);
20 self.0.update((message.len() as u64).to_le_bytes());
21 self.0.update(message);
22 }
23
24 fn append_u64(&mut self, label: &'static [u8], value: u64) {
25 self.append_message(label, &value.to_le_bytes());
26 }
27
28 fn challenge_bytes(&mut self, label: &'static [u8], dest: &mut [u8]) {
29 self.0.update((label.len() as u32).to_le_bytes());
30 self.0.update(label);
31 self.0.update((dest.len() as u32).to_le_bytes());
32 let digest = self.0.clone().finalize();
33 let n = dest.len().min(digest.len());
34 dest[..n].copy_from_slice(&digest[..n]);
35 }
36}