102 lines
2.5 KiB
C++
102 lines
2.5 KiB
C++
//----------------------------------------------------------------------------
|
|
//
|
|
// Copyright (C) Intel Corporation, 2006 - 2007.
|
|
//
|
|
// File: SOCKSv5.cpp
|
|
//
|
|
// Contents:
|
|
//
|
|
// Notes:
|
|
//----------------------------------------------------------------------------
|
|
|
|
//===================================================
|
|
// INCLUDES
|
|
//===================================================
|
|
#include "SOCKSv5.h"
|
|
#include <ace/SOCK_Stream.h>
|
|
#include <ace/Message_Block.h>
|
|
|
|
|
|
//===================================================
|
|
// Socksv5 Implementation
|
|
//===================================================
|
|
STATUS SOCKSv5_ClientVersion::read(ACE_SOCK_Stream &stream)
|
|
{
|
|
READ_ERROR(stream, VER);
|
|
READ_ERROR(stream, NMETHODS);
|
|
|
|
for (int i=0; i < NMETHODS; i++)
|
|
{
|
|
READ_ERROR(stream, METHODS[i]);
|
|
}
|
|
return STATUS_SUCCESS;
|
|
}
|
|
|
|
void SOCKSv5_ServerVersion::write(ACE_Message_Block* &mb)
|
|
{
|
|
mb = new ACE_Message_Block (this->size(), ACE_Message_Block::MB_DATA);
|
|
|
|
Protocol_BasicMessage::write(mb, (ACE_UINT8) VER);
|
|
Protocol_BasicMessage::write(mb, (ACE_UINT8) METHOD);
|
|
}
|
|
|
|
STATUS SOCKSv5_ClientRequest::read(ACE_SOCK_Stream &stream)
|
|
{
|
|
ACE_UINT8 addr_size = 0;
|
|
READ_ERROR(stream, VER);
|
|
READ_ERROR(stream, CMD);
|
|
READ_ERROR(stream, RSV);
|
|
READ_ERROR(stream, ATYP);
|
|
|
|
switch (ATYP)
|
|
{
|
|
case IPV4:
|
|
ADDR_LEN = 4;
|
|
break;
|
|
case DOMAINNAME:
|
|
READ_ERROR(stream, ADDR_LEN);
|
|
break;
|
|
case IPV6:
|
|
ADDR_LEN = 16;
|
|
break;
|
|
default:
|
|
return STATUS_ILLEGAL_SOCKS_MESSAGE;
|
|
}
|
|
READ_STR_ERROR(stream, DST_ADDR, ADDR_LEN);
|
|
READ_ERROR(stream, DST_PORT);
|
|
return STATUS_SUCCESS;
|
|
}
|
|
|
|
void SOCKSv5_ServerReply::write(ACE_Message_Block* &mb)
|
|
{
|
|
mb = new ACE_Message_Block (this->size(), ACE_Message_Block::MB_DATA);
|
|
|
|
Protocol_BasicMessage::write(mb, VER);
|
|
Protocol_BasicMessage::write(mb, REP);
|
|
Protocol_BasicMessage::write(mb, RSV);
|
|
Protocol_BasicMessage::write(mb, ATYP);
|
|
if (ATYP == DOMAINNAME)
|
|
Protocol_BasicMessage::write(mb, BND_ADR_LEN);
|
|
Protocol_BasicMessage::write(mb, BND_ADDR, BND_ADR_LEN);
|
|
Protocol_BasicMessage::write(mb, BND_PORT);
|
|
}
|
|
STATUS SOCKSv5_UssrPwdSubNegotiate::read(ACE_SOCK_Stream &stream)
|
|
{
|
|
READ_ERROR(stream, VER);
|
|
if (VER != 1)
|
|
return STATUS_ILLEGAL_SOCKS_MESSAGE;
|
|
READ_ERROR(stream, ULEN);
|
|
READ_STR_ERROR(stream, UNAME, ULEN);
|
|
READ_ERROR(stream, PLEN);
|
|
READ_STR_ERROR(stream, PWD, PLEN);
|
|
return STATUS_SUCCESS;
|
|
}
|
|
|
|
void SOCKSv5_UssrPwdSubNegotiateReply::write(ACE_Message_Block* &mb)
|
|
{
|
|
mb = new ACE_Message_Block (this->size(), ACE_Message_Block::MB_DATA);
|
|
|
|
Protocol_BasicMessage::write(mb, VER);
|
|
Protocol_BasicMessage::write(mb, AUTH_REPLAY);
|
|
}
|