start with brandt.c
This commit is contained in:
parent
39ff8cfaa4
commit
4deee5eb12
82
brandt.c
82
brandt.c
@ -22,8 +22,62 @@
|
|||||||
#include <gcrypt.h>
|
#include <gcrypt.h>
|
||||||
|
|
||||||
#include "crypto.h"
|
#include "crypto.h"
|
||||||
|
#include "internals.h"
|
||||||
#include "util.h"
|
#include "util.h"
|
||||||
|
|
||||||
|
|
||||||
|
typedef int
|
||||||
|
(*msg_recv)(struct BRANDT_Auction *ad,
|
||||||
|
const unsigned char *buf,
|
||||||
|
size_t buflen,
|
||||||
|
uint16_t sender);
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* stores the function pointers to receive functions for each state.
|
||||||
|
*
|
||||||
|
* The first index denotes if a first price auction or a M+1st price auction is
|
||||||
|
* used. If it is 0, it is a first price auction, if it is 1, it is a M+1st
|
||||||
|
* price auction.
|
||||||
|
*
|
||||||
|
* The second index denotes if the outcome should be public or private. A value
|
||||||
|
* of 0 means a private outcome, while a value of 1 means public outcome.
|
||||||
|
*/
|
||||||
|
static msg_recv handler_in[2][2][msg_last] =
|
||||||
|
{
|
||||||
|
[0] =
|
||||||
|
{
|
||||||
|
[0] =
|
||||||
|
{
|
||||||
|
[msg_init] = smc_recv_keyshare,
|
||||||
|
[msg_bid] = smc_recv_encrypted_bid,
|
||||||
|
[msg_outcome] = fp_priv_recv_outcome,
|
||||||
|
[msg_decrypt] = fp_priv_recv_decryption,
|
||||||
|
},
|
||||||
|
[1] =
|
||||||
|
{
|
||||||
|
[msg_init] = smc_recv_keyshare,
|
||||||
|
[msg_bid] = smc_recv_encrypted_bid,
|
||||||
|
[msg_outcome] = fp_pub_recv_outcome,
|
||||||
|
[msg_decrypt] = fp_pub_recv_decryption,
|
||||||
|
}
|
||||||
|
},
|
||||||
|
[1] =
|
||||||
|
{
|
||||||
|
[0] =
|
||||||
|
{
|
||||||
|
[msg_init] = smc_recv_keyshare,
|
||||||
|
[msg_bid] = smc_recv_encrypted_bid,
|
||||||
|
},
|
||||||
|
[1] =
|
||||||
|
{
|
||||||
|
[msg_init] = smc_recv_keyshare,
|
||||||
|
[msg_bid] = smc_recv_encrypted_bid,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
void
|
void
|
||||||
BRANDT_init ()
|
BRANDT_init ()
|
||||||
{
|
{
|
||||||
@ -37,7 +91,7 @@ BRANDT_init ()
|
|||||||
weprintf ("failed to set libgcrypt option DISABLE_SECMEM: %s",
|
weprintf ("failed to set libgcrypt option DISABLE_SECMEM: %s",
|
||||||
gcry_strerror (err));
|
gcry_strerror (err));
|
||||||
|
|
||||||
/* ecc is slow otherwise. */
|
/* ecc is slow otherwise and we don't create long term keys anyway. */
|
||||||
if ((err = gcry_control (GCRYCTL_ENABLE_QUICK_RANDOM, 0)))
|
if ((err = gcry_control (GCRYCTL_ENABLE_QUICK_RANDOM, 0)))
|
||||||
weprintf ("failed to set libgcrypt option ENABLE_QUICK_RANDOM: %s",
|
weprintf ("failed to set libgcrypt option ENABLE_QUICK_RANDOM: %s",
|
||||||
gcry_strerror (err));
|
gcry_strerror (err));
|
||||||
@ -45,3 +99,29 @@ BRANDT_init ()
|
|||||||
gcry_control (GCRYCTL_INITIALIZATION_FINISHED, 0);
|
gcry_control (GCRYCTL_INITIALIZATION_FINISHED, 0);
|
||||||
brandt_crypto_init ();
|
brandt_crypto_init ();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void
|
||||||
|
BRANDT_got_message (struct BRANDT_Auction *auction,
|
||||||
|
uint16_t sender,
|
||||||
|
const unsigned char *msg,
|
||||||
|
size_t msg_len)
|
||||||
|
{
|
||||||
|
uint16_t type = *(uint16_t *)msg;
|
||||||
|
int m = !!auction->desc->m;
|
||||||
|
int pub = !!auction->desc->outcome_public;
|
||||||
|
enum rounds round = auction->cur_round;
|
||||||
|
|
||||||
|
/** todo: cache out of order messages */
|
||||||
|
|
||||||
|
if (!handler_in[m][pub][round] ||
|
||||||
|
!handler_in[m][pub][round](auction,
|
||||||
|
msg + sizeof (type),
|
||||||
|
msg_len - sizeof (type),
|
||||||
|
sender))
|
||||||
|
{
|
||||||
|
/** \todo */
|
||||||
|
weprintf ("wow fail");
|
||||||
|
}
|
||||||
|
msg + sizeof (type);
|
||||||
|
}
|
||||||
|
71
brandt.h
71
brandt.h
@ -23,19 +23,16 @@
|
|||||||
#ifndef _BRANDT_BRANDT_H
|
#ifndef _BRANDT_BRANDT_H
|
||||||
#define _BRANDT_BRANDT_H
|
#define _BRANDT_BRANDT_H
|
||||||
|
|
||||||
#include <unistd.h>
|
|
||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
|
#include <unistd.h>
|
||||||
|
|
||||||
/**
|
/** defined in internals.h */
|
||||||
* \todo.
|
|
||||||
*/
|
|
||||||
struct BRANDT_Auction;
|
struct BRANDT_Auction;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Functions of this type are called by libbrandt to broadcast messages to the
|
* Functions of this type are called by libbrandt to broadcast messages to the
|
||||||
* blackboard of a specific auction.
|
* blackboard of a specific auction. They have to be sent using authenticated
|
||||||
*
|
* encryption.
|
||||||
* \todo: how must the message be handled? (encryption, auth, reliability, …)
|
|
||||||
*
|
*
|
||||||
* @param[in] auction_closure Closure pointer representing the respective
|
* @param[in] auction_closure Closure pointer representing the respective
|
||||||
* auction. This is the Pointer given to BRANDT_join().
|
* auction. This is the Pointer given to BRANDT_join().
|
||||||
@ -45,16 +42,15 @@ struct BRANDT_Auction;
|
|||||||
* @return 0 on success, -1 on failure.
|
* @return 0 on success, -1 on failure.
|
||||||
*/
|
*/
|
||||||
typedef int
|
typedef int
|
||||||
(*BRANDT_BroadcastCallback)(void * auction_closure,
|
(*BRANDT_CbBroadcast)(void *auction_closure,
|
||||||
const void *msg,
|
const void *msg,
|
||||||
size_t msg_len);
|
size_t msg_len);
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Functions of this type are called by libbrandt to unicast messages to the
|
* Functions of this type are called by libbrandt to unicast messages to the
|
||||||
* seller of a specific auction.
|
* seller of a specific auction. They have to be sent using authenticated
|
||||||
*
|
* encryption.
|
||||||
* \todo: how must the message be handled? (encryption, auth, reliability, …)
|
|
||||||
*
|
*
|
||||||
* @param[in] auction_closure Closure pointer representing the respective
|
* @param[in] auction_closure Closure pointer representing the respective
|
||||||
* auction. This is the Pointer given to BRANDT_join().
|
* auction. This is the Pointer given to BRANDT_join().
|
||||||
@ -63,7 +59,7 @@ typedef int
|
|||||||
* @return 0 on success, -1 on failure.
|
* @return 0 on success, -1 on failure.
|
||||||
*/
|
*/
|
||||||
typedef int
|
typedef int
|
||||||
(*BRANDT_UnicastSellerCallback)(void * auction_closure,
|
(*BRANDT_CbUnicast)(void *auction_closure,
|
||||||
const void *msg,
|
const void *msg,
|
||||||
size_t msg_len);
|
size_t msg_len);
|
||||||
|
|
||||||
@ -72,7 +68,6 @@ typedef int
|
|||||||
* Functions of this type are called by libbrandt to report the auction outcome
|
* Functions of this type are called by libbrandt to report the auction outcome
|
||||||
* or malicious/erroneous participants.
|
* or malicious/erroneous participants.
|
||||||
*
|
*
|
||||||
* \todo: update price type.
|
|
||||||
* \todo: export proof of erroneous behaviour.
|
* \todo: export proof of erroneous behaviour.
|
||||||
*
|
*
|
||||||
* @param[in] auction_closure Closure pointer representing the respective
|
* @param[in] auction_closure Closure pointer representing the respective
|
||||||
@ -84,7 +79,7 @@ typedef int
|
|||||||
* is private and the user did not win.
|
* is private and the user did not win.
|
||||||
*/
|
*/
|
||||||
typedef void
|
typedef void
|
||||||
(*BRANDT_ReportResultCallback)(void * auction_closure,
|
(*BRANDT_CbResult)(void *auction_closure,
|
||||||
unsigned int bidder_id,
|
unsigned int bidder_id,
|
||||||
int status,
|
int status,
|
||||||
uint16_t price);
|
uint16_t price);
|
||||||
@ -98,7 +93,7 @@ BRANDT_init ();
|
|||||||
*
|
*
|
||||||
* @param[in] broadcast Pointer to the broadcast callback function
|
* @param[in] broadcast Pointer to the broadcast callback function
|
||||||
* @param[in] unicast Pointer to the unicast callback function
|
* @param[in] unicast Pointer to the unicast callback function
|
||||||
* @param[in] report Pointer to the report callback function
|
* @param[in] result Pointer to the result callback function
|
||||||
* @param[in] auction_closure Closure pointer representing the auction. This
|
* @param[in] auction_closure Closure pointer representing the auction. This
|
||||||
* will not be touched by libbrandt. It is only passed to the callbacks.
|
* will not be touched by libbrandt. It is only passed to the callbacks.
|
||||||
* @param[in] auction_data The auction information data a an opaque data
|
* @param[in] auction_data The auction information data a an opaque data
|
||||||
@ -110,9 +105,9 @@ BRANDT_init ();
|
|||||||
* black-box pointer, do NOT access/change it or the data it points to!
|
* black-box pointer, do NOT access/change it or the data it points to!
|
||||||
*/
|
*/
|
||||||
struct BRANDT_Auction *
|
struct BRANDT_Auction *
|
||||||
BRANDT_join (BRANDT_BroadcastCallback broadcast,
|
BRANDT_join (BRANDT_CbBroadcast broadcast,
|
||||||
BRANDT_UnicastSellerCallback unicast,
|
BRANDT_CbUnicast unicast,
|
||||||
BRANDT_ReportResultCallback report,
|
BRANDT_CbResult result,
|
||||||
const void *auction_closure,
|
const void *auction_closure,
|
||||||
const void *auction_data,
|
const void *auction_data,
|
||||||
size_t auction_data_len);
|
size_t auction_data_len);
|
||||||
@ -132,7 +127,7 @@ BRANDT_join (BRANDT_BroadcastCallback broadcast,
|
|||||||
* Create a new auction described by the @a auction_data parameter.
|
* Create a new auction described by the @a auction_data parameter.
|
||||||
*
|
*
|
||||||
* @param[in] broadcast Pointer to the broadcast callback function
|
* @param[in] broadcast Pointer to the broadcast callback function
|
||||||
* @param[in] report Pointer to the report callback function
|
* @param[in] result Pointer to the result callback function
|
||||||
* @param[in] auction_closure Closure pointer representing the auction. This
|
* @param[in] auction_closure Closure pointer representing the auction. This
|
||||||
* will not be touched by libbrandt. It is only passed to the callbacks.
|
* will not be touched by libbrandt. It is only passed to the callbacks.
|
||||||
* @param[out] auction_data The auction information data a an opaque data
|
* @param[out] auction_data The auction information data a an opaque data
|
||||||
@ -155,44 +150,34 @@ BRANDT_join (BRANDT_BroadcastCallback broadcast,
|
|||||||
* black-box pointer, do NOT access/change it or the data it points to!
|
* black-box pointer, do NOT access/change it or the data it points to!
|
||||||
*/
|
*/
|
||||||
struct BRANDT_Auction *
|
struct BRANDT_Auction *
|
||||||
BRANDT_new (BRANDT_BroadcastCallback broadcast,
|
BRANDT_new (BRANDT_CbBroadcast broadcast,
|
||||||
BRANDT_ReportResultCallback report,
|
BRANDT_CbResult result,
|
||||||
const void * auction_closure,
|
void *auction_closure,
|
||||||
const void ** auction_data,
|
void **auction_data,
|
||||||
size_t *auction_data_len,
|
size_t *auction_data_len,
|
||||||
uint16_t num_prices,
|
uint16_t num_prices,
|
||||||
uint16_t m,
|
uint16_t m,
|
||||||
int outcome_public);
|
int outcome_public);
|
||||||
|
|
||||||
|
|
||||||
|
/** \todo */
|
||||||
|
void
|
||||||
|
BRANDT_free ();
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Receive a broadcast message related to a specific auction.
|
* Receive a message related to a specific auction.
|
||||||
*
|
*
|
||||||
* @param[in] auction The pointer returned by BRANDT_join() or BRANDT_new() from
|
* @param[in] auction The pointer returned by BRANDT_join() or BRANDT_new() from
|
||||||
* which message @a msg was received.
|
* which message @a msg was received.
|
||||||
|
* @param[in] sender The id of the sender.
|
||||||
* @param[in] msg The message that was received.
|
* @param[in] msg The message that was received.
|
||||||
* @param[in] msg_len The length in bytes of @a msg.
|
* @param[in] msg_len The length in bytes of @a msg.
|
||||||
*/
|
*/
|
||||||
void
|
void
|
||||||
BRANDT_got_broadcast (struct BRANDT_Auction *auction,
|
BRANDT_got_message (struct BRANDT_Auction *auction,
|
||||||
void * msg,
|
uint16_t sender,
|
||||||
size_t msg_len);
|
const unsigned char *msg,
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Receive a unicast message from a bidder related to a specific auction.
|
|
||||||
*
|
|
||||||
* @param[in] auction The pointer returned by BRANDT_new() from which message
|
|
||||||
* @a msg was received.
|
|
||||||
* @param[in] msg The message that was received.
|
|
||||||
* @param[in] msg_len The length in bytes of @a msg.
|
|
||||||
* \todo: how to link message to sender id within auction?
|
|
||||||
* ANSWER: on start, know that we have 'n' participants, here give
|
|
||||||
* participant number (1..n)
|
|
||||||
*/
|
|
||||||
void
|
|
||||||
BRANDT_got_unicast (struct BRANDT_Auction *auction,
|
|
||||||
void * msg,
|
|
||||||
size_t msg_len);
|
size_t msg_len);
|
||||||
|
|
||||||
|
|
||||||
|
57
internals.h
57
internals.h
@ -25,7 +25,50 @@
|
|||||||
|
|
||||||
#include <gcrypt.h>
|
#include <gcrypt.h>
|
||||||
|
|
||||||
struct AuctionData {
|
#include "brandt.h"
|
||||||
|
|
||||||
|
|
||||||
|
enum rounds {
|
||||||
|
msg_init,
|
||||||
|
msg_bid,
|
||||||
|
msg_outcome,
|
||||||
|
msg_decrypt,
|
||||||
|
msg_last
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This struct describes an auction and has to be followed by #description_len
|
||||||
|
* bytes of arbitrary data where the description of the item to be sold is
|
||||||
|
* stored. */
|
||||||
|
struct AuctionDescr {
|
||||||
|
/** The length of the description in bytes directly following this struct */
|
||||||
|
uint32_t description_len;
|
||||||
|
|
||||||
|
/** Auction type. 0 means first price Auction, >= 0 means M+1st price
|
||||||
|
* auction with an amount of m items being sold. */
|
||||||
|
uint16_t m;
|
||||||
|
|
||||||
|
/** Outcome type. 0 means private outcome, everything else means public
|
||||||
|
* outcome. */
|
||||||
|
uint16_t outcome_public;
|
||||||
|
|
||||||
|
/** The amount of possible prices */
|
||||||
|
uint16_t price_range;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
struct BRANDT_Auction {
|
||||||
|
struct AuctionDescr *desc; /** pointer to the auction information */
|
||||||
|
|
||||||
|
BRANDT_CbBroadcast bcast; /** broadcast callback */
|
||||||
|
BRANDT_CbUnicast ucast; /** unicast callback */
|
||||||
|
BRANDT_CbResult result; /** result reporting callback */
|
||||||
|
|
||||||
|
int seller_mode; /** If 0 we are bidding, selling otherwise */
|
||||||
|
enum rounds cur_round; /** The round we expect messages from */
|
||||||
|
gcry_mpi_t round_progress; /** Stores which round messages were received */
|
||||||
|
|
||||||
uint16_t n; /** The amount of bidders/agents */
|
uint16_t n; /** The amount of bidders/agents */
|
||||||
uint16_t k; /** The amount of possible prices */
|
uint16_t k; /** The amount of possible prices */
|
||||||
uint16_t i; /** Own agents index, only used when bidding */
|
uint16_t i; /** Own agents index, only used when bidding */
|
||||||
@ -38,9 +81,15 @@ struct AuctionData {
|
|||||||
gcry_mpi_point_t **alpha; /** alphas, size: n*k */
|
gcry_mpi_point_t **alpha; /** alphas, size: n*k */
|
||||||
gcry_mpi_point_t **beta; /** betas, size: n*k */
|
gcry_mpi_point_t **beta; /** betas, size: n*k */
|
||||||
|
|
||||||
gcry_mpi_point_t ***gamma; /** gamma, size: n*n*k */
|
gcry_mpi_point_t **gamma2; /** gamma2, for public outcome, size: n*k */
|
||||||
gcry_mpi_point_t ***delta; /** delta, size: n*n*k */
|
gcry_mpi_point_t ***gamma3; /** gamma3, for private outcome, size: n*n*k */
|
||||||
gcry_mpi_point_t ***phi; /** phi, size: n*n*k */
|
gcry_mpi_point_t **delta2; /** delta2, for public outcome, size: n*k */
|
||||||
|
gcry_mpi_point_t ***delta3; /** delta3, for private outcome, size: n*n*k */
|
||||||
|
gcry_mpi_point_t **phi2; /** phi2, for public outcome, size: n*k */
|
||||||
|
gcry_mpi_point_t ***phi3; /** phi3, for private outcome, size: n*n*k */
|
||||||
|
|
||||||
|
gcry_mpi_point_t *tmpa1; /** used for temporary storage, size: k */
|
||||||
|
gcry_mpi_point_t *tmpb1; /** used for temporary storage, size: k */
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif /* ifndef _BRANDT_INTERNALS_H */
|
#endif /* ifndef _BRANDT_INTERNALS_H */
|
||||||
|
Loading…
Reference in New Issue
Block a user