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}