diff options
Diffstat (limited to 'node/node.cpp')
| -rw-r--r-- | node/node.cpp | 56 |
1 files changed, 51 insertions, 5 deletions
diff --git a/node/node.cpp b/node/node.cpp index 045eb13..92c51ec 100644 --- a/node/node.cpp +++ b/node/node.cpp @@ -2,6 +2,10 @@ #include "logging.hpp" +#include "gmpxx.h" + +#include <iostream> + using namespace boost::asio::ip; Node::Node(ListenSettings const& listen_settings, NodeNetworkSettings network_settings) @@ -21,7 +25,7 @@ Node::Node(ListenSettings const& listen_settings, NodeNetworkSettings network_se } }; - next_node.connect(network_settings.next_host, network_settings.next_port, on_connect); + next_node.async_connect(network_settings.next_host, network_settings.next_port, on_connect); } Node::~Node() { @@ -52,18 +56,60 @@ void Node::start_initialisation() { std::string message; init.SerializeToString(&message); - BOOST_LOG_TRIVIAL(trace) << init.DebugString(); + BOOST_LOG_TRIVIAL(trace) << "init: " << init.DebugString(); + BOOST_LOG_TRIVIAL(trace) << "size: " << message.size(); + BOOST_LOG_TRIVIAL(trace) << "raw: " << message; next_node.send(message); auto f = [this](std::vector<uint8_t> bytes) { - network_pub_key = bytes; - if(network_settings.is_first) { + BOOST_LOG_TRIVIAL(trace) << "bytes.size(): " << bytes.size(); + BOOST_LOG_TRIVIAL(trace) << "raw2: " << std::string(bytes.begin(), bytes.end()); + initialization init; + init.ParseFromArray(bytes.data(), bytes.size()); + std::string share = init.public_share(); + + network_pub_key = std::vector<uint8_t>(share.begin(), share.end()); + + BOOST_LOG_TRIVIAL(trace) << "The network pub_key: " << init.DebugString(); + start_precomputation(); + } else { + mpz_t shared; + mpz_init(shared); + mpz_import(shared, bytes.size(), -1, 1, 0, 0, bytes.data()); + + mpz_t my_share; + mpz_init(my_share); + mpz_import(my_share, keypair.pub_len, -1, 1, 0, 0, keypair.pub); + + mpz_mul(shared, shared, my_share); + + mpz_t mod; + mpz_init(mod); + mpz_set_ui(mod, 2); + mpz_pow_ui(mod, mod, 255); + mpz_sub_ui(mod, mod, 19); + + mpz_mod(shared, shared, mod); + + std::vector<uint8_t> new_shared(keypair.pub_len, '\0'); + size_t size; + mpz_export(new_shared.data(), &size, -1, 1, 0, 0, shared); + + initialization init; + init.set_public_share(new_shared.data(), new_shared.size()); + + std::string message; + init.SerializeToString(&message); + next_node.send(message); + + mpz_clear(shared); + mpz_clear(my_share); + mpz_clear(mod); } }; - BOOST_LOG_TRIVIAL(trace) << "number of clients: " << clients.size(); for(auto&& client : clients) { client.receive(f); } |
