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}