aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--brandt.c39
-rw-r--r--crypto.h4
2 files changed, 35 insertions, 8 deletions
diff --git a/brandt.c b/brandt.c
index 1d55a43..4a4dc49 100644
--- a/brandt.c
+++ b/brandt.c
@@ -261,19 +261,39 @@ advance_round (struct BRANDT_Auction *ad,
enum auction_type atype,
enum outcome_type outcome)
{
+ uint32_t price;
+ uint16_t winner = -1;
unsigned char *buf;
size_t buflen;
- /* if we got the current round message from all participants, advance to
- * next round */
+ /* if we did not got the current round message from all participants, don't
+ * 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++)
if (!gcry_mpi_test_bit (ad->round_progress, i))
return;
+ /* current round finished, clear round progress and advance to next one */
gcry_mpi_clear_highbit (ad->round_progress, 0);
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] ||
@@ -298,7 +318,7 @@ BRANDT_got_message (struct BRANDT_Auction *auction,
const unsigned char *msg,
size_t msg_len)
{
- uint16_t mtype = *(uint16_t *)msg;
+ struct msg_head *head = (struct msg_head *)msg;
enum auction_type atype;
enum outcome_type outcome;
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;
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 */
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] ||
!handler_in[atype][outcome][round](auction,
- msg + sizeof (mtype),
- msg_len - sizeof (mtype),
+ msg + sizeof (*head),
+ msg_len - sizeof (*head),
sender))
{
/** \todo */
diff --git a/crypto.h b/crypto.h
index 9cb5405..2f40ed3 100644
--- a/crypto.h
+++ b/crypto.h
@@ -142,6 +142,8 @@ int fp_priv_recv_decryption (struct BRANDT_Auction *ad,
size_t buflen,
uint16_t sender);
+int32_t fp_priv_determine_outcome (struct BRANDT_Auction *ad);
+
unsigned char *fp_pub_compute_outcome (struct BRANDT_Auction *ad,
size_t *buflen);
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,
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 --- */