nx_blake2b_test.nx source
↩ module page · 144 lines · 6293 B
1// nx_blake2b_test.nx -- RFC 7693 Appendix A KAT smoke for BLAKE2b-512.
2//
3// expect_exit: 0
4//
5// license_tier: ORIGINAL
6//
7// KAT-1 ("abc", out_len 64):
8// ba80a53f981c4d0d 6a2797b69f12f6e9
9// 4c212f14685ac4b7 4b12bb6fdbffa2d1
10// 7d87c5392aab792d c252d5de4533cc95
11// 18d38aa8dbf1925a b92386edd4009923
12//
13// KAT-2 ("", out_len 64):
14// 786a02f742015903 c6c6fd852552d272
15// 912f4740e1584761 8a86e217f71f5419
16// d25e1031afee5853 13896444934eb04b
17// 903a685b1448b755 d56f701afe9be2ce
18
19import "nx_syscalls_x86_64.nx"
20import "nx_blake2b.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// Fill a 64-byte buf with the expected BLAKE2b-512 of "abc".
32func write_abc_expected(out: *u8) -> i64 {
33 out[0] = 186 as u8; out[1] = 128 as u8; out[2] = 165 as u8; out[3] = 63 as u8
34 out[4] = 152 as u8; out[5] = 28 as u8; out[6] = 77 as u8; out[7] = 13 as u8
35 out[8] = 106 as u8; out[9] = 39 as u8; out[10] = 151 as u8; out[11] = 182 as u8
36 out[12] = 159 as u8; out[13] = 18 as u8; out[14] = 246 as u8; out[15] = 233 as u8
37 out[16] = 76 as u8; out[17] = 33 as u8; out[18] = 47 as u8; out[19] = 20 as u8
38 out[20] = 104 as u8; out[21] = 90 as u8; out[22] = 196 as u8; out[23] = 183 as u8
39 out[24] = 75 as u8; out[25] = 18 as u8; out[26] = 187 as u8; out[27] = 111 as u8
40 out[28] = 219 as u8; out[29] = 255 as u8; out[30] = 162 as u8; out[31] = 209 as u8
41 out[32] = 125 as u8; out[33] = 135 as u8; out[34] = 197 as u8; out[35] = 57 as u8
42 out[36] = 42 as u8; out[37] = 171 as u8; out[38] = 121 as u8; out[39] = 45 as u8
43 out[40] = 194 as u8; out[41] = 82 as u8; out[42] = 213 as u8; out[43] = 222 as u8
44 out[44] = 69 as u8; out[45] = 51 as u8; out[46] = 204 as u8; out[47] = 149 as u8
45 out[48] = 24 as u8; out[49] = 211 as u8; out[50] = 138 as u8; out[51] = 168 as u8
46 out[52] = 219 as u8; out[53] = 241 as u8; out[54] = 146 as u8; out[55] = 90 as u8
47 out[56] = 185 as u8; out[57] = 35 as u8; out[58] = 134 as u8; out[59] = 237 as u8
48 out[60] = 212 as u8; out[61] = 0 as u8; out[62] = 153 as u8; out[63] = 35 as u8
49 return 0
50}
51
52// Fill a 64-byte buf with the expected BLAKE2b-512 of "".
53func write_empty_expected(out: *u8) -> i64 {
54 out[0] = 120 as u8; out[1] = 106 as u8; out[2] = 2 as u8; out[3] = 247 as u8
55 out[4] = 66 as u8; out[5] = 1 as u8; out[6] = 89 as u8; out[7] = 3 as u8
56 out[8] = 198 as u8; out[9] = 198 as u8; out[10] = 253 as u8; out[11] = 133 as u8
57 out[12] = 37 as u8; out[13] = 82 as u8; out[14] = 210 as u8; out[15] = 114 as u8
58 out[16] = 145 as u8; out[17] = 47 as u8; out[18] = 71 as u8; out[19] = 64 as u8
59 out[20] = 225 as u8; out[21] = 88 as u8; out[22] = 71 as u8; out[23] = 97 as u8
60 out[24] = 138 as u8; out[25] = 134 as u8; out[26] = 226 as u8; out[27] = 23 as u8
61 out[28] = 247 as u8; out[29] = 31 as u8; out[30] = 84 as u8; out[31] = 25 as u8
62 out[32] = 210 as u8; out[33] = 94 as u8; out[34] = 16 as u8; out[35] = 49 as u8
63 out[36] = 175 as u8; out[37] = 238 as u8; out[38] = 88 as u8; out[39] = 83 as u8
64 out[40] = 19 as u8; out[41] = 137 as u8; out[42] = 100 as u8; out[43] = 68 as u8
65 out[44] = 147 as u8; out[45] = 78 as u8; out[46] = 176 as u8; out[47] = 75 as u8
66 out[48] = 144 as u8; out[49] = 58 as u8; out[50] = 104 as u8; out[51] = 91 as u8
67 out[52] = 20 as u8; out[53] = 72 as u8; out[54] = 183 as u8; out[55] = 85 as u8
68 out[56] = 213 as u8; out[57] = 111 as u8; out[58] = 112 as u8; out[59] = 26 as u8
69 out[60] = 254 as u8; out[61] = 155 as u8; out[62] = 226 as u8; out[63] = 206 as u8
70 return 0
71}
72
73func main() -> i64 {
74 // ---- Verdict enum gate ----
75 if nx_blake2b_verdict_is_valid(NX_BLAKE2B_OK) != 1 { return 1 }
76 if nx_blake2b_verdict_is_valid(NX_BLAKE2B_VERDICT_N) != 0 { return 2 }
77 if bytes_eq(nx_blake2b_verdict_name(NX_BLAKE2B_OK), "OK" as *u8, 2) != 1 { return 3 }
78 if bytes_eq(nx_blake2b_verdict_name(NX_BLAKE2B_BAD_OUT_LEN),
79 "BAD_OUT_LEN" as *u8, 11) != 1 { return 4 }
80
81 // ---- Allocate shared buffers ----
82 let ctx_raw: *u8 = sys_mmap(NX_BLAKE2B_CTX_BYTES)
83 let ctx: *NxBlake2b = ctx_raw as *NxBlake2b
84 let buf128: *u8 = sys_mmap(128)
85 let scratch_v: *i64 = sys_mmap(128) as *i64 // 16 * 8
86 let scratch_m: *i64 = sys_mmap(128) as *i64
87
88 let out: *u8 = sys_mmap(64)
89 let expected: *u8 = sys_mmap(64)
90
91 // ---- KAT-1: BLAKE2b-512("abc") ----
92 if nx_blake2b_hash("abc" as *u8, 3,
93 0 as *u8, 0,
94 out, 64,
95 ctx, buf128,
96 scratch_v, scratch_m) != NX_BLAKE2B_OK { return 10 }
97 write_abc_expected(expected)
98 if bytes_eq(out, expected, 64) != 1 {
99 // Return first mismatching byte index + 100 for diagnosis.
100 var i: i64 = 0
101 while i < 64 {
102 if out[i] != expected[i] { return 100 + i }
103 i = i + 1
104 }
105 return 99
106 }
107
108 // ---- KAT-2: BLAKE2b-512("") ----
109 // Re-init the same ctx.
110 if nx_blake2b_hash(0 as *u8, 0,
111 0 as *u8, 0,
112 out, 64,
113 ctx, buf128,
114 scratch_v, scratch_m) != NX_BLAKE2B_OK { return 20 }
115 write_empty_expected(expected)
116 if bytes_eq(out, expected, 64) != 1 {
117 var i: i64 = 0
118 while i < 64 {
119 if out[i] != expected[i] { return 200 + i }
120 i = i + 1
121 }
122 return 199
123 }
124
125 // ---- BAD_OUT_LEN ----
126 if nx_blake2b_init(ctx, 0, 0 as *u8, 0, buf128)
127 != NX_BLAKE2B_BAD_OUT_LEN { return 30 }
128 if nx_blake2b_init(ctx, 65, 0 as *u8, 0, buf128)
129 != NX_BLAKE2B_BAD_OUT_LEN { return 31 }
130
131 // ---- BAD_KEY_LEN ----
132 if nx_blake2b_init(ctx, 64, 0 as *u8, 65, buf128)
133 != NX_BLAKE2B_BAD_KEY_LEN { return 40 }
134 if nx_blake2b_init(ctx, 64, 0 as *u8, -1, buf128)
135 != NX_BLAKE2B_BAD_KEY_LEN { return 41 }
136
137 // ---- BAD_ARG ----
138 if nx_blake2b_init(0 as *NxBlake2b, 64, 0 as *u8, 0, buf128)
139 != NX_BLAKE2B_BAD_ARG { return 50 }
140 if nx_blake2b_init(ctx, 64, 0 as *u8, 0, 0 as *u8)
141 != NX_BLAKE2B_BAD_ARG { return 51 }
142
143 return 0
144}