gnunet-svn
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[GNUnet-SVN] r30038 - gnunet/src/scalarproduct


From: gnunet
Subject: [GNUnet-SVN] r30038 - gnunet/src/scalarproduct
Date: Wed, 9 Oct 2013 12:03:06 +0200

Author: cfuchs
Date: 2013-10-09 12:03:06 +0200 (Wed, 09 Oct 2013)
New Revision: 30038

Modified:
   gnunet/src/scalarproduct/gnunet-service-scalarproduct.c
Log:
more changes to support multipart messaging


Modified: gnunet/src/scalarproduct/gnunet-service-scalarproduct.c
===================================================================
--- gnunet/src/scalarproduct/gnunet-service-scalarproduct.c     2013-10-09 
10:01:05 UTC (rev 30037)
+++ gnunet/src/scalarproduct/gnunet-service-scalarproduct.c     2013-10-09 
10:03:06 UTC (rev 30038)
@@ -116,22 +116,22 @@
  /**
   * how many elements we were supplied with from the client
   */
- uint32_t element_count;
+ uint32_t total;
 
  /**
   * how many elements actually are used after applying the mask
   */
- uint32_t used_element_count;
+ uint32_t used;
 
  /**
   * already transferred elements (sent/received) for multipart messages, less 
or equal than used_element_count for
   */
- uint32_t transferred_element_count;
+ uint32_t transferred;
 
  /**
   * index of the last transferred element for multipart messages
   */
- uint32_t last_processed_element;
+ uint32_t last_processed;
 
  /**
   * how many bytes the mask is long.
@@ -204,8 +204,14 @@
   */
  struct GNUNET_MESH_Tunnel * tunnel;
 
+ /**
+  * Handle to a task that sends a msg to the our client
+  */
  GNUNET_SCHEDULER_TaskIdentifier client_notification_task;
 
+ /**
+  * Handle to a task that sends a msg to the our peer
+  */
  GNUNET_SCHEDULER_TaskIdentifier service_request_task;
 };
 
@@ -514,6 +520,7 @@
 prepare_service_response_multipart (void *cls,
                                     const struct GNUNET_SCHEDULER_TaskContext 
*tc);
 
