Skip to main content

sendcipher_core/crypto/
checksum.rs

1/* Created on 2025.11.29 */
2/* Copyright (c) 2025-2026 Youcef Lemsafer */
3/* SPDX-License-Identifier: MIT */
4
5use 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}