Files
hashstream/src/hashes/crc32.rs

98 lines
2.5 KiB
Rust

use super::*;
use crc::Table;
#[derive(Debug, Copy, Clone, Eq, PartialEq)]
pub enum CRC32TYPE {
CKSUM,
XFER,
ISO,
}
pub struct CRC32 {
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 {
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 {
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 {
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_iso()
}
fn digest(&mut self, bytes: impl AsRef<[u8]>) {
self.digester.update(bytes.as_ref())
}
fn complete(self) -> HashReturn {
HashReturn::CRC32(self.digester.finalize(), self.crc32type)
}
}
#[cfg(test)]
mod test {
use super::*;
#[test]
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);
}
}