use crate::algorithms::hash::HashAlgorithm;
use crate::wrappers::asymmetric::kem::KemAlgorithmWrapper;
use bincode::{Decode, Encode};
#[derive(
Debug, Clone, Copy, PartialEq, Eq, Hash, Decode, Encode, serde::Serialize, serde::Deserialize,
)]
pub enum KemAlgorithm {
Rsa(RsaBits, HashAlgorithm),
Kyber(KyberSecurityLevel),
}
#[derive(
Debug, Clone, Copy, PartialEq, Eq, Hash, Decode, Encode, serde::Serialize, serde::Deserialize,
)]
pub enum RsaBits {
B2048,
B4096,
}
#[derive(
Debug, Clone, Copy, PartialEq, Eq, Hash, Decode, Encode, serde::Serialize, serde::Deserialize,
)]
pub enum KyberSecurityLevel {
L512,
L768,
L1024,
}
pub struct KemAlgorithmBuilder;
impl KemAlgorithmBuilder {
pub fn rsa2048(self) -> RsaBuilder {
RsaBuilder {
bits: RsaBits::B2048,
}
}
pub fn rsa4096(self) -> RsaBuilder {
RsaBuilder {
bits: RsaBits::B4096,
}
}
pub fn kyber512(self) -> KemAlgorithm {
KemAlgorithm::Kyber(KyberSecurityLevel::L512)
}
pub fn kyber768(self) -> KemAlgorithm {
KemAlgorithm::Kyber(KyberSecurityLevel::L768)
}
pub fn kyber1024(self) -> KemAlgorithm {
KemAlgorithm::Kyber(KyberSecurityLevel::L1024)
}
}
pub struct RsaBuilder {
bits: RsaBits,
}
impl RsaBuilder {
pub fn sha256(self) -> KemAlgorithm {
KemAlgorithm::Rsa(self.bits, HashAlgorithm::Sha256)
}
pub fn sha384(self) -> KemAlgorithm {
KemAlgorithm::Rsa(self.bits, HashAlgorithm::Sha384)
}
pub fn sha512(self) -> KemAlgorithm {
KemAlgorithm::Rsa(self.bits, HashAlgorithm::Sha512)
}
}
impl KemAlgorithm {
pub fn build() -> KemAlgorithmBuilder {
KemAlgorithmBuilder
}
}
impl KemAlgorithm {
pub fn into_wrapper(self) -> KemAlgorithmWrapper {
use crate::algorithms::hash::HashAlgorithm;
use crate::wrappers::asymmetric::kem::{
KemAlgorithmWrapper, Kyber512Wrapper, Kyber768Wrapper, Kyber1024Wrapper,
Rsa2048Sha256Wrapper, Rsa2048Sha384Wrapper, Rsa2048Sha512Wrapper, Rsa4096Sha256Wrapper,
Rsa4096Sha384Wrapper, Rsa4096Sha512Wrapper,
};
match self {
KemAlgorithm::Rsa(RsaBits::B2048, HashAlgorithm::Sha256) => {
KemAlgorithmWrapper::new(Box::new(Rsa2048Sha256Wrapper::default()))
}
KemAlgorithm::Rsa(RsaBits::B2048, HashAlgorithm::Sha384) => {
KemAlgorithmWrapper::new(Box::new(Rsa2048Sha384Wrapper::default()))
}
KemAlgorithm::Rsa(RsaBits::B2048, HashAlgorithm::Sha512) => {
KemAlgorithmWrapper::new(Box::new(Rsa2048Sha512Wrapper::default()))
}
KemAlgorithm::Rsa(RsaBits::B4096, HashAlgorithm::Sha256) => {
KemAlgorithmWrapper::new(Box::new(Rsa4096Sha256Wrapper::default()))
}
KemAlgorithm::Rsa(RsaBits::B4096, HashAlgorithm::Sha384) => {
KemAlgorithmWrapper::new(Box::new(Rsa4096Sha384Wrapper::default()))
}
KemAlgorithm::Rsa(RsaBits::B4096, HashAlgorithm::Sha512) => {
KemAlgorithmWrapper::new(Box::new(Rsa4096Sha512Wrapper::default()))
}
KemAlgorithm::Kyber(KyberSecurityLevel::L512) => {
KemAlgorithmWrapper::new(Box::new(Kyber512Wrapper::default()))
}
KemAlgorithm::Kyber(KyberSecurityLevel::L768) => {
KemAlgorithmWrapper::new(Box::new(Kyber768Wrapper::default()))
}
KemAlgorithm::Kyber(KyberSecurityLevel::L1024) => {
KemAlgorithmWrapper::new(Box::new(Kyber1024Wrapper::default()))
}
}
}
}