code wiki / (root) / nx_argon2id_test.nx

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}