aboutsummaryrefslogtreecommitdiff
path: root/node/node.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'node/node.cpp')
-rw-r--r--node/node.cpp125
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);
}