nx_sha384_kat_test.nx source
↩ module page · 94 lines · 3942 B
1// nx_sha384_kat_test.nx -- NIST FIPS 180-4 SHA-384 + SHA-512/256
2// external-reference KATs.
3//
4// Catches the bug class previously named in
5// [[feedback-canonical-constants-kat-against-reference-not-hand-
6// converted]]: standards constants stored as hand-converted
7// negative-decimal i64 with `// 0x...` trailing-comment can be
8// silently wrong. Without an external NIST vector KAT, the
9// substrate's SHA-384 + SHA-512/256 had silent output corruption
10// (4 of 4 sha512_256_init constants wrong; 3 of 4 sha384_init
11// constants wrong) for an unknown duration.
12//
13// This file establishes the EXTERNAL-REFERENCE KATs that were
14// missing. It pins both SHA-384 + SHA-512/256 outputs against
15// published NIST FIPS 180-4 test vectors.
16//
17// expect_exit: 0
18// license_tier: ORIGINAL
19
20import "nx_syscalls.nx"
21import "nx_sha512.nx"
22
23func bytes_eq_n(a: *u8, b: *u8, n: i64) -> i64 {
24 var i: i64 = 0
25 while i < n {
26 if (a[i] & 0xff) != (b[i] & 0xff) { return 0 - (i + 1) }
27 i = i + 1
28 }
29 return 0
30}
31
32func main() -> i64 {
33 // ---- Vector A: SHA-384("") ----
34 let in_buf: *u8 = sys_mmap(8)
35 let out: *u8 = sys_mmap(64)
36 sha384_digest(in_buf, 0, out)
37
38 let exp: *u8 = sys_mmap(64)
39 exp[0]=0x38; exp[1]=0xb0; exp[2]=0x60; exp[3]=0xa7
40 exp[4]=0x51; exp[5]=0xac; exp[6]=0x96; exp[7]=0x38
41 exp[8]=0x4c; exp[9]=0xd9; exp[10]=0x32; exp[11]=0x7e
42 exp[12]=0xb1; exp[13]=0xb1; exp[14]=0xe3; exp[15]=0x6a
43 exp[16]=0x21; exp[17]=0xfd; exp[18]=0xb7; exp[19]=0x11
44 exp[20]=0x14; exp[21]=0xbe; exp[22]=0x07; exp[23]=0x43
45 exp[24]=0x4c; exp[25]=0x0c; exp[26]=0xc7; exp[27]=0xbf
46 exp[28]=0x63; exp[29]=0xf6; exp[30]=0xe1; exp[31]=0xda
47 exp[32]=0x27; exp[33]=0x4e; exp[34]=0xde; exp[35]=0xbf
48 exp[36]=0xe7; exp[37]=0x6f; exp[38]=0x65; exp[39]=0xfb
49 exp[40]=0xd5; exp[41]=0x1a; exp[42]=0xd2; exp[43]=0xf1
50 exp[44]=0x48; exp[45]=0x98; exp[46]=0xb9; exp[47]=0x5b
51 let r_a: i64 = bytes_eq_n(out, exp, 48)
52 if r_a != 0 { return 1 + (0 - r_a) }
53
54 // ---- Vector B: SHA-384("abc") ----
55 let abc: *u8 = sys_mmap(8)
56 abc[0]=0x61; abc[1]=0x62; abc[2]=0x63
57 let out2: *u8 = sys_mmap(64)
58 sha384_digest(abc, 3, out2)
59
60 let exp2: *u8 = sys_mmap(64)
61 exp2[0]=0xcb; exp2[1]=0x00; exp2[2]=0x75; exp2[3]=0x3f
62 exp2[4]=0x45; exp2[5]=0xa3; exp2[6]=0x5e; exp2[7]=0x8b
63 exp2[8]=0xb5; exp2[9]=0xa0; exp2[10]=0x3d; exp2[11]=0x69
64 exp2[12]=0x9a; exp2[13]=0xc6; exp2[14]=0x50; exp2[15]=0x07
65 exp2[16]=0x27; exp2[17]=0x2c; exp2[18]=0x32; exp2[19]=0xab
66 exp2[20]=0x0e; exp2[21]=0xde; exp2[22]=0xd1; exp2[23]=0x63
67 exp2[24]=0x1a; exp2[25]=0x8b; exp2[26]=0x60; exp2[27]=0x5a
68 exp2[28]=0x43; exp2[29]=0xff; exp2[30]=0x5b; exp2[31]=0xed
69 exp2[32]=0x80; exp2[33]=0x86; exp2[34]=0x07; exp2[35]=0x2b
70 exp2[36]=0xa1; exp2[37]=0xe7; exp2[38]=0xcc; exp2[39]=0x23
71 exp2[40]=0x58; exp2[41]=0xba; exp2[42]=0xec; exp2[43]=0xa1
72 exp2[44]=0x34; exp2[45]=0xc8; exp2[46]=0x25; exp2[47]=0xa7
73 let r_b: i64 = bytes_eq_n(out2, exp2, 48)
74 if r_b != 0 { return 100 + (0 - r_b) }
75
76 // ---- Vector C: SHA-512/256("") ----
77 // NIST CAVS vector: SHA-512/256("") =
78 // c672b8d1ef56ed28ab87c3622c5114069bdd3ad7b8f9737498d0c01ecef0967a
79 let out3: *u8 = sys_mmap(64)
80 sha512_256_digest(in_buf, 0, out3)
81 let exp3: *u8 = sys_mmap(64)
82 exp3[0]=0xc6; exp3[1]=0x72; exp3[2]=0xb8; exp3[3]=0xd1
83 exp3[4]=0xef; exp3[5]=0x56; exp3[6]=0xed; exp3[7]=0x28
84 exp3[8]=0xab; exp3[9]=0x87; exp3[10]=0xc3; exp3[11]=0x62
85 exp3[12]=0x2c; exp3[13]=0x51; exp3[14]=0x14; exp3[15]=0x06
86 exp3[16]=0x9b; exp3[17]=0xdd; exp3[18]=0x3a; exp3[19]=0xd7
87 exp3[20]=0xb8; exp3[21]=0xf9; exp3[22]=0x73; exp3[23]=0x74
88 exp3[24]=0x98; exp3[25]=0xd0; exp3[26]=0xc0; exp3[27]=0x1e
89 exp3[28]=0xce; exp3[29]=0xf0; exp3[30]=0x96; exp3[31]=0x7a
90 let r_c: i64 = bytes_eq_n(out3, exp3, 32)
91 if r_c != 0 { return 200 + (0 - r_c) }
92
93 return 0
94}