packet.cpp 6.5 KB

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