cross_authenticode/
algorithm.rs

1use std::fmt::Display;
2
3use crate::error::AuthenticodeError;
4
5/// The hash algorithm used to sign the PE file.
6#[derive(Debug, PartialEq)]
7pub enum Algorithm {
8    Md5,
9    Sha1,
10    Sha256,
11    Sha384,
12    Sha512,
13}
14
15impl TryFrom<&[u8]> for Algorithm {
16    type Error = AuthenticodeError;
17
18    fn try_from(value: &[u8]) -> Result<Self, Self::Error> {
19        match value.len() {
20            16 => Ok(Algorithm::Md5),
21            20 => Ok(Algorithm::Sha1),
22            32 => Ok(Algorithm::Sha256),
23            48 => Ok(Algorithm::Sha384),
24            64 => Ok(Algorithm::Sha512),
25            _ => Err(AuthenticodeError::InvalidHashAlgorithm),
26        }
27    }
28}
29
30impl Display for Algorithm {
31    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
32        match self {
33            Algorithm::Md5 => write!(f, "MD5"),
34            Algorithm::Sha1 => write!(f, "SHA1"),
35            Algorithm::Sha256 => write!(f, "SHA256"),
36            Algorithm::Sha384 => write!(f, "SHA384"),
37            Algorithm::Sha512 => write!(f, "SHA512"),
38        }
39    }
40}