code wiki / (root) / nx_sha384_kat_test.nx

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}