00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036 #pragma warning(disable:4786)
00037
00038 #include <winsock2.h>
00039 #include <windows.h>
00040
00041 #include "TCPSocketAsyncBlowFish.h"
00042
00043 #ifdef _DEBUG
00044 #include "DebugHeap.h"
00045 #endif
00046
00047 KOMODIA_NAMESPACE_START
00048
00049 CTCPSocketAsyncBlowFish::CTCPSocketAsyncBlowFish() : m_aEncryptChain(0xC009F158,0x17EC17EC),
00050 m_aDecryptChain(0xC009F158,0x17EC17EC)
00051 {
00052 }
00053
00054 CTCPSocketAsyncBlowFish::~CTCPSocketAsyncBlowFish()
00055 {
00056 }
00057
00058 void CTCPSocketAsyncBlowFish::SetKey(const std::string& rKey)
00059 {
00060
00061 m_sKey=rKey;
00062 }
00063
00064 int CTCPSocketAsyncBlowFish::ReceiveMsg(char* pData,
00065 int iSize,
00066 int& iMoreMessages)
00067 {
00068
00069 int iResult;
00070 iResult=BlowFishBaseClass::ReceiveMsg(pData,
00071 iSize,
00072 iMoreMessages);
00073
00074
00075 if (iResult<=0)
00076 return iResult;
00077
00078
00079 if (!DecryptMemory(pData,
00080 iResult))
00081 return -4;
00082
00083
00084 int iOriginalSize;
00085 memcpy(&iOriginalSize,
00086 pData,
00087 sizeof(iOriginalSize));
00088
00089
00090 if (iOriginalSize>iResult ||
00091 iOriginalSize<0)
00092
00093 return -4;
00094
00095
00096 memcpy(pData,
00097 pData+sizeof(iOriginalSize),
00098 iOriginalSize);
00099
00100
00101 return iOriginalSize;
00102 }
00103
00104 int CTCPSocketAsyncBlowFish::SendMsg(const char* pData,
00105 int iSize)
00106 {
00107
00108 char* pNewData;
00109 pNewData=new char[iSize+256];
00110
00111
00112 memcpy(pNewData,
00113 &iSize,
00114 sizeof(iSize));
00115
00116
00117 memcpy(pNewData+sizeof(iSize),
00118 pData,
00119 iSize);
00120
00121
00122 blowfish::Block aChain(m_aEncryptChain);
00123
00124
00125 unsigned long ulNewSize;
00126 ulNewSize=EncryptMemory(pNewData,
00127 iSize+sizeof(iSize));
00128
00129
00130 int iResult;
00131 iResult=BlowFishBaseClass::SendMsg(pNewData,
00132 ulNewSize);
00133
00134
00135 delete [] pNewData;
00136
00137
00138 if (iResult!=ulNewSize)
00139
00140 m_aEncryptChain=aChain;
00141
00142
00143 return iResult;
00144 }
00145
00146 int CTCPSocketAsyncBlowFish::SendMsg(const char* pData,
00147 int iSize,
00148 CGenericEvent* pStopEvent)
00149 {
00150
00151 char* pNewData;
00152 pNewData=new char[iSize+256];
00153
00154
00155 memcpy(pNewData,
00156 &iSize,
00157 sizeof(iSize));
00158
00159
00160 memcpy(pNewData+sizeof(iSize),
00161 pData,
00162 iSize);
00163
00164
00165 blowfish::Block aChain(m_aEncryptChain);
00166
00167
00168 unsigned long ulNewSize;
00169 ulNewSize=EncryptMemory(pNewData,
00170 iSize+sizeof(iSize));
00171
00172
00173 int iResult;
00174 iResult=BlowFishBaseClass::SendMsg(pNewData,
00175 ulNewSize,
00176 pStopEvent);
00177
00178
00179 delete [] pNewData;
00180
00181
00182 if (iResult!=ulNewSize)
00183
00184 m_aEncryptChain=aChain;
00185
00186
00187 return iResult;
00188 }
00189
00190 unsigned long CTCPSocketAsyncBlowFish::EncryptMemory(char* pBuffer,
00191 unsigned long ulSize)const
00192 {
00193
00194 blowfish::Pad const pad = blowfish::generatePad(m_sKey.c_str(),
00195 m_sKey.length());
00196
00197
00198 unsigned long ulNewSize(ulSize);
00199 ulNewSize+=blowfish::kBlockSize-1;
00200 ulNewSize-=ulNewSize % blowfish::kBlockSize;
00201
00202
00203 blowfish::encrypt_CBC(pad,
00204 pBuffer,
00205 pBuffer,
00206 ulNewSize,
00207 &m_aEncryptChain);
00208
00209
00210 return ulNewSize;
00211 }
00212
00213 unsigned long CTCPSocketAsyncBlowFish::DecryptMemory(char* pBuffer,
00214 unsigned long ulSize)const
00215 {
00216
00217 blowfish::Pad const pad = blowfish::generatePad(m_sKey.c_str(),
00218 m_sKey.length());
00219
00220
00221
00222 blowfish::decrypt_CBC(pad,
00223 pBuffer,
00224 pBuffer,
00225 ulSize,
00226 &m_aDecryptChain);
00227
00228
00229 return ulSize;
00230 }
00231
00232 BOOL CTCPSocketAsyncBlowFish::Accept(CTCPSocket* pNewSocket)
00233 {
00234
00235 ((CTCPSocketAsyncBlowFish*)pNewSocket)->SetKey(m_sKey);
00236
00237
00238 return CTCPSocketAsync::Accept(pNewSocket);
00239 }
00240
00241 const std::string& CTCPSocketAsyncBlowFish::GetKey()const
00242 {
00243 return m_sKey;
00244 }
00245
00246 KOMODIA_NAMESPACE_END