diff options
-rw-r--r-- | src/scalarproduct/gnunet-service-scalarproduct.c | 247 |
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 | |||
514 | prepare_service_response_multipart (void *cls, | 520 | prepare_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 | |||
528 | do_send_message (void *cls, size_t size, void *buf) | 535 | do_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; |
1971 | except: | 1980 | except: |
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; |
2134 | except: | 2143 | except: |
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! |
2221 | except: | 2230 | |
2231 | invalid_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 | ||
2337 | invalid_msg: | 2342 | invalid_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 = |