code wiki / (root) / _u256_cmov_gate.nx

_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}