diff options
| author | alpine <[email protected]> | 2020-06-25 15:27:55 +0200 |
|---|---|---|
| committer | alpine <[email protected]> | 2020-06-25 15:27:55 +0200 |
| commit | 7067cac3b6d62ae17d02c636f7c5b92f8f587641 (patch) | |
| tree | 8953389cb128e8a3cdca70283bcdb75b63bc7d48 /server | |
| parent | Added client version control. (diff) | |
| download | loader-7067cac3b6d62ae17d02c636f7c5b92f8f587641.tar.xz loader-7067cac3b6d62ae17d02c636f7c5b92f8f587641.zip | |
Added 2 key xor encryption for streams.
Diffstat (limited to 'server')
| -rw-r--r-- | server/src/client/client.cpp | 21 | ||||
| -rw-r--r-- | server/src/client/client.h | 11 | ||||
| -rw-r--r-- | server/src/main.cpp | 12 | ||||
| -rw-r--r-- | server/src/util/enc.cpp | 34 | ||||
| -rw-r--r-- | server/src/util/enc.h | 8 |
5 files changed, 77 insertions, 9 deletions
diff --git a/server/src/client/client.cpp b/server/src/client/client.cpp index 4313e85..452c234 100644 --- a/server/src/client/client.cpp +++ b/server/src/client/client.cpp @@ -38,28 +38,37 @@ void tcp::client::gen_session() { } } -int tcp::client::stream(std::vector<char>& data) { +int tcp::client::stream(std::vector<char>& data, float *dur/*= nullptr*/) { auto size = data.size(); auto networked_size = htonl(size); - write(&networked_size, sizeof(networked_size)); + int a = write(&networked_size, sizeof(networked_size)); - // with 4kb chunk size, speed peaks at 90mb/s + // with 4kb chunk size, speed peaks at 90mb/s without enc + // speed is at ~75mb/s with xor constexpr size_t chunk_size = 4096; size_t sent = 0; + auto start = std::chrono::steady_clock::now(); while (size > 0) { auto to_send = std::min(size, chunk_size); - int ret = write(&data[sent], to_send); + std::string chunk(&data[sent], to_send); + enc::encrypt_message(chunk); + int ret = write(chunk.data(), chunk.size()); if (ret <= 0) { break; } - sent += ret; - size -= ret; + sent += ret - 2; + size -= ret - 2; } + auto end = std::chrono::steady_clock::now(); + std::chrono::duration<float> time = end - start; + if(dur) + *dur = time.count(); + return sent; } diff --git a/server/src/client/client.h b/server/src/client/client.h index 07269ff..01dc125 100644 --- a/server/src/client/client.h +++ b/server/src/client/client.h @@ -1,5 +1,6 @@ #pragma once #include "../server/packet.h" +#include "../util/enc.h" namespace tcp { @@ -26,16 +27,20 @@ class client { SSL_free(m_ssl); } - int write(void* data, size_t size) { return SSL_write(m_ssl, data, size); } + int write(const void* data, size_t size) { + //std::string str(reinterpret_cast<const char*>(data), size); + //enc::encrypt_message(str); + return SSL_write(m_ssl, data, size); + } int write(const packet_t& packet) { if (!packet) return 0; - return SSL_write(m_ssl, packet.message.data(), packet.message.size()); + return write(packet.message.data(), packet.message.size()); } int read(void* data, size_t size) { return SSL_read(m_ssl, data, size); } - int stream(std::vector<char>& data); + int stream(std::vector<char>& data, float *dur = nullptr); int read_stream(std::vector<char>& out); void gen_session(); diff --git a/server/src/main.cpp b/server/src/main.cpp index a9c2973..df3a577 100644 --- a/server/src/main.cpp +++ b/server/src/main.cpp @@ -54,6 +54,18 @@ int main(int argc, char* argv[]) { tcp::packet_t resp(packet.message, tcp::packet_type::write, client.get_session()); client.write(resp); + + std::vector<char> t; + io::read_file("test.dll", t); + float tot; + for(int i = 0; i < 100; i++) { + float dur; + client.stream(t, &dur); + tot += dur; + } + float avg = tot / 100.f; + io::logger->info("average time {}", avg); + }); std::thread t{tcp::server::monitor, std::ref(server)}; diff --git a/server/src/util/enc.cpp b/server/src/util/enc.cpp new file mode 100644 index 0000000..6a7baed --- /dev/null +++ b/server/src/util/enc.cpp @@ -0,0 +1,34 @@ +#include "../include.h" +#include "enc.h" + +namespace enc { + +void encrypt_message(std::string &str) { + std::random_device r; + std::default_random_engine e1(r()); + std::uniform_int_distribution<int> gen(0, 255); + + char k1 = static_cast<char>(gen(e1)); + char k2 = static_cast<char>(gen(e1)); + for (int i = 0; i < str.size(); i++) { + char k = (i % 2) ? k1 : k2; + str[i] ^= k; + } + str.insert(str.begin(), k1); + str.insert(str.end(), k2); +} + +void decrypt_message(std::string &str) { + char k1 = str[0]; + char k2 = str[str.size() - 1]; + + str.erase(str.begin()); + str.erase(str.end() - 1); + + for (int i = 0; i < str.size(); i++) { + char k = (i % 2) ? k1 : k2; + str[i] ^= k; + } +} + +}; // namespace enc
\ No newline at end of file diff --git a/server/src/util/enc.h b/server/src/util/enc.h new file mode 100644 index 0000000..ae8d5a6 --- /dev/null +++ b/server/src/util/enc.h @@ -0,0 +1,8 @@ +#pragma once + +namespace enc { + +void encrypt_message(std::string &str); +void decrypt_message(std::string &str); + +}; // namespace enc
\ No newline at end of file |