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}