aboutsummaryrefslogtreecommitdiff
path: root/server
diff options
context:
space:
mode:
authoralpine <[email protected]>2020-06-25 15:27:55 +0200
committeralpine <[email protected]>2020-06-25 15:27:55 +0200
commit7067cac3b6d62ae17d02c636f7c5b92f8f587641 (patch)
tree8953389cb128e8a3cdca70283bcdb75b63bc7d48 /server
parentAdded client version control. (diff)
downloadloader-7067cac3b6d62ae17d02c636f7c5b92f8f587641.tar.xz
loader-7067cac3b6d62ae17d02c636f7c5b92f8f587641.zip
Added 2 key xor encryption for streams.
Diffstat (limited to 'server')
-rw-r--r--server/src/client/client.cpp21
-rw-r--r--server/src/client/client.h11
-rw-r--r--server/src/main.cpp12
-rw-r--r--server/src/util/enc.cpp34
-rw-r--r--server/src/util/enc.h8
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