nx_argon2id_h0_bisect.nx source
↩ module page · 95 lines · 3842 B
1// nx_argon2id_h0_bisect.nx -- bisect step 1: verify H_0 derivation.
2//
3// expect_exit: 0
4//
5// Expected H_0 (computed via Python hashlib.blake2b on the canonical
6// Argon2id input encoding for p=1, tau=32, m=8, t=2, v=0x13, type=2,
7// P="password", S="somesalt", K="", X=""):
8//
9// 59556a60dc1ea400 147c690b0586a019 64ed18cbeab745e4 3883420776d44d52
10// e11b9ef6b4069027 ea0c81916dde0193 dedf27beffd45609 bbe53d4095df0f21
11//
12// If this PASSES, H_0 wiring is correct and the bug is downstream
13// (B[0]/B[1] derivation, fill loop, or final 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"
21const K_MAGIC_1024: i64 = 1024
22const K_MAGIC_2048: i64 = 2048
23
24func make_ctx() -> *NxArgon2idCtx {
25 let raw: *u8 = sys_mmap(NX_ARGON2ID_CTX_BYTES)
26 let ctx: *NxArgon2idCtx = raw as *NxArgon2idCtx
27 ctx.memory_blocks = sys_mmap(8 * K_MAGIC_1024)
28 ctx.h0_buf = sys_mmap(64)
29 ctx.prepend_buf = sys_mmap(K_MAGIC_2048)
30 ctx.prev_buf = sys_mmap(64)
31 ctx.curr_buf = sys_mmap(64)
32 ctx.zero_block = sys_mmap(K_MAGIC_1024)
33 ctx.z_buf = sys_mmap(K_MAGIC_1024)
34 ctx.tmp_block = sys_mmap(K_MAGIC_1024)
35 ctx.addr_block = sys_mmap(K_MAGIC_1024)
36 ctx.final_block = sys_mmap(K_MAGIC_1024)
37 ctx.h0_input = sys_mmap(K_MAGIC_2048)
38 ctx.b2b_ctx = sys_mmap(NX_BLAKE2B_CTX_BYTES) as *NxBlake2b
39 ctx.b2b_buf = sys_mmap(128)
40 ctx.b2b_sv = sys_mmap(128) as *i64
41 ctx.b2b_sm = sys_mmap(128) as *i64
42 ctx.g_r = sys_mmap(K_MAGIC_1024) as *i64
43 ctx.g_rs = sys_mmap(K_MAGIC_1024) as *i64
44 ctx.g_col = sys_mmap(128) as *i64
45 return ctx
46}
47
48func write_expected_h0(out: *u8) -> i64 {
49 // 59 55 6a 60 dc 1e a4 00
50 out[0] = 89 as u8; out[1] = 85 as u8; out[2] = 106 as u8; out[3] = 96 as u8
51 out[4] = 220 as u8; out[5] = 30 as u8; out[6] = 164 as u8; out[7] = 0 as u8
52 // 14 7c 69 0b 05 86 a0 19
53 out[8] = 20 as u8; out[9] = 124 as u8; out[10] = 105 as u8; out[11] = 11 as u8
54 out[12] = 5 as u8; out[13] = 134 as u8; out[14] = 160 as u8; out[15] = 25 as u8
55 // 64 ed 18 cb ea b7 45 e4
56 out[16] = 100 as u8; out[17] = 237 as u8; out[18] = 24 as u8; out[19] = 203 as u8
57 out[20] = 234 as u8; out[21] = 183 as u8; out[22] = 69 as u8; out[23] = 228 as u8
58 // 38 83 42 07 76 d4 4d 52
59 out[24] = 56 as u8; out[25] = 131 as u8; out[26] = 66 as u8; out[27] = 7 as u8
60 out[28] = 118 as u8; out[29] = 212 as u8; out[30] = 77 as u8; out[31] = 82 as u8
61 // e1 1b 9e f6 b4 06 90 27
62 out[32] = 225 as u8; out[33] = 27 as u8; out[34] = 158 as u8; out[35] = 246 as u8
63 out[36] = 180 as u8; out[37] = 6 as u8; out[38] = 144 as u8; out[39] = 39 as u8
64 // ea 0c 81 91 6d de 01 93
65 out[40] = 234 as u8; out[41] = 12 as u8; out[42] = 129 as u8; out[43] = 145 as u8
66 out[44] = 109 as u8; out[45] = 222 as u8; out[46] = 1 as u8; out[47] = 147 as u8
67 // de df 27 be ff d4 56 09
68 out[48] = 222 as u8; out[49] = 223 as u8; out[50] = 39 as u8; out[51] = 190 as u8
69 out[52] = 255 as u8; out[53] = 212 as u8; out[54] = 86 as u8; out[55] = 9 as u8
70 // bb e5 3d 40 95 df 0f 21
71 out[56] = 187 as u8; out[57] = 229 as u8; out[58] = 61 as u8; out[59] = 64 as u8
72 out[60] = 149 as u8; out[61] = 223 as u8; out[62] = 15 as u8; out[63] = 33 as u8
73 return 0
74}
75
76func main() -> i64 {
77 let ctx: *NxArgon2idCtx = make_ctx()
78 let expected: *u8 = sys_mmap(64)
79 write_expected_h0(expected)
80
81 let password: *u8 = "password" as *u8
82 let salt: *u8 = "somesalt" as *u8
83
84 // Call _ar2_h0 directly to get H_0 into ctx.h0_buf.
85 if _ar2_h0(ctx, password, 8, salt, 8, 1, 32, 8, 2) != NX_BLAKE2B_OK {
86 return 1
87 }
88
89 var i: i64 = 0
90 while i < 64 {
91 if ctx.h0_buf[i] != expected[i] { return 100 + i }
92 i = i + 1
93 }
94 return 0
95}