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}