| MOTION
    0.01
    Framework for mixed-protocol multi-party computation | 
 
 
 
Go to the documentation of this file.
   30 #include <unordered_map> 
   32 #include <flatbuffers/flatbuffers.h> 
   36 class CommunicationLayer;
 
   44 struct OtExtensionData;
 
   45 struct OtExtensionReceiverData;
 
   46 struct OtExtensionSenderData;
 
   65 class FixedXcOt128Sender;
 
   66 class FixedXcOt128Receiver;
 
   68 class XcOtBitReceiver;
 
   90   OtVector(
const std::size_t ot_id, 
const std::size_t number_of_ots, 
const std::size_t bitlength,
 
   92            const std::function<
void(flatbuffers::FlatBufferBuilder&&)>& send_function);
 
  103                    std::shared_ptr<Logger> logger)
 
  104       : data_(data), party_id_(party_id), logger_(std::move(logger)) {}
 
  111       std::size_t number_of_ots, std::size_t bitlength,
 
  112       const std::function<
void(flatbuffers::FlatBufferBuilder&&)>& send_function);
 
  114       std::size_t number_of_ots, std::size_t bitlength,
 
  115       const std::function<
void(flatbuffers::FlatBufferBuilder&&)>& send_function);
 
  117       const std::size_t number_of_ots,
 
  118       const std::function<
void(flatbuffers::FlatBufferBuilder&&)>& send_function);
 
  120       const std::size_t number_of_ots,
 
  121       const std::function<
void(flatbuffers::FlatBufferBuilder&&)>& send_function);
 
  122   template <
typename T>
 
  124       std::size_t number_of_ots, std::size_t vector_size,
 
  125       const std::function<
void(flatbuffers::FlatBufferBuilder&&)>& send_function);
 
  127       std::size_t number_of_ots, std::size_t bitlength,
 
  128       const std::function<
void(flatbuffers::FlatBufferBuilder&&)>& send_function);
 
  130       const std::size_t number_of_ots,
 
  131       const std::function<
void(flatbuffers::FlatBufferBuilder&&)>& send_function);
 
  133       const std::size_t number_of_ots,
 
  134       const std::function<
void(flatbuffers::FlatBufferBuilder&&)>& send_function);
 
  143   std::size_t total_ots_count_{0};
 
  145   OtExtensionSenderData& data_;
 
  147   std::size_t party_id_;
 
  149   std::shared_ptr<Logger> logger_;
 
  155                      std::shared_ptr<Logger> logger)
 
  156       : data_(data), party_id_(party_id), logger_(std::move(logger)) {}
 
  163       std::size_t number_of_ots, std::size_t bitlength,
 
  164       const std::function<
void(flatbuffers::FlatBufferBuilder&&)>& send_function);
 
  166       std::size_t number_of_ots, std::size_t bitlength,
 
  167       const std::function<
void(flatbuffers::FlatBufferBuilder&&)>& send_function);
 
  169       const std::size_t number_of_ots,
 
  170       const std::function<
void(flatbuffers::FlatBufferBuilder&&)>& send_function);
 
  172       const std::size_t number_of_ots,
 
  173       const std::function<
void(flatbuffers::FlatBufferBuilder&&)>& send_function);
 
  174   template <
typename T>
 
  176       std::size_t number_of_ots, std::size_t vector_size,
 
  177       const std::function<
void(flatbuffers::FlatBufferBuilder&&)>& send_function);
 
  179       std::size_t number_of_ots, std::size_t bitlength,
 
  180       const std::function<
void(flatbuffers::FlatBufferBuilder&&)>& send_function);
 
  182       const std::size_t number_of_ots,
 
  183       const std::function<
void(flatbuffers::FlatBufferBuilder&&)>& send_function);
 
  185       const std::size_t number_of_ots,
 
  186       const std::function<
void(flatbuffers::FlatBufferBuilder&&)>& send_function);
 
  188   std::size_t 
GetNumOts()
 const { 
return total_ots_count_; }
 
  194   std::atomic<std::size_t> total_ots_count_{0};
 
  196   OtExtensionReceiverData& data_;
 
  198   std::size_t party_id_;
 
  200   std::shared_ptr<Logger> logger_;
 
  210   [[nodiscard]] std::unique_ptr<ROtSender> 
RegisterSendROt(std::size_t number_of_ots = 1,
 
  211                                                            std::size_t bitlength = 1);
 
  213   [[nodiscard]] std::unique_ptr<XcOtSender> 
RegisterSendXcOt(std::size_t number_of_ots = 1,
 
  214                                                              std::size_t bitlength = 1);
 
  217       std::size_t number_of_ots = 1);
 
  219   [[nodiscard]] std::unique_ptr<XcOtBitSender> 
