binius_examples/circuits/
blake2s.rs1use anyhow::Result;
5use binius_circuits::blake2s::Blake2s;
6use binius_frontend::{CircuitBuilder, WitnessFiller};
7use blake2::{Blake2s256, Digest};
8
9use super::utils::{self, HasherInstance, HasherMode, HasherParams};
10use crate::ExampleCircuit;
11
12pub struct Blake2sExample {
14 blake2s_gadget: Blake2s,
15 mode: HasherMode,
16}
17
18impl ExampleCircuit for Blake2sExample {
19 type Params = HasherParams;
20 type Instance = HasherInstance;
21
22 fn build(params: HasherParams, builder: &mut CircuitBuilder) -> Result<Self> {
23 let mode = utils::resolve_hasher_mode(¶ms, "Blake2s", false)?;
26 let HasherMode::Fixed { len_bytes } = mode else {
27 unreachable!("Blake2s only supports the fixed-length gadget")
28 };
29
30 let blake2s_gadget = Blake2s::new_witness(builder, len_bytes);
32
33 Ok(Self {
34 blake2s_gadget,
35 mode,
36 })
37 }
38
39 fn populate_witness(&self, instance: HasherInstance, w: &mut WitnessFiller<'_>) -> Result<()> {
40 let message = utils::resolve_hasher_message(&self.mode, &instance)?;
41
42 let mut hasher = Blake2s256::new();
44 hasher.update(&message);
45 let digest: [u8; 32] = hasher.finalize().into();
46
47 self.blake2s_gadget.populate_message(w, &message);
49 self.blake2s_gadget.populate_digest(w, &digest);
50
51 Ok(())
52 }
53
54 fn param_summary(params: &Self::Params) -> Option<String> {
55 utils::hasher_param_summary(params)
56 }
57}