extern crate alloc;
use alloc::vec::Vec;
use digest::Digest as _;
#[derive(Clone, Copy, Debug, PartialEq, Eq)]
pub enum MdType {
SM3,
Sha256,
}
pub trait Digest {
fn new() -> Self
where
Self: Sized;
fn update(&mut self, data: &[u8]);
fn finalize(self) -> Vec<u8>;
fn output_size() -> usize;
fn name() -> &'static str;
}
#[derive(Clone)]
pub struct Sm3 {
inner: sm3::Sm3,
}
impl Digest for Sm3 {
fn new() -> Self {
Self {
inner: sm3::Sm3::new(),
}
}
fn update(&mut self, data: &[u8]) {
self.inner.update(data);
}
fn finalize(self) -> Vec<u8> {
self.inner.finalize().to_vec()
}
fn output_size() -> usize {
32
}
fn name() -> &'static str {
"SM3"
}
}
pub fn digest32(md: MdType, data: &[u8]) -> crate::crypto::Result<[u8; 32]> {
match md {
MdType::SM3 => {
let mut h = Sm3::new();
h.update(data);
let v = h.finalize();
let mut out = [0u8; 32];
out.copy_from_slice(&v);
Ok(out)
}
MdType::Sha256 => {
use sha2::{Digest as Sha2Digest, Sha256};
let digest = Sha256::digest(data);
Ok(digest.into())
}
}
}