nx_sha1_diff_probe.nx source
↩ module page · 36 lines · 1541 B
1// nx_sha1_diff_probe.nx -- differential oracle for the SHA-1 optimization.
2// Hashes deterministic inputs of every length 0..256 (all padding boundaries) and rolls a
3// single hash over all 20-byte digests. Golden BEFORE the optimization must equal AFTER.
4
5import "nx_sha1.nx"
6const K_MAGIC_1000000007: i64 = 1000000007
7const K_MAGIC_196783082: i64 = 196783082
8
9func _p_puts(s: *u8) -> i64 { var n: i64 = 0; while s[n] != (0 as u8) { n = n + 1 } sys_write(1, s, n); return 0 }
10func _p_putn(v: i64) -> i64 {
11 let bb: *u8 = sys_mmap(28); var m: i64 = v
12 let t: *u8 = sys_mmap(28); var k: i64 = 0; if m == 0 { t[0] = 48; k = 1 }
13 while m > 0 { t[k] = 48 + (m % 10); m = m / 10; k = k + 1 }
14 var i: i64 = 0; while i < k { bb[i] = t[k - 1 - i]; i = i + 1 } sys_write(1, bb, k); return 0
15}
16
17func main() -> i64 {
18 let buf: *u8 = sys_mmap(300)
19 var i: i64 = 0
20 while i < 300 { buf[i] = ((i * 7 + 13) & 0xff) as u8; i = i + 1 }
21 let out: *u8 = sys_mmap(20)
22 var roll: i64 = 0
23 var len: i64 = 0
24 while len <= 256 {
25 sha1(buf, len, out)
26 var j: i64 = 0
27 while j < 20 { roll = (roll * 131 + (out[j] as i64)) % K_MAGIC_1000000007; j = j + 1 }
28 len = len + 1
29 }
30 _p_puts("SHA1_DIFF_ROLL=" as *u8); _p_putn(roll); _p_puts("\n" as *u8)
31 // GOLDEN captured from the pre-optimization (production) sha1 over lengths 0..256.
32 // Permanent regression gate: exit 0 = byte-identical, 1 = regression.
33 if roll != K_MAGIC_196783082 { sys_exit(1); return 1 }
34 sys_exit(0)
35 return 0
36}