Skip to main content

sl_mpc_vrf/
transcript.rs

1// Copyright (c) Silence Laboratories Pte. Ltd. All Rights Reserved.
2// This software is licensed under the Silence Laboratories License Agreement.
3
4use 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}