code wiki / (root) / nx_udp_tracker_test.nx

nx_udp_tracker_test.nx source

↩ module page · 61 lines · 2653 B

1// nx_udp_tracker_test.nx -- KAT for the UDP tracker protocol (BEP-15). 2// Native sovereign lane; exit 0 = pass, N = assertion N failed. 3 4import "nx_str.nx" 5import "nx_udp_tracker.nx" 6 7func main() -> i64 { 8 // connect request: magic 0x41727101980 (BE 00 00 04 17 27 10 19 80) + action 0 + txid 9 let c: *u8 = sys_mmap(16) 10 if nx_udp_build_connect(0x12345678, c) != 16 { return 1 } 11 if (c[0] as i64) != 0 { return 2 } 12 if (c[2] as i64) != 0x04 { return 3 } 13 if (c[7] as i64) != 0x80 { return 4 } 14 if _ut_get_u32(c, 8) != NX_UDP_ACT_CONNECT { return 5 } 15 if _ut_get_u32(c, 12) != 0x12345678 { return 6 } 16 17 // connect response -> connection_id 18 let cr: *u8 = sys_mmap(16) 19 _ut_put_u32(cr, 0, 0) 20 _ut_put_u32(cr, 4, 0x12345678) 21 _ut_put_u64(cr, 8, 0x1122334455667788) 22 let oc: *i64 = sys_mmap(8) as *i64 23 if nx_udp_parse_connect_resp(cr, 16, 0x12345678, oc) != 1 { return 7 } 24 if oc[0] != 0x1122334455667788 { return 8 } 25 // wrong txid -> rejected 26 if nx_udp_parse_connect_resp(cr, 16, 0x999, oc) != 0 { return 9 } 27 28 // announce request (98 bytes) 29 let ih: *u8 = sys_mmap(20) 30 let pid: *u8 = sys_mmap(20) 31 var i: i64 = 0 32 while i < 20 { ih[i] = 0xAB; pid[i] = 0xCD; i = i + 1 } 33 let a: *u8 = sys_mmap(128) 34 if nx_udp_build_announce(0x1122334455667788, 0x12345678, ih, pid, 0, 1000, 0, 2, 50, 6881, a) != 98 { return 10 } 35 if _ut_get_u32(a, 8) != NX_UDP_ACT_ANNOUNCE { return 11 } 36 if (a[16] as i64) != 0xAB { return 12 } // info_hash 37 if (a[36] as i64) != 0xCD { return 13 } // peer_id 38 if _ut_get_u64(a, 64) != 1000 { return 14 } // left 39 if _ut_get_u32(a, 92) != 50 { return 15 } // num_want 40 if ((a[96] as i64) << 8 | (a[97] as i64)) != 6881 { return 16 } // port 41 42 // announce response: interval 1800, leechers 2, seeders 5, 1 peer 127.0.0.1:6881 43 let ar: *u8 = sys_mmap(64) 44 _ut_put_u32(ar, 0, 1); _ut_put_u32(ar, 4, 0x12345678) 45 _ut_put_u32(ar, 8, 1800); _ut_put_u32(ar, 12, 2); _ut_put_u32(ar, 16, 5) 46 ar[20]=127; ar[21]=0; ar[22]=0; ar[23]=1; ar[24]=0x1A; ar[25]=0xE1 47 let iv: *i64 = sys_mmap(8) as *i64 48 let sd: *i64 = sys_mmap(8) as *i64 49 let lc: *i64 = sys_mmap(8) as *i64 50 let ips: *i64 = sys_mmap(8 * 8) as *i64 51 let ports: *i64 = sys_mmap(8 * 8) as *i64 52 let np: i64 = nx_udp_parse_announce_resp(ar, 26, 0x12345678, iv, sd, lc, ips, ports, 8) 53 if np != 1 { return 17 } 54 if iv[0] != 1800 { return 18 } 55 if sd[0] != 5 { return 19 } 56 if lc[0] != 2 { return 20 } 57 if ips[0] != 0x7F000001 { return 21 } 58 if ports[0] != 6881 { return 22 } 59 60 return 0 61}