150 lines
4.3 KiB
C++
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__
|