[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[GNUnet-SVN] r29928 - gnunet/src/scalarproduct
From: |
gnunet |
Subject: |
[GNUnet-SVN] r29928 - gnunet/src/scalarproduct |
Date: |
Mon, 7 Oct 2013 16:49:05 +0200 |
Author: cfuchs
Date: 2013-10-07 16:49:05 +0200 (Mon, 07 Oct 2013)
New Revision: 29928
Modified:
gnunet/src/scalarproduct/gnunet-service-scalarproduct.c
gnunet/src/scalarproduct/scalarproduct.h
Log:
towards multipart messages
Modified: gnunet/src/scalarproduct/gnunet-service-scalarproduct.c
===================================================================
--- gnunet/src/scalarproduct/gnunet-service-scalarproduct.c 2013-10-07
14:41:38 UTC (rev 29927)
+++ gnunet/src/scalarproduct/gnunet-service-scalarproduct.c 2013-10-07
14:49:05 UTC (rev 29928)
@@ -127,6 +127,11 @@
* already transferred elements (sent/received) for multipart messages, less
or equal than used_element_count for
*/
uint32_t transferred_element_count;
+
+ /**
+ * index of the last transferred element for multipart messages
+ */
+ uint32_t last_processed_element;
/**
* how many bytes the mask is long.
@@ -497,6 +502,13 @@
}
+static void
+prepare_service_request_multipart (void *cls,
+ const struct GNUNET_SCHEDULER_TaskContext *tc);
+static void
+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.
@@ -533,7 +545,7 @@
session->service_transmit_handle = NULL;
// reset flags for sending
if ((session->state != WAITING_FOR_MULTIPART_TRANSMISSION) &&
(session->used_element_count != session->transferred_element_count))
- prepare_service_request_multipart(session);
+ prepare_service_request_multipart(session, NULL);
//TODO we have sent a message and now need to trigger trigger the next
multipart message sending
break;
case GNUNET_MESSAGE_TYPE_SCALARPRODUCT_BOB_TO_ALICE:
@@ -541,7 +553,7 @@
//else
session->service_transmit_handle = NULL;
if ((session->state != WAITING_FOR_MULTIPART_TRANSMISSION) &&
(session->used_element_count != session->transferred_element_count))
- prepare_service_response_multipart(session);
+ prepare_service_response_multipart(session, NULL);
break;
default:
session->service_transmit_handle = NULL;
@@ -1154,7 +1166,77 @@
return ret;
}
+static void
+prepare_service_request_multipart (void *cls,
+ const struct GNUNET_SCHEDULER_TaskContext *tc)
+{
+ struct ServiceSession * session = cls;
+ unsigned char * current;
+ unsigned char * element_exported;
+ struct GNUNET_SCALARPRODUCT_service_request * msg;
+ unsigned int i;
+ unsigned int j;
+ uint32_t msg_length;
+ uint32_t todo_count;
+ size_t element_length = 0; // initialized by gcry_mpi_print, but the
compiler doesn't know that
+ gcry_mpi_t a;
+ uint32_t value;
+
+ msg_length = sizeof (struct GNUNET_SCALARPRODUCT_multipart_message);
+ todo_count = session->used_element_count -
session->transferred_element_count;
+ if (todo_count > MULTIPART_ELEMENT_CAPACITY){
+ // send the currently possible maximum chunk, else send all remaining
+ todo_count = MULTIPART_ELEMENT_CAPACITY;
+ }
+ msg_length += todo_count * PAILLIER_ELEMENT_LENGTH;
+ msg = GNUNET_malloc (msg_length);
+
+ element_exported = GNUNET_malloc (PAILLIER_ELEMENT_LENGTH);
+ 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++)
+ {
+ // is this a used element?
+ if (session->mask[i / 8] & 1 << (i % 8))
+ {
+ if (todo_count <= j)
+ break; //reached end of this message, can't include more
+
+ memset(element_exported, 0, PAILLIER_ELEMENT_LENGTH);
+ value = session->vector[i] >= 0 ? session->vector[i] :
-session->vector[i];
+
+ a = gcry_mpi_set_ui (a, 0);
+ // long to gcry_mpi_t
+ if (session->vector[i] < 0)
+ gcry_mpi_sub_ui (a, a, value);
+ else
+ gcry_mpi_add_ui (a, a, value);
+
+ session->a[session->transferred_element_count + j++] = gcry_mpi_set
(NULL, a);
+ gcry_mpi_add (a, a, my_offset);
+ encrypt_element (a, a, my_g, my_n, my_nsquare);
+
+ // get representation as string
+ // we always supply some value, so gcry_mpi_print fails only if it can't
reserve memory
+ GNUNET_assert (!gcry_mpi_print (GCRYMPI_FMT_USG,
+ element_exported,
PAILLIER_ELEMENT_LENGTH,
+ &element_length,
+ a));
+
+ // move buffer content to the end of the buffer so it can easily be read
by libgcrypt. also this now has fixed size
+ adjust (element_exported, element_length, PAILLIER_ELEMENT_LENGTH);
+
+ // copy over to the message
+ memcpy (current, element_exported, PAILLIER_ELEMENT_LENGTH);
+ current += PAILLIER_ELEMENT_LENGTH;
+ }
+ }
+ gcry_mpi_release (a);
+ GNUNET_free(element_exported);
+
+}
/**
* Executed by Alice, fills in a service-request message and sends it to the
given peer
*
@@ -1278,8 +1360,10 @@
session);
return;
}
- if (session->transferred_element_count != session->used_element_count)
+ if (session->transferred_element_count != session->used_element_count){
session->state = WAITING_FOR_MULTIPART_TRANSMISSION;
+ session->last_processed_element = i;
+ }
else
//singlepart message
session->state = WAITING_FOR_SERVICE_RESPONSE;
Modified: gnunet/src/scalarproduct/scalarproduct.h
===================================================================
--- gnunet/src/scalarproduct/scalarproduct.h 2013-10-07 14:41:38 UTC (rev
29927)
+++ gnunet/src/scalarproduct/scalarproduct.h 2013-10-07 14:49:05 UTC (rev
29928)
@@ -49,6 +49,11 @@
#define PAILLIER_ELEMENT_LENGTH (2*KEYBITS/8 +1)
/**
+ * Maximum count of elements we can put into a multipart message
+ */
+#define MULTIPART_ELEMENT_CAPACITY ((GNUNET_SERVER_MAX_MESSAGE_SIZE - 1 -
sizeof (struct GNUNET_SCALARPRODUCT_multipart_message)) /
PAILLIER_ELEMENT_LENGTH)
+
+/**
* Log an error message at log-level 'level' that indicates
* a failure of the command 'cmd' with the message given
* by gcry_strerror(rc).
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- [GNUnet-SVN] r29928 - gnunet/src/scalarproduct,
gnunet <=