add outcome determination to brandt.c

This commit is contained in:
Markus Teich 2016-08-23 13:33:08 +02:00
parent 4561ac2026
commit 0d3b32b248
2 changed files with 35 additions and 8 deletions

View File

@ -261,19 +261,39 @@ advance_round (struct BRANDT_Auction *ad,
enum auction_type atype, enum auction_type atype,
enum outcome_type outcome) enum outcome_type outcome)
{ {
uint32_t price;
uint16_t winner = -1;
unsigned char *buf; unsigned char *buf;
size_t buflen; size_t buflen;
/* if we got the current round message from all participants, advance to /* if we did not got the current round message from all participants, don't
* next round */ * advance to the next round yet. Early return, since we have to wait for
* the other participants messages. */
for (uint16_t i = 0; i < ad->n; i++) for (uint16_t i = 0; i < ad->n; i++)
if (!gcry_mpi_test_bit (ad->round_progress, i)) if (!gcry_mpi_test_bit (ad->round_progress, i))
return; return;
/* current round finished, clear round progress and advance to next one */
gcry_mpi_clear_highbit (ad->round_progress, 0); gcry_mpi_clear_highbit (ad->round_progress, 0);
if (msg_last == ++(ad->cur_round)) if (msg_last == ++(ad->cur_round))
{ {
/** \todo: unify …_determine_outcome function signature and call here */ /* done with all rounds, determine outcome here */
/** \todo: unify …_determine_outcome function signature? */
if (auction_firstPrice == atype && outcome_private == outcome)
{
if (-1 == (price = fp_priv_determine_outcome (ad)))
ad->result (ad->closure, ad->i, 0, 0);
else
ad->result (ad->closure, ad->i, 1, price);
}
else if (auction_firstPrice == atype && outcome_public == outcome)
{
if (-1 == (price = fp_pub_determine_outcome (ad, &winner)))
ad->result (ad->closure, ad->i, 0, 0);
else
ad->result (ad->closure, winner, 1, price);
}
return;
} }
if (!handler_out[atype][outcome][ad->cur_round] || if (!handler_out[atype][outcome][ad->cur_round] ||
@ -298,7 +318,7 @@ BRANDT_got_message (struct BRANDT_Auction *auction,
const unsigned char *msg, const unsigned char *msg,
size_t msg_len) size_t msg_len)
{ {
uint16_t mtype = *(uint16_t *)msg; struct msg_head *head = (struct msg_head *)msg;
enum auction_type atype; enum auction_type atype;
enum outcome_type outcome; enum outcome_type outcome;
enum rounds round = auction->cur_round; enum rounds round = auction->cur_round;
@ -306,7 +326,12 @@ BRANDT_got_message (struct BRANDT_Auction *auction,
atype = auction->m > 0 ? auction_mPlusFirstPrice : auction_firstPrice; atype = auction->m > 0 ? auction_mPlusFirstPrice : auction_firstPrice;
outcome = auction->outcome_public ? outcome_public : outcome_private; outcome = auction->outcome_public ? outcome_public : outcome_private;
/** \todo: cache out of order messages */ /** \todo: cache out of order messages instead of discarding */
if (ntohl (head->msg_type) != round || ntohl (head->prot_version) != 0)
{
weprintf ("got unexpected message, ignoring...");
return;
}
/* check if we already got that round message from the same user */ /* check if we already got that round message from the same user */
if (gcry_mpi_test_bit (auction->round_progress, sender)) if (gcry_mpi_test_bit (auction->round_progress, sender))
@ -317,8 +342,8 @@ BRANDT_got_message (struct BRANDT_Auction *auction,
if (!handler_in[atype][outcome][round] || if (!handler_in[atype][outcome][round] ||
!handler_in[atype][outcome][round](auction, !handler_in[atype][outcome][round](auction,
msg + sizeof (mtype), msg + sizeof (*head),
msg_len - sizeof (mtype), msg_len - sizeof (*head),
sender)) sender))
{ {
/** \todo */ /** \todo */

View File

@ -142,6 +142,8 @@ int fp_priv_recv_decryption (struct BRANDT_Auction *ad,
size_t buflen, size_t buflen,
uint16_t sender); uint16_t sender);
int32_t fp_priv_determine_outcome (struct BRANDT_Auction *ad);
unsigned char *fp_pub_compute_outcome (struct BRANDT_Auction *ad, unsigned char *fp_pub_compute_outcome (struct BRANDT_Auction *ad,
size_t *buflen); size_t *buflen);
int fp_pub_recv_outcome (struct BRANDT_Auction *ad, int fp_pub_recv_outcome (struct BRANDT_Auction *ad,
@ -156,7 +158,7 @@ int fp_pub_recv_decryption (struct BRANDT_Auction *ad,
size_t buflen, size_t buflen,
uint16_t sender); uint16_t sender);
int32_t fp_priv_determine_outcome (struct BRANDT_Auction *ad); int32_t fp_pub_determine_outcome (struct BRANDT_Auction *ad, uint16_t *winner);
/* --- Round dictionaries --- */ /* --- Round dictionaries --- */