aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/scalarproduct/gnunet-service-scalarproduct.c247
1 files changed, 128 insertions, 119 deletions
diff --git a/src/scalarproduct/gnunet-service-scalarproduct.c b/src/scalarproduct/gnunet-service-scalarproduct.c
index 46567abed..fbdb58a23 100644
--- a/src/scalarproduct/gnunet-service-scalarproduct.c
+++ b/src/scalarproduct/gnunet-service-scalarproduct.c
@@ -116,22 +116,22 @@ struct ServiceSession
116 /** 116 /**
117 * how many elements we were supplied with from the client 117 * how many elements we were supplied with from the client
118 */ 118 */
119 uint32_t element_count; 119 uint32_t total;
120 120
121 /** 121 /**
122 * how many elements actually are used after applying the mask 122 * how many elements actually are used after applying the mask
123 */ 123 */
124 uint32_t used_element_count; 124 uint32_t used;
125 125
126 /** 126 /**
127 * already transferred elements (sent/received) for multipart messages, less or equal than used_element_count for 127 * already transferred elements (sent/received) for multipart messages, less or equal than used_element_count for
128 */ 128 */
129 uint32_t transferred_element_count; 129 uint32_t transferred;
130 130
131 /** 131 /**
132 * index of the last transferred element for multipart messages 132 * index of the last transferred element for multipart messages
133 */ 133 */
134 uint32_t last_processed_element; 134 uint32_t last_processed;
135 135
136 /** 136 /**
137 * how many bytes the mask is long. 137 * how many bytes the mask is long.
@@ -204,8 +204,14 @@ struct ServiceSession
204 */ 204 */
205 struct GNUNET_MESH_Tunnel * tunnel; 205 struct GNUNET_MESH_Tunnel * tunnel;
206 206
207 /**
208 * Handle to a task that sends a msg to the our client
209 */
207 GNUNET_SCHEDULER_TaskIdentifier client_notification_task; 210 GNUNET_SCHEDULER_TaskIdentifier client_notification_task;
208 211
212 /**
213 * Handle to a task that sends a msg to the our peer
214 */
209 GNUNET_SCHEDULER_TaskIdentifier service_request_task; 215 GNUNET_SCHEDULER_TaskIdentifier service_request_task;
210}; 216};
211 217
@@ -514,6 +520,7 @@ static void
514prepare_service_response_multipart (void *cls, 520prepare_service_response_multipart (void *cls,
515 const struct GNUNET_SCHEDULER_TaskContext *tc); 521 const struct GNUNET_SCHEDULER_TaskContext *tc);
516 522
523
517/** 524/**
518 * Primitive callback for copying over a message, as they 525 * Primitive callback for copying over a message, as they
519 * usually are too complex to be handled in the callback itself. 526 * usually are too complex to be handled in the callback itself.
@@ -528,16 +535,25 @@ static size_t
528do_send_message (void *cls, size_t size, void *buf) 535do_send_message (void *cls, size_t size, void *buf)
529{ 536{
530 struct ServiceSession * session = cls; 537 struct ServiceSession * session = cls;
531 size_t written = 0; 538 uint16_t type;
532 539
533 GNUNET_assert (buf); 540 GNUNET_assert (buf);
534 541
535 if (ntohs (session->msg->size) == size) { 542 if (ntohs (session->msg->size) != size)
536 memcpy (buf, session->msg, size); 543 {
537 written = size; 544 GNUNET_break (0);
545 return 0;
538 } 546 }
547
548 type = ntohs (session->msg->type);
549 memcpy (buf, session->msg, size);
550 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
551 "Sent a message of type %hu.\n",
552 type);
553 GNUNET_free (session->msg);
554 session->msg = NULL;
539 555
540 switch (ntohs (session->msg->type)) 556 switch (type)
541 { 557 {
542 case GNUNET_MESSAGE_TYPE_SCALARPRODUCT_SERVICE_TO_CLIENT: 558 case GNUNET_MESSAGE_TYPE_SCALARPRODUCT_SERVICE_TO_CLIENT:
543 session->state = FINALIZED; 559 session->state = FINALIZED;
@@ -548,7 +564,7 @@ do_send_message (void *cls, size_t size, void *buf)
548 //else 564 //else
549 session->service_transmit_handle = NULL; 565 session->service_transmit_handle = NULL;
550 // reset flags for sending 566 // reset flags for sending
551 if ((session->state != WAITING_FOR_MULTIPART_TRANSMISSION) && (session->used_element_count != session->transferred_element_count)) 567 if ((session->state != WAITING_FOR_MULTIPART_TRANSMISSION) && (session->used != session->transferred))
552 prepare_service_request_multipart (session, NULL); 568 prepare_service_request_multipart (session, NULL);
553 //TODO we have sent a message and now need to trigger trigger the next multipart message sending 569 //TODO we have sent a message and now need to trigger trigger the next multipart message sending
554 break; 570 break;
@@ -556,20 +572,14 @@ do_send_message (void *cls, size_t size, void *buf)
556 case GNUNET_MESSAGE_TYPE_SCALARPRODUCT_BOB_TO_ALICE_MULTIPART: 572 case GNUNET_MESSAGE_TYPE_SCALARPRODUCT_BOB_TO_ALICE_MULTIPART:
557 //else 573 //else
558 session->service_transmit_handle = NULL; 574 session->service_transmit_handle = NULL;
559 if ((session->state != WAITING_FOR_MULTIPART_TRANSMISSION) && (session->used_element_count != session->transferred_element_count)) 575 if ((session->state != WAITING_FOR_MULTIPART_TRANSMISSION) && (session->used != session->transferred))
560 prepare_service_response_multipart (session, NULL); 576 prepare_service_response_multipart (session, NULL);
561 break; 577 break;
562 default: 578 default:
563 session->service_transmit_handle = NULL; 579 session->service_transmit_handle = NULL;
564 } 580 }
565 581
566 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, 582 return size;
567 "Sent a message of type %hu.\n",
568 ntohs (session->msg->type));
569 GNUNET_free (session->msg);
570 session->msg = NULL;
571
572 return written;
573} 583}
574 584
575/** 585/**
@@ -667,7 +677,7 @@ find_matching_session (struct ServiceSession * tail,
667 for (curr = tail; NULL != curr; curr = curr->prev) { 677 for (curr = tail; NULL != curr; curr = curr->prev) {
668 // if the key matches, and the element_count is same 678 // if the key matches, and the element_count is same
669 if ((!memcmp (&curr->key, key, sizeof (struct GNUNET_HashCode))) 679 if ((!memcmp (&curr->key, key, sizeof (struct GNUNET_HashCode)))
670 && (curr->element_count == element_count)) { 680 && (curr->total == element_count)) {
671 // if incoming state is NULL OR is same as state of the queued request 681 // if incoming state is NULL OR is same as state of the queued request
672 if ((NULL == state) || (curr->state == *state)) { 682 if ((NULL == state) || (curr->state == *state)) {
673 // if peerid is NULL OR same as the peer Id in the queued request 683 // if peerid is NULL OR same as the peer Id in the queued request
@@ -688,7 +698,7 @@ free_session (struct ServiceSession * session)
688 unsigned int i; 698 unsigned int i;
689 699
690 if (session->a) { 700 if (session->a) {
691 for (i = 0; i < session->used_element_count; i++) 701 for (i = 0; i < session->used; i++)
692 gcry_mpi_release (session->a[i]); 702 gcry_mpi_release (session->a[i]);
693 703
694 GNUNET_free (session->a); 704 GNUNET_free (session->a);
@@ -817,7 +827,7 @@ prepare_service_response_multipart (void *cls,
817 size_t element_length = 0; // initialized by gcry_mpi_print, but the compiler doesn't know that 827 size_t element_length = 0; // initialized by gcry_mpi_print, but the compiler doesn't know that
818 828
819 msg_length = sizeof (struct GNUNET_SCALARPRODUCT_multipart_message); 829 msg_length = sizeof (struct GNUNET_SCALARPRODUCT_multipart_message);
820 todo_count = session->used_element_count - session->transferred_element_count; 830 todo_count = session->used - session->transferred;
821 831
822 if (todo_count > MULTIPART_ELEMENT_CAPACITY / 2) 832 if (todo_count > MULTIPART_ELEMENT_CAPACITY / 2)
823 // send the currently possible maximum chunk, we always transfer both permutations 833 // send the currently possible maximum chunk, we always transfer both permutations
@@ -832,7 +842,7 @@ prepare_service_response_multipart (void *cls,
832 element_exported = GNUNET_malloc (PAILLIER_ELEMENT_LENGTH); 842 element_exported = GNUNET_malloc (PAILLIER_ELEMENT_LENGTH);
833 current = (unsigned char *) &msg[1]; 843 current = (unsigned char *) &msg[1];
834 // convert k[][] 844 // convert k[][]
835 for (i = session->transferred_element_count; i < session->transferred_element_count + todo_count; i++) { 845 for (i = session->transferred; i < session->transferred + todo_count; i++) {
836 //k[i][p] 846 //k[i][p]
837 memset (element_exported, 0, PAILLIER_ELEMENT_LENGTH); 847 memset (element_exported, 0, PAILLIER_ELEMENT_LENGTH);
838 GNUNET_assert (0 == gcry_mpi_print (GCRYMPI_FMT_USG, 848 GNUNET_assert (0 == gcry_mpi_print (GCRYMPI_FMT_USG,
@@ -853,11 +863,11 @@ prepare_service_response_multipart (void *cls,
853 current += PAILLIER_ELEMENT_LENGTH; 863 current += PAILLIER_ELEMENT_LENGTH;
854 } 864 }
855 GNUNET_free (element_exported); 865 GNUNET_free (element_exported);
856 for (i = session->transferred_element_count; i < session->transferred_element_count; i++) { 866 for (i = session->transferred; i < session->transferred; i++) {
857 gcry_mpi_release (session->r_prime[i]); 867 gcry_mpi_release (session->r_prime[i]);
858 gcry_mpi_release (session->r[i]); 868 gcry_mpi_release (session->r[i]);
859 } 869 }
860 session->transferred_element_count += todo_count; 870 session->transferred += todo_count;
861 session->msg = (struct GNUNET_MessageHeader *) msg; 871 session->msg = (struct GNUNET_MessageHeader *) msg;
862 session->service_transmit_handle = 872 session->service_transmit_handle =
863 GNUNET_MESH_notify_transmit_ready (session->tunnel, 873 GNUNET_MESH_notify_transmit_ready (session->tunnel,
@@ -876,7 +886,7 @@ prepare_service_response_multipart (void *cls,
876 session->response); 886 session->response);
877 return; 887 return;
878 } 888 }
879 if (session->transferred_element_count != session->used_element_count) 889 if (session->transferred != session->used)
880 // multipart 890 // multipart
881 session->state = WAITING_FOR_MULTIPART_TRANSMISSION; 891 session->state = WAITING_FOR_MULTIPART_TRANSMISSION;
882 else 892 else
@@ -914,21 +924,21 @@ prepare_service_response (gcry_mpi_t s,
914 msg_length = sizeof (struct GNUNET_SCALARPRODUCT_service_response) 924 msg_length = sizeof (struct GNUNET_SCALARPRODUCT_service_response)
915 + 2 * PAILLIER_ELEMENT_LENGTH; // s, stick 925 + 2 * PAILLIER_ELEMENT_LENGTH; // s, stick
916 926
917 if (GNUNET_SERVER_MAX_MESSAGE_SIZE > msg_length + 2 * session->used_element_count * PAILLIER_ELEMENT_LENGTH) { //kp, kq 927 if (GNUNET_SERVER_MAX_MESSAGE_SIZE > msg_length + 2 * session->used * PAILLIER_ELEMENT_LENGTH) { //kp, kq
918 msg_length += +2 * session->used_element_count * PAILLIER_ELEMENT_LENGTH; 928 msg_length += +2 * session->used * PAILLIER_ELEMENT_LENGTH;
919 session->transferred_element_count = session->used_element_count; 929 session->transferred = session->used;
920 } 930 }
921 else { 931 else {
922 session->transferred_element_count = (GNUNET_SERVER_MAX_MESSAGE_SIZE - 1 - msg_length) / (PAILLIER_ELEMENT_LENGTH * 2); 932 session->transferred = (GNUNET_SERVER_MAX_MESSAGE_SIZE - 1 - msg_length) / (PAILLIER_ELEMENT_LENGTH * 2);
923 } 933 }
924 934
925 msg = GNUNET_malloc (msg_length); 935 msg = GNUNET_malloc (msg_length);
926 936
927 msg->header.type = htons (GNUNET_MESSAGE_TYPE_SCALARPRODUCT_BOB_TO_ALICE); 937 msg->header.type = htons (GNUNET_MESSAGE_TYPE_SCALARPRODUCT_BOB_TO_ALICE);
928 msg->header.size = htons (msg_length); 938 msg->header.size = htons (msg_length);
929 msg->total_element_count = htonl (session->element_count); 939 msg->total_element_count = htonl (session->total);
930 msg->contained_element_count = htonl (session->used_element_count); 940 msg->contained_element_count = htonl (session->used);
931 msg->contained_element_count = htonl (session->transferred_element_count); 941 msg->contained_element_count = htonl (session->transferred);
932 memcpy (&msg->key, &session->key, sizeof (struct GNUNET_HashCode)); 942 memcpy (&msg->key, &session->key, sizeof (struct GNUNET_HashCode));
933 current = (unsigned char *) &msg[1]; 943 current = (unsigned char *) &msg[1];
934 944
@@ -957,7 +967,7 @@ prepare_service_response (gcry_mpi_t s,
957 current += PAILLIER_ELEMENT_LENGTH; 967 current += PAILLIER_ELEMENT_LENGTH;
958 968
959 // convert k[][] 969 // convert k[][]
960 for (i = 0; i < session->transferred_element_count; i++) { 970 for (i = 0; i < session->transferred; i++) {
961 //k[i][p] 971 //k[i][p]
962 memset (element_exported, 0, PAILLIER_ELEMENT_LENGTH); 972 memset (element_exported, 0, PAILLIER_ELEMENT_LENGTH);
963 GNUNET_assert (0 == gcry_mpi_print (GCRYMPI_FMT_USG, 973 GNUNET_assert (0 == gcry_mpi_print (GCRYMPI_FMT_USG,
@@ -979,7 +989,7 @@ prepare_service_response (gcry_mpi_t s,
979 } 989 }
980 990
981 GNUNET_free (element_exported); 991 GNUNET_free (element_exported);
982 for (i = 0; i < session->transferred_element_count; i++) { 992 for (i = 0; i < session->transferred; i++) {
983 gcry_mpi_release (session->r_prime[i]); 993 gcry_mpi_release (session->r_prime[i]);
984 gcry_mpi_release (session->r[i]); 994 gcry_mpi_release (session->r[i]);
985 } 995 }
@@ -1004,7 +1014,7 @@ prepare_service_response (gcry_mpi_t s,
1004 session->response); 1014 session->response);
1005 return GNUNET_NO; 1015 return GNUNET_NO;
1006 } 1016 }
1007 if (session->transferred_element_count != session->used_element_count) 1017 if (session->transferred != session->used)
1008 // multipart 1018 // multipart
1009 session->state = WAITING_FOR_MULTIPART_TRANSMISSION; 1019 session->state = WAITING_FOR_MULTIPART_TRANSMISSION;
1010 else 1020 else
@@ -1054,7 +1064,7 @@ compute_service_response (struct ServiceSession * request,
1054 gcry_sexp_t tmp_exp; 1064 gcry_sexp_t tmp_exp;
1055 uint32_t value; 1065 uint32_t value;
1056 1066
1057 count = request->used_element_count; 1067 count = request->used;
1058 1068
1059 b = GNUNET_malloc (sizeof (gcry_mpi_t) * count); 1069 b = GNUNET_malloc (sizeof (gcry_mpi_t) * count);
1060 a_pi = GNUNET_malloc (sizeof (gcry_mpi_t) * count); 1070 a_pi = GNUNET_malloc (sizeof (gcry_mpi_t) * count);
@@ -1064,7 +1074,7 @@ compute_service_response (struct ServiceSession * request,
1064 rand_pi_prime = GNUNET_malloc (sizeof (gcry_mpi_t) * count); 1074 rand_pi_prime = GNUNET_malloc (sizeof (gcry_mpi_t) * count);
1065 1075
1066 // convert responder session to from long to mpi 1076 // convert responder session to from long to mpi
1067 for (i = 0, j = 0; i < response->element_count && j < count; i++) { 1077 for (i = 0, j = 0; i < response->total && j < count; i++) {
1068 if (request->mask[i / 8] & (1 << (i % 8))) { 1078 if (request->mask[i / 8] & (1 << (i % 8))) {
1069 value = response->vector[i] >= 0 ? response->vector[i] : -response->vector[i]; 1079 value = response->vector[i] >= 0 ? response->vector[i] : -response->vector[i];
1070 // long to gcry_mpi_t 1080 // long to gcry_mpi_t
@@ -1227,7 +1237,7 @@ prepare_service_request_multipart (void *cls,
1227 uint32_t value; 1237 uint32_t value;
1228 1238
1229 msg_length = sizeof (struct GNUNET_SCALARPRODUCT_multipart_message); 1239 msg_length = sizeof (struct GNUNET_SCALARPRODUCT_multipart_message);
1230 todo_count = session->used_element_count - session->transferred_element_count; 1240 todo_count = session->used - session->transferred;
1231 1241
1232 if (todo_count > MULTIPART_ELEMENT_CAPACITY) 1242 if (todo_count > MULTIPART_ELEMENT_CAPACITY)
1233 // send the currently possible maximum chunk 1243 // send the currently possible maximum chunk
@@ -1243,7 +1253,7 @@ prepare_service_request_multipart (void *cls,
1243 a = gcry_mpi_new (KEYBITS * 2); 1253 a = gcry_mpi_new (KEYBITS * 2);
1244 current = (unsigned char *) &msg[1]; 1254 current = (unsigned char *) &msg[1];
1245 // encrypt our vector and generate string representations 1255 // encrypt our vector and generate string representations
1246 for (i = session->last_processed_element, j = 0; i < session->element_count; i++) { 1256 for (i = session->last_processed, j = 0; i < session->total; i++) {
1247 // is this a used element? 1257 // is this a used element?
1248 if (session->mask[i / 8] & 1 << (i % 8)) { 1258 if (session->mask[i / 8] & 1 << (i % 8)) {
1249 if (todo_count <= j) 1259 if (todo_count <= j)
@@ -1259,7 +1269,7 @@ prepare_service_request_multipart (void *cls,
1259 else 1269 else
1260 gcry_mpi_add_ui (a, a, value); 1270 gcry_mpi_add_ui (a, a, value);
1261 1271
1262 session->a[session->transferred_element_count + j++] = gcry_mpi_set (NULL, a); 1272 session->a[session->transferred + j++] = gcry_mpi_set (NULL, a);
1263 gcry_mpi_add (a, a, my_offset); 1273 gcry_mpi_add (a, a, my_offset);
1264 encrypt_element (a, a, my_g, my_n, my_nsquare); 1274 encrypt_element (a, a, my_g, my_n, my_nsquare);
1265 1275
@@ -1280,7 +1290,7 @@ prepare_service_request_multipart (void *cls,
1280 } 1290 }
1281 gcry_mpi_release (a); 1291 gcry_mpi_release (a);
1282 GNUNET_free (element_exported); 1292 GNUNET_free (element_exported);
1283 session->transferred_element_count += todo_count; 1293 session->transferred += todo_count;
1284 1294
1285 session->msg = (struct GNUNET_MessageHeader *) msg; 1295 session->msg = (struct GNUNET_MessageHeader *) msg;
1286 GNUNET_log (GNUNET_ERROR_TYPE_INFO, _ ("Transmitting service request.\n")); 1296 GNUNET_log (GNUNET_ERROR_TYPE_INFO, _ ("Transmitting service request.\n"));
@@ -1300,8 +1310,8 @@ prepare_service_request_multipart (void *cls,
1300 session); 1310 session);
1301 return; 1311 return;
1302 } 1312 }
1303 if (session->transferred_element_count != session->used_element_count) { 1313 if (session->transferred != session->used) {
1304 session->last_processed_element = i; 1314 session->last_processed = i;
1305 } 1315 }
1306 else 1316 else
1307 //final part 1317 //final part
@@ -1339,23 +1349,23 @@ prepare_service_request (void *cls,
1339 +session->mask_length 1349 +session->mask_length
1340 + my_pubkey_external_length; 1350 + my_pubkey_external_length;
1341 1351
1342 if (GNUNET_SERVER_MAX_MESSAGE_SIZE > msg_length + session->used_element_count * PAILLIER_ELEMENT_LENGTH) { 1352 if (GNUNET_SERVER_MAX_MESSAGE_SIZE > msg_length + session->used * PAILLIER_ELEMENT_LENGTH) {
1343 msg_length += session->used_element_count * PAILLIER_ELEMENT_LENGTH; 1353 msg_length += session->used * PAILLIER_ELEMENT_LENGTH;
1344 session->transferred_element_count = session->used_element_count; 1354 session->transferred = session->used;
1345 } 1355 }
1346 else { 1356 else {
1347 //create a multipart msg, first we calculate a new msg size for the head msg 1357 //create a multipart msg, first we calculate a new msg size for the head msg
1348 session->transferred_element_count = (GNUNET_SERVER_MAX_MESSAGE_SIZE - 1 - msg_length) / PAILLIER_ELEMENT_LENGTH; 1358 session->transferred = (GNUNET_SERVER_MAX_MESSAGE_SIZE - 1 - msg_length) / PAILLIER_ELEMENT_LENGTH;
1349 } 1359 }
1350 1360
1351 msg = GNUNET_malloc (msg_length); 1361 msg = GNUNET_malloc (msg_length);
1352 msg->header.type = htons (GNUNET_MESSAGE_TYPE_SCALARPRODUCT_ALICE_TO_BOB); 1362 msg->header.type = htons (GNUNET_MESSAGE_TYPE_SCALARPRODUCT_ALICE_TO_BOB);
1353 msg->total_element_count = htonl (session->used_element_count); 1363 msg->total_element_count = htonl (session->used);
1354 msg->contained_element_count = htonl (session->transferred_element_count); 1364 msg->contained_element_count = htonl (session->transferred);
1355 memcpy (&msg->key, &session->key, sizeof (struct GNUNET_HashCode)); 1365 memcpy (&msg->key, &session->key, sizeof (struct GNUNET_HashCode));
1356 msg->mask_length = htonl (session->mask_length); 1366 msg->mask_length = htonl (session->mask_length);
1357 msg->pk_length = htonl (my_pubkey_external_length); 1367 msg->pk_length = htonl (my_pubkey_external_length);
1358 msg->element_count = htonl (session->element_count); 1368 msg->element_count = htonl (session->total);
1359 msg->header.size = htons (msg_length); 1369 msg->header.size = htons (msg_length);
1360 1370
1361 // fill in the payload 1371 // fill in the payload
@@ -1369,13 +1379,13 @@ prepare_service_request (void *cls,
1369 1379
1370 // now copy over the element vector 1380 // now copy over the element vector
1371 element_exported = GNUNET_malloc (PAILLIER_ELEMENT_LENGTH); 1381 element_exported = GNUNET_malloc (PAILLIER_ELEMENT_LENGTH);
1372 session->a = GNUNET_malloc (sizeof (gcry_mpi_t) * session->used_element_count); 1382 session->a = GNUNET_malloc (sizeof (gcry_mpi_t) * session->used);
1373 a = gcry_mpi_new (KEYBITS * 2); 1383 a = gcry_mpi_new (KEYBITS * 2);
1374 // encrypt our vector and generate string representations 1384 // encrypt our vector and generate string representations
1375 for (i = 0, j = 0; i < session->element_count; i++) { 1385 for (i = 0, j = 0; i < session->total; i++) {
1376 // if this is a used element... 1386 // if this is a used element...
1377 if (session->mask[i / 8] & 1 << (i % 8)) { 1387 if (session->mask[i / 8] & 1 << (i % 8)) {
1378 if (session->transferred_element_count <= j) 1388 if (session->transferred <= j)
1379 break; //reached end of this message, can't include more 1389 break; //reached end of this message, can't include more
1380 1390
1381 memset (element_exported, 0, PAILLIER_ELEMENT_LENGTH); 1391 memset (element_exported, 0, PAILLIER_ELEMENT_LENGTH);
@@ -1428,9 +1438,9 @@ prepare_service_request (void *cls,
1428 session); 1438 session);
1429 return; 1439 return;
1430 } 1440 }
1431 if (session->transferred_element_count != session->used_element_count) { 1441 if (session->transferred != session->used) {
1432 session->state = WAITING_FOR_MULTIPART_TRANSMISSION; 1442 session->state = WAITING_FOR_MULTIPART_TRANSMISSION;
1433 session->last_processed_element = i; 1443 session->last_processed = i;
1434 } 1444 }
1435 else 1445 else
1436 //singlepart message 1446 //singlepart message
@@ -1509,7 +1519,7 @@ handle_client_request (void *cls,
1509 session->service_request_task = GNUNET_SCHEDULER_NO_TASK; 1519 session->service_request_task = GNUNET_SCHEDULER_NO_TASK;
1510 session->client_notification_task = GNUNET_SCHEDULER_NO_TASK; 1520 session->client_notification_task = GNUNET_SCHEDULER_NO_TASK;
1511 session->client = client; 1521 session->client = client;
1512 session->element_count = element_count; 1522 session->total = element_count;
1513 session->mask_length = mask_length; 1523 session->mask_length = mask_length;
1514 // get our transaction key 1524 // get our transaction key
1515 memcpy (&session->key, &msg->key, sizeof (struct GNUNET_HashCode)); 1525 memcpy (&session->key, &msg->key, sizeof (struct GNUNET_HashCode));
@@ -1528,16 +1538,16 @@ handle_client_request (void *cls,
1528 memcpy (session->mask, &vector[element_count], mask_length); 1538 memcpy (session->mask, &vector[element_count], mask_length);
1529 1539
1530 // copy over the elements 1540 // copy over the elements
1531 session->used_element_count = 0; 1541 session->used = 0;
1532 for (i = 0; i < element_count; i++) { 1542 for (i = 0; i < element_count; i++) {
1533 session->vector[i] = ntohl (vector[i]); 1543 session->vector[i] = ntohl (vector[i]);
1534 if (session->vector[i] == 0) 1544 if (session->vector[i] == 0)
1535 session->mask[i / 8] &= ~(1 << (i % 8)); 1545 session->mask[i / 8] &= ~(1 << (i % 8));
1536 if (session->mask[i / 8] & (1 << (i % 8))) 1546 if (session->mask[i / 8] & (1 << (i % 8)))
1537 session->used_element_count++; 1547 session->used++;
1538 } 1548 }
1539 1549
1540 if (0 == session->used_element_count) { 1550 if (0 == session->used) {
1541 GNUNET_break_op (0); 1551 GNUNET_break_op (0);
1542 GNUNET_free (session->vector); 1552 GNUNET_free (session->vector);
1543 GNUNET_free (session); 1553 GNUNET_free (session);
@@ -1586,7 +1596,7 @@ handle_client_request (void *cls,
1586 session->role = BOB; 1596 session->role = BOB;
1587 session->mask = NULL; 1597 session->mask = NULL;
1588 // copy over the elements 1598 // copy over the elements
1589 session->used_element_count = element_count; 1599 session->used = element_count;
1590 for (i = 0; i < element_count; i++) 1600 for (i = 0; i < element_count; i++)
1591 session->vector[i] = ntohl (vector[i]); 1601 session->vector[i] = ntohl (vector[i]);
1592 session->state = CLIENT_RESPONSE_RECEIVED; 1602 session->state = CLIENT_RESPONSE_RECEIVED;
@@ -1597,7 +1607,7 @@ handle_client_request (void *cls,
1597 //check if service queue contains a matching request 1607 //check if service queue contains a matching request
1598 requesting_session = find_matching_session (from_service_tail, 1608 requesting_session = find_matching_session (from_service_tail,
1599 &session->key, 1609 &session->key,
1600 session->element_count, 1610 session->total,
1601 &needed_state, NULL); 1611 &needed_state, NULL);
1602 if (NULL != requesting_session) { 1612 if (NULL != requesting_session) {
1603 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)); 1613 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 @@ tunnel_destruction_handler (void *cls,
1689 // i assume the tupel of key and element count is unique. if it was not the rest of the code would not work either. 1699 // i assume the tupel of key and element count is unique. if it was not the rest of the code would not work either.
1690 client_session = find_matching_session (from_client_tail, 1700 client_session = find_matching_session (from_client_tail,
1691 &session->key, 1701 &session->key,
1692 session->element_count, 1702 session->total,
1693 NULL, NULL); 1703 NULL, NULL);
1694 free_session (session); 1704 free_session (session);
1695 1705
@@ -1730,7 +1740,7 @@ compute_scalar_product (struct ServiceSession * session)
1730 gcry_mpi_t tmp; 1740 gcry_mpi_t tmp;
1731 unsigned int i; 1741 unsigned int i;
1732 1742
1733 count = session->used_element_count; 1743 count = session->used;
1734 tmp = gcry_mpi_new (KEYBITS); 1744 tmp = gcry_mpi_new (KEYBITS);
1735 // due to the introduced static offset S, we now also have to remove this 1745 // due to the introduced static offset S, we now also have to remove this
1736 // from the E(a_pi)(+)E(-b_pi-r_pi) and E(a_qi)(+)E(-r_qi) twice each, 1746 // from the E(a_pi)(+)E(-b_pi-r_pi) and E(a_qi)(+)E(-r_qi) twice each,
@@ -1912,27 +1922,26 @@ handle_service_request_multipart (void *cls,
1912 // are we in the correct state? 1922 // are we in the correct state?
1913 session = (struct ServiceSession *) * tunnel_ctx; 1923 session = (struct ServiceSession *) * tunnel_ctx;
1914 if ((BOB != session->role) || (WAITING_FOR_MULTIPART_TRANSMISSION != session->state)) { 1924 if ((BOB != session->role) || (WAITING_FOR_MULTIPART_TRANSMISSION != session->state)) {
1915 GNUNET_break_op (0); 1925 goto except;
1916 return GNUNET_OK;
1917 } 1926 }
1918 // shorter than minimum? 1927 // shorter than minimum?
1919 if (ntohs (msg->header.size) <= sizeof (struct GNUNET_SCALARPRODUCT_multipart_message)) { 1928 if (ntohs (msg->header.size) <= sizeof (struct GNUNET_SCALARPRODUCT_multipart_message)) {
1920 goto except; 1929 goto except;
1921 } 1930 }
1922 used_elements = session->used_element_count; 1931 used_elements = session->used;
1923 contained_elements = ntohl (msg->multipart_element_count); 1932 contained_elements = ntohl (msg->multipart_element_count);
1924 msg_length = sizeof (struct GNUNET_SCALARPRODUCT_multipart_message) 1933 msg_length = sizeof (struct GNUNET_SCALARPRODUCT_multipart_message)
1925 + contained_elements * PAILLIER_ELEMENT_LENGTH; 1934 + contained_elements * PAILLIER_ELEMENT_LENGTH;
1926 //sanity check 1935 //sanity check
1927 if (( ntohs (msg->header.size) != msg_length) 1936 if (( ntohs (msg->header.size) != msg_length)
1928 || (used_elements < contained_elements + session->transferred_element_count)) { 1937 || (used_elements < contained_elements + session->transferred)) {
1929 goto except; 1938 goto except;
1930 } 1939 }
1931 current = (unsigned char *) &msg[1]; 1940 current = (unsigned char *) &msg[1];
1932 if (contained_elements != 0) { 1941 if (contained_elements != 0) {
1933 gcry_error_t ret = 0; 1942 gcry_error_t ret = 0;
1934 // Convert each vector element to MPI_value 1943 // Convert each vector element to MPI_value
1935 for (i = session->transferred_element_count; i < session->transferred_element_count+contained_elements; i++) { 1944 for (i = session->transferred; i < session->transferred+contained_elements; i++) {
1936 size_t read = 0; 1945 size_t read = 0;
1937 1946
1938 ret = gcry_mpi_scan (&session->a[i], 1947 ret = gcry_mpi_scan (&session->a[i],
@@ -1946,9 +1955,9 @@ handle_service_request_multipart (void *cls,
1946 goto except; 1955 goto except;
1947 } 1956 }
1948 } 1957 }
1949 session->transferred_element_count+=contained_elements; 1958 session->transferred+=contained_elements;
1950 1959
1951 if (session->transferred_element_count == used_elements) { 1960 if (session->transferred == used_elements) {
1952 // single part finished 1961 // single part finished
1953 session->state = SERVICE_REQUEST_RECEIVED; 1962 session->state = SERVICE_REQUEST_RECEIVED;
1954 if (session->response) { 1963 if (session->response) {
@@ -1969,7 +1978,7 @@ handle_service_request_multipart (void *cls,
1969 1978
1970 return GNUNET_OK; 1979 return GNUNET_OK;
1971except: 1980except:
1972 for (i = 0; i < session->transferred_element_count + contained_elements; i++) 1981 for (i = 0; i < session->used; i++)
1973 if (session->a[i]) 1982 if (session->a[i])
1974 gcry_mpi_release (session->a[i]); 1983 gcry_mpi_release (session->a[i]);
1975 gcry_sexp_release (session->remote_pubkey); 1984 gcry_sexp_release (session->remote_pubkey);
@@ -2009,7 +2018,7 @@ handle_service_request (void *cls,
2009 uint32_t mask_length; 2018 uint32_t mask_length;
2010 uint32_t pk_length; 2019 uint32_t pk_length;
2011 uint32_t used_elements; 2020 uint32_t used_elements;
2012 uint32_t contained_elements; 2021 uint32_t contained_elements = 0;
2013 uint32_t element_count; 2022 uint32_t element_count;
2014 uint32_t msg_length; 2023 uint32_t msg_length;
2015 unsigned char * current; 2024 unsigned char * current;
@@ -2019,7 +2028,7 @@ handle_service_request (void *cls,
2019 session = (struct ServiceSession *) * tunnel_ctx; 2028 session = (struct ServiceSession *) * tunnel_ctx;
2020 if (WAITING_FOR_SERVICE_REQUEST != session->state) { 2029 if (WAITING_FOR_SERVICE_REQUEST != session->state) {
2021 GNUNET_break_op (0); 2030 GNUNET_break_op (0);
2022 return GNUNET_OK; 2031 goto except;
2023 } 2032 }
2024 // Check if message was sent by me, which would be bad! 2033 // Check if message was sent by me, which would be bad!
2025 if (!memcmp (&session->peer, &me, sizeof (struct GNUNET_PeerIdentity))) { 2034 if (!memcmp (&session->peer, &me, sizeof (struct GNUNET_PeerIdentity))) {
@@ -2060,9 +2069,9 @@ handle_service_request (void *cls,
2060 } 2069 }
2061 2070
2062 memcpy (&session->peer, &session->peer, sizeof (struct GNUNET_PeerIdentity)); 2071 memcpy (&session->peer, &session->peer, sizeof (struct GNUNET_PeerIdentity));
2063 session->element_count = element_count; 2072 session->total = element_count;
2064 session->used_element_count = used_elements; 2073 session->used = used_elements;
2065 session->transferred_element_count = contained_elements; 2074 session->transferred = contained_elements;
2066 session->tunnel = tunnel; 2075 session->tunnel = tunnel;
2067 2076
2068 // session key 2077 // session key
@@ -2088,7 +2097,7 @@ handle_service_request (void *cls,
2088 needed_state = CLIENT_RESPONSE_RECEIVED; 2097 needed_state = CLIENT_RESPONSE_RECEIVED;
2089 session->response = find_matching_session (from_client_tail, 2098 session->response = find_matching_session (from_client_tail,
2090 &session->key, 2099 &session->key,
2091 session->element_count, 2100 session->total,
2092 &needed_state, NULL); 2101 &needed_state, NULL);
2093 2102
2094 session->a = GNUNET_malloc (sizeof (gcry_mpi_t) * used_elements); 2103 session->a = GNUNET_malloc (sizeof (gcry_mpi_t) * used_elements);
@@ -2132,7 +2141,7 @@ handle_service_request (void *cls,
2132 } 2141 }
2133 return GNUNET_OK; 2142 return GNUNET_OK;
2134except: 2143except:
2135 for (i = 0; i < contained_elements; i++) 2144 for (i = 0; i < session->used; i++)
2136 if (session->a[i]) 2145 if (session->a[i])
2137 gcry_mpi_release (session->a[i]); 2146 gcry_mpi_release (session->a[i]);
2138 gcry_sexp_release (session->remote_pubkey); 2147 gcry_sexp_release (session->remote_pubkey);
@@ -2172,7 +2181,7 @@ handle_service_response_multipart (void *cls,
2172 unsigned char * current; 2181 unsigned char * current;
2173 size_t read; 2182 size_t read;
2174 size_t i; 2183 size_t i;
2175 uint32_t contained_element_count=0; 2184 uint32_t contained=0;
2176 size_t msg_size; 2185 size_t msg_size;
2177 int rc; 2186 int rc;
2178 2187
@@ -2185,52 +2194,54 @@ handle_service_response_multipart (void *cls,
2185 } 2194 }
2186 // shorter than minimum? 2195 // shorter than minimum?
2187 if (ntohs (msg->header.size) <= sizeof (struct GNUNET_SCALARPRODUCT_multipart_message)) { 2196 if (ntohs (msg->header.size) <= sizeof (struct GNUNET_SCALARPRODUCT_multipart_message)) {
2188 goto except; 2197 goto invalid_msg;
2189 } 2198 }
2190 contained_element_count = ntohl (msg->multipart_element_count); 2199 contained = ntohl (msg->multipart_element_count);
2191 msg_size = sizeof (struct GNUNET_SCALARPRODUCT_multipart_message) 2200 msg_size = sizeof (struct GNUNET_SCALARPRODUCT_multipart_message)
2192 + 2 * contained_element_count * PAILLIER_ELEMENT_LENGTH; 2201 + 2 * contained * PAILLIER_ELEMENT_LENGTH;
2193 //sanity check: is the message as long as the message_count fields suggests? 2202 //sanity check: is the message as long as the message_count fields suggests?
2194 if ((ntohs (msg->header.size) != msg_size) || (session->used_element_count < contained_element_count)) { 2203 if ((ntohs (msg->header.size) != msg_size) || (session->used < contained)) {
2195 goto except; 2204 goto invalid_msg;
2196 } 2205 }
2197 current = (unsigned char *) &msg[1]; 2206 current = (unsigned char *) &msg[1];
2198 // Convert each k[][perm] to its MPI_value 2207 // Convert each k[][perm] to its MPI_value
2199 for (i = 0; i < contained_element_count; i++) { 2208 for (i = 0; i < contained; i++) {
2200 if (0 != (rc = gcry_mpi_scan (&session->r[i], GCRYMPI_FMT_USG, current, 2209 if (0 != (rc = gcry_mpi_scan (&session->r[i], GCRYMPI_FMT_USG, current,
2201 PAILLIER_ELEMENT_LENGTH, &read))) { 2210 PAILLIER_ELEMENT_LENGTH, &read))) {
2202 LOG_GCRY (GNUNET_ERROR_TYPE_DEBUG, "gcry_mpi_scan", rc); 2211 LOG_GCRY (GNUNET_ERROR_TYPE_DEBUG, "gcry_mpi_scan", rc);
2203 GNUNET_break_op (0); 2212 GNUNET_break_op (0);
2204 goto except; 2213 goto invalid_msg;
2205 } 2214 }
2206 current += PAILLIER_ELEMENT_LENGTH; 2215 current += PAILLIER_ELEMENT_LENGTH;
2207 if (0 != (rc = gcry_mpi_scan (&session->r_prime[i], GCRYMPI_FMT_USG, current, 2216 if (0 != (rc = gcry_mpi_scan (&session->r_prime[i], GCRYMPI_FMT_USG, current,
2208 PAILLIER_ELEMENT_LENGTH, &read))) { 2217 PAILLIER_ELEMENT_LENGTH, &read))) {
2209 LOG_GCRY (GNUNET_ERROR_TYPE_DEBUG, "gcry_mpi_scan", rc); 2218 LOG_GCRY (GNUNET_ERROR_TYPE_DEBUG, "gcry_mpi_scan", rc);
2210 GNUNET_break_op (0); 2219 GNUNET_break_op (0);
2211 goto except; 2220 goto invalid_msg;
2212 } 2221 }
2213 current += PAILLIER_ELEMENT_LENGTH; 2222 current += PAILLIER_ELEMENT_LENGTH;
2214 } 2223 }
2215 session->transferred_element_count += contained_element_count; 2224 session->transferred += contained;
2216 if (session->transferred_element_count != session->used_element_count) 2225 if (session->transferred != session->used)
2217 return GNUNET_OK; 2226 return GNUNET_OK;
2218 session->state = SERVICE_RESPONSE_RECEIVED; 2227 session->state = SERVICE_RESPONSE_RECEIVED;
2219 session->product = compute_scalar_product (session); 2228 session->product = compute_scalar_product (session);
2220 return GNUNET_SYSERR; // terminate the tunnel right away, we are done here! 2229 return GNUNET_SYSERR; // terminate the tunnel right away, we are done here!
2221except: 2230
2231invalid_msg:
2222 GNUNET_break_op (0); 2232 GNUNET_break_op (0);
2223 if (session->s) 2233 gcry_mpi_release (session->s);
2224 gcry_mpi_release (session->s); 2234 gcry_mpi_release (session->s_prime);
2225 if (session->s_prime) 2235 for (i = 0; session->r && i < session->used; i++){
2226 gcry_mpi_release (session->s_prime);
2227 for (i = 0; session->r && i < session->transferred_element_count; i++)
2228 if (session->r[i]) gcry_mpi_release (session->r[i]); 2236 if (session->r[i]) gcry_mpi_release (session->r[i]);
2229 for (i = 0; session->r_prime && i < session->transferred_element_count; i++)
2230 if (session->r_prime[i]) gcry_mpi_release (session->r_prime[i]); 2237 if (session->r_prime[i]) gcry_mpi_release (session->r_prime[i]);
2238 }
2231 GNUNET_free_non_null (session->r); 2239 GNUNET_free_non_null (session->r);
2232 GNUNET_free_non_null (session->r_prime); 2240 GNUNET_free_non_null (session->r_prime);
2233 2241 session->s = NULL;
2242 session->s_prime = NULL;
2243 session->r = NULL;
2244 session->r_prime = NULL;
2234 session->tunnel = NULL; 2245 session->tunnel = NULL;
2235 // send message with product to client 2246 // send message with product to client
2236 session->client_notification_task = 2247 session->client_notification_task =
@@ -2265,38 +2276,35 @@ handle_service_response (void *cls,
2265 unsigned char * current; 2276 unsigned char * current;
2266 size_t read; 2277 size_t read;
2267 size_t i; 2278 size_t i;
2268 uint32_t contained_element_count=0; 2279 uint32_t contained=0;
2269 size_t msg_size; 2280 size_t msg_size;
2270 int rc; 2281 int rc;
2271 2282
2272 GNUNET_assert (NULL != message); 2283 GNUNET_assert (NULL != message);
2273 session = (struct ServiceSession *) * tunnel_ctx; 2284 session = (struct ServiceSession *) * tunnel_ctx;
2285 // are we in the correct state?
2274 if (session->state != WAITING_FOR_SERVICE_REQUEST) { 2286 if (session->state != WAITING_FOR_SERVICE_REQUEST) {
2275 GNUNET_break_op (0); 2287 goto invalid_msg;
2276 return GNUNET_OK;
2277 } 2288 }
2278 //we need at least a full message 2289 //we need at least a full message without elements attached
2279 if (sizeof (struct GNUNET_SCALARPRODUCT_service_response) > ntohs (msg->header.size)) { 2290 if (sizeof (struct GNUNET_SCALARPRODUCT_service_response) + 2 * PAILLIER_ELEMENT_LENGTH > ntohs (msg->header.size)) {
2280 GNUNET_break_op (0);
2281 goto invalid_msg; 2291 goto invalid_msg;
2282 } 2292 }
2283 contained_element_count = ntohl (msg->contained_element_count); 2293 contained = ntohl (msg->contained_element_count);
2284 msg_size = sizeof (struct GNUNET_SCALARPRODUCT_service_response) 2294 msg_size = sizeof (struct GNUNET_SCALARPRODUCT_service_response)
2285 + 2 * contained_element_count * PAILLIER_ELEMENT_LENGTH 2295 + 2 * contained * PAILLIER_ELEMENT_LENGTH
2286 + 2 * PAILLIER_ELEMENT_LENGTH; 2296 + 2 * PAILLIER_ELEMENT_LENGTH;
2287 //sanity check: is the message as long as the message_count fields suggests? 2297 //sanity check: is the message as long as the message_count fields suggests?
2288 if ((ntohs (msg->header.size) != msg_size) || (session->used_element_count < contained_element_count)) { 2298 if ((ntohs (msg->header.size) != msg_size) || (session->used < contained)) {
2289 GNUNET_break_op (0);
2290 goto invalid_msg; 2299 goto invalid_msg;
2291 } 2300 }
2292 session->state = WAITING_FOR_MULTIPART_TRANSMISSION; 2301 session->state = WAITING_FOR_MULTIPART_TRANSMISSION;
2293 session->transferred_element_count = contained_element_count; 2302 session->transferred = contained;
2294 //convert s 2303 //convert s
2295 current = (unsigned char *) &msg[1]; 2304 current = (unsigned char *) &msg[1];
2296 if (0 != (rc = gcry_mpi_scan (&session->s, GCRYMPI_FMT_USG, current, 2305 if (0 != (rc = gcry_mpi_scan (&session->s, GCRYMPI_FMT_USG, current,
2297 PAILLIER_ELEMENT_LENGTH, &read))) { 2306 PAILLIER_ELEMENT_LENGTH, &read))) {
2298 LOG_GCRY (GNUNET_ERROR_TYPE_DEBUG, "gcry_mpi_scan", rc); 2307 LOG_GCRY (GNUNET_ERROR_TYPE_DEBUG, "gcry_mpi_scan", rc);
2299 GNUNET_break_op (0);
2300 goto invalid_msg; 2308 goto invalid_msg;
2301 } 2309 }
2302 current += PAILLIER_ELEMENT_LENGTH; 2310 current += PAILLIER_ELEMENT_LENGTH;
@@ -2304,30 +2312,27 @@ handle_service_response (void *cls,
2304 if (0 != (rc = gcry_mpi_scan (&session->s_prime, GCRYMPI_FMT_USG, current, 2312 if (0 != (rc = gcry_mpi_scan (&session->s_prime, GCRYMPI_FMT_USG, current,
2305 PAILLIER_ELEMENT_LENGTH, &read))) { 2313 PAILLIER_ELEMENT_LENGTH, &read))) {
2306 LOG_GCRY (GNUNET_ERROR_TYPE_DEBUG, "gcry_mpi_scan", rc); 2314 LOG_GCRY (GNUNET_ERROR_TYPE_DEBUG, "gcry_mpi_scan", rc);
2307 GNUNET_break_op (0);
2308 goto invalid_msg; 2315 goto invalid_msg;
2309 } 2316 }
2310 current += PAILLIER_ELEMENT_LENGTH; 2317 current += PAILLIER_ELEMENT_LENGTH;
2311 session->r = GNUNET_malloc (sizeof (gcry_mpi_t) * session->used_element_count); 2318 session->r = GNUNET_malloc (sizeof (gcry_mpi_t) * session->used);
2312 session->r_prime = GNUNET_malloc (sizeof (gcry_mpi_t) * session->used_element_count); 2319 session->r_prime = GNUNET_malloc (sizeof (gcry_mpi_t) * session->used);
2313 // Convert each k[][perm] to its MPI_value 2320 // Convert each k[][perm] to its MPI_value
2314 for (i = 0; i < contained_element_count; i++) { 2321 for (i = 0; i < contained; i++) {
2315 if (0 != (rc = gcry_mpi_scan (&session->r[i], GCRYMPI_FMT_USG, current, 2322 if (0 != (rc = gcry_mpi_scan (&session->r[i], GCRYMPI_FMT_USG, current,
2316 PAILLIER_ELEMENT_LENGTH, &read))) { 2323 PAILLIER_ELEMENT_LENGTH, &read))) {
2317 LOG_GCRY (GNUNET_ERROR_TYPE_DEBUG, "gcry_mpi_scan", rc); 2324 LOG_GCRY (GNUNET_ERROR_TYPE_DEBUG, "gcry_mpi_scan", rc);
2318 GNUNET_break_op (0);
2319 goto invalid_msg; 2325 goto invalid_msg;
2320 } 2326 }
2321 current += PAILLIER_ELEMENT_LENGTH; 2327 current += PAILLIER_ELEMENT_LENGTH;
2322 if (0 != (rc = gcry_mpi_scan (&session->r_prime[i], GCRYMPI_FMT_USG, current, 2328 if (0 != (rc = gcry_mpi_scan (&session->r_prime[i], GCRYMPI_FMT_USG, current,
2323 PAILLIER_ELEMENT_LENGTH, &read))) { 2329 PAILLIER_ELEMENT_LENGTH, &read))) {
2324 LOG_GCRY (GNUNET_ERROR_TYPE_DEBUG, "gcry_mpi_scan", rc); 2330 LOG_GCRY (GNUNET_ERROR_TYPE_DEBUG, "gcry_mpi_scan", rc);
2325 GNUNET_break_op (0);
2326 goto invalid_msg; 2331 goto invalid_msg;
2327 } 2332 }
2328 current += PAILLIER_ELEMENT_LENGTH; 2333 current += PAILLIER_ELEMENT_LENGTH;
2329 } 2334 }
2330 if (session->transferred_element_count != session->used_element_count) 2335 if (session->transferred != session->used)
2331 return GNUNET_OK; //wait for the other multipart chunks 2336 return GNUNET_OK; //wait for the other multipart chunks
2332 2337
2333 session->state = SERVICE_RESPONSE_RECEIVED; 2338 session->state = SERVICE_RESPONSE_RECEIVED;
@@ -2335,17 +2340,21 @@ handle_service_response (void *cls,
2335 return GNUNET_SYSERR; // terminate the tunnel right away, we are done here! 2340 return GNUNET_SYSERR; // terminate the tunnel right away, we are done here!
2336 2341
2337invalid_msg: 2342invalid_msg:
2343 GNUNET_break_op (0);
2338 if (session->s) 2344 if (session->s)
2339 gcry_mpi_release (session->s); 2345 gcry_mpi_release (session->s);
2340 if (session->s_prime) 2346 if (session->s_prime)
2341 gcry_mpi_release (session->s_prime); 2347 gcry_mpi_release (session->s_prime);
2342 for (i = 0; session->r && i < contained_element_count; i++) 2348 for (i = 0; session->r && i < session->used; i++){
2343 if (session->r[i]) gcry_mpi_release (session->r[i]); 2349 if (session->r[i]) gcry_mpi_release (session->r[i]);
2344 for (i = 0; session->r_prime && i < contained_element_count; i++)
2345 if (session->r_prime[i]) gcry_mpi_release (session->r_prime[i]); 2350 if (session->r_prime[i]) gcry_mpi_release (session->r_prime[i]);
2351 }
2346 GNUNET_free_non_null (session->r); 2352 GNUNET_free_non_null (session->r);
2347 GNUNET_free_non_null (session->r_prime); 2353 GNUNET_free_non_null (session->r_prime);
2348 2354 session->s = NULL;
2355 session->s_prime = NULL;
2356 session->r = NULL;
2357 session->r_prime = NULL;
2349 session->tunnel = NULL; 2358 session->tunnel = NULL;
2350 // send message with product to client 2359 // send message with product to client
2351 session->client_notification_task = 2360 session->client_notification_task =