packet.cpp 9.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338
  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. #include "misc.h"
  11. #include "crc32/Crc32.h"
  12. int iv_min = 4;
  13. int iv_max = 32; //< 256;
  14. u64_t packet_send_count = 0;
  15. u64_t dup_packet_send_count = 0;
  16. u64_t packet_recv_count = 0;
  17. u64_t dup_packet_recv_count = 0;
  18. typedef u64_t anti_replay_seq_t;
  19. int disable_replay_filter = 0;
  20. int disable_obscure = 0;
  21. int disable_xor = 0;
  22. int random_drop = 0;
  23. char key_string[1000] = "";
  24. // int local_listen_fd=-1;
  25. void encrypt_0(char *input, int &len, char *key) {
  26. int i, j;
  27. if (key[0] == 0) return;
  28. for (i = 0, j = 0; i < len; i++, j++) {
  29. if (key[j] == 0) j = 0;
  30. input[i] ^= key[j];
  31. }
  32. }
  33. void decrypt_0(char *input, int &len, char *key) {
  34. int i, j;
  35. if (key[0] == 0) return;
  36. for (i = 0, j = 0; i < len; i++, j++) {
  37. if (key[j] == 0) j = 0;
  38. input[i] ^= key[j];
  39. }
  40. }
  41. int do_obscure_old(const char *input, int in_len, char *output, int &out_len) {
  42. // memcpy(output,input,in_len);
  43. // out_len=in_len;
  44. // return 0;
  45. int i, j, k;
  46. if (in_len > 65535 || in_len < 0)
  47. return -1;
  48. int iv_len = iv_min + rand() % (iv_max - iv_min);
  49. get_fake_random_chars(output, iv_len);
  50. memcpy(output + iv_len, input, in_len);
  51. output[iv_len + in_len] = (uint8_t)iv_len;
  52. output[iv_len + in_len] ^= output[0];
  53. output[iv_len + in_len] ^= key_string[0];
  54. for (i = 0, j = 0, k = 1; i < in_len; i++, j++, k++) {
  55. if (j == iv_len) j = 0;
  56. if (key_string[k] == 0) k = 0;
  57. output[iv_len + i] ^= output[j];
  58. output[iv_len + i] ^= key_string[k];
  59. }
  60. out_len = iv_len + in_len + 1;
  61. return 0;
  62. }
  63. int do_obscure(char *data, int &len) {
  64. assert(len >= 0);
  65. assert(len < buf_len);
  66. int iv_len = random_between(iv_min, iv_max);
  67. get_fake_random_chars(data + len, iv_len);
  68. data[iv_len + len] = (uint8_t)iv_len;
  69. for (int i = 0, j = 0; i < len; i++, j++) {
  70. if (j == iv_len) j = 0;
  71. data[i] ^= data[len + j];
  72. }
  73. len = len + iv_len + 1;
  74. return 0;
  75. }
  76. int de_obscure(char *data, int &len) {
  77. if (len < 1) return -1;
  78. int iv_len = int((uint8_t)data[len - 1]);
  79. if (len < 1 + iv_len) return -1;
  80. len = len - 1 - iv_len;
  81. for (int i = 0, j = 0; i < len; i++, j++) {
  82. if (j == iv_len) j = 0;
  83. data[i] ^= data[len + j];
  84. }
  85. return 0;
  86. }
  87. int de_obscure_old(const char *input, int in_len, char *output, int &out_len) {
  88. // memcpy(output,input,in_len);
  89. // out_len=in_len;
  90. // return 0;
  91. int i, j, k;
  92. if (in_len > 65535 || in_len < 0) {
  93. mylog(log_debug, "in_len > 65535||in_len<0 , %d", in_len);
  94. return -1;
  95. }
  96. int iv_len = int((uint8_t)(input[in_len - 1] ^ input[0] ^ key_string[0]));
  97. out_len = in_len - 1 - iv_len;
  98. if (out_len < 0) {
  99. mylog(log_debug, "%d %d\n", in_len, out_len);
  100. return -1;
  101. }
  102. for (i = 0, j = 0, k = 1; i < in_len; i++, j++, k++) {
  103. if (j == iv_len) j = 0;
  104. if (key_string[k] == 0) k = 0;
  105. output[i] = input[iv_len + i] ^ input[j] ^ key_string[k];
  106. }
  107. dup_packet_recv_count++;
  108. return 0;
  109. }
  110. /*
  111. int sendto_fd_ip_port (int fd,u32_t ip,int port,char * buf, int len,int flags)
  112. {
  113. sockaddr_in tmp_sockaddr;
  114. memset(&tmp_sockaddr,0,sizeof(tmp_sockaddr));
  115. tmp_sockaddr.sin_family = AF_INET;
  116. tmp_sockaddr.sin_addr.s_addr = ip;
  117. tmp_sockaddr.sin_port = htons(uint16_t(port));
  118. return sendto(fd, buf,
  119. len , 0,
  120. (struct sockaddr *) &tmp_sockaddr,
  121. sizeof(tmp_sockaddr));
  122. }*/
  123. int sendto_fd_addr(int fd, address_t addr, char *buf, int len, int flags) {
  124. return sendto(fd, buf,
  125. len, 0,
  126. (struct sockaddr *)&addr.inner,
  127. addr.get_len());
  128. }
  129. /*
  130. int sendto_ip_port (u32_t ip,int port,char * buf, int len,int flags)
  131. {
  132. return sendto_fd_ip_port(local_listen_fd,ip,port,buf,len,flags);
  133. }*/
  134. int send_fd(int fd, char *buf, int len, int flags) {
  135. return send(fd, buf, len, flags);
  136. }
  137. int my_send(const dest_t &dest, char *data, int len) {
  138. if (dest.cook) {
  139. do_cook(data, len);
  140. }
  141. switch (dest.type) {
  142. case type_fd_addr: {
  143. return sendto_fd_addr(dest.inner.fd, dest.inner.fd_addr.addr, data, len, 0);
  144. break;
  145. }
  146. case type_fd64_addr: {
  147. if (!fd_manager.exist(dest.inner.fd64)) return -1;
  148. int fd = fd_manager.to_fd(dest.inner.fd64);
  149. return sendto_fd_addr(fd, dest.inner.fd64_addr.addr, data, len, 0);
  150. break;
  151. }
  152. case type_fd: {
  153. return send_fd(dest.inner.fd, data, len, 0);
  154. break;
  155. }
  156. case type_write_fd: {
  157. return write(dest.inner.fd, data, len);
  158. break;
  159. }
  160. case type_fd64: {
  161. if (!fd_manager.exist(dest.inner.fd64)) return -1;
  162. int fd = fd_manager.to_fd(dest.inner.fd64);
  163. return send_fd(fd, data, len, 0);
  164. break;
  165. }
  166. /*
  167. case type_fd64_ip_port_conv:
  168. {
  169. if(!fd_manager.exist(dest.inner.fd64)) return -1;
  170. int fd=fd_manager.to_fd(dest.inner.fd64);
  171. char *new_data;
  172. int new_len;
  173. put_conv(dest.conv,data,len,new_data,new_len);
  174. return sendto_fd_ip_port(fd,dest.inner.fd64_ip_port.ip_port.ip,dest.inner.fd64_ip_port.ip_port.port,new_data,new_len,0);
  175. break;
  176. }*/
  177. /*
  178. case type_fd64_conv:
  179. {
  180. char *new_data;
  181. int new_len;
  182. put_conv(dest.conv,data,len,new_data,new_len);
  183. if(!fd_manager.exist(dest.inner.fd64)) return -1;
  184. int fd=fd_manager.to_fd(dest.inner.fd64);
  185. return send_fd(fd,new_data,new_len,0);
  186. }*/
  187. /*
  188. case type_fd:
  189. {
  190. send_fd(dest.inner.fd,data,len,0);
  191. break;
  192. }*/
  193. default:
  194. assert(0 == 1);
  195. }
  196. return 0;
  197. }
  198. int put_conv0(u32_t conv, const char *input, int len_in, char *&output, int &len_out) {
  199. assert(len_in >= 0);
  200. static char buf[buf_len];
  201. output = buf;
  202. u32_t n_conv = htonl(conv);
  203. memcpy(output, &n_conv, sizeof(n_conv));
  204. memcpy(output + sizeof(n_conv), input, len_in);
  205. u32_t crc32 = (u32_t)crc32_fast(output, len_in + sizeof(crc32));
  206. u32_t crc32_n = htonl(crc32);
  207. len_out = len_in + (int)(sizeof(n_conv)) + (int)sizeof(crc32_n);
  208. memcpy(output + len_in + (int)(sizeof(n_conv)), &crc32_n, sizeof(crc32_n));
  209. return 0;
  210. }
  211. int get_conv0(u32_t &conv, const char *input, int len_in, char *&output, int &len_out) {
  212. assert(len_in >= 0);
  213. u32_t n_conv;
  214. memcpy(&n_conv, input, sizeof(n_conv));
  215. conv = ntohl(n_conv);
  216. output = (char *)input + sizeof(n_conv);
  217. u32_t crc32_n;
  218. len_out = len_in - (int)sizeof(n_conv) - (int)sizeof(crc32_n);
  219. if (len_out < 0) {
  220. mylog(log_debug, "len_out<0\n");
  221. return -1;
  222. }
  223. memcpy(&crc32_n, input + len_in - (int)sizeof(crc32_n), sizeof(crc32_n));
  224. u32_t crc32 = ntohl(crc32_n);
  225. if (crc32 != (u32_t)crc32_fast(input, len_in - sizeof(crc32_n))) {
  226. mylog(log_debug, "crc32 check failed\n");
  227. return -1;
  228. }
  229. return 0;
  230. }
  231. int put_crc32(char *s, int &len) {
  232. if (disable_checksum) return 0;
  233. assert(len >= 0);
  234. // if(len<0) return -1;
  235. u32_t crc32 = (u32_t)crc32_fast(s, len);
  236. write_u32(s + len, crc32);
  237. len += sizeof(u32_t);
  238. return 0;
  239. }
  240. int do_cook(char *data, int &len) {
  241. put_crc32(data, len);
  242. if (!disable_obscure) do_obscure(data, len);
  243. if (!disable_xor) encrypt_0(data, len, key_string);
  244. return 0;
  245. }
  246. int de_cook(char *s, int &len) {
  247. if (!disable_xor) decrypt_0(s, len, key_string);
  248. if (!disable_obscure) {
  249. int ret = de_obscure(s, len);
  250. if (ret != 0) {
  251. mylog(log_debug, "de_obscure fail\n");
  252. return ret;
  253. }
  254. }
  255. int ret = rm_crc32(s, len);
  256. if (ret != 0) {
  257. mylog(log_debug, "rm_crc32 fail\n");
  258. return ret;
  259. }
  260. return 0;
  261. }
  262. int rm_crc32(char *s, int &len) {
  263. if (disable_checksum) return 0;
  264. assert(len >= 0);
  265. len -= sizeof(u32_t);
  266. if (len < 0) return -1;
  267. u32_t crc32_in = read_u32(s + len);
  268. u32_t crc32 = (u32_t)crc32_fast(s, len);
  269. if (crc32 != crc32_in) return -1;
  270. return 0;
  271. }
  272. /*
  273. int do_obs()
  274. {
  275. }
  276. int de_obs()*/
  277. int put_conv(u32_t conv, const char *input, int len_in, char *&output, int &len_out) {
  278. static char buf[buf_len];
  279. output = buf;
  280. u32_t n_conv = htonl(conv);
  281. memcpy(output, &n_conv, sizeof(n_conv));
  282. memcpy(output + sizeof(n_conv), input, len_in);
  283. len_out = len_in + (int)(sizeof(n_conv));
  284. return 0;
  285. }
  286. int get_conv(u32_t &conv, const char *input, int len_in, char *&output, int &len_out) {
  287. u32_t n_conv;
  288. memcpy(&n_conv, input, sizeof(n_conv));
  289. conv = ntohl(n_conv);
  290. output = (char *)input + sizeof(n_conv);
  291. len_out = len_in - (int)sizeof(n_conv);
  292. if (len_out < 0) {
  293. mylog(log_debug, "len_out<0\n");
  294. return -1;
  295. }
  296. return 0;
  297. }