nx_argon2id_test.nx source
↩ module page · 133 lines · 4729 B
1// nx_argon2id_test.nx -- internal-consistency smoke for Argon2id (p=1).
2//
3// expect_exit: 0
4//
5// Property tests (RFC compliance NOT yet cross-validated against
6// argon2_ref C output; this proves the orchestrator is internally
7// consistent + sensitive to every parameter):
8//
9// 1. Determinism: same (P, S, p, m, t, tau) -> same tag.
10// 2. Salt sensitivity: change one salt byte -> different tag.
11// 3. Password sensitivity: change one password byte -> different tag.
12// 4. Memory sensitivity: change m -> different tag.
13// 5. Iteration sensitivity: change t -> different tag.
14//
15// license_tier: ORIGINAL
16
17import "nx_syscalls_x86_64.nx"
18import "nx_blake2b.nx"
19import "nx_argon2_block.nx"
20import "nx_argon2id.nx"
21
22func bytes_eq(a: *u8, b: *u8, n: i64) -> i64 {
23 var i: i64 = 0
24 while i < n {
25 if a[i] != b[i] { return 0 }
26 i = i + 1
27 }
28 return 1
29}
30
31// Allocate + initialize a context bundle ready for use.
32func make_ctx(m_kib: i64) -> *NxArgon2idCtx {
33 let raw: *u8 = sys_mmap(NX_ARGON2ID_CTX_BYTES)
34 let ctx: *NxArgon2idCtx = raw as *NxArgon2idCtx
35 ctx.memory_blocks = sys_mmap(m_kib * 1024)
36 ctx.h0_buf = sys_mmap(64)
37 ctx.prepend_buf = sys_mmap(2048)
38 ctx.prev_buf = sys_mmap(64)
39 ctx.curr_buf = sys_mmap(64)
40 ctx.zero_block = sys_mmap(1024)
41 ctx.z_buf = sys_mmap(1024)
42 ctx.tmp_block = sys_mmap(1024)
43 ctx.addr_block = sys_mmap(1024)
44 ctx.final_block = sys_mmap(1024)
45 ctx.h0_input = sys_mmap(2048)
46 ctx.b2b_ctx = sys_mmap(NX_BLAKE2B_CTX_BYTES) as *NxBlake2b
47 ctx.b2b_buf = sys_mmap(128)
48 ctx.b2b_sv = sys_mmap(128) as *i64
49 ctx.b2b_sm = sys_mmap(128) as *i64
50 ctx.g_r = sys_mmap(1024) as *i64
51 ctx.g_rs = sys_mmap(1024) as *i64
52 ctx.g_col = sys_mmap(128) as *i64
53 return ctx
54}
55
56func main() -> i64 {
57 let m_kib: i64 = 8 // smallest legal m for p=1
58 let t_iters: i64 = 2
59 let tag_len: i64 = 32
60
61 let ctx: *NxArgon2idCtx = make_ctx(16) // headroom for m=12
62
63 let tag1: *u8 = sys_mmap(64)
64 let tag2: *u8 = sys_mmap(64)
65 let tag3: *u8 = sys_mmap(64)
66
67 let password: *u8 = "password" as *u8
68 let salt: *u8 = "somesalt" as *u8
69
70 // ---- Test 1: determinism ----
71 if nx_argon2id_hash(ctx, password, 8, salt, 8,
72 1, tag_len, m_kib, t_iters,
73 tag1) != NX_AR2_OK { return 1 }
74
75 if nx_argon2id_hash(ctx, password, 8, salt, 8,
76 1, tag_len, m_kib, t_iters,
77 tag2) != NX_AR2_OK { return 2 }
78
79 if bytes_eq(tag1, tag2, tag_len) != 1 { return 3 }
80
81 // ---- Test 2: salt sensitivity ----
82 let salt2: *u8 = "somesalT" as *u8
83 if nx_argon2id_hash(ctx, password, 8, salt2, 8,
84 1, tag_len, m_kib, t_iters,
85 tag3) != NX_AR2_OK { return 10 }
86 if bytes_eq(tag1, tag3, tag_len) == 1 { return 11 }
87
88 // ---- Test 3: password sensitivity ----
89 let password2: *u8 = "Password" as *u8
90 if nx_argon2id_hash(ctx, password2, 8, salt, 8,
91 1, tag_len, m_kib, t_iters,
92 tag3) != NX_AR2_OK { return 20 }
93 if bytes_eq(tag1, tag3, tag_len) == 1 { return 21 }
94
95 // ---- Test 4: memory sensitivity ----
96 if nx_argon2id_hash(ctx, password, 8, salt, 8,
97 1, tag_len, 12, t_iters,
98 tag3) != NX_AR2_OK { return 30 }
99 if bytes_eq(tag1, tag3, tag_len) == 1 { return 31 }
100
101 // ---- Test 5: iteration sensitivity ----
102 if nx_argon2id_hash(ctx, password, 8, salt, 8,
103 1, tag_len, m_kib, 3,
104 tag3) != NX_AR2_OK { return 40 }
105 if bytes_eq(tag1, tag3, tag_len) == 1 { return 41 }
106
107 // ---- BAD_PARALLELISM ----
108 if nx_argon2id_hash(ctx, password, 8, salt, 8,
109 2, tag_len, m_kib, t_iters,
110 tag3) != NX_AR2_BAD_PARALLELISM { return 50 }
111
112 // ---- BAD_MEMORY (m < 8) ----
113 if nx_argon2id_hash(ctx, password, 8, salt, 8,
114 1, tag_len, 4, t_iters,
115 tag3) != NX_AR2_BAD_MEMORY { return 51 }
116
117 // ---- BAD_MEMORY (m % 4 != 0) ----
118 if nx_argon2id_hash(ctx, password, 8, salt, 8,
119 1, tag_len, 9, t_iters,
120 tag3) != NX_AR2_BAD_MEMORY { return 52 }
121
122 // ---- BAD_ITERATIONS ----
123 if nx_argon2id_hash(ctx, password, 8, salt, 8,
124 1, tag_len, m_kib, 0,
125 tag3) != NX_AR2_BAD_ITERATIONS { return 53 }
126
127 // ---- BAD_TAG_LEN ----
128 if nx_argon2id_hash(ctx, password, 8, salt, 8,
129 1, 3, m_kib, t_iters,
130 tag3) != NX_AR2_BAD_TAG_LEN { return 54 }
131
132 return 0
133}