MOTION  0.01
Framework for mixed-protocol multi-party computation
ot_extension_data.h
Go to the documentation of this file.
1 // MIT License
2 //
3 // Copyright (c) 2019 Oleksandr Tkachenko, 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 <array>
28 #include <atomic>
29 #include <cstddef>
30 #include <memory>
31 #include <mutex>
32 #include <queue>
33 #include <unordered_map>
34 #include <unordered_set>
35 #include <vector>
36 
37 #include "utility/bit_matrix.h"
38 #include "utility/bit_vector.h"
39 #include "utility/block.h"
40 #include "utility/meta.hpp"
42 
43 namespace encrypto::motion {
44 
45 class FiberCondition;
46 
47 enum OtExtensionDataType : unsigned int {
52 };
53 
54 enum class OtMessageType {
56  kBit,
57  kBlock128,
58  kUint8,
59  kUint16,
60  kUint32,
61  kUint64,
62  kUint128
63 };
64 
67  ~OtExtensionReceiverData() = default;
68 
70  std::size_t ot_id, std::size_t size);
71  [[nodiscard]] ReusableFiberFuture<BitVector<>> RegisterForBitSenderMessage(std::size_t ot_id,
72  std::size_t size);
74  std::size_t ot_id, std::size_t size, std::size_t bitlength);
75  template <typename T>
76  [[nodiscard]] ReusableFiberFuture<std::vector<T>> RegisterForIntSenderMessage(std::size_t ot_id,
77  std::size_t size);
78 
79  // matrix of the OT extension scheme
80  // XXX: can't we delete this after setup?
81  std::shared_ptr<BitMatrix> T;
82 
83  // if many OTs are received in batches, it is not necessary to store all of the flags
84  // for received messages but only for the first OT id in the batch. Thus, use a hash table.
85  std::unordered_set<std::size_t> received_outputs;
86  std::vector<BitVector<>> outputs;
87  std::unordered_map<std::size_t, std::unique_ptr<FiberCondition>> output_conditions;
89 
90  // bit length of every OT
91  std::vector<std::size_t> bitlengths;
92 
93  // store the message types of new-style OTs
94  std::unordered_map<std::size_t, OtMessageType> message_type;
95 
96  // Promises for the sender messages
97  // ot_id -> (vector size, vector promise)
98  std::unordered_map<std::size_t, std::pair<std::size_t, ReusableFiberPromise<BitVector<>>>>
100  std::unordered_map<std::size_t, std::pair<std::size_t, ReusableFiberPromise<Block128Vector>>>
102 
103  // Promises for the generic sender messages
104  // ot_id -> (vector size, length of each bitvector, vector promise)
105  std::unordered_map<std::size_t, std::tuple<std::size_t, std::size_t,
108 
109  template <typename T>
110  using PromiseMapType =
111  std::unordered_map<std::size_t, std::pair<std::size_t, ReusableFiberPromise<std::vector<T>>>>;
114 
115  // have we already set the choices for this OT batch?
116  std::unordered_set<std::size_t> set_real_choices;
117  std::mutex real_choices_mutex;
118 
119  // random choices from OT precomputation
120  std::unique_ptr<AlignedBitVector> random_choices;
121 
122  // how many ots are in each batch?
123  std::unordered_map<std::size_t, std::size_t> number_of_ots_in_batch;
124 
125  // flag and condition variable: is setup is done?
126  std::unique_ptr<FiberCondition> setup_finished_condition;
127  std::atomic<bool> setup_finished{false};
128 
129  // XXX: unused
130  std::atomic<std::size_t> consumed_offset{0};
131 };
132 
135  ~OtExtensionSenderData() = default;
136 
137  // width of the bit matrix
138  std::atomic<std::size_t> bit_size{0};
139 
141  std::array<AlignedBitVector, 128> u;
142 
143  std::array<ReusablePromise<std::size_t>, 128> u_promises;
144  std::array<ReusableFuture<std::size_t>, 128> u_futures;
145  std::mutex u_mutex;
146  std::size_t number_of_received_us{0};
147  // matrix of the OT extension scheme
148  // XXX: can't we delete this after setup?
149  std::shared_ptr<BitMatrix> V;
150 
151  // offset, number_of_ots
152  std::unordered_map<std::size_t, std::size_t> number_of_ots_in_batch;
153 
154  // corrections for GOTs, i.e., if random choice bit is not the real choice bit
155  // send 1 to flip the messages before encoding or 0 otherwise for each GOT
156  std::unordered_set<std::size_t> received_correction_offsets;
157  std::unordered_map<std::size_t, std::unique_ptr<FiberCondition>>
160  mutable std::mutex corrections_mutex;
161 
162  // random sender outputs
163  // XXX: why not aligned?
164  std::vector<BitVector<>> y0, y1;
165 
166  // bit length of every OT
167  std::vector<std::size_t> bitlengths;
168 
169  // flag and condition variable: is setup is done?
170  std::unique_ptr<FiberCondition> setup_finished_condition;
171  std::atomic<bool> setup_finished{false};
172 
173  // XXX: unused
174  std::atomic<std::size_t> consumed_offset{0};
175 };
176 
178  void MessageReceived(const std::uint8_t* message, std::size_t message_size,
179  const OtExtensionDataType type, const std::size_t ot_id = 0);
180 
185 
188 };
189 
190 } // namespace encrypto::motion
encrypto::motion::OtExtensionReceiverData::RegisterForBlock128SenderMessage
ReusableFiberFuture< Block128Vector > RegisterForBlock128SenderMessage(std::size_t ot_id, std::size_t size)
Definition: ot_extension_data.cpp:183
encrypto::motion::OtExtensionSenderData::~OtExtensionSenderData
~OtExtensionSenderData()=default
condition.h
encrypto::motion::OtExtensionSenderData::u_mutex
std::mutex u_mutex
Definition: ot_extension_data.h:145
encrypto::motion::OtExtensionReceiverData::set_real_choices
std::unordered_set< std::size_t > set_real_choices
Definition: ot_extension_data.h:116
encrypto::motion::OtExtensionSenderData::received_correction_offsets_condition
std::unordered_map< std::size_t, std::unique_ptr< FiberCondition > > received_correction_offsets_condition
Definition: ot_extension_data.h:158
encrypto::motion::OtMessageType::kUint16
@ kUint16
encrypto::motion::OtMessageType::kBit
@ kBit
encrypto::motion::OtExtensionSenderData::number_of_ots_in_batch
std::unordered_map< std::size_t, std::size_t > number_of_ots_in_batch
Definition: ot_extension_data.h:152
encrypto::motion::OtExtensionSenderData
Definition: ot_extension_data.h:133
fiber_condition.h
encrypto::motion::ReusableFuture
Definition: reusable_future.h:129
encrypto::motion::OtMessageType::kUint32
@ kUint32
encrypto::motion::OtExtensionReceiverData::~OtExtensionReceiverData
~OtExtensionReceiverData()=default
reusable_future.h
bit_vector.h
encrypto::motion::OtExtensionSenderData::setup_finished
std::atomic< bool > setup_finished
Definition: ot_extension_data.h:171
geninput.type
type
Definition: geninput.py:149
encrypto::motion::OtMessageType::kBlock128
@ kBlock128
encrypto::motion::ReusablePromise::get_future
ReusableFuture< R, MutexType, ConditionVariableType > get_future()
Definition: reusable_future.h:242
encrypto::motion::OtExtensionSenderData::u
std::array< AlignedBitVector, 128 > u
receiver's mask that are needed to construct matrix
Definition: ot_extension_data.h:141
encrypto::motion::OtExtensionReceiverData::OtExtensionReceiverData
OtExtensionReceiverData()
Definition: ot_extension_data.cpp:35
encrypto::motion::OtExtensionReceiverData::PromiseMapType
std::unordered_map< std::size_t, std::pair< std::size_t, ReusableFiberPromise< std::vector< T > >> > PromiseMapType
Definition: ot_extension_data.h:111
encrypto::motion::OtExtensionReceiverData::RegisterForBitSenderMessage
ReusableFiberFuture< BitVector<> > RegisterForBitSenderMessage(std::size_t ot_id, std::size_t size)
Definition: ot_extension_data.cpp:196
ot_extension_data.h
encrypto::motion::Block128Vector
Vector of 128 bit / 16 B blocks.
Definition: block.h:168
block.h
encrypto::motion::OtExtensionSenderData::u_futures
std::array< ReusableFuture< std::size_t >, 128 > u_futures
Definition: ot_extension_data.h:144
encrypto::motion::kReceptionCorrection
@ kReceptionCorrection
Definition: ot_extension_data.h:49
encrypto::motion::BitVector<>
encrypto::motion::OtExtensionReceiverData::random_choices
std::unique_ptr< AlignedBitVector > random_choices
Definition: ot_extension_data.h:120
encrypto::motion::OtExtensionReceiverData::real_choices_mutex
std::mutex real_choices_mutex
Definition: ot_extension_data.h:117
encrypto::motion::TypeMap
decltype(detail::MakeTypeMap< Value, Ts... >()) TypeMap
Definition: meta.hpp:63
encrypto::motion::OtExtensionData::GetReceiverData
OtExtensionReceiverData & GetReceiverData()
Definition: ot_extension_data.h:181
encrypto::motion::OtExtensionSenderData::received_correction_offsets
std::unordered_set< std::size_t > received_correction_offsets
Definition: ot_extension_data.h:156
encrypto::motion::OtExtensionSenderData::V
std::shared_ptr< BitMatrix > V
Definition: ot_extension_data.h:149
encrypto::motion::OtExtensionReceiverData::received_outputs
std::unordered_set< std::size_t > received_outputs
Definition: ot_extension_data.h:85
encrypto::motion::BitSpan::Subset
BitVectorType Subset(const std::size_t from, const std::size_t to) const
Returns a new BitVector containing the bits of this BitSpan between positions from and to.
Definition: bit_vector.cpp:1518
encrypto::motion::OtExtensionData::sender_data
OtExtensionSenderData sender_data
Definition: ot_extension_data.h:187
encrypto::motion::OtMessageType::kUint64
@ kUint64
encrypto::motion::OtExtensionSenderData::y1
std::vector< BitVector<> > y1
Definition: ot_extension_data.h:164
encrypto::motion::OtMessageType::kGenericBoolean
@ kGenericBoolean
encrypto::motion::OtExtensionSenderData::u_promises
std::array< ReusablePromise< std::size_t >, 128 > u_promises
Definition: ot_extension_data.h:143
encrypto::motion::OtMessageType::kUint128
@ kUint128
encrypto::motion::OtExtensionSenderData::bitlengths
std::vector< std::size_t > bitlengths
Definition: ot_extension_data.h:167
encrypto::motion::OtExtensionReceiverData::message_promises_generic
std::unordered_map< std::size_t, std::tuple< std::size_t, std::size_t, ReusableFiberPromise< std::vector< BitVector<> > > > > message_promises_generic
Definition: ot_extension_data.h:107
encrypto::motion::OtExtensionData::MessageReceived
void MessageReceived(const std::uint8_t *message, std::size_t message_size, const OtExtensionDataType type, const std::size_t ot_id=0)
Definition: ot_extension_data.cpp:47
encrypto::motion::AlignedBitVector
BitVector< AlignedAllocator > AlignedBitVector
Definition: bit_vector.h:572
encrypto::motion
Definition: algorithm_description.cpp:35
encrypto::motion::kOtExtensionInvalidDataType
@ kOtExtensionInvalidDataType
Definition: ot_extension_data.h:51
encrypto::motion::OtExtensionReceiverData::consumed_offset
std::atomic< std::size_t > consumed_offset
Definition: ot_extension_data.h:130
encrypto::motion::kSendMessage
@ kSendMessage
Definition: ot_extension_data.h:50
encrypto::motion::OtExtensionReceiverData::bitlengths
std::vector< std::size_t > bitlengths
Definition: ot_extension_data.h:91
encrypto::motion::OtExtensionReceiverData::RegisterForGenericSenderMessage
ReusableFiberFuture< std::vector< BitVector<> > > RegisterForGenericSenderMessage(std::size_t ot_id, std::size_t size, std::size_t bitlength)
Definition: ot_extension_data.cpp:210
encrypto::motion::OtExtensionReceiverData::message_promises_bit
std::unordered_map< std::size_t, std::pair< std::size_t, ReusableFiberPromise< BitVector<> > > > message_promises_bit
Definition: ot_extension_data.h:99
encrypto::motion::BitVector::Copy
void Copy(const std::size_t dest_from, const std::size_t dest_to, const BitVector &other)
copies the first (dest_to - dest_from) bits from other to the bits [dest_from, dest_to) in this.
Definition: bit_vector.cpp:720
encrypto::motion::OtExtensionData::GetReceiverData
const OtExtensionReceiverData & GetReceiverData() const
Definition: ot_extension_data.h:182
encrypto::motion::OtExtensionReceiverData::message_promises_block128
std::unordered_map< std::size_t, std::pair< std::size_t, ReusableFiberPromise< Block128Vector > > > message_promises_block128
Definition: ot_extension_data.h:101
encrypto::motion::OtExtensionData::GetSenderData
const OtExtensionSenderData & GetSenderData() const
Definition: ot_extension_data.h:184
encrypto::motion::OtExtensionData::GetSenderData
OtExtensionSenderData & GetSenderData()
Definition: ot_extension_data.h:183
encrypto::motion::OtExtensionReceiverData::message_type
std::unordered_map< std::size_t, OtMessageType > message_type
Definition: ot_extension_data.h:94
encrypto::motion::OtExtensionData
Definition: ot_extension_data.h:177
encrypto::motion::OtExtensionReceiverData::RegisterForIntSenderMessage
ReusableFiberFuture< std::vector< T > > RegisterForIntSenderMessage(std::size_t ot_id, std::size_t size)
Definition: ot_extension_data.cpp:224
encrypto::motion::OtExtensionSenderData::consumed_offset
std::atomic< std::size_t > consumed_offset
Definition: ot_extension_data.h:174
bit_matrix.h
encrypto::motion::OtExtensionReceiverData::setup_finished
std::atomic< bool > setup_finished
Definition: ot_extension_data.h:127
encrypto::motion::OtExtensionReceiverData
Definition: ot_extension_data.h:65
encrypto::motion::OtExtensionSenderData::corrections
BitVector corrections
Definition: ot_extension_data.h:159
encrypto::motion::BitSpan
Non-owning non-resizeable BitVector.
Definition: bit_vector.h:578
encrypto::motion::OtExtensionSenderData::setup_finished_condition
std::unique_ptr< FiberCondition > setup_finished_condition
Definition: ot_extension_data.h:170
encrypto::motion::ReusablePromise
Definition: reusable_future.h:123
encrypto::motion::OtExtensionReceiverData::setup_finished_condition
std::unique_ptr< FiberCondition > setup_finished_condition
Definition: ot_extension_data.h:126
encrypto::motion::OtExtensionReceiverData::received_outputs_mutex
std::mutex received_outputs_mutex
Definition: ot_extension_data.h:88
encrypto::motion::OtExtensionReceiverData::T
std::shared_ptr< BitMatrix > T
Definition: ot_extension_data.h:81
encrypto::motion::OtMessageType
OtMessageType
Definition: ot_extension_data.h:54
encrypto::motion::OtExtensionSenderData::y0
std::vector< BitVector<> > y0
Definition: ot_extension_data.h:164
encrypto::motion::OtExtensionReceiverData::output_conditions
std::unordered_map< std::size_t, std::unique_ptr< FiberCondition > > output_conditions
Definition: ot_extension_data.h:87
encrypto::motion::OtExtensionReceiverData::number_of_ots_in_batch
std::unordered_map< std::size_t, std::size_t > number_of_ots_in_batch
Definition: ot_extension_data.h:123
encrypto::motion::OtExtensionSenderData::number_of_received_us
std::size_t number_of_received_us
Definition: ot_extension_data.h:146
encrypto::motion::OtExtensionSenderData::bit_size
std::atomic< std::size_t > bit_size
Definition: ot_extension_data.h:138
encrypto::motion::OtExtensionSenderData::OtExtensionSenderData
OtExtensionSenderData()
Definition: ot_extension_data.cpp:40
encrypto::motion::kReceptionMask
@ kReceptionMask
Definition: ot_extension_data.h:48
encrypto::motion::OtExtensionReceiverData::outputs
std::vector< BitVector<> > outputs
Definition: ot_extension_data.h:86
encrypto::motion::OtExtensionSenderData::corrections_mutex
std::mutex corrections_mutex
Definition: ot_extension_data.h:160
encrypto::motion::OtExtensionDataType
OtExtensionDataType
Definition: ot_extension_data.h:47
encrypto::motion::OtMessageType::kUint8
@ kUint8
encrypto::motion::OtExtensionReceiverData::message_promises_int
TypeMap< PromiseMapType, std::uint8_t, std::uint16_t, std::uint32_t, std::uint64_t, __uint128_t > message_promises_int
Definition: ot_extension_data.h:113
meta.hpp
encrypto::motion::OtExtensionData::receiver_data
OtExtensionReceiverData receiver_data
Definition: ot_extension_data.h:186