encrypt.cpp 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432
  1. #include "lib/aes.h"
  2. #include "lib/md5.h"
  3. #include <string.h>
  4. #include <stdint.h>
  5. #include <stdlib.h>
  6. #include <stdio.h>
  7. #include "encrypt.h"
  8. #include "common.h"
  9. #include "log.h"
  10. //static uint64_t seq=1;
  11. static int8_t zero_iv[]={0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0};//this prog use zero iv,you should make sure first block of data contains a random/nonce data
  12. /****
  13. * important!
  14. * why zero iv + nonce first data block is secure?
  15. * https://crypto.stackexchange.com/questions/5421/using-cbc-with-a-fixed-iv-and-a-random-first-plaintext-block
  16. ****/
  17. unordered_map<int, const char *> auth_mode_tostring = {{auth_none, "none"}, {auth_md5, "md5"}, {auth_crc32, "crc32"},{auth_simple,"simple"}};
  18. unordered_map<int, const char *> cipher_mode_tostring={{cipher_none,"none"},{cipher_aes128cbc,"aes128cbc"},{cipher_xor,"xor"}};
  19. auth_mode_t auth_mode=auth_crc32;
  20. cipher_mode_t cipher_mode=cipher_aes128cbc;
  21. /*
  22. * this function comes from http://www.hackersdelight.org/hdcodetxt/crc.c.txt
  23. */
  24. unsigned int crc32h(unsigned char *message,int len) {
  25. int i, crc;
  26. unsigned int byte, c;
  27. const unsigned int g0 = 0xEDB88320, g1 = g0>>1,
  28. g2 = g0>>2, g3 = g0>>3, g4 = g0>>4, g5 = g0>>5,
  29. g6 = (g0>>6)^g0, g7 = ((g0>>6)^g0)>>1;
  30. i = 0;
  31. crc = 0xFFFFFFFF;
  32. while (i!=len) { // Get next byte.
  33. byte = message[i];
  34. crc = crc ^ byte;
  35. c = ((crc<<31>>31) & g7) ^ ((crc<<30>>31) & g6) ^
  36. ((crc<<29>>31) & g5) ^ ((crc<<28>>31) & g4) ^
  37. ((crc<<27>>31) & g3) ^ ((crc<<26>>31) & g2) ^
  38. ((crc<<25>>31) & g1) ^ ((crc<<24>>31) & g0);
  39. crc = ((unsigned)crc >> 8) ^ c;
  40. i = i + 1;
  41. }
  42. return ~crc;
  43. }
  44. /*
  45. void sum(const unsigned char *data,int len,unsigned char* res) {
  46. memset(res,0,sizeof(int));
  47. for(int i=0,j=0;i<len;i++,j++)
  48. {
  49. if(j==4) j=0;
  50. res[j]+=data[i];
  51. }
  52. return ;
  53. }*/
  54. void simple_hash(unsigned char *str,int len,unsigned char res[8]) //djb2+ sdbm
  55. {
  56. u32_t hash = 5381;
  57. u32_t hash2 = 0;
  58. int c;
  59. int i=0;
  60. while(c = *str++,i++!=len)
  61. {
  62. // hash = ((hash << 5) + hash) + c; /* hash * 33 + c */
  63. hash = ((hash << 5) + hash)^c; /* (hash * 33) ^ c */
  64. hash2 = c + (hash2 << 6) + (hash2 << 16) - hash2;
  65. }
  66. hash=htonl(hash);
  67. hash2=htonl(hash2);
  68. memcpy(res,&hash,sizeof(hash));
  69. memcpy(res+sizeof(hash),&hash2,sizeof(hash2));
  70. }
  71. int auth_md5_cal(const char *data,char * output,int &len)
  72. {
  73. memcpy(output,data,len);//TODO inefficient code
  74. md5((unsigned char *)output,len,(unsigned char *)(output+len));
  75. len+=16;
  76. return 0;
  77. }
  78. int auth_crc32_cal(const char *data,char * output,int &len)
  79. {
  80. memcpy(output,data,len);//TODO inefficient code
  81. unsigned int ret=crc32h((unsigned char *)output,len);
  82. unsigned int ret_n=htonl(ret);
  83. memcpy(output+len,&ret_n,sizeof(unsigned int));
  84. len+=sizeof(unsigned int);
  85. return 0;
  86. }
  87. int auth_simple_cal(const char *data,char * output,int &len)
  88. {
  89. //char res[4];
  90. memcpy(output,data,len);//TODO inefficient code
  91. simple_hash((unsigned char *)output,len,(unsigned char *)(output+len));
  92. len+=8;
  93. return 0;
  94. }
  95. int auth_simple_verify(const char *data,int &len)
  96. {
  97. if(len<8) return -1;
  98. unsigned char res[8];
  99. len-=8;
  100. simple_hash((unsigned char *)data,len,res);
  101. if(memcmp(res,data+len,8)!=0)
  102. return -1;
  103. return 0;
  104. }
  105. int auth_none_cal(const char *data,char * output,int &len)
  106. {
  107. memcpy(output,data,len);
  108. return 0;
  109. }
  110. int auth_md5_verify(const char *data,int &len)
  111. {
  112. if(len<16)
  113. {
  114. mylog(log_trace,"auth_md5_verify len<16\n");
  115. return -1;
  116. }
  117. char md5_res[16];
  118. md5((unsigned char *)data,len-16,(unsigned char *)md5_res);
  119. if(memcmp(md5_res,data+len-16,16)!=0)
  120. {
  121. mylog(log_trace,"auth_md5_verify md5 check failed\n");
  122. return -2;
  123. }
  124. len-=16;
  125. return 0;
  126. }
  127. int auth_none_verify(const char *data,int &len)
  128. {
  129. return 0;
  130. }
  131. int cipher_xor_encrypt(const char * data, char *output,int &len, char *key) {
  132. int i, j;
  133. for (i = 0, j = 0; i < len; i++, j++) {
  134. if(j==16) j=0;
  135. output[i] = data[i]^key[j];
  136. }
  137. return 0;
  138. }
  139. int cipher_xor_decrypt(const char * data, char *output,int &len, char *key) {
  140. int i, j;
  141. //char tmp[buf_len];
  142. //len=len/16*16+1;
  143. //AES128_CBC_decrypt_buffer((uint8_t *)tmp, (uint8_t *)input, len, (uint8_t *)key, (uint8_t *)iv);
  144. //for(i=0;i<len;i++)
  145. //input[i]=tmp[i];
  146. for (i = 0, j = 0; i < len; i++, j++) {
  147. if(j==16) j=0;
  148. output[i] = data[i]^key[j];
  149. }
  150. return 0;
  151. }
  152. int padding(char *data ,int &data_len,int padding_num)
  153. {
  154. int old_len=data_len;
  155. data_len+=1;
  156. if(data_len%padding_num!=0)
  157. {
  158. data_len= (data_len/padding_num)*padding_num+padding_num;
  159. }
  160. data[data_len-1]= (data_len-old_len);
  161. return 0;
  162. }
  163. int de_padding(const char *data ,int &data_len,int padding_num)
  164. {
  165. if((uint8_t)data[data_len-1] >padding_num) return -1;
  166. data_len-=(uint8_t)data[data_len-1];
  167. if(data_len<0)
  168. {
  169. return -1;
  170. }
  171. return 0;
  172. }
  173. int cipher_aes128cbc_encrypt(const char *data,char *output,int &len,char * key)
  174. {
  175. char buf[buf_len];
  176. memcpy(buf,data,len);//TODO inefficient code
  177. /*
  178. int ori_len=len;
  179. len+=2;//length
  180. if(len%16!=0)
  181. {
  182. len= (len/16)*16+16;
  183. }
  184. //if(len>max_data_len) return -1;
  185. buf[len-2]= (unsigned char)( (uint16_t(ori_len))>>8);
  186. buf[len-1]=(unsigned char)( ((uint16_t(ori_len))<<8)>>8) ;*/
  187. if(padding(buf,len,16)<0) return -1;
  188. AES_CBC_encrypt_buffer((unsigned char *)output,(unsigned char *)buf,len,(unsigned char *)key,(unsigned char *)zero_iv);
  189. return 0;
  190. }
  191. int auth_crc32_verify(const char *data,int &len)
  192. {
  193. if(len<int(sizeof(unsigned int)))
  194. {
  195. mylog(log_debug,"auth_crc32_verify len<%d\n",int(sizeof(unsigned int)));
  196. return -1;
  197. }
  198. unsigned int ret=crc32h((unsigned char *)data,len-sizeof(unsigned int));
  199. unsigned int ret_n=htonl(ret);
  200. if(memcmp(data+len-sizeof(unsigned int),&ret_n,sizeof(unsigned int))!=0)
  201. {
  202. mylog(log_debug,"auth_crc32_verify memcmp fail\n");
  203. return -1;
  204. }
  205. len-=sizeof(unsigned int);
  206. return 0;
  207. }
  208. int cipher_none_encrypt(const char *data,char *output,int &len,char * key)
  209. {
  210. memcpy(output,data,len);
  211. return 0;
  212. }
  213. int cipher_aes128cbc_decrypt(const char *data,char *output,int &len,char * key)
  214. {
  215. if(len%16 !=0) {mylog(log_debug,"len%%16!=0\n");return -1;}
  216. //if(len<0) {mylog(log_debug,"len <0\n");return -1;}
  217. AES_CBC_decrypt_buffer((unsigned char *)output,(unsigned char *)data,len,(unsigned char *)key,(unsigned char *)zero_iv);
  218. if(de_padding(output,len,16)<0) return -1;
  219. return 0;
  220. }
  221. int cipher_none_decrypt(const char *data,char *output,int &len,char * key)
  222. {
  223. memcpy(output,data,len);
  224. return 0;
  225. }
  226. int auth_cal(const char *data,char * output,int &len)
  227. {
  228. mylog(log_trace,"auth:%d\n",auth_mode);
  229. switch(auth_mode)
  230. {
  231. case auth_crc32:return auth_crc32_cal(data, output, len);
  232. case auth_md5:return auth_md5_cal(data, output, len);
  233. case auth_simple:return auth_simple_cal(data, output, len);
  234. case auth_none:return auth_none_cal(data, output, len);
  235. default: return auth_md5_cal(data,output,len);//default
  236. }
  237. }
  238. int auth_verify(const char *data,int &len)
  239. {
  240. mylog(log_trace,"auth:%d\n",auth_mode);
  241. switch(auth_mode)
  242. {
  243. case auth_crc32:return auth_crc32_verify(data, len);
  244. case auth_md5:return auth_md5_verify(data, len);
  245. case auth_simple:return auth_simple_verify(data, len);
  246. case auth_none:return auth_none_verify(data, len);
  247. default: return auth_md5_verify(data,len);//default
  248. }
  249. }
  250. int cipher_encrypt(const char *data,char *output,int &len,char * key)
  251. {
  252. mylog(log_trace,"cipher:%d\n",cipher_mode);
  253. switch(cipher_mode)
  254. {
  255. case cipher_aes128cbc:return cipher_aes128cbc_encrypt(data,output,len, key);
  256. case cipher_xor:return cipher_xor_encrypt(data,output,len, key);
  257. case cipher_none:return cipher_none_encrypt(data,output,len, key);
  258. default:return cipher_aes128cbc_encrypt(data,output,len, key);
  259. }
  260. }
  261. int cipher_decrypt(const char *data,char *output,int &len,char * key)
  262. {
  263. mylog(log_trace,"cipher:%d\n",cipher_mode);
  264. switch(cipher_mode)
  265. {
  266. case cipher_aes128cbc:return cipher_aes128cbc_decrypt(data,output,len, key);
  267. case cipher_xor:return cipher_xor_decrypt(data,output,len, key);
  268. case cipher_none:return cipher_none_decrypt(data,output,len, key);
  269. default: return cipher_aes128cbc_decrypt(data,output,len,key);
  270. }
  271. }
  272. int my_encrypt(const char *data,char *output,int &len,char * key)
  273. {
  274. if(len<0) {mylog(log_trace,"len<0");return -1;}
  275. if(len>max_data_len) {mylog(log_warn,"len>max_data_len");return -1;}
  276. char buf[buf_len];
  277. char buf2[buf_len];
  278. memcpy(buf,data,len);
  279. if(auth_cal(buf,buf2,len)!=0) {mylog(log_debug,"auth_cal failed ");return -1;}
  280. if(cipher_encrypt(buf2,output,len,key) !=0) {mylog(log_debug,"cipher_encrypt failed ");return -1;}
  281. return 0;
  282. }
  283. int my_decrypt(const char *data,char *output,int &len,char * key)
  284. {
  285. if(len<0) return -1;
  286. if(len>max_data_len) {mylog(log_warn,"len>max_data_len");return -1;}
  287. if(cipher_decrypt(data,output,len,key) !=0) {mylog(log_debug,"cipher_decrypt failed \n"); return -1;}
  288. if(auth_verify(output,len)!=0) {mylog(log_debug,"auth_verify failed\n");return -1;}
  289. return 0;
  290. }
  291. int my_encrypt_old(const char *data0,char *output,int &len,char * key)
  292. {
  293. static const int disable_all=0;
  294. static const int disable_aes=0;
  295. char data[buf_len];
  296. memcpy(data,data0,len);
  297. if(disable_all)
  298. {
  299. memcpy(output,data,len);
  300. return 0;
  301. }
  302. int ori_len=len;
  303. len=len+16;//md5
  304. len+=2;//length
  305. if(len%16!=0)
  306. {
  307. len= (len/16)*16+16;
  308. }
  309. if(len>max_data_len) return -1;
  310. data[len-16-2]= (unsigned char)( (uint16_t(ori_len))>>8);
  311. data[len-16-1]=(unsigned char)( ((uint16_t(ori_len))<<8)>>8) ;
  312. //printf("%d %d\n",data[len-16-2],data[len-16-1]);
  313. md5((unsigned char *)data,len-16,(unsigned char *)(data+len-16));
  314. if(disable_aes)
  315. {
  316. memcpy(output,data,len);
  317. }
  318. else
  319. {
  320. AES_CBC_encrypt_buffer((unsigned char *)output,(unsigned char *)data,len,(unsigned char *)key,(unsigned char *)zero_iv);
  321. //it doesnt allow over lap
  322. }
  323. return 0;
  324. }
  325. int my_decrypt_old(const char *data0,char *output,int &len,char * key)
  326. {
  327. static const int disable_all=0;
  328. static const int disable_aes=0;
  329. char data[buf_len];
  330. memcpy(data,data0,len);
  331. if(disable_all)
  332. {
  333. memcpy(output,data,len);
  334. return 0;
  335. }
  336. uint8_t md5_res[16];
  337. if(len>max_data_len) return -1;
  338. if(len<32) return -1;
  339. if(len%16 !=0) return -1;
  340. if(disable_aes)
  341. {
  342. memcpy(output,data,len);
  343. }
  344. else
  345. {
  346. AES_CBC_decrypt_buffer((unsigned char *)output,(unsigned char *)data,len,(unsigned char *)key,(unsigned char *)zero_iv);
  347. }
  348. //printf("%d %d\n",data[len-16-2],data[len-16-1]);
  349. //printf("<<%d>>",len);
  350. md5((unsigned char *)output,len-16,(unsigned char *)md5_res);
  351. if(memcmp(output+len-16,md5_res,16)!=0)
  352. {
  353. return -2;
  354. }
  355. len=((unsigned char)output[len-16-2])*256u+((unsigned char)output[len-16-1]); //this may be broken because of sign
  356. return 0;
  357. }
  358. int my_encrypt_pesudo_header(uint8_t *data,uint8_t *output,int &len,uint8_t * key,uint8_t *header,int hlen)
  359. {
  360. return 0;
  361. }
  362. int my_decrypt_pesudo_header(uint8_t *data,uint8_t *output,int &len,uint8_t * key,uint8_t *header,int hlen)
  363. {
  364. return 0;
  365. }