diff options
author | Christian Fuchs <christian.fuchs@cfuchs.net> | 2013-10-08 13:55:23 +0000 |
---|---|---|
committer | Christian Fuchs <christian.fuchs@cfuchs.net> | 2013-10-08 13:55:23 +0000 |
commit | f7ce2bca72c1089bc3036b7fd6e41e9ff41afe2f (patch) | |
tree | b63de69a89252ea6b7c2cfc132e27a50ff41dfad /src/scalarproduct | |
parent | c84242fa939f76a778ac5f9f4910a13ade5bb7c9 (diff) | |
download | gnunet-f7ce2bca72c1089bc3036b7fd6e41e9ff41afe2f.tar.gz gnunet-f7ce2bca72c1089bc3036b7fd6e41e9ff41afe2f.zip |
more multipart work
Diffstat (limited to 'src/scalarproduct')
-rw-r--r-- | src/scalarproduct/gnunet-service-scalarproduct.c | 32 |
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; | ||
2274 | invalid_msg: | 2270 | invalid_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); |