_u256_cmov_gate.nx source
↩ module page · 48 lines · 1967 B
1// _u256_cmov_gate.nx -- KAT for u256_cmov (the SEC-CT-001 foundation primitive).
2// flag=0 -> dst unchanged; flag=1 -> dst becomes src; src NEVER mutated; all 8 limbs covered.
3// NEG control: a flag=0 then flag=1 on the SAME pair must yield two DIFFERENT dst states (teeth).
4// Sovereign native lane: exit 0 = GREEN, N = first failed assertion.
5import "nx_syscalls.nx"
6import "nx_u256.nx"
7
8const UCG_LOG: *u8 = "knowledge/status/speed_gate.log"
9
10func 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 }
11
12func main() -> i64 {
13 let a: *i64 = u256_alloc()
14 let b: *i64 = u256_alloc()
15 let a_save: *i64 = u256_alloc()
16 let b_save: *i64 = u256_alloc()
17
18 // distinct nonzero pattern across ALL 8 limbs (so a != b in every limb)
19 var i: i64 = 0
20 while i < 8 {
21 a[i] = (0x11111111 + i) & 0xFFFFFFFF
22 b[i] = (0xAAAAAAAA - i) & 0xFFFFFFFF
23 i = i + 1
24 }
25 u256_copy(a_save, a)
26 u256_copy(b_save, b)
27
28 // flag=0 -> a unchanged, b untouched
29 u256_cmov(a, b, 0)
30 if u256_eq(a, a_save) != 1 { return 1 }
31 if u256_eq(b, b_save) != 1 { return 2 } // src never mutated
32
33 // flag=1 -> a becomes b (every limb), b still untouched
34 u256_cmov(a, b, 1)
35 if u256_eq(a, b_save) != 1 { return 3 }
36 if u256_eq(b, b_save) != 1 { return 4 } // src never mutated
37
38 // NEG control / teeth: the two flags MUST have produced different dst (a_save != b_save).
39 if u256_eq(a_save, b_save) == 1 { return 5 }
40
41 gw(1, "SECCTGATE feature=u256-cmov-constant-time verdict=GREEN flag0=identity flag1=copy src-immutable 8-limb ||MARK=knowledge/status/speed_gate.log::SECCTGATE::verdict=GREEN\n" as *u8)
42 let lf: i64 = sys_openat_append(UCG_LOG, 420)
43 if lf >= 0 {
44 gw(lf, "SECCTGATE feature=u256-cmov-constant-time verdict=GREEN flag0=identity flag1=copy src-immutable 8-limb\n" as *u8)
45 sys_close(lf)
46 }
47 return 0
48}