packet.cpp 8.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400
  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. /*
  135. int sendto_ip_port (u32_t ip,int port,char * buf, int len,int flags)
  136. {
  137. return sendto_fd_ip_port(local_listen_fd,ip,port,buf,len,flags);
  138. }*/
  139. int send_fd (int fd,char * buf, int len,int flags)
  140. {
  141. return send(fd,buf,len,flags);
  142. }
  143. int my_send(const dest_t &dest,char *data,int len)
  144. {
  145. if(dest.cook)
  146. {
  147. do_cook(data,len);
  148. }
  149. switch(dest.type)
  150. {
  151. case type_fd_ip_port:
  152. {
  153. return sendto_fd_ip_port(dest.inner.fd,dest.inner.fd_ip_port.ip_port.ip,dest.inner.fd_ip_port.ip_port.port,data,len,0);
  154. break;
  155. }
  156. case type_fd64_ip_port:
  157. {
  158. if(!fd_manager.exist(dest.inner.fd64)) return -1;
  159. int fd=fd_manager.to_fd(dest.inner.fd64);
  160. return sendto_fd_ip_port(fd,dest.inner.fd64_ip_port.ip_port.ip,dest.inner.fd64_ip_port.ip_port.port,data,len,0);
  161. break;
  162. }
  163. case type_fd:
  164. {
  165. return send_fd(dest.inner.fd,data,len,0);
  166. break;
  167. }
  168. case type_write_fd:
  169. {
  170. return write(dest.inner.fd,data,len);
  171. break;
  172. }
  173. case type_fd64:
  174. {
  175. if(!fd_manager.exist(dest.inner.fd64)) return -1;
  176. int fd=fd_manager.to_fd(dest.inner.fd64);
  177. return send_fd(fd,data,len,0);
  178. break;
  179. }
  180. /*
  181. case type_fd64_ip_port_conv:
  182. {
  183. if(!fd_manager.exist(dest.inner.fd64)) return -1;
  184. int fd=fd_manager.to_fd(dest.inner.fd64);
  185. char *new_data;
  186. int new_len;
  187. put_conv(dest.conv,data,len,new_data,new_len);
  188. 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);
  189. break;
  190. }*/
  191. /*
  192. case type_fd64_conv:
  193. {
  194. char *new_data;
  195. int new_len;
  196. put_conv(dest.conv,data,len,new_data,new_len);
  197. if(!fd_manager.exist(dest.inner.fd64)) return -1;
  198. int fd=fd_manager.to_fd(dest.inner.fd64);
  199. return send_fd(fd,new_data,new_len,0);
  200. }*/
  201. /*
  202. case type_fd:
  203. {
  204. send_fd(dest.inner.fd,data,len,0);
  205. break;
  206. }*/
  207. default:
  208. assert(0==1);
  209. }
  210. return 0;
  211. }
  212. /*
  213. * this function comes from http://www.hackersdelight.org/hdcodetxt/crc.c.txt
  214. */
  215. unsigned int crc32h(unsigned char *message,int len) {
  216. assert(len>=0);
  217. int i, crc;
  218. unsigned int byte, c;
  219. const unsigned int g0 = 0xEDB88320, g1 = g0>>1,
  220. g2 = g0>>2, g3 = g0>>3, g4 = g0>>4, g5 = g0>>5,
  221. g6 = (g0>>6)^g0, g7 = ((g0>>6)^g0)>>1;
  222. i = 0;
  223. crc = 0xFFFFFFFF;
  224. while (i!=len) { // Get next byte.
  225. byte = message[i];
  226. crc = crc ^ byte;
  227. c = ((crc<<31>>31) & g7) ^ ((crc<<30>>31) & g6) ^
  228. ((crc<<29>>31) & g5) ^ ((crc<<28>>31) & g4) ^
  229. ((crc<<27>>31) & g3) ^ ((crc<<26>>31) & g2) ^
  230. ((crc<<25>>31) & g1) ^ ((crc<<24>>31) & g0);
  231. crc = ((unsigned)crc >> 8) ^ c;
  232. i = i + 1;
  233. }
  234. return ~crc;
  235. }
  236. int put_conv0(u32_t conv,const char * input,int len_in,char *&output,int &len_out)
  237. {
  238. assert(len_in>=0);
  239. static char buf[buf_len];
  240. output=buf;
  241. u32_t n_conv=htonl(conv);
  242. memcpy(output,&n_conv,sizeof(n_conv));
  243. memcpy(output+sizeof(n_conv),input,len_in);
  244. u32_t crc32=crc32h((unsigned char *)output,len_in+sizeof(crc32));
  245. u32_t crc32_n=htonl(crc32);
  246. len_out=len_in+(int)(sizeof(n_conv))+(int)sizeof(crc32_n);
  247. memcpy(output+len_in+(int)(sizeof(n_conv)),&crc32_n,sizeof(crc32_n));
  248. return 0;
  249. }
  250. int get_conv0(u32_t &conv,const char *input,int len_in,char *&output,int &len_out )
  251. {
  252. assert(len_in>=0);
  253. u32_t n_conv;
  254. memcpy(&n_conv,input,sizeof(n_conv));
  255. conv=ntohl(n_conv);
  256. output=(char *)input+sizeof(n_conv);
  257. u32_t crc32_n;
  258. len_out=len_in-(int)sizeof(n_conv)-(int)sizeof(crc32_n);
  259. if(len_out<0)
  260. {
  261. mylog(log_debug,"len_out<0\n");
  262. return -1;
  263. }
  264. memcpy(&crc32_n,input+len_in-(int)sizeof(crc32_n),sizeof(crc32_n));
  265. u32_t crc32=ntohl(crc32_n);
  266. if(crc32!=crc32h((unsigned char *)input,len_in-(int)sizeof(crc32_n)))
  267. {
  268. mylog(log_debug,"crc32 check failed\n");
  269. return -1;
  270. }
  271. return 0;
  272. }
  273. int put_crc32(char * s,int &len)
  274. {
  275. assert(len>=0);
  276. //if(len<0) return -1;
  277. u32_t crc32=crc32h((unsigned char *)s,len);
  278. write_u32(s+len,crc32);
  279. len+=sizeof(u32_t);
  280. return 0;
  281. }
  282. int do_cook(char * data,int &len)
  283. {
  284. put_crc32(data,len);
  285. if(!disable_obscure)do_obscure(data,len);
  286. if(!disable_xor)encrypt_0(data,len,key_string);
  287. return 0;
  288. }
  289. int de_cook(char * s,int &len)
  290. {
  291. if(!disable_xor)decrypt_0(s,len,key_string);
  292. if(!disable_obscure)
  293. {
  294. int ret=de_obscure(s,len);
  295. if(ret!=0)
  296. {
  297. mylog(log_debug,"de_obscure fail\n");
  298. return ret;
  299. }
  300. }
  301. int ret=rm_crc32(s,len);
  302. if(ret!=0)
  303. {
  304. mylog(log_debug,"rm_crc32 fail\n");
  305. return ret;
  306. }
  307. return 0;
  308. }
  309. int rm_crc32(char * s,int &len)
  310. {
  311. assert(len>=0);
  312. len-=sizeof(u32_t);
  313. if(len<0) return -1;
  314. u32_t crc32_in=read_u32(s+len);
  315. u32_t crc32=crc32h((unsigned char *)s,len);
  316. if(crc32!=crc32_in) return -1;
  317. return 0;
  318. }
  319. /*
  320. int do_obs()
  321. {
  322. }
  323. int de_obs()*/
  324. int put_conv(u32_t conv,const char * input,int len_in,char *&output,int &len_out)
  325. {
  326. static char buf[buf_len];
  327. output=buf;
  328. u32_t n_conv=htonl(conv);
  329. memcpy(output,&n_conv,sizeof(n_conv));
  330. memcpy(output+sizeof(n_conv),input,len_in);
  331. len_out=len_in+(int)(sizeof(n_conv));
  332. return 0;
  333. }
  334. int get_conv(u32_t &conv,const char *input,int len_in,char *&output,int &len_out )
  335. {
  336. u32_t n_conv;
  337. memcpy(&n_conv,input,sizeof(n_conv));
  338. conv=ntohl(n_conv);
  339. output=(char *)input+sizeof(n_conv);
  340. len_out=len_in-(int)sizeof(n_conv);
  341. if(len_out<0)
  342. {
  343. mylog(log_debug,"len_out<0\n");
  344. return -1;
  345. }
  346. return 0;
  347. }