code wiki / _hdl_build / nx_bip39_wordlist_kat.nx
nx_bip39_wordlist_kat.nx source
↩ module page · 56 lines · 2979 B
1// nx_bip39_wordlist_kat.nx -- DIRECT data-integrity KAT for the nx_bip39_wordlist table (the raw 2048-word
2// BIP-0039 English list). The full mnemonic vectors are covered by nx_bip39_kat via the encoder; THIS gates
3// the wordlist DATA directly (the honesty audit wants a direct edge on nx_bip39_wordlist): exactly 2048 words,
4// uniform 32/chunk, first="abandon", second="ability", last="zoo". A dropped/dup word (which corrupts every
5// mnemonic index + checksum) fails here. license_tier: ORIGINAL expect_exit:0
6import "nx_syscalls.nx"
7import "nx_bip39_wordlist.nx"
8
9func w(s: *u8) -> i64 { var k:i64=0; while s[k]!=(0 as u8){k=k+1} sys_write(1,s,k); return 0 }
10func n(v: i64) -> i64 { let b:*u8=sys_mmap(24); var m:i64=v; if m<0{sys_write(1,"-" as *u8,1);m=0-m} let t:*u8=sys_mmap(24); 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 j:i64=0; while j<k{b[j]=t[k-1-j];j=j+1} sys_write(1,b,k); return 0 }
11func wc(s: *u8) -> i64 { var i:i64=0; var sp:i64=0; var any:i64=0; while s[i]!=(0 as u8){ if s[i]==(32 as u8){sp=sp+1} else {any=1} i=i+1 } if any==0 { return 0 } return sp+1 }
12func slen(s: *u8) -> i64 { var i:i64=0; while s[i]!=(0 as u8){i=i+1} return i }
13
14func main() -> i64 {
15 var pass: i64 = 0
16
17 var total: i64 = 0
18 var uniform: i64 = 1
19 var ci: i64 = 0
20 while ci < 64 { let cnt: i64 = wc(_b39_chunk(ci)); if cnt != 32 { uniform = 0 } total = total + cnt; ci = ci + 1 }
21 if total == 2048 { pass = pass + 1; w("T1 total=2048 PASS\n" as *u8) } else { w("T1 FAIL total=" as *u8); n(total); w("\n" as *u8) }
22 if uniform == 1 { pass = pass + 1; w("T2 uniform 32/chunk PASS\n" as *u8) } else { w("T2 FAIL non-uniform\n" as *u8) }
23
24 let c0: *u8 = _b39_chunk(0)
25 let ab: *u8 = "abandon\x00" as *u8
26 var okf: i64 = 1
27 var i: i64 = 0
28 while i < 7 { if c0[i] != ab[i] { okf = 0 } i = i + 1 }
29 if c0[7] != (32 as u8) { okf = 0 }
30 if okf == 1 { pass = pass + 1; w("T3 first=abandon PASS\n" as *u8) } else { w("T3 FAIL\n" as *u8) }
31
32 let c63: *u8 = _b39_chunk(63)
33 let L: i64 = slen(c63)
34 var okl: i64 = 1
35 if c63[L-3] != (122 as u8) { okl = 0 }
36 if c63[L-2] != (111 as u8) { okl = 0 }
37 if c63[L-1] != (111 as u8) { okl = 0 }
38 if c63[L-4] != (32 as u8) { okl = 0 }
39 if okl == 1 { pass = pass + 1; w("T4 last=zoo PASS\n" as *u8) } else { w("T4 FAIL\n" as *u8) }
40
41 var oke: i64 = 1
42 ci = 0
43 while ci < 64 { if slen(_b39_chunk(ci)) < 100 { oke = 0 } ci = ci + 1 }
44 if oke == 1 { pass = pass + 1; w("T5 no-empty-chunk PASS\n" as *u8) } else { w("T5 FAIL\n" as *u8) }
45
46 let ab2: *u8 = "ability\x00" as *u8
47 var ok2: i64 = 1
48 i = 0
49 while i < 7 { if c0[8+i] != ab2[i] { ok2 = 0 } i = i + 1 }
50 if ok2 == 1 { pass = pass + 1; w("T6 second=ability PASS\n" as *u8) } else { w("T6 FAIL\n" as *u8) }
51
52 w("NX-BIP39-WORDLIST-KAT " as *u8); n(pass); w("/6" as *u8)
53 if pass == 6 { w(" GREEN\n" as *u8); return 0 }
54 w(" RED\n" as *u8)
55 return 1
56}