#[cfg(feature = "encryption")]
use crate::encrypted_data::EncryptedData;
#[cfg(feature = "encryption")]
use crate::error::Result;
#[cfg(feature = "encryption")]
use crate::kdf::KdfFunction;
use crate::Error;
#[cfg(feature = "aes")]
mod aes;
#[cfg(feature = "chacha")]
mod blake3;
#[cfg(feature = "aes")]
mod sha2;
#[cfg(feature = "chacha")]
mod xchacha20poly1305;
#[cfg(feature = "encryption")]
pub(crate) type DecryptionFunction = dyn Fn(&[u8], &EncryptedData, &str) -> Result<Vec<u8>>;
#[cfg(feature = "encryption")]
pub(crate) type EncryptionFunction = dyn Fn(&[u8], &[u8], &[u8], &str) -> Result<EncryptedData>;
#[cfg(feature = "encryption")]
pub(crate) type GenNonceFunction = dyn Fn() -> Result<Vec<u8>>;
pub(crate) type SchemeSerializeType = u32;
#[derive(Copy, Clone, Debug, PartialEq)]
pub enum Scheme {
#[cfg(feature = "chacha")]
XChaCha20Poly1305WithBlake3 = 1,
#[cfg(feature = "aes")]
Aes128GcmWithSha256 = 2,
}
impl Scheme {
pub(crate) fn get_ikm_size(&self) -> usize {
match self {
#[cfg(feature = "chacha")]
Scheme::XChaCha20Poly1305WithBlake3 => 32,
#[cfg(feature = "aes")]
Scheme::Aes128GcmWithSha256 => 32,
}
}
}
#[cfg(feature = "encryption")]
impl Scheme {
pub(crate) fn get_kdf(&self) -> Box<KdfFunction> {
match self {
#[cfg(feature = "chacha")]
Scheme::XChaCha20Poly1305WithBlake3 => Box::new(blake3::blake3_derive),
#[cfg(feature = "aes")]
Scheme::Aes128GcmWithSha256 => Box::new(sha2::sha256_derive),
}
}
pub(crate) fn get_key_len(&self) -> usize {
match self {
#[cfg(feature = "chacha")]
Scheme::XChaCha20Poly1305WithBlake3 => xchacha20poly1305::KEY_SIZE,
#[cfg(feature = "aes")]
Scheme::Aes128GcmWithSha256 => aes::AES128_KEY_SIZE,
}
}
pub(crate) fn get_decryption(&self) -> Box<DecryptionFunction> {
match self {
#[cfg(feature = "chacha")]
Scheme::XChaCha20Poly1305WithBlake3 => Box::new(xchacha20poly1305::xchacha20poly1305_decrypt),
#[cfg(feature = "aes")]
Scheme::Aes128GcmWithSha256 => Box::new(aes::aes128gcm_decrypt),
}
}
pub(crate) fn get_encryption(&self) -> Box<EncryptionFunction> {
match self {
#[cfg(feature = "chacha")]
Scheme::XChaCha20Poly1305WithBlake3 => Box::new(xchacha20poly1305::xchacha20poly1305_encrypt),
#[cfg(feature = "aes")]
Scheme::Aes128GcmWithSha256 => Box::new(aes::aes128gcm_encrypt),
}
}
pub(crate) fn get_gen_nonce(&self) -> Box<GenNonceFunction> {
match self {
#[cfg(feature = "chacha")]
Scheme::XChaCha20Poly1305WithBlake3 => Box::new(xchacha20poly1305::xchacha20poly1305_gen_nonce),
#[cfg(feature = "aes")]
Scheme::Aes128GcmWithSha256 => Box::new(aes::aes128gcm_gen_nonce),
}
}
}
impl TryFrom<SchemeSerializeType> for Scheme {
type Error = Error;
fn try_from(value: SchemeSerializeType) -> Result<Self, Self::Error> {
match value {
#[cfg(feature = "chacha")]
1 => Ok(Scheme::XChaCha20Poly1305WithBlake3),
#[cfg(feature = "aes")]
2 => Ok(Scheme::Aes128GcmWithSha256),
_ => Err(Error::ParsingSchemeUnknownScheme(value)),
}
}
}