code wiki / _hdl_build / nx_vc_fec_gate.nx
nx_vc_fec_gate.nx source
↩ module page · 104 lines · 4740 B
1// nx_vc_fec_gate.nx -- native cross-gate for the RS-FEC engine now IN the video client core
2// (vc_fec_init/encode/decode, k=8 m=2, caller-provided regions -- the FEC-LIVE prerequisite).
3// Mirrors the proven nx_room_fec gate honesty on the CORE's implementation:
4// T1 systematic (first k*S of shards == data) T2 EXHAUSTIVE: every 2-erasure pattern of
5// C(10,2)=45 recovers a JPEG-like frame byte-exact T3 over-bound: 3 erasures MUST fail (-1)
6// T4 tamper: a corrupted generator entry MUST break recovery (matrix is load-bearing)
7// Evidence -> knowledge/status/vc_fec.log. expect_exit: 0 license_tier: ORIGINAL
8import "nx_syscalls.nx"
9import "nx_video_client_wasm.nx"
10
11const VF_LOG: *u8 = "knowledge/status/vc_fec.log"
12
13func gw(fd: i64, s: *u8) -> i64 { var n: i64=0; while s[n]!=(0 as u8){n=n+1} sys_write(fd,s,n); return 0 }
14func gwn(fd: i64, v: i64) -> i64 { let bb: *u8=sys_mmap(28); var m: i64=v; if m<0{m=0-m;sys_write(fd,"-" as *u8,1)} let t: *u8=sys_mmap(28); var k: i64=0; if m==0{t[0]=48 as u8;k=1} while m>0{t[k]=(48+(m%10)) as u8;m=m/10;k=k+1} var i: i64=0; while i<k{bb[i]=t[k-1-i];i=i+1} sys_write(fd,bb,k); return 0 }
15
16func main() -> i64 {
17 gw(1, "=== nx_vc_fec_gate: RS-FEC in the CORE (k=8 m=2) -- exhaustive erasure proof ===\n")
18 let k: i64 = 8
19 let m: i64 = 2
20 let n: i64 = k + m
21 let S: i64 = 1500 // MTU-ish shard: a ~12KB JPEG frame -> 8 x 1500
22 let tbl: *i64 = sys_mmap(8 * 900) as *i64
23 let rn: i64 = vc_fec_init(tbl)
24 var ok: i64 = 1
25 if rn != n { ok = 0 }
26
27 // JPEG-like frame: deterministic byte pattern with structure + noise
28 let data: *u8 = sys_mmap(k * S + 64)
29 var i: i64 = 0
30 while i < k * S { data[i] = ((i * 31 + (i / 97) * 7 + 145) & 255) as u8; i = i + 1 }
31 let shards: *u8 = sys_mmap(n * S + 64)
32 vc_fec_encode(tbl, data, shards, S)
33
34 // T1 systematic
35 var t1: i64 = 1
36 i = 0
37 while i < k * S { if shards[i] != data[i] { t1 = 0; i = k * S } else { i = i + 1 } }
38 gw(1, " T1 systematic first-k==data: "); gwn(1, t1); gw(1, "\n")
39 if t1 != 1 { ok = 0 }
40
41 // T2 exhaustive: every 2-erasure pattern recovers byte-exact
42 let erased: *i64 = sys_mmap(8 * n) as *i64
43 let out: *u8 = sys_mmap(k * S + 64)
44 let scrA: *i64 = sys_mmap(8 * k * k) as *i64
45 var recovered: i64 = 0
46 var patterns: i64 = 0
47 var a: i64 = 0
48 while a < n {
49 var b: i64 = a + 1
50 while b < n {
51 patterns = patterns + 1
52 var z: i64 = 0
53 while z < n { erased[z] = 0; z = z + 1 }
54 erased[a] = 1
55 erased[b] = 1
56 let rc: i64 = vc_fec_decode(tbl, shards, erased, out, S, scrA)
57 if rc == 0 {
58 var same: i64 = 1
59 var q: i64 = 0
60 while q < k * S { if out[q] != data[q] { same = 0; q = k * S } else { q = q + 1 } }
61 if same == 1 { recovered = recovered + 1 }
62 }
63 b = b + 1
64 }
65 a = a + 1
66 }
67 gw(1, " T2 exhaustive 2-erasure: recovered="); gwn(1, recovered); gw(1, "/"); gwn(1, patterns); gw(1, " byte-exact\n")
68 if recovered != patterns { ok = 0 }
69 if patterns != 45 { ok = 0 }
70
71 // T3 over-bound: 3 erasures must FAIL honestly
72 var z2: i64 = 0
73 while z2 < n { erased[z2] = 0; z2 = z2 + 1 }
74 erased[0]=1; erased[1]=1; erased[2]=1
75 let rc3: i64 = vc_fec_decode(tbl, shards, erased, out, S, scrA)
76 var t3: i64 = 0
77 if rc3 == (0 - 1) { t3 = 1 }
78 gw(1, " T3 over-bound 3-loss rc="); gwn(1, rc3); gw(1, " (must be -1): "); gwn(1, t3); gw(1, "\n")
79 if t3 != 1 { ok = 0 }
80
81 // T4 tamper: corrupt a Cauchy entry -> a 2-erasure recovery needing parity must break
82 tbl[768 + k*k + 0] = tbl[768 + k*k + 0] ^ 1
83 var z3: i64 = 0
84 while z3 < n { erased[z3] = 0; z3 = z3 + 1 }
85 erased[0]=1; erased[1]=1 // two data shards lost -> parity rows load-bearing
86 vc_fec_decode(tbl, shards, erased, out, S, scrA)
87 var t4: i64 = 0
88 var q2: i64 = 0
89 while q2 < k * S { if out[q2] != data[q2] { t4 = 1; q2 = k * S } else { q2 = q2 + 1 } }
90 gw(1, " T4 tampered-matrix breaks recovery: "); gwn(1, t4); gw(1, "\n")
91 if t4 != 1 { ok = 0 }
92
93 gw(1, "VC-FEC-GATE k=8 m=2 S=1500 patterns=45 recovered="); gwn(1, recovered)
94 if ok==1 { gw(1, " verdict=GREEN\n") } else { gw(1, " verdict=RED\n") }
95 let lf: i64 = sys_openat_append(VF_LOG, 420)
96 if lf >= 0 {
97 gw(lf, "VCFECGATE k=8 m=2 S=1500 patterns=45 recovered="); gwn(lf, recovered)
98 gw(lf, " overbound="); gwn(lf, t3); gw(lf, " tamper="); gwn(lf, t4)
99 if ok==1 { gw(lf, " verdict=GREEN\n") } else { gw(lf, " verdict=RED\n") }
100 sys_close(lf)
101 }
102 if ok==1 { return 0 }
103 return 1
104}