#ifndef __DSTCPEndpoint_h__
#define __DSTCPEndpoint_h__ 1
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h> // struct sockaddr_in
#include "DSNetworkUtilities.h" // for some constants
#include "SharedConsts.h"
#include "libCdsaCrypt.h"
#define DH_KEY_SIZE 512
#define DERIVE_KEY_SIZE 128
#define DERIVE_KEY_ALG CSSM_ALGID_AES
#define DSTCPAuthTag 'DHN2'
enum eKeyState {
eKeyStateSendPublicKey = 0,
eKeyStateGenerateChallenge,
eKeyStateAcceptResponse,
eKeyStateAcceptClientKey,
eKeyStateGenerateResponse,
eKeyStateValidKey
};
const UInt32 kTCPOpenTimeout = 120;
#ifdef DSSERVERTCP
const UInt32 kTCPRWTimeout = 60*60*24; #else
const UInt32 kTCPRWTimeout = 60*5; #endif
const UInt32 kTCPMaxListenBackLog = 1024;
const UInt32 kTCPErrorBufferLen = 256;
const UInt32 kDSTCPEndpointMaxMessageSize = 1024; const UInt32 kDSTCPEndpointMessageTagSize = 4;
class DSTCPEndpoint : public CIPCVirtualClass
{
public:
enum eExceptions
{
kConnectionLostWarning = eDSCannotAccessSession, kTimeoutError = eDSServerTimeout, };
enum eTimeoutType
{
kOpenTimeoutType = 1,
kRWTimeoutType,
kDefaultTimeoutType
};
DSTCPEndpoint ( const UInt32 inOpenTimeOut = kTCPOpenTimeout, const UInt32 inRdWrTimeOut = kTCPRWTimeout, int inSocket = -1 );
virtual ~DSTCPEndpoint ( void );
virtual SInt32 SendMessage ( sComData *inMessage );
virtual SInt32 GetReplyMessage ( sComData **outMessage );
SInt32 ClientNegotiateKey ( void );
SInt32 ServerNegotiateKey ( void *dataBuff, UInt32 dataBuffLen );
SInt32 ProcessData ( bool bEncrypt, void *inBuffer, UInt32 inBufferLen, void *&outBuffer, UInt32 &outBufferLen );
UInt32 GetReverseAddress ( void ) const { return mRemoteHostIPAddr; }
const char *GetReverseAddressString ( void ) const { return mRemoteHostIPString; }
int GetCurrentConnection ( void ) const { return mConnectFD; }
inline bool Negotiated ( void ) { return (fKeyState == eKeyStateValidKey); }
SInt32 SyncToMessageBody ( const Boolean inStripLeadZeroes, UInt32 *outBuffLen );
SInt32 SendBuffer ( void *inBuffer, UInt32 inLength );
Boolean Connected ( void ) const ;
SInt32 ConnectTo ( struct addrinfo *inAddrInfo ); void CloseConnection ( void );
void GetReverseAddressString ( char *ioBuffer, const int inBufferSize ) const ;
UInt32 GetRemoteHostIPAddress ( void ) { return mRemoteHostIPAddr; }
in_port_t GetRemoteHostPort ( void ) { return ( ntohs(mRemoteSockAddr.sin_port) ); }
sockaddr * GetRemoteSockAddr ( void ) { return (sockaddr *) &mRemoteSockAddr; }
sComProxyData* AllocToProxyStruct ( sComData *inDataMsg );
sComData* AllocFromProxyStruct( sComProxyData *inProxyDataMsg );
protected:
UInt32 DoTCPRecvFrom ( void *ioBuffer, const UInt32 inBufferSize );
private:
int DoTCPOpenSocket ( void );
int SetSocketOption ( const int inSocket, const int inSocketOption);
int DoTCPCloseSocket ( const int inSockFD );
protected:
struct sockaddr_in mMySockAddr;
UInt32 mRemoteHostIPAddr; IPAddrStr mRemoteHostIPString; struct sockaddr_in mRemoteSockAddr;
int mConnectFD;
char *mErrorBuffer;
Boolean mWeHaveClosed;
int mOpenTimeout; int mRWTimeout; int mDefaultTimeout;
private:
CSSM_CSP_HANDLE fcspHandle;
eKeyState fKeyState;
CSSM_DATA fParamBlock;
CSSM_KEY fPrivateKey;
CSSM_KEY fPublicKey;
CSSM_KEY fDerivedKey;
uint32_t fChallengeValue;
static int32_t mMessageID; };
#endif // __DSTCPEndpoint_h__