RegisterSendXcOtBit(std::size_t number_of_ots = 1);
 
  221   template <
typename T>
 
  222   [[nodiscard]] std::unique_ptr<AcOtSender<T>> 
RegisterSendAcOt(std::size_t number_of_ots = 1,
 
  223                                                                 std::size_t vector_size = 1);
 
  225   [[nodiscard]] std::unique_ptr<GOtSender> 
RegisterSendGOt(std::size_t number_of_ots = 1,
 
  226                                                            std::size_t bitlength = 1);
 
  228   [[nodiscard]] std::unique_ptr<GOt128Sender> 
RegisterSendGOt128(std::size_t number_of_ots = 1);
 
  230   [[nodiscard]] std::unique_ptr<GOtBitSender> 
RegisterSendGOtBit(std::size_t number_of_ots = 1);
 
  232   [[nodiscard]] std::unique_ptr<ROtReceiver> 
RegisterReceiveROt(std::size_t number_of_ots = 1,
 
  233                                                                 std::size_t bitlength = 1);
 
  235   [[nodiscard]] std::unique_ptr<XcOtReceiver> 
RegisterReceiveXcOt(std::size_t number_of_ots = 1,
 
  236                                                                   std::size_t bitlength = 1);
 
  239       std::size_t number_of_ots = 1);
 
  242       std::size_t number_of_ots = 1);
 
  244   template <
typename T>
 
  245   [[nodiscard]] std::unique_ptr<AcOtReceiver<T>> 
RegisterReceiveAcOt(std::size_t number_of_ots = 1,
 
  246                                                                      std::size_t vector_size = 1);
 
  247   [[nodiscard]] std::unique_ptr<GOtReceiver> 
RegisterReceiveGOt(std::size_t number_of_ots = 1,
 
  248                                                                 std::size_t bitlength = 1);
 
  251       std::size_t number_of_ots = 1);
 
  254       std::size_t number_of_ots = 1);
 
  276   OtProvider(std::function<
void(flatbuffers::FlatBufferBuilder&&)> send_function,
 
  277              OtExtensionData& data, std::size_t party_id, std::shared_ptr<Logger> logger);
 
  301                             std::size_t party_id, std::shared_ptr<Logger> logger);
 
  319                     std::shared_ptr<Logger> logger);
 
  322   std::vector<std::unique_ptr<OtProvider>>& 
GetProviders() { 
return providers_; }
 
  327   std::size_t number_of_parties_;
 
  328   std::vector<std::unique_ptr<OtProvider>> providers_;
 
  329   std::vector<std::unique_ptr<OtExtensionData>> data_;
 
  
