packet.cpp 7.4 KB

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