crc32 impl

This commit is contained in:
2025-08-17 14:34:40 -04:00
parent 5a6311f20f
commit fc65411915
2 changed files with 77 additions and 6 deletions

View File

@@ -54,7 +54,7 @@ pub enum HashReturn {
impl HashReturn {
pub fn into_bytes(self) -> Arc<[u8]> {
match self {
HashReturn::CRC32(inner) => Arc::new(inner.to_le_bytes()),
HashReturn::CRC32(inner) => Arc::new(inner.to_be_bytes()),
HashReturn::SHA256(inner) => Arc::new(inner),
HashReturn::SHA3_256(inner) => Arc::new(inner),
HashReturn::BLAKE256(inner) => Arc::new(inner),

View File

@@ -1,20 +1,63 @@
use super::*;
use crc::Table;
pub enum CRC32TYPE {
CKSUM,
XFER,
ISO,
}
pub struct CRC32 {
hash: BITS32,
crc32type: CRC32TYPE,
digester: ::crc::Digest<'static, u32, Table<16>>,
}
/// CRC_32_ISO_HDLC
const CRC32_ISO: ::crc::Crc<u32, Table<16>> =
::crc::Crc::<u32, Table<16>>::new(&::crc::CRC_32_ISO_HDLC);
pub fn crc32_iso() -> CRC32 {
CRC32 {
hash: 0,
crc32type: CRC32TYPE::ISO,
digester: CRC32_ISO.digest(),
}
}
/// CRC_32_XFER
const CRC32_XFER: ::crc::Crc<u32, Table<16>> =
::crc::Crc::<u32, Table<16>>::new(&::crc::CRC_32_XFER);
pub fn crc32_xfer() -> CRC32 {
CRC32 {
hash: 0,
crc32type: CRC32TYPE::XFER,
digester: CRC32_XFER.digest(),
}
}
/// CRC_32_CKSUM
const CRC32_CKSUM: ::crc::Crc<u32, Table<16>> =
::crc::Crc::<u32, Table<16>>::new(&::crc::CRC_32_CKSUM);
pub fn crc32_cksum() -> CRC32 {
CRC32 {
hash: 0,
crc32type: CRC32TYPE::CKSUM,
digester: CRC32_CKSUM.digest(),
}
}
impl Hasher for CRC32 {
/// Defaults to CRC32_ISO_HDLC, most likely choice for CRC32
/// Use the other crc32_* fns to get other crc32 hasher types
fn new() -> Self {
CRC32 { hash: 0 }
crc32_iso()
}
fn digest(&mut self, bytes: impl AsRef<[u8]>) {
todo!()
self.digester.update(bytes.as_ref())
}
fn complete(self) -> HashReturn {
todo!()
HashReturn::CRC32(self.digester.finalize())
}
}
@@ -23,7 +66,35 @@ mod test {
use super::*;
#[test]
fn test_crc32_hash() {
todo!();
fn test_crc32_hashes() {
let input_1 = "Hello";
let input_2 = "World";
let expected_iso = "77770c79";
let expected_cksum = "b9e23d07";
let expected_xfer = "9810e2bb";
let mut iso = CRC32::new();
let mut cksum = crc32_cksum();
let mut xfer = crc32_xfer();
iso.digest(input_1);
iso.digest(input_2);
cksum.digest(input_1);
cksum.digest(input_2);
xfer.digest(input_1);
xfer.digest(input_2);
let iso_result = iso.complete().into_bytes();
let cksum_result = cksum.complete().into_bytes();
let xfer_result = xfer.complete().into_bytes();
let iso_hash = crate::hex_table::u8_array_to_lower_hex_string(&iso_result).unwrap();
let cksum_hash = crate::hex_table::u8_array_to_lower_hex_string(&cksum_result).unwrap();
let xfer_hash = crate::hex_table::u8_array_to_lower_hex_string(&xfer_result).unwrap();
assert_eq!(iso_hash, expected_iso);
assert_eq!(cksum_hash, expected_cksum);
assert_eq!(xfer_hash, expected_xfer);
}
}