code wiki / (root) / nx_blake2b_test.nx

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}