//---------------------------------------------------------------------------- // // Copyright (C) Intel Corporation, 2006 - 2007. // // File: SOCKSv5.h // // Contents: SOCKS Protocol Version 5 definitions // // Notes: //---------------------------------------------------------------------------- #ifndef _SOCKS_V5_H__ #define _SOCKS_V5_H__ //mps headers: #include "ProtocolBasicMessage.h" #define SOCKS_MAX_STRING_SIZE 256 #define SOCKS_V5_MAX_ADDRESS_SIZE 256 // Protocol version #define SOCKS_V5_PROTOCOL_VERSION 5 #define MAX_HOST_NAME_LEN 256 // Enumerations enum SOCKS_V5_METHOD { NO_AUTH =0, GSSAPI =1, USER_PASS =2, NOT_ACCEPTABLE =0xFF }; enum SOCKS_V5_ADDRESS { IPV4 =1, DOMAINNAME =3, IPV6 =4 }; enum SOCKS_V5_CMD { CONNECT =1, BIND =2, UDP_ASSOCIATE =3 }; enum SOCKS_V5_REP { SOCKS_SUCCEEDED =0, SERVER_FAILURE =1, CONNECTION_NOT_ALLOWED =2, NETWORK_UNREACHABLE =3, HOST_UNREACHABLE =4, CONNECTION_REFUESED =5, TTL_EXPIRED =6, COMMAND_NOT_SUPPORTED =7, ADDRESS_TYPE_NOT_SUPPORTED =8 }; class SOCKS_BasicMessage: public Protocol_BasicMessage{ public: virtual unsigned int maxSize(){return SOCKS_MAX_STRING_SIZE;} }; class SOCKSv5_ClientVersion: public SOCKS_BasicMessage{ public: ACE_UINT8 VER = 0; // Protocol version - X'05' for this version of the protocol ACE_UINT8 NMETHODS = 0; // Number of method identifier octets that appear in the METHODS field ACE_UINT8 METHODS[256]; // Array of methods that the client supports //derived from Protocol_BasicMessage: size_t size() {return NMETHODS+2;} STATUS read (ACE_SOCK_Stream &stream); void write (ACE_Message_Block *&mb) {}; }; class SOCKSv5_ServerVersion: public SOCKS_BasicMessage { public: ACE_UINT8 VER = 0; // Protocol version - X'05' for this version of the protocol ACE_UINT8 METHOD = 0; // Method that was selected by the server //derived from Protocol_BasicMessage: size_t size() {return 2;} STATUS read (ACE_SOCK_Stream &stream) {return STATUS_OPERATION_NOT_SUPPORTED;}; void write (ACE_Message_Block *&mb); }; class SOCKSv5_ClientRequest: public SOCKS_BasicMessage { public: ACE_UINT8 VER; // Protocol version - X'05' for this version of the protocol ACE_UINT8 CMD; // Connect - X'01', Bind - X'02' or UDP Associate - X'03' ACE_UINT8 RSV; // X'00' ACE_UINT8 ATYP; // IPv4 address - X'01', domain name - X'03', IPv6 address - X'04' ACE_CString DST_ADDR; // Desired destination address ACE_UINT16 DST_PORT; // Desired destination port in network octet ACE_UINT8 ADDR_LEN; //received in DST_ADDR[0] //derived from Protocol_BasicMessage: size_t size() {return ADDR_LEN+6;} STATUS read (ACE_SOCK_Stream &stream); void write (ACE_Message_Block *&mb) {}; }; class SOCKSv5_ServerReply: public SOCKS_BasicMessage { public: ACE_UINT8 VER; // Protocol version - X'05' for this version of the protocol ACE_UINT8 REP; // Reply field. ACE_UINT8 RSV; // X'00' ACE_UINT8 ATYP; // IPv4 address - X'01', // domain name - X'03' // IPv6 address - X'04' ACE_CString BND_ADDR; // Server bound address ACE_UINT16 BND_PORT; // Server bound port in network octet ACE_UINT8 BND_ADR_LEN;// This is not part of the protocol. // if ATYP = Domain this value is equal to BND_ADDR[0] // else: 4 if IPv4, 16 if IPv6 // derived from Protocol_BasicMessage: size_t size() {return BND_ADR_LEN+6;} STATUS read (ACE_SOCK_Stream &stream) {return STATUS_OPERATION_NOT_SUPPORTED;} void write (ACE_Message_Block *&mb); }; class SOCKSv5_UssrPwdSubNegotiate: public SOCKS_BasicMessage { public: ACE_UINT8 VER; //version of the subnegotiation, which is X'01' ACE_UINT8 ULEN; // contains the length of the UNAME field ACE_CString UNAME; // contains the username ACE_UINT8 PLEN ; // length of the PASSWD field ACE_CString PWD; // client password // derived from Protocol_BasicMessage: size_t size() {return ULEN+PLEN+3;} STATUS read (ACE_SOCK_Stream &stream) ; void write (ACE_Message_Block *&mb){} }; class SOCKSv5_UssrPwdSubNegotiateReply: public SOCKS_BasicMessage { public: ACE_UINT8 VER = 0; //version ACE_UINT8 AUTH_REPLAY = 0; // replay // derived from Protocol_BasicMessage: size_t size() {return 2;} STATUS read (ACE_SOCK_Stream &stream) {return STATUS_OPERATION_NOT_SUPPORTED;} void write (ACE_Message_Block *&mb); }; #endif //_SOCKS_V5_H__