#[cfg(test)]
mod tests;
use openssl::hash::MessageDigest;
use std::fmt;
use std::str::FromStr;
use crate::buffer::{Buffer, BufferError, BufferMut};
#[derive(Clone, Copy, Debug, PartialEq)]
pub enum Digest {
Sha1,
Sha224,
Sha256,
Sha384,
Sha512,
}
impl fmt::Display for Digest {
fn fmt(&self, fmt: &mut fmt::Formatter) -> fmt::Result {
let s = match self {
Digest::Sha1 => "sha1",
Digest::Sha224 => "sha224",
Digest::Sha256 => "sha256",
Digest::Sha384 => "sha384",
Digest::Sha512 => "sha512",
};
fmt.write_str(s)
}
}
impl FromStr for Digest {
type Err = ();
fn from_str(str: &str) -> Result<Self, ()> {
match str {
"sha1" => Ok(Digest::Sha1),
"sha224" => Ok(Digest::Sha224),
"sha256" => Ok(Digest::Sha256),
"sha384" => Ok(Digest::Sha384),
"sha512" => Ok(Digest::Sha512),
_ => Err(()),
}
}
}
impl Digest {
pub fn size(&self) -> usize {
match self {
Digest::Sha1 => 20,
Digest::Sha224 => 28,
Digest::Sha256 => 32,
Digest::Sha384 => 48,
Digest::Sha512 => 64,
}
}
pub(crate) fn get_from_buffer<T: Buffer>(buf: &mut T) -> Result<Digest, BufferError> {
let b = buf.get_u32()?;
match b {
0 => Ok(Digest::Sha1),
1 => Ok(Digest::Sha224),
2 => Ok(Digest::Sha256),
3 => Ok(Digest::Sha384),
4 => Ok(Digest::Sha512),
_ => Err(BufferError::InvalidIndex("Digest".to_string(), b)),
}
}
pub(crate) fn put_into_buffer<T: BufferMut>(&self, buf: &mut T) -> Result<(), BufferError> {
let b = match self {
Digest::Sha1 => 0,
Digest::Sha224 => 1,
Digest::Sha256 => 2,
Digest::Sha384 => 3,
Digest::Sha512 => 4,
};
buf.put_u32(b)
}
pub(crate) fn as_openssl(&self) -> MessageDigest {
match self {
Digest::Sha1 => MessageDigest::sha1(),
Digest::Sha224 => MessageDigest::sha224(),
Digest::Sha256 => MessageDigest::sha256(),
Digest::Sha384 => MessageDigest::sha384(),
Digest::Sha512 => MessageDigest::sha512(),
}
}
}