use crate::{Buffer, CryptoResult};
#[macro_export]
macro_rules! kx_client_session_keys {
($cs:expr => client_rx: $c_rx:expr, client_tx: $c_tx:expr, client_pk: $c_pk:expr, client_sk: $c_sk:expr, server_pk: $s_pk:expr) => {
$cs.kx_client_session_keys($c_rx, $c_tx, $c_pk, $c_sk, $s_pk)
};
($cs:expr => client_rx: $c_rx:expr, client_tx: $c_tx:expr, client_pk: $c_pk:expr, client_sk: $c_sk:expr, server_pk: $s_pk:expr,) => {
$cs.kx_client_session_keys($c_rx, $c_tx, $c_pk, $c_sk, $s_pk)
};
}
#[macro_export]
macro_rules! kx_server_session_keys {
($cs:expr => server_rx: $s_rx:expr, server_tx: $s_tx:expr, server_pk: $s_pk:expr, server_sk: $s_sk:expr, client_pk: $c_pk:expr) => {
$cs.kx_server_session_keys($s_rx, $s_tx, $s_pk, $s_sk, $c_pk)
};
($cs:expr => server_rx: $s_rx:expr, server_tx: $s_tx:expr, server_pk: $s_pk:expr, server_sk: $s_sk:expr, client_pk: $c_pk:expr,) => {
$cs.kx_server_session_keys($s_rx, $s_tx, $s_pk, $s_sk, $c_pk)
};
}
#[macro_export]
macro_rules! aead_encrypt {
($cs:expr => cipher: $c:expr, message: $m:expr, adata: $a:expr, nonce: $n:expr, secret: $s:expr) => {
$cs.aead_encrypt($c, $m, $a, $n, $s)
};
($cs:expr => cipher: $c:expr, message: $m:expr, adata: $a:expr, nonce: $n:expr, secret: $s:expr,) => {
$cs.aead_encrypt($c, $m, $a, $n, $s)
};
}
#[macro_export]
macro_rules! aead_decrypt {
($cs:expr => message: $m:expr, cipher: $c:expr, adata: $a:expr, nonce: $n:expr, secret: $s:expr) => {
$cs.aead_decrypt($m, $c, $a, $n, $s)
};
($cs:expr => message: $m:expr, cipher: $c:expr, adata: $a:expr, nonce: $n:expr, secret: $s:expr,) => {
$cs.aead_decrypt($m, $c, $a, $n, $s)
};
}
#[allow(clippy::borrowed_box)]
pub trait CryptoSystem: Sync {
fn box_clone(&self) -> Box<dyn CryptoSystem>;
fn as_crypto_system(&self) -> &dyn CryptoSystem;
fn buf_new_secure(&self, size: usize) -> Box<dyn Buffer>;
fn buf_new_insecure(&self, size: usize) -> Box<dyn Buffer> {
Box::new(vec![0; size])
}
fn randombytes_buf(&self, buffer: &mut Box<dyn Buffer>) -> CryptoResult<()>;
fn hash_sha256_bytes(&self) -> usize;
fn hash_sha512_bytes(&self) -> usize;
fn hash_sha256(&self, hash: &mut Box<dyn Buffer>, data: &Box<dyn Buffer>) -> CryptoResult<()>;
fn hash_sha512(&self, hash: &mut Box<dyn Buffer>, data: &Box<dyn Buffer>) -> CryptoResult<()>;
fn generic_hash_min_bytes(&self) -> usize;
fn generic_hash_max_bytes(&self) -> usize;
fn generic_hash_key_min_bytes(&self) -> usize;
fn generic_hash_key_max_bytes(&self) -> usize;
fn generic_hash(
&self,
hash: &mut Box<dyn Buffer>,
data: &Box<dyn Buffer>,
key: Option<&Box<dyn Buffer>>,
) -> CryptoResult<()>;
fn pwhash_salt_bytes(&self) -> usize;
fn pwhash_bytes(&self) -> usize;
fn pwhash(
&self,
hash: &mut Box<dyn Buffer>,
password: &Box<dyn Buffer>,
salt: &Box<dyn Buffer>,
) -> CryptoResult<()>;
fn kdf_key_bytes(&self) -> usize;
fn kdf_context_bytes(&self) -> usize;
fn kdf_min_bytes(&self) -> usize;
fn kdf_max_bytes(&self) -> usize;
fn kdf(
&self,
out_buffer: &mut Box<dyn Buffer>,
index: u64,
context: &Box<dyn Buffer>,
parent: &Box<dyn Buffer>,
) -> CryptoResult<()>;
fn sign_seed_bytes(&self) -> usize;
fn sign_public_key_bytes(&self) -> usize;
fn sign_secret_key_bytes(&self) -> usize;
fn sign_bytes(&self) -> usize;
fn sign_seed_keypair(
&self,
seed: &Box<dyn Buffer>,
public_key: &mut Box<dyn Buffer>,
secret_key: &mut Box<dyn Buffer>,
) -> CryptoResult<()>;
fn sign_keypair(
&self,
public_key: &mut Box<dyn Buffer>,
secret_key: &mut Box<dyn Buffer>,
) -> CryptoResult<()>;
fn sign(
&self,
signature: &mut Box<dyn Buffer>,
message: &Box<dyn Buffer>,
secret_key: &Box<dyn Buffer>,
) -> CryptoResult<()>;
fn sign_verify(
&self,
signature: &Box<dyn Buffer>,
message: &Box<dyn Buffer>,
public_key: &Box<dyn Buffer>,
) -> CryptoResult<bool>;
fn kx_seed_bytes(&self) -> usize;
fn kx_public_key_bytes(&self) -> usize;
fn kx_secret_key_bytes(&self) -> usize;
fn kx_session_key_bytes(&self) -> usize;
fn kx_seed_keypair(
&self,
seed: &Box<dyn Buffer>,
public_key: &mut Box<dyn Buffer>,
secret_key: &mut Box<dyn Buffer>,
) -> CryptoResult<()>;
fn kx_keypair(
&self,
public_key: &mut Box<dyn Buffer>,
secret_key: &mut Box<dyn Buffer>,
) -> CryptoResult<()>;
fn kx_client_session_keys(
&self,
client_rx: &mut Box<dyn Buffer>,
client_tx: &mut Box<dyn Buffer>,
client_pk: &Box<dyn Buffer>,
client_sk: &Box<dyn Buffer>,
server_pk: &Box<dyn Buffer>,
) -> CryptoResult<()>;
fn kx_server_session_keys(
&self,
server_rx: &mut Box<dyn Buffer>,
server_tx: &mut Box<dyn Buffer>,
server_pk: &Box<dyn Buffer>,
server_sk: &Box<dyn Buffer>,
client_pk: &Box<dyn Buffer>,
) -> CryptoResult<()>;
fn aead_nonce_bytes(&self) -> usize;
fn aead_auth_bytes(&self) -> usize;
fn aead_secret_bytes(&self) -> usize;
fn aead_encrypt(
&self,
cipher: &mut Box<dyn Buffer>,
message: &Box<dyn Buffer>,
adata: Option<&Box<dyn Buffer>>,
nonce: &Box<dyn Buffer>,
secret: &Box<dyn Buffer>,
) -> CryptoResult<()>;
fn aead_decrypt(
&self,
message: &mut Box<dyn Buffer>,
cipher: &Box<dyn Buffer>,
adata: Option<&Box<dyn Buffer>>,
nonce: &Box<dyn Buffer>,
secret: &Box<dyn Buffer>,
) -> CryptoResult<()>;
}
pub mod crypto_system_test;