packet.cpp 5.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282
  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. const u32_t anti_replay_buff_size=10000;
  18. int disable_replay_filter=0;
  19. int random_drop=0;
  20. char key_string[1000]= "secret key";
  21. int local_listen_fd=-1;
  22. struct anti_replay_t
  23. {
  24. u64_t max_packet_received;
  25. u64_t replay_buffer[anti_replay_buff_size];
  26. unordered_set<u64_t> st;
  27. u32_t const_id;
  28. u32_t anti_replay_seq;
  29. int index;
  30. anti_replay_seq_t get_new_seq_for_send()
  31. {
  32. if(const_id==0) prepare();
  33. anti_replay_seq_t res=const_id;
  34. res<<=32u;
  35. anti_replay_seq++;
  36. res|=anti_replay_seq;
  37. const_id=0;
  38. return res;
  39. }
  40. void prepare()
  41. {
  42. anti_replay_seq=get_true_random_number();//random first seq
  43. const_id=get_true_random_number_nz();
  44. }
  45. anti_replay_t()
  46. {
  47. memset(replay_buffer,0,sizeof(replay_buffer));
  48. st.rehash(anti_replay_buff_size*10);
  49. max_packet_received=0;
  50. index=0;
  51. }
  52. int is_vaild(u64_t seq)
  53. {
  54. if(const_id==0) prepare();
  55. //if(disable_replay_filter) return 1;
  56. if(seq==0)
  57. {
  58. mylog(log_debug,"seq=0\n");
  59. return 0;
  60. }
  61. if(st.find(seq)!=st.end() )
  62. {
  63. mylog(log_trace,"seq %llx exist\n",seq);
  64. return 0;
  65. }
  66. if(replay_buffer[index]!=0)
  67. {
  68. assert(st.find(replay_buffer[index])!=st.end());
  69. st.erase(replay_buffer[index]);
  70. }
  71. replay_buffer[index]=seq;
  72. st.insert(seq);
  73. index++;
  74. if(index==int(anti_replay_buff_size)) index=0;
  75. return 1; //for complier check
  76. }
  77. }anti_replay;
  78. void encrypt_0(char * input,int &len,char *key)
  79. {
  80. int i,j;
  81. if(key[0]==0) return;
  82. for(i=0,j=0;i<len;i++,j++)
  83. {
  84. if(key[j]==0)j=0;
  85. input[i]^=key[j];
  86. }
  87. }
  88. void decrypt_0(char * input,int &len,char *key)
  89. {
  90. int i,j;
  91. if(key[0]==0) return;
  92. for(i=0,j=0;i<len;i++,j++)
  93. {
  94. if(key[j]==0)j=0;
  95. input[i]^=key[j];
  96. }
  97. }
  98. int add_seq(char * data,int &data_len )
  99. {
  100. if(data_len<0) return -1;
  101. anti_replay_seq_t seq=anti_replay.get_new_seq_for_send();
  102. seq=hton64(seq);
  103. memcpy(data+data_len,&seq,sizeof(seq));
  104. data_len+=sizeof(seq);
  105. return 0;
  106. }
  107. int remove_seq(char * data,int &data_len)
  108. {
  109. anti_replay_seq_t seq;
  110. if(data_len<int(sizeof(seq))) return -1;
  111. data_len-=sizeof(seq);
  112. memcpy(&seq,data+data_len,sizeof(seq));
  113. seq=ntoh64(seq);
  114. if(anti_replay.is_vaild(seq)==0)
  115. {
  116. if(disable_replay_filter==1) //todo inefficient code,why did i put it here???
  117. return 0;
  118. mylog(log_trace,"seq %llx dropped bc of replay-filter\n ",seq);
  119. return -1;
  120. }
  121. packet_recv_count++;
  122. return 0;
  123. }
  124. int do_obscure(const char * input, int in_len,char *output,int &out_len)
  125. {
  126. //memcpy(output,input,in_len);
  127. // out_len=in_len;
  128. //return 0;
  129. int i, j, k;
  130. if (in_len > 65535||in_len<0)
  131. return -1;
  132. int iv_len=iv_min+rand()%(iv_max-iv_min);
  133. get_true_random_chars(output,iv_len);
  134. memcpy(output+iv_len,input,in_len);
  135. output[iv_len+in_len]=(uint8_t)iv_len;
  136. output[iv_len+in_len]^=output[0];
  137. output[iv_len+in_len]^=key_string[0];
  138. for(i=0,j=0,k=1;i<in_len;i++,j++,k++)
  139. {
  140. if(j==iv_len) j=0;
  141. if(key_string[k]==0)k=0;
  142. output[iv_len+i]^=output[j];
  143. output[iv_len+i]^=key_string[k];
  144. }
  145. out_len=iv_len+in_len+1;
  146. return 0;
  147. }
  148. int de_obscure(const char * input, int in_len,char *output,int &out_len)
  149. {
  150. //memcpy(output,input,in_len);
  151. //out_len=in_len;
  152. //return 0;
  153. int i, j, k;
  154. if (in_len > 65535||in_len<0)
  155. {
  156. mylog(log_debug,"in_len > 65535||in_len<0 , %d",in_len);
  157. return -1;
  158. }
  159. int iv_len= int ((uint8_t)(input[in_len-1]^input[0]^key_string[0]) );
  160. out_len=in_len-1-iv_len;
  161. if(out_len<0)
  162. {
  163. mylog(log_debug,"%d %d\n",in_len,out_len);
  164. return -1;
  165. }
  166. for(i=0,j=0,k=1;i<in_len;i++,j++,k++)
  167. {
  168. if(j==iv_len) j=0;
  169. if(key_string[k]==0)k=0;
  170. output[i]=input[iv_len+i]^input[j]^key_string[k];
  171. }
  172. dup_packet_recv_count++;
  173. return 0;
  174. }
  175. int sendto_fd_ip_port (int fd,u32_t ip,int port,char * buf, int len,int flags)
  176. {
  177. sockaddr_in tmp_sockaddr;
  178. memset(&tmp_sockaddr,0,sizeof(tmp_sockaddr));
  179. tmp_sockaddr.sin_family = AF_INET;
  180. tmp_sockaddr.sin_addr.s_addr = ip;
  181. tmp_sockaddr.sin_port = htons(uint16_t(port));
  182. return sendto(fd, buf,
  183. len , 0,
  184. (struct sockaddr *) &tmp_sockaddr,
  185. sizeof(tmp_sockaddr));
  186. }
  187. int sendto_ip_port (u32_t ip,int port,char * buf, int len,int flags)
  188. {
  189. return sendto_fd_ip_port(local_listen_fd,ip,port,buf,len,flags);
  190. }
  191. int send_fd (int fd,char * buf, int len,int flags)
  192. {
  193. /*
  194. if(is_client)
  195. {
  196. dup_packet_send_count++;
  197. }
  198. if(is_client&&random_drop!=0)
  199. {
  200. if(get_true_random_number()%10000<(u32_t)random_drop)
  201. {
  202. return 0;
  203. }
  204. }*/
  205. return send(fd,buf,len,flags);
  206. }
  207. //enum delay_type_t {none=0,enum_sendto_u64,enum_send_fd,client_to_local,client_to_remote,server_to_local,server_to_remote};
  208. int my_send(dest_t &dest,char *data,int len)
  209. {
  210. switch(dest.type)
  211. {
  212. case type_ip_port:
  213. {
  214. return sendto_ip_port(dest.inner.ip_port.ip,dest.inner.ip_port.port,data,len,0);
  215. break;
  216. }
  217. case type_fd64:
  218. {
  219. if(!fd_manager.fd64_exist(dest.inner.fd64)) return -1;
  220. int fd=fd_manager.fd64_to_fd(dest.inner.fd64);
  221. return send_fd(fd,data,len,0);
  222. break;
  223. }
  224. case type_fd:
  225. {
  226. send_fd(dest.inner.fd,data,len,0);
  227. break;
  228. }
  229. default:
  230. assert(0==1);
  231. }
  232. return 0;
  233. }
  234. int put_conv(u32_t conv,char * input,int len_in,char *&output,int &len_out)
  235. {
  236. static char buf[buf_len];
  237. output=buf;
  238. u32_t n_conv=htonl(conv);
  239. memcpy(output,&n_conv,sizeof(n_conv));
  240. memcpy(output+sizeof(n_conv),input,len_in);
  241. len_out=len_in+(int)(sizeof(n_conv));
  242. return 0;
  243. }
  244. int get_conv(u32_t &conv,char *input,int len_in,char *&output,int &len_out )
  245. {
  246. u32_t n_conv;
  247. memcpy(&n_conv,input,sizeof(n_conv));
  248. conv=ntohl(n_conv);
  249. output=input+sizeof(n_conv);
  250. len_out=len_in-(int)(sizeof(n_conv));
  251. if(len_out<0) return -1;
  252. return 0;
  253. }