pub mod key_controler;
mod kyber_crypto_xchacha;
mod kyber_crypto_aes;
mod kyber_crypto_aes_gcm_siv;
mod kyber_crypto_aes_ctr;
mod kyber_crypto_aes_xts;
mod kyber_crypto_xchacha_poly;
use std::{marker::PhantomData, path::PathBuf};
use crate::error::CryptError;
pub trait KyberFunctions {
fn encrypt_file(&mut self, path: PathBuf, passphrase: &str) -> Result<(Vec<u8>, Vec<u8>), CryptError>;
fn encrypt_msg(&mut self, message: &str, passphrase: &str) -> Result<(Vec<u8>, Vec<u8>), CryptError>;
fn encrypt_data(&mut self, data: Vec<u8>, passphrase: &str) -> Result<(Vec<u8>, Vec<u8>), CryptError>;
fn decrypt_file(&self, path: PathBuf, passphrase: &str, ciphertext: Vec<u8>) -> Result<Vec<u8>, CryptError>;
fn decrypt_msg(&self, message: Vec<u8>, passphrase: &str, ciphertext: Vec<u8>) -> Result<Vec<u8>, CryptError>;
fn decrypt_data(&self, data: Vec<u8>, passphrase: &str, ciphertext: Vec<u8>) -> Result<Vec<u8>, CryptError>;
}
pub enum KyberVariant {
Kyber512,
Kyber768,
Kyber1024,
}
pub trait KyberSizeVariant {
fn variant() -> KyberVariant;
}
impl KyberSizeVariant for Kyber512 {
fn variant() -> KyberVariant { KyberVariant::Kyber512 }
}
impl KyberSizeVariant for Kyber768 {
fn variant() -> KyberVariant { KyberVariant::Kyber768 }
}
impl KyberSizeVariant for Kyber1024 {
fn variant() -> KyberVariant { KyberVariant::Kyber1024 }
}
pub struct Kyber512;
pub struct Kyber768;
pub struct Kyber1024;
pub struct AES;
pub struct AesGcmSiv;
pub struct AesCtr;
pub struct AesXts;
pub struct XChaCha20;
pub struct XChaCha20Poly1305;
pub struct Encryption;
pub struct Decryption;
pub struct Files;
pub struct Message;
pub struct Data;
#[derive(PartialEq, Debug, Clone)]
pub struct KyberData {
key: Vec<u8>,
nonce: String,
}
impl KyberData {
pub fn key(&self) -> Result<Vec<u8>, CryptError> {
let key = &self.key;
let key = key.to_vec();
Ok(key)
}
pub fn nonce(&self) -> Result<&str, CryptError> {
let nonce = &self.nonce;
Ok(nonce)
}
pub fn set_nonce(&mut self, nonce: String) -> Result<(), CryptError> {
self.nonce = nonce;
Ok(())
}
pub fn set_key(&mut self, key: Vec<u8>) -> Result<(), CryptError> {
self.key = key;
Ok(())
}
}
pub struct Kyber<ProcessStatus = Encryption, KyberSize=Kyber1024, ContentStatus=Files, AlgorithmParam=AES>
where
KyberSize: KyberSizeVariant,
{
kyber_data: KyberData,
hmac_size: usize,
content_state: PhantomData<ContentStatus>,
kyber_state: PhantomData<KyberSize>,
algorithm_state: PhantomData<AlgorithmParam>,
process_state: PhantomData<ProcessStatus>,
}
impl<ProcessStatus, KyberSize: KyberSizeVariant, ContentStatus, AlgorithmParam> Kyber<ProcessStatus, KyberSize, ContentStatus, AlgorithmParam> {
pub fn new(key: Vec<u8>, nonce: Option<String>) -> Result<Self, CryptError> {
let nonce = nonce.map_or(String::new(), |data| data);
Ok(Self {
kyber_data: KyberData { key, nonce },
hmac_size: 512,
content_state: PhantomData,
kyber_state: PhantomData,
algorithm_state: PhantomData,
process_state: PhantomData,
})
}
pub fn get_key(&self) -> Result<Vec<u8>, CryptError> {
self.kyber_data.key()
}
pub fn get_nonce(&self) -> Result<&str, CryptError> {
self.kyber_data.nonce()
}
pub fn hmac_sha256(&mut self) -> Result<(), CryptError> {
self.hmac_size = 256;
Ok(())
}
}
impl Kyber<Encryption, Kyber1024, Files, AES> {
pub fn kyber768(self) -> Result<Kyber<Encryption, Kyber768, Files, AES>, CryptError> {
Ok(Kyber::<Encryption, Kyber768, Files, AES> {kyber_data: self.kyber_data, hmac_size: self.hmac_size, process_state: self.process_state, kyber_state: PhantomData::<Kyber768>, content_state: self.content_state, algorithm_state: self.algorithm_state})
}
pub fn kyber512(self) -> Result<Kyber<Encryption, Kyber512, Files, AES>, CryptError> {
Ok(Kyber::<Encryption, Kyber512, Files, AES> {kyber_data: self.kyber_data, hmac_size: self.hmac_size, process_state: self.process_state, kyber_state: PhantomData::<Kyber512>, content_state: self.content_state, algorithm_state: self.algorithm_state})
}
}
impl Kyber<Encryption, Kyber768, Files, AES> {
pub fn kyber1024(self) -> Result<Kyber<Encryption, Kyber1024, Files, AES>, CryptError> {
Ok(Kyber::<Encryption, Kyber1024, Files, AES> {kyber_data: self.kyber_data, hmac_size: self.hmac_size, process_state: self.process_state, kyber_state: PhantomData::<Kyber1024>, content_state: self.content_state, algorithm_state: self.algorithm_state})
}
pub fn kyber512(self) -> Result<Kyber<Encryption, Kyber512, Files, AES>, CryptError> {
Ok(Kyber::<Encryption, Kyber512, Files, AES> {kyber_data: self.kyber_data, hmac_size: self.hmac_size, process_state: self.process_state, kyber_state: PhantomData::<Kyber512>, content_state: self.content_state, algorithm_state: self.algorithm_state})
}
}
impl Kyber<Encryption, Kyber512, Files, AES> {
pub fn kyber1024(self) -> Result<Kyber<Encryption, Kyber1024, Files, AES>, CryptError> {
Ok(Kyber::<Encryption, Kyber1024, Files, AES> {kyber_data: self.kyber_data, hmac_size: self.hmac_size, process_state: self.process_state, kyber_state: PhantomData::<Kyber1024>, content_state: self.content_state, algorithm_state: self.algorithm_state})
}
pub fn kyber768(self) -> Result<Kyber<Encryption, Kyber768, Files, AES>, CryptError> {
Ok(Kyber::<Encryption, Kyber768, Files, AES> {kyber_data: self.kyber_data, hmac_size: self.hmac_size, process_state: self.process_state, kyber_state: PhantomData::<Kyber768>, content_state: self.content_state, algorithm_state: self.algorithm_state})
}
}
impl Kyber<Encryption, Kyber1024, Files, AesGcmSiv> {
pub fn kyber768(self) -> Result<Kyber<Encryption, Kyber768, Files, AesGcmSiv>, CryptError> {
Ok(Kyber::<Encryption, Kyber768, Files, AesGcmSiv> {kyber_data: self.kyber_data, hmac_size: self.hmac_size, process_state: self.process_state, kyber_state: PhantomData::<Kyber768>, content_state: self.content_state, algorithm_state: self.algorithm_state})
}
pub fn kyber512(self) -> Result<Kyber<Encryption, Kyber512, Files, AesGcmSiv>, CryptError> {
Ok(Kyber::<Encryption, Kyber512, Files, AesGcmSiv> {kyber_data: self.kyber_data, hmac_size: self.hmac_size, process_state: self.process_state, kyber_state: PhantomData::<Kyber512>, content_state: self.content_state, algorithm_state: self.algorithm_state})
}
}
impl Kyber<Encryption, Kyber768, Files, AesGcmSiv> {
pub fn kyber1024(self) -> Result<Kyber<Encryption, Kyber1024, Files, AesGcmSiv>, CryptError> {
Ok(Kyber::<Encryption, Kyber1024, Files, AesGcmSiv> {kyber_data: self.kyber_data, hmac_size: self.hmac_size, process_state: self.process_state, kyber_state: PhantomData::<Kyber1024>, content_state: self.content_state, algorithm_state: self.algorithm_state})
}
pub fn kyber512(self) -> Result<Kyber<Encryption, Kyber512, Files, AesGcmSiv>, CryptError> {
Ok(Kyber::<Encryption, Kyber512, Files, AesGcmSiv> {kyber_data: self.kyber_data, hmac_size: self.hmac_size, process_state: self.process_state, kyber_state: PhantomData::<Kyber512>, content_state: self.content_state, algorithm_state: self.algorithm_state})
}
}
impl Kyber<Encryption, Kyber512, Files, AesGcmSiv> {
pub fn kyber1024(self) -> Result<Kyber<Encryption, Kyber1024, Files, AesGcmSiv>, CryptError> {
Ok(Kyber::<Encryption, Kyber1024, Files, AesGcmSiv> {kyber_data: self.kyber_data, hmac_size: self.hmac_size, process_state: self.process_state, kyber_state: PhantomData::<Kyber1024>, content_state: self.content_state, algorithm_state: self.algorithm_state})
}
pub fn kyber768(self) -> Result<Kyber<Encryption, Kyber768, Files, AesGcmSiv>, CryptError> {
Ok(Kyber::<Encryption, Kyber768, Files, AesGcmSiv> {kyber_data: self.kyber_data, hmac_size: self.hmac_size, process_state: self.process_state, kyber_state: PhantomData::<Kyber768>, content_state: self.content_state, algorithm_state: self.algorithm_state})
}
}
impl Kyber<Encryption, Kyber1024, Files, AesCtr> {
pub fn kyber768(self) -> Result<Kyber<Encryption, Kyber768, Files, AesCtr>, CryptError> {
Ok(Kyber::<Encryption, Kyber768, Files, AesCtr> {kyber_data: self.kyber_data, hmac_size: self.hmac_size, process_state: self.process_state, kyber_state: PhantomData::<Kyber768>, content_state: self.content_state, algorithm_state: self.algorithm_state})
}
pub fn kyber512(self) -> Result<Kyber<Encryption, Kyber512, Files, AesCtr>, CryptError> {
Ok(Kyber::<Encryption, Kyber512, Files, AesCtr> {kyber_data: self.kyber_data, hmac_size: self.hmac_size, process_state: self.process_state, kyber_state: PhantomData::<Kyber512>, content_state: self.content_state, algorithm_state: self.algorithm_state})
}
}
impl Kyber<Encryption, Kyber768, Files, AesCtr> {
pub fn kyber1024(self) -> Result<Kyber<Encryption, Kyber1024, Files, AesCtr>, CryptError> {
Ok(Kyber::<Encryption, Kyber1024, Files, AesCtr> {kyber_data: self.kyber_data, hmac_size: self.hmac_size, process_state: self.process_state, kyber_state: PhantomData::<Kyber1024>, content_state: self.content_state, algorithm_state: self.algorithm_state})
}
pub fn kyber512(self) -> Result<Kyber<Encryption, Kyber512, Files, AesCtr>, CryptError> {
Ok(Kyber::<Encryption, Kyber512, Files, AesCtr> {kyber_data: self.kyber_data, hmac_size: self.hmac_size, process_state: self.process_state, kyber_state: PhantomData::<Kyber512>, content_state: self.content_state, algorithm_state: self.algorithm_state})
}
}
impl Kyber<Encryption, Kyber512, Files, AesCtr> {
pub fn kyber1024(self) -> Result<Kyber<Encryption, Kyber1024, Files, AesCtr>, CryptError> {
Ok(Kyber::<Encryption, Kyber1024, Files, AesCtr> {kyber_data: self.kyber_data, hmac_size: self.hmac_size, process_state: self.process_state, kyber_state: PhantomData::<Kyber1024>, content_state: self.content_state, algorithm_state: self.algorithm_state})
}
pub fn kyber768(self) -> Result<Kyber<Encryption, Kyber768, Files, AesCtr>, CryptError> {
Ok(Kyber::<Encryption, Kyber768, Files, AesCtr> {kyber_data: self.kyber_data, hmac_size: self.hmac_size, process_state: self.process_state, kyber_state: PhantomData::<Kyber768>, content_state: self.content_state, algorithm_state: self.algorithm_state})
}
}
impl<ProcessStatus, KyberSize: KyberSizeVariant, ContentStatus> Kyber<ProcessStatus, KyberSize, ContentStatus, AES> {
pub fn xchacha20(self) -> Kyber<ProcessStatus, KyberSize, ContentStatus, XChaCha20> {
Kyber {
kyber_data: self.kyber_data,
hmac_size: self.hmac_size,
content_state: PhantomData,
kyber_state: PhantomData,
algorithm_state: PhantomData,
process_state: PhantomData,
}
}
pub fn aes_gcm_siv(self) -> Kyber<ProcessStatus, KyberSize, ContentStatus, AesGcmSiv> {
Kyber {
kyber_data: self.kyber_data,
hmac_size: self.hmac_size,
content_state: PhantomData,
kyber_state: PhantomData,
algorithm_state: PhantomData,
process_state: PhantomData,
}
}
pub fn aes_ctr(self) -> Kyber<ProcessStatus, KyberSize, ContentStatus, AesCtr> {
Kyber {
kyber_data: self.kyber_data,
hmac_size: self.hmac_size,
content_state: PhantomData,
kyber_state: PhantomData,
algorithm_state: PhantomData,
process_state: PhantomData,
}
}
pub fn aes_xts(self) -> Kyber<ProcessStatus, KyberSize, ContentStatus, AesXts> {
Kyber {
kyber_data: self.kyber_data,
hmac_size: self.hmac_size,
content_state: PhantomData,
kyber_state: PhantomData,
algorithm_state: PhantomData,
process_state: PhantomData,
}
}
pub fn xchacha20poly1305(self) -> Kyber<ProcessStatus, KyberSize, ContentStatus, XChaCha20Poly1305> {
Kyber {
kyber_data: self.kyber_data,
hmac_size: self.hmac_size,
content_state: PhantomData,
kyber_state: PhantomData,
algorithm_state: PhantomData,
process_state: PhantomData,
}
}
}
impl<ProcessStatus, KyberSize: KyberSizeVariant, ContentStatus> Kyber<ProcessStatus, KyberSize, ContentStatus, XChaCha20> {
pub fn aes(self) -> Kyber<ProcessStatus, KyberSize, ContentStatus, AES> {
Kyber {
kyber_data: self.kyber_data,
hmac_size: self.hmac_size,
content_state: PhantomData,
kyber_state: PhantomData,
algorithm_state: PhantomData,
process_state: PhantomData,
}
}
pub fn aes_gcm_siv(self) -> Kyber<ProcessStatus, KyberSize, ContentStatus, AesGcmSiv> {
Kyber {
kyber_data: self.kyber_data,
hmac_size: self.hmac_size,
content_state: PhantomData,
kyber_state: PhantomData,
algorithm_state: PhantomData,
process_state: PhantomData,
}
}
pub fn aes_ctr(self) -> Kyber<ProcessStatus, KyberSize, ContentStatus, AesCtr> {
Kyber {
kyber_data: self.kyber_data,
hmac_size: self.hmac_size,
content_state: PhantomData,
kyber_state: PhantomData,
algorithm_state: PhantomData,
process_state: PhantomData,
}
}
pub fn aes_xts(self) -> Kyber<ProcessStatus, KyberSize, ContentStatus, AesXts> {
Kyber {
kyber_data: self.kyber_data,
hmac_size: self.hmac_size,
content_state: PhantomData,
kyber_state: PhantomData,
algorithm_state: PhantomData,
process_state: PhantomData,
}
}
pub fn xchacha20poly1305(self) -> Kyber<ProcessStatus, KyberSize, ContentStatus, XChaCha20Poly1305> {
Kyber {
kyber_data: self.kyber_data,
hmac_size: self.hmac_size,
content_state: PhantomData,
kyber_state: PhantomData,
algorithm_state: PhantomData,
process_state: PhantomData,
}
}
}
impl<ProcessStatus, KyberSize: KyberSizeVariant, ContentStatus> Kyber<ProcessStatus, KyberSize, ContentStatus, XChaCha20Poly1305> {
pub fn aes(self) -> Kyber<ProcessStatus, KyberSize, ContentStatus, AES> {
Kyber {
kyber_data: self.kyber_data,
hmac_size: self.hmac_size,
content_state: PhantomData,
kyber_state: PhantomData,
algorithm_state: PhantomData,
process_state: PhantomData,
}
}
pub fn aes_gcm_siv(self) -> Kyber<ProcessStatus, KyberSize, ContentStatus, AesGcmSiv> {
Kyber {
kyber_data: self.kyber_data,
hmac_size: self.hmac_size,
content_state: PhantomData,
kyber_state: PhantomData,
algorithm_state: PhantomData,
process_state: PhantomData,
}
}
pub fn aes_ctr(self) -> Kyber<ProcessStatus, KyberSize, ContentStatus, AesCtr> {
Kyber {
kyber_data: self.kyber_data,
hmac_size: self.hmac_size,
content_state: PhantomData,
kyber_state: PhantomData,
algorithm_state: PhantomData,
process_state: PhantomData,
}
}
pub fn aes_xts(self) -> Kyber<ProcessStatus, KyberSize, ContentStatus, AesXts> {
Kyber {
kyber_data: self.kyber_data,
hmac_size: self.hmac_size,
content_state: PhantomData,
kyber_state: PhantomData,
algorithm_state: PhantomData,
process_state: PhantomData,
}
}
pub fn xchacha20(self) -> Kyber<ProcessStatus, KyberSize, ContentStatus, XChaCha20> {
Kyber {
kyber_data: self.kyber_data,
hmac_size: self.hmac_size,
content_state: PhantomData,
kyber_state: PhantomData,
algorithm_state: PhantomData,
process_state: PhantomData,
}
}
}
impl<ProcessStatus, KyberSize: KyberSizeVariant, ContentStatus> Kyber<ProcessStatus, KyberSize, ContentStatus, AesGcmSiv> {
pub fn xchacha20(self) -> Kyber<ProcessStatus, KyberSize, ContentStatus, XChaCha20> {
Kyber {
kyber_data: self.kyber_data,
hmac_size: self.hmac_size,
content_state: PhantomData,
kyber_state: PhantomData,
algorithm_state: PhantomData,
process_state: PhantomData,
}
}
pub fn xchacha20poly1305(self) -> Kyber<ProcessStatus, KyberSize, ContentStatus, XChaCha20Poly1305> {
Kyber {
kyber_data: self.kyber_data,
hmac_size: self.hmac_size,
content_state: PhantomData,
kyber_state: PhantomData,
algorithm_state: PhantomData,
process_state: PhantomData,
}
}
pub fn aes(self) -> Kyber<ProcessStatus, KyberSize, ContentStatus, AES> {
Kyber {
kyber_data: self.kyber_data,
hmac_size: self.hmac_size,
content_state: PhantomData,
kyber_state: PhantomData,
algorithm_state: PhantomData,
process_state: PhantomData,
}
}
pub fn aes_ctr(self) -> Kyber<ProcessStatus, KyberSize, ContentStatus, AesCtr> {
Kyber {
kyber_data: self.kyber_data,
hmac_size: self.hmac_size,
content_state: PhantomData,
kyber_state: PhantomData,
algorithm_state: PhantomData,
process_state: PhantomData,
}
}
pub fn aes_xts(self) -> Kyber<ProcessStatus, KyberSize, ContentStatus, AesXts> {
Kyber {
kyber_data: self.kyber_data,
hmac_size: self.hmac_size,
content_state: PhantomData,
kyber_state: PhantomData,
algorithm_state: PhantomData,
process_state: PhantomData,
}
}
}
impl<ProcessStatus, KyberSize: KyberSizeVariant, ContentStatus> Kyber<ProcessStatus, KyberSize, ContentStatus, AesCtr> {
pub fn xchacha20(self) -> Kyber<ProcessStatus, KyberSize, ContentStatus, XChaCha20> {
Kyber {
kyber_data: self.kyber_data,
hmac_size: self.hmac_size,
content_state: PhantomData,
kyber_state: PhantomData,
algorithm_state: PhantomData,
process_state: PhantomData,
}
}
pub fn aes(self) -> Kyber<ProcessStatus, KyberSize, ContentStatus, AES> {
Kyber {
kyber_data: self.kyber_data,
hmac_size: self.hmac_size,
content_state: PhantomData,
kyber_state: PhantomData,
algorithm_state: PhantomData,
process_state: PhantomData,
}
}
pub fn aes_gcm_siv(self) -> Kyber<ProcessStatus, KyberSize, ContentStatus, AesGcmSiv> {
Kyber {
kyber_data: self.kyber_data,
hmac_size: self.hmac_size,
content_state: PhantomData,
kyber_state: PhantomData,
algorithm_state: PhantomData,
process_state: PhantomData,
}
}
pub fn aes_xts(self) -> Kyber<ProcessStatus, KyberSize, ContentStatus, AesXts> {
Kyber {
kyber_data: self.kyber_data,
hmac_size: self.hmac_size,
content_state: PhantomData,
kyber_state: PhantomData,
algorithm_state: PhantomData,
process_state: PhantomData,
}
}
pub fn xchacha20poly1305(self) -> Kyber<ProcessStatus, KyberSize, ContentStatus, XChaCha20Poly1305> {
Kyber {
kyber_data: self.kyber_data,
hmac_size: self.hmac_size,
content_state: PhantomData,
kyber_state: PhantomData,
algorithm_state: PhantomData,
process_state: PhantomData,
}
}
}
impl<ProcessStatus, KyberSize: KyberSizeVariant, ContentStatus> Kyber<ProcessStatus, KyberSize, ContentStatus, AesXts> {
pub fn xchacha20(self) -> Kyber<ProcessStatus, KyberSize, ContentStatus, XChaCha20> {
Kyber {
kyber_data: self.kyber_data,
hmac_size: self.hmac_size,
content_state: PhantomData,
kyber_state: PhantomData,
algorithm_state: PhantomData,
process_state: PhantomData,
}
}
pub fn xchacha20poly1305(self) -> Kyber<ProcessStatus, KyberSize, ContentStatus, XChaCha20Poly1305> {
Kyber {
kyber_data: self.kyber_data,
hmac_size: self.hmac_size,
content_state: PhantomData,
kyber_state: PhantomData,
algorithm_state: PhantomData,
process_state: PhantomData,
}
}
pub fn aes(self) -> Kyber<ProcessStatus, KyberSize, ContentStatus, AES> {
Kyber {
kyber_data: self.kyber_data,
hmac_size: self.hmac_size,
content_state: PhantomData,
kyber_state: PhantomData,
algorithm_state: PhantomData,
process_state: PhantomData,
}
}
pub fn aes_gcm_siv(self) -> Kyber<ProcessStatus, KyberSize, ContentStatus, AesGcmSiv> {
Kyber {
kyber_data: self.kyber_data,
hmac_size: self.hmac_size,
content_state: PhantomData,
kyber_state: PhantomData,
algorithm_state: PhantomData,
process_state: PhantomData,
}
}
pub fn aes_ctr(self) -> Kyber<ProcessStatus, KyberSize, ContentStatus, AesCtr> {
Kyber {
kyber_data: self.kyber_data,
hmac_size: self.hmac_size,
content_state: PhantomData,
kyber_state: PhantomData,
algorithm_state: PhantomData,
process_state: PhantomData,
}
}
}
impl<ProcessStatus, KyberSize: KyberSizeVariant, AlgorithmParam> Kyber<ProcessStatus, KyberSize, Files, AlgorithmParam> {
pub fn message(self) -> Kyber<ProcessStatus, KyberSize, Message, AlgorithmParam> {
Kyber {
kyber_data: self.kyber_data,
hmac_size: self.hmac_size,
content_state: PhantomData,
kyber_state: PhantomData,
algorithm_state: PhantomData,
process_state: PhantomData,
}
}
pub fn data(self) -> Kyber<ProcessStatus, KyberSize, Data, AlgorithmParam> {
Kyber {
kyber_data: self.kyber_data,
hmac_size: self.hmac_size,
content_state: PhantomData,
kyber_state: PhantomData,
algorithm_state: PhantomData,
process_state: PhantomData,
}
}
pub fn is_file(self) -> bool {
true
}
pub fn is_message(self) -> bool {
false
}
pub fn is_data(self) -> bool {
false
}
}
impl<ProcessStatus, KyberSize: KyberSizeVariant, AlgorithmParam> Kyber<ProcessStatus, KyberSize, Message, AlgorithmParam> {
pub fn file(self) -> Kyber<ProcessStatus, KyberSize, Files, AlgorithmParam> {
Kyber {
kyber_data: self.kyber_data,
hmac_size: self.hmac_size,
content_state: PhantomData,
kyber_state: PhantomData,
algorithm_state: PhantomData,
process_state: PhantomData,
}
}
pub fn data(self) -> Kyber<ProcessStatus, KyberSize, Data, AlgorithmParam> {
Kyber {
kyber_data: self.kyber_data,
hmac_size: self.hmac_size,
content_state: PhantomData,
kyber_state: PhantomData,
algorithm_state: PhantomData,
process_state: PhantomData,
}
}
pub fn is_file(self) -> bool {
false
}
pub fn is_message(self) -> bool {
true
}
pub fn is_data(self) -> bool {
false
}
}
impl<ProcessStatus, KyberSize: KyberSizeVariant, AlgorithmParam> Kyber<ProcessStatus, KyberSize, Data, AlgorithmParam> {
pub fn file(self) -> Kyber<ProcessStatus, KyberSize, Files, AlgorithmParam> {
Kyber {
kyber_data: self.kyber_data,
hmac_size: self.hmac_size,
content_state: PhantomData,
kyber_state: PhantomData,
algorithm_state: PhantomData,
process_state: PhantomData,
}
}
pub fn message(self) -> Kyber<ProcessStatus, KyberSize, Message, AlgorithmParam> {
Kyber {
kyber_data: self.kyber_data,
hmac_size: self.hmac_size,
content_state: PhantomData,
kyber_state: PhantomData,
algorithm_state: PhantomData,
process_state: PhantomData,
}
}
pub fn is_file(self) -> bool {
false
}
pub fn is_message(self) -> bool {
false
}
pub fn is_data(self) -> bool {
true
}
}
impl<KyberSize: KyberSizeVariant, ContentStatus, AlgorithmParam> Kyber<Encryption, KyberSize, ContentStatus, AlgorithmParam> {
pub fn decryption(self) -> Kyber<Decryption, KyberSize, Message, AlgorithmParam> {
Kyber {
kyber_data: self.kyber_data,
hmac_size: self.hmac_size,
content_state: PhantomData,
kyber_state: PhantomData,
algorithm_state: PhantomData,
process_state: PhantomData,
}
}
}
impl<KyberSize: KyberSizeVariant, ContentStatus, AlgorithmParam> Kyber<Decryption, KyberSize, ContentStatus, AlgorithmParam> {
pub fn encryption(self) -> Kyber<Encryption, KyberSize, Files, AlgorithmParam> {
Kyber {
kyber_data: self.kyber_data,
hmac_size: self.hmac_size,
content_state: PhantomData,
kyber_state: PhantomData,
algorithm_state: PhantomData,
process_state: PhantomData,
}
}
}