code wiki / _hdl_build / nx_tor_ntor_cli.nx

nx_tor_ntor_cli.nx source

↩ module page · 52 lines · 3511 B

1// nx_tor_ntor_cli.nx -- CLI/demo for the sovereign Tor ntor handshake. Runs ONE full handshake with FIXED 2// deterministic keys and prints every wire artifact as hex: the client onion skin (CREATE2 HDATA), the 3// server reply Y|AUTH (CREATED2 HDATA), KEY_SEED, and the 92-byte circuit keys. Purpose: this is the 4// harness that CLOSES the remaining interop gap -- feed the SAME fixed inputs to a reference Tor ntor 5// (e.g. tor's ntor_ref.py) offline and diff the hex; equality == byte-exact interop. No network, no args. 6// license_tier: ORIGINAL expect_exit: 0 7import "nx_syscalls.nx" 8import "nx_x25519_ephemeral.nx" 9import "nx_tor_ntor.nx" 10 11func c_w(s: *u8) -> i64 { var n: i64=0; while s[n]!=(0 as u8){n=n+1} sys_write(1,s,n); return 0 } 12// print buf[0..n) as lowercase hex + newline 13func c_hex(label: *u8, buf: *u8, n: i64) -> i64 { 14 c_w(label) 15 let hexd: *u8 = "0123456789abcdef" as *u8 16 let out: *u8 = sys_mmap(n*2 + 2) 17 var i: i64=0; var o: i64=0 18 while i<n { let b: i64 = buf[i] as i64; out[o]=hexd[(b>>4)&0xf]; out[o+1]=hexd[b&0xf]; o=o+2; i=i+1 } 19 out[o]=10 as u8; o=o+1 20 sys_write(1, out, o) 21 return 0 22} 23 24func main() -> i64 { 25 c_w("=== nx_tor_ntor CLI -- deterministic ntor handshake (tor-spec 5.1.4), fixed keys ===\n" as *u8) 26 // fixed inputs (same as the gate) 27 let id: *u8 = sys_mmap(20); var ii: i64=0; while ii<20 { id[ii]=ii as u8; ii=ii+1 } 28 let bpriv: *u8 = sys_mmap(32) 29 bpriv[0]=0x5d;bpriv[1]=0xab;bpriv[2]=0x08;bpriv[3]=0x7e;bpriv[4]=0x62;bpriv[5]=0x4a;bpriv[6]=0x8a;bpriv[7]=0x4b;bpriv[8]=0x79;bpriv[9]=0xe1;bpriv[10]=0x7f;bpriv[11]=0x8b;bpriv[12]=0x83;bpriv[13]=0x80;bpriv[14]=0x0e;bpriv[15]=0xe6;bpriv[16]=0x6f;bpriv[17]=0x3b;bpriv[18]=0xb1;bpriv[19]=0x29;bpriv[20]=0x26;bpriv[21]=0x18;bpriv[22]=0xb6;bpriv[23]=0xfd;bpriv[24]=0x1c;bpriv[25]=0x2f;bpriv[26]=0x8b;bpriv[27]=0x27;bpriv[28]=0xff;bpriv[29]=0x88;bpriv[30]=0xe0;bpriv[31]=0xeb 30 let bpub: *u8 = sys_mmap(32); x25519_keypair_public(bpriv, bpub) 31 let xpriv: *u8 = sys_mmap(32) 32 xpriv[0]=0x77;xpriv[1]=0x07;xpriv[2]=0x6d;xpriv[3]=0x0a;xpriv[4]=0x73;xpriv[5]=0x18;xpriv[6]=0xa5;xpriv[7]=0x7d;xpriv[8]=0x3c;xpriv[9]=0x16;xpriv[10]=0xc1;xpriv[11]=0x72;xpriv[12]=0x51;xpriv[13]=0xb2;xpriv[14]=0x66;xpriv[15]=0x45;xpriv[16]=0xdf;xpriv[17]=0x4c;xpriv[18]=0x2f;xpriv[19]=0x87;xpriv[20]=0xeb;xpriv[21]=0xc0;xpriv[22]=0x99;xpriv[23]=0x2a;xpriv[24]=0xb1;xpriv[25]=0x77;xpriv[26]=0xfb;xpriv[27]=0xa5;xpriv[28]=0x1d;xpriv[29]=0xb9;xpriv[30]=0x2c;xpriv[31]=0x2a 33 let ypriv: *u8 = sys_mmap(32); var yi: i64=0; while yi<32 { ypriv[yi]=(0x40+yi) as u8; yi=yi+1 } 34 35 c_hex("onion_key B = " as *u8, bpub, 32) 36 let xpub: *u8 = sys_mmap(32); let skin: *u8 = sys_mmap(128) 37 ntor_client_init(id, bpub, xpriv, xpub, skin) 38 c_hex("client_pk X = " as *u8, xpub, 32) 39 c_hex("onion_skin(84) = " as *u8, skin, 84) 40 41 let ypub: *u8 = sys_mmap(32); let auth_s: *u8 = sys_mmap(32); let keys_s: *u8 = sys_mmap(96) 42 ntor_server_respond(id, bpub, bpriv, xpub, ypriv, ypub, auth_s, keys_s) 43 c_hex("server_pk Y = " as *u8, ypub, 32) 44 c_hex("AUTH = " as *u8, auth_s, 32) 45 46 let ks_c: *u8 = sys_mmap(32); let keys_c: *u8 = sys_mmap(96) 47 let cr: i64 = ntor_client_finish(id, bpub, xpriv, xpub, ypub, auth_s, ks_c, keys_c) 48 c_hex("KEY_SEED = " as *u8, ks_c, 32) 49 c_hex("keys(92) = " as *u8, keys_c, 92) 50 if cr==0 { c_w("client AUTH verify: OK (keys agree with server)\n" as *u8) } else { c_w("client AUTH verify: FAIL\n" as *u8) } 51 return 0 52}