diff options
Diffstat (limited to 'node/node.cpp')
| -rw-r--r-- | node/node.cpp | 125 |
1 files changed, 117 insertions, 8 deletions
diff --git a/node/node.cpp b/node/node.cpp index e8303eb..f5c8dbe 100644 --- a/node/node.cpp +++ b/node/node.cpp @@ -5,7 +5,7 @@ #include "logging.hpp" -#include <iostream> +#include <numeric> using namespace boost::asio::ip; @@ -21,6 +21,7 @@ Node::Node(ListenSettings const& listen_settings, NodeNetworkSettings network_se , api(get_implementation()) , keypair(api.create_key_pair()) , network_key() +, precomputation_data() , shutting_down(false) { GOOGLE_PROTOBUF_VERIFY_VERSION; @@ -69,9 +70,9 @@ void Node::connect_to_next_node() void Node::start_initialisation() { cmix_proto::Initialization init; - char* pub_key; + unsigned char* pub_key; size_t len; - api.get_key_array(&pub_key, &len, keypair.pub); + api.element_to_array(&pub_key, &len, keypair.pub); init.set_public_share(pub_key, len); free(pub_key); @@ -79,11 +80,21 @@ void Node::start_initialisation() { next_node.async_send(init); } + void Node::handle_node_initialization(const cmix_proto::Initialization& init) { if(network_settings.is_first) { + network_key = api.array_to_element(init.public_share().c_str(), init.public_share().size(), true); + cmix_proto::SecretKey sec; - sec.set_secret_key(network_key.data(), network_key.size()); + + unsigned char* data; + size_t len; + + api.element_to_array(&data, &len, network_key); + sec.set_secret_key(data, len); + free(data); + next_node.async_send(sec); } else { @@ -103,7 +114,8 @@ void Node::handle_node_initialization(const cmix_proto::Initialization& init) void Node::handle_node_secretkey(cmix_proto::SecretKey const& secret) { std::string share = secret.secret_key(); - network_key = std::vector<uint8_t>(share.begin(), share.end()); + + network_key = api.array_to_element(secret.secret_key().c_str(), secret.secret_key().size(), true); if(network_settings.is_first) { start_precomputation(); @@ -112,6 +124,58 @@ void Node::handle_node_secretkey(cmix_proto::SecretKey const& secret) } } +void Node::handle_node_prepre(cmix_proto::PrePre const& pre) { + if(network_settings.is_first) { + + + } else { + std::vector<size_t> permutation(clients.size()); + std::iota(permutation.begin(), permutation.end(), 0); + //ToDo: generate something different than the ID permutation. + + cmix_proto::PrePre prepre; + + for(int i = 0; i < pre.m_er_size(); ++i) { + GroupElement r = api.get_group_element(true); + GroupElement s = api.get_group_element(true); + + GroupElement random_element; + GroupElement message_element; + + api.encrypt(&random_element, &message_element, r, network_key); + + GroupElement other_random_element = api.array_to_element(pre.r_er(i).data(), pre.r_er(i).size(), true); + GroupElement other_message_element = api.array_to_element(pre.m_er(i).data(), pre.m_er(i).size(), true); + + GroupElement new_random_element = api.multiply(random_element, other_random_element, true); + GroupElement new_message_element = api.multiply(message_element, other_message_element, true); + + + unsigned char* buffer; + size_t len; + + api.element_to_array(&buffer, &len, new_random_element); + prepre.add_r_er(buffer, len); + free(buffer); + + api.element_to_array(&buffer, &len, new_message_element); + prepre.add_m_er(buffer, len); + free(buffer); + + api.free_group_element(random_element); + api.free_group_element(message_element); + api.free_group_element(other_random_element); + api.free_group_element(other_message_element); + api.free_group_element(new_random_element); + api.free_group_element(new_message_element); + + precomputation_data.emplace_back(MixData{r, s, "", permutation[i]}); + } + + next_node.async_send(prepre); + } +} + void Node::handle_node_message(cmix_proto::CMixMessage message) { switch(message.contents_case()) { @@ -130,6 +194,11 @@ void Node::handle_node_message(cmix_proto::CMixMessage message) handle_node_secretkey(message.secretkey()); break; } + case cmix_proto::CMixMessage::ContentsCase::kPrepre: { + BOOST_LOG_TRIVIAL(trace) << "Handling PrePre"; + handle_node_prepre(message.prepre()); + break; + } default: { BOOST_LOG_TRIVIAL(error) << "handle_node_message: CMixMessage contains unknown contents."; } @@ -150,14 +219,14 @@ void Node::handle_client_keyexchange(ClientConnections::key_type handle, cmix_pr cmix_proto::KeyExchange exchange; - char* buffer; + unsigned char* buffer; size_t len; - api.get_key_array(&buffer, &len, keypair.pub); + api.element_to_array(&buffer, &len, keypair.pub); exchange.set_public_key(buffer, len); free(buffer); - api.get_key_array(&buffer, &len, ex_val); + api.element_to_array(&buffer, &len, ex_val); exchange.set_value(buffer, len); free(buffer); @@ -246,4 +315,44 @@ void Node::handle_message(Purgatory::iterator handle, cmix_proto::CMixMessage me } void Node::start_precomputation() { + precomputation_data.clear(); + precomputation_data.reserve(clients.size()); + + std::vector<size_t> permutation(clients.size()); + std::iota(permutation.begin(), permutation.end(), 0); + //ToDo: generate something different than the ID permutation. + + cmix_proto::PrePre prepre; + + auto perm_it = permutation.begin(); + for(auto const& pair : clients) { + GroupElement r = api.get_group_element(true); + GroupElement s = api.get_group_element(true); + + GroupElement random_element; + GroupElement message_element; + + api.encrypt(&random_element, &message_element, r, network_key); + + unsigned char* buffer; + size_t len; + + api.element_to_array(&buffer, &len, random_element); + prepre.add_m_er(buffer, len); + free(buffer); + + api.element_to_array(&buffer, &len, message_element); + prepre.add_m_er(buffer, len); + free(buffer); + + next_node.async_send(prepre); + + //ToDo generate permutation. + precomputation_data.emplace_back(MixData{r, s, pair.first, *perm_it++}); + + api.free_group_element(random_element); + api.free_group_element(message_element); + } + + next_node.async_send(prepre); } |
