use crate::*;
pub const XSALSA_KEYBYTES: usize =
libsodium_sys::crypto_secretbox_xsalsa20poly1305_KEYBYTES as usize;
pub const XSALSA_NONCEBYTES: usize =
libsodium_sys::crypto_secretbox_xsalsa20poly1305_NONCEBYTES as usize;
pub const XSALSA_MACBYTES: usize =
libsodium_sys::crypto_secretbox_xsalsa20poly1305_MACBYTES as usize;
pub fn xsalsa_easy(
cipher: &mut [u8],
nonce: &[u8; libsodium_sys::crypto_secretbox_xsalsa20poly1305_NONCEBYTES
as usize],
message: &[u8],
shared_key: &[u8;
libsodium_sys::crypto_secretbox_xsalsa20poly1305_KEYBYTES
as usize],
) -> Result<()> {
let cipher_len = message.len()
+ libsodium_sys::crypto_secretbox_xsalsa20poly1305_MACBYTES as usize;
if cipher.len() != cipher_len {
return Err(Error::other("bad cipher size"));
}
crate::sodium_init();
#[allow(clippy::uninit_vec)]
unsafe {
if libsodium_sys::crypto_secretbox_easy(
raw_ptr_char!(cipher),
raw_ptr_char_immut!(message),
message.len() as libc::c_ulonglong,
raw_ptr_char_immut!(nonce),
raw_ptr_char_immut!(shared_key),
) == 0_i32
{
Ok(())
} else {
Err(Error::other("internal"))
}
}
}
pub fn xsalsa_open_easy(
message: &mut [u8],
cipher: &[u8],
nonce: &[u8; libsodium_sys::crypto_secretbox_xsalsa20poly1305_NONCEBYTES
as usize],
shared_key: &[u8;
libsodium_sys::crypto_secretbox_xsalsa20poly1305_KEYBYTES
as usize],
) -> Result<()> {
let msg_len = cipher.len()
- libsodium_sys::crypto_secretbox_xsalsa20poly1305_MACBYTES as usize;
if message.len() != msg_len {
return Err(Error::other("bad message size"));
}
crate::sodium_init();
unsafe {
if libsodium_sys::crypto_secretbox_open_easy(
raw_ptr_char!(message),
raw_ptr_char_immut!(cipher),
cipher.len() as libc::c_ulonglong,
raw_ptr_char_immut!(nonce),
raw_ptr_char_immut!(shared_key),
) == 0_i32
{
Ok(())
} else {
Err(Error::other("internal"))
}
}
}
#[cfg(test)]
mod tests {
#[test]
fn test_crypto_secretbox_assert_default_salsa() {
let default_box_primitive = unsafe {
let c = std::ffi::CStr::from_ptr(
libsodium_sys::crypto_secretbox_primitive(),
);
c.to_str().unwrap()
};
assert_eq!("xsalsa20poly1305", default_box_primitive);
}
}