use crate::*;
pub const SEEDBYTES: usize = libsodium_sys::crypto_sign_SEEDBYTES as usize;
pub const PUBLICKEYBYTES: usize =
libsodium_sys::crypto_sign_PUBLICKEYBYTES as usize;
pub const SECRETKEYBYTES: usize =
libsodium_sys::crypto_sign_SECRETKEYBYTES as usize;
pub const SIGNATUREBYTES: usize = libsodium_sys::crypto_sign_BYTES as usize;
pub fn seed_keypair(
pub_key: &mut [u8; PUBLICKEYBYTES],
sec_key: &mut [u8; SECRETKEYBYTES],
seed: &[u8; SEEDBYTES],
) -> Result<()> {
crate::sodium_init();
unsafe {
if libsodium_sys::crypto_sign_seed_keypair(
raw_ptr_char!(pub_key),
raw_ptr_char!(sec_key),
raw_ptr_char_immut!(seed),
) == 0_i32
{
Ok(())
} else {
Err(Error::other("internal"))
}
}
}
pub fn keypair(
pub_key: &mut [u8; PUBLICKEYBYTES],
sec_key: &mut [u8; SECRETKEYBYTES],
) -> Result<()> {
crate::sodium_init();
unsafe {
if libsodium_sys::crypto_sign_keypair(
raw_ptr_char!(pub_key),
raw_ptr_char!(sec_key),
) == 0_i32
{
Ok(())
} else {
Err(Error::other("internal"))
}
}
}
pub fn sign_detached(
signature: &mut [u8; SIGNATUREBYTES],
message: &[u8],
sec_key: &[u8; SECRETKEYBYTES],
) -> Result<()> {
crate::sodium_init();
unsafe {
if libsodium_sys::crypto_sign_detached(
raw_ptr_char!(signature),
std::ptr::null_mut(),
raw_ptr_char_immut!(message),
message.len() as libc::c_ulonglong,
raw_ptr_char_immut!(sec_key),
) == 0_i32
{
Ok(())
} else {
Err(Error::other("internal"))
}
}
}
pub fn verify_detached(
signature: &[u8; SIGNATUREBYTES],
message: &[u8],
pub_key: &[u8; PUBLICKEYBYTES],
) -> bool {
crate::sodium_init();
unsafe {
libsodium_sys::crypto_sign_verify_detached(
raw_ptr_char_immut!(signature),
raw_ptr_char_immut!(message),
message.len() as libc::c_ulonglong,
raw_ptr_char_immut!(pub_key),
) == 0_i32
}
}
pub fn pk_to_curve25519(
x25519_pk: &mut [u8; libsodium_sys::crypto_scalarmult_curve25519_BYTES
as usize],
ed25519_pk: &[u8; libsodium_sys::crypto_sign_ed25519_PUBLICKEYBYTES
as usize],
) -> Result<()> {
crate::sodium_init();
unsafe {
if libsodium_sys::crypto_sign_ed25519_pk_to_curve25519(
raw_ptr_char!(x25519_pk),
raw_ptr_char_immut!(ed25519_pk),
) == 0_i32
{
Ok(())
} else {
Err(Error::other("internal"))
}
}
}
pub fn sk_to_curve25519(
x25519_sk: &mut [u8; libsodium_sys::crypto_scalarmult_curve25519_BYTES
as usize],
ed25519_sk: &[u8; libsodium_sys::crypto_sign_ed25519_SECRETKEYBYTES
as usize],
) -> Result<()> {
crate::sodium_init();
unsafe {
if libsodium_sys::crypto_sign_ed25519_sk_to_curve25519(
raw_ptr_char!(x25519_sk),
raw_ptr_char_immut!(ed25519_sk),
) == 0_i32
{
Ok(())
} else {
Err(Error::other("internal"))
}
}
}