1
//! See [`Blake3`].
2

            
3
use blake3::Hasher;
4
use digest::{BlockInput, FixedOutput, Reset, Update};
5
use generic_array::{typenum::U64, GenericArray};
6

            
7
/// Object implementing [`Hash`](opaque_ke::hash::Hash) for BLAKE3. This
8
/// encapsulates [`blake3::Hasher`] over a 64-bit output size.
9
6672
#[derive(Clone, Default)]
10
pub(crate) struct Blake3(Hasher);
11

            
12
impl Update for Blake3 {
13
12383
	fn update(&mut self, data: impl AsRef<[u8]>) {
14
12383
		Update::update(&mut self.0, data);
15
12383
	}
16
}
17

            
18
impl BlockInput for Blake3 {
19
	type BlockSize = <Hasher as BlockInput>::BlockSize;
20
}
21

            
22
impl FixedOutput for Blake3 {
23
	type OutputSize = U64;
24

            
25
4195
	fn finalize_into(self, out: &mut GenericArray<u8, Self::OutputSize>) {
26
4195
		self.0.finalize_xof().fill(out);
27
4195
	}
28

            
29
	fn finalize_into_reset(&mut self, out: &mut GenericArray<u8, Self::OutputSize>) {
30
		self.0.finalize_xof().fill(out);
31
		self.0.reset();
32
	}
33
}
34

            
35
impl Reset for Blake3 {
36
1833
	fn reset(&mut self) {
37
1833
		Reset::reset(&mut self.0);
38
1833
	}
39
}