ccdb2BaseLib.cpp 6.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337
  1. //#include "stdafx.h"
  2. #include "ccdb2BaseLib.h"
  3. #include <stdio.h>
  4. #include <openssl/err.h>
  5. #include <openssl/sha.h>
  6. #include <openssl/des.h>
  7. char szErrorMsg[1024];
  8. static unsigned char cbc_iv [8]={0x0e,0xd1,0xba,0x9a,0xf6,0x5c,0x38,0x19};
  9. #define ATL_BASE64_FLAG_NONE 0
  10. #define ATL_BASE64_FLAG_NOPAD 1
  11. #define ATL_BASE64_FLAG_NOCRLF 2
  12. inline int Base64EncodeGetRequiredLength(int nSrcLen, DWORD dwFlags=ATL_BASE64_FLAG_NONE) throw()
  13. {
  14. int nRet = nSrcLen*4/3;
  15. if ((dwFlags & ATL_BASE64_FLAG_NOPAD) == 0)
  16. nRet += nSrcLen % 3;
  17. int nCRLFs = nRet / 76 + 1;
  18. int nOnLastLine = nRet % 76;
  19. if (nOnLastLine)
  20. {
  21. if (nOnLastLine % 4)
  22. nRet += 4-(nOnLastLine % 4);
  23. }
  24. nCRLFs *= 2;
  25. if ((dwFlags & ATL_BASE64_FLAG_NOCRLF) == 0)
  26. nRet += nCRLFs;
  27. return nRet;
  28. }
  29. inline int Base64DecodeGetRequiredLength(int nSrcLen) throw()
  30. {
  31. return nSrcLen;
  32. }
  33. inline BOOL Base64Encode(
  34. const BYTE *pbSrcData,
  35. int nSrcLen,
  36. LPSTR szDest,
  37. int *pnDestLen,
  38. DWORD dwFlags=ATL_BASE64_FLAG_NONE) throw()
  39. {
  40. static const char s_chBase64EncodingTable[64] = {
  41. 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q',
  42. 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h',
  43. 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y',
  44. 'z', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '+', '/' };
  45. if (!pbSrcData || !szDest || !pnDestLen)
  46. {
  47. return FALSE;
  48. }
  49. if(*pnDestLen < Base64EncodeGetRequiredLength(nSrcLen, dwFlags))
  50. {
  51. // _ASSERT(FALSE);
  52. return FALSE;
  53. }
  54. int nWritten( 0 );
  55. int nLen1( (nSrcLen/3)*4 );
  56. int nLen2( nLen1/76 );
  57. int nLen3( 19 );
  58. for (int i=0; i<=nLen2; i++)
  59. {
  60. if (i==nLen2)
  61. nLen3 = (nLen1%76)/4;
  62. for (int j=0; j<nLen3; j++)
  63. {
  64. DWORD dwCurr(0);
  65. for (int n=0; n<3; n++)
  66. {
  67. dwCurr |= *pbSrcData++;
  68. dwCurr <<= 8;
  69. }
  70. for (int k=0; k<4; k++)
  71. {
  72. BYTE b = (BYTE)(dwCurr>>26);
  73. *szDest++ = s_chBase64EncodingTable[b];
  74. dwCurr <<= 6;
  75. }
  76. }
  77. nWritten+= nLen3*4;
  78. if ((dwFlags & ATL_BASE64_FLAG_NOCRLF)==0)
  79. {
  80. *szDest++ = '\r';
  81. *szDest++ = '\n';
  82. nWritten+= 2;
  83. }
  84. }
  85. if (nWritten && (dwFlags & ATL_BASE64_FLAG_NOCRLF)==0)
  86. {
  87. szDest-= 2;
  88. nWritten -= 2;
  89. }
  90. nLen2 = nSrcLen%3 ? nSrcLen%3 + 1 : 0;
  91. if (nLen2)
  92. {
  93. DWORD dwCurr(0);
  94. for (int n=0; n<3; n++)
  95. {
  96. if (n<(nSrcLen%3))
  97. dwCurr |= *pbSrcData++;
  98. dwCurr <<= 8;
  99. }
  100. for (int k=0; k<nLen2; k++)
  101. {
  102. BYTE b = (BYTE)(dwCurr>>26);
  103. *szDest++ = s_chBase64EncodingTable[b];
  104. dwCurr <<= 6;
  105. }
  106. nWritten+= nLen2;
  107. if ((dwFlags & ATL_BASE64_FLAG_NOPAD)==0)
  108. {
  109. nLen3 = nLen2 ? 4-nLen2 : 0;
  110. for (int j=0; j<nLen3; j++)
  111. {
  112. *szDest++ = '=';
  113. }
  114. nWritten+= nLen3;
  115. }
  116. }
  117. *pnDestLen = nWritten;
  118. return TRUE;
  119. }
  120. inline int DecodeBase64Char(unsigned int ch) throw()
  121. {
  122. // returns -1 if the character is invalid
  123. // or should be skipped
  124. // otherwise, returns the 6-bit code for the character
  125. // from the encoding table
  126. if (ch >= 'A' && ch <= 'Z')
  127. return ch - 'A' + 0; // 0 range starts at 'A'
  128. if (ch >= 'a' && ch <= 'z')
  129. return ch - 'a' + 26; // 26 range starts at 'a'
  130. if (ch >= '0' && ch <= '9')
  131. return ch - '0' + 52; // 52 range starts at '0'
  132. if (ch == '+')
  133. return 62;
  134. if (ch == '/')
  135. return 63;
  136. return -1;
  137. }
  138. inline BOOL Base64Decode(LPCSTR szSrc, int nSrcLen, BYTE *pbDest, int *pnDestLen) throw()
  139. {
  140. // walk the source buffer
  141. // each four character sequence is converted to 3 bytes
  142. // CRLFs and =, and any characters not in the encoding table
  143. // are skiped
  144. if (szSrc == NULL || pnDestLen == NULL)
  145. {
  146. // ATLASSERT(FALSE);
  147. return FALSE;
  148. }
  149. LPCSTR szSrcEnd = szSrc + nSrcLen;
  150. int nWritten = 0;
  151. BOOL bOverflow = (pbDest == NULL) ? TRUE : FALSE;
  152. while (szSrc < szSrcEnd)
  153. {
  154. DWORD dwCurr = 0;
  155. int i;
  156. int nBits = 0;
  157. for (i=0; i<4; i++)
  158. {
  159. if (szSrc >= szSrcEnd)
  160. break;
  161. int nCh = DecodeBase64Char(*szSrc);
  162. szSrc++;
  163. if (nCh == -1)
  164. {
  165. // skip this char
  166. i--;
  167. continue;
  168. }
  169. dwCurr <<= 6;
  170. dwCurr |= nCh;
  171. nBits += 6;
  172. }
  173. if(!bOverflow && nWritten + (nBits/8) > (*pnDestLen))
  174. bOverflow = TRUE;
  175. // dwCurr has the 3 bytes to write to the output buffer
  176. // left to right
  177. dwCurr <<= 24-nBits;
  178. for (i=0; i<nBits/8; i++)
  179. {
  180. if(!bOverflow)
  181. {
  182. *pbDest = (BYTE) ((dwCurr & 0x00ff0000) >> 16);
  183. pbDest++;
  184. }
  185. dwCurr <<= 8;
  186. nWritten++;
  187. }
  188. }
  189. *pnDestLen = nWritten;
  190. if(bOverflow)
  191. {
  192. // if(pbDest != NULL)
  193. // ATLASSERT(FALSE);
  194. return FALSE;
  195. }
  196. return TRUE;
  197. }
  198. void ccClearErrorString()
  199. {
  200. szErrorMsg[0]='\0';
  201. }
  202. const char *ccGetErrStr()
  203. {
  204. return szErrorMsg;
  205. }
  206. void ccSetErrorString(const char *szFormat,...)
  207. {
  208. va_list arg;
  209. va_start(arg,szFormat);
  210. int nRet=_vsnprintf_s(szErrorMsg,
  211. sizeof(szErrorMsg),
  212. 1024,
  213. szFormat,
  214. arg);
  215. va_end(arg);
  216. if(0==nRet)
  217. szErrorMsg[0]=0;
  218. }
  219. DWORD SimpleSign(const BYTE *pBuf,DWORD nLen)
  220. {
  221. DWORD nRet(0);
  222. for(DWORD i=0;i<nLen;i++)
  223. nRet+=pBuf[i];
  224. return nRet;
  225. }
  226. void PrintfCryptError()
  227. {
  228. char Buffer[1024];
  229. ccSetErrorString("%s\n",ERR_error_string(ERR_get_error(),Buffer));
  230. }
  231. SmartBuffer ccHash(const BYTE *pInBuf,int nInSize)
  232. {
  233. SmartBuffer RetHash(20);
  234. if(SHA1(pInBuf,nInSize,RetHash.pBuf)==NULL)
  235. {
  236. PrintfCryptError();
  237. RetHash.Clear();
  238. }
  239. return RetHash;
  240. }
  241. SmartBuffer ccPublicDecryptStream(RSA *pPublicKey,const BYTE *pInBuf,int nLen,SmartBuffer &Signer)
  242. {
  243. int nRsaSize=RSA_size(pPublicKey);
  244. int nCryptDesLen=nLen-nRsaSize;
  245. if(nCryptDesLen<8 || nCryptDesLen%8!=0)
  246. {
  247. ccSetErrorString("The crypt stream is demaged\n");
  248. return SmartBuffer();
  249. }
  250. SmartBuffer OrgSign(nRsaSize);
  251. OrgSign.nLen=RSA_public_decrypt(nRsaSize,pInBuf+nLen-nRsaSize,OrgSign.pBuf,pPublicKey,RSA_PKCS1_PADDING);
  252. if(OrgSign.nLen==-1)
  253. {
  254. PrintfCryptError();
  255. return SmartBuffer();
  256. }
  257. short nSignerLen=*(short *)OrgSign.pBuf;
  258. if(nSignerLen!=(int)(OrgSign.nLen-sizeof(short)-sizeof(DES_cblock)))
  259. {
  260. ccSetErrorString("The Sign data is invalid\n");
  261. return SmartBuffer();
  262. }
  263. Signer.SetStr((char *)OrgSign.pBuf+sizeof(short));
  264. DES_cblock *pDesKey=(DES_cblock *)(OrgSign.pBuf+sizeof(short)+nSignerLen);
  265. SmartBuffer OrgBuf(nCryptDesLen);
  266. DES_cblock iv;
  267. memcpy(iv,cbc_iv,sizeof(cbc_iv));
  268. DES_key_schedule Key;
  269. DES_set_key_unchecked(pDesKey,&Key);
  270. DES_cbc_encrypt(pInBuf,OrgBuf.pBuf,nCryptDesLen,&Key,&iv,DES_DECRYPT);
  271. int RetBufLen=*(int *)OrgBuf.pBuf;
  272. if(RetBufLen>(int)(nCryptDesLen-sizeof(int)-sizeof(DWORD)) || RetBufLen<(int)(nCryptDesLen-sizeof(int)-sizeof(DWORD)-8))
  273. {
  274. ccSetErrorString("The OrgBuf is invalid len\n");
  275. return SmartBuffer();
  276. }
  277. SmartBuffer RetBuf(RetBufLen+1);
  278. RetBuf.nLen=RetBufLen;
  279. memcpy(RetBuf.pBuf,OrgBuf.pBuf+sizeof(int)+sizeof(DWORD),RetBufLen);
  280. DWORD OrgSimple=*(DWORD *)(OrgBuf.pBuf+sizeof(int));
  281. DWORD Simple=SimpleSign(RetBuf.pBuf,RetBufLen);
  282. if(Simple!=OrgSimple)
  283. {
  284. ccSetErrorString("The OrgBuf is demaged\n");
  285. return SmartBuffer();
  286. }
  287. return RetBuf;
  288. }
  289. RSA *ccD2I_RsaPublic(const BYTE *pBuf,int nLen)
  290. {
  291. RSA *pPublicKey=d2i_RSAPublicKey(NULL,&pBuf,nLen);
  292. if(pPublicKey==NULL)
  293. PrintfCryptError();
  294. return pPublicKey;
  295. }