pub use crypt_guard_proc::*;
pub mod markers;
mod core;
pub mod cryptography;
pub mod error;
pub mod key_control;
pub mod log;
pub mod utils;
pub mod api;
pub mod builder;
pub mod kdf;
pub mod kem;
pub mod protocol;
pub mod sign;
#[cfg(feature = "legacy-pqclean")]
pub mod legacy;
#[cfg(test)]
mod tests;
#[cfg(feature = "archive")]
pub use crate::utils::archive;
#[cfg(feature = "zip")]
pub use crate::utils::zip_manager;
pub use crate::{
core::{
hub::{
DecryptData, DecryptFile, DecryptText, EncryptData, EncryptFile, EncryptText,
MlKem1024, MlKem512, MlKem768,
},
kyber::*,
*,
},
key_control::{file, *},
log::*,
};
#[cfg(feature = "legacy-pqclean")]
pub use crate::core::kdf as legacy_kdf;
pub use api::{open as hpke_open, seal as hpke_seal};
pub use api::{
AuthenticatedAead, Decryptor, DecryptorBuilder, Encryptor, EncryptorBuilder, MissingPlaintext,
MissingRecipient, MissingSecretKey, WithPlaintext, WithRecipient, WithSecretKey,
};
pub use markers::{AesGcmSiv, XChaCha20Poly1305};
pub use protocol::Envelope;
use std::path::Path;
pub fn activate_log<P: AsRef<Path>>(log_file: P) {
crate::log::initialize_logger(log_file.as_ref().to_path_buf());
}
#[cfg(feature = "legacy-pqclean")]
#[macro_export]
macro_rules! encrypt_sign {
($key:expr, $sign:expr, $content:expr, $passphrase:expr) => {{
let mut key = $key;
let mut sign = $sign;
let mut content = $content;
let passphrase = $passphrase;
let result = (|| {
let mut encryptor =
Kyber::<Encryption, Kyber1024, Data, AES>::new(key.to_owned(), None)?;
let signer = Signature::<Falcon1024, Message>::new();
let signed_message = signer
.signature(content.to_owned(), sign.to_owned())
.map_err($crate::error::CryptError::from)?;
encryptor.encrypt_data(signed_message, &passphrase)
})();
key.zeroize();
sign.zeroize();
content.zeroize();
result
}};
}
#[cfg(feature = "legacy-pqclean")]
#[macro_export]
macro_rules! decrypt_open {
($key:expr, $sign:expr, $content:expr, $passphrase:expr, $cipher:expr) => {{
let mut key = $key;
let mut sign = $sign;
let mut content = $content;
let passphrase = $passphrase;
let mut cipher = $cipher;
let out = (|| {
let decryptor = Kyber::<Decryption, Kyber1024, Data, AES>::new(key.to_owned(), None)?;
let data =
decryptor.decrypt_data(content.to_owned(), &passphrase, cipher.to_owned())?;
let signer = Signature::<Falcon1024, Message>::new();
signer
.open(data, sign.to_owned())
.map_err($crate::error::CryptError::from)
})()
.expect("decrypt_open failed");
key.zeroize();
sign.zeroize();
content.zeroize();
cipher.zeroize();
out
}};
}
#[macro_export]
macro_rules! archive {
($source_path:expr, $delete_dir:expr) => {{
use $crate::archive::{Archive, ArchiveOperation};
let source = $source_path.to_path_buf();
let archive_operation = ArchiveOperation::Archive;
let archive_instance = Archive::new(source, archive_operation);
let _ = archive_instance.execute($delete_dir);
}};
}
#[macro_export]
macro_rules! extract {
($archive_path:expr, $delete_archive:expr) => {{
use $crate::archive::{Archive, ArchiveOperation};
let archive = $archive_path.to_path_buf();
let archive_operation = ArchiveOperation::Unarchive;
let extract_instance = Archive::new(archive, archive_operation);
let _ = extract_instance.execute($delete_archive);
}};
}
#[macro_export]
macro_rules! archive_util {
($path:expr, $delete_dir:expr, Archive) => {{
use $crate::archive::{Archive, ArchiveOperation};
let source = $path.to_path_buf();
let archive_operation = ArchiveOperation::Archive;
let archive_instance = Archive::new(source, archive_operation);
let _ = archive_instance.execute($delete_dir);
}};
($archive_path:expr, $delete_archive:expr, Extract) => {{
use $crate::archive::{Archive, ArchiveOperation};
let archive = $archive_path.to_path_buf();
let archive_operation = ArchiveOperation::Unarchive;
let extract_instance = Archive::new(archive, archive_operation);
let _ = extract_instance.execute($delete_archive);
}};
}
#[cfg(feature = "legacy-pqclean")]
#[macro_export]
macro_rules! kyber_keypair {
($size:expr) => {{
match $size {
1024 => KeyControKyber1024::keypair().expect("Failed to generate keypair"),
768 => KeyControKyber768::keypair().expect("Failed to generate keypair"),
512 => KeyControKyber512::keypair().expect("Failed to generate keypair"),
_ => panic!("Wrong key size!"),
}
}};
}
#[cfg(feature = "legacy-pqclean")]
#[macro_export]
macro_rules! falcon_keypair {
($size:expr) => {{
match $size {
1024 => Falcon1024::keypair().expect("Failed to generate Falcon keypair"),
512 => Falcon512::keypair().expect("Failed to generate Falcon keypair"),
_ => panic!("Wrong key size!"),
}
}};
}
#[cfg(feature = "legacy-pqclean")]
#[macro_export]
macro_rules! dilithium_keypair {
($version:expr) => {{
match $version {
5 => Dilithium5::keypair().expect("Failed to generate Dilithium keypair"),
3 => Dilithium3::keypair().expect("Failed to generate Dilithium keypair"),
2 => Dilithium2::keypair().expect("Failed to generate Dilithium keypair"),
_ => panic!("Wrong key size!"),
}
}};
}
#[macro_export]
macro_rules! encryption {
($key:expr, 1024, $data:expr, $passphrase:expr, AES) => {{
let mut key = $key;
let mut data = $data;
let passphrase = $passphrase;
let result = (|| {
let mut encryptor =
Kyber::<Encryption, Kyber1024, Data, AES>::new(key.to_owned(), None)?;
encryptor.encrypt_data(data.to_owned(), &passphrase)
})();
key.zeroize();
data.zeroize();
passphrase.to_string().zeroize();
result
}};
($key:expr, 768, $data:expr, $passphrase:expr, AES) => {{
let mut key = $key;
let mut data = $data;
let passphrase = $passphrase;
let result = (|| {
let mut encryptor =
Kyber::<Encryption, Kyber768, Data, AES>::new(key.to_owned(), None)?;
encryptor.encrypt_data(data.to_owned(), &passphrase)
})();
key.zeroize();
data.zeroize();
passphrase.to_string().zeroize();
result
}};
($key:expr, 512, $data:expr, $passphrase:expr, AES) => {{
let mut key = $key;
let mut data = $data;
let passphrase = $passphrase;
let result = (|| {
let mut encryptor =
Kyber::<Encryption, Kyber512, Data, AES>::new(key.to_owned(), None)?;
encryptor.encrypt_data(data.to_owned(), &passphrase)
})();
key.zeroize();
data.zeroize();
passphrase.to_string().zeroize();
result
}};
($key:expr, 1024, $data:expr, $passphrase:expr, AES_XTS) => {{
let mut key = $key;
let mut data = $data;
let passphrase = $passphrase;
let result = (|| {
let mut encryptor =
Kyber::<Encryption, Kyber1024, Data, AesXts>::new(key.to_owned(), None)?;
encryptor.encrypt_data(data.to_owned(), &passphrase)
})();
key.zeroize();
data.zeroize();
passphrase.to_string().zeroize();
result
}};
($key:expr, 768, $data:expr, $passphrase:expr, AES_XTS) => {{
let mut key = $key;
let mut data = $data;
let passphrase = $passphrase;
let result = (|| {
let mut encryptor =
Kyber::<Encryption, Kyber768, Data, AesXts>::new(key.to_owned(), None)?;
encryptor.encrypt_data(data.to_owned(), &passphrase)
})();
key.zeroize();
data.zeroize();
passphrase.to_string().zeroize();
result
}};
($key:expr, 512, $data:expr, $passphrase:expr, AES_XTS) => {{
let mut key = $key;
let mut data = $data;
let passphrase = $passphrase;
let result = (|| {
let mut encryptor =
Kyber::<Encryption, Kyber512, Data, AesXts>::new(key.to_owned(), None)?;
encryptor.encrypt_data(data.to_owned(), &passphrase)
})();
key.zeroize();
data.zeroize();
passphrase.to_string().zeroize();
result
}};
($key:expr, 1024, $data:expr, $passphrase:expr, AES_CBC) => {{
let mut key = $key;
let mut data = $data;
let passphrase = $passphrase;
let result = {
let mut encryptor =
Kyber::<Encryption, Kyber1024, Data, AES>::new(key.to_owned(), None)?;
let (encrypt_message, cipher) = encryptor.encrypt_data(data.to_owned(), &passphrase)?;
Ok::<_, $crate::error::CryptError>((encrypt_message, cipher))
};
key.zeroize();
data.zeroize();
passphrase.to_string().zeroize();
result
}};
($key:expr, 768, $data:expr, $passphrase:expr, AES_CBC) => {{
let mut key = $key;
let mut data = $data;
let passphrase = $passphrase;
let result = {
let mut encryptor =
Kyber::<Encryption, Kyber768, Data, AES>::new(key.to_owned(), None)?;
let (encrypt_message, cipher) = encryptor.encrypt_data(data.to_owned(), &passphrase)?;
Ok::<_, $crate::error::CryptError>((encrypt_message, cipher))
};
key.zeroize();
data.zeroize();
passphrase.to_string().zeroize();
result
}};
($key:expr, 512, $data:expr, $passphrase:expr, AES_CBC) => {{
let mut key = $key;
let mut data = $data;
let passphrase = $passphrase;
let result = {
let mut encryptor =
Kyber::<Encryption, Kyber512, Data, AES>::new(key.to_owned(), None)?;
let (encrypt_message, cipher) = encryptor.encrypt_data(data.to_owned(), &passphrase)?;
Ok::<_, $crate::error::CryptError>((encrypt_message, cipher))
};
key.zeroize();
data.zeroize();
passphrase.to_string().zeroize();
result
}};
($key:expr, 1024, $data:expr, $passphrase:expr, AES_GCM_SIV) => {{
let mut key = $key;
let mut data = $data;
let passphrase = $passphrase;
let result = {
let mut encryptor =
Kyber::<Encryption, Kyber1024, Data, AesGcmSiv>::new(key.to_owned(), None)?;
let (encrypt_message, cipher) = encryptor.encrypt_data(data.to_owned(), &passphrase)?;
let nonce = encryptor.get_nonce()?;
Ok::<_, $crate::error::CryptError>((encrypt_message, cipher, nonce.to_string()))
};
key.zeroize();
data.zeroize();
passphrase.to_string().zeroize();
result
}};
($key:expr, 768, $data:expr, $passphrase:expr, AES_GCM_SIV) => {{
let mut key = $key;
let mut data = $data;
let passphrase = $passphrase;
let result = {
let mut encryptor =
Kyber::<Encryption, Kyber768, Data, AesGcmSiv>::new(key.to_owned(), None)?;
let (encrypt_message, cipher) = encryptor.encrypt_data(data.to_owned(), &passphrase)?;
let nonce = encryptor.get_nonce()?;
Ok::<_, $crate::error::CryptError>((encrypt_message, cipher, nonce.to_string()))
};
key.zeroize();
data.zeroize();
passphrase.to_string().zeroize();
result
}};
($key:expr, 512, $data:expr, $passphrase:expr, AES_GCM_SIV) => {{
let mut key = $key;
let mut data = $data;
let passphrase = $passphrase;
let result = {
let mut encryptor =
Kyber::<Encryption, Kyber512, Data, AesGcmSiv>::new(key.to_owned(), None)?;
let (encrypt_message, cipher) = encryptor.encrypt_data(data.to_owned(), &passphrase)?;
let nonce = encryptor.get_nonce()?;
Ok::<_, $crate::error::CryptError>((encrypt_message, cipher, nonce.to_string()))
};
key.zeroize();
data.zeroize();
passphrase.to_string().zeroize();
result
}};
($key:expr, 1024, $data:expr, $passphrase:expr, AES_CTR) => {{
let mut key = $key;
let mut data = $data;
let passphrase = $passphrase;
let result = {
let mut encryptor =
Kyber::<Encryption, Kyber1024, Data, AesCtr>::new(key.to_owned(), None)?;
let (encrypt_message, cipher) = encryptor.encrypt_data(data.to_owned(), &passphrase)?;
let nonce = encryptor.get_nonce()?;
Ok::<_, $crate::error::CryptError>((encrypt_message, cipher, nonce.to_string()))
};
key.zeroize();
data.zeroize();
passphrase.to_string().zeroize();
result
}};
($key:expr, 768, $data:expr, $passphrase:expr, AES_CTR) => {{
let mut key = $key;
let mut data = $data;
let passphrase = $passphrase;
let result = {
let mut encryptor =
Kyber::<Encryption, Kyber768, Data, AesCtr>::new(key.to_owned(), None)?;
let (encrypt_message, cipher) = encryptor.encrypt_data(data.to_owned(), &passphrase)?;
let nonce = encryptor.get_nonce()?;
Ok::<_, $crate::error::CryptError>((encrypt_message, cipher, nonce.to_string()))
};
key.zeroize();
data.zeroize();
passphrase.to_string().zeroize();
result
}};
($key:expr, 512, $data:expr, $passphrase:expr, AES_CTR) => {{
let mut key = $key;
let mut data = $data;
let passphrase = $passphrase;
let result = {
let mut encryptor =
Kyber::<Encryption, Kyber512, Data, AesCtr>::new(key.to_owned(), None)?;
let (encrypt_message, cipher) = encryptor.encrypt_data(data.to_owned(), &passphrase)?;
let nonce = encryptor.get_nonce()?;
Ok::<_, $crate::error::CryptError>((encrypt_message, cipher, nonce.to_string()))
};
key.zeroize();
data.zeroize();
passphrase.to_string().zeroize();
result
}};
($key:expr, 1024, $data:expr, $passphrase:expr, XChaCha20) => {{
let mut key = $key;
let mut data = $data;
let passphrase = $passphrase;
let result = {
let mut encryptor =
Kyber::<Encryption, Kyber1024, Data, XChaCha20>::new(key.to_owned(), None)?;
let (encrypt_message, cipher) = encryptor.encrypt_data(data.to_owned(), &passphrase)?;
let nonce = encryptor.get_nonce()?;
Ok::<_, $crate::error::CryptError>((encrypt_message, cipher, nonce.to_string()))
};
key.zeroize();
data.zeroize();
passphrase.to_string().zeroize();
result
}};
($key:expr, 768, $data:expr, $passphrase:expr, XChaCha20) => {{
let mut key = $key;
let mut data = $data;
let passphrase = $passphrase;
let result = {
let mut encryptor =
Kyber::<Encryption, Kyber768, Data, XChaCha20>::new(key.to_owned(), None)?;
let (encrypt_message, cipher) = encryptor.encrypt_data(data.to_owned(), &passphrase)?;
let nonce = encryptor.get_nonce()?;
Ok::<_, $crate::error::CryptError>((encrypt_message, cipher, nonce.to_string()))
};
key.zeroize();
data.zeroize();
passphrase.to_string().zeroize();
result
}};
($key:expr, 512, $data:expr, $passphrase:expr, XChaCha20) => {{
let mut key = $key;
let mut data = $data;
let passphrase = $passphrase;
let result = {
let mut encryptor =
Kyber::<Encryption, Kyber512, Data, XChaCha20>::new(key.to_owned(), None)?;
let (encrypt_message, cipher) = encryptor.encrypt_data(data.to_owned(), &passphrase)?;
let nonce = encryptor.get_nonce()?;
Ok::<_, $crate::error::CryptError>((encrypt_message, cipher, nonce.to_string()))
};
key.zeroize();
data.zeroize();
passphrase.to_string().zeroize();
result
}};
($key:expr, 1024, $data:expr, $passphrase:expr, XChaCha20Poly1305) => {{
let mut key = $key;
let mut data = $data;
let passphrase = $passphrase;
let result = (|| {
let mut encryptor =
Kyber::<Encryption, Kyber1024, Data, XChaCha20Poly1305>::new(key.to_owned(), None)?;
let (encrypt_message, cipher) = encryptor.encrypt_data(data.to_owned(), &passphrase)?;
let nonce = encryptor.get_nonce()?;
Ok::<_, CryptError>((encrypt_message, cipher, nonce.to_string()))
})();
key.zeroize();
data.zeroize();
passphrase.to_string().zeroize();
result
}};
($key:expr, 768, $data:expr, $passphrase:expr, XChaCha20Poly1305) => {{
let mut key = $key;
let mut data = $data;
let passphrase = $passphrase;
let result = (|| {
let mut encryptor =
Kyber::<Encryption, Kyber768, Data, XChaCha20Poly1305>::new(key.to_owned(), None)?;
let (encrypt_message, cipher) = encryptor.encrypt_data(data.to_owned(), &passphrase)?;
let nonce = encryptor.get_nonce()?;
Ok::<_, CryptError>((encrypt_message, cipher, nonce.to_string()))
})();
key.zeroize();
data.zeroize();
passphrase.to_string().zeroize();
result
}};
($key:expr, 512, $data:expr, $passphrase:expr, XChaCha20Poly1305) => {{
let mut key = $key;
let mut data = $data;
let passphrase = $passphrase;
let result = (|| {
let mut encryptor =
Kyber::<Encryption, Kyber512, Data, XChaCha20Poly1305>::new(key.to_owned(), None)?;
let (encrypt_message, cipher) = encryptor.encrypt_data(data.to_owned(), &passphrase)?;
let nonce = encryptor.get_nonce()?;
Ok::<_, CryptError>((encrypt_message, cipher, nonce.to_string()))
})();
key.zeroize();
data.zeroize();
passphrase.to_string().zeroize();
result
}};
}
#[macro_export]
macro_rules! decryption {
($key:expr, 1024, $data:expr, $passphrase:expr, $cipher:expr, AES) => {{
let mut key = $key;
let mut data = $data;
let passphrase = $passphrase;
let mut cipher = $cipher;
let result = (|| {
let decryptor = Kyber::<Decryption, Kyber1024, Data, AES>::new(key.to_owned(), None)?;
decryptor.decrypt_data(data.to_owned(), &passphrase, cipher.to_owned())
})();
key.zeroize();
data.zeroize();
passphrase.to_string().zeroize();
cipher.zeroize();
result
}};
($key:expr, 768, $data:expr, $passphrase:expr, $cipher:expr, AES) => {{
let mut key = $key;
let mut data = $data;
let passphrase = $passphrase;
let mut cipher = $cipher;
let result = (|| {
let decryptor = Kyber::<Decryption, Kyber768, Data, AES>::new(key.to_owned(), None)?;
decryptor.decrypt_data(data.to_owned(), &passphrase, cipher.to_owned())
})();
key.zeroize();
data.zeroize();
passphrase.to_string().zeroize();
cipher.zeroize();
result
}};
($key:expr, 512, $data:expr, $passphrase:expr, $cipher:expr, AES_XTS) => {{
let mut key = $key;
let mut data = $data;
let passphrase = $passphrase;
let mut cipher = $cipher;
let result = (|| {
let decryptor = Kyber::<Decryption, Kyber512, Data, AesXts>::new(key.to_owned(), None)?;
decryptor.decrypt_data(data.to_owned(), &passphrase.to_owned(), cipher.to_owned())
})();
key.zeroize();
data.zeroize();
passphrase.to_string().zeroize();
cipher.zeroize();
result
}};
($key:expr, 1024, $data:expr, $passphrase:expr, $cipher:expr, AES_XTS) => {{
let mut key = $key;
let mut data = $data;
let passphrase = $passphrase;
let mut cipher = $cipher;
let result = (|| {
let decryptor =
Kyber::<Decryption, Kyber1024, Data, AesXts>::new(key.to_owned(), None)?;
decryptor.decrypt_data(data.to_owned(), &passphrase.to_owned(), cipher.to_owned())
})();
key.zeroize();
data.zeroize();
passphrase.to_string().zeroize();
cipher.zeroize();
result
}};
($key:expr, 768, $data:expr, $passphrase:expr, $cipher:expr, AES_XTS) => {{
let mut key = $key;
let mut data = $data;
let passphrase = $passphrase;
let mut cipher = $cipher;
let result = (|| {
let decryptor = Kyber::<Decryption, Kyber768, Data, AesXts>::new(key.to_owned(), None)?;
decryptor.decrypt_data(data.to_owned(), &passphrase.to_owned(), cipher.to_owned())
})();
key.zeroize();
data.zeroize();
passphrase.to_string().zeroize();
cipher.zeroize();
result
}};
($key:expr, 512, $data:expr, $passphrase:expr, $cipher:expr, AES) => {{
let mut key = $key;
let mut data = $data;
let passphrase = $passphrase;
let mut cipher = $cipher;
let result = (|| {
let decryptor = Kyber::<Decryption, Kyber512, Data, AES>::new(key.to_owned(), None)?;
decryptor.decrypt_data(data.to_owned(), &passphrase, cipher.to_owned())
})();
key.zeroize();
data.zeroize();
passphrase.to_string().zeroize();
cipher.zeroize();
result
}};
($key:expr, 1024, $data:expr, $passphrase:expr, $cipher:expr, AES_CBC) => {{
let mut key = $key;
let mut data = $data;
let passphrase = $passphrase;
let mut cipher = $cipher;
let result = (|| {
let decryptor = Kyber::<Decryption, Kyber1024, Data, AES>::new(key.to_owned(), None)?;
decryptor.decrypt_data(data.to_owned(), &passphrase, cipher.to_owned())
})();
key.zeroize();
data.zeroize();
passphrase.to_string().zeroize();
cipher.zeroize();
result
}};
($key:expr, 768, $data:expr, $passphrase:expr, $cipher:expr, AES_CBC) => {{
let mut key = $key;
let mut data = $data;
let passphrase = $passphrase;
let mut cipher = $cipher;
let result = (|| {
let decryptor = Kyber::<Decryption, Kyber768, Data, AES>::new(key.to_owned(), None)?;
decryptor.decrypt_data(data.to_owned(), &passphrase, cipher.to_owned())
})();
key.zeroize();
data.zeroize();
passphrase.to_string().zeroize();
cipher.zeroize();
result
}};
($key:expr, 512, $data:expr, $passphrase:expr, $cipher:expr, AES_CBC) => {{
let mut key = $key;
let mut data = $data;
let passphrase = $passphrase;
let mut cipher = $cipher;
let result = (|| {
let decryptor = Kyber::<Decryption, Kyber512, Data, AES>::new(key.to_owned(), None)?;
decryptor.decrypt_data(data.to_owned(), &passphrase, cipher.to_owned())
})();
key.zeroize();
data.zeroize();
passphrase.to_string().zeroize();
cipher.zeroize();
result
}};
($key:expr, 1024, $data:expr, $passphrase:expr, $cipher:expr, $nonce:expr, AES_GCM_SIV) => {{
let mut key = $key;
let mut data = $data;
let passphrase = $passphrase;
let mut cipher = $cipher;
let nonce = $nonce;
let result = (|| {
let decryptor = Kyber::<Decryption, Kyber1024, Data, AesGcmSiv>::new(
key.to_owned(),
nonce.to_owned(),
)?;
decryptor.decrypt_data(data.to_owned(), &passphrase, cipher.to_owned())
})();
key.zeroize();
data.zeroize();
passphrase.to_string().zeroize();
cipher.zeroize();
result
}};
($key:expr, 768, $data:expr, $passphrase:expr, $cipher:expr, $nonce:expr, AES_GCM_SIV) => {{
let mut key = $key;
let mut data = $data;
let passphrase = $passphrase;
let mut cipher = $cipher;
let nonce = $nonce;
let result = (|| {
let decryptor = Kyber::<Decryption, Kyber768, Data, AesGcmSiv>::new(
key.to_owned(),
nonce.to_owned(),
)?;
decryptor.decrypt_data(data.to_owned(), &passphrase, cipher.to_owned())
})();
key.zeroize();
data.zeroize();
passphrase.to_string().zeroize();
cipher.zeroize();
result
}};
($key:expr, 512, $data:expr, $passphrase:expr, $cipher:expr, $nonce:expr, AES_GCM_SIV) => {{
let mut key = $key;
let mut data = $data;
let passphrase = $passphrase;
let mut cipher = $cipher;
let nonce = $nonce;
let result = (|| {
let decryptor = Kyber::<Decryption, Kyber512, Data, AesGcmSiv>::new(
key.to_owned(),
nonce.to_owned(),
)?;
decryptor.decrypt_data(data.to_owned(), &passphrase, cipher.to_owned())
})();
key.zeroize();
data.zeroize();
passphrase.to_string().zeroize();
cipher.zeroize();
result
}};
($key:expr, 1024, $data:expr, $passphrase:expr, $cipher:expr, $nonce:expr, AES_CTR) => {{
let mut key = $key;
let mut data = $data;
let passphrase = $passphrase;
let mut cipher = $cipher;
let nonce = $nonce;
let result = (|| {
let decryptor = Kyber::<Decryption, Kyber1024, Data, AesCtr>::new(
key.to_owned(),
nonce.to_owned(),
)?;
decryptor.decrypt_data(data.to_owned(), &passphrase, cipher.to_owned())
})();
key.zeroize();
data.zeroize();
passphrase.to_string().zeroize();
cipher.zeroize();
result
}};
($key:expr, 768, $data:expr, $passphrase:expr, $cipher:expr, $nonce:expr, AES_CTR) => {{
let mut key = $key;
let mut data = $data;
let passphrase = $passphrase;
let mut cipher = $cipher;
let nonce = $nonce;
let result = (|| {
let decryptor =
Kyber::<Decryption, Kyber768, Data, AesCtr>::new(key.to_owned(), nonce.to_owned())?;
decryptor.decrypt_data(data.to_owned(), &passphrase, cipher.to_owned())
})();
key.zeroize();
data.zeroize();
passphrase.to_string().zeroize();
cipher.zeroize();
result
}};
($key:expr, 512, $data:expr, $passphrase:expr, $cipher:expr, $nonce:expr, AES_CTR) => {{
let mut key = $key;
let mut data = $data;
let passphrase = $passphrase;
let mut cipher = $cipher;
let nonce = $nonce;
let result = (|| {
let decryptor =
Kyber::<Decryption, Kyber512, Data, AesCtr>::new(key.to_owned(), nonce.to_owned())?;
decryptor.decrypt_data(data.to_owned(), &passphrase, cipher.to_owned())
})();
key.zeroize();
data.zeroize();
passphrase.to_string().zeroize();
cipher.zeroize();
result
}};
($key:expr, 1024, $data:expr, $passphrase:expr, $cipher:expr, $nonce:expr, XChaCha20) => {{
let mut key = $key;
let mut data = $data;
let passphrase = $passphrase;
let mut cipher = $cipher;
let mut nonce = $nonce;
let result = (|| {
let decryptor = Kyber::<Decryption, Kyber1024, Data, XChaCha20>::new(
key.to_owned(),
nonce.to_owned(),
)?;
decryptor.decrypt_data(data.to_owned(), &passphrase, cipher.to_owned())
})();
key.zeroize();
data.zeroize();
passphrase.to_string().zeroize();
cipher.zeroize();
nonce.zeroize();
result
}};
($key:expr, 768, $data:expr, $passphrase:expr, $cipher:expr, $nonce:expr, XChaCha20) => {{
let mut key = $key;
let mut data = $data;
let passphrase = $passphrase;
let mut cipher = $cipher;
let mut nonce = $nonce;
let result = (|| {
let decryptor = Kyber::<Decryption, Kyber768, Data, XChaCha20>::new(
key.to_owned(),
nonce.to_owned(),
)?;
decryptor.decrypt_data(data.to_owned(), &passphrase, cipher.to_owned())
})();
key.zeroize();
data.zeroize();
passphrase.to_string().zeroize();
cipher.zeroize();
nonce.zeroize();
result
}};
($key:expr, 512, $data:expr, $passphrase:expr, $cipher:expr, $nonce:expr, XChaCha20) => {{
let mut key = $key;
let mut data = $data;
let passphrase = $passphrase;
let mut cipher = $cipher;
let mut nonce = $nonce;
let result = (|| {
let decryptor = Kyber::<Decryption, Kyber512, Data, XChaCha20>::new(
key.to_owned(),
nonce.to_owned(),
)?;
decryptor.decrypt_data(data.to_owned(), &passphrase, cipher.to_owned())
})();
key.zeroize();
data.zeroize();
passphrase.to_string().zeroize();
cipher.zeroize();
nonce.zeroize();
result
}};
($key:expr, 1024, $data:expr, $passphrase:expr, $cipher:expr, $nonce:expr, XChaCha20Poly1305) => {{
let mut key = $key;
let mut data = $data;
let passphrase = $passphrase;
let mut cipher = $cipher;
let mut nonce = $nonce;
let result = (|| {
let decryptor = Kyber::<Decryption, Kyber1024, Data, XChaCha20Poly1305>::new(
key.to_owned(),
nonce.to_owned(),
)?;
decryptor.decrypt_data(data.to_owned(), &passphrase, cipher.to_owned())
})();
key.zeroize();
data.zeroize();
passphrase.to_string().zeroize();
cipher.zeroize();
nonce.zeroize();
result
}};
($key:expr, 768, $data:expr, $passphrase:expr, $cipher:expr, $nonce:expr, XChaCha20Poly1305) => {{
let mut key = $key;
let mut data = $data;
let passphrase = $passphrase;
let mut cipher = $cipher;
let mut nonce = $nonce;
let result = (|| {
let decryptor = Kyber::<Decryption, Kyber768, Data, XChaCha20Poly1305>::new(
key.to_owned(),
nonce.to_owned(),
)?;
decryptor.decrypt_data(data.to_owned(), &passphrase, cipher.to_owned())
})();
key.zeroize();
data.zeroize();
passphrase.to_string().zeroize();
cipher.zeroize();
nonce.zeroize();
result
}};
($key:expr, 512, $data:expr, $passphrase:expr, $cipher:expr, $nonce:expr, XChaCha20Poly1305) => {{
let mut key = $key;
let mut data = $data;
let passphrase = $passphrase;
let mut cipher = $cipher;
let mut nonce = $nonce;
let result = (|| {
let decryptor = Kyber::<Decryption, Kyber512, Data, XChaCha20Poly1305>::new(
key.to_owned(),
nonce.to_owned(),
)?;
decryptor.decrypt_data(data.to_owned(), &passphrase, cipher.to_owned())
})();
key.zeroize();
data.zeroize();
passphrase.to_string().zeroize();
cipher.zeroize();
nonce.zeroize();
result
}};
}
#[macro_export]
macro_rules! encrypt_file {
($key:expr, 1024, $path:expr, $passphrase:expr, AES) => {{
let mut key = $key;
let passphrase = $passphrase;
let result = (|| {
let mut encryptor =
Kyber::<Encryption, Kyber1024, Data, AES>::new(key.to_owned(), None)?;
encryptor.encrypt_file($path, &passphrase)
})();
key.zeroize();
passphrase.to_string().zeroize();
result
}};
($key:expr, 768, $path:expr, $passphrase:expr, AES) => {{
let mut key = $key;
let passphrase = $passphrase;
let result = (|| {
let mut encryptor =
Kyber::<Encryption, Kyber768, Data, AES>::new(key.to_owned(), None)?;
encryptor.encrypt_file($path, &passphrase)
})();
key.zeroize();
passphrase.to_string().zeroize();
result
}};
($key:expr, 512, $path:expr, $passphrase:expr, AES) => {{
let mut key = $key;
let passphrase = $passphrase;
let result = (|| {
let mut encryptor =
Kyber::<Encryption, Kyber512, Data, AES>::new(key.to_owned(), None)?;
encryptor.encrypt_file($path, &passphrase)
})();
key.zeroize();
passphrase.to_string().zeroize();
result
}};
($key:expr, 1024, $path:expr, $passphrase:expr, XChaCha20) => {{
let mut key = $key;
let passphrase = $passphrase;
let result = (|| {
let mut encryptor =
Kyber::<Encryption, Kyber1024, Data, XChaCha20>::new(key.to_owned(), None)?;
let (encrypt_message, cipher) = encryptor.encrypt_file($path, &passphrase)?;
let nonce = encryptor.get_nonce()?;
Ok::<_, CryptError>((encrypt_message, cipher, nonce.to_string()))
})();
key.zeroize();
passphrase.to_string().zeroize();
result
}};
($key:expr, 768, $path:expr, $passphrase:expr, XChaCha20) => {{
let mut key = $key;
let passphrase = $passphrase;
let result = (|| {
let mut encryptor =
Kyber::<Encryption, Kyber768, Data, XChaCha20>::new(key.to_owned(), None)?;
let (encrypt_message, cipher) = encryptor.encrypt_file($path, &passphrase)?;
let nonce = encryptor.get_nonce()?;
Ok::<_, CryptError>((encrypt_message, cipher, nonce.to_string()))
})();
key.zeroize();
passphrase.to_string().zeroize();
result
}};
($key:expr, 512, $path:expr, $passphrase:expr, XChaCha20) => {{
let mut key = $key;
let passphrase = $passphrase;
let result = (|| {
let mut encryptor =
Kyber::<Encryption, Kyber512, Data, XChaCha20>::new(key.to_owned(), None)?;
let (encrypt_message, cipher) = encryptor.encrypt_file($path, &passphrase)?;
let nonce = encryptor.get_nonce()?;
Ok::<_, CryptError>((encrypt_message, cipher, nonce.to_string()))
})();
key.zeroize();
passphrase.to_string().zeroize();
result
}};
}
#[macro_export]
macro_rules! decrypt_file {
($key:expr, 1024, $path:expr, $passphrase:expr, $cipher:expr, AES) => {{
let mut key = $key;
let passphrase = $passphrase;
let mut cipher = $cipher;
let result = (|| {
let decryptor = Kyber::<Decryption, Kyber1024, Data, AES>::new(key.to_owned(), None)?;
decryptor.decrypt_file($path.to_owned(), &passphrase.to_owned(), cipher.to_owned())
})();
key.zeroize();
passphrase.to_string().zeroize();
cipher.zeroize();
result
}};
($key:expr, 768, $path:expr, $passphrase:expr, $cipher:expr, AES) => {{
let mut key = $key;
let passphrase = $passphrase;
let mut cipher = $cipher;
let result = (|| {
let decryptor = Kyber::<Decryption, Kyber768, Data, AES>::new(key.to_owned(), None)?;
decryptor.decrypt_file($path.to_owned(), &passphrase.to_owned(), cipher.to_owned())
})();
key.zeroize();
passphrase.to_string().zeroize();
cipher.zeroize();
result
}};
($key:expr, 512, $path:expr, $passphrase:expr, $cipher:expr, AES) => {{
let mut key = $key;
let passphrase = $passphrase;
let mut cipher = $cipher;
let result = (|| {
let decryptor = Kyber::<Decryption, Kyber512, Data, AES>::new(key.to_owned(), None)?;
decryptor.decrypt_file($path.to_owned(), &passphrase.to_owned(), cipher.to_owned())
})();
key.zeroize();
passphrase.to_string().zeroize();
cipher.zeroize();
result
}};
($key:expr, 1024, $path:expr, $passphrase:expr, $cipher:expr, $nonce:expr, XChaCha20) => {{
let mut key = $key;
let passphrase = $passphrase;
let mut cipher = $cipher;
let mut nonce = $nonce;
let result = (|| {
let decryptor = Kyber::<Decryption, Kyber1024, Data, XChaCha20>::new(
key.to_owned(),
nonce.to_owned(),
)?;
decryptor.decrypt_file($path.to_owned(), &passphrase.to_owned(), cipher.to_owned())
})();
key.zeroize();
passphrase.to_string().zeroize();
cipher.zeroize();
nonce.zeroize();
result
}};
($key:expr, 768, $path:expr, $passphrase:expr, $cipher:expr, $nonce:expr, XChaCha20) => {{
let mut key = $key;
let passphrase = $passphrase;
let mut cipher = $cipher;
let mut nonce = $nonce;
let result = (|| {
let decryptor = Kyber::<Decryption, Kyber768, Data, XChaCha20>::new(
key.to_owned(),
nonce.to_owned(),
)?;
decryptor.decrypt_file($path.to_owned(), &passphrase.to_owned(), cipher.to_owned())
})();
key.zeroize();
passphrase.to_string().zeroize();
cipher.zeroize();
nonce.zeroize();
result
}};
($key:expr, 512, $path:expr, $passphrase:expr, $cipher:expr, $nonce:expr, XChaCha20) => {{
let mut key = $key;
let passphrase = $passphrase;
let mut cipher = $cipher;
let mut nonce = $nonce;
let result = (|| {
let decryptor = Kyber::<Decryption, Kyber512, Data, XChaCha20>::new(
key.to_owned(),
nonce.to_owned(),
)?;
decryptor.decrypt_file($path.to_owned(), &passphrase.to_owned(), cipher.to_owned())
})();
key.zeroize();
passphrase.to_string().zeroize();
cipher.zeroize();
nonce.zeroize();
result
}};
}
#[macro_export]
macro_rules! signature {
(Falcon, $key:expr, 1024, $content:expr, Message) => {{
let mut key = $key;
let mut content = $content;
let result = (|| {
let sign = Signature::<Falcon1024, Message>::new();
sign.signature(content.to_owned(), key.to_owned())
})();
key.zeroize();
content.zeroize();
result
}};
(Falcon, $key:expr, 1024, $content:expr, Detached) => {{
let mut key = $key;
let mut content = $content;
let result = (|| {
let sign = Signature::<Falcon1024, Detached>::new();
sign.signature(content.to_owned(), key.to_owned())
})();
key.zeroize();
content.zeroize();
result
}};
(Falcon, $key:expr, 512, $content:expr, Message) => {{
let mut key = $key;
let mut content = $content;
let result = (|| {
let sign = Signature::<Falcon512, Message>::new();
sign.signature(content.to_owned(), key.to_owned())
})();
key.zeroize();
content.zeroize();
result
}};
(Falcon, $key:expr, 512, $content:expr, Detached) => {{
let mut key = $key;
let mut content = $content;
let result = (|| {
let sign = Signature::<Falcon512, Detached>::new();
sign.signature(content.to_owned(), key.to_owned())
})();
key.zeroize();
content.zeroize();
result
}};
(Dilithium, $key:expr, 5, $content:expr, Message) => {{
let mut key = $key;
let mut content = $content;
let result = (|| {
let sign = Signature::<Dilithium5, Message>::new();
sign.signature(content.to_owned(), key.to_owned())
})();
key.zeroize();
content.zeroize();
result
}};
(Dilithium, $key:expr, 5, $content:expr, Detached) => {{
let mut key = $key;
let mut content = $content;
let result = (|| {
let sign = Signature::<Dilithium5, Detached>::new();
sign.signature(content.to_owned(), key.to_owned())
})();
key.zeroize();
content.zeroize();
result
}};
(Dilithium, $key:expr, 3, $content:expr, Message) => {{
let mut key = $key;
let mut content = $content;
let result = (|| {
let sign = Signature::<Dilithium3, Message>::new();
sign.signature(content.to_owned(), key.to_owned())
})();
key.zeroize();
content.zeroize();
result
}};
(Dilithium, $key:expr, 3, $content:expr, Detached) => {{
let mut key = $key;
let mut content = $content;
let result = (|| {
let sign = Signature::<Dilithium3, Detached>::new();
sign.signature(content.to_owned(), key.to_owned())
})();
key.zeroize();
content.zeroize();
result
}};
(Dilithium, $key:expr, 2, $content:expr, Message) => {{
let mut key = $key;
let mut content = $content;
let result = (|| {
let sign = Signature::<Dilithium2, Message>::new();
sign.signature(content.to_owned(), key.to_owned())
})();
key.zeroize();
content.zeroize();
result
}};
(Dilithium, $key:expr, 2, $content:expr, Detached) => {{
let mut key = $key;
let mut content = $content;
let result = (|| {
let sign = Signature::<Dilithium2, Detached>::new();
sign.signature(content.to_owned(), key.to_owned())
})();
key.zeroize();
content.zeroize();
result
}};
}
#[macro_export]
macro_rules! verify {
(Falcon, $key:expr, 1024, $content:expr, Message) => {{
let mut key = $key;
let mut content = $content;
let result = (|| {
let sign = Signature::<Falcon1024, Message>::new();
sign.open(content.to_owned(), key.to_owned())
})();
key.zeroize();
content.zeroize();
result
}};
(Falcon, $key:expr, 1024, $signature:expr, $content:expr, Detached) => {{
let mut key = $key;
let mut signature = $signature;
let mut content = $content;
let result = (|| {
let sign = Signature::<Falcon1024, Detached>::new();
sign.verify(content.to_owned(), signature.to_owned(), key.to_owned())
})();
key.zeroize();
signature.zeroize();
content.zeroize();
result
}};
(Falcon, $key:expr, 512, $content:expr, Message) => {{
let mut key = $key;
let mut content = $content;
let result = (|| {
let sign = Signature::<Falcon512, Message>::new();
sign.open(content.to_owned(), key.to_owned())
})();
key.zeroize();
content.zeroize();
result
}};
(Falcon, $key:expr, 512, $signature:expr, $content:expr, Detached) => {{
let mut key = $key;
let mut signature = $signature;
let mut content = $content;
let result = (|| {
let sign = Signature::<Falcon512, Detached>::new();
sign.verify(content.to_owned(), signature.to_owned(), key.to_owned())
})();
key.zeroize();
signature.zeroize();
content.zeroize();
result
}};
(Dilithium, $key:expr, 5, $content:expr, Message) => {{
let mut key = $key;
let mut content = $content;
let result = (|| {
let sign = Signature::<Dilithium5, Message>::new();
sign.open(content.to_owned(), key.to_owned())
})();
key.zeroize();
content.zeroize();
result
}};
(Dilithium, $key:expr, 5, $signature:expr, $content:expr, Detached) => {{
let mut key = $key;
let mut signature = $signature;
let mut content = $content;
let result = (|| {
let sign = Signature::<Dilithium5, Detached>::new();
sign.verify(content.to_owned(), signature.to_owned(), key.to_owned())
})();
key.zeroize();
signature.zeroize();
content.zeroize();
result
}};
(Dilithium, $key:expr, 3, $content:expr, Message) => {{
let mut key = $key;
let mut content = $content;
let result = (|| {
let sign = Signature::<Dilithium3, Message>::new();
sign.open(content.to_owned(), key.to_owned())
})();
key.zeroize();
content.zeroize();
result
}};
(Dilithium, $key:expr, 3, $signature:expr, $content:expr, Detached) => {{
let mut key = $key;
let mut signature = $signature;
let mut content = $content;
let result = (|| {
let sign = Signature::<Dilithium3, Detached>::new();
sign.verify(content.to_owned(), signature.to_owned(), key.to_owned())
})();
key.zeroize();
signature.zeroize();
content.zeroize();
result
}};
(Dilithium, $key:expr, 2, $content:expr, Message) => {{
let mut key = $key;
let mut content = $content;
let result = (|| {
let sign = Signature::<Dilithium2, Message>::new();
sign.open(content.to_owned(), key.to_owned())
})();
key.zeroize();
content.zeroize();
result
}};
(Dilithium, $key:expr, 2, $signature:expr, $content:expr, Detached) => {{
let mut key = $key;
let mut signature = $signature;
let mut content = $content;
let result = (|| {
let sign = Signature::<Dilithium2, Detached>::new();
sign.verify(content.to_owned(), signature.to_owned(), key.to_owned())
})();
key.zeroize();
signature.zeroize();
content.zeroize();
result
}};
}