From 65eb29435cfb31ffc37d757d90520ee0879bf671 Mon Sep 17 00:00:00 2001 From: Vincent Ehrmanntraut Date: Mon, 9 Dec 2024 14:21:02 +0100 Subject: [PATCH] Small cleanup --- Processor/Processor.hpp | 8 +-- Protocols/Rep3Shuffler.h | 6 ++- Protocols/Rep3Shuffler.hpp | 102 ++++++++++-------------------------- Protocols/SecureShuffle.h | 4 +- Protocols/SecureShuffle.hpp | 4 +- 5 files changed, 39 insertions(+), 85 deletions(-) diff --git a/Processor/Processor.hpp b/Processor/Processor.hpp index 1290ff97..6b4e29c9 100644 --- a/Processor/Processor.hpp +++ b/Processor/Processor.hpp @@ -897,10 +897,10 @@ void SubProcessor::apply_shuffle(const Instruction& instruction, const auto n_shuffles = args.size() / 5; vector sizes(n_shuffles, 0); - vector destinations(n_shuffles, 0); - vector sources(n_shuffles, 0); - vector unit_sizes(n_shuffles, 0); - vector shuffles(n_shuffles, 0); + vector destinations(n_shuffles, 0); + vector sources(n_shuffles, 0); + vector unit_sizes(n_shuffles, 0); + vector shuffles(n_shuffles, 0); vector reverse(n_shuffles, false); for (size_t i = 0; i < n_shuffles; i++) { sizes[i] = args[6 * i]; diff --git a/Protocols/Rep3Shuffler.h b/Protocols/Rep3Shuffler.h index b3de8496..047fee6c 100644 --- a/Protocols/Rep3Shuffler.h +++ b/Protocols/Rep3Shuffler.h @@ -29,8 +29,10 @@ public: void apply(vector& a, size_t n, int unit_size, size_t output_base, size_t input_base, shuffle_type& shuffle, bool reverse); - void applyMultiple(vector& a, vector& sizes, vector& destinations, vector& sources, - vector& unit_sizes, vector& handles, vector& reverse, store_type& store); + void applyMultiple(vector& a, vector& sizes, vector& destinations, vector& sources, + vector& unit_sizes, vector& handles, vector& reverse, store_type& store); + void applyMultiple(vector& a, vector& sizes, vector& destinations, vector& sources, + vector& unit_sizes, vector& shuffles, vector& reverse); void inverse_permutation(vector& stack, size_t n, size_t output_base, size_t input_base); diff --git a/Protocols/Rep3Shuffler.hpp b/Protocols/Rep3Shuffler.hpp index 0b7ecd16..81bc5a07 100644 --- a/Protocols/Rep3Shuffler.hpp +++ b/Protocols/Rep3Shuffler.hpp @@ -49,84 +49,36 @@ void Rep3Shuffler::apply(vector& a, size_t n, int unit_size, size_t output_base, size_t input_base, shuffle_type& shuffle, bool reverse) { - assert(proc.P.num_players() == 3); - assert(not T::malicious); - assert(not T::dishonest_majority); - assert(n % unit_size == 0); - - if (shuffle.empty()) - throw runtime_error("shuffle has been deleted"); - - vector to_shuffle; - for (size_t i = 0; i < n; i++) - to_shuffle.push_back(a[input_base + i]); - - typename T::Input input(proc); - - vector to_share(n); - - for (int ii = 0; ii < 3; ii++) - { - int i; - if (reverse) - i = 2 - ii; - else - i = ii; - - if (proc.P.get_player(i) == 0) - { - for (size_t j = 0; j < n / unit_size; j++) - for (int k = 0; k < unit_size; k++) - if (reverse) - to_share.at(j * unit_size + k) = to_shuffle.at( - shuffle[0].at(j) * unit_size + k).sum(); - else - to_share.at(shuffle[0].at(j) * unit_size + k) = - to_shuffle.at(j * unit_size + k).sum(); - } - else if (proc.P.get_player(i) == 1) - { - for (size_t j = 0; j < n / unit_size; j++) - for (int k = 0; k < unit_size; k++) - if (reverse) - to_share[j * unit_size + k] = to_shuffle[shuffle[1][j] - * unit_size + k][0]; - else - to_share[shuffle[1][j] * unit_size + k] = to_shuffle[j - * unit_size + k][0]; - } - - input.reset_all(proc.P); - - if (proc.P.get_player(i) < 2) - for (auto& x : to_share) - input.add_mine(x); - - for (int k = 0; k < 2; k++) - input.add_other((-i + 3 + k) % 3); - - input.exchange(); - to_shuffle.clear(); - - for (size_t j = 0; j < n; j++) - { - T x = input.finalize((-i + 3) % 3) + input.finalize((-i + 4) % 3); - to_shuffle.push_back(x); - } - } - - for (size_t i = 0; i < n; i++) - a[output_base + i] = to_shuffle[i]; + vector sizes { n }; + vector unit_sizes { static_cast(unit_size) }; + vector destinations { output_base }; + vector sources { input_base }; + vector shuffles { shuffle }; + vector reverses { reverse }; + this->applyMultiple(a, sizes, unit_sizes, destinations, sources, shuffles, reverses); } template -void Rep3Shuffler::applyMultiple(vector& a, vector& sizes, vector& destinations, vector& sources, - vector& unit_sizes, vector& handles, vector& reverses, store_type& store) { +void Rep3Shuffler::applyMultiple(vector& a, vector& sizes, vector& destinations, vector& sources, + vector& unit_sizes, vector& handles, vector& reverses, store_type& store) { + vector shuffles; + for (size_t &handle : handles) { + shuffle_type& shuffle = store.get(handle); + shuffles.push_back(shuffle); + } + + applyMultiple(a, sizes, destinations, sources, unit_sizes, shuffles, reverses); +} + +template +void Rep3Shuffler::applyMultiple(vector &a, vector &sizes, vector &destinations, + vector &sources, vector &unit_sizes, vector &shuffles, vector &reverses) +{ const auto n_shuffles = sizes.size(); assert(sources.size() == n_shuffles); assert(destinations.size() == n_shuffles); assert(unit_sizes.size() == n_shuffles); - assert(handles.size() == n_shuffles); + assert(shuffles.size() == n_shuffles); assert(reverses.size() == n_shuffles); assert(proc.P.num_players() == 3); @@ -145,7 +97,7 @@ void Rep3Shuffler::applyMultiple(vector& a, vector& sizes, vector< x.push_back(a[sources[current_shuffle] + j]); to_shuffle.push_back(x); - const auto shuffle = store.get(handles[current_shuffle]); + const auto& shuffle = shuffles[current_shuffle]; if (shuffle.empty()) throw runtime_error("shuffle has been deleted"); } @@ -160,7 +112,7 @@ void Rep3Shuffler::applyMultiple(vector& a, vector& sizes, vector< for (size_t current_shuffle = 0; current_shuffle < n_shuffles; current_shuffle++) { const auto n = sizes[current_shuffle]; const auto unit_size = unit_sizes[current_shuffle]; - const auto shuffle = store.get(handles[current_shuffle]); + const auto& shuffle = shuffles[current_shuffle]; const auto reverse = reverses[current_shuffle]; const auto current_to_shuffle = to_shuffle[current_shuffle]; @@ -173,7 +125,7 @@ void Rep3Shuffler::applyMultiple(vector& a, vector& sizes, vector< if (proc.P.get_player(i) == 0) { for (size_t j = 0; j < n / unit_size; j++) - for (int k = 0; k < unit_size; k++) + for (size_t k = 0; k < unit_size; k++) if (reverse) to_share.at(j * unit_size + k) = current_to_shuffle.at( shuffle[0].at(j) * unit_size + k).sum(); @@ -184,7 +136,7 @@ void Rep3Shuffler::applyMultiple(vector& a, vector& sizes, vector< else if (proc.P.get_player(i) == 1) { for (size_t j = 0; j < n / unit_size; j++) - for (int k = 0; k < unit_size; k++) + for (size_t k = 0; k < unit_size; k++) if (reverse) to_share[j * unit_size + k] = current_to_shuffle[shuffle[1][j] * unit_size + k][0]; else diff --git a/Protocols/SecureShuffle.h b/Protocols/SecureShuffle.h index d73189d6..1e42310a 100644 --- a/Protocols/SecureShuffle.h +++ b/Protocols/SecureShuffle.h @@ -104,8 +104,8 @@ public: void apply(vector& a, size_t n, int unit_size, size_t output_base, size_t input_base, shuffle_type& shuffle, bool reverse); - void applyMultiple(vector& a, vector& sizes, vector& destinations, vector& sources, - vector& unit_sizes, vector& handles, vector& reverse, store_type& store); + void applyMultiple(vector& a, vector& sizes, vector& destinations, vector& sources, + vector& unit_sizes, vector& handles, vector& reverse, store_type& store); /** * Calculate the secret inverse permutation of stack given secret permutation. diff --git a/Protocols/SecureShuffle.hpp b/Protocols/SecureShuffle.hpp index f45a63e1..59334d23 100644 --- a/Protocols/SecureShuffle.hpp +++ b/Protocols/SecureShuffle.hpp @@ -98,8 +98,8 @@ void SecureShuffle::apply(vector& a, size_t n, int unit_size, size_t outpu template -void SecureShuffle::applyMultiple(vector& a, vector& sizes, vector& destinations, vector& sources, - vector& unit_sizes, vector& handles, vector& reverse, store_type& store) { +void SecureShuffle::applyMultiple(vector& a, vector& sizes, vector& destinations, vector& sources, + vector& unit_sizes, vector& handles, vector& reverse, store_type& store) { const auto n_shuffles = sizes.size(); assert(sources.size() == n_shuffles); assert(destinations.size() == n_shuffles);