From 8a946bb7c2bc6bb863980ecf16607c57c2b077ec Mon Sep 17 00:00:00 2001 From: Christian Grothoff Date: Sun, 19 Feb 2017 01:44:37 +0100 Subject: [PATCH] towards converting SP to new CADET API; still fails tests though --- src/scalarproduct/.gitignore | 1 + src/scalarproduct/Makefile.am | 8 +- .../gnunet-service-scalarproduct-ecc_alice.c | 113 ++--- .../gnunet-service-scalarproduct-ecc_bob.c | 439 +++++------------- .../gnunet-service-scalarproduct_alice.c | 213 ++++----- .../gnunet-service-scalarproduct_bob.c | 419 +++++------------ 6 files changed, 363 insertions(+), 830 deletions(-) diff --git a/src/scalarproduct/.gitignore b/src/scalarproduct/.gitignore index e244f1108..19909a3f9 100644 --- a/src/scalarproduct/.gitignore +++ b/src/scalarproduct/.gitignore @@ -3,3 +3,4 @@ gnunet-scalarproduct gnunet-service-scalarproduct-alice gnunet-service-scalarproduct-bob gnunet-service-scalarproduct-ecc-alice +test_ecc_scalarproduct diff --git a/src/scalarproduct/Makefile.am b/src/scalarproduct/Makefile.am index 10e04284f..98829408a 100644 --- a/src/scalarproduct/Makefile.am +++ b/src/scalarproduct/Makefile.am @@ -42,7 +42,7 @@ gnunet_service_scalarproduct_alice_SOURCES = \ gnunet-service-scalarproduct_alice.c gnunet_service_scalarproduct_alice_LDADD = \ $(top_builddir)/src/util/libgnunetutil.la \ - $(top_builddir)/src/cadet/libgnunetcadet.la \ + $(top_builddir)/src/cadet/libgnunetcadetnew.la \ $(top_builddir)/src/set/libgnunetset.la \ $(LIBGCRYPT_LIBS) \ -lgcrypt \ @@ -53,7 +53,7 @@ gnunet_service_scalarproduct_bob_SOURCES = \ gnunet-service-scalarproduct_bob.c gnunet_service_scalarproduct_bob_LDADD = \ $(top_builddir)/src/util/libgnunetutil.la \ - $(top_builddir)/src/cadet/libgnunetcadet.la \ + $(top_builddir)/src/cadet/libgnunetcadetnew.la \ $(top_builddir)/src/set/libgnunetset.la \ $(LIBGCRYPT_LIBS) \ -lgcrypt \ @@ -64,7 +64,7 @@ gnunet_service_scalarproduct_ecc_alice_SOURCES = \ gnunet-service-scalarproduct-ecc_alice.c gnunet_service_scalarproduct_ecc_alice_LDADD = \ $(top_builddir)/src/util/libgnunetutil.la \ - $(top_builddir)/src/cadet/libgnunetcadet.la \ + $(top_builddir)/src/cadet/libgnunetcadetnew.la \ $(top_builddir)/src/set/libgnunetset.la \ $(LIBGCRYPT_LIBS) \ -lgcrypt \ @@ -75,7 +75,7 @@ gnunet_service_scalarproduct_ecc_bob_SOURCES = \ gnunet-service-scalarproduct-ecc_bob.c gnunet_service_scalarproduct_ecc_bob_LDADD = \ $(top_builddir)/src/util/libgnunetutil.la \ - $(top_builddir)/src/cadet/libgnunetcadet.la \ + $(top_builddir)/src/cadet/libgnunetcadetnew.la \ $(top_builddir)/src/set/libgnunetset.la \ $(LIBGCRYPT_LIBS) \ -lgcrypt \ diff --git a/src/scalarproduct/gnunet-service-scalarproduct-ecc_alice.c b/src/scalarproduct/gnunet-service-scalarproduct-ecc_alice.c index 0b7f24e7e..79a6c6704 100644 --- a/src/scalarproduct/gnunet-service-scalarproduct-ecc_alice.c +++ b/src/scalarproduct/gnunet-service-scalarproduct-ecc_alice.c @@ -1,6 +1,6 @@ /* This file is part of GNUnet. - Copyright (C) 2013-2016 GNUnet e.V. + Copyright (C) 2013-2017 GNUnet e.V. GNUnet is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published @@ -238,15 +238,10 @@ destroy_service_session (struct AliceServiceSession *s) if (GNUNET_YES == s->in_destroy) return; s->in_destroy = GNUNET_YES; - if (NULL != s->cadet_mq) - { - GNUNET_MQ_destroy (s->cadet_mq); - s->cadet_mq = NULL; - } if (NULL != s->client) { struct GNUNET_SERVICE_Client *c = s->client; - + s->client = NULL; GNUNET_SERVICE_client_drop (c); } @@ -401,34 +396,25 @@ transmit_client_response (struct AliceServiceSession *s) } - /** * Function called whenever a channel is destroyed. Should clean up * any associated state. * * It must NOT call #GNUNET_CADET_channel_destroy() on the channel. * - * @param cls closure (set from #GNUNET_CADET_connect()) + * @param cls the `struct AliceServiceSession` * @param channel connection to the other end (henceforth invalid) - * @param channel_ctx place where local state associated - * with the channel is stored */ static void cb_channel_destruction (void *cls, - const struct GNUNET_CADET_Channel *channel, - void *channel_ctx) + const struct GNUNET_CADET_Channel *channel) { - struct AliceServiceSession *s = channel_ctx; + struct AliceServiceSession *s = cls; GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Peer disconnected, terminating session %s with peer %s\n", GNUNET_h2s (&s->session_id), GNUNET_i2s (&s->peer)); - if (NULL != s->cadet_mq) - { - GNUNET_MQ_destroy (s->cadet_mq); - s->cadet_mq = NULL; - } s->channel = NULL; if (GNUNET_SCALARPRODUCT_STATUS_ACTIVE == s->status) { @@ -492,56 +478,40 @@ compute_scalar_product (struct AliceServiceSession *session, * Handle a response we got from another service we wanted to * calculate a scalarproduct with. * - * @param cls closure (set from #GNUNET_CADET_connect) - * @param channel connection to the other end - * @param channel_ctx place to store local state associated with the channel - * @param message the actual message - * @return #GNUNET_OK to keep the connection open, - * #GNUNET_SYSERR to close it (we are done) + * @param cls the `struct AliceServiceSession *` + * @param msg the actual message */ -static int +static void handle_bobs_cryptodata_message (void *cls, - struct GNUNET_CADET_Channel *channel, - void **channel_ctx, - const struct GNUNET_MessageHeader *message) + const struct EccBobCryptodataMessage *msg) { - struct AliceServiceSession *s = *channel_ctx; - const struct EccBobCryptodataMessage *msg; - uint32_t contained; - uint16_t msg_size; + struct AliceServiceSession *s = cls; gcry_mpi_point_t prod_g_i_b_i; gcry_mpi_point_t prod_h_i_b_i; + uint32_t contained; - if (NULL == s) - { - GNUNET_break_op (0); - return GNUNET_SYSERR; - } - msg_size = ntohs (message->size); - if (sizeof (struct EccBobCryptodataMessage) > msg_size) - { - GNUNET_break_op (0); - return GNUNET_SYSERR; - } - msg = (const struct EccBobCryptodataMessage *) message; contained = ntohl (msg->contained_element_count); if (2 != contained) { GNUNET_break_op (0); - return GNUNET_SYSERR; + destroy_service_session (s); + return; } if (NULL == s->sorted_elements) { /* we're not ready yet, how can Bob be? */ GNUNET_break_op (0); - return GNUNET_SYSERR; + destroy_service_session (s); + return; } if (s->total != s->client_received_element_count) { /* we're not ready yet, how can Bob be? */ GNUNET_break_op (0); - return GNUNET_SYSERR; + destroy_service_session (s); + return; } + GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Received %u crypto values from Bob\n", (unsigned int) contained); @@ -556,7 +526,6 @@ handle_bobs_cryptodata_message (void *cls, gcry_mpi_point_release (prod_g_i_b_i); gcry_mpi_point_release (prod_h_i_b_i); transmit_client_response (s); - return GNUNET_OK; } @@ -636,8 +605,8 @@ send_alices_cryptodata_message (struct AliceServiceSession *s) unsigned int todo_count; s->sorted_elements - = GNUNET_malloc (GNUNET_CONTAINER_multihashmap_size (s->intersected_elements) * - sizeof (struct MpiElement)); + = GNUNET_new_array (GNUNET_CONTAINER_multihashmap_size (s->intersected_elements), + struct MpiElement); s->used_element_count = 0; GNUNET_CONTAINER_multihashmap_iterate (s->intersected_elements, ©_element_cb, @@ -843,6 +812,13 @@ cb_intersection_request_alice (void *cls, static void client_request_complete_alice (struct AliceServiceSession *s) { + struct GNUNET_MQ_MessageHandler cadet_handlers[] = { + GNUNET_MQ_hd_fixed_size (bobs_cryptodata_message, + GNUNET_MESSAGE_TYPE_SCALARPRODUCT_ECC_BOB_CRYPTODATA, + struct EccBobCryptodataMessage, + s), + GNUNET_MQ_handler_end () + }; struct EccServiceRequestMessage *msg; struct GNUNET_MQ_Envelope *e; struct GNUNET_HashCode set_sid; @@ -854,18 +830,21 @@ client_request_complete_alice (struct AliceServiceSession *s) "Creating new channel for session with key %s.\n", GNUNET_h2s (&s->session_id)); s->channel - = GNUNET_CADET_channel_create (my_cadet, + = GNUNET_CADET_channel_creatE (my_cadet, s, &s->peer, &s->session_id, - GNUNET_CADET_OPTION_RELIABLE); + GNUNET_CADET_OPTION_RELIABLE, + NULL, + &cb_channel_destruction, + cadet_handlers); if (NULL == s->channel) { s->status = GNUNET_SCALARPRODUCT_STATUS_FAILURE; prepare_client_end_notification (s); return; } - s->cadet_mq = GNUNET_CADET_mq_create (s->channel); + s->cadet_mq = GNUNET_CADET_get_mq (s->channel); s->intersection_listen = GNUNET_SET_listen (cfg, GNUNET_SET_OPERATION_INTERSECTION, @@ -890,7 +869,7 @@ client_request_complete_alice (struct AliceServiceSession *s) /** - * We're receiving additional set data. Check if + * We're receiving additional set data. Check if * @a msg is well-formed. * * @param cls client identification of the client @@ -898,7 +877,7 @@ client_request_complete_alice (struct AliceServiceSession *s) * @return #GNUNET_OK if @a msg is well-formed */ static int -check_alice_client_message_multipart (void *cls, +check_alice_client_message_multipart (void *cls, const struct ComputationBobCryptodataMultipartMessage *msg) { struct AliceServiceSession *s = cls; @@ -928,7 +907,7 @@ check_alice_client_message_multipart (void *cls, * @param msg the actual message */ static void -handle_alice_client_message_multipart (void *cls, +handle_alice_client_message_multipart (void *cls, const struct ComputationBobCryptodataMultipartMessage *msg) { struct AliceServiceSession *s = cls; @@ -983,7 +962,7 @@ handle_alice_client_message_multipart (void *cls, * @return #GNUNET_OK if @a msg is well-formed */ static int -check_alice_client_message (void *cls, +check_alice_client_message (void *cls, const struct AliceComputationMessage *msg) { struct AliceServiceSession *s = cls; @@ -1012,7 +991,7 @@ check_alice_client_message (void *cls, return GNUNET_OK; } - + /** * Handler for Alice's client request message. * We are doing request-initiation to compute a scalar product with a peer. @@ -1021,7 +1000,7 @@ check_alice_client_message (void *cls, * @param msg the actual message */ static void -handle_alice_client_message (void *cls, +handle_alice_client_message (void *cls, const struct AliceComputationMessage *msg) { struct AliceServiceSession *s = cls; @@ -1167,13 +1146,6 @@ run (void *cls, const struct GNUNET_CONFIGURATION_Handle *c, struct GNUNET_SERVICE_Handle *service) { - static const struct GNUNET_CADET_MessageHandler cadet_handlers[] = { - { &handle_bobs_cryptodata_message, - GNUNET_MESSAGE_TYPE_SCALARPRODUCT_ECC_BOB_CRYPTODATA, - 0}, - { NULL, 0, 0} - }; - cfg = c; edc = GNUNET_CRYPTO_ecc_dlog_prepare (MAX_RESULT, MAX_RAM); @@ -1181,10 +1153,7 @@ run (void *cls, GNUNET_CRYPTO_ecc_rnd_mpi (edc, &my_privkey, &my_privkey_inv); - my_cadet = GNUNET_CADET_connect (cfg, - NULL, - &cb_channel_destruction, - cadet_handlers); + my_cadet = GNUNET_CADET_connecT (cfg); if (NULL == my_cadet) { GNUNET_log (GNUNET_ERROR_TYPE_ERROR, @@ -1216,7 +1185,7 @@ GNUNET_SERVICE_MAIN GNUNET_MESSAGE_TYPE_SCALARPRODUCT_CLIENT_MULTIPART_ALICE, struct ComputationBobCryptodataMultipartMessage, NULL), - GNUNET_MQ_handler_end ()); + GNUNET_MQ_handler_end ()); /* end of gnunet-service-scalarproduct-ecc_alice.c */ diff --git a/src/scalarproduct/gnunet-service-scalarproduct-ecc_bob.c b/src/scalarproduct/gnunet-service-scalarproduct-ecc_bob.c index 06e30706e..26468f9e7 100644 --- a/src/scalarproduct/gnunet-service-scalarproduct-ecc_bob.c +++ b/src/scalarproduct/gnunet-service-scalarproduct-ecc_bob.c @@ -1,6 +1,6 @@ /* This file is part of GNUnet. - Copyright (C) 2013-2015 GNUnet e.V. + Copyright (C) 2013-2017 GNUnet e.V. GNUnet is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published @@ -58,12 +58,6 @@ struct MpiElement }; -/** - * An incoming session from CADET. - */ -struct CadetIncomingSession; - - /** * A scalarproduct session which tracks an offer for a * multiplication service by a local client. @@ -71,11 +65,6 @@ struct CadetIncomingSession; struct BobServiceSession { - /** - * (hopefully) unique transaction ID - */ - struct GNUNET_HashCode session_id; - /** * The client this request is related to. */ @@ -123,12 +112,6 @@ struct BobServiceSession */ gcry_mpi_point_t prod_h_i_b_i; - /** - * Handle for our associated incoming CADET session, or NULL - * if we have not gotten one yet. - */ - struct CadetIncomingSession *cadet; - /** * How many elements will be supplied in total from the client. */ @@ -166,20 +149,6 @@ struct BobServiceSession */ int in_destroy; -}; - - -/** - * An incoming session from CADET. - */ -struct CadetIncomingSession -{ - - /** - * Associated client session, or NULL. - */ - struct BobServiceSession *s; - /** * The CADET channel. */ @@ -200,18 +169,6 @@ struct CadetIncomingSession */ struct GNUNET_MQ_Handle *cadet_mq; - /** - * Has this CADET session been added to the map yet? - * #GNUNET_YES if so, in which case @e session_id is - * the key. - */ - int in_map; - - /** - * Are we already in #destroy_cadet_session()? - */ - int in_destroy; - }; @@ -220,16 +177,6 @@ struct CadetIncomingSession */ static const struct GNUNET_CONFIGURATION_Handle *cfg; -/** - * Map of `struct BobServiceSession`, by session keys. - */ -static struct GNUNET_CONTAINER_MultiHashMap *client_sessions; - -/** - * Map of `struct CadetIncomingSession`, by session keys. - */ -static struct GNUNET_CONTAINER_MultiHashMap *cadet_sessions; - /** * Handle to the CADET service. */ @@ -241,35 +188,6 @@ static struct GNUNET_CADET_Handle *my_cadet; static struct GNUNET_CRYPTO_EccDlogContext *edc; -/** - * Finds a not terminated client session in the respective map based on - * session key. - * - * @param key the session key we want to search for - * @return the matching session, or NULL for none - */ -static struct BobServiceSession * -find_matching_client_session (const struct GNUNET_HashCode *key) -{ - return GNUNET_CONTAINER_multihashmap_get (client_sessions, - key); -} - - -/** - * Finds a CADET session in the respective map based on session key. - * - * @param key the session key we want to search for - * @return the matching session, or NULL for none - */ -static struct CadetIncomingSession * -find_matching_cadet_session (const struct GNUNET_HashCode *key) -{ - return GNUNET_CONTAINER_multihashmap_get (cadet_sessions, - key); -} - - /** * Callback used to free the elements in the map. * @@ -289,15 +207,6 @@ free_element_cb (void *cls, } -/** - * Destroy session state, we are done with it. - * - * @param session the session to free elements from - */ -static void -destroy_cadet_session (struct CadetIncomingSession *s); - - /** * Destroy session state, we are done with it. * @@ -306,28 +215,18 @@ destroy_cadet_session (struct CadetIncomingSession *s); static void destroy_service_session (struct BobServiceSession *s) { - struct CadetIncomingSession *in; unsigned int i; if (GNUNET_YES == s->in_destroy) return; s->in_destroy = GNUNET_YES; - if (NULL != (in = s->cadet)) - { - s->cadet = NULL; - destroy_cadet_session (in); - } if (NULL != s->client) { struct GNUNET_SERVICE_Client *c = s->client; - + s->client = NULL; GNUNET_SERVICE_client_drop (c); } - GNUNET_assert (GNUNET_YES == - GNUNET_CONTAINER_multihashmap_remove (client_sessions, - &s->session_id, - s)); if (NULL != s->intersected_elements) { GNUNET_CONTAINER_multihashmap_iterate (s->intersected_elements, @@ -363,48 +262,17 @@ destroy_service_session (struct BobServiceSession *s) gcry_mpi_point_release (s->prod_h_i_b_i); s->prod_h_i_b_i = NULL; } - GNUNET_CADET_close_port (s->port); - GNUNET_free (s); -} - - -/** - * Destroy incoming CADET session state, we are done with it. - * - * @param in the session to free elements from - */ -static void -destroy_cadet_session (struct CadetIncomingSession *in) -{ - struct BobServiceSession *s; - - if (GNUNET_YES == in->in_destroy) - return; - in->in_destroy = GNUNET_YES; - if (NULL != (s = in->s)) - { - in->s = NULL; - destroy_service_session (s); - } - if (GNUNET_YES == in->in_map) - { - GNUNET_assert (GNUNET_YES == - GNUNET_CONTAINER_multihashmap_remove (cadet_sessions, - &in->session_id, - in)); - in->in_map = GNUNET_NO; - } - if (NULL != in->cadet_mq) + if (NULL != s->port) { - GNUNET_MQ_destroy (in->cadet_mq); - in->cadet_mq = NULL; + GNUNET_CADET_close_port (s->port); + s->port = NULL; } - if (NULL != in->channel) + if (NULL != s->channel) { - GNUNET_CADET_channel_destroy (in->channel); - in->channel = NULL; + GNUNET_CADET_channel_destroy (s->channel); + s->channel = NULL; } - GNUNET_free (in); + GNUNET_free (s); } @@ -443,38 +311,28 @@ prepare_client_end_notification (struct BobServiceSession *session) * * It must NOT call #GNUNET_CADET_channel_destroy() on the channel. * - * @param cls closure (set from #GNUNET_CADET_connect()) + * @param cls the `struct BobServiceSession` * @param channel connection to the other end (henceforth invalid) * @param channel_ctx place where local state associated * with the channel is stored */ static void cb_channel_destruction (void *cls, - const struct GNUNET_CADET_Channel *channel, - void *channel_ctx) + const struct GNUNET_CADET_Channel *channel) { - struct CadetIncomingSession *in = channel_ctx; - struct BobServiceSession *s; + struct BobServiceSession *s = cls; GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Peer disconnected, terminating session %s with peer %s\n", - GNUNET_h2s (&in->session_id), - GNUNET_i2s (&in->peer)); - if (NULL != in->cadet_mq) - { - GNUNET_MQ_destroy (in->cadet_mq); - in->cadet_mq = NULL; - } - in->channel = NULL; - if (NULL != (s = in->s)) + GNUNET_h2s (&s->session_id), + GNUNET_i2s (&s->peer)); + s->channel = NULL; + if (GNUNET_SCALARPRODUCT_STATUS_ACTIVE == s->status) { - if (GNUNET_SCALARPRODUCT_STATUS_ACTIVE == s->status) - { - s->status = GNUNET_SCALARPRODUCT_STATUS_FAILURE; - prepare_client_end_notification (s); - } + s->status = GNUNET_SCALARPRODUCT_STATUS_FAILURE; + prepare_client_end_notification (s); } - destroy_cadet_session (in); + destroy_service_session (s); } @@ -519,7 +377,7 @@ transmit_bobs_cryptodata_message (struct BobServiceSession *s) GNUNET_MQ_notify_sent (e, &bob_cadet_done_cb, s); - GNUNET_MQ_send (s->cadet->cadet_mq, + GNUNET_MQ_send (s->cadet_mq, e); } @@ -577,56 +435,79 @@ element_cmp (const void *a, /** - * Handle a multipart-chunk of a request from another service to + * Check a multipart-chunk of a request from another service to * calculate a scalarproduct with us. * * @param cls closure (set from #GNUNET_CADET_connect) - * @param channel connection to the other end - * @param channel_ctx place to store local state associated with the @a channel - * @param message the actual message + * @param msg the actual message * @return #GNUNET_OK to keep the connection open, * #GNUNET_SYSERR to close it (signal serious error) */ static int -handle_alices_cryptodata_message (void *cls, - struct GNUNET_CADET_Channel *channel, - void **channel_ctx, - const struct GNUNET_MessageHeader *message) +check_alices_cryptodata_message (void *cls, + const struct EccAliceCryptodataMessage *msg) { - struct CadetIncomingSession *in = *channel_ctx; - struct BobServiceSession *s; - const struct EccAliceCryptodataMessage *msg; - const struct GNUNET_CRYPTO_EccPoint *payload; + struct BobServiceSession *s = cls; uint32_t contained_elements; size_t msg_length; uint16_t msize; unsigned int max; - unsigned int i; - const struct MpiElement *b_i; - gcry_mpi_point_t tmp; - gcry_mpi_point_t g_i; - gcry_mpi_point_t h_i; - gcry_mpi_point_t g_i_b_i; - gcry_mpi_point_t h_i_b_i; - /* sanity checks */ - if (NULL == in) + msize = ntohs (msg->header.size); + if (msize <= sizeof (struct EccAliceCryptodataMessage)) { GNUNET_break_op (0); return GNUNET_SYSERR; } - s = in->s; - if (NULL == s) + contained_elements = ntohl (msg->contained_element_count); + /* Our intersection may still be ongoing, but this is nevertheless + an upper bound on the required array size */ + max = GNUNET_CONTAINER_multihashmap_size (s->intersected_elements); + msg_length = sizeof (struct EccAliceCryptodataMessage) + + contained_elements * sizeof (struct GNUNET_CRYPTO_EccPoint) * 2; + if ( (msize != msg_length) || + (0 == contained_elements) || + (contained_elements > UINT16_MAX) || + (max < contained_elements + s->cadet_received_element_count) ) { GNUNET_break_op (0); return GNUNET_SYSERR; } + return GNUNET_OK; +} + + +/** + * Handle a multipart-chunk of a request from another service to + * calculate a scalarproduct with us. + * + * @param cls closure (set from #GNUNET_CADET_connect) + * @param msg the actual message + */ +static void +handle_alices_cryptodata_message (void *cls, + const struct EccAliceCryptodataMessage *msg) +{ + struct BobServiceSession *s = cls; + const struct GNUNET_CRYPTO_EccPoint *payload; + uint32_t contained_elements; + unsigned int max; + unsigned int i; + const struct MpiElement *b_i; + gcry_mpi_point_t tmp; + gcry_mpi_point_t g_i; + gcry_mpi_point_t h_i; + gcry_mpi_point_t g_i_b_i; + gcry_mpi_point_t h_i_b_i; + + contained_elements = ntohl (msg->contained_element_count); + max = GNUNET_CONTAINER_multihashmap_size (s->intersected_elements); /* sort our vector for the computation */ if (NULL == s->sorted_elements) { s->sorted_elements - = GNUNET_malloc (GNUNET_CONTAINER_multihashmap_size (s->intersected_elements) * - sizeof (struct MpiElement)); + = GNUNET_new_array (GNUNET_CONTAINER_multihashmap_size (s->intersected_elements), + struct MpiElement); s->used_element_count = 0; GNUNET_CONTAINER_multihashmap_iterate (s->intersected_elements, ©_element_cb, @@ -637,28 +518,6 @@ handle_alices_cryptodata_message (void *cls, &element_cmp); } - /* parse message */ - msize = ntohs (message->size); - if (msize <= sizeof (struct EccAliceCryptodataMessage)) - { - GNUNET_break_op (0); - return GNUNET_SYSERR; - } - msg = (const struct EccAliceCryptodataMessage *) message; - contained_elements = ntohl (msg->contained_element_count); - /* Our intersection may still be ongoing, but this is nevertheless - an upper bound on the required array size */ - max = GNUNET_CONTAINER_multihashmap_size (s->intersected_elements); - msg_length = sizeof (struct EccAliceCryptodataMessage) - + contained_elements * sizeof (struct GNUNET_CRYPTO_EccPoint) * 2; - if ( (msize != msg_length) || - (0 == contained_elements) || - (contained_elements > UINT16_MAX) || - (max < contained_elements + s->cadet_received_element_count) ) - { - GNUNET_break_op (0); - return GNUNET_SYSERR; - } GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Received %u crypto values from Alice\n", (unsigned int) contained_elements); @@ -711,8 +570,7 @@ handle_alices_cryptodata_message (void *cls, CADET response(s) */ transmit_bobs_cryptodata_message (s); } - GNUNET_CADET_receive_done (s->cadet->channel); - return GNUNET_OK; + GNUNET_CADET_receive_done (s->channel); } @@ -752,7 +610,7 @@ cb_intersection_element_removed (void *cls, case GNUNET_SET_STATUS_DONE: s->intersection_op = NULL; GNUNET_break (NULL == s->intersection_set); - GNUNET_CADET_receive_done (s->cadet->channel); + GNUNET_CADET_receive_done (s->channel); LOG (GNUNET_ERROR_TYPE_DEBUG, "Finished intersection, %d items remain\n", GNUNET_CONTAINER_multihashmap_size (s->intersected_elements)); @@ -808,7 +666,7 @@ start_intersection (struct BobServiceSession *s) (unsigned int) s->total); s->intersection_op - = GNUNET_SET_prepare (&s->cadet->peer, + = GNUNET_SET_prepare (&s->peer, &set_sid, NULL, GNUNET_SET_RESULT_REMOVED, @@ -832,53 +690,17 @@ start_intersection (struct BobServiceSession *s) * Handle a request from Alice to calculate a scalarproduct with us (Bob). * * @param cls closure (set from #GNUNET_CADET_connect) - * @param channel connection to the other end - * @param channel_ctx place to store the `struct CadetIncomingSession *` - * @param message the actual message - * @return #GNUNET_OK to keep the connection open, - * #GNUNET_SYSERR to close it (signal serious error) + * @param msg the actual message */ -static int +static void handle_alices_computation_request (void *cls, - struct GNUNET_CADET_Channel *channel, - void **channel_ctx, - const struct GNUNET_MessageHeader *message) + const struct EccServiceRequestMessage *msg) { - struct CadetIncomingSession *in = *channel_ctx; - struct BobServiceSession *s; - const struct EccServiceRequestMessage *msg; + struct BobServiceSession *s = cls; - msg = (const struct EccServiceRequestMessage *) message; - if (GNUNET_YES == in->in_map) - { - GNUNET_break_op (0); - return GNUNET_SYSERR; - } - if (NULL != find_matching_cadet_session (&msg->session_id)) - { - /* not unique, got one like this already */ - GNUNET_break_op (0); - return GNUNET_SYSERR; - } - in->session_id = msg->session_id; - GNUNET_assert (GNUNET_YES == - GNUNET_CONTAINER_multihashmap_put (cadet_sessions, - &in->session_id, - in, - GNUNET_CONTAINER_MULTIHASHMAPOPTION_UNIQUE_ONLY)); - s = find_matching_client_session (&in->session_id); - if (NULL == s) - { - /* no client waiting for this request, wait for client */ - return GNUNET_OK; - } - GNUNET_assert (NULL == s->cadet); - /* pair them up */ - in->s = s; - s->cadet = in; + s->session_id = msg->session_id; // ?? if (s->client_received_element_count == s->total) start_intersection (s); - return GNUNET_OK; } @@ -887,30 +709,27 @@ handle_alices_computation_request (void *cls, * preliminary initialization, more happens after we get Alice's first * message. * - * @param cls closure + * @param cls our `struct BobServiceSession` * @param channel new handle to the channel * @param initiator peer that started the channel - * @param port unused - * @param options unused * @return session associated with the channel */ static void * cb_channel_incoming (void *cls, struct GNUNET_CADET_Channel *channel, - const struct GNUNET_PeerIdentity *initiator, - const struct GNUNET_HashCode *port, - enum GNUNET_CADET_ChannelOption options) + const struct GNUNET_PeerIdentity *initiator) { - struct CadetIncomingSession *in; + struct BobServiceSession *s = cls; GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "New incoming channel from peer %s.\n", GNUNET_i2s (initiator)); - in = GNUNET_new (struct CadetIncomingSession); - in->peer = *initiator; - in->channel = channel; - in->cadet_mq = GNUNET_CADET_mq_create (in->channel); - return in; + GNUNET_CADET_close_port (s->port); + s->port = NULL; + s->peer = *initiator; + s->channel = channel; + s->cadet_mq = GNUNET_CADET_get_mq (s->channel); + return s; } @@ -994,7 +813,7 @@ handle_bob_client_message_multipart (void *cls, /* more to come */ return; } - if (NULL == s->cadet) + if (NULL == s->channel) { /* no Alice waiting for this request, wait for Alice */ return; @@ -1037,11 +856,6 @@ check_bob_client_message (void *cls, GNUNET_break_op (0); return GNUNET_SYSERR; } - if (NULL != find_matching_client_session (&msg->session_key)) - { - GNUNET_break (0); - return GNUNET_SYSERR; - } return GNUNET_OK; } @@ -1059,7 +873,17 @@ handle_bob_client_message (void *cls, const struct BobComputationMessage *msg) { struct BobServiceSession *s = cls; - struct CadetIncomingSession *in; + struct GNUNET_MQ_MessageHandler cadet_handlers[] = { + GNUNET_MQ_hd_fixed_size (alices_computation_request, + GNUNET_MESSAGE_TYPE_SCALARPRODUCT_ECC_SESSION_INITIALIZATION, + struct EccServiceRequestMessage, + s), + GNUNET_MQ_hd_var_size (alices_cryptodata_message, + GNUNET_MESSAGE_TYPE_SCALARPRODUCT_ECC_ALICE_CRYPTODATA, + struct EccAliceCryptodataMessage, + s), + GNUNET_MQ_handler_end () + }; uint32_t contained_count; uint32_t total_count; const struct GNUNET_SCALARPRODUCT_Element *elements; @@ -1073,21 +897,6 @@ handle_bob_client_message (void *cls, s->total = total_count; s->client_received_element_count = contained_count; s->session_id = msg->session_key; - s->port = GNUNET_CADET_open_port (my_cadet, - &msg->session_key, - &cb_channel_incoming, - s); - if (NULL == s->port) - { - GNUNET_break (0); - GNUNET_SERVICE_client_drop (s->client); - return; - } - GNUNET_break (GNUNET_YES == - GNUNET_CONTAINER_multihashmap_put (client_sessions, - &s->session_id, - s, - GNUNET_CONTAINER_MULTIHASHMAPOPTION_UNIQUE_ONLY)); elements = (const struct GNUNET_SCALARPRODUCT_Element *) &msg[1]; s->intersected_elements = GNUNET_CONTAINER_multihashmap_create (s->total, @@ -1122,22 +931,19 @@ handle_bob_client_message (void *cls, s->used_element_count++; } GNUNET_SERVICE_client_continue (s->client); - if (s->total != s->client_received_element_count) - { - /* multipart msg */ - return; - } - in = find_matching_cadet_session (&s->session_id); - if (NULL == in) + s->port = GNUNET_CADET_open_porT (my_cadet, + &msg->session_key, + &cb_channel_incoming, + s, + NULL, + &cb_channel_destruction, + cadet_handlers); + if (NULL == s->port) { - /* nothing yet, wait for Alice */ + GNUNET_break (0); + GNUNET_SERVICE_client_drop (s->client); return; } - GNUNET_assert (NULL == in->s); - /* pair them up */ - in->s = s; - s->cadet = in; - start_intersection (s); } @@ -1162,10 +968,6 @@ shutdown_task (void *cls) GNUNET_CRYPTO_ecc_dlog_release (edc); edc = NULL; } - GNUNET_CONTAINER_multihashmap_destroy (client_sessions); - client_sessions = NULL; - GNUNET_CONTAINER_multihashmap_destroy (cadet_sessions); - cadet_sessions = NULL; } @@ -1229,28 +1031,11 @@ run (void *cls, const struct GNUNET_CONFIGURATION_Handle *c, struct GNUNET_SERVICE_Handle *service) { - static const struct GNUNET_CADET_MessageHandler cadet_handlers[] = { - { &handle_alices_computation_request, - GNUNET_MESSAGE_TYPE_SCALARPRODUCT_ECC_SESSION_INITIALIZATION, - sizeof (struct EccServiceRequestMessage) }, - { &handle_alices_cryptodata_message, - GNUNET_MESSAGE_TYPE_SCALARPRODUCT_ECC_ALICE_CRYPTODATA, - 0}, - { NULL, 0, 0} - }; - cfg = c; /* We don't really do DLOG, so we can setup with very minimal resources */ edc = GNUNET_CRYPTO_ecc_dlog_prepare (4 /* max value */, 2 /* RAM */); - client_sessions = GNUNET_CONTAINER_multihashmap_create (128, - GNUNET_YES); - cadet_sessions = GNUNET_CONTAINER_multihashmap_create (128, - GNUNET_YES); - my_cadet = GNUNET_CADET_connect (cfg, - NULL, - &cb_channel_destruction, - cadet_handlers); + my_cadet = GNUNET_CADET_connecT (cfg); GNUNET_SCHEDULER_add_shutdown (&shutdown_task, NULL); if (NULL == my_cadet) @@ -1277,10 +1062,10 @@ GNUNET_SERVICE_MAIN GNUNET_MESSAGE_TYPE_SCALARPRODUCT_CLIENT_TO_BOB, struct BobComputationMessage, NULL), -GNUNET_MQ_hd_var_size (bob_client_message_multipart, - GNUNET_MESSAGE_TYPE_SCALARPRODUCT_CLIENT_MULTIPART_BOB, - struct ComputationBobCryptodataMultipartMessage, - NULL), + GNUNET_MQ_hd_var_size (bob_client_message_multipart, + GNUNET_MESSAGE_TYPE_SCALARPRODUCT_CLIENT_MULTIPART_BOB, + struct ComputationBobCryptodataMultipartMessage, + NULL), GNUNET_MQ_handler_end ()); diff --git a/src/scalarproduct/gnunet-service-scalarproduct_alice.c b/src/scalarproduct/gnunet-service-scalarproduct_alice.c index 45d1f4e2c..779d84b60 100644 --- a/src/scalarproduct/gnunet-service-scalarproduct_alice.c +++ b/src/scalarproduct/gnunet-service-scalarproduct_alice.c @@ -1,6 +1,6 @@ /* This file is part of GNUnet. - Copyright (C) 2013, 2014 GNUnet e.V. + Copyright (C) 2013, 2014, 2017 GNUnet e.V. GNUnet is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published @@ -248,15 +248,10 @@ destroy_service_session (struct AliceServiceSession *s) if (GNUNET_YES == s->in_destroy) return; s->in_destroy = GNUNET_YES; - if (NULL != s->cadet_mq) - { - GNUNET_MQ_destroy (s->cadet_mq); - s->cadet_mq = NULL; - } if (NULL != s->client) { struct GNUNET_SERVICE_Client *c = s->client; - + s->client = NULL; GNUNET_SERVICE_client_drop (c); } @@ -428,17 +423,14 @@ transmit_client_response (struct AliceServiceSession *s) * * It must NOT call #GNUNET_CADET_channel_destroy() on the channel. * - * @param cls closure (set from #GNUNET_CADET_connect()) + * @param cls our `struct AliceServiceSession` * @param channel connection to the other end (henceforth invalid) - * @param channel_ctx place where local state associated - * with the channel is stored */ static void cb_channel_destruction (void *cls, - const struct GNUNET_CADET_Channel *channel, - void *channel_ctx) + const struct GNUNET_CADET_Channel *channel) { - struct AliceServiceSession *s = channel_ctx; + struct AliceServiceSession *s = cls; GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Peer disconnected, terminating session %s with peer %s\n", @@ -450,11 +442,6 @@ cb_channel_destruction (void *cls, s->status = GNUNET_SCALARPRODUCT_STATUS_FAILURE; prepare_client_end_notification (s); } - if (NULL != s->cadet_mq) - { - GNUNET_MQ_destroy (s->cadet_mq); - s->cadet_mq = NULL; - } s->channel = NULL; } @@ -633,42 +620,24 @@ compute_scalar_product (struct AliceServiceSession *session) /** - * Handle a multipart chunk of a response we got from another service + * Check a multipart chunk of a response we got from another service * we wanted to calculate a scalarproduct with. * - * @param cls closure (set from #GNUNET_CADET_connect) - * @param channel connection to the other end - * @param channel_ctx place to store local state associated with the @a channel - * @param message the actual message + * @param cls the `struct AliceServiceSession` + * @param msg the actual message * @return #GNUNET_OK to keep the connection open, * #GNUNET_SYSERR to close it (signal serious error) */ static int -handle_bobs_cryptodata_multipart (void *cls, - struct GNUNET_CADET_Channel *channel, - void **channel_ctx, - const struct GNUNET_MessageHeader *message) +check_bobs_cryptodata_multipart (void *cls, + const struct BobCryptodataMultipartMessage *msg) { - struct AliceServiceSession *s = *channel_ctx; - const struct BobCryptodataMultipartMessage *msg; - const struct GNUNET_CRYPTO_PaillierCiphertext *payload; - size_t i; + struct AliceServiceSession *s = cls; uint32_t contained; size_t msg_size; size_t required_size; - if (NULL == s) - { - GNUNET_break_op (0); - return GNUNET_SYSERR; - } - msg_size = ntohs (message->size); - if (sizeof (struct BobCryptodataMultipartMessage) > msg_size) - { - GNUNET_break_op (0); - return GNUNET_SYSERR; - } - msg = (const struct BobCryptodataMultipartMessage *) message; + msg_size = ntohs (msg->header.size); contained = ntohl (msg->contained_element_count); required_size = sizeof (struct BobCryptodataMultipartMessage) + 2 * contained * sizeof (struct GNUNET_CRYPTO_PaillierCiphertext); @@ -678,7 +647,26 @@ handle_bobs_cryptodata_multipart (void *cls, GNUNET_break (0); return GNUNET_SYSERR; } + return GNUNET_OK; +} +/** + * Handle a multipart chunk of a response we got from another service + * we wanted to calculate a scalarproduct with. + * + * @param cls the `struct AliceServiceSession` + * @param msg the actual message + */ +static void +handle_bobs_cryptodata_multipart (void *cls, + const struct BobCryptodataMultipartMessage *msg) +{ + struct AliceServiceSession *s = cls; + const struct GNUNET_CRYPTO_PaillierCiphertext *payload; + size_t i; + uint32_t contained; + + contained = ntohl (msg->contained_element_count); GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Received %u additional crypto values from Bob\n", (unsigned int) contained); @@ -688,60 +676,41 @@ handle_bobs_cryptodata_multipart (void *cls, for (i = 0; i < contained; i++) { GNUNET_memcpy (&s->r[s->cadet_received_element_count + i], - &payload[2 * i], - sizeof (struct GNUNET_CRYPTO_PaillierCiphertext)); + &payload[2 * i], + sizeof (struct GNUNET_CRYPTO_PaillierCiphertext)); GNUNET_memcpy (&s->r_prime[s->cadet_received_element_count + i], - &payload[2 * i], - sizeof (struct GNUNET_CRYPTO_PaillierCiphertext)); + &payload[2 * i], + sizeof (struct GNUNET_CRYPTO_PaillierCiphertext)); } s->cadet_received_element_count += contained; GNUNET_CADET_receive_done (s->channel); if (s->cadet_received_element_count != s->used_element_count) - return GNUNET_OK; + return; /* more to come */ s->product = compute_scalar_product (s); transmit_client_response (s); - return GNUNET_OK; } /** - * Handle a response we got from another service we wanted to + * Check a response we got from another service we wanted to * calculate a scalarproduct with. * - * @param cls closure (set from #GNUNET_CADET_connect) - * @param channel connection to the other end - * @param channel_ctx place to store local state associated with the channel + * @param cls our `struct AliceServiceSession` * @param message the actual message * @return #GNUNET_OK to keep the connection open, * #GNUNET_SYSERR to close it (we are done) */ static int -handle_bobs_cryptodata_message (void *cls, - struct GNUNET_CADET_Channel *channel, - void **channel_ctx, - const struct GNUNET_MessageHeader *message) +check_bobs_cryptodata_message (void *cls, + const struct BobCryptodataMessage *msg) { - struct AliceServiceSession *s = *channel_ctx; - const struct BobCryptodataMessage *msg; - const struct GNUNET_CRYPTO_PaillierCiphertext *payload; - uint32_t i; + struct AliceServiceSession *s = cls; uint32_t contained; uint16_t msg_size; size_t required_size; - if (NULL == s) - { - GNUNET_break_op (0); - return GNUNET_SYSERR; - } - msg_size = ntohs (message->size); - if (sizeof (struct BobCryptodataMessage) > msg_size) - { - GNUNET_break_op (0); - return GNUNET_SYSERR; - } - msg = (const struct BobCryptodataMessage *) message; + msg_size = ntohs (msg->header.size); contained = ntohl (msg->contained_element_count); required_size = sizeof (struct BobCryptodataMessage) + 2 * contained * sizeof (struct GNUNET_CRYPTO_PaillierCiphertext) @@ -765,29 +734,51 @@ handle_bobs_cryptodata_message (void *cls, GNUNET_break_op (0); return GNUNET_SYSERR; } + return GNUNET_OK; +} + + +/** + * Handle a response we got from another service we wanted to + * calculate a scalarproduct with. + * + * @param cls our `struct AliceServiceSession` + * @param msg the actual message + */ +static void +handle_bobs_cryptodata_message (void *cls, + const struct BobCryptodataMessage *msg) +{ + struct AliceServiceSession *s = cls; + const struct GNUNET_CRYPTO_PaillierCiphertext *payload; + uint32_t i; + uint32_t contained; + + contained = ntohl (msg->contained_element_count); GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Received %u crypto values from Bob\n", (unsigned int) contained); - payload = (const struct GNUNET_CRYPTO_PaillierCiphertext *) &msg[1]; GNUNET_memcpy (&s->s, - &payload[0], - sizeof (struct GNUNET_CRYPTO_PaillierCiphertext)); + &payload[0], + sizeof (struct GNUNET_CRYPTO_PaillierCiphertext)); GNUNET_memcpy (&s->s_prime, - &payload[1], - sizeof (struct GNUNET_CRYPTO_PaillierCiphertext)); + &payload[1], + sizeof (struct GNUNET_CRYPTO_PaillierCiphertext)); payload = &payload[2]; - s->r = GNUNET_malloc (sizeof (struct GNUNET_CRYPTO_PaillierCiphertext) * s->used_element_count); - s->r_prime = GNUNET_malloc (sizeof (struct GNUNET_CRYPTO_PaillierCiphertext) * s->used_element_count); + s->r = GNUNET_new_array (s->used_element_count, + struct GNUNET_CRYPTO_PaillierCiphertext); + s->r_prime = GNUNET_new_array (s->used_element_count, + struct GNUNET_CRYPTO_PaillierCiphertext); for (i = 0; i < contained; i++) { GNUNET_memcpy (&s->r[i], - &payload[2 * i], - sizeof (struct GNUNET_CRYPTO_PaillierCiphertext)); + &payload[2 * i], + sizeof (struct GNUNET_CRYPTO_PaillierCiphertext)); GNUNET_memcpy (&s->r_prime[i], - &payload[2 * i + 1], - sizeof (struct GNUNET_CRYPTO_PaillierCiphertext)); + &payload[2 * i + 1], + sizeof (struct GNUNET_CRYPTO_PaillierCiphertext)); } s->cadet_received_element_count = contained; GNUNET_CADET_receive_done (s->channel); @@ -795,12 +786,10 @@ handle_bobs_cryptodata_message (void *cls, if (s->cadet_received_element_count != s->used_element_count) { /* More to come */ - return GNUNET_OK; + return; } - s->product = compute_scalar_product (s); transmit_client_response (s); - return GNUNET_OK; } @@ -1066,6 +1055,17 @@ cb_intersection_request_alice (void *cls, static void client_request_complete_alice (struct AliceServiceSession *s) { + struct GNUNET_MQ_MessageHandler cadet_handlers[] = { + GNUNET_MQ_hd_var_size (bobs_cryptodata_message, + GNUNET_MESSAGE_TYPE_SCALARPRODUCT_BOB_CRYPTODATA, + struct BobCryptodataMessage, + s), + GNUNET_MQ_hd_var_size (bobs_cryptodata_multipart, + GNUNET_MESSAGE_TYPE_SCALARPRODUCT_BOB_CRYPTODATA_MULTIPART, + struct BobCryptodataMultipartMessage, + s), + GNUNET_MQ_handler_end () + }; struct ServiceRequestMessage *msg; struct GNUNET_MQ_Envelope *e; @@ -1073,18 +1073,21 @@ client_request_complete_alice (struct AliceServiceSession *s) "Creating new channel for session with key %s.\n", GNUNET_h2s (&s->session_id)); s->channel - = GNUNET_CADET_channel_create (my_cadet, + = GNUNET_CADET_channel_creatE (my_cadet, s, &s->peer, &s->session_id, - GNUNET_CADET_OPTION_RELIABLE); + GNUNET_CADET_OPTION_RELIABLE, + NULL, + &cb_channel_destruction, + cadet_handlers); if (NULL == s->channel) { s->status = GNUNET_SCALARPRODUCT_STATUS_FAILURE; prepare_client_end_notification (s); return; } - s->cadet_mq = GNUNET_CADET_mq_create (s->channel); + s->cadet_mq = GNUNET_CADET_get_mq (s->channel); s->intersection_listen = GNUNET_SET_listen (cfg, GNUNET_SET_OPERATION_INTERSECTION, @@ -1110,7 +1113,7 @@ client_request_complete_alice (struct AliceServiceSession *s) /** - * We're receiving additional set data. Check if + * We're receiving additional set data. Check if * @a msg is well-formed. * * @param cls client identification of the client @@ -1118,7 +1121,7 @@ client_request_complete_alice (struct AliceServiceSession *s) * @return #GNUNET_OK if @a msg is well-formed */ static int -check_alice_client_message_multipart (void *cls, +check_alice_client_message_multipart (void *cls, const struct ComputationBobCryptodataMultipartMessage *msg) { struct AliceServiceSession *s = cls; @@ -1148,7 +1151,7 @@ check_alice_client_message_multipart (void *cls, * @param msg the actual message */ static void -handle_alice_client_message_multipart (void *cls, +handle_alice_client_message_multipart (void *cls, const struct ComputationBobCryptodataMultipartMessage *msg) { struct AliceServiceSession *s = cls; @@ -1203,7 +1206,7 @@ handle_alice_client_message_multipart (void *cls, * @return #GNUNET_OK if @a msg is well-formed */ static int -check_alice_client_message (void *cls, +check_alice_client_message (void *cls, const struct AliceComputationMessage *msg) { struct AliceServiceSession *s = cls; @@ -1232,7 +1235,7 @@ check_alice_client_message (void *cls, return GNUNET_OK; } - + /** * Handler for Alice's client request message. * We are doing request-initiation to compute a scalar product with a peer. @@ -1241,7 +1244,7 @@ check_alice_client_message (void *cls, * @param msg the actual message */ static void -handle_alice_client_message (void *cls, +handle_alice_client_message (void *cls, const struct AliceComputationMessage *msg) { struct AliceServiceSession *s = cls; @@ -1382,16 +1385,6 @@ run (void *cls, const struct GNUNET_CONFIGURATION_Handle *c, struct GNUNET_SERVICE_Handle *service) { - static const struct GNUNET_CADET_MessageHandler cadet_handlers[] = { - { &handle_bobs_cryptodata_message, - GNUNET_MESSAGE_TYPE_SCALARPRODUCT_BOB_CRYPTODATA, - 0}, - { &handle_bobs_cryptodata_multipart, - GNUNET_MESSAGE_TYPE_SCALARPRODUCT_BOB_CRYPTODATA_MULTIPART, - 0}, - { NULL, 0, 0} - }; - cfg = c; /* offset has to be sufficiently small to allow computation of: @@ -1400,13 +1393,9 @@ run (void *cls, my_offset = gcry_mpi_new (GNUNET_CRYPTO_PAILLIER_BITS / 3); gcry_mpi_set_bit (my_offset, GNUNET_CRYPTO_PAILLIER_BITS / 3); - GNUNET_CRYPTO_paillier_create (&my_pubkey, &my_privkey); - my_cadet = GNUNET_CADET_connect (cfg, - NULL, - &cb_channel_destruction, - cadet_handlers); + my_cadet = GNUNET_CADET_connecT (cfg); GNUNET_SCHEDULER_add_shutdown (&shutdown_task, NULL); if (NULL == my_cadet) @@ -1437,7 +1426,7 @@ GNUNET_SERVICE_MAIN GNUNET_MESSAGE_TYPE_SCALARPRODUCT_CLIENT_MULTIPART_ALICE, struct ComputationBobCryptodataMultipartMessage, NULL), - GNUNET_MQ_handler_end ()); + GNUNET_MQ_handler_end ()); /* end of gnunet-service-scalarproduct_alice.c */ diff --git a/src/scalarproduct/gnunet-service-scalarproduct_bob.c b/src/scalarproduct/gnunet-service-scalarproduct_bob.c index 56cb91fe5..a2bceba43 100644 --- a/src/scalarproduct/gnunet-service-scalarproduct_bob.c +++ b/src/scalarproduct/gnunet-service-scalarproduct_bob.c @@ -58,12 +58,6 @@ struct MpiElement }; -/** - * An incoming session from CADET. - */ -struct CadetIncomingSession; - - /** * A scalarproduct session which tracks an offer for a * multiplication service by a local client. @@ -187,20 +181,6 @@ struct BobServiceSession */ int in_destroy; -}; - - -/** - * An incoming session from CADET. - */ -struct CadetIncomingSession -{ - - /** - * Associated client session, or NULL. - */ - struct BobServiceSession *s; - /** * The CADET channel. */ @@ -211,11 +191,6 @@ struct CadetIncomingSession */ struct GNUNET_PeerIdentity peer; - /** - * (hopefully) unique transaction ID - */ - struct GNUNET_HashCode session_id; - /** * Public key of the remote service. */ @@ -226,21 +201,10 @@ struct CadetIncomingSession */ struct GNUNET_MQ_Handle *cadet_mq; - /** - * Has this CADET session been added to the map yet? - * #GNUNET_YES if so, in which case @e session_id is - * the key. - */ - int in_map; - - /** - * Are we already in #destroy_cadet_session()? - */ - int in_destroy; - }; + /** * GNUnet configuration handle */ @@ -261,52 +225,12 @@ static struct GNUNET_CRYPTO_PaillierPrivateKey my_privkey; */ static gcry_mpi_t my_offset; -/** - * Map of `struct BobServiceSession`, by session keys. - */ -static struct GNUNET_CONTAINER_MultiHashMap *client_sessions; - -/** - * Map of `struct CadetIncomingSession`, by session keys. - */ -static struct GNUNET_CONTAINER_MultiHashMap *cadet_sessions; - /** * Handle to the CADET service. */ static struct GNUNET_CADET_Handle *my_cadet; - -/** - * Finds a not terminated client session in the respective map based on - * session key. - * - * @param key the session key we want to search for - * @return the matching session, or NULL for none - */ -static struct BobServiceSession * -find_matching_client_session (const struct GNUNET_HashCode *key) -{ - return GNUNET_CONTAINER_multihashmap_get (client_sessions, - key); -} - - -/** - * Finds a CADET session in the respective map based on session key. - * - * @param key the session key we want to search for - * @return the matching session, or NULL for none - */ -static struct CadetIncomingSession * -find_matching_cadet_session (const struct GNUNET_HashCode *key) -{ - return GNUNET_CONTAINER_multihashmap_get (cadet_sessions, - key); -} - - /** * Callback used to free the elements in the map. * @@ -326,15 +250,6 @@ free_element_cb (void *cls, } -/** - * Destroy session state, we are done with it. - * - * @param session the session to free elements from - */ -static void -destroy_cadet_session (struct CadetIncomingSession *s); - - /** * Destroy session state, we are done with it. * @@ -343,28 +258,18 @@ destroy_cadet_session (struct CadetIncomingSession *s); static void destroy_service_session (struct BobServiceSession *s) { - struct CadetIncomingSession *in; unsigned int i; if (GNUNET_YES == s->in_destroy) return; s->in_destroy = GNUNET_YES; - if (NULL != (in = s->cadet)) - { - s->cadet = NULL; - destroy_cadet_session (in); - } if (NULL != s->client) { struct GNUNET_SERVICE_Client *c = s->client; - + s->client = NULL; GNUNET_SERVICE_client_drop (c); } - GNUNET_assert (GNUNET_YES == - GNUNET_CONTAINER_multihashmap_remove (client_sessions, - &s->session_id, - s)); if (NULL != s->intersected_elements) { GNUNET_CONTAINER_multihashmap_iterate (s->intersected_elements, @@ -405,48 +310,17 @@ destroy_service_session (struct BobServiceSession *s) GNUNET_free (s->r_prime); s->r_prime = NULL; } - GNUNET_CADET_close_port (s->port); - GNUNET_free (s); -} - - -/** - * Destroy incoming CADET session state, we are done with it. - * - * @param in the session to free elements from - */ -static void -destroy_cadet_session (struct CadetIncomingSession *in) -{ - struct BobServiceSession *s; - - if (GNUNET_YES == in->in_destroy) - return; - in->in_destroy = GNUNET_YES; - if (NULL != (s = in->s)) + if (NULL != s->port) { - in->s = NULL; - destroy_service_session (s); + GNUNET_CADET_close_port (s->port); + s->port = NULL; } - if (GNUNET_YES == in->in_map) + if (NULL != s->channel) { - GNUNET_assert (GNUNET_YES == - GNUNET_CONTAINER_multihashmap_remove (cadet_sessions, - &in->session_id, - in)); - in->in_map = GNUNET_NO; + GNUNET_CADET_channel_destroy (s->channel); + s->channel = NULL; } - if (NULL != in->cadet_mq) - { - GNUNET_MQ_destroy (in->cadet_mq); - in->cadet_mq = NULL; - } - if (NULL != in->channel) - { - GNUNET_CADET_channel_destroy (in->channel); - in->channel = NULL; - } - GNUNET_free (in); + GNUNET_free (s); } @@ -485,38 +359,26 @@ prepare_client_end_notification (struct BobServiceSession *session) * * It must NOT call #GNUNET_CADET_channel_destroy() on the channel. * - * @param cls closure (set from #GNUNET_CADET_connect()) + * @param cls the `struct BobServiceSession` * @param channel connection to the other end (henceforth invalid) - * @param channel_ctx place where local state associated - * with the channel is stored */ static void cb_channel_destruction (void *cls, - const struct GNUNET_CADET_Channel *channel, - void *channel_ctx) + const struct GNUNET_CADET_Channel *channel) { - struct CadetIncomingSession *in = channel_ctx; - struct BobServiceSession *s; + struct BobServiceSession *s = cls; GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Peer disconnected, terminating session %s with peer %s\n", - GNUNET_h2s (&in->session_id), - GNUNET_i2s (&in->peer)); - if (NULL != (s = in->s)) - { - if (GNUNET_SCALARPRODUCT_STATUS_ACTIVE == s->status) - { - s->status = GNUNET_SCALARPRODUCT_STATUS_FAILURE; - prepare_client_end_notification (s); - } - } - if (NULL != in->cadet_mq) + GNUNET_h2s (&s->session_id), + GNUNET_i2s (&s->peer)); + if (GNUNET_SCALARPRODUCT_STATUS_ACTIVE == s->status) { - GNUNET_MQ_destroy (in->cadet_mq); - in->cadet_mq = NULL; + s->status = GNUNET_SCALARPRODUCT_STATUS_FAILURE; + prepare_client_end_notification (s); } - in->channel = NULL; - destroy_cadet_session (in); + s->channel = NULL; + destroy_service_session (s); } @@ -585,7 +447,7 @@ transmit_bobs_cryptodata_message_multipart (struct BobServiceSession *s) GNUNET_MQ_notify_sent (e, &bob_cadet_done_cb, s); - GNUNET_MQ_send (s->cadet->cadet_mq, + GNUNET_MQ_send (s->cadet_mq, e); } GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, @@ -653,7 +515,7 @@ transmit_bobs_cryptodata_message (struct BobServiceSession *s) GNUNET_MQ_notify_sent (e, &bob_cadet_done_cb, s); - GNUNET_MQ_send (s->cadet->cadet_mq, + GNUNET_MQ_send (s->cadet_mq, e); transmit_bobs_cryptodata_message_multipart (s); } @@ -752,14 +614,14 @@ compute_service_response (struct BobServiceSession *session) gcry_mpi_sub (tmp, my_offset, rand[p[i]]); gcry_mpi_sub (tmp, tmp, b[p[i]].value); GNUNET_assert (2 == - GNUNET_CRYPTO_paillier_encrypt (&session->cadet->remote_pubkey, + GNUNET_CRYPTO_paillier_encrypt (&session->remote_pubkey, tmp, 2, &r[i])); // E(S - r_pi - b_pi) * E(S + a_pi) == E(2*S + a - r - b) if (GNUNET_OK != - GNUNET_CRYPTO_paillier_hom_add (&session->cadet->remote_pubkey, + GNUNET_CRYPTO_paillier_hom_add (&session->remote_pubkey, &r[i], &a[p[i]], &r[i])) @@ -775,14 +637,14 @@ compute_service_response (struct BobServiceSession *session) // E(S - r_qi) gcry_mpi_sub (tmp, my_offset, rand[q[i]]); GNUNET_assert (2 == - GNUNET_CRYPTO_paillier_encrypt (&session->cadet->remote_pubkey, + GNUNET_CRYPTO_paillier_encrypt (&session->remote_pubkey, tmp, 2, &r_prime[i])); // E(S - r_qi) * E(S + a_qi) == E(2*S + a_qi - r_qi) if (GNUNET_OK != - GNUNET_CRYPTO_paillier_hom_add (&session->cadet->remote_pubkey, + GNUNET_CRYPTO_paillier_hom_add (&session->remote_pubkey, &r_prime[i], &a[q[i]], &r_prime[i])) @@ -796,7 +658,7 @@ compute_service_response (struct BobServiceSession *session) // Calculate S' = E(SUM( r_i^2 )) tmp = compute_square_sum (rand, count); GNUNET_assert (1 == - GNUNET_CRYPTO_paillier_encrypt (&session->cadet->remote_pubkey, + GNUNET_CRYPTO_paillier_encrypt (&session->remote_pubkey, tmp, 1, &session->s_prime)); @@ -807,7 +669,7 @@ compute_service_response (struct BobServiceSession *session) gcry_mpi_add (rand[i], rand[i], b[i].value); tmp = compute_square_sum (rand, count); GNUNET_assert (1 == - GNUNET_CRYPTO_paillier_encrypt (&session->cadet->remote_pubkey, + GNUNET_CRYPTO_paillier_encrypt (&session->remote_pubkey, tmp, 1, &session->s)); @@ -919,8 +781,8 @@ transmit_cryptographic_reply (struct BobServiceSession *s) if (GNUNET_OK != compute_service_response (s)) { - channel = s->cadet->channel; - s->cadet->channel = NULL; + channel = s->channel; + s->channel = NULL; GNUNET_CADET_channel_destroy (channel); return; } @@ -929,49 +791,25 @@ transmit_cryptographic_reply (struct BobServiceSession *s) /** - * Handle a multipart-chunk of a request from another service to + * Check a multipart-chunk of a request from another service to * calculate a scalarproduct with us. * - * @param cls closure (set from #GNUNET_CADET_connect) - * @param channel connection to the other end - * @param channel_ctx place to store local state associated with the @a channel - * @param message the actual message + * @param cls the `struct BobServiceSession *` + * @param msg the actual message * @return #GNUNET_OK to keep the connection open, * #GNUNET_SYSERR to close it (signal serious error) */ static int -handle_alices_cryptodata_message (void *cls, - struct GNUNET_CADET_Channel *channel, - void **channel_ctx, - const struct GNUNET_MessageHeader *message) +check_alices_cryptodata_message (void *cls, + const struct AliceCryptodataMessage *msg) { - struct CadetIncomingSession *in = *channel_ctx; - struct BobServiceSession *s; - const struct AliceCryptodataMessage *msg; - const struct GNUNET_CRYPTO_PaillierCiphertext *payload; + struct BobServiceSession *s = cls; uint32_t contained_elements; size_t msg_length; uint16_t msize; unsigned int max; - if (NULL == in) - { - GNUNET_break_op (0); - return GNUNET_SYSERR; - } - s = in->s; - if (NULL == s) - { - GNUNET_break_op (0); - return GNUNET_SYSERR; - } - msize = ntohs (message->size); - if (msize <= sizeof (struct AliceCryptodataMessage)) - { - GNUNET_break_op (0); - return GNUNET_SYSERR; - } - msg = (const struct AliceCryptodataMessage *) message; + msize = ntohs (msg->header.size); contained_elements = ntohl (msg->contained_element_count); /* Our intersection may still be ongoing, but this is nevertheless an upper bound on the required array size */ @@ -986,14 +824,38 @@ handle_alices_cryptodata_message (void *cls, GNUNET_break_op (0); return GNUNET_SYSERR; } + return GNUNET_OK; +} + + +/** + * Handle a multipart-chunk of a request from another service to + * calculate a scalarproduct with us. + * + * @param cls the `struct BobServiceSession *` + * @param msg the actual message + */ +static void +handle_alices_cryptodata_message (void *cls, + const struct AliceCryptodataMessage *msg) +{ + struct BobServiceSession *s = cls; + const struct GNUNET_CRYPTO_PaillierCiphertext *payload; + uint32_t contained_elements; + unsigned int max; + + contained_elements = ntohl (msg->contained_element_count); + /* Our intersection may still be ongoing, but this is nevertheless + an upper bound on the required array size */ + max = GNUNET_CONTAINER_multihashmap_size (s->intersected_elements); GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Received %u crypto values from Alice\n", (unsigned int) contained_elements); payload = (const struct GNUNET_CRYPTO_PaillierCiphertext *) &msg[1]; if (NULL == s->e_a) - s->e_a = GNUNET_malloc (sizeof (struct GNUNET_CRYPTO_PaillierCiphertext) * - max); + s->e_a = GNUNET_new_array (max, + struct GNUNET_CRYPTO_PaillierCiphertext); GNUNET_memcpy (&s->e_a[s->cadet_received_element_count], payload, sizeof (struct GNUNET_CRYPTO_PaillierCiphertext) * contained_elements); @@ -1007,8 +869,7 @@ handle_alices_cryptodata_message (void *cls, CADET response(s) */ transmit_cryptographic_reply (s); } - GNUNET_CADET_receive_done (s->cadet->channel); - return GNUNET_OK; + GNUNET_CADET_receive_done (s->channel); } @@ -1048,7 +909,7 @@ cb_intersection_element_removed (void *cls, case GNUNET_SET_STATUS_DONE: s->intersection_op = NULL; GNUNET_break (NULL == s->intersection_set); - GNUNET_CADET_receive_done (s->cadet->channel); + GNUNET_CADET_receive_done (s->channel); LOG (GNUNET_ERROR_TYPE_DEBUG, "Finished intersection, %d items remain\n", GNUNET_CONTAINER_multihashmap_size (s->intersected_elements)); @@ -1099,7 +960,7 @@ start_intersection (struct BobServiceSession *s) (unsigned int) s->total); s->intersection_op - = GNUNET_SET_prepare (&s->cadet->peer, + = GNUNET_SET_prepare (&s->peer, &s->session_id, NULL, GNUNET_SET_RESULT_REMOVED, @@ -1122,55 +983,19 @@ start_intersection (struct BobServiceSession *s) /** * Handle a request from Alice to calculate a scalarproduct with us (Bob). * - * @param cls closure (set from #GNUNET_CADET_connect) - * @param channel connection to the other end - * @param channel_ctx place to store the `struct CadetIncomingSession *` - * @param message the actual message - * @return #GNUNET_OK to keep the connection open, - * #GNUNET_SYSERR to close it (signal serious error) + * @param cls the `struct BobServiceSession *` + * @param msg the actual message */ -static int +static void handle_alices_computation_request (void *cls, - struct GNUNET_CADET_Channel *channel, - void **channel_ctx, - const struct GNUNET_MessageHeader *message) + const struct ServiceRequestMessage *msg) { - struct CadetIncomingSession *in = *channel_ctx; - struct BobServiceSession *s; - const struct ServiceRequestMessage *msg; + struct BobServiceSession *s = cls; - msg = (const struct ServiceRequestMessage *) message; - if (GNUNET_YES == in->in_map) - { - GNUNET_break_op (0); - return GNUNET_SYSERR; - } - if (NULL != find_matching_cadet_session (&msg->session_id)) - { - /* not unique, got one like this already */ - GNUNET_break_op (0); - return GNUNET_SYSERR; - } - in->session_id = msg->session_id; - in->remote_pubkey = msg->public_key; - GNUNET_assert (GNUNET_YES == - GNUNET_CONTAINER_multihashmap_put (cadet_sessions, - &in->session_id, - in, - GNUNET_CONTAINER_MULTIHASHMAPOPTION_UNIQUE_ONLY)); - s = find_matching_client_session (&in->session_id); - if (NULL == s) - { - /* no client waiting for this request, wait for client */ - return GNUNET_OK; - } - GNUNET_assert (NULL == s->cadet); - /* pair them up */ - in->s = s; - s->cadet = in; + s->session_id = msg->session_id; // ?? + s->remote_pubkey = msg->public_key; if (s->client_received_element_count == s->total) start_intersection (s); - return GNUNET_OK; } @@ -1182,31 +1007,27 @@ handle_alices_computation_request (void *cls, * @param cls closure with the `struct BobServiceSession` * @param channel new handle to the channel * @param initiator peer that started the channel - * @param port unused - * @param options unused * @return session associated with the channel */ static void * cb_channel_incoming (void *cls, struct GNUNET_CADET_Channel *channel, - const struct GNUNET_PeerIdentity *initiator, - const struct GNUNET_HashCode *port, - enum GNUNET_CADET_ChannelOption options) + const struct GNUNET_PeerIdentity *initiator) { - struct CadetIncomingSession *in; + struct BobServiceSession *s = cls; GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "New incoming channel from peer %s.\n", GNUNET_i2s (initiator)); - in = GNUNET_new (struct CadetIncomingSession); - in->peer = *initiator; - in->channel = channel; - in->cadet_mq = GNUNET_CADET_mq_create (in->channel); - return in; + GNUNET_CADET_close_port (s->port); + s->port = NULL; + s->channel = channel; + s->peer = *initiator; + s->cadet_mq = GNUNET_CADET_get_mq (s->channel); + return s; } - /** * We're receiving additional set data. Check it is well-formed. * @@ -1287,7 +1108,7 @@ handle_bob_client_message_multipart (void *cls, /* more to come */ return; } - if (NULL == s->cadet) + if (NULL == s->channel) { /* no Alice waiting for this request, wait for Alice */ return; @@ -1330,11 +1151,6 @@ check_bob_client_message (void *cls, GNUNET_break_op (0); return GNUNET_SYSERR; } - if (NULL != find_matching_client_session (&msg->session_key)) - { - GNUNET_break (0); - return GNUNET_SYSERR; - } return GNUNET_OK; } @@ -1352,7 +1168,17 @@ handle_bob_client_message (void *cls, const struct BobComputationMessage *msg) { struct BobServiceSession *s = cls; - struct CadetIncomingSession *in; + struct GNUNET_MQ_MessageHandler cadet_handlers[] = { + GNUNET_MQ_hd_fixed_size (alices_computation_request, + GNUNET_MESSAGE_TYPE_SCALARPRODUCT_SESSION_INITIALIZATION, + struct ServiceRequestMessage, + s), + GNUNET_MQ_hd_var_size (alices_cryptodata_message, + GNUNET_MESSAGE_TYPE_SCALARPRODUCT_ALICE_CRYPTODATA, + struct AliceCryptodataMessage, + s), + GNUNET_MQ_handler_end () + }; uint32_t contained_count; uint32_t total_count; const struct GNUNET_SCALARPRODUCT_Element *elements; @@ -1366,21 +1192,6 @@ handle_bob_client_message (void *cls, s->total = total_count; s->client_received_element_count = contained_count; s->session_id = msg->session_key; - s->port = GNUNET_CADET_open_port (my_cadet, - &msg->session_key, - &cb_channel_incoming, - s); - if (NULL == s->port) - { - GNUNET_break (0); - GNUNET_SERVICE_client_drop (s->client); - return; - } - GNUNET_break (GNUNET_YES == - GNUNET_CONTAINER_multihashmap_put (client_sessions, - &s->session_id, - s, - GNUNET_CONTAINER_MULTIHASHMAPOPTION_UNIQUE_ONLY)); elements = (const struct GNUNET_SCALARPRODUCT_Element *) &msg[1]; s->intersected_elements = GNUNET_CONTAINER_multihashmap_create (s->total, @@ -1415,22 +1226,20 @@ handle_bob_client_message (void *cls, s->used_element_count++; } GNUNET_SERVICE_client_continue (s->client); - if (s->total != s->client_received_element_count) - { - /* multipart msg */ - return; - } - in = find_matching_cadet_session (&s->session_id); - if (NULL == in) + /* We're ready, open the port */ + s->port = GNUNET_CADET_open_porT (my_cadet, + &msg->session_key, + &cb_channel_incoming, + s, + NULL, + &cb_channel_destruction, + cadet_handlers); + if (NULL == s->port) { - /* nothing yet, wait for Alice */ + GNUNET_break (0); + GNUNET_SERVICE_client_drop (s->client); return; } - GNUNET_assert (NULL == in->s); - /* pair them up */ - in->s = s; - s->cadet = in; - start_intersection (s); } @@ -1450,10 +1259,6 @@ shutdown_task (void *cls) GNUNET_CADET_disconnect (my_cadet); my_cadet = NULL; } - GNUNET_CONTAINER_multihashmap_destroy (client_sessions); - client_sessions = NULL; - GNUNET_CONTAINER_multihashmap_destroy (cadet_sessions); - cadet_sessions = NULL; } @@ -1517,16 +1322,6 @@ run (void *cls, const struct GNUNET_CONFIGURATION_Handle *c, struct GNUNET_SERVICE_Handle *service) { - static const struct GNUNET_CADET_MessageHandler cadet_handlers[] = { - { &handle_alices_computation_request, - GNUNET_MESSAGE_TYPE_SCALARPRODUCT_SESSION_INITIALIZATION, - sizeof (struct ServiceRequestMessage) }, - { &handle_alices_cryptodata_message, - GNUNET_MESSAGE_TYPE_SCALARPRODUCT_ALICE_CRYPTODATA, - 0}, - { NULL, 0, 0} - }; - cfg = c; /* offset has to be sufficiently small to allow computation of: @@ -1538,13 +1333,7 @@ run (void *cls, GNUNET_CRYPTO_paillier_create (&my_pubkey, &my_privkey); - client_sessions = GNUNET_CONTAINER_multihashmap_create (128, - GNUNET_YES); - cadet_sessions = GNUNET_CONTAINER_multihashmap_create (128, - GNUNET_YES); - my_cadet = GNUNET_CADET_connect (cfg, NULL, - &cb_channel_destruction, - cadet_handlers); + my_cadet = GNUNET_CADET_connecT (cfg); GNUNET_SCHEDULER_add_shutdown (&shutdown_task, NULL); if (NULL == my_cadet) -- 2.25.1