[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[GNUnet-SVN] r33375 - in gnunet/src: include scalarproduct secretsharing
From: |
gnunet |
Subject: |
[GNUnet-SVN] r33375 - in gnunet/src: include scalarproduct secretsharing |
Date: |
Sat, 24 May 2014 20:06:44 +0200 |
Author: grothoff
Date: 2014-05-24 20:06:44 +0200 (Sat, 24 May 2014)
New Revision: 33375
Modified:
gnunet/src/include/gnunet_secretsharing_service.h
gnunet/src/scalarproduct/gnunet-service-scalarproduct.c
gnunet/src/secretsharing/secretsharing_api.c
gnunet/src/secretsharing/secretsharing_common.c
Log:
-doxygen, some additional error checking
Modified: gnunet/src/include/gnunet_secretsharing_service.h
===================================================================
--- gnunet/src/include/gnunet_secretsharing_service.h 2014-05-23 14:41:42 UTC
(rev 33374)
+++ gnunet/src/include/gnunet_secretsharing_service.h 2014-05-24 18:06:44 UTC
(rev 33375)
@@ -187,7 +187,7 @@
* with the other peers.
*
* @param cfg configuration to use
- * @param num_peers number of peers in 'peers'
+ * @param num_peers number of peers in @a peers
* @param peers array of peers that we will share secrets with, can optionally
contain the local peer
* @param session_id unique session id
* @param start When should all peers be available for sharing the secret?
@@ -196,7 +196,7 @@
* by underlying consensus sessions
* @param threshold minimum number of peers that must cooperate to decrypt a
value
* @param cb called when the secret has been established
- * @param cls closure for cb
+ * @param cls closure for @a cb
*/
struct GNUNET_SECRETSHARING_Session *
GNUNET_SECRETSHARING_create_session (const struct GNUNET_CONFIGURATION_Handle
*cfg,
@@ -214,10 +214,10 @@
* Destroy a secret sharing session.
* The secret ready callback will not be called.
*
- * @param session session to destroy
+ * @param s session to destroy
*/
void
-GNUNET_SECRETSHARING_session_destroy (struct GNUNET_SECRETSHARING_Session
*session);
+GNUNET_SECRETSHARING_session_destroy (struct GNUNET_SECRETSHARING_Session *s);
/**
@@ -271,10 +271,10 @@
* The decrypt_cb is not called anymore, but the calling
* peer may already have irrevocably contributed his share for the decryption
of the value.
*
- * @param decryption_handle decryption to cancel
+ * @param dh to cancel
*/
void
-GNUNET_SECRETSHARING_decrypt_cancel (struct
GNUNET_SECRETSHARING_DecryptionHandle *decryption_handle);
+GNUNET_SECRETSHARING_decrypt_cancel (struct
GNUNET_SECRETSHARING_DecryptionHandle *dh);
/**
Modified: gnunet/src/scalarproduct/gnunet-service-scalarproduct.c
===================================================================
--- gnunet/src/scalarproduct/gnunet-service-scalarproduct.c 2014-05-23
14:41:42 UTC (rev 33374)
+++ gnunet/src/scalarproduct/gnunet-service-scalarproduct.c 2014-05-24
18:06:44 UTC (rev 33375)
@@ -60,17 +60,17 @@
* Sorted Values are kept in a DLL
*/
struct SortedValue * next;
-
+
/**
* Sorted Values are kept in a DLL
*/
struct SortedValue * prev;
-
+
/**
* The element's id+integer-value
*/
struct GNUNET_SCALARPRODUCT_Element * elem;
-
+
/**
* the element's value converted to MPI
*/
@@ -91,7 +91,7 @@
* Is this session active(GNUNET_YES), Concluded(GNUNET_NO), (GNUNET_SYSERR)
*/
int32_t active;
-
+
/**
* the role this peer has
*/
@@ -116,7 +116,7 @@
* Alice or Bob's peerID
*/
struct GNUNET_PeerIdentity peer;
-
+
/**
* the client this request is related to
*/
@@ -148,13 +148,13 @@
uint32_t transferred_element_count;
/**
- * Set of elements for which will conduction an intersection.
+ * Set of elements for which will conduction an intersection.
* the resulting elements are then used for computing the scalar product.
*/
struct GNUNET_SET_Handle * intersection_set;
/**
- * Set of elements for which will conduction an intersection.
+ * Set of elements for which will conduction an intersection.
* the resulting elements are then used for computing the scalar product.
*/
struct GNUNET_SET_OperationHandle * intersection_op;
@@ -561,7 +561,7 @@
s = GNUNET_SERVER_client_get_user_context (client, struct ServiceSession);
if (NULL == s)
return;
-
+
GNUNET_CONTAINER_DLL_remove (from_client_head, from_client_tail, s);
if (NULL != s->service_transmit_handle){
@@ -751,14 +751,14 @@
s);
if (NULL == s->service_transmit_handle) {
GNUNET_log (GNUNET_ERROR_TYPE_ERROR, _ ("Could not send service-response
message via cadet!)\n"));
-
+
GNUNET_free (msg);
s->msg = NULL;
GNUNET_CADET_channel_destroy(s->channel);
s->response->active = GNUNET_SYSERR;
-
+
GNUNET_CONTAINER_DLL_remove (from_service_head, from_service_tail, s);
-
+
s->response->client_notification_task =
GNUNET_SCHEDULER_add_now (&prepare_client_end_notification,
s->response);
@@ -852,7 +852,7 @@
GNUNET_CONTAINER_DLL_remove (from_service_head, from_service_tail, s);
GNUNET_CADET_channel_destroy(s->channel);
s->response->active = GNUNET_SYSERR;
-
+
s->response->client_notification_task =
GNUNET_SCHEDULER_add_now (&prepare_client_end_notification,
s->response);
@@ -1087,7 +1087,7 @@
case GNUNET_SET_STATUS_DONE:
s->intersection_op = NULL;
-
+
if (2 > s->used_element_count) {
// failed! do not leak information about our single remaining element!
// continue after the loop
@@ -1102,7 +1102,7 @@
for (i = 0; NULL != s->a_head; i++) {
struct SortedValue* a = s->a_head;
GNUNET_assert (i < s->used_element_count);
-
+
s->sorted_elements[i] = a->val;
GNUNET_CONTAINER_DLL_remove (s->a_head, s->a_tail, a);
GNUNET_free (a->elem);
@@ -1129,8 +1129,8 @@
//failed if we go here
GNUNET_break_op (0);
-
+
// and notify our client-session that we could not complete the session
if (ALICE == s->role) {
s->active = GNUNET_SYSERR;
@@ -1262,31 +1262,18 @@
msg->header.size = htons (msg_length);
msg->range = range;
msg->product_length = htonl (product_length);
-
s->msg = (struct GNUNET_MessageHeader *) msg;
- //transmit this message to our client
s->client_transmit_handle =
GNUNET_SERVER_notify_transmit_ready (s->client,
msg_length,
GNUNET_TIME_UNIT_FOREVER_REL,
&cb_transfer_message,
s);
- if (NULL == s->client_transmit_handle) {
- GNUNET_log (GNUNET_ERROR_TYPE_WARNING,
- _ ("Could not send message to client (%p)!\n"),
- s->client);
- GNUNET_SERVER_client_disconnect(s->client);
- free_session_variables(s);
- GNUNET_CONTAINER_DLL_remove (from_client_head, from_client_tail, s);
- GNUNET_free(s);
- }
- else
- // gracefully sent message, just terminate session structure
- GNUNET_log (GNUNET_ERROR_TYPE_INFO,
- _ ("Sent result to client (%p), this session (%s) has
ended!\n"),
- s->client,
- GNUNET_h2s (&s->session_id));
- free_session_variables (s);
+ GNUNET_break (NULL != s->client_transmit_handle);
+ GNUNET_log (GNUNET_ERROR_TYPE_INFO,
+ _ ("Sent result to client (%p), this session (%s) has ended!\n"),
+ s->client,
+ GNUNET_h2s (&s->session_id));
}
@@ -1317,7 +1304,8 @@
&cb_transfer_message,
s);
if (!s->service_transmit_handle) {
- GNUNET_log (GNUNET_ERROR_TYPE_ERROR, _ ("Could not send message to
channel!\n"));
+ GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
+ _ ("Could not send message to channel!\n"));
GNUNET_free (msg);
s->msg = NULL;
s->active = GNUNET_SYSERR;
@@ -1383,7 +1371,8 @@
&cb_transfer_message,
s);
if (!s->service_transmit_handle) {
- GNUNET_log (GNUNET_ERROR_TYPE_ERROR, _ ("Could not send service-request
multipart message to channel!\n"));
+ GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
+ _("Could not send service-request multipart message to
channel!\n"));
GNUNET_free (msg);
s->msg = NULL;
s->active = GNUNET_SYSERR;
@@ -1397,7 +1386,7 @@
/**
* Our client has finished sending us its multipart message.
- *
+ *
* @param session the service session context
*/
static void
@@ -1442,7 +1431,7 @@
/**
* Our client has finished sending us its multipart message.
- *
+ *
* @param session the service session context
*/
static void
@@ -1719,7 +1708,7 @@
_ ("Peer disconnected, terminating session %s with peer (%s)\n"),
GNUNET_h2s (&s->session_id),
GNUNET_i2s (&s->peer));
-
+
// as we have only one peer connected in each session, just remove the
session
s->channel = NULL;
@@ -1881,7 +1870,7 @@
// are we in the correct state?
s = (struct ServiceSession *) * channel_ctx;
//we are not bob
- if ((NULL == s->e_a) || //or we did not expect this message yet
+ if ((NULL == s->e_a) || //or we did not expect this message yet
(s->used_element_count == s->transferred_element_count)) { //we are not
expecting multipart messages
goto except;
}
@@ -2265,8 +2254,8 @@
GNUNET_assert (NULL != message);
s = (struct ServiceSession *) * channel_ctx;
// are we in the correct state?
- if (NULL == s->sorted_elements
- || NULL != s->msg
+ if (NULL == s->sorted_elements
+ || NULL != s->msg
|| s->used_element_count != s->transferred_element_count) {
goto invalid_msg;
}
@@ -2411,7 +2400,7 @@
0
};
cfg = c;
-
+
//generate private/public key set
GNUNET_CRYPTO_paillier_create (&my_pubkey, &my_privkey);
Modified: gnunet/src/secretsharing/secretsharing_api.c
===================================================================
--- gnunet/src/secretsharing/secretsharing_api.c 2014-05-23 14:41:42 UTC
(rev 33374)
+++ gnunet/src/secretsharing/secretsharing_api.c 2014-05-24 18:06:44 UTC
(rev 33375)
@@ -44,7 +44,7 @@
struct GNUNET_CLIENT_Connection *client;
/**
- * Message queue for 'client'.
+ * Message queue for @e client.
*/
struct GNUNET_MQ_Handle *mq;
@@ -54,12 +54,15 @@
GNUNET_SECRETSHARING_SecretReadyCallback secret_ready_cb;
/**
- * Closure for 'secret_ready_cb'.
+ * Closure for @e secret_ready_cb.
*/
void *secret_ready_cls;
};
+/**
+ * Handle to cancel a cooperative decryption operation.
+ */
struct GNUNET_SECRETSHARING_DecryptionHandle
{
/**
@@ -68,7 +71,7 @@
struct GNUNET_CLIENT_Connection *client;
/**
- * Message queue for 'client'.
+ * Message queue for @e client.
*/
struct GNUNET_MQ_Handle *mq;
@@ -78,7 +81,7 @@
GNUNET_SECRETSHARING_DecryptCallback decrypt_cb;
/**
- * Closure for 'decrypt_cb'.
+ * Closure for @e decrypt_cb.
*/
void *decrypt_cls;
};
@@ -103,6 +106,9 @@
static gcry_mpi_t elgamal_g;
+/**
+ * Function to initialize #elgamal_q, #egamal_p and #elgamal_g.
+ */
static void
ensure_elgamal_initialized (void)
{
@@ -118,60 +124,117 @@
}
+/**
+ * Callback invoked when there is an error communicating with
+ * the service. Notifies the application about the error.
+ *
+ * @param cls the `struct GNUNET_SECRETSHARING_Session`
+ * @param error error code
+ */
static void
-handle_session_client_error (void *cls, enum GNUNET_MQ_Error error)
+handle_session_client_error (void *cls,
+ enum GNUNET_MQ_Error error)
{
struct GNUNET_SECRETSHARING_Session *s = cls;
s->secret_ready_cb (s->secret_ready_cls, NULL, NULL, 0, NULL);
+ GNUNET_SECRETSHARING_session_destroy (s);
}
+/**
+ * Callback invoked when there is an error communicating with
+ * the service. Notifies the application about the error.
+ *
+ * @param cls the `struct GNUNET_SECRETSHARING_DecryptionHandle`
+ * @param error error code
+ */
static void
-handle_decrypt_client_error (void *cls, enum GNUNET_MQ_Error error)
+handle_decrypt_client_error (void *cls,
+ enum GNUNET_MQ_Error error)
{
struct GNUNET_SECRETSHARING_DecryptionHandle *dh = cls;
-
+
dh->decrypt_cb (dh->decrypt_cls, NULL);
+ GNUNET_SECRETSHARING_decrypt_cancel (dh);
}
+/**
+ * Handler invoked with the final result message from
+ * secret sharing. Decodes the message and passes the
+ * result to the application.
+ *
+ * @param cls the `struct GNUNET_SECRETSHARING_Session`
+ * @param msg message with the result
+ */
static void
-handle_secret_ready (void *cls, const struct GNUNET_MessageHeader *msg)
+handle_secret_ready (void *cls,
+ const struct GNUNET_MessageHeader *msg)
{
- struct GNUNET_SECRETSHARING_Session *session = cls;
+ struct GNUNET_SECRETSHARING_Session *s = cls;
+ const struct GNUNET_SECRETSHARING_SecretReadyMessage *m;
struct GNUNET_SECRETSHARING_Share *share;
- const struct GNUNET_SECRETSHARING_SecretReadyMessage *m = (const void *) msg;
size_t share_size;
- LOG (GNUNET_ERROR_TYPE_DEBUG, "got secret ready message of size %u\n",
- ntohs (m->header.size));
+ LOG (GNUNET_ERROR_TYPE_DEBUG,
+ "Got secret ready message of size %u\n",
+ ntohs (msg->size));
+ if (ntohs (msg->size) < sizeof (struct
GNUNET_SECRETSHARING_SecretReadyMessage))
+ {
+ GNUNET_break (0);
+ s->secret_ready_cb (s->secret_ready_cls, NULL, NULL, 0, NULL);
+ GNUNET_SECRETSHARING_session_destroy (s);
+ return;
+ }
+ m = (const struct GNUNET_SECRETSHARING_SecretReadyMessage *) msg;
+ share_size = ntohs (m->header.size) - sizeof (struct
GNUNET_SECRETSHARING_SecretReadyMessage);
- share_size = ntohs (m->header.size) - sizeof *m;
-
- share = GNUNET_SECRETSHARING_share_read (&m[1], share_size, NULL);
-
- session->secret_ready_cb (session->secret_ready_cls,
+ share = GNUNET_SECRETSHARING_share_read (&m[1],
+ share_size,
+ NULL);
+ s->secret_ready_cb (s->secret_ready_cls,
share, /* FIXME */
&share->public_key,
share->num_peers,
(struct GNUNET_PeerIdentity *) &m[1]);
-
- GNUNET_SECRETSHARING_session_destroy (session);
+ GNUNET_SECRETSHARING_session_destroy (s);
}
+/**
+ * Destroy a secret sharing session.
+ * The secret ready callback will not be called.
+ *
+ * @param s session to destroy
+ */
void
-GNUNET_SECRETSHARING_session_destroy (struct GNUNET_SECRETSHARING_Session
*session)
+GNUNET_SECRETSHARING_session_destroy (struct GNUNET_SECRETSHARING_Session *s)
{
- GNUNET_MQ_destroy (session->mq);
- session->mq = NULL;
- GNUNET_CLIENT_disconnect (session->client);
- session->client = NULL;
- GNUNET_free (session);
+ GNUNET_MQ_destroy (s->mq);
+ s->mq = NULL;
+ GNUNET_CLIENT_disconnect (s->client);
+ s->client = NULL;
+ GNUNET_free (s);
}
+/**
+ * Create a session that will eventually establish a shared secret
+ * with the other peers.
+ *
+ * @param cfg configuration to use
+ * @param num_peers number of peers in @a peers
+ * @param peers array of peers that we will share secrets with, can optionally
contain the local peer
+ * @param session_id unique session id
+ * @param start When should all peers be available for sharing the secret?
+ * Random number generation can take place before the start time.
+ * @param deadline point in time where the session must be established; taken
as hint
+ * by underlying consensus sessions
+ * @param threshold minimum number of peers that must cooperate to decrypt a
value
+ * @param cb called when the secret has been established
+ * @param cls closure for @a cb
+ */
struct GNUNET_SECRETSHARING_Session *
GNUNET_SECRETSHARING_create_session (const struct GNUNET_CONFIGURATION_Handle
*cfg,
unsigned int num_peers,
@@ -187,19 +250,25 @@
struct GNUNET_MQ_Envelope *ev;
struct GNUNET_SECRETSHARING_CreateMessage *msg;
static const struct GNUNET_MQ_MessageHandler mq_handlers[] = {
- {handle_secret_ready,
GNUNET_MESSAGE_TYPE_SECRETSHARING_CLIENT_SECRET_READY, 0},
+ { &handle_secret_ready,
+ GNUNET_MESSAGE_TYPE_SECRETSHARING_CLIENT_SECRET_READY, 0},
GNUNET_MQ_HANDLERS_END
};
-
s = GNUNET_new (struct GNUNET_SECRETSHARING_Session);
s->client = GNUNET_CLIENT_connect ("secretsharing", cfg);
+ if (NULL == s->client)
+ {
+ /* secretsharing not configured correctly */
+ GNUNET_break (0);
+ GNUNET_free (s);
+ return NULL;
+ }
s->secret_ready_cb = cb;
s->secret_ready_cls = cls;
- GNUNET_assert (NULL != s->client);
-
s->mq = GNUNET_MQ_queue_for_connection_client (s->client, mq_handlers,
-
handle_session_client_error, s);
+ &handle_session_client_error,
+ s);
GNUNET_assert (NULL != s->mq);
ev = GNUNET_MQ_msg_extra (msg,
@@ -215,19 +284,20 @@
GNUNET_MQ_send (s->mq, ev);
- LOG (GNUNET_ERROR_TYPE_DEBUG, "secretsharing session created with %u
peers\n",
+ LOG (GNUNET_ERROR_TYPE_DEBUG,
+ "Secretsharing session created with %u peers\n",
num_peers);
return s;
}
static void
-handle_decrypt_done (void *cls, const struct GNUNET_MessageHeader *msg)
+handle_decrypt_done (void *cls,
+ const struct GNUNET_MessageHeader *msg)
{
struct GNUNET_SECRETSHARING_DecryptionHandle *dh = cls;
const struct GNUNET_SECRETSHARING_DecryptResponseMessage *m =
- (const void *) msg;
-
+ (const void *) msg; // FIXME: size check!?
const struct GNUNET_SECRETSHARING_Plaintext *plaintext;
if (m->success == 0)
@@ -280,7 +350,8 @@
GNUNET_assert (NULL != s->client);
s->mq = GNUNET_MQ_queue_for_connection_client (s->client, mq_handlers,
- handle_decrypt_client_error,
s);
+ &handle_decrypt_client_error,
+ s);
GNUNET_assert (NULL != s->mq);
GNUNET_assert (GNUNET_OK == GNUNET_SECRETSHARING_share_write (share, NULL,
0, &share_size));
@@ -376,7 +447,7 @@
// Randomize y such that 0 < y < elgamal_q.
// The '- 1' is necessary as bitlength(q) = bitlength(p) - 1.
- do
+ do
{
gcry_mpi_randomize (y, GNUNET_SECRETSHARING_ELGAMAL_BITS - 1,
GCRY_WEAK_RANDOM);
} while ((gcry_mpi_cmp_ui (y, 0) == 0) || (gcry_mpi_cmp (y, elgamal_q) >=
0));
@@ -386,10 +457,10 @@
// write tmp to c1
GNUNET_CRYPTO_mpi_print_unsigned (&result_ciphertext->c1_bits,
GNUNET_SECRETSHARING_ELGAMAL_BITS / 8,
tmp);
-
+
// tmp <- h^y
gcry_mpi_powm (tmp, h, y, elgamal_p);
- // tmp <- tmp * m
+ // tmp <- tmp * m
gcry_mpi_mulm (tmp, tmp, m, elgamal_p);
// write tmp to c2
GNUNET_CRYPTO_mpi_print_unsigned (&result_ciphertext->c2_bits,
@@ -399,15 +470,22 @@
}
+/**
+ * Cancel a decryption.
+ *
+ * The decrypt_cb is not called anymore, but the calling
+ * peer may already have irrevocably contributed his share for the decryption
of the value.
+ *
+ * @param dh to cancel
+ */
void
-GNUNET_SECRETSHARING_decrypt_cancel (struct
GNUNET_SECRETSHARING_DecryptionHandle *h)
+GNUNET_SECRETSHARING_decrypt_cancel (struct
GNUNET_SECRETSHARING_DecryptionHandle *dh)
{
- GNUNET_MQ_destroy (h->mq);
- h->mq = NULL;
- GNUNET_CLIENT_disconnect (h->client);
- h->client = NULL;
- GNUNET_free (h);
+ GNUNET_MQ_destroy (dh->mq);
+ dh->mq = NULL;
+ GNUNET_CLIENT_disconnect (dh->client);
+ dh->client = NULL;
+ GNUNET_free (dh);
}
-
-
+/* end of secretsharing_api.c */
Modified: gnunet/src/secretsharing/secretsharing_common.c
===================================================================
--- gnunet/src/secretsharing/secretsharing_common.c 2014-05-23 14:41:42 UTC
(rev 33374)
+++ gnunet/src/secretsharing/secretsharing_common.c 2014-05-24 18:06:44 UTC
(rev 33375)
@@ -30,7 +30,9 @@
* @return The share, or NULL on error.
*/
struct GNUNET_SECRETSHARING_Share *
-GNUNET_SECRETSHARING_share_read (const void *data, size_t len, size_t *readlen)
+GNUNET_SECRETSHARING_share_read (const void *data,
+ size_t len,
+ size_t *readlen)
{
struct GNUNET_SECRETSHARING_Share *share;
const struct GNUNET_SECRETSHARING_ShareHeaderNBO *sh = data;
@@ -38,8 +40,8 @@
size_t n;
uint16_t payload_size;
- payload_size = ntohs (sh->num_peers) *
- (sizeof (uint16_t) + sizeof (struct GNUNET_SECRETSHARING_FieldElement) +
+ payload_size = ntohs (sh->num_peers) *
+ (sizeof (uint16_t) + sizeof (struct GNUNET_SECRETSHARING_FieldElement) +
sizeof (struct GNUNET_PeerIdentity));
if (NULL != readlen)
@@ -94,8 +96,8 @@
char *p;
int n;
- payload_size = share->num_peers *
- (sizeof (uint16_t) + sizeof (struct GNUNET_SECRETSHARING_FieldElement) +
+ payload_size = share->num_peers *
+ (sizeof (uint16_t) + sizeof (struct GNUNET_SECRETSHARING_FieldElement) +
sizeof (struct GNUNET_PeerIdentity));
if (NULL != writelen)
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- [GNUnet-SVN] r33375 - in gnunet/src: include scalarproduct secretsharing,
gnunet <=