Adding a ProtocolΒΆ
In order to illustrate how to create a virtual machine for a new protocol, we have created one with blanks to be filled in. It is defined in the following files:
Machines/no-party.cpp
Contains the main function.
Protocols/NoShare.h
Contains the
NoShare
class, which is supposed to hold one share.NoShare
takes the cleartext type as a template parameter.Protocols/NoProtocol.h
Contains a number of classes representing instances of protocols:
NoInput
Private input.
NoProtocol
Multiplication protocol.
NoOutput
Public output.
Protocols/NoLivePrep.h
Contains the
NoLivePrep
class, representing a preprocessing instance.
The number of blanks can be overwhelming. We therefore recommend the
following approach to get started. If the desired protocol resembles
one that is already implemented, you can check its code for
inspiration. The main function of <protocol>-party.x
can be found
in Machines/<protocol>-party.cpp
, which in turns contains the name
of the share class. For example replicated-ring-party.x
is
implemented in Machines/replicated-ring-party.cpp
, which refers to
Rep3Share2()
in Protocols/Rep3Share2.h
. There you will
find that it uses Replicated()
for multiplication, which is
found in Protocols/Replicated.h
.
Fill in the
constant()
static member function ofNoShare
as well as theexchange()
member function ofNoOutput
. Check outDirectSemiMC<T>::exchange_()
inProtocols/SemiMC.hpp
for a simple example. It opens an additive secret sharing by sending all shares to all other parties and then summing up the received. See this reference for documentation on the necessary infrastructure. Constant sharing and public output allows to execute the following program:print_ln('%s', sint(123).reveal())
This allows to check the correct execution of further functionality.
Fill in the operator functions in
NoShare
and check them:print_ln('%s', (sint(2) + sint(3)).reveal()) print_ln('%s', (sint(2) - sint(3)).reveal()) print_ln('%s', (sint(2) * cint(3)).reveal())
Many protocols use these basic operations, which makes it beneficial to check the correctness
Fill in
NoProtocol
. Alternatively, if the desired protocol is based on Beaver multiplication, you can specify the following inNoShare
:typedef Beaver<This> Protocol;
Then add the desired triple generation to
NoLivePrep::buffer_triples()
. In any case you should then be able to execute:print_ln('%s', (sint(2) * sint(3)).reveal())
In order to execute many kinds of non-linear computation, random bits are needed. After filling in
NoLivePrep::buffer_bits()
, you should be able to execute:print_ln('%s', (sint(2) < sint(3)).reveal()