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