nx_etg_test.nx source
↩ module page · 166 lines · 7479 B
1// nx_etg_test.nx -- KAT for nx_etg.nx Empirical-Truth Gamification
2// substrate primitive.
3//
4// Verifies:
5// T1 Outcome sealed-enum completeness: every NX_ETG_OUTCOME_*
6// value 0..N-1 validates true; sentinels out-of-range
7// validate false.
8// T2 Probe-kind + claim-source enum validity gates.
9// T3 Outcome → reclamation mapping: VENDOR_LIED_OMISSION /
10// PAYWALLED_BUT_RESPONSIVE / RECLAIMED / THROTTLED /
11// UNDOCUMENTED_CAPABILITY all imply reclamation; CONFIRMED /
12// FALSIFIED / FUSED_OFF / INCONCLUSIVE / NONE do not.
13// T4 Entry init rejects invalid arguments deterministically.
14// T5 Entry init records reclamation_delta correctly per outcome.
15// T6 Attestation determinism: same substantive fields -> same
16// hash; differing fields -> different hash.
17// T7 FNV step / FNV i64 sanity (round-trip property on known
18// constants from the FNV-1a public spec).
19
20import "nx_syscalls.nx"
21import "nx_etg.nx"
22
23func main() -> i64 {
24 // ----- T1 Outcome sealed-enum completeness -----
25 var i: i64 = 0
26 while i < NX_ETG_OUTCOME_N {
27 if nx_etg_outcome_is_valid(i) != 1 { return 1 + i }
28 i = i + 1
29 }
30 // Out-of-range sentinels reject.
31 if nx_etg_outcome_is_valid(0 - 1) != 0 { return 100 }
32 if nx_etg_outcome_is_valid(NX_ETG_OUTCOME_N) != 0 { return 101 }
33 if nx_etg_outcome_is_valid(NX_ETG_OUTCOME_N + 1) != 0 { return 102 }
34 if nx_etg_outcome_is_valid(9999) != 0 { return 103 }
35
36 // ----- T2 Probe-kind + claim-source validity -----
37 if nx_etg_probe_is_valid(NX_ETG_PROBE_CPU_ISA) != 1 { return 110 }
38 if nx_etg_probe_is_valid(NX_ETG_PROBE_GPU_TENSOR) != 1 { return 111 }
39 if nx_etg_probe_is_valid(NX_ETG_PROBE_N) != 0 { return 112 }
40 if nx_etg_probe_is_valid(0 - 5) != 0 { return 113 }
41 if nx_etg_claim_is_valid(NX_ETG_CLAIM_CPUID) != 1 { return 114 }
42 if nx_etg_claim_is_valid(NX_ETG_CLAIM_SPORE_HINT) != 1 { return 115 }
43 if nx_etg_claim_is_valid(NX_ETG_CLAIM_N) != 0 { return 116 }
44
45 // ----- T3 Outcome -> reclamation mapping -----
46 if nx_etg_outcome_implies_reclamation(NX_ETG_OUTCOME_VENDOR_LIED_OMISSION) != 1 { return 120 }
47 if nx_etg_outcome_implies_reclamation(NX_ETG_OUTCOME_PAYWALLED_BUT_RESPONSIVE) != 1 { return 121 }
48 if nx_etg_outcome_implies_reclamation(NX_ETG_OUTCOME_RECLAIMED) != 1 { return 122 }
49 if nx_etg_outcome_implies_reclamation(NX_ETG_OUTCOME_THROTTLED) != 1 { return 123 }
50 if nx_etg_outcome_implies_reclamation(NX_ETG_OUTCOME_UNDOCUMENTED_CAPABILITY) != 1 { return 124 }
51 if nx_etg_outcome_implies_reclamation(NX_ETG_OUTCOME_CONFIRMED) != 0 { return 130 }
52 if nx_etg_outcome_implies_reclamation(NX_ETG_OUTCOME_FALSIFIED) != 0 { return 131 }
53 if nx_etg_outcome_implies_reclamation(NX_ETG_OUTCOME_FUSED_OFF) != 0 { return 132 }
54 if nx_etg_outcome_implies_reclamation(NX_ETG_OUTCOME_INCONCLUSIVE) != 0 { return 133 }
55 if nx_etg_outcome_implies_reclamation(NX_ETG_OUTCOME_VENDOR_LIED_MISDIRECTION) != 0 { return 134 }
56 if nx_etg_outcome_implies_reclamation(NX_ETG_OUTCOME_NONE) != 0 { return 135 }
57
58 // ----- T4 Entry init rejects invalid arguments -----
59 let e_buf: *u8 = sys_mmap(128)
60 let e: *NxEtgEntry = e_buf as *NxEtgEntry
61
62 // Bad probe kind.
63 let rc_bad_probe: i64 = nx_etg_entry_init(e, 1, 9999, NX_ETG_CLAIM_CPUID, 1, 1, NX_ETG_OUTCOME_CONFIRMED, 1, 0)
64 if rc_bad_probe != -1 { return 140 }
65
66 // Bad claim source.
67 let rc_bad_claim: i64 = nx_etg_entry_init(e, 1, NX_ETG_PROBE_CPU_ISA, 9999, 1, 1, NX_ETG_OUTCOME_CONFIRMED, 1, 0)
68 if rc_bad_claim != -2 { return 141 }
69
70 // Bad outcome.
71 let rc_bad_outcome: i64 = nx_etg_entry_init(e, 1, NX_ETG_PROBE_CPU_ISA, NX_ETG_CLAIM_CPUID, 1, 1, 9999, 1, 0)
72 if rc_bad_outcome != -3 { return 142 }
73
74 // ----- T5 Entry init records reclamation_delta correctly -----
75 // Scenario A: probe CPUID claims no AVX-512 on this Alder Lake P-core,
76 // but direct ISA execution succeeded -- vendor lied by omission.
77 let rc_a: i64 = nx_etg_entry_init(
78 e,
79 0xDEADBEEF, // silicon serial hash
80 NX_ETG_PROBE_CPU_ISA,
81 NX_ETG_CLAIM_CPUID,
82 0, // claim: AVX-512 disabled
83 1, // measurement: AVX-512 executed
84 NX_ETG_OUTCOME_VENDOR_LIED_OMISSION,
85 1, // selector version
86 12345 // timestamp
87 )
88 if rc_a != 0 { return 150 }
89 if e.reclamation_delta != 1 { return 151 }
90 if e.outcome != NX_ETG_OUTCOME_VENDOR_LIED_OMISSION { return 152 }
91 if e.silicon_serial_hash != 0xDEADBEEF { return 153 }
92 if e.claim_value != 0 { return 154 }
93 if e.measurement_value != 1 { return 155 }
94
95 // Scenario B: probe driver ICD reports compute capability 7.5,
96 // measurement matches. CONFIRMED, no reclamation delta.
97 let e_buf2: *u8 = sys_mmap(128)
98 let e2: *NxEtgEntry = e_buf2 as *NxEtgEntry
99 let rc_b: i64 = nx_etg_entry_init(
100 e2,
101 0xDEADBEEF,
102 NX_ETG_PROBE_GPU_ISA,
103 NX_ETG_CLAIM_DRIVER_ICD,
104 75,
105 75,
106 NX_ETG_OUTCOME_CONFIRMED,
107 1,
108 12346
109 )
110 if rc_b != 0 { return 160 }
111 if e2.reclamation_delta != 0 { return 161 }
112 if e2.outcome != NX_ETG_OUTCOME_CONFIRMED { return 162 }
113
114 // ----- T6 Attestation determinism -----
115 // Two entries with identical substantive fields produce identical
116 // attestation hashes.
117 let e_buf3: *u8 = sys_mmap(128)
118 let e3: *NxEtgEntry = e_buf3 as *NxEtgEntry
119 let rc_c: i64 = nx_etg_entry_init(
120 e3,
121 0xDEADBEEF,
122 NX_ETG_PROBE_CPU_ISA,
123 NX_ETG_CLAIM_CPUID,
124 0,
125 1,
126 NX_ETG_OUTCOME_VENDOR_LIED_OMISSION,
127 1,
128 12345
129 )
130 if rc_c != 0 { return 170 }
131 // e (from scenario A) and e3 have identical substantive fields.
132 if nx_etg_attestation_deterministic(e, e3) != 1 { return 171 }
133 if e.attestation_hash != e3.attestation_hash { return 172 }
134
135 // Differing fields -> different hash.
136 let e_buf4: *u8 = sys_mmap(128)
137 let e4: *NxEtgEntry = e_buf4 as *NxEtgEntry
138 let rc_d: i64 = nx_etg_entry_init(
139 e4,
140 0xCAFEBABE, // different silicon
141 NX_ETG_PROBE_CPU_ISA,
142 NX_ETG_CLAIM_CPUID,
143 0,
144 1,
145 NX_ETG_OUTCOME_VENDOR_LIED_OMISSION,
146 1,
147 12345
148 )
149 if rc_d != 0 { return 180 }
150 if nx_etg_attestation_deterministic(e, e4) != 0 { return 181 }
151 if e.attestation_hash == e4.attestation_hash { return 182 }
152
153 // ----- T7 Attestation hash is non-zero + sensitive to inputs -----
154 // The hand-rolled FNV helpers (nx_etg_fnv_step / nx_etg_fnv_i64 /
155 // NX_ETG_FNV_OFFSET) were consolidated into nx_fnv 2026-05-20
156 // per the bit-level no-tool-proliferation cardinal. FNV-1a's
157 // own KAT lives in nx_fnv_test. Here we verify the attestation
158 // hash IS non-zero for at least one entry (composition gate)
159 // and that two entries differing in ONE field produce different
160 // hashes (FNV avalanche property propagates through composition).
161 if e.attestation_hash == 0 { return 200 }
162 if e4.attestation_hash == 0 { return 201 }
163 if e.attestation_hash == e4.attestation_hash { return 202 }
164
165 return 0
166}