aboutsummaryrefslogtreecommitdiff
path: root/node/node.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'node/node.cpp')
-rw-r--r--node/node.cpp33
1 files changed, 23 insertions, 10 deletions
diff --git a/node/node.cpp b/node/node.cpp
index 73eb4b6..2cbcb19 100644
--- a/node/node.cpp
+++ b/node/node.cpp
@@ -1,9 +1,10 @@
#include "node.hpp"
-#include "logging.hpp"
-
+#include "cmix.h"
#include "bignum.h"
+#include "logging.hpp"
+
#include <iostream>
using namespace boost::asio::ip;
@@ -12,6 +13,7 @@ Node::Node(ListenSettings const& listen_settings, NodeNetworkSettings network_se
: io_service()
, server(io_service, listen_settings, [this](boost::asio::ip::tcp::socket&& socket){accept_handler(std::move(socket));})
, clients()
+, data()
, network_settings(network_settings)
, prev_node(Receiver(tcp::socket(io_service)))
, next_node(Sender(tcp::socket(io_service)))
@@ -77,6 +79,8 @@ void Node::handle_node_initialization(const cmix_proto::Initialization& init)
get_curve25519_mod(&mod);
Bignum new_shared = allocate_bignum(keypair.pub_len);
+ calculate_shared_key_part(&new_shared, shared, my_share, mod);
+
cmix_proto::Initialization init;
init.set_public_share(new_shared.data, new_shared.len);
@@ -96,6 +100,8 @@ void Node::handle_node_bye(cmix_proto::Bye) {
prev_node.async_receive([this](cmix_proto::CMixMessage message){
handle_node_message(message);
});
+ } else {
+ io_service.stop();
}
}
@@ -128,17 +134,24 @@ void Node::handle_node_message(cmix_proto::CMixMessage message)
});
}
-void Node::handle_client_keyexchange(ClientMap::key_type handle, cmix_proto::KeyExchange ke) {
- api.derive_shared_key(keypair, reinterpret_cast<uint8_t const*>(ke.public_key().c_str()), true);
+void Node::handle_client_keyexchange(ClientConnections::key_type handle, cmix_proto::KeyExchange ke) {
+ data[handle].shared_value = api.derive_shared_key(keypair, reinterpret_cast<uint8_t const*>(ke.public_key().c_str()), true);
+
+ cmix_proto::KeyExchange exchange;
+ exchange.set_public_key(keypair.pub, keypair.pub_len);
+ clients.at(handle).async_send(exchange);
}
-void Node::handle_client_bye(ClientMap::key_type handle, cmix_proto::Bye)
+void Node::handle_client_bye(ClientConnections::key_type handle, cmix_proto::Bye)
{
clients.at(handle).close();
clients.erase(handle);
+ if(clients.size() == 0) {
+ send_bye();
+ }
}
-void Node::handle_client_message(ClientMap::key_type handle, cmix_proto::CMixMessage message)
+void Node::handle_client_message(ClientConnections::key_type handle, cmix_proto::CMixMessage message)
{
switch(message.contents_case()) {
case cmix_proto::CMixMessage::ContentsCase::kKeyexchange: {
@@ -160,7 +173,7 @@ void Node::handle_client_message(ClientMap::key_type handle, cmix_proto::CMixMes
});
}
-void Node::handle_imanode(std::list<Receiver>::iterator handle) {
+void Node::handle_imanode(Purgatory::iterator handle) {
handle->on_done([]{});
prev_node = Receiver(std::move(*handle));
purgatory.erase(handle);
@@ -169,8 +182,7 @@ void Node::handle_imanode(std::list<Receiver>::iterator handle) {
});
}
-void Node::handle_imaclient(std::list<Receiver>::iterator handle, cmix_proto::ImAClient c) {
- BOOST_LOG_TRIVIAL(trace) << "Handling imaclient";
+void Node::handle_imaclient(Purgatory::iterator handle, cmix_proto::ImAClient c) {
std::string client_id = c.id();
clients.emplace(c.id(), SenderReceiver(std::move(*handle)));
clients.at(c.id()).on_done([this, client_id]{
@@ -182,7 +194,7 @@ void Node::handle_imaclient(std::list<Receiver>::iterator handle, cmix_proto::Im
});
}
-void Node::handle_message(std::list<Receiver>::iterator handle, cmix_proto::CMixMessage message)
+void Node::handle_message(Purgatory::iterator handle, cmix_proto::CMixMessage message)
{
switch(message.contents_case()) {
case cmix_proto::CMixMessage::ContentsCase::kImanode: {
@@ -200,6 +212,7 @@ void Node::handle_message(std::list<Receiver>::iterator handle, cmix_proto::CMix
}
}
+ handle->close();
purgatory.erase(handle);
}