packet.cpp 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239
  1. /*
  2. * packet.cpp
  3. *
  4. * Created on: Sep 15, 2017
  5. * Author: root
  6. */
  7. #include "common.h"
  8. #include "log.h"
  9. int iv_min=2;
  10. int iv_max=16;//< 256;
  11. u64_t packet_send_count=0;
  12. u64_t dup_packet_send_count=0;
  13. u64_t packet_recv_count=0;
  14. u64_t dup_packet_recv_count=0;
  15. typedef u64_t anti_replay_seq_t;
  16. const u32_t anti_replay_buff_size=10000;
  17. int disable_replay_filter=0;
  18. int random_drop=0;
  19. char key_string[1000]= "secret key";
  20. struct anti_replay_t
  21. {
  22. u64_t max_packet_received;
  23. u64_t replay_buffer[anti_replay_buff_size];
  24. unordered_set<u64_t> st;
  25. u32_t const_id;
  26. u32_t anti_replay_seq;
  27. int index;
  28. anti_replay_seq_t get_new_seq_for_send()
  29. {
  30. if(const_id==0) prepare();
  31. anti_replay_seq_t res=const_id;
  32. res<<=32u;
  33. anti_replay_seq++;
  34. res|=anti_replay_seq;
  35. const_id=0;
  36. return res;
  37. }
  38. void prepare()
  39. {
  40. anti_replay_seq=get_true_random_number();//random first seq
  41. const_id=get_true_random_number_nz();
  42. }
  43. anti_replay_t()
  44. {
  45. memset(replay_buffer,0,sizeof(replay_buffer));
  46. st.rehash(anti_replay_buff_size*10);
  47. max_packet_received=0;
  48. index=0;
  49. }
  50. int is_vaild(u64_t seq)
  51. {
  52. if(const_id==0) prepare();
  53. //if(disable_replay_filter) return 1;
  54. if(seq==0)
  55. {
  56. mylog(log_debug,"seq=0\n");
  57. return 0;
  58. }
  59. if(st.find(seq)!=st.end() )
  60. {
  61. mylog(log_trace,"seq %llx exist\n",seq);
  62. return 0;
  63. }
  64. if(replay_buffer[index]!=0)
  65. {
  66. assert(st.find(replay_buffer[index])!=st.end());
  67. st.erase(replay_buffer[index]);
  68. }
  69. replay_buffer[index]=seq;
  70. st.insert(seq);
  71. index++;
  72. if(index==int(anti_replay_buff_size)) index=0;
  73. return 1; //for complier check
  74. }
  75. }anti_replay;
  76. void encrypt_0(char * input,int &len,char *key)
  77. {
  78. int i,j;
  79. if(key[0]==0) return;
  80. for(i=0,j=0;i<len;i++,j++)
  81. {
  82. if(key[j]==0)j=0;
  83. input[i]^=key[j];
  84. }
  85. }
  86. void decrypt_0(char * input,int &len,char *key)
  87. {
  88. int i,j;
  89. if(key[0]==0) return;
  90. for(i=0,j=0;i<len;i++,j++)
  91. {
  92. if(key[j]==0)j=0;
  93. input[i]^=key[j];
  94. }
  95. }
  96. int add_seq(char * data,int &data_len )
  97. {
  98. if(data_len<0) return -1;
  99. anti_replay_seq_t seq=anti_replay.get_new_seq_for_send();
  100. seq=hton64(seq);
  101. memcpy(data+data_len,&seq,sizeof(seq));
  102. data_len+=sizeof(seq);
  103. return 0;
  104. }
  105. int remove_seq(char * data,int &data_len)
  106. {
  107. anti_replay_seq_t seq;
  108. if(data_len<int(sizeof(seq))) return -1;
  109. data_len-=sizeof(seq);
  110. memcpy(&seq,data+data_len,sizeof(seq));
  111. seq=ntoh64(seq);
  112. if(anti_replay.is_vaild(seq)==0)
  113. {
  114. if(disable_replay_filter==1) //todo inefficient code,why did i put it here???
  115. return 0;
  116. mylog(log_trace,"seq %llx dropped bc of replay-filter\n ",seq);
  117. return -1;
  118. }
  119. packet_recv_count++;
  120. return 0;
  121. }
  122. int do_obscure(const char * input, int in_len,char *output,int &out_len)
  123. {
  124. //memcpy(output,input,in_len);
  125. // out_len=in_len;
  126. //return 0;
  127. int i, j, k;
  128. if (in_len > 65535||in_len<0)
  129. return -1;
  130. int iv_len=iv_min+rand()%(iv_max-iv_min);
  131. get_true_random_chars(output,iv_len);
  132. memcpy(output+iv_len,input,in_len);
  133. output[iv_len+in_len]=(uint8_t)iv_len;
  134. output[iv_len+in_len]^=output[0];
  135. output[iv_len+in_len]^=key_string[0];
  136. for(i=0,j=0,k=1;i<in_len;i++,j++,k++)
  137. {
  138. if(j==iv_len) j=0;
  139. if(key_string[k]==0)k=0;
  140. output[iv_len+i]^=output[j];
  141. output[iv_len+i]^=key_string[k];
  142. }
  143. out_len=iv_len+in_len+1;
  144. return 0;
  145. }
  146. int de_obscure(const char * input, int in_len,char *output,int &out_len)
  147. {
  148. //memcpy(output,input,in_len);
  149. //out_len=in_len;
  150. //return 0;
  151. int i, j, k;
  152. if (in_len > 65535||in_len<0)
  153. {
  154. mylog(log_debug,"in_len > 65535||in_len<0 , %d",in_len);
  155. return -1;
  156. }
  157. int iv_len= int ((uint8_t)(input[in_len-1]^input[0]^key_string[0]) );
  158. out_len=in_len-1-iv_len;
  159. if(out_len<0)
  160. {
  161. mylog(log_debug,"%d %d\n",in_len,out_len);
  162. return -1;
  163. }
  164. for(i=0,j=0,k=1;i<in_len;i++,j++,k++)
  165. {
  166. if(j==iv_len) j=0;
  167. if(key_string[k]==0)k=0;
  168. output[i]=input[iv_len+i]^input[j]^key_string[k];
  169. }
  170. dup_packet_recv_count++;
  171. return 0;
  172. }
  173. int sendto_u64 (int fd,char * buf, int len,int flags, u64_t u64)
  174. {
  175. if(is_server)
  176. {
  177. dup_packet_send_count++;
  178. }
  179. if(is_server&&random_drop!=0)
  180. {
  181. if(get_true_random_number()%10000<(u32_t)random_drop)
  182. {
  183. return 0;
  184. }
  185. }
  186. sockaddr_in tmp_sockaddr;
  187. memset(&tmp_sockaddr,0,sizeof(tmp_sockaddr));
  188. tmp_sockaddr.sin_family = AF_INET;
  189. tmp_sockaddr.sin_addr.s_addr = (u64 >> 32u);
  190. tmp_sockaddr.sin_port = htons(uint16_t((u64 << 32u) >> 32u));
  191. return sendto(fd, buf,
  192. len , 0,
  193. (struct sockaddr *) &tmp_sockaddr,
  194. sizeof(tmp_sockaddr));
  195. }
  196. int send_fd (int fd,char * buf, int len,int flags)
  197. {
  198. if(is_client)
  199. {
  200. dup_packet_send_count++;
  201. }
  202. if(is_client&&random_drop!=0)
  203. {
  204. if(get_true_random_number()%10000<(u32_t)random_drop)
  205. {
  206. return 0;
  207. }
  208. }
  209. return send(fd,buf,len,flags);
  210. }