packet.cpp 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190
  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. char key_string[1000]= "secret key";
  19. struct anti_replay_t
  20. {
  21. u64_t max_packet_received;
  22. u64_t replay_buffer[anti_replay_buff_size];
  23. unordered_set<u64_t> st;
  24. u32_t const_id;
  25. u32_t anti_replay_seq;
  26. int index;
  27. anti_replay_seq_t get_new_seq_for_send()
  28. {
  29. if(const_id==0) prepare();
  30. anti_replay_seq_t res=const_id;
  31. res<<=32u;
  32. anti_replay_seq++;
  33. res|=anti_replay_seq;
  34. const_id=0;
  35. return res;
  36. }
  37. void prepare()
  38. {
  39. anti_replay_seq=get_true_random_number();//random first seq
  40. const_id=get_true_random_number_nz();
  41. }
  42. anti_replay_t()
  43. {
  44. memset(replay_buffer,0,sizeof(replay_buffer));
  45. st.rehash(anti_replay_buff_size*10);
  46. max_packet_received=0;
  47. index=0;
  48. }
  49. int is_vaild(u64_t seq)
  50. {
  51. if(const_id==0) prepare();
  52. //if(disable_replay_filter) return 1;
  53. if(seq==0)
  54. {
  55. mylog(log_debug,"seq=0\n");
  56. return 0;
  57. }
  58. if(st.find(seq)!=st.end() )
  59. {
  60. mylog(log_trace,"seq %llx exist\n",seq);
  61. return 0;
  62. }
  63. if(replay_buffer[index]!=0)
  64. {
  65. assert(st.find(replay_buffer[index])!=st.end());
  66. st.erase(replay_buffer[index]);
  67. }
  68. replay_buffer[index]=seq;
  69. st.insert(seq);
  70. index++;
  71. if(index==int(anti_replay_buff_size)) index=0;
  72. return 1; //for complier check
  73. }
  74. }anti_replay;
  75. void encrypt_0(char * input,int &len,char *key)
  76. {
  77. int i,j;
  78. if(key[0]==0) return;
  79. for(i=0,j=0;i<len;i++,j++)
  80. {
  81. if(key[j]==0)j=0;
  82. input[i]^=key[j];
  83. }
  84. }
  85. void decrypt_0(char * input,int &len,char *key)
  86. {
  87. int i,j;
  88. if(key[0]==0) return;
  89. for(i=0,j=0;i<len;i++,j++)
  90. {
  91. if(key[j]==0)j=0;
  92. input[i]^=key[j];
  93. }
  94. }
  95. int add_seq(char * data,int &data_len )
  96. {
  97. if(data_len<0) return -1;
  98. anti_replay_seq_t seq=anti_replay.get_new_seq_for_send();
  99. seq=hton64(seq);
  100. memcpy(data+data_len,&seq,sizeof(seq));
  101. data_len+=sizeof(seq);
  102. return 0;
  103. }
  104. int remove_seq(char * data,int &data_len)
  105. {
  106. anti_replay_seq_t seq;
  107. if(data_len<int(sizeof(seq))) return -1;
  108. data_len-=sizeof(seq);
  109. memcpy(&seq,data+data_len,sizeof(seq));
  110. seq=ntoh64(seq);
  111. if(anti_replay.is_vaild(seq)==0)
  112. {
  113. if(disable_replay_filter==1) //todo inefficient code,why did i put it here???
  114. return 0;
  115. mylog(log_trace,"seq %llx dropped bc of replay-filter\n ",seq);
  116. return -1;
  117. }
  118. packet_recv_count++;
  119. return 0;
  120. }
  121. int do_obscure(const char * input, int in_len,char *output,int &out_len)
  122. {
  123. //memcpy(output,input,in_len);
  124. // out_len=in_len;
  125. //return 0;
  126. int i, j, k;
  127. if (in_len > 65535||in_len<0)
  128. return -1;
  129. int iv_len=iv_min+rand()%(iv_max-iv_min);
  130. get_true_random_chars(output,iv_len);
  131. memcpy(output+iv_len,input,in_len);
  132. output[iv_len+in_len]=(uint8_t)iv_len;
  133. output[iv_len+in_len]^=output[0];
  134. output[iv_len+in_len]^=key_string[0];
  135. for(i=0,j=0,k=1;i<in_len;i++,j++,k++)
  136. {
  137. if(j==iv_len) j=0;
  138. if(key_string[k]==0)k=0;
  139. output[iv_len+i]^=output[j];
  140. output[iv_len+i]^=key_string[k];
  141. }
  142. out_len=iv_len+in_len+1;
  143. return 0;
  144. }
  145. int de_obscure(const char * input, int in_len,char *output,int &out_len)
  146. {
  147. //memcpy(output,input,in_len);
  148. //out_len=in_len;
  149. //return 0;
  150. int i, j, k;
  151. if (in_len > 65535||in_len<0)
  152. {
  153. mylog(log_debug,"in_len > 65535||in_len<0 , %d",in_len);
  154. return -1;
  155. }
  156. int iv_len= int ((uint8_t)(input[in_len-1]^input[0]^key_string[0]) );
  157. out_len=in_len-1-iv_len;
  158. if(out_len<0)
  159. {
  160. mylog(log_debug,"%d %d\n",in_len,out_len);
  161. return -1;
  162. }
  163. for(i=0,j=0,k=1;i<in_len;i++,j++,k++)
  164. {
  165. if(j==iv_len) j=0;
  166. if(key_string[k]==0)k=0;
  167. output[i]=input[iv_len+i]^input[j]^key_string[k];
  168. }
  169. dup_packet_recv_count++;
  170. return 0;
  171. }