code wiki / _hdl_build / nx_audit_gate.nx

nx_audit_gate.nx source

↩ module page · 59 lines · 3060 B

1// nx_audit_gate.nx -- proves the tamper-evident audit log WORKS, as a standing obligation: an intact 2// chain VERIFIES, and a one-byte tamper FAILS verification. Exercises the real _offc/nx_audit_log.elf 3// via fork/exec (sovereign-buildable; no sha256 import that hits the nxasm gap). Exit 0 iff both: 4// intact->rc0 AND tampered->rc!=0. license_tier: ORIGINAL 5import "nx_syscalls.nx" 6const AT_FDCWD: i64 = 0 - 100 7func _p(s: *u8) -> i64 { var n: i64=0; while s[n]!=(0 as u8){n=n+1} sys_write(1,s,n); return 0 } 8func ag_run(a1: *u8, a2: *u8, a3: *u8, a4: *u8) -> i64 { 9 let path: *u8 = "_offc/nx_audit_log.elf" as *u8 10 let pid: i64 = sys_fork() 11 if pid == 0 { 12 let argv: *i64 = sys_mmap(64) as *i64 13 argv[0] = path as i64 14 var i: i64 = 1 15 if (a1 as i64) != 0 { argv[i] = a1 as i64; i = i + 1 } 16 if (a2 as i64) != 0 { argv[i] = a2 as i64; i = i + 1 } 17 if (a3 as i64) != 0 { argv[i] = a3 as i64; i = i + 1 } 18 if (a4 as i64) != 0 { argv[i] = a4 as i64; i = i + 1 } 19 argv[i] = 0 20 let envp: *i64 = sys_mmap(16) as *i64 21 envp[0] = 0 22 sys_execve(path, argv, envp) 23 sys_exit(127) 24 } 25 let st: *i64 = sys_mmap(16) as *i64 26 sys_wait4(pid, st, 0) 27 return (st[0] >> 8) & 0xff 28} 29func ag_unlink(p: *u8) -> i64 { __syscall(263, AT_FDCWD, p, 0, 0, 0, 0) return 0 } 30func main() -> i64 { 31 _p("=== AUDIT GATE: intact chain verifies, tampered chain fails (tamper-evidence proof) ===\n" as *u8) 32 let log: *u8 = "knowledge/status/secret_audit.log" as *u8 33 ag_unlink(log) 34 ag_run("append" as *u8, "get" as *u8, "nas" as *u8, "success" as *u8) 35 ag_run("append" as *u8, "put" as *u8, "github" as *u8, "success" as *u8) 36 ag_run("append" as *u8, "get" as *u8, "api" as *u8, "success" as *u8) 37 let rok: i64 = ag_run("verify" as *u8, 0 as *u8, 0 as *u8, 0 as *u8) 38 var pass: i64 = 1 39 if rok == 0 { _p(" [1] intact chain verifies (rc=0): PASS\n" as *u8) } else { _p(" [1] intact verify FAILED\n" as *u8); pass = 0 } 40 // tamper: flip ONE byte somewhere in the middle of the file 41 let buf: *u8 = sys_mmap(1048592) 42 let fd: i64 = sys_openat_rd(log) 43 var n: i64 = 0 44 if fd >= 0 { var go: i64 = 1; while go == 1 { let base: i64 = buf as i64; let r: i64 = sys_read(fd, (base + n) as *u8, 1048576 - n); if r <= 0 { go = 0 } else { n = n + r } } sys_close(fd) } 45 if n > 40 { 46 let tp: i64 = 30 47 if buf[tp] == (97 as u8) { buf[tp] = 98 as u8 } else { buf[tp] = 97 as u8 } // flip a byte 48 let wfd: i64 = sys_openat_wr(log, 0x180) 49 sys_write(wfd, buf, n) 50 sys_close(wfd) 51 } 52 let rbad: i64 = ag_run("verify" as *u8, 0 as *u8, 0 as *u8, 0 as *u8) 53 if rbad != 0 { _p(" [2] tampered chain FAILS verify (rc!=0): PASS\n" as *u8) } else { _p(" [2] SECURITY-FAIL: tamper not detected\n" as *u8); pass = 0 } 54 ag_unlink(log) 55 if pass == 1 { _p(" AUDIT GATE: PASS (secret-access history is tamper-evident)\n" as *u8); sys_exit(0); return 0 } 56 _p(" AUDIT GATE: FAIL\n" as *u8) 57 sys_exit(1) 58 return 1 59}