encrypt.cpp 11 KB

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