nx_argon2_g_xvalidate_test.nx source
↩ module page · 81 lines · 3672 B
1// nx_argon2_g_xvalidate_test.nx -- cross-validate nx G compression
2// against libargon2 fill_block output on synthetic non-zero inputs.
3//
4// expect_exit: 0
5//
6// Reference output (libargon2 fill_block with X[i]=i*0x0101010101010101,
7// Y[i]=(i+13)*0x0202020202020202; first 4 output u64s):
8// df6567b82708e3df d77187e1ca70e318 25e7e65af95ba78d 4199e724d42d6f39
9//
10// license_tier: ORIGINAL
11
12import "nx_syscalls_x86_64.nx"
13import "nx_argon2_block.nx"
14
15func main() -> i64 {
16 let x: *u8 = sys_mmap(1024)
17 let y: *u8 = sys_mmap(1024)
18 let out: *u8 = sys_mmap(1024)
19 let r_scratch: *i64 = sys_mmap(1024) as *i64
20 let rs_scratch: *i64 = sys_mmap(1024) as *i64
21 let col_tmp: *i64 = sys_mmap(128) as *i64
22
23 // Build synthetic inputs: X[i] = i * 0x0101010101010101,
24 // Y[i] = (i+13) * 0x0202020202020202.
25 var i: i64 = 0
26 while i < 128 {
27 // X[i] = i * 0x0101010101010101
28 let xv: i64 = i * 72340172838076673 // 0x0101010101010101
29 // Write LE.
30 x[i*8 + 0] = (xv & 255) as u8
31 x[i*8 + 1] = ((xv >> 8) & 255) as u8
32 x[i*8 + 2] = ((xv >> 16) & 255) as u8
33 x[i*8 + 3] = ((xv >> 24) & 255) as u8
34 x[i*8 + 4] = ((xv >> 32) & 255) as u8
35 x[i*8 + 5] = ((xv >> 40) & 255) as u8
36 x[i*8 + 6] = ((xv >> 48) & 255) as u8
37 x[i*8 + 7] = ((xv >> 56) & 255) as u8
38 // Y[i] = (i + 13) * 0x0202020202020202
39 let yv: i64 = (i + 13) * 144680345676153346 // 0x0202020202020202
40 y[i*8 + 0] = (yv & 255) as u8
41 y[i*8 + 1] = ((yv >> 8) & 255) as u8
42 y[i*8 + 2] = ((yv >> 16) & 255) as u8
43 y[i*8 + 3] = ((yv >> 24) & 255) as u8
44 y[i*8 + 4] = ((yv >> 32) & 255) as u8
45 y[i*8 + 5] = ((yv >> 40) & 255) as u8
46 y[i*8 + 6] = ((yv >> 48) & 255) as u8
47 y[i*8 + 7] = ((yv >> 56) & 255) as u8
48 i = i + 1
49 }
50
51 if nx_argon2_g(x, y, out, r_scratch, rs_scratch, col_tmp) != NX_A2B_OK {
52 return 1
53 }
54
55 // Expected first 4 u64s (LE): df6567b82708e3df d77187e1ca70e318
56 // 25e7e65af95ba78d 4199e724d42d6f39
57 // Expected bytes (LE):
58 // df 6567b82708e3 -> 0xdf, 0xe3, 0x08, 0x27, 0xb8, 0x67, 0x65, 0xdf
59 // Wait, u64 0xdf6567b82708e3df in LE bytes = df e3 08 27 b8 67 65 df
60 // ... let me write them out:
61 // u64 0xdf6567b82708e3df -> LE bytes: df e3 08 27 b8 67 65 df
62 // u64 0xd77187e1ca70e318 -> LE bytes: 18 e3 70 ca e1 87 71 d7
63 // u64 0x25e7e65af95ba78d -> LE bytes: 8d a7 5b f9 5a e6 e7 25
64 // u64 0x4199e724d42d6f39 -> LE bytes: 39 6f 2d d4 24 e7 99 41
65 let expected: *u8 = sys_mmap(32)
66 expected[0] = 0xdf as u8; expected[1] = 0xe3 as u8; expected[2] = 0x08 as u8; expected[3] = 0x27 as u8
67 expected[4] = 0xb8 as u8; expected[5] = 0x67 as u8; expected[6] = 0x65 as u8; expected[7] = 0xdf as u8
68 expected[8] = 0x18 as u8; expected[9] = 0xe3 as u8; expected[10] = 0x70 as u8; expected[11] = 0xca as u8
69 expected[12] = 0xe1 as u8; expected[13] = 0x87 as u8; expected[14] = 0x71 as u8; expected[15] = 0xd7 as u8
70 expected[16] = 0x8d as u8; expected[17] = 0xa7 as u8; expected[18] = 0x5b as u8; expected[19] = 0xf9 as u8
71 expected[20] = 0x5a as u8; expected[21] = 0xe6 as u8; expected[22] = 0xe7 as u8; expected[23] = 0x25 as u8
72 expected[24] = 0x39 as u8; expected[25] = 0x6f as u8; expected[26] = 0x2d as u8; expected[27] = 0xd4 as u8
73 expected[28] = 0x24 as u8; expected[29] = 0xe7 as u8; expected[30] = 0x99 as u8; expected[31] = 0x41 as u8
74
75 var k: i64 = 0
76 while k < 32 {
77 if out[k] != expected[k] { return 100 + k }
78 k = k + 1
79 }
80 return 0
81}