aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDennis Brentjes <d.brentjes@gmail.com>2016-11-16 19:55:11 +0100
committerDennis Brentjes <d.brentjes@gmail.com>2016-11-16 19:55:11 +0100
commit6ae607cc84b671810fca9c24b1c131ca12d922e7 (patch)
treee078e5e30cf2f979a1dbd0baefd18a9f58191f07
parentf93d52bbd0053574fb35d72b85c4b299dc1f3ee5 (diff)
downloadcmix-6ae607cc84b671810fca9c24b1c131ca12d922e7.tar.gz
cmix-6ae607cc84b671810fca9c24b1c131ca12d922e7.tar.bz2
cmix-6ae607cc84b671810fca9c24b1c131ca12d922e7.zip
Working implementation of elgamal in 2048 bit multiplicative group.
-rw-r--r--client/cmixclient.cpp2
-rw-r--r--libcmix-crypto/elgamal/gcrypt/gcrypt_elgamal.c14
-rw-r--r--libcmix-network/client.hpp1
-rw-r--r--libcmix/cmix.c23
-rw-r--r--node/node.cpp14
-rw-r--r--node/node_node.cpp12
6 files changed, 46 insertions, 20 deletions
diff --git a/client/cmixclient.cpp b/client/cmixclient.cpp
index d7e1387..e3b33b6 100644
--- a/client/cmixclient.cpp
+++ b/client/cmixclient.cpp
@@ -66,7 +66,7 @@ void CMixClient::handle_key_exchange(size_t node_id, cmix_proto::KeyExchange con
if(std::all_of(shared_values.begin(), shared_values.end(), [](auto const& value){return value != nullptr;})) {
size_t len = get_group_element_array_size(&cmix_ctx);
std::vector<char> vec(len, '\0');
- std::string s = "\1";
+ std::string s = "abcdefghijklmnopqrstuvwxyz";
std::copy_n(s.begin(), s.size(), vec.begin() + 1);
cmix_proto::UserMessage message;
diff --git a/libcmix-crypto/elgamal/gcrypt/gcrypt_elgamal.c b/libcmix-crypto/elgamal/gcrypt/gcrypt_elgamal.c
index 8a6fb7e..2f48a9e 100644
--- a/libcmix-crypto/elgamal/gcrypt/gcrypt_elgamal.c
+++ b/libcmix-crypto/elgamal/gcrypt/gcrypt_elgamal.c
@@ -9,7 +9,7 @@
static gcry_mpi_t p;
static gcry_mpi_t q;
static gcry_mpi_t g;
-static unsigned int nr_bytes = 2;
+static unsigned int nr_bytes = 256;
void check(gcry_error_t error) {
if (error) {
@@ -45,13 +45,13 @@ void gcrypt_elgamal_initialize(void) {
gcry_control (GCRYCTL_INITIALIZATION_FINISHED, 0);
//leading 0 as specified by libgcrypt
- //char p_hex[] = "087A8E61DB4B6663CFFBBD19C651959998CEEF608660DD0F25D2CEED4435E3B00E00DF8F1D61957D4FAF7DF4561B2AA3016C3D91134096FAA3BF4296D830E9A7C209E0C6497517ABD5A8A9D306BCF67ED91F9E6725B4758C022E0B1EF4275BF7B6C5BFC11D45F9088B941F54EB1E59BB8BC39A0BF12307F5C4FDB70C581B23F76B63ACAE1CAA6B7902D52526735488A0EF13C6D9A51BFA4AB3AD8347796524D8EF6A167B5A41825D967E144E5140564251CCACB83E6B486F6B3CA3F7971506026C0B857F689962856DED4010ABD0BE621C3A3960A54E710C375F26375D7014103A4B54330C198AF126116D2276E11715F693877FAD7EF09CADB094AE91E1A1597";
- //char q_hex[] = "08CF83642A709A097B447997640129DA299B1A47D1EB3750BA308B0FE64F5FBD3";
- //char g_hex[] = "03FB32C9B73134D0B2E77506660EDBD484CA7B18F21EF205407F4793A1A0BA12510DBC15077BE463FFF4FED4AAC0BB555BE3A6C1B0C6B47B1BC3773BF7E8C6F62901228F8C28CBB18A55AE31341000A650196F931C77A57F2DDF463E5E9EC144B777DE62AAAB8A8628AC376D282D6ED3864E67982428EBC831D14348F6F2F9193B5045AF2767164E1DFC967C1FB3F2E55A4BD1BFFE83B9C80D052B985D182EA0ADB2A3B7313D3FE14C8484B1E052588B9B7D2BBD2DF016199ECD06E1557CD0915B3353BBB64E0EC377FD028370DF92B52C7891428CDC67EB6184B523D1DB246C32F63078490F00EF8D647D148D47954515E2327CFEF98C582664B4C0F6CC41659";
+ char p_hex[] = "087A8E61DB4B6663CFFBBD19C651959998CEEF608660DD0F25D2CEED4435E3B00E00DF8F1D61957D4FAF7DF4561B2AA3016C3D91134096FAA3BF4296D830E9A7C209E0C6497517ABD5A8A9D306BCF67ED91F9E6725B4758C022E0B1EF4275BF7B6C5BFC11D45F9088B941F54EB1E59BB8BC39A0BF12307F5C4FDB70C581B23F76B63ACAE1CAA6B7902D52526735488A0EF13C6D9A51BFA4AB3AD8347796524D8EF6A167B5A41825D967E144E5140564251CCACB83E6B486F6B3CA3F7971506026C0B857F689962856DED4010ABD0BE621C3A3960A54E710C375F26375D7014103A4B54330C198AF126116D2276E11715F693877FAD7EF09CADB094AE91E1A1597";
+ char q_hex[] = "08CF83642A709A097B447997640129DA299B1A47D1EB3750BA308B0FE64F5FBD3";
+ char g_hex[] = "03FB32C9B73134D0B2E77506660EDBD484CA7B18F21EF205407F4793A1A0BA12510DBC15077BE463FFF4FED4AAC0BB555BE3A6C1B0C6B47B1BC3773BF7E8C6F62901228F8C28CBB18A55AE31341000A650196F931C77A57F2DDF463E5E9EC144B777DE62AAAB8A8628AC376D282D6ED3864E67982428EBC831D14348F6F2F9193B5045AF2767164E1DFC967C1FB3F2E55A4BD1BFFE83B9C80D052B985D182EA0ADB2A3B7313D3FE14C8484B1E052588B9B7D2BBD2DF016199ECD06E1557CD0915B3353BBB64E0EC377FD028370DF92B52C7891428CDC67EB6184B523D1DB246C32F63078490F00EF8D647D148D47954515E2327CFEF98C582664B4C0F6CC41659";
- char p_hex[] = "0b";
- char q_hex[] = "00";
- char g_hex[] = "02";
+ //char p_hex[] = "0b";
+ //char q_hex[] = "00";
+ //char g_hex[] = "02";
size_t nr_bytes_scanned;
gcry_error_t error;
diff --git a/libcmix-network/client.hpp b/libcmix-network/client.hpp
index df8c0c4..c583628 100644
--- a/libcmix-network/client.hpp
+++ b/libcmix-network/client.hpp
@@ -174,7 +174,6 @@ public:
* \param message_handler The function to call when a message has been received.
*/
void async_receive(MessageHandler message_handler) {
- BOOST_LOG_TRIVIAL(trace) << socket.get();
using namespace boost::asio::placeholders;
boost::asio::async_read(
diff --git a/libcmix/cmix.c b/libcmix/cmix.c
index 4465011..9db4dbb 100644
--- a/libcmix/cmix.c
+++ b/libcmix/cmix.c
@@ -268,31 +268,38 @@ enum cmix_error post_process(struct CMixContext* ctx, char* r_out, char* m_out,
GroupElement msg = ctx->api.array_to_element(m_epirs, get_group_element_array_size(ctx), true);
GroupElement pirs = ctx->api.multiply(D, msg, true);
element_to_buffer(ctx, m_out, pirs);
- GroupElement new_r = ctx->api.multiply(x, D, true);
- element_to_buffer(ctx, r_out, new_r);
+ //GroupElement new_r = ctx->api.multiply(x, D, true);
+ //element_to_buffer(ctx, r_out, new_r);
+
+ memcpy(r_out, r_epirs, get_group_element_array_size(ctx));
ctx->pirs[index] = pirs; // this is not always usable as only the last node will be able to use this effectively, but we store it anyways.
ctx->api.free_group_element(x);
ctx->api.free_group_element(D);
ctx->api.free_group_element(msg);
- ctx->api.free_group_element(new_r);
+ //ctx->api.free_group_element(new_r);
return no_error;
}
enum cmix_error blind_message(struct CMixContext const* ctx, char* m_out, char const* message, GroupElement const* keys, size_t const nr_nodes) {
- size_t len = get_group_element_array_size(ctx);
+ size_t len = get_group_element_array_size(ctx);
+
+ GroupElement* intermediates = (GroupElement*) calloc(nr_nodes + 1, sizeof(GroupElement));
- GroupElement mes = ctx->api.array_to_element(message, len, true);
+ intermediates[0] = ctx->api.array_to_element(message, len, true);
for(size_t i = 0; i < nr_nodes; ++i) {
- ctx->api.multiply(mes, mes, keys[i]);
+ intermediates[i+1] = ctx->api.multiply(intermediates[i], keys[i], false);
}
- element_to_buffer(ctx, m_out, mes);
+ element_to_buffer(ctx, m_out, intermediates[nr_nodes]);
- ctx->api.free_group_element(mes);
+ for(size_t i = 0; i < nr_nodes + 1; ++i) {
+ ctx->api.free_group_element(intermediates[i]);
+ }
+ free(intermediates);
return no_error;
}
diff --git a/node/node.cpp b/node/node.cpp
index 5bce063..0f2bae5 100644
--- a/node/node.cpp
+++ b/node/node.cpp
@@ -215,7 +215,19 @@ void Node::start_realtime_phase() {
generate_random_message(&cmix_ctx, v.data());
swap_k_for_r(&cmix_ctx, &(*realpre.mutable_m(index))[0], v.data(), data[handle].shared_value, index);
} else {
- swap_k_for_r(&cmix_ctx, &(*realpre.mutable_m(index))[0], queue.front().data(), data[handle].shared_value, index);
+ std::string x = to_string(data.at(handle).shared_value, cmix_ctx);
+ {
+ std::stringstream ss;
+ ss << "shared_key: ";
+ for(auto&& c : x) {
+ ss << "\\" << std::setw(3) << std::setfill('0') << std::oct << (unsigned int) c;
+ }
+ BOOST_LOG_TRIVIAL(trace) << ss.str();
+ }
+
+ BOOST_LOG_TRIVIAL(trace) <<
+
+ swap_k_for_r(&cmix_ctx, &(*realpre.mutable_m(index))[0], queue.front().data(), data.at(handle).shared_value, index);
}
*realpre.mutable_h(index) = handle;
}
diff --git a/node/node_node.cpp b/node/node_node.cpp
index f24ff0a..e0ee237 100644
--- a/node/node_node.cpp
+++ b/node/node_node.cpp
@@ -115,8 +115,6 @@ cmix_proto::PrePost fill_precomputation_post_message(CMixContext& ctx, T const&
BOOST_LOG_TRIVIAL(trace) << ss.str();
}
- *prepost.mutable_r_epirs(i) = rs.Get(i);
- *prepost.mutable_m_epirs(i) = ms.Get(i);
}
return prepost;
@@ -132,6 +130,16 @@ cmix_proto::RealPre fill_realtime_pre_message(CMixContext& ctx, T const& hs, T c
realpre.add_m();
realpre.mutable_m(i)->resize(len);
+ std::string x = to_string(data.at(hs.Get(i)).shared_value, ctx);
+ {
+ std::stringstream ss;
+ ss << "shared_key: ";
+ for(auto&& c : x) {
+ ss << "\\" << std::setw(3) << std::setfill('0') << std::oct << (unsigned int) c;
+ }
+ BOOST_LOG_TRIVIAL(trace) << ss.str();
+ }
+
swap_k_for_r(
&ctx,
&(*realpre.mutable_m(i))[0],