diff options
Diffstat (limited to 'node/node.cpp')
| -rw-r--r-- | node/node.cpp | 33 |
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); } |