std::unique_ptr< GOt128Sender > RegisterSendGOt128(std::size_t number_of_ots=1)
Definition: ot_provider.cpp:98
void ReceiveSetup() final
Definition: ot_provider.cpp:297
std::size_t GetBitlen() const noexcept
Definition: ot_provider.h:86
void SendSetup() final
Definition: ot_provider.cpp:168
std::unordered_set< std::size_t > set_real_choices
Definition: ot_extension_data.h:116
Definition: base_ot_data.h:77
std::size_t GetNumOts() const
Definition: ot_provider.h:188
BaseOtData & GetBaseOtsData(std::size_t party_id)
Definition: base_ot_provider.h:66
OtProviderSender sender_provider_
Definition: ot_provider.h:282
Definition: ot_provider.h:100
std::unique_ptr< GOtSender > RegisterSendGOt(std::size_t number_of_ots=1, std::size_t bitlength=1)
Definition: ot_provider.cpp:93
Definition: ot_provider.h:312
OtProviderFromOtExtension(std::function< void(flatbuffers::FlatBufferBuilder &&)> send_function, OtExtensionData &data, const BaseOtData &base_ot_data, BaseProvider &, std::size_t party_id, std::shared_ptr< Logger > logger)
Definition: ot_provider.cpp:160
std::unique_ptr< GOtBitReceiver > RegisterGOtBit(const std::size_t number_of_ots, const std::function< void(flatbuffers::FlatBufferBuilder &&)> &send_function)
Definition: ot_provider.cpp:692
Definition: ot_provider.h:289
std::function< void(flatbuffers::FlatBufferBuilder &&)> send_function_
Definition: ot_provider.h:97
std::unique_ptr< GOtReceiver > RegisterReceiveGOt(std::size_t number_of_ots=1, std::size_t bitlength=1)
Definition: ot_provider.cpp:155
static void ReceiverTransposeAndEncrypt(const std::array< const std::byte *, 128 > &matrix, std::vector< BitVector<>> &output, primitives::Prg &prg_fixed_key, const std::size_t number_of_columns, const std::vector< std::size_t > &bitlengths)
Transposes a matrix of 128 rows and arbitrary column size and encrypts it for the recepient role.
Definition: bit_matrix.cpp:640
std::unique_ptr< ROtSender > RegisterROt(std::size_t number_of_ots, std::size_t bitlength, const std::function< void(flatbuffers::FlatBufferBuilder &&)> &send_function)
Definition: ot_provider.cpp:411
std::size_t SetOffset(std::size_t new_offset)
Definition: pseudo_random_generator.h:53
std::unique_ptr< XcOtReceiver > RegisterXcOt(std::size_t number_of_ots, std::size_t bitlength, const std::function< void(flatbuffers::FlatBufferBuilder &&)> &send_function)
Definition: ot_provider.cpp:584
std::size_t GetNumOts() const noexcept
Definition: ot_provider.h:85
static BitVector SecureRandom(const std::size_t size) noexcept
Returns a random BitVector.
Definition: bit_vector.cpp:893
std::unique_ptr< XcOtBitSender > RegisterXcOtBits(const std::size_t number_of_ots, const std::function< void(flatbuffers::FlatBufferBuilder &&)> &send_function)
Definition: ot_provider.cpp:456
Definition: ot_extension_data.h:133
Definition: ot_provider.h:204
void SetKey(const std::uint8_t *key)
Definition: pseudo_random_generator.cpp:32
Definition: base_ot_provider.h:58
std::unique_ptr< GOt128Receiver > RegisterReceiveGOt128(std::size_t number_of_ots=1)
Definition: ot_provider.cpp:145
Definition: ot_provider.h:80
void Setup()
Definition: motion_base_provider.cpp:113
std::unique_ptr< FixedXcOt128Receiver > RegisterFixedXcOt128s(const std::size_t number_of_ots, const std::function< void(flatbuffers::FlatBufferBuilder &&)> &send_function)
Definition: ot_provider.cpp:599
const encrypto::motion::communication::Message * GetMessage(const void *buf)
Definition: message_generated.h:146
std::unique_ptr< XcOtSender > RegisterSendXcOt(std::size_t number_of_ots=1, std::size_t bitlength=1)
Definition: ot_provider.cpp:61
constexpr std::size_t BitsToBytes(const std::size_t bits)
Returns the number of bytes necessary to store bits bits.
Definition: helpers.h:504
std::unique_ptr< AcOtReceiver< T > > RegisterAcOt(std::size_t number_of_ots, std::size_t vector_size, const std::function< void(flatbuffers::FlatBufferBuilder &&)> &send_function)
Definition: ot_provider.cpp:631
std::atomic< bool > setup_finished
Definition: ot_extension_data.h:171
virtual ~OtProvider()=default
~OtProviderReceiver()=default
constexpr std::size_t kKappa
Definition: constants.h:65
const encrypto::motion::communication::OtExtensionMessage * GetOtExtensionMessage(const void *buf)
Definition: ot_extension_generated.h:80
flatbuffers::FlatBufferBuilder BuildOtExtensionMessageReceiverMasks(const std::byte *buffer, const std::size_t size, const std::size_t i)
Definition: ot_extension_message.cpp:43
std::size_t GetOtId() const noexcept
Definition: ot_provider.h:84
std::unique_ptr< XcOtBitReceiver > RegisterXcOtBits(const std::size_t number_of_ots, const std::function< void(flatbuffers::FlatBufferBuilder &&)> &send_function)
Definition: ot_provider.cpp:615
void Clear()
Definition: ot_provider.cpp:548
OtProvider(const OtProvider &)=delete
@ kROt
Definition: ot_provider.h:52
std::unique_ptr< XcOtSender > RegisterXcOt(std::size_t number_of_ots, std::size_t bitlength, const std::function< void(flatbuffers::FlatBufferBuilder &&)> &send_function)
Definition: ot_provider.cpp:426
@ kXcOt
Definition: ot_provider.h:53
OtProviderManager(communication::CommunicationLayer &, const BaseOtProvider &, BaseProvider &, std::shared_ptr< Logger > logger)
Definition: ot_provider.cpp:769
const std::size_t number_of_ots_
Definition: ot_provider.h:94
@ kReceptionCorrection
Definition: ot_extension_data.h:49
Definition: ot_provider.h:316
std::unique_ptr< AlignedBitVector > random_choices
Definition: ot_extension_data.h:120
OtProtocol GetProtocol() const noexcept
Definition: ot_provider.h:87
std::mutex real_choices_mutex
Definition: ot_extension_data.h:117
std::unique_ptr< ROtReceiver > RegisterROt(std::size_t number_of_ots, std::size_t bitlength, const std::function< void(flatbuffers::FlatBufferBuilder &&)> &send_function)
Definition: ot_provider.cpp:569
std::unique_ptr< GOtBitSender > RegisterGOtBit(const std::size_t number_of_ots, const std::function< void(flatbuffers::FlatBufferBuilder &&)> &send_function)
Definition: ot_provider.cpp:533
void RegisterMessageHandler(MessageHandlerFunction, const std::vector< MessageType > &message_types)
Definition: communication_layer.cpp:393
OtExtensionReceiverData & GetReceiverData()
Definition: ot_extension_data.h:181
@ kInvalidOt
Definition: ot_provider.h:58
~OtProviderSender()=default
std::unique_ptr< GOt128Receiver > RegisterGOt128(const std::size_t number_of_ots, const std::function< void(flatbuffers::FlatBufferBuilder &&)> &send_function)
Definition: ot_provider.cpp:677
OtProviderSender(OtExtensionSenderData &data, std::size_t party_id, std::shared_ptr< Logger > logger)
Definition: ot_provider.h:102
std::unique_ptr< ROtReceiver > RegisterReceiveROt(std::size_t number_of_ots=1, std::size_t bitlength=1)
Definition: ot_provider.cpp:108
void WaitSetup() const
Definition: ot_provider.cpp:51
std::unordered_set< std::size_t > received_correction_offsets
Definition: ot_extension_data.h:156
@ kFixedXcOt128
Definition: ot_provider.h:55
std::unordered_set< std::size_t > received_outputs
Definition: ot_extension_data.h:85
OtProviderReceiver(OtExtensionReceiverData &data, std::size_t party_id, std::shared_ptr< Logger > logger)
Definition: ot_provider.h:154
const OtProtocol p_
Definition: ot_provider.h:95
std::size_t GetNumOtsReceiver() const
Definition: ot_provider.h:256
void Clear()
Definition: ot_provider.cpp:707
void Reset()
Definition: ot_provider.h:270
const std::size_t ot_id_
Definition: ot_provider.h:94
std::unique_ptr< AcOtSender< T > > RegisterAcOt(std::size_t number_of_ots, std::size_t vector_size, const std::function< void(flatbuffers::FlatBufferBuilder &&)> &send_function)
Definition: ot_provider.cpp:472
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
std::function< void(flatbuffers::FlatBufferBuilder &&)> send_function_
Definition: ot_provider.h:279
BitVector< AlignedAllocator > AlignedBitVector
Definition: bit_vector.h:572
Definition: algorithm_description.cpp:35
std::unique_ptr< GOtBitSender > RegisterSendGOtBit(std::size_t number_of_ots=1)
Definition: ot_provider.cpp:103
@ kSendMessage
Definition: ot_extension_data.h:50
OtProvider & GetProvider(std::size_t party_id)
Definition: ot_provider.h:323
@ kXcOtBit
Definition: ot_provider.h:56
~OtProviderManager()
Definition: ot_provider.cpp:800
void SendMessage(std::size_t party_id, std::vector< std::uint8_t > &&message)
Definition: communication_layer.cpp:331
virtual void SendSetup()=0
OtExtensionData & data_
Definition: ot_provider.h:280
std::size_t GetMyId() const
Definition: communication_layer.h:66
auto GetNumOts() const
Definition: ot_provider.h:136
Definition: pseudo_random_generator.h:41
std::unique_ptr< GOtReceiver > RegisterGOt(std::size_t number_of_ots, std::size_t bitlength, const std::function< void(flatbuffers::FlatBufferBuilder &&)> &send_function)
Definition: ot_provider.cpp:662
Definition: message_handler.h:38
Definition: ot_provider.h:308
OtExtensionSenderData & GetSenderData()
Definition: ot_extension_data.h:183
Definition: ot_extension_data.h:177
Definition: communication_layer.h:58
std::unique_ptr< XcOtBitReceiver > RegisterReceiveXcOtBit(std::size_t number_of_ots=1)
Definition: ot_provider.cpp:123
@ kAcOt
Definition: ot_provider.h:54
Definition: ot_provider.h:285
std::unique_ptr< FixedXcOt128Sender > RegisterSendFixedXcOt128(std::size_t number_of_ots=1)
Definition: ot_provider.cpp:66
std::vector< std::byte > Encrypt(const std::size_t bytes)
Definition: pseudo_random_generator.cpp:46
std::unique_ptr< FixedXcOt128Receiver > RegisterReceiveFixedXcOt128(std::size_t number_of_ots=1)
Definition: ot_provider.cpp:118
@ kOtExtensionReceiverCorrections
OtProtocol
Definition: ot_provider.h:50
const std::size_t bitlen_
Definition: ot_provider.h:94
std::unique_ptr< AcOtReceiver< T > > RegisterReceiveAcOt(std::size_t number_of_ots=1, std::size_t vector_size=1)
Definition: ot_provider.cpp:129
const std::vector< std::uint8_t > & GetAesFixedKey() const
Definition: motion_base_provider.h:56
std::atomic< bool > setup_finished
Definition: ot_extension_data.h:127
Definition: ot_extension_data.h:65
std::unique_ptr< XcOtBitSender > RegisterSendXcOtBit(std::size_t number_of_ots=1)
Definition: ot_provider.cpp:71
virtual void ReceiveSetup()=0
void Reset()
Definition: ot_provider.cpp:564
Definition: ot_provider.h:152
Non-owning non-resizeable BitVector.
Definition: bit_vector.h:578
std::unique_ptr< FiberCondition > setup_finished_condition
Definition: ot_extension_data.h:170
void Clear()
Definition: ot_provider.h:265
Definition: motion_base_provider.h:48
OtProviderReceiver receiver_provider_
Definition: ot_provider.h:281
void ReceivedMessage(std::size_t, std::vector< std::uint8_t > &&message) override
Definition: ot_provider.cpp:739
Definition: ot_provider.cpp:730
std::unique_ptr< FiberCondition > setup_finished_condition
Definition: ot_extension_data.h:126
std::mutex received_outputs_mutex
Definition: ot_extension_data.h:88
@ kOtExtensionReceiverMasks
OtExtensionMessageHandler(OtExtensionData &data)
Definition: ot_provider.cpp:732
@ kGOt128
Definition: ot_provider.h:57
std::unique_ptr< ROtSender > RegisterSendROt(std::size_t number_of_ots=1, std::size_t bitlength=1)
Definition: ot_provider.cpp:56
std::unique_ptr< FixedXcOt128Sender > RegisterFixedXcOt128s(const std::size_t number_of_ots, const std::function< void(flatbuffers::FlatBufferBuilder &&)> &send_function)
Definition: ot_provider.cpp:441
std::unique_ptr< XcOtReceiver > RegisterReceiveXcOt(std::size_t number_of_ots=1, std::size_t bitlength=1)
Definition: ot_provider.cpp:113
static void SenderTransposeAndEncrypt(const std::array< const std::byte *, 128 > &matrix, std::vector< BitVector<>> &y0, std::vector< BitVector<>> &y1, const BitVector<> choices, primitives::Prg &prg_fixed_key, const std::size_t number_of_columns, const std::vector< std::size_t > &bitlengths)
Transposes a matrix of 128 rows and arbitrary column size and encrypts it for the sender role.
Definition: bit_matrix.cpp:511
std::unique_ptr< GOt128Sender > RegisterGOt128(const std::size_t number_of_ots, const std::function< void(flatbuffers::FlatBufferBuilder &&)> &send_function)
Definition: ot_provider.cpp:518
std::size_t GetNumOtsSender() const
Definition: ot_provider.h:258
constexpr bool kDebug
Definition: config.h:36
@ kReceptionMask
Definition: ot_extension_data.h:48
std::mutex corrections_mutex
Definition: ot_extension_data.h:160
std::unique_ptr< GOtBitReceiver > RegisterReceiveGOtBit(std::size_t number_of_ots=1)
Definition: ot_provider.cpp:150
BaseOtSenderData & GetSenderData()
Definition: base_ot_data.h:83
@ kGOt
Definition: ot_provider.h:51
void DeregisterMessageHandler(const std::vector< MessageType > &message_types)
Definition: communication_layer.cpp:414
std::vector< std::unique_ptr< OtProvider > > & GetProviders()
Definition: ot_provider.h:322
std::unique_ptr< AcOtSender< T > > RegisterSendAcOt(std::size_t number_of_ots=1, std::size_t vector_size=1)
Definition: ot_provider.cpp:77
Definition: ot_provider.h:293
void Reset()
Definition: ot_provider.cpp:728
BaseOtReceiverData & GetReceiverData()
Definition: base_ot_data.h:81
std::unique_ptr< GOtSender > RegisterGOt(std::size_t number_of_ots, std::size_t bitlength, const std::function< void(flatbuffers::FlatBufferBuilder &&)> &send_function)
Definition: ot_provider.cpp:503