1
0

packet.cpp 8.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411
  1. /*
  2. * packet.cpp
  3. *
  4. * Created on: Sep 15, 2017
  5. * Author: root
  6. */
  7. #include "common.h"
  8. #include "log.h"
  9. #include "packet.h"
  10. #include "misc.h"
  11. int iv_min=4;
  12. int iv_max=32;//< 256;
  13. u64_t packet_send_count=0;
  14. u64_t dup_packet_send_count=0;
  15. u64_t packet_recv_count=0;
  16. u64_t dup_packet_recv_count=0;
  17. typedef u64_t anti_replay_seq_t;
  18. int disable_replay_filter=0;
  19. int disable_obscure=0;
  20. int disable_xor=0;
  21. int random_drop=0;
  22. char key_string[1000]= "";
  23. //int local_listen_fd=-1;
  24. void encrypt_0(char * input,int &len,char *key)
  25. {
  26. int i,j;
  27. if(key[0]==0) return;
  28. for(i=0,j=0;i<len;i++,j++)
  29. {
  30. if(key[j]==0)j=0;
  31. input[i]^=key[j];
  32. }
  33. }
  34. void decrypt_0(char * input,int &len,char *key)
  35. {
  36. int i,j;
  37. if(key[0]==0) return;
  38. for(i=0,j=0;i<len;i++,j++)
  39. {
  40. if(key[j]==0)j=0;
  41. input[i]^=key[j];
  42. }
  43. }
  44. int do_obscure_old(const char * input, int in_len,char *output,int &out_len)
  45. {
  46. //memcpy(output,input,in_len);
  47. // out_len=in_len;
  48. //return 0;
  49. int i, j, k;
  50. if (in_len > 65535||in_len<0)
  51. return -1;
  52. int iv_len=iv_min+rand()%(iv_max-iv_min);
  53. get_fake_random_chars(output,iv_len);
  54. memcpy(output+iv_len,input,in_len);
  55. output[iv_len+in_len]=(uint8_t)iv_len;
  56. output[iv_len+in_len]^=output[0];
  57. output[iv_len+in_len]^=key_string[0];
  58. for(i=0,j=0,k=1;i<in_len;i++,j++,k++)
  59. {
  60. if(j==iv_len) j=0;
  61. if(key_string[k]==0)k=0;
  62. output[iv_len+i]^=output[j];
  63. output[iv_len+i]^=key_string[k];
  64. }
  65. out_len=iv_len+in_len+1;
  66. return 0;
  67. }
  68. int do_obscure(char * data,int &len)
  69. {
  70. assert(len>=0);
  71. assert(len<buf_len);
  72. int iv_len=random_between(iv_min,iv_max);
  73. get_fake_random_chars(data+len,iv_len);
  74. data[iv_len+len]=(uint8_t)iv_len;
  75. for(int i=0,j=0;i<len;i++,j++)
  76. {
  77. if(j==iv_len)j=0;
  78. data[i]^=data[len+j];
  79. }
  80. len=len+iv_len+1;
  81. return 0;
  82. }
  83. int de_obscure(char * data,int &len)
  84. {
  85. if(len<1) return -1;
  86. int iv_len=int ((uint8_t) data[len-1]);
  87. if(len<1+iv_len) return -1;
  88. len=len-1-iv_len;
  89. for(int i=0,j=0;i<len;i++,j++)
  90. {
  91. if(j==iv_len)j=0;
  92. data[i]^=data[len+j];
  93. }
  94. return 0;
  95. }
  96. int de_obscure_old(const char * input, int in_len,char *output,int &out_len)
  97. {
  98. //memcpy(output,input,in_len);
  99. //out_len=in_len;
  100. //return 0;
  101. int i, j, k;
  102. if (in_len > 65535||in_len<0)
  103. {
  104. mylog(log_debug,"in_len > 65535||in_len<0 , %d",in_len);
  105. return -1;
  106. }
  107. int iv_len= int ((uint8_t)(input[in_len-1]^input[0]^key_string[0]) );
  108. out_len=in_len-1-iv_len;
  109. if(out_len<0)
  110. {
  111. mylog(log_debug,"%d %d\n",in_len,out_len);
  112. return -1;
  113. }
  114. for(i=0,j=0,k=1;i<in_len;i++,j++,k++)
  115. {
  116. if(j==iv_len) j=0;
  117. if(key_string[k]==0)k=0;
  118. output[i]=input[iv_len+i]^input[j]^key_string[k];
  119. }
  120. dup_packet_recv_count++;
  121. return 0;
  122. }
  123. /*
  124. int sendto_fd_ip_port (int fd,u32_t ip,int port,char * buf, int len,int flags)
  125. {
  126. sockaddr_in tmp_sockaddr;
  127. memset(&tmp_sockaddr,0,sizeof(tmp_sockaddr));
  128. tmp_sockaddr.sin_family = AF_INET;
  129. tmp_sockaddr.sin_addr.s_addr = ip;
  130. tmp_sockaddr.sin_port = htons(uint16_t(port));
  131. return sendto(fd, buf,
  132. len , 0,
  133. (struct sockaddr *) &tmp_sockaddr,
  134. sizeof(tmp_sockaddr));
  135. }*/
  136. int sendto_fd_addr (int fd,address_t addr,char * buf, int len,int flags)
  137. {
  138. return sendto(fd, buf,
  139. len , 0,
  140. (struct sockaddr *) &addr.inner,
  141. addr.get_len());
  142. }
  143. /*
  144. int sendto_ip_port (u32_t ip,int port,char * buf, int len,int flags)
  145. {
  146. return sendto_fd_ip_port(local_listen_fd,ip,port,buf,len,flags);
  147. }*/
  148. int send_fd (int fd,char * buf, int len,int flags)
  149. {
  150. return send(fd,buf,len,flags);
  151. }
  152. int my_send(const dest_t &dest,char *data,int len)
  153. {
  154. if(dest.cook)
  155. {
  156. do_cook(data,len);
  157. }
  158. switch(dest.type)
  159. {
  160. case type_fd_addr:
  161. {
  162. return sendto_fd_addr(dest.inner.fd,dest.inner.fd_addr.addr,data,len,0);
  163. break;
  164. }
  165. case type_fd64_addr:
  166. {
  167. if(!fd_manager.exist(dest.inner.fd64)) return -1;
  168. int fd=fd_manager.to_fd(dest.inner.fd64);
  169. return sendto_fd_addr(fd,dest.inner.fd64_addr.addr,data,len,0);
  170. break;
  171. }
  172. case type_fd:
  173. {
  174. return send_fd(dest.inner.fd,data,len,0);
  175. break;
  176. }
  177. case type_write_fd:
  178. {
  179. return write(dest.inner.fd,data,len);
  180. break;
  181. }
  182. case type_fd64:
  183. {
  184. if(!fd_manager.exist(dest.inner.fd64)) return -1;
  185. int fd=fd_manager.to_fd(dest.inner.fd64);
  186. return send_fd(fd,data,len,0);
  187. break;
  188. }
  189. /*
  190. case type_fd64_ip_port_conv:
  191. {
  192. if(!fd_manager.exist(dest.inner.fd64)) return -1;
  193. int fd=fd_manager.to_fd(dest.inner.fd64);
  194. char *new_data;
  195. int new_len;
  196. put_conv(dest.conv,data,len,new_data,new_len);
  197. return sendto_fd_ip_port(fd,dest.inner.fd64_ip_port.ip_port.ip,dest.inner.fd64_ip_port.ip_port.port,new_data,new_len,0);
  198. break;
  199. }*/
  200. /*
  201. case type_fd64_conv:
  202. {
  203. char *new_data;
  204. int new_len;
  205. put_conv(dest.conv,data,len,new_data,new_len);
  206. if(!fd_manager.exist(dest.inner.fd64)) return -1;
  207. int fd=fd_manager.to_fd(dest.inner.fd64);
  208. return send_fd(fd,new_data,new_len,0);
  209. }*/
  210. /*
  211. case type_fd:
  212. {
  213. send_fd(dest.inner.fd,data,len,0);
  214. break;
  215. }*/
  216. default:
  217. assert(0==1);
  218. }
  219. return 0;
  220. }
  221. /*
  222. * this function comes from http://www.hackersdelight.org/hdcodetxt/crc.c.txt
  223. */
  224. unsigned int crc32h(unsigned char *message,int len) {
  225. assert(len>=0);
  226. int i, crc;
  227. unsigned int byte, c;
  228. const unsigned int g0 = 0xEDB88320, g1 = g0>>1,
  229. g2 = g0>>2, g3 = g0>>3, g4 = g0>>4, g5 = g0>>5,
  230. g6 = (g0>>6)^g0, g7 = ((g0>>6)^g0)>>1;
  231. i = 0;
  232. crc = 0xFFFFFFFF;
  233. while (i!=len) { // Get next byte.
  234. byte = message[i];
  235. crc = crc ^ byte;
  236. c = ((crc<<31>>31) & g7) ^ ((crc<<30>>31) & g6) ^
  237. ((crc<<29>>31) & g5) ^ ((crc<<28>>31) & g4) ^
  238. ((crc<<27>>31) & g3) ^ ((crc<<26>>31) & g2) ^
  239. ((crc<<25>>31) & g1) ^ ((crc<<24>>31) & g0);
  240. crc = ((unsigned)crc >> 8) ^ c;
  241. i = i + 1;
  242. }
  243. return ~crc;
  244. }
  245. int put_conv0(u32_t conv,const char * input,int len_in,char *&output,int &len_out)
  246. {
  247. assert(len_in>=0);
  248. static char buf[buf_len];
  249. output=buf;
  250. u32_t n_conv=htonl(conv);
  251. memcpy(output,&n_conv,sizeof(n_conv));
  252. memcpy(output+sizeof(n_conv),input,len_in);
  253. u32_t crc32=crc32h((unsigned char *)output,len_in+sizeof(crc32));
  254. u32_t crc32_n=htonl(crc32);
  255. len_out=len_in+(int)(sizeof(n_conv))+(int)sizeof(crc32_n);
  256. memcpy(output+len_in+(int)(sizeof(n_conv)),&crc32_n,sizeof(crc32_n));
  257. return 0;
  258. }
  259. int get_conv0(u32_t &conv,const char *input,int len_in,char *&output,int &len_out )
  260. {
  261. assert(len_in>=0);
  262. u32_t n_conv;
  263. memcpy(&n_conv,input,sizeof(n_conv));
  264. conv=ntohl(n_conv);
  265. output=(char *)input+sizeof(n_conv);
  266. u32_t crc32_n;
  267. len_out=len_in-(int)sizeof(n_conv)-(int)sizeof(crc32_n);
  268. if(len_out<0)
  269. {
  270. mylog(log_debug,"len_out<0\n");
  271. return -1;
  272. }
  273. memcpy(&crc32_n,input+len_in-(int)sizeof(crc32_n),sizeof(crc32_n));
  274. u32_t crc32=ntohl(crc32_n);
  275. if(crc32!=crc32h((unsigned char *)input,len_in-(int)sizeof(crc32_n)))
  276. {
  277. mylog(log_debug,"crc32 check failed\n");
  278. return -1;
  279. }
  280. return 0;
  281. }
  282. int put_crc32(char * s,int &len)
  283. {
  284. if(disable_checksum)return 0;
  285. assert(len>=0);
  286. //if(len<0) return -1;
  287. u32_t crc32=crc32h((unsigned char *)s,len);
  288. write_u32(s+len,crc32);
  289. len+=sizeof(u32_t);
  290. return 0;
  291. }
  292. int do_cook(char * data,int &len)
  293. {
  294. put_crc32(data,len);
  295. if(!disable_obscure)do_obscure(data,len);
  296. if(!disable_xor)encrypt_0(data,len,key_string);
  297. return 0;
  298. }
  299. int de_cook(char * s,int &len)
  300. {
  301. if(!disable_xor)decrypt_0(s,len,key_string);
  302. if(!disable_obscure)
  303. {
  304. int ret=de_obscure(s,len);
  305. if(ret!=0)
  306. {
  307. mylog(log_debug,"de_obscure fail\n");
  308. return ret;
  309. }
  310. }
  311. int ret=rm_crc32(s,len);
  312. if(ret!=0)
  313. {
  314. mylog(log_debug,"rm_crc32 fail\n");
  315. return ret;
  316. }
  317. return 0;
  318. }
  319. int rm_crc32(char * s,int &len)
  320. {
  321. if(disable_checksum)return 0;
  322. assert(len>=0);
  323. len-=sizeof(u32_t);
  324. if(len<0) return -1;
  325. u32_t crc32_in=read_u32(s+len);
  326. u32_t crc32=crc32h((unsigned char *)s,len);
  327. if(crc32!=crc32_in) return -1;
  328. return 0;
  329. }
  330. /*
  331. int do_obs()
  332. {
  333. }
  334. int de_obs()*/
  335. int put_conv(u32_t conv,const char * input,int len_in,char *&output,int &len_out)
  336. {
  337. static char buf[buf_len];
  338. output=buf;
  339. u32_t n_conv=htonl(conv);
  340. memcpy(output,&n_conv,sizeof(n_conv));
  341. memcpy(output+sizeof(n_conv),input,len_in);
  342. len_out=len_in+(int)(sizeof(n_conv));
  343. return 0;
  344. }
  345. int get_conv(u32_t &conv,const char *input,int len_in,char *&output,int &len_out )
  346. {
  347. u32_t n_conv;
  348. memcpy(&n_conv,input,sizeof(n_conv));
  349. conv=ntohl(n_conv);
  350. output=(char *)input+sizeof(n_conv);
  351. len_out=len_in-(int)sizeof(n_conv);
  352. if(len_out<0)
  353. {
  354. mylog(log_debug,"len_out<0\n");
  355. return -1;
  356. }
  357. return 0;
  358. }