MOTION  0.01
Framework for mixed-protocol multi-party computation
mt_provider.h
Go to the documentation of this file.
1 // MIT License
2 //
3 // Copyright (c) 2019 Oleksandr Tkachenko
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 <list>
28 
30 #include "utility/bit_vector.h"
32 #include "utility/helpers.h"
33 
34 namespace encrypto::motion {
35 
36 struct RunTimeStatistics;
37 class Logger;
38 
39 template <typename T, typename = std::enable_if_t<std::is_unsigned_v<T>>>
41  std::vector<T> a, b, c; // c[i] = a[i] * b[i]
42 };
43 
45  BitVector<> a, b, c; // c[i] = a[i] ^ b[i]
46 };
47 
48 class MtProvider {
49  public:
50  virtual ~MtProvider() = default;
51 
52  bool NeedMts() const noexcept;
53 
54  template <typename T>
55  std::size_t GetNumberOfMts() const noexcept {
56  if constexpr (std::is_same_v<T, bool>) {
57  return number_of_bit_mts_;
58  } else if constexpr (std::is_same_v<T, std::uint8_t>) {
59  return number_of_mts_8_;
60  } else if constexpr (std::is_same_v<T, std::uint16_t>) {
61  return number_of_mts_16_;
62  } else if constexpr (std::is_same_v<T, std::uint32_t>) {
63  return number_of_mts_32_;
64  } else if constexpr (std::is_same_v<T, std::uint64_t>) {
65  return number_of_mts_64_;
66  } else {
67  throw std::runtime_error("Unknown type");
68  }
69  }
70 
71  std::size_t RequestBinaryMts(const std::size_t number_of_mts) noexcept;
72 
73  template <typename T, typename = std::enable_if_t<std::is_unsigned_v<T>>>
74  std::size_t RequestArithmeticMts(const std::size_t number_of_mts) noexcept {
75  std::size_t offset;
76  if constexpr (std::is_same_v<T, std::uint8_t>) {
77  offset = number_of_mts_8_;
78  number_of_mts_8_ += number_of_mts;
79  } else if constexpr (std::is_same_v<T, std::uint16_t>) {
80  offset = number_of_mts_16_;
81  number_of_mts_16_ += number_of_mts;
82  } else if constexpr (std::is_same_v<T, std::uint32_t>) {
83  offset = number_of_mts_32_;
84  number_of_mts_32_ += number_of_mts;
85  } else if constexpr (std::is_same_v<T, std::uint64_t>) {
86  offset = number_of_mts_64_;
87  number_of_mts_64_ += number_of_mts;
88  } else {
89  throw std::runtime_error("Unknown type");
90  }
91  return offset;
92  }
93 
94  // get bits [i, i+n] as vector
95  BinaryMtVector GetBinary(const std::size_t offset, const std::size_t n = 1) const;
96 
97  const BinaryMtVector& GetBinaryAll() const noexcept;
98 
99  template <typename T, typename = std::enable_if_t<std::is_unsigned_v<T>>>
100  IntegerMtVector<T> GetInteger(const std::size_t offset, const std::size_t n = 1) const {
101  WaitFinished();
102  if constexpr (std::is_same_v<T, std::uint8_t>) {
103  return GetInteger(mts8_, offset, n);
104  } else if constexpr (std::is_same_v<T, std::uint16_t>) {
105  return GetInteger(mts16_, offset, n);
106  } else if constexpr (std::is_same_v<T, std::uint32_t>) {
107  return GetInteger(mts32_, offset, n);
108  } else if constexpr (std::is_same_v<T, std::uint64_t>) {
109  return GetInteger(mts64_, offset, n);
110  } else {
111  throw std::runtime_error("Unknown type");
112  }
113  }
114 
115  template <typename T, typename = std::enable_if_t<std::is_unsigned_v<T>>>
116  const IntegerMtVector<T>& GetIntegerAll() const noexcept {
117  WaitFinished();
118  if constexpr (std::is_same_v<T, std::uint8_t>) {
119  return mts8_;
120  } else if constexpr (std::is_same_v<T, std::uint16_t>) {
121  return mts16_;
122  } else if constexpr (std::is_same_v<T, std::uint32_t>) {
123  return mts32_;
124  } else if constexpr (std::is_same_v<T, std::uint64_t>) {
125  return mts64_;
126  } else {
127  throw std::runtime_error("Unknown type");
128  }
129  }
130 
131  virtual void PreSetup() = 0;
132  virtual void Setup() = 0;
133 
134  // blocking wait
135  void WaitFinished() const { finished_condition_->Wait(); }
136 
137  protected:
138  MtProvider(std::size_t my_id, std::size_t number_of_parties);
139  MtProvider() = delete;
140 
143 
145 
150 
151  const std::size_t my_id_;
152  const std::size_t number_of_parties_;
153 
154  std::atomic<bool> finished_{false};
155  std::shared_ptr<FiberCondition> finished_condition_;
156 
157  private:
158  template <typename T, typename = std::enable_if_t<std::is_unsigned_v<T>>>
159  inline IntegerMtVector<T> GetInteger(const IntegerMtVector<T>& mts, const std::size_t offset,
160  const std::size_t n) const {
161  assert(mts.a.size() == mts.b.size());
162  assert(mts.c.size() == mts.b.size());
163  assert(offset + n <= mts.a.size());
164 
165  return IntegerMtVector<T>{std::vector<T>(mts.a.begin() + offset, mts.a.begin + offset + n),
166  std::vector<T>(mts.b.begin() + offset, mts.b.begin + offset + n),
167  std::vector<T>(mts.c.begin() + offset, mts.c.begin + offset + n)};
168  }
169 };
170 
171 class MtProviderFromOts final : public MtProvider {
172  public:
173  MtProviderFromOts(std::vector<std::unique_ptr<OtProvider>>& ot_providers, const std::size_t my_id,
174  Logger& logger, RunTimeStatistics& run_time_statistics);
176 
177  void PreSetup() final override;
178 
179  // needs completed OTExtension
180  void Setup() final override;
181 
182  private:
183  void RegisterOts();
184 
185  void ParseOutputs();
186 
187  std::vector<std::unique_ptr<OtProvider>>& ot_providers_;
188 
189  // use alternating party roles for load balancing
190  std::vector<std::list<std::unique_ptr<AcOtReceiver<std::uint8_t>>>> ots_receiver_8_;
191  std::vector<std::list<std::unique_ptr<AcOtSender<std::uint8_t>>>> ots_sender_8_;
192 
193  std::vector<std::list<std::unique_ptr<AcOtReceiver<std::uint16_t>>>> ots_receiver_16_;
194  std::vector<std::list<std::unique_ptr<AcOtSender<std::uint16_t>>>> ots_sender_16_;
195 
196  std::vector<std::list<std::unique_ptr<AcOtReceiver<std::uint32_t>>>> ots_receiver_32_;
197  std::vector<std::list<std::unique_ptr<AcOtSender<std::uint32_t>>>> ots_sender_32_;
198 
199  std::vector<std::list<std::unique_ptr<AcOtReceiver<std::uint64_t>>>> ots_receiver_64_;
200  std::vector<std::list<std::unique_ptr<AcOtSender<std::uint64_t>>>> ots_sender_64_;
201 
202  std::vector<std::unique_ptr<XcOtBitReceiver>> bit_ots_receiver_;
203  std::vector<std::unique_ptr<XcOtBitSender>> bit_ots_sender_;
204 
205  // Should be divisible by 128
206  static inline constexpr std::size_t kMaxBatchSize{128 * 128};
207 
208  Logger& logger_;
209  RunTimeStatistics& run_time_statistics_;
210 };
211 
212 } // namespace encrypto::motion
encrypto::motion::RunTimeStatistics::RecordEnd
void RecordEnd()
Definition: run_time_statistics.h:62
encrypto::motion::MtProvider::GetInteger
IntegerMtVector< T > GetInteger(const std::size_t offset, const std::size_t n=1) const
Definition: mt_provider.h:100
encrypto::motion::MtProviderFromOts::Setup
void Setup() final override
Definition: mt_provider.cpp:105
encrypto::motion::XcOtBitSender::SetCorrelations
void SetCorrelations(BitVector<> &&correlations)
Definition: ot_flavors.h:185
encrypto::motion::ParseHelper
static void ParseHelper(std::list< std::unique_ptr< AcOtSender< T >>> &ots_sender, std::list< std::unique_ptr< AcOtReceiver< T >>> &ots_receiver, std::size_t max_batch_size, IntegerMtVector< T > &mts, std::size_t number_of_mts)
Definition: mt_provider.cpp:258
encrypto::motion::MtProvider::MtProvider
MtProvider()=delete
helpers.h
encrypto::motion::RegisterHelper
static void RegisterHelper(OtProvider &ot_provider, std::list< std::unique_ptr< AcOtSender< T >>> &ots_sender, std::list< std::unique_ptr< AcOtReceiver< T >>> &ots_receiver, std::size_t max_batch_size, const IntegerMtVector< T > &mts, std::size_t number_of_mts)
Definition: mt_provider.cpp:180
encrypto::motion::BinaryMtVector::b
BitVector b
Definition: mt_provider.h:45
encrypto::motion::BinaryMtVector
Definition: mt_provider.h:44
encrypto::motion::MtProvider::GetBinaryAll
const BinaryMtVector & GetBinaryAll() const noexcept
Definition: mt_provider.cpp:56
encrypto::motion::MtProvider::GetBinary
BinaryMtVector GetBinary(const std::size_t offset, const std::size_t n=1) const
Definition: mt_provider.cpp:47
encrypto::motion::MtProvider::GetNumberOfMts
std::size_t GetNumberOfMts() const noexcept
Definition: mt_provider.h:55
encrypto::motion::MtProvider::~MtProvider
virtual ~MtProvider()=default
encrypto::motion::MtProvider::GetIntegerAll
const IntegerMtVector< T > & GetIntegerAll() const noexcept
Definition: mt_provider.h:116
encrypto::motion::BitVector::SecureRandom
static BitVector SecureRandom(const std::size_t size) noexcept
Returns a random BitVector.
Definition: bit_vector.cpp:893
fiber_condition.h
encrypto::motion::MtProvider::mts16_
IntegerMtVector< std::uint16_t > mts16_
Definition: mt_provider.h:147
encrypto::motion::OtProvider
Definition: ot_provider.h:204
encrypto::motion::MtProvider::number_of_mts_16_
std::size_t number_of_mts_16_
Definition: mt_provider.h:141
encrypto::motion::BinaryMtVector::a
BitVector a
Definition: mt_provider.h:45
encrypto::motion::MtProvider::number_of_bit_mts_
std::size_t number_of_bit_mts_
Definition: mt_provider.h:141
encrypto::motion::Logger
Definition: logger.h:40
encrypto::motion::MtProvider::WaitFinished
void WaitFinished() const
Definition: mt_provider.h:135
encrypto::motion::AcOtReceiver
Definition: ot_flavors.h:405
bit_vector.h
encrypto::motion::BinaryMtVector::c
BitVector c
Definition: mt_provider.h:45
encrypto::motion::BasicOtReceiver::SetChoices
void SetChoices(BitVector<> &&choices)
Definition: ot_flavors.h:58
encrypto::motion::MtProvider::my_id_
const std::size_t my_id_
Definition: mt_provider.h:151
encrypto::motion::MtProvider::NeedMts
bool NeedMts() const noexcept
Definition: mt_provider.cpp:34
encrypto::motion::MtProvider
Definition: mt_provider.h:48
encrypto::motion::BitVector<>
encrypto::motion::Logger::LogDebug
void LogDebug(const std::string &message)
Definition: logger.cpp:142
encrypto::motion::XcOtBitReceiver::ComputeOutputs
void ComputeOutputs()
Definition: ot_flavors.cpp:395
encrypto::motion::MtProvider::number_of_parties_
const std::size_t number_of_parties_
Definition: mt_provider.h:152
encrypto::motion::MtProvider::finished_
std::atomic< bool > finished_
Definition: mt_provider.h:154
encrypto::motion::RunTimeStatistics::StatisticsId::kMtSetup
@ kMtSetup
geninput.choices
choices
Definition: geninput.py:153
encrypto::motion::MtProvider::finished_condition_
std::shared_ptr< FiberCondition > finished_condition_
Definition: mt_provider.h:155
encrypto::motion::MtProvider::number_of_mts_64_
std::size_t number_of_mts_64_
Definition: mt_provider.h:142
encrypto::motion::IntegerMtVector::c
std::vector< T > c
Definition: mt_provider.h:41
encrypto::motion::AcOtSender
Definition: ot_flavors.h:356
encrypto::motion::IntegerMtVector::a
std::vector< T > a
Definition: mt_provider.h:41
encrypto::motion::MtProvider::mts64_
IntegerMtVector< std::uint64_t > mts64_
Definition: mt_provider.h:149
encrypto::motion::MtProvider::mts8_
IntegerMtVector< std::uint8_t > mts8_
Definition: mt_provider.h:146
mt_provider.h
encrypto::motion::MtProvider::mts32_
IntegerMtVector< std::uint32_t > mts32_
Definition: mt_provider.h:148
encrypto::motion::MtProvider::RequestBinaryMts
std::size_t RequestBinaryMts(const std::size_t number_of_mts) noexcept
Definition: mt_provider.cpp:40
logger.h
encrypto::motion
Definition: algorithm_description.cpp:35
encrypto::motion::MtProvider::Setup
virtual void Setup()=0
encrypto::motion::BitVector::GetSize
auto GetSize() const noexcept
Get size of BitVector.
Definition: bit_vector.h:149
encrypto::motion::XcOtBitSender::GetOutputs
BitVector & GetOutputs()
Definition: ot_flavors.h:201
encrypto::motion::GenerateRandomTriplesBool
static void GenerateRandomTriplesBool(BinaryMtVector &bit_mts, std::size_t number_of_bit_mts)
Definition: mt_provider.cpp:150
encrypto::motion::MtProvider::bit_mts_
BinaryMtVector bit_mts_
Definition: mt_provider.h:144
encrypto::motion::RegisterHelperBool
static void RegisterHelperBool(OtProvider &ot_provider, std::unique_ptr< XcOtBitSender > &ots_sender, std::unique_ptr< XcOtBitReceiver > &ots_receiver, const BinaryMtVector &bit_mts, std::size_t number_of_bit_mts)
Definition: mt_provider.cpp:169
encrypto::motion::RunTimeStatistics::StatisticsId::kMtPresetup
@ kMtPresetup
encrypto::motion::MtProvider::number_of_mts_8_
std::size_t number_of_mts_8_
Definition: mt_provider.h:141
encrypto::motion::IntegerMtVector
Definition: mt_provider.h:40
encrypto::motion::ParseHelperBool
static void ParseHelperBool(std::unique_ptr< XcOtBitSender > &ots_sender, std::unique_ptr< XcOtBitReceiver > &ots_receiver, BinaryMtVector &bit_mts)
Definition: mt_provider.cpp:246
encrypto::motion::RunTimeStatistics
Definition: run_time_statistics.h:32
ot_flavors.h
encrypto::motion::OtProvider::RegisterReceiveXcOtBit
std::unique_ptr< XcOtBitReceiver > RegisterReceiveXcOtBit(std::size_t number_of_ots=1)
Definition: ot_provider.cpp:123
encrypto::motion::MtProvider::RequestArithmeticMts
std::size_t RequestArithmeticMts(const std::size_t number_of_mts) noexcept
Definition: mt_provider.h:74
encrypto::motion::XcOtBitSender::ComputeOutputs
void ComputeOutputs()
Definition: ot_flavors.cpp:338
encrypto::motion::MtProvider::PreSetup
virtual void PreSetup()=0
encrypto::motion::GenerateRandomTriples
static void GenerateRandomTriples(IntegerMtVector< T > &mts, std::size_t number_of_mts)
Definition: mt_provider.cpp:159
encrypto::motion::OtProvider::RegisterSendXcOtBit
std::unique_ptr< XcOtBitSender > RegisterSendXcOtBit(std::size_t number_of_ots=1)
Definition: ot_provider.cpp:71
encrypto::motion::MtProviderFromOts
Definition: mt_provider.h:171
encrypto::motion::MtProviderFromOts::MtProviderFromOts
MtProviderFromOts(std::vector< std::unique_ptr< OtProvider >> &ot_providers, const std::size_t my_id, Logger &logger, RunTimeStatistics &run_time_statistics)
Definition: mt_provider.cpp:66
encrypto::motion::MtProviderFromOts::PreSetup
void PreSetup() final override
Definition: mt_provider.cpp:86
encrypto::motion::IntegerMtVector::b
std::vector< T > b
Definition: mt_provider.h:41
encrypto::motion::XcOtBitReceiver::GetOutputs
BitVector & GetOutputs()
Definition: ot_flavors.h:311
constants.h
encrypto::motion::kDebug
constexpr bool kDebug
Definition: config.h:36
run_time_statistics.h
encrypto::motion::BitVector::Subset
BitVector Subset(std::size_t from, std::size_t to) const
Returns a new BitVector containing the bits of this BitVector between positions from and to.
Definition: bit_vector.cpp:806
encrypto::motion::RunTimeStatistics::RecordStart
void RecordStart()
Definition: run_time_statistics.h:56
encrypto::motion::MtProvider::number_of_mts_32_
std::size_t number_of_mts_32_
Definition: mt_provider.h:142
encrypto::motion::MtProviderFromOts::~MtProviderFromOts
~MtProviderFromOts()