diff options
Diffstat (limited to 'node/node.cpp')
| -rw-r--r-- | node/node.cpp | 61 |
1 files changed, 37 insertions, 24 deletions
diff --git a/node/node.cpp b/node/node.cpp index b29a873..3ad4a2d 100644 --- a/node/node.cpp +++ b/node/node.cpp @@ -208,34 +208,47 @@ void Node::start_realtime_phase() { cmix_proto::RealPre realpre; size_t len = get_group_element_array_size(&cmix_ctx); - for(auto&& pair : index_map) { - realpre.add_h(); - realpre.add_m(); - realpre.mutable_m(pair.second)->resize(len); - std::decay<decltype(pair)>::type::first_type const& handle = pair.first; - std::decay<decltype(pair)>::type::second_type const& index = pair.second; + + std::vector<char*> ms(index_map.size(), nullptr); + std::vector<char const*> msv(index_map.size(), nullptr); + std::vector<GroupElement> keys(index_map.size(), nullptr); + auto it = index_map.begin(); + for(size_t i = 0; i < index_map.size(); ++i) { + auto handle = it->first; + auto index = it->second; + + std::string* m = realpre.add_m(); + m->resize(len); + ms[i] = &(*m)[0]; - auto& queue = messages[pair.first]; + auto& queue = messages.at(handle); if(queue.empty()) { - std::vector<char> v(len); - 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 { - 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(); - } + std::string v; + v.resize(len); + generate_random_message(&cmix_ctx, &v[0]); + queue.push(v); + } - BOOST_LOG_TRIVIAL(trace) << + msv[i] = queue.front().data(); - 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; + keys[i] = data.at(handle).shared_value; + + realpre.add_h(handle); + + it++; } + + swap_k_for_r( + &cmix_ctx, + ms.data(), + msv.data(), + keys.data(), + index_map.size() + ); + + for(auto&& pair : index_map) { + messages.at(pair.first).pop(); + } + next_node.async_send(realpre); } |
