MOTION  0.01
Framework for mixed-protocol multi-party computation
sp_provider.h
Go to the documentation of this file.
1 // MIT License
2 //
3 // Copyright (c) 2019 Lennart Braun
4 // Cryptography and Privacy Engineering Group (ENCRYPTO)
5 // TU Darmstadt, Germany
6 //
7 // Permission is hereby granted, free of charge, to any person obtaining a copy
8 // of this software and associated documentation files (the "Software"), to deal
9 // in the Software without restriction, including without limitation the rights
10 // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
11 // copies of the Software, and to permit persons to whom the Software is
12 // furnished to do so, subject to the following conditions:
13 //
14 // The above copyright notice and this permission notice shall be included in all
15 // copies or substantial portions of the Software.
16 //
17 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
18 // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
19 // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
20 // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
21 // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
22 // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
23 // SOFTWARE.
24 
25 #pragma once
26 
27 #include <cstdint>
28 #include <list>
29 #include <memory>
30 #include <stdexcept>
31 #include <type_traits>
32 #include <vector>
33 
36 
37 namespace encrypto::motion {
38 
39 class OtProvider;
40 class OtVectorSender;
41 class OtVectorReceiver;
42 struct RunTimeStatistics;
43 class Logger;
44 
45 template <typename T, typename = std::enable_if_t<std::is_unsigned_v<T>>>
46 struct SpVector {
47  std::vector<T> a, c; // c[i] = a[i]^2
48 };
49 
50 // Provider for Square Pairs (SPs),
51 // sharings of random (a, c) s.t. a^2 = c
52 class SpProvider {
53  public:
54  virtual ~SpProvider() = default;
55 
56  bool NeedSps() const noexcept;
57 
58  template <typename T>
59  std::size_t GetNumberOfSps() const noexcept {
60  if constexpr (std::is_same_v<T, std::uint8_t>) {
61  return number_of_sps_8_;
62  } else if constexpr (std::is_same_v<T, std::uint16_t>) {
63  return number_of_sps_16_;
64  } else if constexpr (std::is_same_v<T, std::uint32_t>) {
65  return number_of_sps_32_;
66  } else if constexpr (std::is_same_v<T, std::uint64_t>) {
67  return number_of_sps_64_;
68  } else if constexpr (std::is_same_v<T, __uint128_t>) {
69  return number_of_sps_128_;
70  } else {
71  throw std::runtime_error("Unknown type");
72  }
73  }
74 
75  template <typename T, typename = std::enable_if_t<std::is_unsigned_v<T>>>
76  std::size_t RequestSps(const std::size_t number_of_sps) noexcept {
77  std::size_t offset;
78  if constexpr (std::is_same_v<T, std::uint8_t>) {
79  offset = number_of_sps_8_;
80  number_of_sps_8_ += number_of_sps;
81  } else if constexpr (std::is_same_v<T, std::uint16_t>) {
82  offset = number_of_sps_16_;
83  number_of_sps_16_ += number_of_sps;
84  } else if constexpr (std::is_same_v<T, std::uint32_t>) {
85  offset = number_of_sps_32_;
86  number_of_sps_32_ += number_of_sps;
87  } else if constexpr (std::is_same_v<T, std::uint64_t>) {
88  offset = number_of_sps_64_;
89  number_of_sps_64_ += number_of_sps;
90  } else if constexpr (std::is_same_v<T, __uint128_t>) {
91  offset = number_of_sps_128_;
92  number_of_sps_128_ += number_of_sps;
93  } else {
94  throw std::runtime_error("Unknown type");
95  }
96  return offset;
97  }
98 
99  template <typename T, typename = std::enable_if_t<std::is_unsigned_v<T>>>
100  SpVector<T> GetSps(const std::size_t offset, const std::size_t n = 1) {
101  WaitFinished();
102  if constexpr (std::is_same_v<T, std::uint8_t>) {
103  return GetSps(sps_8_, offset, n);
104  } else if constexpr (std::is_same_v<T, std::uint16_t>) {
105  return GetSps(sps_16_, offset, n);
106  } else if constexpr (std::is_same_v<T, std::uint32_t>) {
107  return GetSps(sps_32_, offset, n);
108  } else if constexpr (std::is_same_v<T, std::uint64_t>) {
109  return GetSps(sps_64_, offset, n);
110  } else if constexpr (std::is_same_v<T, __uint128_t>) {
111  return GetSps(sps_128_, offset, n);
112  } else {
113  throw std::runtime_error("Unknown type");
114  }
115  }
116 
117  template <typename T, typename = std::enable_if_t<std::is_unsigned_v<T>>>
118  const SpVector<T>& GetSpsAll() noexcept {
119  WaitFinished();
120  if constexpr (std::is_same_v<T, std::uint8_t>) {
121  return sps_8_;
122  } else if constexpr (std::is_same_v<T, std::uint16_t>) {
123  return sps_16_;
124  } else if constexpr (std::is_same_v<T, std::uint32_t>) {
125  return sps_32_;
126  } else if constexpr (std::is_same_v<T, std::uint64_t>) {
127  return sps_64_;
128  } else if constexpr (std::is_same_v<T, __uint128_t>) {
129  return sps_128_;
130  } else {
131  throw std::runtime_error("Unknown type");
132  }
133  }
134 
135  virtual void PreSetup() = 0;
136  virtual void Setup() = 0;
137 
138  // blocking wait
139  void WaitFinished() { finished_condition_->Wait(); }
140 
141  protected:
142  SpProvider(const std::size_t my_id);
143  SpProvider() = delete;
144 
147 
153 
154  const std::size_t my_id_;
155 
156  bool finished_ = false;
157  std::shared_ptr<FiberCondition> finished_condition_;
158 
159  private:
160  template <typename T, typename = std::enable_if_t<std::is_unsigned_v<T>>>
161  inline SpVector<T> GetSps(const SpVector<T>& sps, const std::size_t offset,
162  const std::size_t n) const {
163  assert(sps.a.size() == sps.c.size());
164  assert(offset + n <= sps.a.size());
165 
166  return SpVector<T>{std::vector<T>(sps.a.begin() + offset, sps.a.begin() + offset + n),
167  std::vector<T>(sps.c.begin() + offset, sps.c.begin() + offset + n)};
168  }
169 };
170 
171 class SpProviderFromOts final : public SpProvider {
172  public:
173  SpProviderFromOts(std::vector<std::unique_ptr<OtProvider>>& ot_providers, const std::size_t my_id,
174  Logger& logger, RunTimeStatistics& run_time_statistics);
175 
176  void PreSetup() final override;
177 
178  // needs completed OTExtension
179  void Setup() final override;
180 
181  private:
182  void RegisterOts();
183 
184  void ParseOutputs();
185 
186  std::vector<std::unique_ptr<OtProvider>>& ot_providers_;
187 
188  // use alternating party roles for load balancing
189  std::vector<std::list<std::unique_ptr<AcOtReceiver<std::uint8_t>>>> ots_receiver_8_;
190  std::vector<std::list<std::unique_ptr<AcOtSender<std::uint8_t>>>> ots_sender_8_;
191 
192  std::vector<std::list<std::unique_ptr<AcOtReceiver<std::uint16_t>>>> ots_receiver_16_;
193  std::vector<std::list<std::unique_ptr<AcOtSender<std::uint16_t>>>> ots_sender_16_;
194 
195  std::vector<std::list<std::unique_ptr<AcOtReceiver<std::uint32_t>>>> ots_receiver_32_;
196  std::vector<std::list<std::unique_ptr<AcOtSender<std::uint32_t>>>> ots_sender_32_;
197 
198  std::vector<std::list<std::unique_ptr<AcOtReceiver<std::uint64_t>>>> ots_receiver_64_;
199  std::vector<std::list<std::unique_ptr<AcOtSender<std::uint64_t>>>> ots_sender_64_;
200 
201  std::vector<std::list<std::unique_ptr<AcOtReceiver<__uint128_t>>>> ots_receiver_128_;
202  std::vector<std::list<std::unique_ptr<AcOtSender<__uint128_t>>>> ots_sender_128_;
203 
204  const std::size_t kMaxBatchSize{10'000};
205 
206  Logger& logger_;
207  RunTimeStatistics& run_time_statistics_;
208 };
209 
210 } // namespace encrypto::motion
encrypto::motion::RunTimeStatistics::RecordEnd
void RecordEnd()
Definition: run_time_statistics.h:62
encrypto::motion::ParseHelperSend
static void ParseHelperSend(std::list< std::unique_ptr< AcOtSender< T >>> &ots_sender, std::size_t max_batch_size, SpVector< T > &sps, std::size_t number_of_sps)
Definition: sp_provider.cpp:214
encrypto::motion::SpProvider::sps_16_
SpVector< std::uint16_t > sps_16_
Definition: sp_provider.h:149
encrypto::motion::SpVector
Definition: sp_provider.h:46
encrypto::motion::SpProvider::NeedSps
bool NeedSps() const noexcept
Definition: sp_provider.cpp:33
fiber_condition.h
encrypto::motion::OtProvider
Definition: ot_provider.h:204
encrypto::motion::Logger
Definition: logger.h:40
encrypto::motion::SpProvider::number_of_sps_8_
std::size_t number_of_sps_8_
Definition: sp_provider.h:145
encrypto::motion::AcOtReceiver
Definition: ot_flavors.h:405
encrypto::motion::ParseHelperReceive
static void ParseHelperReceive(std::list< std::unique_ptr< AcOtReceiver< T >>> &ots_receiver, std::size_t max_batch_size, SpVector< T > &sps, std::size_t number_of_sps)
Definition: sp_provider.cpp:235
encrypto::motion::SpProvider::sps_32_
SpVector< std::uint32_t > sps_32_
Definition: sp_provider.h:150
encrypto::motion::SpProvider::sps_64_
SpVector< std::uint64_t > sps_64_
Definition: sp_provider.h:151
encrypto::motion::SpProvider::GetSps
SpVector< T > GetSps(const std::size_t offset, const std::size_t n=1)
Definition: sp_provider.h:100
encrypto::motion::SpVector::a
std::vector< T > a
Definition: sp_provider.h:47
encrypto::motion::SpProvider::sps_8_
SpVector< std::uint8_t > sps_8_
Definition: sp_provider.h:148
encrypto::motion::SpProvider::number_of_sps_128_
std::size_t number_of_sps_128_
Definition: sp_provider.h:146
encrypto::motion::BitVector<>
encrypto::motion::Logger::LogDebug
void LogDebug(const std::string &message)
Definition: logger.cpp:142
encrypto::motion::RunTimeStatistics::StatisticsId::kSpPresetup
@ kSpPresetup
encrypto::motion::SpProvider::WaitFinished
void WaitFinished()
Definition: sp_provider.h:139
encrypto::motion::RegisterHelperReceptor
static void RegisterHelperReceptor(OtProvider &ot_provider, std::list< std::unique_ptr< AcOtReceiver< T >>> &ots_receiver, std::size_t max_batch_size, const SpVector< T > &sps, std::size_t number_of_sps)
Definition: sp_provider.cpp:152
encrypto::motion::SpProviderFromOts
Definition: sp_provider.h:171
geninput.choices
choices
Definition: geninput.py:153
encrypto::motion::SpProvider::SpProvider
SpProvider()=delete
encrypto::motion::SpProvider::Setup
virtual void Setup()=0
ot_provider.h
encrypto::motion::AcOtSender
Definition: ot_flavors.h:356
encrypto::motion::SpProvider::~SpProvider
virtual ~SpProvider()=default
encrypto::motion::SpProvider::number_of_sps_64_
std::size_t number_of_sps_64_
Definition: sp_provider.h:145
encrypto::motion::SpProvider::my_id_
const std::size_t my_id_
Definition: sp_provider.h:154
encrypto::motion::SpProvider
Definition: sp_provider.h:52
logger.h
encrypto::motion
Definition: algorithm_description.cpp:35
encrypto::motion::SpProvider::number_of_sps_16_
std::size_t number_of_sps_16_
Definition: sp_provider.h:145
encrypto::motion::RunTimeStatistics
Definition: run_time_statistics.h:32
ot_flavors.h
encrypto::motion::OtProvider::RegisterReceiveAcOt
std::unique_ptr< AcOtReceiver< T > > RegisterReceiveAcOt(std::size_t number_of_ots=1, std::size_t vector_size=1)
Definition: ot_provider.cpp:129
encrypto::motion::GenerateRandomPairs
static void GenerateRandomPairs(SpVector< T > &sps, std::size_t number_of_sps)
Definition: sp_provider.cpp:119
encrypto::motion::SpProvider::PreSetup
virtual void PreSetup()=0
encrypto::motion::SpProvider::RequestSps
std::size_t RequestSps(const std::size_t number_of_sps) noexcept
Definition: sp_provider.h:76
encrypto::motion::RegisterHelperSend
static void RegisterHelperSend(OtProvider &ot_provider, std::list< std::unique_ptr< AcOtSender< T >>> &ots_sender, std::size_t max_batch_size, const SpVector< T > &sps, std::size_t number_of_sps)
Definition: sp_provider.cpp:129
constants.h
encrypto::motion::SpProviderFromOts::PreSetup
void PreSetup() final override
Definition: sp_provider.cpp:60
encrypto::motion::kDebug
constexpr bool kDebug
Definition: config.h:36
encrypto::motion::SpProvider::GetNumberOfSps
std::size_t GetNumberOfSps() const noexcept
Definition: sp_provider.h:59
run_time_statistics.h
encrypto::motion::SpProviderFromOts::Setup
void Setup() final override
Definition: sp_provider.cpp:78
encrypto::motion::RunTimeStatistics::RecordStart
void RecordStart()
Definition: run_time_statistics.h:56
encrypto::motion::SpVector::c
std::vector< T > c
Definition: sp_provider.h:47
encrypto::motion::OtProvider::RegisterSendAcOt
std::unique_ptr< AcOtSender< T > > RegisterSendAcOt(std::size_t number_of_ots=1, std::size_t vector_size=1)
Definition: ot_provider.cpp:77
encrypto::motion::SpProvider::sps_128_
SpVector< __uint128_t > sps_128_
Definition: sp_provider.h:152
encrypto::motion::SpProvider::number_of_sps_32_
std::size_t number_of_sps_32_
Definition: sp_provider.h:145
encrypto::motion::SpProvider::GetSpsAll
const SpVector< T > & GetSpsAll() noexcept
Definition: sp_provider.h:118
encrypto::motion::SpProviderFromOts::SpProviderFromOts
SpProviderFromOts(std::vector< std::unique_ptr< OtProvider >> &ot_providers, const std::size_t my_id, Logger &logger, RunTimeStatistics &run_time_statistics)
Definition: sp_provider.cpp:42
encrypto::motion::SpProvider::finished_
bool finished_
Definition: sp_provider.h:156
encrypto::motion::RunTimeStatistics::StatisticsId::kSpSetup
@ kSpSetup
encrypto::motion::SpProvider::finished_condition_
std::shared_ptr< FiberCondition > finished_condition_
Definition: sp_provider.h:157
sp_provider.h