Commit adbe6a25 authored by rl1987's avatar rl1987
Browse files

Copy socks5.trunnel from trunnel examples dir

parent b556894e
Loading
Loading
Loading
Loading
+115 −0
Original line number Diff line number Diff line
// 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
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];
   u8 command IN [CMD_CONNECT, CMD_BIND, CMD_UDP_ASSOCIATE, CMD_RESOLVE_PTR];
   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];
}

struct socks5_server_userpath_auth {
   u8 version IN [1];
   u8 status;
}

// Oh why not.  Here's socks4 and socks4a.

struct socks4_client_request {
   u8 version IN [4];
   u8 command IN [CMD_CONNECT,CMD_BIND,CMD_RESOLVE_PTR];
   u16 port;
   u32 addr;
   nulterm username;
   union socks4a_addr[addr] {
      1..255:
               nulterm hostname;
      default:
               ;
   };
}

struct socks4_server_reply {
   u8 version IN [4];
   u8 status;
   u16 port;
   u32 addr;
}

// And here's the extended stuff from proposal 229

struct tor_socksauth_keyval {
  u16 keylen;
  char key[keylen];
  u16 vallen;
  char val[vallen];
}

struct tor_extended_socks_auth_request {
  u8 version IN [1];
  u16 npairs;
  struct tor_socksauth_keyval pairs[npairs];
}

struct tor_extended_socks_auth_response {
  u8 version IN [1];
  u8 status;
  u16 npairs;
  struct tor_socksauth_keyval pairs[npairs];
}