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);
}