extern crate alloc;
use oxicrypto_core::{CryptoError, Mac};
use crate::{HmacSha256, HmacSha384, HmacSha512};
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
#[non_exhaustive]
pub enum TlsCipherSuite {
Aes128GcmSha256,
Aes256GcmSha384,
Chacha20Poly1305Sha256,
Aes128CcmSha256,
Aes128Ccm8Sha256,
Sha256Prf,
Sha384Prf,
Sha512Prf,
}
impl TlsCipherSuite {
pub fn from_iana_name(name: &str) -> Option<Self> {
match name {
"TLS_AES_128_GCM_SHA256" => Some(Self::Aes128GcmSha256),
"TLS_AES_256_GCM_SHA384" => Some(Self::Aes256GcmSha384),
"TLS_CHACHA20_POLY1305_SHA256" => Some(Self::Chacha20Poly1305Sha256),
"TLS_AES_128_CCM_SHA256" => Some(Self::Aes128CcmSha256),
"TLS_AES_128_CCM_8_SHA256" => Some(Self::Aes128Ccm8Sha256),
_ => None,
}
}
}
pub fn mac_name_for_suite(suite: TlsCipherSuite) -> &'static str {
match suite {
TlsCipherSuite::Aes128GcmSha256
| TlsCipherSuite::Chacha20Poly1305Sha256
| TlsCipherSuite::Aes128CcmSha256
| TlsCipherSuite::Aes128Ccm8Sha256
| TlsCipherSuite::Sha256Prf => "HMAC-SHA-256",
TlsCipherSuite::Aes256GcmSha384 | TlsCipherSuite::Sha384Prf => "HMAC-SHA-384",
TlsCipherSuite::Sha512Prf => "HMAC-SHA-512",
}
}
pub fn negotiate_mac(
suite: TlsCipherSuite,
) -> Result<alloc::boxed::Box<dyn Mac + Send + Sync>, CryptoError> {
let mac: alloc::boxed::Box<dyn Mac + Send + Sync> = match suite {
TlsCipherSuite::Aes128GcmSha256
| TlsCipherSuite::Chacha20Poly1305Sha256
| TlsCipherSuite::Aes128CcmSha256
| TlsCipherSuite::Aes128Ccm8Sha256
| TlsCipherSuite::Sha256Prf => alloc::boxed::Box::new(HmacSha256),
TlsCipherSuite::Aes256GcmSha384 | TlsCipherSuite::Sha384Prf => {
alloc::boxed::Box::new(HmacSha384)
}
TlsCipherSuite::Sha512Prf => alloc::boxed::Box::new(HmacSha512),
};
Ok(mac)
}