use super::{Algorithm, AlgorithmError, AlgorithmErrorKind::TagInvalid};
#[derive(Copy, Clone, Debug, Eq, PartialEq)]
#[allow(non_camel_case_types)]
#[repr(u8)]
pub enum AsymmetricAlg {
RSA_2048 = 0x09,
RSA_3072 = 0x0a,
RSA_4096 = 0x0b,
Ed25519 = 0x2e,
EC_P224 = 0x2f,
EC_P256 = 0x0c,
EC_P384 = 0x0d,
EC_P521 = 0x0e,
EC_K256 = 0x0f,
EC_BP256 = 0x10,
EC_BP384 = 0x11,
EC_BP512 = 0x12,
}
impl AsymmetricAlg {
pub fn from_u8(tag: u8) -> Result<Self, AlgorithmError> {
Ok(match tag {
0x09 => AsymmetricAlg::RSA_2048,
0x0a => AsymmetricAlg::RSA_3072,
0x0b => AsymmetricAlg::RSA_4096,
0x0c => AsymmetricAlg::EC_P256,
0x0d => AsymmetricAlg::EC_P384,
0x0e => AsymmetricAlg::EC_P521,
0x0f => AsymmetricAlg::EC_K256,
0x10 => AsymmetricAlg::EC_BP256,
0x11 => AsymmetricAlg::EC_BP384,
0x12 => AsymmetricAlg::EC_BP512,
0x2e => AsymmetricAlg::Ed25519,
0x2f => AsymmetricAlg::EC_P224,
_ => fail!(TagInvalid, "unknown asymmetric algorithm ID: 0x{:02x}", tag),
})
}
pub fn to_u8(self) -> u8 {
self as u8
}
pub fn key_len(self) -> usize {
match self {
AsymmetricAlg::RSA_2048 => 256,
AsymmetricAlg::RSA_3072 => 384,
AsymmetricAlg::RSA_4096 => 512,
AsymmetricAlg::Ed25519 => 32,
AsymmetricAlg::EC_P224 => 28,
AsymmetricAlg::EC_P256 => 32,
AsymmetricAlg::EC_K256 => 32,
AsymmetricAlg::EC_P384 => 48,
AsymmetricAlg::EC_P521 => 66,
AsymmetricAlg::EC_BP256 => 32,
AsymmetricAlg::EC_BP384 => 48,
AsymmetricAlg::EC_BP512 => 64,
}
}
}
impl From<AsymmetricAlg> for Algorithm {
fn from(alg: AsymmetricAlg) -> Algorithm {
Algorithm::Asymmetric(alg)
}
}
impl_algorithm_serializers!(AsymmetricAlg);