Files
MP-SPDZ/Protocols/SohoPrep.hpp
Marcel Keller 4ef6b6d873 Maintenance.
2020-05-08 21:43:05 +10:00

130 lines
2.7 KiB
C++

/*
* SohoPrep.cpp
*
*/
#include "SohoPrep.h"
#include "FHEOffline/DataSetup.h"
#include "ReplicatedPrep.hpp"
template<class T>
PartSetup<typename SohoPrep<T>::FD>* SohoPrep<T>::setup = 0;
template<class T>
Lock SohoPrep<T>::lock;
template<class T>
void SohoPrep<T>::basic_setup(Player& P)
{
assert(not setup);
setup = new PartSetup<FD>;
MachineBase machine;
setup->secure_init(P, machine, T::clear::length(), 0);
setup->covert_secrets_generation(P, machine, 1);
}
template<class T>
void SohoPrep<T>::teardown()
{
if (setup)
delete setup;
}
template<class T>
void SohoPrep<T>::buffer_triples()
{
auto& proc = this->proc;
assert(proc != 0);
lock.lock();
if (not setup)
{
PlainPlayer P(proc->P.N, T::clear::type_char());
basic_setup(P);
}
lock.unlock();
Plaintext_<FD> ai(setup->FieldD), bi(setup->FieldD);
SeededPRNG G;
ai.randomize(G);
bi.randomize(G);
Ciphertext Ca = setup->pk.encrypt(ai);
Ciphertext Cb = setup->pk.encrypt(bi);
octetStream os;
Ca.pack(os);
Cb.pack(os);
for (int i = 1; i < proc->P.num_players(); i++)
{
proc->P.pass_around(os);
Ca.add(os);
Cb.add(os);
}
Ciphertext Cc = Ca.mul(setup->pk, Cb);
Plaintext_<FD> ci(setup->FieldD);
SimpleDistDecrypt<FD> dd(proc->P, *setup);
EncCommitBase_<FD> EC;
dd.reshare(ci, Cc, EC);
for (unsigned i = 0; i < ai.num_slots(); i++)
this->triples.push_back({{ai.element(i), bi.element(i),
ci.element(i)}});
}
template<class T>
void SohoPrep<T>::buffer_squares()
{
auto& proc = this->proc;
assert(proc != 0);
lock.lock();
if (not setup)
{
PlainPlayer P(proc->P.N, T::clear::type_char());
basic_setup(P);
}
lock.unlock();
Plaintext_<FD> ai(setup->FieldD);
SeededPRNG G;
ai.randomize(G);
Ciphertext Ca = setup->pk.encrypt(ai);
octetStream os;
Ca.pack(os);
for (int i = 1; i < proc->P.num_players(); i++)
{
proc->P.pass_around(os);
Ca.add(os);
}
Ciphertext Cc = Ca.mul(setup->pk, Ca);
Plaintext_<FD> ci(setup->FieldD);
SimpleDistDecrypt<FD> dd(proc->P, *setup);
EncCommitBase_<FD> EC;
dd.reshare(ci, Cc, EC);
for (unsigned i = 0; i < ai.num_slots(); i++)
this->squares.push_back({{ai.element(i), ci.element(i)}});
}
template<class T>
void SohoPrep<T>::buffer_inverses()
{
assert(this->proc != 0);
::buffer_inverses(this->inverses, *this, this->proc->MC, this->proc->P);
}
template<>
void SohoPrep<SohoShare<gfp>>::buffer_bits()
{
buffer_bits_from_squares(*this);
}
template<>
void SohoPrep<SohoShare<gf2n_short>>::buffer_bits()
{
buffer_bits_without_check();
}