zig-std 0.1.1

Bindings to Zig `std`, with optional Rust `std` features
Documentation
use crate::util::{ ReprCSlice, sys };

pub mod pwhash;

sys! {
	pub fn zig_std_rs__crypto__secure_zero_u8(ptr: ReprCSlice<u8>);
	pub fn zig_std_rs__crypto__secure_zero_u16(ptr: ReprCSlice<u16>);
	pub fn zig_std_rs__crypto__secure_zero_u32(ptr: ReprCSlice<u32>);
	pub fn zig_std_rs__crypto__secure_zero_u64(ptr: ReprCSlice<u64>);
	pub fn zig_std_rs__crypto__secure_zero_u128(ptr: ReprCSlice<u128>);
}

#[inline]
pub fn secure_zero_u8(val: &mut u8) {
	unsafe { sys::zig_std_rs__crypto__secure_zero_u8(val.into()) }
}

#[inline]
pub fn secure_zero_u16(val: &mut u16) {
	unsafe { sys::zig_std_rs__crypto__secure_zero_u16(val.into()) }
}

#[inline]
pub fn secure_zero_u32(val: &mut u32) {
	unsafe { sys::zig_std_rs__crypto__secure_zero_u32(val.into()) }
}

#[inline]
pub fn secure_zero_u64(val: &mut u64) {
	unsafe { sys::zig_std_rs__crypto__secure_zero_u64(val.into()) }
}

#[inline]
pub fn secure_zero_u128(val: &mut u128) {
	unsafe { sys::zig_std_rs__crypto__secure_zero_u128(val.into()) }
}

#[inline]
pub fn secure_zero_u8_slice(val: &mut [u8]) {
	unsafe { sys::zig_std_rs__crypto__secure_zero_u8(val.into()) }
}

#[inline]
pub fn secure_zero_u16_slice(val: &mut [u16]) {
	unsafe { sys::zig_std_rs__crypto__secure_zero_u16(val.into()) }
}

#[inline]
pub fn secure_zero_u32_slice(val: &mut [u32]) {
	unsafe { sys::zig_std_rs__crypto__secure_zero_u32(val.into()) }
}

#[inline]
pub fn secure_zero_u64_slice(val: &mut [u64]) {
	unsafe { sys::zig_std_rs__crypto__secure_zero_u64(val.into()) }
}

#[inline]
pub fn secure_zero_u128_slice(val: &mut [u128]) {
	unsafe { sys::zig_std_rs__crypto__secure_zero_u128(val.into()) }
}

#[cfg(test)]
mod tests {
	use super::*;

	macro_rules! test_secure_zero {
		{
			$(
				$fn:ident
				$test_fn:ident
				$fn_slice:ident
				$test_fn_slice:ident
				$ty:ty
			)*
		} => {
			$(
				#[test]
				fn $test_fn() {
					let mut values: [$ty; _] = [1, 2, 4, 6, 247];

					for value in &mut values {
						$fn(value);
						assert_eq!(*value, 0);
					}
				}

				#[test]
				fn $test_fn_slice() {
					let mut values: [$ty; _] = [1, 2, 4, 6, 247];

					$fn_slice(&mut values);
					assert_eq!(values, [0; 5]);
				}
			)*
		}
	}

	test_secure_zero! {
		secure_zero_u8
		test_secure_zero_u8
		secure_zero_u8_slice
		test_secure_zero_u8_slice
		u8

		secure_zero_u16
		test_secure_zero_u16
		secure_zero_u16_slice
		test_secure_zero_u16_slice
		u16

		secure_zero_u32
		test_secure_zero_u32
		secure_zero_u32_slice
		test_secure_zero_u32_slice
		u32

		secure_zero_u64
		test_secure_zero_u64
		secure_zero_u64_slice
		test_secure_zero_u64_slice
		u64

		secure_zero_u128
		test_secure_zero_u128
		secure_zero_u128_slice
		test_secure_zero_u128_slice
		u128

	}
}