code wiki / (root) / nx_sha1_diff_probe.nx

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}