150 lines
4.3 KiB
C++

//----------------------------------------------------------------------------
//
// 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__