use ffi;
pub fn pad(buf: &mut [u8], unpadded_buflen: usize, blocksize: usize) -> Result<usize, ()> {
let mut padded_buflen_p: usize = 0;
unsafe {
if 0 == ffi::sodium_pad(
&mut padded_buflen_p,
buf.as_mut_ptr() as *mut _,
unpadded_buflen,
blocksize,
buf.len(),
) {
Ok(padded_buflen_p)
} else {
Err(())
}
}
}
pub fn unpad(buf: &[u8], padded_buflen: usize, blocksize: usize) -> Result<usize, ()> {
let mut unpadded_buflen_p: usize = 0;
unsafe {
if 0 == ffi::sodium_unpad(
&mut unpadded_buflen_p,
buf.as_ptr() as *const _,
padded_buflen,
blocksize,
) {
Ok(unpadded_buflen_p)
} else {
Err(())
}
}
}
#[cfg(test)]
mod test {
use super::*;
#[test]
pub fn test_on_block_boundary() {
const BUF_LEN: usize = 32;
let mut buf = vec![0u8; BUF_LEN];
assert_eq!(Ok(BUF_LEN), pad(&mut buf, 16, 16));
}
#[test]
pub fn test_pad_and_unpad_with_good_length() {
let mut buf = vec![0u8; 64];
for i in 0u8..33 {
buf[i as usize] = i;
}
assert_eq!(Ok(64), pad(&mut buf, 33, 32));
assert_eq!(Ok(33), unpad(&buf, 64, 32));
for i in 0u8..33 {
assert_eq!(i, buf[i as usize]);
}
assert_eq!(0x80u8, buf[33]);
for _i in 33..64 {
assert_eq!(0u8, buf[0]);
}
}
#[test]
pub fn test_on_bad_length() {
const BUF_LEN: usize = 32;
let mut buf = vec![0u8; BUF_LEN];
assert_eq!(Err(()), pad(&mut buf, BUF_LEN, BUF_LEN));
assert_eq!(Err(()), unpad(&buf, BUF_LEN, BUF_LEN));
}
}