mirror of
https://github.com/data61/MP-SPDZ.git
synced 2026-01-08 21:18:03 -05:00
92 lines
2.3 KiB
C++
92 lines
2.3 KiB
C++
|
|
#include "Commit.h"
|
|
#include "random.h"
|
|
#include "int.h"
|
|
|
|
void Commit(octetStream& comm,octetStream& open,const octetStream& message, int send_player)
|
|
{
|
|
open.store(send_player);
|
|
open.append(message.get_data(), message.get_length());
|
|
open.append_random(SEED_SIZE);
|
|
comm = open.hash();
|
|
}
|
|
|
|
bool Open(octetStream& message,const octetStream& comm,const octetStream& open, int send_player)
|
|
{
|
|
octetStream h = open.hash();
|
|
octet* open_bytes = open.get_data();
|
|
// first 4 bytes are player no.
|
|
int open_player = BYTES_TO_INT(open_bytes);
|
|
if (!(h.equals(comm) && open_player == send_player))
|
|
{
|
|
return false;
|
|
}
|
|
message.reset_write_head();
|
|
message.append(open_bytes + sizeof(int), open.get_length() - SEED_SIZE - sizeof(int));
|
|
return true;
|
|
}
|
|
|
|
void Commitment::commit(const octetStream& message)
|
|
{
|
|
open.reset_write_head();
|
|
open.append_random(SEED_SIZE);
|
|
commit(message, open);
|
|
}
|
|
|
|
void Commitment::commit(const octetStream& message, const octetStream& open)
|
|
{
|
|
Hash hash;
|
|
hash.update(&send_player, sizeof(send_player));
|
|
hash.update(message);
|
|
hash.update(open);
|
|
hash.final(comm);
|
|
}
|
|
|
|
void Commitment::check(const octetStream& message, const octetStream& comm,
|
|
const octetStream& open)
|
|
{
|
|
commit(message, open);
|
|
if (!(comm == this->comm))
|
|
throw invalid_commitment();
|
|
}
|
|
|
|
void AllCommitments::commit_and_open(const octetStream& message)
|
|
{
|
|
commit(message);
|
|
open();
|
|
}
|
|
|
|
void AllCommitments::commit(const octetStream& message)
|
|
{
|
|
Commitment mine(P.my_num());
|
|
mine.commit(message);
|
|
comms[P.my_num()] = mine.comm;
|
|
opens[P.my_num()] = mine.open;
|
|
P.Broadcast_Receive(comms);
|
|
}
|
|
|
|
void AllCommitments::open()
|
|
{
|
|
P.Broadcast_Receive(opens);
|
|
}
|
|
|
|
void AllCommitments::open(const octetStream& message)
|
|
{
|
|
messages.resize(P.num_players());
|
|
messages[P.my_num()] = message;
|
|
P.Broadcast_Receive(messages);
|
|
open();
|
|
for (int i = 0; i != P.my_num(); i++)
|
|
check(i, messages[i]);
|
|
}
|
|
|
|
void AllCommitments::check(int player, const octetStream& message)
|
|
{
|
|
Commitment(player).check(message, comms[player], opens[player]);
|
|
}
|
|
|
|
void AllCommitments::check_relative(int diff, const octetStream& message)
|
|
{
|
|
check((P.my_num() + P.num_players() - diff) % P.num_players(), message);
|
|
}
|