code wiki / (root) / sha256_test.nx

sha256_test.nx source

↩ module page · 83 lines · 3289 B

1// sha256_test.nx -- verify against known FIPS 180-4 test vectors. 2// 3// Vector 1: SHA-256("abc") = 4// ba7816bf 8f01cfea 414140de 5dae2223 b00361a3 96177a9c b410ff61 f20015ad 5// 6// Vector 2: SHA-256("") = 7// e3b0c442 98fc1c14 9afbf4c8 996fb924 27ae41e4 649b934c a495991b 7852b855 8// 9// license_tier: INDEPENDENT_REDERIVE 10// genealogy_id: international-research-sources/nist/fips_180_4 11// 12// 13// license_tier: INDEPENDENT_REDERIVE 14// genealogy_id: international-research-sources/nist/fips_180_4 15// 16 17import "nx_syscalls.nx" 18import "nx_sha256.nx" 19 20// Compare 32 bytes of out against the 32-byte expected buffer. 21// Returns 0 on match, otherwise the index of the first mismatch 22// incremented by 1 (so callers see a non-zero return code that 23// also identifies the offending byte). 24func digest_eq(out: *u8, expected: *u8) -> i64 { 25 var i: i64 = 0 26 while i < 32 { 27 if out[i] != expected[i] { return i + 1 } 28 i = i + 1 29 } 30 return 0 31} 32 33func set_byte(buf: *u8, i: i64, v: i64) -> i64 { 34 buf[i] = v 35 return 0 36} 37 38// Write the known "abc" hash into a 32-byte buffer. 39func load_expected_abc(e: *u8) -> i64 { 40 set_byte(e, 0, 0xBA); set_byte(e, 1, 0x78); set_byte(e, 2, 0x16); set_byte(e, 3, 0xBF) 41 set_byte(e, 4, 0x8F); set_byte(e, 5, 0x01); set_byte(e, 6, 0xCF); set_byte(e, 7, 0xEA) 42 set_byte(e, 8, 0x41); set_byte(e, 9, 0x41); set_byte(e, 10, 0x40); set_byte(e, 11, 0xDE) 43 set_byte(e, 12, 0x5D); set_byte(e, 13, 0xAE); set_byte(e, 14, 0x22); set_byte(e, 15, 0x23) 44 set_byte(e, 16, 0xB0); set_byte(e, 17, 0x03); set_byte(e, 18, 0x61); set_byte(e, 19, 0xA3) 45 set_byte(e, 20, 0x96); set_byte(e, 21, 0x17); set_byte(e, 22, 0x7A); set_byte(e, 23, 0x9C) 46 set_byte(e, 24, 0xB4); set_byte(e, 25, 0x10); set_byte(e, 26, 0xFF); set_byte(e, 27, 0x61) 47 set_byte(e, 28, 0xF2); set_byte(e, 29, 0x00); set_byte(e, 30, 0x15); set_byte(e, 31, 0xAD) 48 return 0 49} 50 51// Empty-input hash. 52func load_expected_empty(e: *u8) -> i64 { 53 set_byte(e, 0, 0xE3); set_byte(e, 1, 0xB0); set_byte(e, 2, 0xC4); set_byte(e, 3, 0x42) 54 set_byte(e, 4, 0x98); set_byte(e, 5, 0xFC); set_byte(e, 6, 0x1C); set_byte(e, 7, 0x14) 55 set_byte(e, 8, 0x9A); set_byte(e, 9, 0xFB); set_byte(e, 10, 0xF4); set_byte(e, 11, 0xC8) 56 set_byte(e, 12, 0x99); set_byte(e, 13, 0x6F); set_byte(e, 14, 0xB9); set_byte(e, 15, 0x24) 57 set_byte(e, 16, 0x27); set_byte(e, 17, 0xAE); set_byte(e, 18, 0x41); set_byte(e, 19, 0xE4) 58 set_byte(e, 20, 0x64); set_byte(e, 21, 0x9B); set_byte(e, 22, 0x93); set_byte(e, 23, 0x4C) 59 set_byte(e, 24, 0xA4); set_byte(e, 25, 0x95); set_byte(e, 26, 0x99); set_byte(e, 27, 0x1B) 60 set_byte(e, 28, 0x78); set_byte(e, 29, 0x52); set_byte(e, 30, 0xB8); set_byte(e, 31, 0x55) 61 return 0 62} 63 64func main() -> i64 { 65 let out: *u8 = sys_mmap(64) 66 let expected: *u8 = sys_mmap(64) 67 68 // Vector 1: "abc". 69 let abc: *u8 = sys_mmap(8) 70 abc[0] = 0x61; abc[1] = 0x62; abc[2] = 0x63 // 'a','b','c' 71 sha256_digest(abc, 3, out) 72 load_expected_abc(expected) 73 let r1: i64 = digest_eq(out, expected) 74 if r1 != 0 { return 100 + r1 } 75 76 // Vector 2: empty input. 77 sha256_digest(abc, 0, out) 78 load_expected_empty(expected) 79 let r2: i64 = digest_eq(out, expected) 80 if r2 != 0 { return 200 + r2 } 81 82 return 0 83}