1use rand::{Rng, distr::Alphanumeric, rng};
2
3extern crate libc;
4
5#[inline]
7pub fn safe_copy(dst: &mut [u8], src: &[u8]) -> usize {
8 let len = dst.len();
9 let other_len = src.len();
10 if other_len > len {
11 dst.copy_from_slice(&src[0..len]);
12 return len;
13 } else if other_len < len {
14 dst[0..other_len].copy_from_slice(src);
15 return other_len;
16 } else {
17 dst.copy_from_slice(src);
18 return len;
19 }
20}
21
22#[inline(always)]
24pub fn set_zero(dst: &mut [u8]) {
25 unsafe {
26 libc::memset(dst.as_mut_ptr() as *mut libc::c_void, 0, dst.len());
27 }
28}
29
30#[inline]
32pub fn rand_buffer<T: AsMut<[u8]>>(dst: &mut T) {
33 let s: &mut [u8] = dst.as_mut();
34 let len = s.len();
35 let mut rng = rng();
36 for i in 0..len {
37 s[i] = rng.sample(Alphanumeric) as u8;
38 }
39}
40
41#[inline(always)]
43pub fn is_all_zero(s: &[u8]) -> bool {
44 for c in s {
45 if *c != 0 {
46 return false;
47 }
48 }
49 true
50}
51
52#[cfg(test)]
53mod tests {
54
55 extern crate md5;
56 use super::*;
57
58 #[test]
59 fn test_safe_copy() {
60 let buf1: [u8; 10] = [0; 10];
61 let mut buf2: [u8; 10] = [1; 10];
62 let mut buf3: [u8; 10] = [2; 10];
63 let zero: usize = 0;
64 assert_eq!(0, safe_copy(&mut buf2[0..zero], &buf3));
66 assert_eq!(&buf2, &[1; 10]);
67 assert_eq!(0, safe_copy(&mut buf2[10..], &buf3));
68 assert_eq!(&buf2, &[1; 10]);
69 assert_eq!(10, safe_copy(&mut buf2, &buf1));
73 assert_eq!(buf1, buf2);
74 assert_eq!(5, safe_copy(&mut buf2[5..], &buf3));
75 assert_eq!(buf1[0..5], buf2[0..5]);
76 assert_eq!(buf2[5..], buf3[5..]);
77 assert_eq!(5, safe_copy(&mut buf3[0..5], &buf1));
78 assert_eq!(buf2, buf3);
79 }
80
81 #[test]
82 fn test_rand_buffer() {
83 let mut buf1: [u8; 10] = [0; 10];
84 let mut buf2: [u8; 10] = [0; 10];
85 rand_buffer(&mut buf1);
86 rand_buffer(&mut buf2);
87 assert!(md5::compute(&buf1) != md5::compute(&buf2));
88 }
89
90 #[test]
91 fn test_set_zero() {
92 let mut buf1: [u8; 10] = [1; 10];
93 set_zero(&mut buf1);
94 for i in &buf1 {
95 assert_eq!(*i, 0)
96 }
97 }
98}