sendcipher_core/crypto/
checksum.rs1use blake3;
6use digest::Digest;
7
8#[repr(u16)]
9#[derive(serde::Serialize, serde::Deserialize, Clone, PartialEq, Default, Copy, Debug)]
10pub enum ChecksumAlgorithm {
11 #[default]
12 Blake3 = 1,
13 Sha256,
14 Sha384,
15 Sha512,
16}
17
18pub enum HashComputer {
19 Blake3(blake3::Hasher),
20 Sha256(sha2::Sha256),
21 Sha384(sha2::Sha384),
22 Sha512(sha2::Sha512),
23}
24
25impl ChecksumAlgorithm {
26 pub(crate) fn get_checksum_computer(&self) -> HashComputer {
27 match self {
28 ChecksumAlgorithm::Blake3 => HashComputer::Blake3(blake3::Hasher::new()),
29 ChecksumAlgorithm::Sha256 => HashComputer::Sha256(sha2::Sha256::new()),
30 ChecksumAlgorithm::Sha384 => HashComputer::Sha384(sha2::Sha384::new()),
31 ChecksumAlgorithm::Sha512 => HashComputer::Sha512(sha2::Sha512::new()),
32 }
33 }
34 pub(crate) fn checksum_length(&self) -> u32 {
35 match self {
36 ChecksumAlgorithm::Blake3 => blake3::OUT_LEN as u32,
37 ChecksumAlgorithm::Sha256 => 32u32,
38 ChecksumAlgorithm::Sha384 => 48u32,
39 ChecksumAlgorithm::Sha512 => 64u32,
40 }
41 }
42}
43
44impl HashComputer {
45 pub(crate) fn update(&mut self, data: &[u8]) {
46 match self {
47 HashComputer::Blake3(hasher) => {
48 hasher.update(data);
49 }
50 HashComputer::Sha256(hasher) => hasher.update(data),
51 HashComputer::Sha384(hasher) => hasher.update(data),
52 HashComputer::Sha512(hasher) => hasher.update(data),
53 }
54 }
55 pub(crate) fn finalize(&mut self) -> Vec<u8> {
56 match self {
57 HashComputer::Blake3(hasher) => hasher.finalize().as_bytes().to_vec(),
58 HashComputer::Sha256(hasher) => std::mem::take(hasher).finalize().to_vec(),
59 HashComputer::Sha384(hasher) => std::mem::take(hasher).finalize().to_vec(),
60 HashComputer::Sha512(hasher) => std::mem::take(hasher).finalize().to_vec(),
61 }
62 }
63}