+
 /**
  * Primitive callback for copying over a message, as they
  * usually are too complex to be handled in the callback itself.
@@ -528,16 +535,25 @@
 do_send_message (void *cls, size_t size, void *buf)
 {
   struct ServiceSession * session = cls;
-  size_t written = 0;
+  uint16_t type;
 
   GNUNET_assert (buf);
 
-  if (ntohs (session->msg->size) == size) {
-    memcpy (buf, session->msg, size);
-    written = size;
+  if (ntohs (session->msg->size) != size)
+  {
+    GNUNET_break (0);
+    return 0;
   }
+  
+  type = ntohs (session->msg->type);
+  memcpy (buf, session->msg, size);
+  GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
+              "Sent a message of type %hu.\n",
+              type);
+  GNUNET_free (session->msg);
+  session->msg = NULL;
 
-  switch (ntohs (session->msg->type))
+  switch (type)
   {
   case GNUNET_MESSAGE_TYPE_SCALARPRODUCT_SERVICE_TO_CLIENT:
     session->state = FINALIZED;
@@ -548,7 +564,7 @@
     //else
     session->service_transmit_handle = NULL;
     // reset flags for sending
-    if ((session->state != WAITING_FOR_MULTIPART_TRANSMISSION) && 
(session->used_element_count != session->transferred_element_count))
+    if ((session->state != WAITING_FOR_MULTIPART_TRANSMISSION) && 
(session->used != session->transferred))
       prepare_service_request_multipart (session, NULL);
     //TODO we have sent a message and now need to trigger trigger the next 
multipart message sending
     break;
@@ -556,20 +572,14 @@
   case GNUNET_MESSAGE_TYPE_SCALARPRODUCT_BOB_TO_ALICE_MULTIPART:
     //else
     session->service_transmit_handle = NULL;
-    if ((session->state != WAITING_FOR_MULTIPART_TRANSMISSION) && 
(session->used_element_count != session->transferred_element_count))
+    if ((session->state != WAITING_FOR_MULTIPART_TRANSMISSION) && 
(session->used != session->transferred))
       prepare_service_response_multipart (session, NULL);
     break;
   default:
     session->service_transmit_handle = NULL;
   }
 
-  GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
-              "Sent a message of type %hu.\n",
-              ntohs (session->msg->type));
-  GNUNET_free (session->msg);
-  session->msg = NULL;
-
-  return written;
+  return size;
 }
 
 /**
@@ -667,7 +677,7 @@
   for (curr = tail; NULL != curr; curr = curr->prev) {
     // if the key matches, and the element_count is same
     if ((!memcmp (&curr->key, key, sizeof (struct GNUNET_HashCode)))
-        && (curr->element_count == element_count)) {
+        && (curr->total == element_count)) {
       // if incoming state is NULL OR is same as state of the queued request
       if ((NULL == state) || (curr->state == *state)) {
         // if peerid is NULL OR same as the peer Id in the queued request
@@ -688,7 +698,7 @@
   unsigned int i;
 
   if (session->a) {
-    for (i = 0; i < session->used_element_count; i++)
+    for (i = 0; i < session->used; i++)
       gcry_mpi_release (session->a[i]);
 
     GNUNET_free (session->a);
@@ -817,7 +827,7 @@
   size_t element_length = 0; // initialized by gcry_mpi_print, but the 
compiler doesn't know that
 
   msg_length = sizeof (struct GNUNET_SCALARPRODUCT_multipart_message);
-  todo_count = session->used_element_count - 
session->transferred_element_count;
+  todo_count = session->used - session->transferred;
 
   if (todo_count > MULTIPART_ELEMENT_CAPACITY / 2)
     // send the currently possible maximum chunk, we always transfer both 
permutations
@@ -832,7 +842,7 @@
   element_exported = GNUNET_malloc (PAILLIER_ELEMENT_LENGTH);
   current = (unsigned char *) &msg[1];
   // convert k[][]
-  for (i = session->transferred_element_count; i < 
session->transferred_element_count + todo_count; i++) {
+  for (i = session->transferred; i < session->transferred + todo_count; i++) {
     //k[i][p]
     memset (element_exported, 0, PAILLIER_ELEMENT_LENGTH);
     GNUNET_assert (0 == gcry_mpi_print (GCRYMPI_FMT_USG,
@@ -853,11 +863,11 @@
     current += PAILLIER_ELEMENT_LENGTH;
   }
   GNUNET_free (element_exported);
-  for (i = session->transferred_element_count; i < 
session->transferred_element_count; i++) {
+  for (i = session->transferred; i < session->transferred; i++) {
     gcry_mpi_release (session->r_prime[i]);
     gcry_mpi_release (session->r[i]);
   }
-  session->transferred_element_count += todo_count;
+  session->transferred += todo_count;
   session->msg = (struct GNUNET_MessageHeader *) msg;
   session->service_transmit_handle =
           GNUNET_MESH_notify_transmit_ready (session->tunnel,
@@ -876,7 +886,7 @@
                                       session->response);
     return;
   }
-  if (session->transferred_element_count != session->used_element_count)
+  if (session->transferred != session->used)
     // multipart
     session->state = WAITING_FOR_MULTIPART_TRANSMISSION;
   else
@@ -914,21 +924,21 @@
   msg_length = sizeof (struct GNUNET_SCALARPRODUCT_service_response)
           + 2 * PAILLIER_ELEMENT_LENGTH; // s, stick
 
-  if (GNUNET_SERVER_MAX_MESSAGE_SIZE > msg_length + 2 * 
session->used_element_count * PAILLIER_ELEMENT_LENGTH) { //kp, kq
-    msg_length += +2 * session->used_element_count * PAILLIER_ELEMENT_LENGTH;
-    session->transferred_element_count = session->used_element_count;
+  if (GNUNET_SERVER_MAX_MESSAGE_SIZE > msg_length + 2 * session->used * 
PAILLIER_ELEMENT_LENGTH) { //kp, kq
+    msg_length += +2 * session->used * PAILLIER_ELEMENT_LENGTH;
+    session->transferred = session->used;
   }
   else {
-    session->transferred_element_count = (GNUNET_SERVER_MAX_MESSAGE_SIZE - 1 - 
msg_length) / (PAILLIER_ELEMENT_LENGTH * 2);
+    session->transferred = (GNUNET_SERVER_MAX_MESSAGE_SIZE - 1 - msg_length) / 
(PAILLIER_ELEMENT_LENGTH * 2);
   }
 
   msg = GNUNET_malloc (msg_length);
 
   msg->header.type = htons (GNUNET_MESSAGE_TYPE_SCALARPRODUCT_BOB_TO_ALICE);
   msg->header.size = htons (msg_length);
-  msg->total_element_count = htonl (session->element_count);
-  msg->contained_element_count = htonl (session->used_element_count);
-  msg->contained_element_count = htonl (session->transferred_element_count);
+  msg->total_element_count = htonl (session->total);
+  msg->contained_element_count = htonl (session->used);
+  msg->contained_element_count = htonl (session->transferred);
   memcpy (&msg->key, &session->key, sizeof (struct GNUNET_HashCode));
   current = (unsigned char *) &msg[1];
 
@@ -957,7 +967,7 @@
   current += PAILLIER_ELEMENT_LENGTH;
 
   // convert k[][]
-  for (i = 0; i < session->transferred_element_count; i++) {
+  for (i = 0; i < session->transferred; i++) {
     //k[i][p]
     memset (element_exported, 0, PAILLIER_ELEMENT_LENGTH);
     GNUNET_assert (0 == gcry_mpi_print (GCRYMPI_FMT_USG,
@@ -979,7 +989,7 @@
   }
 
   GNUNET_free (element_exported);
-  for (i = 0; i < session->transferred_element_count; i++) {
+  for (i = 0; i < session->transferred; i++) {
     gcry_mpi_release (session->r_prime[i]);
     gcry_mpi_release (session->r[i]);
   }
@@ -1004,7 +1014,7 @@
                                       session->response);
     return GNUNET_NO;
   }
-  if (session->transferred_element_count != session->used_element_count)
+  if (session->transferred != session->used)
     // multipart
     session->state = WAITING_FOR_MULTIPART_TRANSMISSION;
   else
@@ -1054,7 +1064,7 @@
   gcry_sexp_t tmp_exp;
   uint32_t value;
 
-  count = request->used_element_count;
+  count = request->used;
 
   b = GNUNET_malloc (sizeof (gcry_mpi_t) * count);
   a_pi = GNUNET_malloc (sizeof (gcry_mpi_t) * count);
@@ -1064,7 +1074,7 @@
   rand_pi_prime = GNUNET_malloc (sizeof (gcry_mpi_t) * count);
 
   // convert responder session to from long to mpi
-  for (i = 0, j = 0; i < response->element_count && j < count; i++) {
+  for (i = 0, j = 0; i < response->total && j < count; i++) {
     if (request->mask[i / 8] & (1 << (i % 8))) {
       value = response->vector[i] >= 0 ? response->vector[i] : 
-response->vector[i];
       // long to gcry_mpi_t
@@ -1227,7 +1237,7 @@
   uint32_t value;
 
   msg_length = sizeof (struct GNUNET_SCALARPRODUCT_multipart_message);
-  todo_count = session->used_element_count - 
session->transferred_element_count;
+  todo_count = session->used - session->transferred;
 
   if (todo_count > MULTIPART_ELEMENT_CAPACITY)
     // send the currently possible maximum chunk
@@ -1243,7 +1253,7 @@
   a = gcry_mpi_new (KEYBITS * 2);
   current = (unsigned char *) &msg[1];
   // encrypt our vector and generate string representations
-  for (i = session->last_processed_element, j = 0; i < session->element_count; 
i++) {
+  for (i = session->last_processed, j = 0; i < session->total; i++) {
     // is this a used element?
     if (session->mask[i / 8] & 1 << (i % 8)) {
       if (todo_count <= j)
@@ -1259,7 +1269,7 @@
       else
         gcry_mpi_add_ui (a, a, value);
 
-      session->a[session->transferred_element_count + j++] = gcry_mpi_set 
(NULL, a);
+      session->a[session->transferred + j++] = gcry_mpi_set (NULL, a);
       gcry_mpi_add (a, a, my_offset);
       encrypt_element (a, a, my_g, my_n, my_nsquare);
 
@@ -1280,7 +1290,7 @@
   }
   gcry_mpi_release (a);
   GNUNET_free (element_exported);
-  session->transferred_element_count += todo_count;
+  session->transferred += todo_count;
 
   session->msg = (struct GNUNET_MessageHeader *) msg;
   GNUNET_log (GNUNET_ERROR_TYPE_INFO, _ ("Transmitting service request.\n"));
@@ -1300,8 +1310,8 @@
                                       session);
     return;
   }
-  if (session->transferred_element_count != session->used_element_count) {
-    session->last_processed_element = i;
+  if (session->transferred != session->used) {
+    session->last_processed = i;
   }
   else
     //final part
@@ -1339,23 +1349,23 @@
           +session->mask_length
           + my_pubkey_external_length;
 
-  if (GNUNET_SERVER_MAX_MESSAGE_SIZE > msg_length + 
session->used_element_count * PAILLIER_ELEMENT_LENGTH) {
-    msg_length += session->used_element_count * PAILLIER_ELEMENT_LENGTH;
-    session->transferred_element_count = session->used_element_count;
+  if (GNUNET_SERVER_MAX_MESSAGE_SIZE > msg_length + session->used * 
PAILLIER_ELEMENT_LENGTH) {
+    msg_length += session->used * PAILLIER_ELEMENT_LENGTH;
+    session->transferred = session->used;
   }
   else {
     //create a multipart msg, first we calculate a new msg size for the head 
msg
-    session->transferred_element_count = (GNUNET_SERVER_MAX_MESSAGE_SIZE - 1 - 
msg_length) / PAILLIER_ELEMENT_LENGTH;
+    session->transferred = (GNUNET_SERVER_MAX_MESSAGE_SIZE - 1 - msg_length) / 
PAILLIER_ELEMENT_LENGTH;
   }
 
   msg = GNUNET_malloc (msg_length);
   msg->header.type = htons (GNUNET_MESSAGE_TYPE_SCALARPRODUCT_ALICE_TO_BOB);
-  msg->total_element_count = htonl (session->used_element_count);
-  msg->contained_element_count = htonl (session->transferred_element_count);
+  msg->total_element_count = htonl (session->used);
+  msg->contained_element_count = htonl (session->transferred);
   memcpy (&msg->key, &session->key, sizeof (struct GNUNET_HashCode));
   msg->mask_length = htonl (session->mask_length);
   msg->pk_length = htonl (my_pubkey_external_length);
-  msg->element_count = htonl (session->element_count);
+  msg->element_count = htonl (session->total);
   msg->header.size = htons (msg_length);
 
   // fill in the payload
@@ -1369,13 +1379,13 @@
 
   // now copy over the element vector
   element_exported = GNUNET_malloc (PAILLIER_ELEMENT_LENGTH);
-  session->a = GNUNET_malloc (sizeof (gcry_mpi_t) * 
session->used_element_count);
+  session->a = GNUNET_malloc (sizeof (gcry_mpi_t) * session->used);
   a = gcry_mpi_new (KEYBITS * 2);
   // encrypt our vector and generate string representations
-  for (i = 0, j = 0; i < session->element_count; i++) {
+  for (i = 0, j = 0; i < session->total; i++) {
     // if this is a used element...
     if (session->mask[i / 8] & 1 << (i % 8)) {
-      if (session->transferred_element_count <= j)
+      if (session->transferred <= j)
         break; //reached end of this message, can't include more
 
       memset (element_exported, 0, PAILLIER_ELEMENT_LENGTH);
@@ -1428,9 +1438,9 @@
                                       session);
     return;
   }
-  if (session->transferred_element_count != session->used_element_count) {
+  if (session->transferred != session->used) {
     session->state = WAITING_FOR_MULTIPART_TRANSMISSION;
-    session->last_processed_element = i;
+    session->last_processed = i;
   }
   else
     //singlepart message
@@ -1509,7 +1519,7 @@
   session->service_request_task = GNUNET_SCHEDULER_NO_TASK;
   session->client_notification_task = GNUNET_SCHEDULER_NO_TASK;
   session->client = client;
-  session->element_count = element_count;
+  session->total = element_count;
   session->mask_length = mask_length;
   // get our transaction key
   memcpy (&session->key, &msg->key, sizeof (struct GNUNET_HashCode));
@@ -1528,16 +1538,16 @@
     memcpy (session->mask, &vector[element_count], mask_length);
 
     // copy over the elements
-    session->used_element_count = 0;
+    session->used = 0;
     for (i = 0; i < element_count; i++) {
       session->vector[i] = ntohl (vector[i]);
       if (session->vector[i] == 0)
         session->mask[i / 8] &= ~(1 << (i % 8));
       if (session->mask[i / 8] & (1 << (i % 8)))
-        session->used_element_count++;
+        session->used++;
     }
 
-    if (0 == session->used_element_count) {
+    if (0 == session->used) {
       GNUNET_break_op (0);
       GNUNET_free (session->vector);
       GNUNET_free (session);
@@ -1586,7 +1596,7 @@
     session->role = BOB;
     session->mask = NULL;
     // copy over the elements
-    session->used_element_count = element_count;
+    session->used = element_count;
     for (i = 0; i < element_count; i++)
       session->vector[i] = ntohl (vector[i]);
     session->state = CLIENT_RESPONSE_RECEIVED;
@@ -1597,7 +1607,7 @@
     //check if service queue contains a matching request
     requesting_session = find_matching_session (from_service_tail,
                                                 &session->key,
-                                                session->element_count,
+                                                session->total,
                                                 &needed_state, NULL);
     if (NULL != requesting_session) {
       GNUNET_log (GNUNET_ERROR_TYPE_INFO, _ ("Got client-responder-session 
with key %s and a matching service-request-session set, processing.\n"), 
GNUNET_h2s (&session->key));
@@ -1689,7 +1699,7 @@
     // i assume the tupel of key and element count is unique. if it was not 
the rest of the code would not work either.
     client_session = find_matching_session (from_client_tail,
                                             &session->key,
-                                            session->element_count,
+                                            session->total,
                                             NULL, NULL);
     free_session (session);
 
@@ -1730,7 +1740,7 @@
   gcry_mpi_t tmp;
   unsigned int i;
 
-  count = session->used_element_count;
+  count = session->used;
   tmp = gcry_mpi_new (KEYBITS);
   // due to the introduced static offset S, we now also have to remove this
   // from the E(a_pi)(+)E(-b_pi-r_pi) and E(a_qi)(+)E(-r_qi) twice each,
@@ -1912,27 +1922,26 @@
   // are we in the correct state?
   session = (struct ServiceSession *) * tunnel_ctx;
   if ((BOB != session->role) || (WAITING_FOR_MULTIPART_TRANSMISSION != 
session->state)) {
-    GNUNET_break_op (0);
-    return GNUNET_OK;
+    goto except;
   }
   // shorter than minimum?
   if (ntohs (msg->header.size) <= sizeof (struct 
GNUNET_SCALARPRODUCT_multipart_message)) {
     goto except;
   }
-  used_elements = session->used_element_count;
+  used_elements = session->used;
   contained_elements = ntohl (msg->multipart_element_count);
   msg_length = sizeof (struct GNUNET_SCALARPRODUCT_multipart_message)
           + contained_elements * PAILLIER_ELEMENT_LENGTH;
   //sanity check
   if (( ntohs (msg->header.size) != msg_length) 
-       || (used_elements < contained_elements + 
session->transferred_element_count)) {
+       || (used_elements < contained_elements + session->transferred)) {
     goto except;
   }
   current = (unsigned char *) &msg[1];
   if (contained_elements != 0) {
     gcry_error_t ret = 0;
     // Convert each vector element to MPI_value
-    for (i = session->transferred_element_count; i < 
session->transferred_element_count+contained_elements; i++) {
+    for (i = session->transferred; i < 
session->transferred+contained_elements; i++) {
       size_t read = 0;
 
       ret = gcry_mpi_scan (&session->a[i],
@@ -1946,9 +1955,9 @@
         goto except;
       }
     }
-    session->transferred_element_count+=contained_elements;
+    session->transferred+=contained_elements;
     
-    if (session->transferred_element_count == used_elements) {
+    if (session->transferred == used_elements) {
       // single part finished
       session->state = SERVICE_REQUEST_RECEIVED;
       if (session->response) {
@@ -1969,7 +1978,7 @@
   
   return GNUNET_OK;
 except:
-  for (i = 0; i < session->transferred_element_count + contained_elements; i++)
+  for (i = 0; i < session->used; i++)
     if (session->a[i])
       gcry_mpi_release (session->a[i]);
   gcry_sexp_release (session->remote_pubkey);
@@ -2009,7 +2018,7 @@
   uint32_t mask_length;
   uint32_t pk_length;
   uint32_t used_elements;
-  uint32_t contained_elements;
+  uint32_t contained_elements = 0;
   uint32_t element_count;
   uint32_t msg_length;
   unsigned char * current;
@@ -2019,7 +2028,7 @@
   session = (struct ServiceSession *) * tunnel_ctx;
   if (WAITING_FOR_SERVICE_REQUEST != session->state) {
     GNUNET_break_op (0);
-    return GNUNET_OK;
+    goto except;
   }
   // Check if message was sent by me, which would be bad!
   if (!memcmp (&session->peer, &me, sizeof (struct GNUNET_PeerIdentity))) {
@@ -2060,9 +2069,9 @@
   }
 
   memcpy (&session->peer, &session->peer, sizeof (struct GNUNET_PeerIdentity));
-  session->element_count = element_count;
-  session->used_element_count = used_elements;
-  session->transferred_element_count = contained_elements;
+  session->total = element_count;
+  session->used = used_elements;
+  session->transferred = contained_elements;
   session->tunnel = tunnel;
 
   // session key
@@ -2088,7 +2097,7 @@
   needed_state = CLIENT_RESPONSE_RECEIVED;
   session->response = find_matching_session (from_client_tail,
                                              &session->key,
-                                             session->element_count,
+                                             session->total,
                                              &needed_state, NULL);
 
   session->a = GNUNET_malloc (sizeof (gcry_mpi_t) * used_elements);
@@ -2132,7 +2141,7 @@
   }
   return GNUNET_OK;
 except:
-  for (i = 0; i < contained_elements; i++)
+  for (i = 0; i < session->used; i++)
     if (session->a[i])
       gcry_mpi_release (session->a[i]);
   gcry_sexp_release (session->remote_pubkey);
@@ -2172,7 +2181,7 @@
   unsigned char * current;
   size_t read;
   size_t i;
-  uint32_t contained_element_count=0;
+  uint32_t contained=0;
   size_t msg_size;
   int rc;
 
@@ -2185,52 +2194,54 @@
   }
   // shorter than minimum?
   if (ntohs (msg->header.size) <= sizeof (struct 
GNUNET_SCALARPRODUCT_multipart_message)) {
-    goto except;
+    goto invalid_msg;
   }
-  contained_element_count = ntohl (msg->multipart_element_count);
+  contained = ntohl (msg->multipart_element_count);
   msg_size = sizeof (struct GNUNET_SCALARPRODUCT_multipart_message)
-          + 2 * contained_element_count * PAILLIER_ELEMENT_LENGTH;
+          + 2 * contained * PAILLIER_ELEMENT_LENGTH;
   //sanity check: is the message as long as the message_count fields suggests?
-  if ((ntohs (msg->header.size) != msg_size) || (session->used_element_count < 
contained_element_count)) {
-    goto except;
+  if ((ntohs (msg->header.size) != msg_size) || (session->used < contained)) {
+    goto invalid_msg;
   }
   current = (unsigned char *) &msg[1];
   // Convert each k[][perm] to its MPI_value
-  for (i = 0; i < contained_element_count; i++) {
+  for (i = 0; i < contained; i++) {
     if (0 != (rc = gcry_mpi_scan (&session->r[i], GCRYMPI_FMT_USG, current,
                                   PAILLIER_ELEMENT_LENGTH, &read))) {
       LOG_GCRY (GNUNET_ERROR_TYPE_DEBUG, "gcry_mpi_scan", rc);
       GNUNET_break_op (0);
-      goto except;
+      goto invalid_msg;
     }
     current += PAILLIER_ELEMENT_LENGTH;
     if (0 != (rc = gcry_mpi_scan (&session->r_prime[i], GCRYMPI_FMT_USG, 
current,
                                   PAILLIER_ELEMENT_LENGTH, &read))) {
       LOG_GCRY (GNUNET_ERROR_TYPE_DEBUG, "gcry_mpi_scan", rc);
       GNUNET_break_op (0);
-      goto except;
+      goto invalid_msg;
     }
     current += PAILLIER_ELEMENT_LENGTH;
   }
-  session->transferred_element_count += contained_element_count;
-  if (session->transferred_element_count != session->used_element_count)
+  session->transferred += contained;
+  if (session->transferred != session->used)
     return GNUNET_OK;
   session->state = SERVICE_RESPONSE_RECEIVED;
   session->product = compute_scalar_product (session);
   return GNUNET_SYSERR; // terminate the tunnel right away, we are done here!
-except:
+  
+invalid_msg:
   GNUNET_break_op (0);
-  if (session->s)
-    gcry_mpi_release (session->s);
-  if (session->s_prime)
-    gcry_mpi_release (session->s_prime);
-  for (i = 0; session->r && i < session->transferred_element_count; i++)
+  gcry_mpi_release (session->s);
+  gcry_mpi_release (session->s_prime);
+  for (i = 0; session->r && i < session->used; i++){
     if (session->r[i]) gcry_mpi_release (session->r[i]);
-  for (i = 0; session->r_prime && i < session->transferred_element_count; i++)
     if (session->r_prime[i]) gcry_mpi_release (session->r_prime[i]);
+  }
   GNUNET_free_non_null (session->r);
   GNUNET_free_non_null (session->r_prime);
-
+  session->s = NULL;
+  session->s_prime = NULL;
+  session->r = NULL;
+  session->r_prime = NULL;
   session->tunnel = NULL;
   // send message with product to client
   session->client_notification_task =
@@ -2265,38 +2276,35 @@
   unsigned char * current;
   size_t read;
   size_t i;
-  uint32_t contained_element_count=0;
+  uint32_t contained=0;
   size_t msg_size;
   int rc;
 
   GNUNET_assert (NULL != message);
   session = (struct ServiceSession *) * tunnel_ctx;
+  // are we in the correct state?
   if (session->state != WAITING_FOR_SERVICE_REQUEST) {
-    GNUNET_break_op (0);
-    return GNUNET_OK;
+    goto invalid_msg;
   }
-  //we need at least a full message
-  if (sizeof (struct GNUNET_SCALARPRODUCT_service_response) > ntohs 
(msg->header.size)) {
-    GNUNET_break_op (0);
+  //we need at least a full message without elements attached
+  if (sizeof (struct GNUNET_SCALARPRODUCT_service_response) + 2 * 
PAILLIER_ELEMENT_LENGTH > ntohs (msg->header.size)) {
     goto invalid_msg;
   }
-  contained_element_count = ntohl (msg->contained_element_count);
+  contained = ntohl (msg->contained_element_count);
   msg_size = sizeof (struct GNUNET_SCALARPRODUCT_service_response)
-          + 2 * contained_element_count * PAILLIER_ELEMENT_LENGTH
+          + 2 * contained * PAILLIER_ELEMENT_LENGTH
           + 2 * PAILLIER_ELEMENT_LENGTH;
   //sanity check: is the message as long as the message_count fields suggests?
-  if ((ntohs (msg->header.size) != msg_size) || (session->used_element_count < 
contained_element_count)) {
-    GNUNET_break_op (0);
+  if ((ntohs (msg->header.size) != msg_size) || (session->used < contained)) {
     goto invalid_msg;
   }
   session->state = WAITING_FOR_MULTIPART_TRANSMISSION;
-  session->transferred_element_count = contained_element_count;
+  session->transferred = contained;
   //convert s
   current = (unsigned char *) &msg[1];
   if (0 != (rc = gcry_mpi_scan (&session->s, GCRYMPI_FMT_USG, current,
                                 PAILLIER_ELEMENT_LENGTH, &read))) {
     LOG_GCRY (GNUNET_ERROR_TYPE_DEBUG, "gcry_mpi_scan", rc);
-    GNUNET_break_op (0);
     goto invalid_msg;
   }
   current += PAILLIER_ELEMENT_LENGTH;
@@ -2304,30 +2312,27 @@
   if (0 != (rc = gcry_mpi_scan (&session->s_prime, GCRYMPI_FMT_USG, current,
                                 PAILLIER_ELEMENT_LENGTH, &read))) {
     LOG_GCRY (GNUNET_ERROR_TYPE_DEBUG, "gcry_mpi_scan", rc);
-    GNUNET_break_op (0);
     goto invalid_msg;
   }
   current += PAILLIER_ELEMENT_LENGTH;
-  session->r = GNUNET_malloc (sizeof (gcry_mpi_t) * 
session->used_element_count);
-  session->r_prime = GNUNET_malloc (sizeof (gcry_mpi_t) * 
session->used_element_count);
+  session->r = GNUNET_malloc (sizeof (gcry_mpi_t) * session->used);
+  session->r_prime = GNUNET_malloc (sizeof (gcry_mpi_t) * session->used);
   // Convert each k[][perm] to its MPI_value
-  for (i = 0; i < contained_element_count; i++) {
+  for (i = 0; i < contained; i++) {
     if (0 != (rc = gcry_mpi_scan (&session->r[i], GCRYMPI_FMT_USG, current,
                                   PAILLIER_ELEMENT_LENGTH, &read))) {
       LOG_GCRY (GNUNET_ERROR_TYPE_DEBUG, "gcry_mpi_scan", rc);
-      GNUNET_break_op (0);
       goto invalid_msg;
     }
     current += PAILLIER_ELEMENT_LENGTH;
     if (0 != (rc = gcry_mpi_scan (&session->r_prime[i], GCRYMPI_FMT_USG, 
current,
                                   PAILLIER_ELEMENT_LENGTH, &read))) {
       LOG_GCRY (GNUNET_ERROR_TYPE_DEBUG, "gcry_mpi_scan", rc);
-      GNUNET_break_op (0);
       goto invalid_msg;
     }
     current += PAILLIER_ELEMENT_LENGTH;
   }
-  if (session->transferred_element_count != session->used_element_count)
+  if (session->transferred != session->used)
     return GNUNET_OK; //wait for the other multipart chunks
   
   session->state = SERVICE_RESPONSE_RECEIVED;
@@ -2335,17 +2340,21 @@
   return GNUNET_SYSERR; // terminate the tunnel right away, we are done here!
 
 invalid_msg:
+  GNUNET_break_op (0);
   if (session->s)
     gcry_mpi_release (session->s);
   if (session->s_prime)
     gcry_mpi_release (session->s_prime);
-  for (i = 0; session->r && i < contained_element_count; i++)
+  for (i = 0; session->r && i < session->used; i++){
     if (session->r[i]) gcry_mpi_release (session->r[i]);
-  for (i = 0; session->r_prime && i < contained_element_count; i++)
     if (session->r_prime[i]) gcry_mpi_release (session->r_prime[i]);
+  }
   GNUNET_free_non_null (session->r);
   GNUNET_free_non_null (session->r_prime);
-
+  session->s = NULL;
+  session->s_prime = NULL;
+  session->r = NULL;
+  session->r_prime = NULL;
   session->tunnel = NULL;
   // send message with product to client
   session->client_notification_task =




reply via email to

[Prev in Thread] Current Thread [Next in Thread]