#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
pub enum HashAlgorithm {
Md5,
Sha1,
Sha256,
Sha384,
Sha512,
}
impl HashAlgorithm {
pub const fn output_size(self) -> usize {
match self {
HashAlgorithm::Md5 => 16,
HashAlgorithm::Sha1 => 20,
HashAlgorithm::Sha256 => 32,
HashAlgorithm::Sha384 => 48,
HashAlgorithm::Sha512 => 64,
}
}
pub const fn name(self) -> &'static str {
match self {
HashAlgorithm::Md5 => "MD5",
HashAlgorithm::Sha1 => "SHA-1",
HashAlgorithm::Sha256 => "SHA-256",
HashAlgorithm::Sha384 => "SHA-384",
HashAlgorithm::Sha512 => "SHA-512",
}
}
pub const fn is_fips_approved(self) -> bool {
matches!(self, HashAlgorithm::Sha256 | HashAlgorithm::Sha384 | HashAlgorithm::Sha512)
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum Padding {
Pkcs7,
None,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum AesKeySize {
Aes128,
Aes256,
}
impl AesKeySize {
pub const fn key_bytes(self) -> usize {
match self {
AesKeySize::Aes128 => 16,
AesKeySize::Aes256 => 32,
}
}
pub const fn name(self) -> &'static str {
match self {
AesKeySize::Aes128 => "AES-128",
AesKeySize::Aes256 => "AES-256",
}
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum EcCurve {
P256,
P384,
}
impl EcCurve {
pub const fn name(self) -> &'static str {
match self {
EcCurve::P256 => "P-256",
EcCurve::P384 => "P-384",
}
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum RsaScheme {
Pkcs1v15,
Pss,
}
impl RsaScheme {
pub const fn name(self) -> &'static str {
match self {
RsaScheme::Pkcs1v15 => "RSA-PKCS#1-v1.5",
RsaScheme::Pss => "RSA-PSS",
}
}
}
#[derive(Debug, Clone)]
pub struct RsaPublicKey<'a> {
pub modulus_be: &'a [u8],
pub exponent_be: &'a [u8],
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub struct SigningAlgorithm {
pub asym: AsymmetricAlgorithm,
pub hash: HashAlgorithm,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum AsymmetricAlgorithm {
Rsa(RsaScheme),
Ecdsa(EcCurve),
}
impl SigningAlgorithm {
pub const fn name(self) -> &'static str {
match (self.asym, self.hash) {
(AsymmetricAlgorithm::Rsa(RsaScheme::Pkcs1v15), HashAlgorithm::Sha256) => {
"RSA-PKCS1v15-SHA256"
},
(AsymmetricAlgorithm::Rsa(RsaScheme::Pkcs1v15), HashAlgorithm::Sha384) => {
"RSA-PKCS1v15-SHA384"
},
(AsymmetricAlgorithm::Rsa(RsaScheme::Pkcs1v15), HashAlgorithm::Sha512) => {
"RSA-PKCS1v15-SHA512"
},
(AsymmetricAlgorithm::Rsa(RsaScheme::Pss), HashAlgorithm::Sha256) => "RSA-PSS-SHA256",
(AsymmetricAlgorithm::Rsa(RsaScheme::Pss), HashAlgorithm::Sha384) => "RSA-PSS-SHA384",
(AsymmetricAlgorithm::Rsa(RsaScheme::Pss), HashAlgorithm::Sha512) => "RSA-PSS-SHA512",
(AsymmetricAlgorithm::Ecdsa(EcCurve::P256), HashAlgorithm::Sha256) => {
"ECDSA-P256-SHA256"
},
(AsymmetricAlgorithm::Ecdsa(EcCurve::P384), HashAlgorithm::Sha384) => {
"ECDSA-P384-SHA384"
},
_ => "signing-algorithm",
}
}
}