aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--client/src/client/client.cpp58
-rw-r--r--client/src/client/client.h5
-rw-r--r--client/src/client/packet.h14
-rw-r--r--client/src/main.cpp15
-rw-r--r--client/src/util/xor.cpp41
-rw-r--r--client/src/util/xor.h14
-rw-r--r--server/src/client/client.cpp58
-rw-r--r--server/src/client/client.h29
-rw-r--r--server/src/main.cpp8
-rw-r--r--server/src/server/packet.h16
-rw-r--r--server/src/server/ssl.h2
-rw-r--r--server/src/util/xor.cpp39
-rw-r--r--server/src/util/xor.h12
13 files changed, 152 insertions, 159 deletions
diff --git a/client/src/client/client.cpp b/client/src/client/client.cpp
index 71c9e11..e224a95 100644
--- a/client/src/client/client.cpp
+++ b/client/src/client/client.cpp
@@ -1,8 +1,7 @@
#include "../include.h"
#include "client.h"
-bool tcp::client::start(const std::string_view server_ip,
- const uint16_t port) {
+bool tcp::client::start(const std::string_view server_ip, const uint16_t port) {
SSL_library_init();
m_ssl_ctx = SSL_CTX_new(TLS_client_method());
@@ -30,11 +29,62 @@ bool tcp::client::start(const std::string_view server_ip,
SSL_set_fd(m_server_ssl, m_socket);
ret = SSL_connect(m_server_ssl);
- if(ret != 1) {
+
+ if (ret != 1) {
ret = SSL_get_error(m_server_ssl, ret);
- io::logger->error("failed to connect to server ssl. {}", ret);
+ io::logger->error("failed to connect to server. {}", ret);
return false;
}
return true;
}
+
+int tcp::client::read_stream(std::vector<char> &out) {
+ size_t size;
+ read(&size, sizeof(size));
+
+ size = ntohl(size);
+ out.resize(size);
+
+ constexpr size_t chunk_size = 4096;
+ size_t total = 0;
+
+ while (size > 0) {
+ auto to_read = std::min(size, chunk_size);
+
+ int ret = read(&out[total], to_read);
+ if (ret <= 0) {
+ break;
+ }
+
+ size -= ret;
+ total += ret;
+ }
+
+ return total;
+}
+
+int tcp::client::stream(std::vector<char> &data) {
+ auto size = data.size();
+
+ auto networked_size = htonl(size);
+ write(&networked_size, sizeof(networked_size));
+
+ // with 4kb chunk size, speed peaks at 90mb/s
+ constexpr size_t chunk_size = 4096;
+ size_t sent = 0;
+
+ while (size > 0) {
+ auto to_send = std::min(size, chunk_size);
+
+ int ret = write(&data[sent], to_send);
+ if (ret <= 0) {
+ break;
+ }
+
+ sent += ret;
+ size -= ret;
+ }
+
+ return sent;
+}
diff --git a/client/src/client/client.h b/client/src/client/client.h
index 7c1b8a7..34e761b 100644
--- a/client/src/client/client.h
+++ b/client/src/client/client.h
@@ -22,6 +22,7 @@ class client {
event<packet_t &> receive_event;
client() : m_socket{-1}, m_state{0} {}
+
bool start(const std::string_view server_ip, const uint16_t port);
int write(void *data, size_t size) {
@@ -32,6 +33,10 @@ class client {
return SSL_read(m_server_ssl, data, size);
}
+ int read_stream(std::vector<char> &out);
+
+ int stream(std::vector<char> &data);
+
int get_socket() { return m_socket; }
bool is_active() { return m_state == client_state::active; }
void set_state(const uint8_t &state) { m_state = state; }
diff --git a/client/src/client/packet.h b/client/src/client/packet.h
index 3930243..7ac8857 100644
--- a/client/src/client/packet.h
+++ b/client/src/client/packet.h
@@ -1,5 +1,4 @@
#pragma once
-#include "../util/xor.h"
namespace tcp {
constexpr size_t uid_len = 10;
@@ -14,24 +13,19 @@ struct packet_t {
packet_t() {}
packet_t(const std::string msg, const packet_type &type, std::string userid = "") {
if (type == read) {
- std::string decrypted{msg};
- enc::decrypt_message(decrypted);
-
- if (decrypted.size() < uid_len) {
+ if (msg.size() < uid_len) {
io::logger->error("client packet message invalid!");
return;
}
- uid = decrypted.substr(0, uid_len);
+ uid = msg.substr(0, uid_len);
- action = decrypted[uid_len];
- message = decrypted.substr(uid_len);
+ action = msg[uid_len];
+ message = msg.substr(uid_len);
} else {
uid = userid;
message = fmt::format("{}{}", uid, msg);
-
- enc::encrypt_message(message);
}
}
diff --git a/client/src/main.cpp b/client/src/main.cpp
index 13da109..c94a866 100644
--- a/client/src/main.cpp
+++ b/client/src/main.cpp
@@ -16,8 +16,14 @@ int main(int argc, char *argv[]) {
if(!packet)
return;
- io::logger->info(packet.message);
- io::logger->info(packet.uid.data());
+ if(packet.message == "stream") {
+ std::vector<char> dat;
+ client.read_stream(dat);
+
+ std::ofstream o("out");
+ o.write(dat.data(), dat.size());
+ o.close();
+ }
});
std::thread t{tcp::client::monitor, std::ref(client)};
@@ -28,10 +34,11 @@ int main(int argc, char *argv[]) {
tcp::packet_t packet(p, tcp::packet_type::write, "1234567890");
- bool ret = client.write(packet.message.data(), packet.message.size());
- if (!ret) {
+ int ret = client.write(packet.message.data(), packet.message.size());
+ if (ret <= 0) {
break;
}
+
}
t.join();
diff --git a/client/src/util/xor.cpp b/client/src/util/xor.cpp
deleted file mode 100644
index 483c161..0000000
--- a/client/src/util/xor.cpp
+++ /dev/null
@@ -1,41 +0,0 @@
-#include "../include.h"
-#include "xor.h"
-
-char enc::gen_key() {
- std::random_device r;
-
- std::default_random_engine e1(r());
- std::uniform_real_distribution<> uniform_dist(0, 255);
- return static_cast<char>(uniform_dist(e1));
-}
-
-// XOR keys at the beginning of the message for clients
-void enc::encrypt_message(std::string &str) {
- std::array<char, key_num> keys;
- for (size_t i = 0; i < key_num; i++) {
- char key = gen_key();
- keys[i] = key;
- str.insert(str.begin(), key);
- }
-
- for (auto &key : keys) {
- for (size_t i = key_num; i < str.size(); i++) {
- str[i] ^= key;
- }
- }
-}
-
-// XOR keys at the end of the message for server messages
-void enc::decrypt_message(std::string &str) {
- if (str.size() <= 50) return;
-
- std::string keys = str.substr(str.size() - key_num);
-
- for (auto &key : keys) {
- for (size_t i = 0; i < str.size() - key_num; i++) {
- str[i] ^= key;
- }
- }
-
- str.erase(str.end() - key_num, str.end());
-} \ No newline at end of file
diff --git a/client/src/util/xor.h b/client/src/util/xor.h
deleted file mode 100644
index 1ae1ce2..0000000
--- a/client/src/util/xor.h
+++ /dev/null
@@ -1,14 +0,0 @@
-#pragma once
-
-namespace enc {
-constexpr size_t key_num = 50;
-
-char gen_key();
-
-// XOR keys at the beginning of the message for clients
-void encrypt_message(std::string &str);
-
-// XOR keys at the end of the message for server messages
-void decrypt_message(std::string &str);
-
-} // namespace enc \ No newline at end of file
diff --git a/server/src/client/client.cpp b/server/src/client/client.cpp
index 4c458c8..782017f 100644
--- a/server/src/client/client.cpp
+++ b/server/src/client/client.cpp
@@ -16,6 +16,12 @@ bool tcp::client::init_ssl(SSL_CTX *server_ctx) {
}
ret = SSL_accept(m_ssl);
+
+ long result = SSL_get_verify_result(m_ssl);
+
+ auto str = X509_verify_cert_error_string(result);
+ io::logger->info("verify returned {}", str);
+
if (ret <= 0) {
int err = SSL_get_error(m_ssl, ret);
io::logger->error("client {} failed to accept ssl, return code {}", m_ip,
@@ -24,4 +30,54 @@ bool tcp::client::init_ssl(SSL_CTX *server_ctx) {
}
return true;
-} \ No newline at end of file
+}
+
+int tcp::client::stream(std::vector<char> &data) {
+ auto size = data.size();
+
+ auto networked_size = htonl(size);
+ write(&networked_size, sizeof(networked_size));
+
+ // with 4kb chunk size, speed peaks at 90mb/s
+ constexpr size_t chunk_size = 4096;
+ size_t sent = 0;
+
+ while(size > 0) {
+ auto to_send = std::min(size, chunk_size);
+
+ int ret = write(&data[sent], to_send);
+ if(ret <= 0) {
+ break;
+ }
+
+ sent += ret;
+ size -= ret;
+ }
+
+ return sent;
+ }
+
+ int tcp::client::read_stream(std::vector<char> &out) {
+ size_t size;
+ read(&size, sizeof(size));
+
+ size = ntohl(size);
+ out.resize(size);
+
+ constexpr size_t chunk_size = 4096;
+ size_t total = 0;
+
+ while(size > 0) {
+ auto to_read = std::min(size, chunk_size);
+
+ int ret = read(&out[total], to_read);
+ if(ret <= 0) {
+ break;
+ }
+
+ size -= ret;
+ total += ret;
+ }
+
+ return total;
+ } \ No newline at end of file
diff --git a/server/src/client/client.h b/server/src/client/client.h
index 5242ae7..28094ba 100644
--- a/server/src/client/client.h
+++ b/server/src/client/client.h
@@ -11,13 +11,12 @@ class client {
time_t m_time;
std::string m_ip;
- std::array<char, tcp::uid_len> m_uid;
+ std::string m_uid;
+
public:
client() : m_socket{-1} {};
client(const int &socket, const std::string_view ip)
- : m_socket{std::move(socket)}, m_ip{ip}, m_ssl{nullptr} {
-
- }
+ : m_socket{std::move(socket)}, m_ip{ip}, m_ssl{nullptr} {}
~client() = default;
bool init_ssl(SSL_CTX *server_ctx);
@@ -28,27 +27,15 @@ class client {
SSL_free(m_ssl);
}
- int write(void *data, size_t size) {
- return SSL_write(m_ssl, data, size);
- }
+ int write(void *data, size_t size) { return SSL_write(m_ssl, data, size); }
- int read(void *data, size_t size) {
- return SSL_read(m_ssl, data, size);
- }
+ int read(void *data, size_t size) { return SSL_read(m_ssl, data, size); }
- bool set_uid(const std::string_view uid_str) {
- const size_t uid_str_len = uid_str.size();
- if (uid_str_len != tcp::uid_len) {
- io::logger->error("packet uid len mismatch!");
- return false;
- }
+ int stream(std::vector<char> &data);
- for (size_t i = 0; i < uid_len; ++i) {
- m_uid[i] = uid_str[i];
- }
+ int read_stream(std::vector<char> &out);
- return true;
- }
+ void set_uid(const std::string_view uid_str) { m_uid = uid_str; }
int &get_socket() { return m_socket; }
auto &get_ip() { return m_ip; }
diff --git a/server/src/main.cpp b/server/src/main.cpp
index 9db266f..21cad38 100644
--- a/server/src/main.cpp
+++ b/server/src/main.cpp
@@ -2,7 +2,6 @@
#include "util/io.h"
#include "util/commands.h"
#include "server/server.h"
-#include "util/xor.h"
int main(int argc, char *argv[]) {
io::init(false);
@@ -31,8 +30,13 @@ int main(int argc, char *argv[]) {
io::logger->info("{} : {}", packet.uid.data(), packet.message);
- tcp::packet_t resp("hello nigga", tcp::packet_type::write, "1234567890");
+ tcp::packet_t resp("stream", tcp::packet_type::write, "1234567890");
client.write(resp.message.data(), resp.message.size());
+
+ std::vector<char> out;
+ io::read_file("test.dll", out);
+ client.stream(out);
+
});
std::thread t{tcp::server::monitor, std::ref(server)};
diff --git a/server/src/server/packet.h b/server/src/server/packet.h
index 3930243..09eaf1d 100644
--- a/server/src/server/packet.h
+++ b/server/src/server/packet.h
@@ -1,5 +1,4 @@
#pragma once
-#include "../util/xor.h"
namespace tcp {
constexpr size_t uid_len = 10;
@@ -14,27 +13,24 @@ struct packet_t {
packet_t() {}
packet_t(const std::string msg, const packet_type &type, std::string userid = "") {
if (type == read) {
- std::string decrypted{msg};
- enc::decrypt_message(decrypted);
-
- if (decrypted.size() < uid_len) {
+ if (msg.size() < uid_len) {
io::logger->error("client packet message invalid!");
return;
}
- uid = decrypted.substr(0, uid_len);
+ uid = msg.substr(0, uid_len);
- action = decrypted[uid_len];
- message = decrypted.substr(uid_len);
+ action = msg[uid_len];
+ message = msg.substr(uid_len);
} else {
uid = userid;
message = fmt::format("{}{}", uid, msg);
-
- enc::encrypt_message(message);
}
}
+
+
operator bool() const {
return !message.empty() && !uid.empty();
}
diff --git a/server/src/server/ssl.h b/server/src/server/ssl.h
index 06826be..745aa14 100644
--- a/server/src/server/ssl.h
+++ b/server/src/server/ssl.h
@@ -21,7 +21,7 @@ class ssl {
}
int res =
- SSL_CTX_use_certificate_file(m_ctx, m_cert.data(), SSL_FILETYPE_PEM);
+ SSL_CTX_use_certificate_chain_file(m_ctx, m_cert.data());
if (res != 1) {
io::logger->error("failed to load certificate.");
return false;
diff --git a/server/src/util/xor.cpp b/server/src/util/xor.cpp
deleted file mode 100644
index a00ecc9..0000000
--- a/server/src/util/xor.cpp
+++ /dev/null
@@ -1,39 +0,0 @@
-#include "../include.h"
-#include "xor.h"
-
-char enc::gen_key() {
- std::random_device r;
-
- std::default_random_engine e1(r());
- std::uniform_real_distribution<> uniform_dist(0, 255);
- return static_cast<char>(uniform_dist(e1));
-}
-
-void enc::encrypt_message(std::string &str) {
- std::array<char, key_len> keys;
- for (size_t i = 0; i < key_len; i++) {
- keys[i] = gen_key();
- str.insert(str.end(), keys[i]);
- }
-
- for (auto &key : keys) {
- for (size_t i = 0; i < str.size() - key_len; i++) {
- str[i] ^= key;
- }
- }
-}
-
-void enc::decrypt_message(std::string &str) {
- if (str.size() <= key_len) return;
-
- std::string keys = str.substr(0, key_len);
- std::reverse(keys.begin(), keys.end());
-
- for (auto &key : keys) {
- for (size_t i = key_len; i < str.size(); i++) {
- str[i] ^= key;
- }
- }
-
- str.erase(str.begin(), str.begin() + key_len);
-} \ No newline at end of file
diff --git a/server/src/util/xor.h b/server/src/util/xor.h
deleted file mode 100644
index 7180945..0000000
--- a/server/src/util/xor.h
+++ /dev/null
@@ -1,12 +0,0 @@
-#pragma once
-
-namespace enc {
-constexpr size_t key_len = 50;
-
-char gen_key();
-
-void encrypt_message(std::string &str);
-
-void decrypt_message(std::string &str);
-
-} // namespace enc \ No newline at end of file