diff --git a/src/common.hpp b/src/common.hpp index 91077ccd9193134dc1d81dc42a1e3102d36c146e..a6739ec1d4295a34bce342eb9135e57974831b0f 100644 --- a/src/common.hpp +++ b/src/common.hpp @@ -16,8 +16,14 @@ constexpr size_t DGRAM_BUFFER_SIZE = 20480; // to the real openvpn server. constexpr size_t SERVER_ENCRYPT_CONNECTION_TIMEOUT_SECONDS = 60; +#include <random> // MAGIC PORT NUMBER! Warning! Used for Inbound - Outbound IPC talking. Windows wepoll doesn't support PIPE, so I have to use this. -constexpr uint16_t TCP_TMP_PORT_NUMBER = 50999; +uint16_t get_tmp_tcp_port_number() { + std::random_device rd; + std::mt19937 mt(rd()); + std::uniform_int_distribution<int> dist(40000, 60000); + return dist(mt); +} #endif diff --git a/src/filters/base.hpp b/src/filters/base.hpp index e5b519f7dde1f19347fdab46425ed89bee2cf3e2..fbf5d8d0402e5935017576e51355e7545333a330 100644 --- a/src/filters/base.hpp +++ b/src/filters/base.hpp @@ -44,7 +44,7 @@ namespace Filters { // Usually the decrypt/decode/de-obfs function. virtual string convertBackward(string binaryDatagram) override { for (auto iter = chainedFilters.rbegin(); iter != chainedFilters.rend(); ++iter) { - binaryDatagram = (*iter)->convertForward(binaryDatagram); + binaryDatagram = (*iter)->convertBackward(binaryDatagram); } return binaryDatagram; } diff --git a/src/filters/xor_encryption.hpp b/src/filters/xor_encryption.hpp index 639acdd996c411eac43e7f75cedddfbfd160e675..2ab566146266eb580ad739892b4f6aabf903b3b2 100644 --- a/src/filters/xor_encryption.hpp +++ b/src/filters/xor_encryption.hpp @@ -21,7 +21,7 @@ namespace Filters { virtual string convertForward(string datagram) override { auto curr_key_digit = 0; for (auto offset = 0; offset < datagram.size(); ++offset) { - datagram[0] ^= key[curr_key_digit++]; + datagram[offset] ^= key[curr_key_digit++]; } return datagram; } diff --git a/src/utils.hpp b/src/utils.hpp index 89967f4d84dad1e09683615379db0eb588aafe97..d2f133d0fbc6137dee32e41ffbc9d8fb2ea853b2 100644 --- a/src/utils.hpp +++ b/src/utils.hpp @@ -79,12 +79,14 @@ inline auto mkpipe() { inline auto mk_tcp_pipe() { sockfd_t connfd_cli_side, connfd_srv_side; - auto listenfd = rlib::quick_listen("::1", TCP_TMP_PORT_NUMBER); + auto tmp_port = get_tmp_tcp_port_number(); + auto listenfd = rlib::quick_listen("::1", tmp_port); // We have no UnixSocket on Windows. auto serverThread = std::thread([&] { connfd_srv_side = rlib::quick_accept(listenfd); }); - connfd_cli_side = rlib::quick_connect("::1", TCP_TMP_PORT_NUMBER); + connfd_cli_side = rlib::quick_connect("::1", tmp_port); serverThread.join(); + rlib::sockIO::close_ex(listenfd); return std::make_pair(connfd_cli_side, connfd_srv_side); }