//---------------------------------------------------------------------------- // // Copyright (C) Intel Corporation, 2006 - 2007. // // File: SOCKSv5.cpp // // Contents: // // Notes: //---------------------------------------------------------------------------- //=================================================== // INCLUDES //=================================================== #include "SOCKSv5.h" #include #include //=================================================== // 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); }