diff options
| author | Dennis Brentjes <d.brentjes@gmail.com> | 2016-11-16 19:55:11 +0100 |
|---|---|---|
| committer | Dennis Brentjes <d.brentjes@gmail.com> | 2016-11-16 19:55:11 +0100 |
| commit | 6ae607cc84b671810fca9c24b1c131ca12d922e7 (patch) | |
| tree | e078e5e30cf2f979a1dbd0baefd18a9f58191f07 | |
| parent | f93d52bbd0053574fb35d72b85c4b299dc1f3ee5 (diff) | |
| download | cmix-6ae607cc84b671810fca9c24b1c131ca12d922e7.tar.gz cmix-6ae607cc84b671810fca9c24b1c131ca12d922e7.tar.bz2 cmix-6ae607cc84b671810fca9c24b1c131ca12d922e7.zip | |
Working implementation of elgamal in 2048 bit multiplicative group.
| -rw-r--r-- | client/cmixclient.cpp | 2 | ||||
| -rw-r--r-- | libcmix-crypto/elgamal/gcrypt/gcrypt_elgamal.c | 14 | ||||
| -rw-r--r-- | libcmix-network/client.hpp | 1 | ||||
| -rw-r--r-- | libcmix/cmix.c | 23 | ||||
| -rw-r--r-- | node/node.cpp | 14 | ||||
| -rw-r--r-- | node/node_node.cpp | 12 |
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], |
