aboutsummaryrefslogtreecommitdiff
path: root/src/scalarproduct
diff options
context:
space:
mode:
authorChristian Fuchs <christian.fuchs@cfuchs.net>2013-10-08 13:55:23 +0000
committerChristian Fuchs <christian.fuchs@cfuchs.net>2013-10-08 13:55:23 +0000
commitf7ce2bca72c1089bc3036b7fd6e41e9ff41afe2f (patch)
treeb63de69a89252ea6b7c2cfc132e27a50ff41dfad /src/scalarproduct
parentc84242fa939f76a778ac5f9f4910a13ade5bb7c9 (diff)
downloadgnunet-f7ce2bca72c1089bc3036b7fd6e41e9ff41afe2f.tar.gz
gnunet-f7ce2bca72c1089bc3036b7fd6e41e9ff41afe2f.zip
more multipart work
Diffstat (limited to 'src/scalarproduct')
-rw-r--r--src/scalarproduct/gnunet-service-scalarproduct.c32
1 files changed, 14 insertions, 18 deletions
diff --git a/src/scalarproduct/gnunet-service-scalarproduct.c b/src/scalarproduct/gnunet-service-scalarproduct.c
index 6f6ace6d5..3d4a37754 100644
--- a/src/scalarproduct/gnunet-service-scalarproduct.c
+++ b/src/scalarproduct/gnunet-service-scalarproduct.c
@@ -2190,7 +2190,6 @@ handle_service_response (void *cls,
2190 struct ServiceSession * session; 2190 struct ServiceSession * session;
2191 const struct GNUNET_SCALARPRODUCT_service_response * msg = (const struct GNUNET_SCALARPRODUCT_service_response *) message; 2191 const struct GNUNET_SCALARPRODUCT_service_response * msg = (const struct GNUNET_SCALARPRODUCT_service_response *) message;
2192 unsigned char * current; 2192 unsigned char * current;
2193 uint32_t count;
2194 gcry_mpi_t s = NULL; 2193 gcry_mpi_t s = NULL;
2195 gcry_mpi_t s_prime = NULL; 2194 gcry_mpi_t s_prime = NULL;
2196 size_t read; 2195 size_t read;
@@ -2208,9 +2207,8 @@ handle_service_response (void *cls,
2208 return GNUNET_SYSERR; 2207 return GNUNET_SYSERR;
2209 } 2208 }
2210 2209
2211 count = session->used_element_count;
2212 session->product = NULL; 2210 session->product = NULL;
2213 session->state = SERVICE_RESPONSE_RECEIVED; 2211 session->state = WAITING_FOR_MULTIPART_TRANSMISSION;
2214 2212
2215 //we need at least a peer and one message id to compare 2213 //we need at least a peer and one message id to compare
2216 if (sizeof (struct GNUNET_SCALARPRODUCT_service_response) > ntohs (msg->header.size)) { 2214 if (sizeof (struct GNUNET_SCALARPRODUCT_service_response) > ntohs (msg->header.size)) {
@@ -2222,11 +2220,11 @@ handle_service_response (void *cls,
2222 + 2 * contained_element_count * PAILLIER_ELEMENT_LENGTH 2220 + 2 * contained_element_count * PAILLIER_ELEMENT_LENGTH
2223 + 2 * PAILLIER_ELEMENT_LENGTH; 2221 + 2 * PAILLIER_ELEMENT_LENGTH;
2224 //sanity check: is the message as long as the message_count fields suggests? 2222 //sanity check: is the message as long as the message_count fields suggests?
2225 if ((ntohs (msg->header.size) != msg_size) || (count != contained_element_count)) { 2223 if ((ntohs (msg->header.size) != msg_size) || (session->used_element_count < contained_element_count)) {
2226 GNUNET_break_op (0); 2224 GNUNET_break_op (0);
2227 goto invalid_msg; 2225 goto invalid_msg;
2228 } 2226 }
2229 2227 session->transferred_element_count = contained_element_count;
2230 //convert s 2228 //convert s
2231 current = (unsigned char *) &msg[1]; 2229 current = (unsigned char *) &msg[1];
2232 if (0 != (rc = gcry_mpi_scan (&s, GCRYMPI_FMT_USG, current, 2230 if (0 != (rc = gcry_mpi_scan (&s, GCRYMPI_FMT_USG, current,
@@ -2244,10 +2242,10 @@ handle_service_response (void *cls,
2244 goto invalid_msg; 2242 goto invalid_msg;
2245 } 2243 }
2246 current += PAILLIER_ELEMENT_LENGTH; 2244 current += PAILLIER_ELEMENT_LENGTH;
2247
2248 r = GNUNET_malloc (sizeof (gcry_mpi_t) * count); 2245 r = GNUNET_malloc (sizeof (gcry_mpi_t) * count);
2249 // Convert each kp[] to its MPI_value 2246 r_prime = GNUNET_malloc (sizeof (gcry_mpi_t) * count);
2250 for (i = 0; i < count; i++) { 2247 // Convert each k[][perm] to its MPI_value
2248 for (i = 0; i < contained_element_count; i++) {
2251 if (0 != (rc = gcry_mpi_scan (&r[i], GCRYMPI_FMT_USG, current, 2249 if (0 != (rc = gcry_mpi_scan (&r[i], GCRYMPI_FMT_USG, current,
2252 PAILLIER_ELEMENT_LENGTH, &read))) { 2250 PAILLIER_ELEMENT_LENGTH, &read))) {
2253 LOG_GCRY (GNUNET_ERROR_TYPE_DEBUG, "gcry_mpi_scan", rc); 2251 LOG_GCRY (GNUNET_ERROR_TYPE_DEBUG, "gcry_mpi_scan", rc);
@@ -2255,12 +2253,6 @@ handle_service_response (void *cls,
2255 goto invalid_msg; 2253 goto invalid_msg;
2256 } 2254 }
2257 current += PAILLIER_ELEMENT_LENGTH; 2255 current += PAILLIER_ELEMENT_LENGTH;
2258 }
2259
2260
2261 r_prime = GNUNET_malloc (sizeof (gcry_mpi_t) * count);
2262 // Convert each kq[] to its MPI_value
2263 for (i = 0; i < count; i++) {
2264 if (0 != (rc = gcry_mpi_scan (&r_prime[i], GCRYMPI_FMT_USG, current, 2256 if (0 != (rc = gcry_mpi_scan (&r_prime[i], GCRYMPI_FMT_USG, current,
2265 PAILLIER_ELEMENT_LENGTH, &read))) { 2257 PAILLIER_ELEMENT_LENGTH, &read))) {
2266 LOG_GCRY (GNUNET_ERROR_TYPE_DEBUG, "gcry_mpi_scan", rc); 2258 LOG_GCRY (GNUNET_ERROR_TYPE_DEBUG, "gcry_mpi_scan", rc);
@@ -2269,16 +2261,20 @@ handle_service_response (void *cls,
2269 } 2261 }
2270 current += PAILLIER_ELEMENT_LENGTH; 2262 current += PAILLIER_ELEMENT_LENGTH;
2271 } 2263 }
2272 session->product = compute_scalar_product (session, r, r_prime, s, s_prime); 2264 if (session->transferred_element_count == session->used_element_count){
2273 2265 session->state = SERVICE_RESPONSE_RECEIVED;
2266 session->product = compute_scalar_product (session, r, r_prime, s, s_prime);
2267 return GNUNET_SYSERR;
2268 }
2269 return GNUNET_OK;
2274invalid_msg: 2270invalid_msg:
2275 if (s) 2271 if (s)
2276 gcry_mpi_release (s); 2272 gcry_mpi_release (s);
2277 if (s_prime) 2273 if (s_prime)
2278 gcry_mpi_release (s_prime); 2274 gcry_mpi_release (s_prime);
2279 for (i = 0; r && i < count; i++) 2275 for (i = 0; r && i < contained_element_count; i++)
2280 if (r[i]) gcry_mpi_release (r[i]); 2276 if (r[i]) gcry_mpi_release (r[i]);
2281 for (i = 0; r_prime && i < count; i++) 2277 for (i = 0; r_prime && i < contained_element_count; i++)
2282 if (r_prime[i]) gcry_mpi_release (r_prime[i]); 2278 if (r_prime[i]) gcry_mpi_release (r_prime[i]);
2283 GNUNET_free_non_null (r); 2279 GNUNET_free_non_null (r);
2284 GNUNET_free_non_null (r_prime); 2280 GNUNET_free_non_null (r_prime);