2018-05-13 14:06:43 +02:00
|
|
|
// Example: here's a quickie implementation of the messages in the
|
|
|
|
// socks5 protocol.
|
|
|
|
|
|
|
|
struct socks5_client_version {
|
|
|
|
u8 version IN [5];
|
|
|
|
u8 n_methods;
|
|
|
|
u8 methods[n_methods];
|
|
|
|
}
|
|
|
|
|
|
|
|
struct socks5_server_method {
|
|
|
|
u8 version IN [5];
|
|
|
|
u8 method;
|
|
|
|
}
|
|
|
|
|
|
|
|
const CMD_CONNECT = 1;
|
|
|
|
const CMD_BIND = 2;
|
|
|
|
const CMD_UDP_ASSOCIATE = 3;
|
|
|
|
// This is a tor extension
|
2018-05-15 11:49:07 +02:00
|
|
|
const CMD_RESOLVE = 0xF0;
|
2018-05-13 14:06:43 +02:00
|
|
|
const CMD_RESOLVE_PTR = 0xF1;
|
|
|
|
|
|
|
|
const ATYPE_IPV4 = 1;
|
|
|
|
const ATYPE_IPV6 = 4;
|
|
|
|
const ATYPE_DOMAINNAME = 3;
|
|
|
|
|
|
|
|
struct domainname {
|
|
|
|
u8 len;
|
|
|
|
char name[len];
|
|
|
|
}
|
|
|
|
|
|
|
|
struct socks5_client_request {
|
|
|
|
u8 version IN [5];
|
2018-05-22 12:23:32 +02:00
|
|
|
u8 command IN [CMD_CONNECT, CMD_BIND, CMD_UDP_ASSOCIATE, CMD_RESOLVE, CMD_RESOLVE_PTR];
|
2018-05-13 14:06:43 +02:00
|
|
|
u8 reserved IN [0];
|
|
|
|
u8 atype;
|
|
|
|
union dest_addr[atype] {
|
|
|
|
ATYPE_IPV4: u32 ipv4;
|
|
|
|
ATYPE_IPV6: u8 ipv6[16];
|
|
|
|
ATYPE_DOMAINNAME: struct domainname domainname;
|
|
|
|
default: fail;
|
|
|
|
};
|
|
|
|
u16 dest_port;
|
|
|
|
}
|
|
|
|
|
|
|
|
struct socks5_server_reply {
|
|
|
|
u8 version IN [5];
|
|
|
|
u8 reply;
|
|
|
|
u8 reserved IN [0];
|
|
|
|
u8 atype;
|
|
|
|
union bind_addr[atype] {
|
|
|
|
ATYPE_IPV4: u32 ipv4;
|
|
|
|
ATYPE_IPV6: u8 ipv6[16];
|
|
|
|
ATYPE_DOMAINNAME: struct domainname domainname;
|
|
|
|
default: fail;
|
|
|
|
};
|
|
|
|
u16 bind_port;
|
|
|
|
}
|
|
|
|
|
|
|
|
struct socks5_client_userpass_auth {
|
|
|
|
u8 version IN [1];
|
|
|
|
u8 username_len;
|
|
|
|
char username[username_len];
|
|
|
|
u8 passwd_len;
|
|
|
|
char passwd[passwd_len];
|
|
|
|
}
|
|
|
|
|
2018-05-16 14:47:46 +02:00
|
|
|
struct socks5_server_userpass_auth {
|
2018-05-13 14:06:43 +02:00
|
|
|
u8 version IN [1];
|
|
|
|
u8 status;
|
|
|
|
}
|
|
|
|
|
|
|
|
// Oh why not. Here's socks4 and socks4a.
|
|
|
|
|
|
|
|
struct socks4_client_request {
|
|
|
|
u8 version IN [4];
|
2018-05-15 11:49:07 +02:00
|
|
|
u8 command IN [CMD_CONNECT,CMD_BIND,CMD_RESOLVE,CMD_RESOLVE_PTR];
|
2018-05-13 14:06:43 +02:00
|
|
|
u16 port;
|
|
|
|
u32 addr;
|
|
|
|
nulterm username;
|
|
|
|
union socks4a_addr[addr] {
|
|
|
|
1..255:
|
|
|
|
nulterm hostname;
|
|
|
|
default:
|
|
|
|
;
|
|
|
|
};
|
|
|
|
}
|
|
|
|
|
|
|
|
struct socks4_server_reply {
|
2018-09-12 10:18:43 +02:00
|
|
|
u8 version IN [0,4];
|
2018-05-13 14:06:43 +02:00
|
|
|
u8 status;
|
|
|
|
u16 port;
|
|
|
|
u32 addr;
|
|
|
|
}
|
|
|
|
|