packet.cpp 5.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253
  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. switch(dest.type)
  128. {
  129. case type_ip_port:
  130. {
  131. return sendto_ip_port(dest.inner.ip_port.ip,dest.inner.ip_port.port,data,len,0);
  132. break;
  133. }
  134. case type_ip_port_conv:
  135. {
  136. char *new_data;
  137. int new_len;
  138. put_conv(dest.conv,data,len,new_data,new_len);
  139. return sendto_ip_port(dest.inner.ip_port.ip,dest.inner.ip_port.port,new_data,new_len,0);
  140. break;
  141. }
  142. case type_fd64:
  143. {
  144. if(!fd_manager.exist(dest.inner.fd64)) return -1;
  145. int fd=fd_manager.to_fd(dest.inner.fd64);
  146. return send_fd(fd,data,len,0);
  147. break;
  148. }
  149. case type_fd64_conv:
  150. {
  151. char *new_data;
  152. int new_len;
  153. put_conv(dest.conv,data,len,new_data,new_len);
  154. if(!fd_manager.exist(dest.inner.fd64)) return -1;
  155. int fd=fd_manager.to_fd(dest.inner.fd64);
  156. return send_fd(fd,new_data,new_len,0);
  157. }
  158. /*
  159. case type_fd:
  160. {
  161. send_fd(dest.inner.fd,data,len,0);
  162. break;
  163. }*/
  164. default:
  165. assert(0==1);
  166. }
  167. return 0;
  168. }
  169. /*
  170. * this function comes from http://www.hackersdelight.org/hdcodetxt/crc.c.txt
  171. */
  172. unsigned int crc32h(unsigned char *message,int len) {
  173. int i, crc;
  174. unsigned int byte, c;
  175. const unsigned int g0 = 0xEDB88320, g1 = g0>>1,
  176. g2 = g0>>2, g3 = g0>>3, g4 = g0>>4, g5 = g0>>5,
  177. g6 = (g0>>6)^g0, g7 = ((g0>>6)^g0)>>1;
  178. i = 0;
  179. crc = 0xFFFFFFFF;
  180. while (i!=len) { // Get next byte.
  181. byte = message[i];
  182. crc = crc ^ byte;
  183. c = ((crc<<31>>31) & g7) ^ ((crc<<30>>31) & g6) ^
  184. ((crc<<29>>31) & g5) ^ ((crc<<28>>31) & g4) ^
  185. ((crc<<27>>31) & g3) ^ ((crc<<26>>31) & g2) ^
  186. ((crc<<25>>31) & g1) ^ ((crc<<24>>31) & g0);
  187. crc = ((unsigned)crc >> 8) ^ c;
  188. i = i + 1;
  189. }
  190. return ~crc;
  191. }
  192. int put_conv(u32_t conv,const char * input,int len_in,char *&output,int &len_out)
  193. {
  194. static char buf[buf_len];
  195. output=buf;
  196. u32_t n_conv=htonl(conv);
  197. memcpy(output,&n_conv,sizeof(n_conv));
  198. memcpy(output+sizeof(n_conv),input,len_in);
  199. u32_t crc32=crc32h((unsigned char *)output,len_in+sizeof(crc32));
  200. u32_t crc32_n=htonl(crc32);
  201. len_out=len_in+(int)(sizeof(n_conv))+(int)sizeof(crc32_n);
  202. memcpy(output+len_in+(int)(sizeof(n_conv)),&crc32_n,sizeof(crc32_n));
  203. return 0;
  204. }
  205. int get_conv(u32_t &conv,const char *input,int len_in,char *&output,int &len_out )
  206. {
  207. u32_t n_conv;
  208. memcpy(&n_conv,input,sizeof(n_conv));
  209. conv=ntohl(n_conv);
  210. output=(char *)input+sizeof(n_conv);
  211. u32_t crc32_n;
  212. len_out=len_in-(int)sizeof(n_conv)-(int)sizeof(crc32_n);
  213. if(len_out<0)
  214. {
  215. mylog(log_debug,"len_out<0\n");
  216. return -1;
  217. }
  218. memcpy(&crc32_n,input+len_in-(int)sizeof(crc32_n),sizeof(crc32_n));
  219. u32_t crc32=ntohl(crc32_n);
  220. if(crc32!=crc32h((unsigned char *)input,len_in-(int)sizeof(crc32_n)))
  221. {
  222. mylog(log_debug,"crc32 check failed\n");
  223. return -1;
  224. }
  225. return 0;
  226. }