aboutsummaryrefslogtreecommitdiff
path: root/client
diff options
context:
space:
mode:
Diffstat (limited to 'client')
-rw-r--r--client/cmixclient.cpp82
-rw-r--r--client/cmixclient.hpp13
-rw-r--r--client/main.cpp2
-rw-r--r--client/node.cpp4
-rw-r--r--client/node.hpp7
5 files changed, 89 insertions, 19 deletions
diff --git a/client/cmixclient.cpp b/client/cmixclient.cpp
index e3f5ac4..195c5e0 100644
--- a/client/cmixclient.cpp
+++ b/client/cmixclient.cpp
@@ -1,38 +1,86 @@
#include "cmixclient.hpp"
-void CMixClient::initialized() {
- BOOST_LOG_TRIVIAL(trace) << "Client connections were made";
- for(auto&& connection : network_connections) {
- cmix_proto::Bye bye;
- connection.send(bye);
- }
- io_service.stop();
+void CMixClient::key_exchange(int i) {
+ shared_keys.resize(network_connections.size());
+
+ cmix_proto::KeyExchange ke;
+ ke.set_public_key(keypair.pub, keypair.pub_len);
+
+ network_connections[i].send(ke);
+
+ cmix_proto::Bye bye;
+ network_connections[i].send(bye);
}
void CMixClient::initialize_connections() {
network_connections.reserve(network_details.size());
- int i = network_details.size();
- auto handler = [this, i]() mutable {
- cmix_proto::ImAClient imaclient;
- network_connections.at(network_details.size() - i).send(imaclient);
+ for(int i = 0; i < network_details.size(); ++i) {
+ auto handler = [this, i]() mutable {
+ cmix_proto::ImAClient imaclient;
+ BOOST_LOG_TRIVIAL(trace) << "sending imaclient to node: " << i;
+ network_connections.at(i).send(imaclient);
- if(--i == 0) {
- initialized();
- }
- };
+ key_exchange(i);
+ };
- for(auto&& details : network_details) {
network_connections.emplace_back(boost::asio::ip::tcp::socket(io_service));
- network_connections.back().async_connect(details.host, details.port, handler);
+ network_connections.back().async_connect(network_details[i].host, network_details[i].port, handler);
+
+ }
+}
+
+cmix_proto::CMixMessage CMixClient::parse_cmix_message(std::vector<uint8_t> const& buffer)
+{
+ cmix_proto::CMixMessage message;
+ if(!message.ParseFromArray(buffer.data(), buffer.size())) {
+ BOOST_LOG_TRIVIAL(error) << "Received something which was not a CMixMessage";
+ throw std::runtime_error("Network communication was disrupted in a unrecoverable way.");
+ }
+ return message;
+}
+
+void CMixClient::handle_key_exchange(int node_id, cmix_proto::KeyExchange const& ke)
+{
+ shared_keys[node_id] = api.derive_shared_key(keypair, reinterpret_cast<uint8_t const*>(ke.public_key().c_str()), false);
+}
+
+void CMixClient::handle_message(int node_id, std::vector<uint8_t> const& message_buffer)
+{
+ cmix_proto::CMixMessage message;
+ try {
+ message = parse_cmix_message(message_buffer);
+ } catch(std::runtime_error const& e) {
+ for(auto&& connection : network_connections) {
+ connection.close();
+ }
+ io_service.stop();
+ return;
+ }
+
+ switch(message.contents_case()) {
+ case cmix_proto::CMixMessage::ContentsCase::kKeyexchange: {
+ handle_key_exchange(node_id, *message.mutable_keyexchange());
+ return;
+ }
+ default: {
+ BOOST_LOG_TRIVIAL(error) << "Received unknown message";
+ }
}
+
+ for(auto&& connection : network_connections) {
+ connection.close();
+ }
+ io_service.stop();
}
CMixClient::CMixClient(std::vector<NodeDetails> details)
: io_service()
, network_details(details)
, network_connections()
+, api(get_implementation())
+, keypair(api.create_key_pair())
{
initialize_connections();
}
diff --git a/client/cmixclient.hpp b/client/cmixclient.hpp
index 10438d1..5c6405a 100644
--- a/client/cmixclient.hpp
+++ b/client/cmixclient.hpp
@@ -2,6 +2,7 @@
#include "node.hpp"
+#include "api.h"
#include "logging.hpp"
#include "client.hpp"
#include "connect.hpp"
@@ -22,10 +23,20 @@ class CMixClient {
std::vector<NodeDetails> network_details;
std::vector<Node> network_connections;
- void initialized();
+ Api api;
+ KeyPair keypair;
+ std::vector<SharedKey> shared_keys;
+
+ void key_exchange(int i);
void initialize_connections();
+ cmix_proto::CMixMessage parse_cmix_message(std::vector<uint8_t> const& buffer);
+
+ void handle_key_exchange(int node_id, cmix_proto::KeyExchange const& ke);
+
+ void handle_message(int node_id, std::vector<uint8_t> const& message_buffer);
+
public:
CMixClient(std::vector<NodeDetails> details);
diff --git a/client/main.cpp b/client/main.cpp
index fb05171..bcac249 100644
--- a/client/main.cpp
+++ b/client/main.cpp
@@ -14,7 +14,7 @@ int main(int argc, char* argv[]) {
init_logging(boost::log::trivial::severity_level::trace, "client");
- BOOST_LOG_TRIVIAL(info) << "Started node";
+ BOOST_LOG_TRIVIAL(info) << "Started client";
po::options_description desc("Allowed options");
desc.add_options()
diff --git a/client/node.cpp b/client/node.cpp
index 8fd1dd8..46375f4 100644
--- a/client/node.cpp
+++ b/client/node.cpp
@@ -13,6 +13,10 @@ void Node::async_connect(std::string next_host, std::string next_port, std::func
client.async_connect(next_host, next_port, on_connect);
}
+void Node::receive(std::function<void (const std::vector<uint8_t>&)> receive_handler) {
+ client.receive(receive_handler);
+}
+
void Node::close()
{
client.close();
diff --git a/client/node.hpp b/client/node.hpp
index 3719223..afcf56a 100644
--- a/client/node.hpp
+++ b/client/node.hpp
@@ -22,6 +22,7 @@ inline void message_setter(cmix_proto::CMixMessage& m, cmix_proto::TYPE const& v
MESSAGE_SETTER(ImAClient, imaclient)
MESSAGE_SETTER(Bye, bye)
+MESSAGE_SETTER(KeyExchange, keyexchange)
#undef MESSAGE_SETTER
@@ -50,6 +51,12 @@ public:
}
/*!
+ * \brief receive
+ * \param receive_handler
+ */
+ void receive(std::function<void(std::vector<uint8_t> const&)> receive_handler);
+
+ /*!
* \brief async_connect
* \param next_host The host of the next node.
* \param next_port The port of the next node.