use crate::memguard::SecretBytes;
use crate::secrets_store_capnp::{block, KeyDerivationType, KeyType};
use super::SecretStoreResult;
#[cfg(feature = "openssl")]
mod openssl_rsa_aes_gcm;
mod rust_argon2id;
#[cfg(feature = "rust_crypto")]
mod rust_rsa_aes_gcm;
mod rust_x25519_chacha20_poly1305;
#[cfg(feature = "openssl")]
pub use self::openssl_rsa_aes_gcm::OPEN_SSL_RSA_AES_GCM;
pub use self::rust_argon2id::RUST_ARGON2_ID;
#[cfg(feature = "rust_crypto")]
pub use self::rust_rsa_aes_gcm::RUST_RSA_AES_GCM;
pub use self::rust_x25519_chacha20_poly1305::RUST_X25519CHA_CHA20POLY1305;
#[cfg(test)]
mod fixture_tests;
#[cfg(test)]
mod tests;
pub type PublicKey = Vec<u8>;
pub type PrivateKey = SecretBytes;
type PublicData = Vec<u8>;
type PrivateData = SecretBytes;
type SealKey = SecretBytes;
pub trait Cipher: Send + Sync {
fn key_type(&self) -> KeyType;
fn name(&self) -> String;
fn generate_key_pair(&self) -> SecretStoreResult<(PublicKey, PrivateKey)>;
fn seal_key_length(&self) -> usize;
fn seal_min_nonce_length(&self) -> usize;
fn seal_private_key(
&self,
seal_key: &SealKey,
nonce: &[u8],
private_key: &PrivateKey,
) -> SecretStoreResult<PublicData>;
fn open_private_key(&self, seal_key: &SealKey, nonce: &[u8], crypted_key: &[u8]) -> SecretStoreResult<PrivateKey>;
fn encrypt(
&self,
recipients: &[(&str, PublicKey)],
data: &PrivateData,
header_builder: block::header::Builder,
) -> SecretStoreResult<PublicData>;
fn decrypt(
&self,
user: (&str, &PrivateKey),
header: block::header::Reader,
crypted: &[u8],
) -> SecretStoreResult<PrivateData>;
fn find_matching_header<'a>(
&self,
headers: &capnp::struct_list::Reader<'a, block::header::Owned>,
) -> SecretStoreResult<Option<block::header::Reader<'a>>> {
for header in headers.iter() {
if header.get_type()? == self.key_type() {
return Ok(Some(header));
}
}
Ok(None)
}
}
pub trait KeyDerivation: Send + Sync {
fn key_derivation_type(&self) -> KeyDerivationType;
fn default_preset(&self) -> u8;
fn min_nonce_len(&self) -> usize;
fn derive(&self, passphrase: &SecretBytes, preset: u8, nonce: &[u8], key_length: usize)
-> SecretStoreResult<SealKey>;
}