Skip to main content

zig_std/crypto/pwhash/
argon2.rs

1use crate::util::{ ReprCSlice, sys };
2
3sys! {
4	pub fn zig_std_rs__crypto__pwhash__argon2__calc_size(params: Params) -> usize;
5}
6
7#[repr(u8)]
8pub enum Mode {
9	Argon2d = 0,
10	Argon2i = 1,
11	Argon2id = 2
12}
13
14#[repr(C)]
15pub struct Params {
16	t: u32,
17	m: u32,
18	p: u32,
19
20	secret: ReprCSlice<u8>,
21	ad: ReprCSlice<u8>
22}
23
24#[inline]
25pub fn calc_size(params: Params) -> usize {
26	unsafe { sys::zig_std_rs__crypto__pwhash__argon2__calc_size(params) }
27}
28
29// size/align assertions
30const _: () = {
31	assert!(size_of::<Mode>() == 1);
32	assert!(align_of::<Mode>() == 1);
33	// 4 * size of u32 because of padding for alignment
34	// 4 * size of usize because each ReprCSlice is 2 * usize
35	assert!(size_of::<Params>() == (4 * size_of::<u32>()) + (4 * size_of::<usize>()));
36	assert!(align_of::<Params>() == align_of::<usize>());
37};
38
39#[cfg(test)]
40mod tests {
41	use super::*;
42
43	#[test]
44	fn test_calc_size() {
45		// todo we could maybe improve this?
46
47		let params = Params {
48			t: 4,
49			m: 0x10000,
50			p: 2,
51			secret: ReprCSlice::null(),
52			ad: ReprCSlice::null()
53		};
54		let expected = 67108864;
55		let size = calc_size(params);
56
57		assert_eq!(expected, size);
58	}
59}