code wiki / _hdl_build / nx_x509_pubkey_ed_kat.nx

nx_x509_pubkey_ed_kat.nx source

↩ module page · 85 lines · 5558 B

1// nx_x509_pubkey_ed_kat.nx -- gate for nx_x509_pubkey_extract_ed25519 (HONESTY SYSTEM weak point reach=479, 2// TLS trust path, no direct test). Proves the extractor returns a USABLE key, not just 32 copied bytes: 3// synthesise a real self-signed cert with the RFC 8032 test-vector keypair (sign a TBS with ed25519_sign_full), 4// extract the pubkey THROUGH the organ, and verify the real signature with the EXTRACTED key -> if extract is 5// wrong by even one byte, verification FAILS (self-validating). Plus byte-exact extraction, tamper rejection, 6// and both length-guard negatives. license_tier: ORIGINAL expect_exit:0 7import "nx_syscalls.nx" 8import "nx_x509.nx" 9import "nx_ed25519_signature.nx" 10import "nx_x509_pubkey_ed.nx" 11 12func ew(s: *u8) -> i64 { var n:i64=0; while s[n]!=(0 as u8){n=n+1} sys_write(1,s,n); return 0 } 13func en(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 } 14 15func main() -> i64 { 16 var pass: i64 = 0 17 18 // RFC 8032 s7.1 TEST 1 keypair 19 let priv: *u8 = sys_mmap(64) 20 priv[0]=0x9d as u8; priv[1]=0x61 as u8; priv[2]=0xb1 as u8; priv[3]=0x9d as u8; priv[4]=0xef as u8; priv[5]=0xfd as u8; priv[6]=0x5a as u8; priv[7]=0x60 as u8 21 priv[8]=0xba as u8; priv[9]=0x84 as u8; priv[10]=0x4a as u8; priv[11]=0xf4 as u8; priv[12]=0x92 as u8; priv[13]=0xec as u8; priv[14]=0x2c as u8; priv[15]=0xc4 as u8 22 priv[16]=0x44 as u8; priv[17]=0x49 as u8; priv[18]=0xc5 as u8; priv[19]=0x69 as u8; priv[20]=0x7b as u8; priv[21]=0x32 as u8; priv[22]=0x69 as u8; priv[23]=0x19 as u8 23 priv[24]=0x70 as u8; priv[25]=0x3b as u8; priv[26]=0xac as u8; priv[27]=0x03 as u8; priv[28]=0x1c as u8; priv[29]=0xae as u8; priv[30]=0x7f as u8; priv[31]=0x60 as u8 24 let pub: *u8 = sys_mmap(64) 25 pub[0]=0xd7 as u8; pub[1]=0x5a as u8; pub[2]=0x98 as u8; pub[3]=0x01 as u8; pub[4]=0x82 as u8; pub[5]=0xb1 as u8; pub[6]=0x0a as u8; pub[7]=0xb7 as u8 26 pub[8]=0xd5 as u8; pub[9]=0x4b as u8; pub[10]=0xfe as u8; pub[11]=0xd3 as u8; pub[12]=0xc9 as u8; pub[13]=0x64 as u8; pub[14]=0x07 as u8; pub[15]=0x3a as u8 27 pub[16]=0x0e as u8; pub[17]=0xe1 as u8; pub[18]=0x72 as u8; pub[19]=0xf3 as u8; pub[20]=0xda as u8; pub[21]=0xa6 as u8; pub[22]=0x23 as u8; pub[23]=0x25 as u8 28 pub[24]=0xaf as u8; pub[25]=0x02 as u8; pub[26]=0x1a as u8; pub[27]=0x68 as u8; pub[28]=0xf7 as u8; pub[29]=0x07 as u8; pub[30]=0x51 as u8; pub[31]=0x1a as u8 29 30 let TBS_LEN: i64 = 100 31 let buf: *u8 = sys_mmap(512) 32 var i: i64 = 0 33 while i < TBS_LEN { buf[i] = (0x40 + (i & 0x1f)) as u8; i = i + 1 } 34 var pi: i64 = 0 35 while pi < 32 { buf[TBS_LEN + pi] = pub[pi]; pi = pi + 1 } 36 let sig: *u8 = sys_mmap(128) 37 ed25519_sign_full(priv, buf, TBS_LEN, sig) 38 var si: i64 = 0 39 while si < 64 { buf[TBS_LEN + 32 + si] = sig[si]; si = si + 1 } 40 41 let cert: *X509Cert = sys_mmap(1024) as *X509Cert 42 cert.tbs_off = 0; cert.tbs_len = TBS_LEN 43 cert.pubkey_off = TBS_LEN; cert.pubkey_len = 32 44 cert.sig_off = TBS_LEN + 32; cert.sig_len = 64 45 46 // T1: extract THROUGH the organ + byte-exact match to the real pub 47 let out: *u8 = sys_mmap(64) 48 let erc: i64 = nx_x509_pubkey_extract_ed25519(buf, cert, out) 49 var exact: i64 = 1 50 i = 0 51 while i < 32 { if out[i] != pub[i] { exact = 0 } i = i + 1 } 52 if erc == NX_X509_PUBKEY_ED_OK { if exact == 1 { pass = pass + 1; ew("T1 extract-exact PASS\n" as *u8) } else { ew("T1 FAIL bytes differ\n" as *u8) } } else { ew("T1 FAIL rc=" as *u8); en(erc); ew("\n" as *u8) } 53 54 // T2: the EXTRACTED key verifies the REAL signature (== verifying with the genuine pub) -> usable key 55 let ved: i64 = ed25519_verify_full(out, buf, TBS_LEN, sig) 56 let vor: i64 = ed25519_verify_full(pub, buf, TBS_LEN, sig) 57 if ved == 1 { if ved == vor { pass = pass + 1; ew("T2 extracted-key-verifies PASS\n" as *u8) } else { ew("T2 FAIL extracted!=genuine\n" as *u8) } } else { ew("T2 FAIL good-verify=" as *u8); en(ved); ew(" (expected accept=1)\n" as *u8) } 58 59 // T3: tamper a TBS byte -> the extracted key must REJECT 60 let sav: i64 = buf[3] as i64 61 buf[3] = ((sav + 1) & 0xff) as u8 62 let vt: i64 = ed25519_verify_full(out, buf, TBS_LEN, sig) 63 buf[3] = sav as u8 64 if vt != 1 { pass = pass + 1; ew("T3 tamper-rejected PASS\n" as *u8) } else { ew("T3 FAIL tampered accepted\n" as *u8) } 65 66 // T4 (NEG): pubkey_len 31 -> BAD_LEN 67 cert.pubkey_len = 31 68 if nx_x509_pubkey_extract_ed25519(buf, cert, out) == NX_X509_PUBKEY_ED_BAD_LEN { pass = pass + 1; ew("T4 bad-len-31 PASS\n" as *u8) } else { ew("T4 FAIL len31 accepted\n" as *u8) } 69 70 // T5 (NEG): pubkey_len 33 -> BAD_LEN 71 cert.pubkey_len = 33 72 if nx_x509_pubkey_extract_ed25519(buf, cert, out) == NX_X509_PUBKEY_ED_BAD_LEN { pass = pass + 1; ew("T5 bad-len-33 PASS\n" as *u8) } else { ew("T5 FAIL len33 accepted\n" as *u8) } 73 74 // T6: verdict validator well-formed (+neg) 75 var ok6: i64 = 1 76 if nx_x509_pubkey_ed_verdict_is_valid(NX_X509_PUBKEY_ED_OK) != 1 { ok6 = 0 } 77 if nx_x509_pubkey_ed_verdict_is_valid(NX_X509_PUBKEY_ED_BAD_LEN) != 1 { ok6 = 0 } 78 if nx_x509_pubkey_ed_verdict_is_valid(555) != 0 { ok6 = 0 } 79 if ok6 == 1 { pass = pass + 1; ew("T6 verdict-valid PASS\n" as *u8) } else { ew("T6 FAIL\n" as *u8) } 80 81 ew("NX-X509-PUBKEY-ED-KAT " as *u8); en(pass); ew("/6" as *u8) 82 if pass == 6 { ew(" GREEN\n" as *u8); return 0 } 83 ew(" RED\n" as *u8) 84 return 1 85}