- {
- s->sorted_elements
- = GNUNET_malloc (GNUNET_CONTAINER_multihashmap_size (s->intersected_elements) *
- sizeof (struct MpiElement));
- s->used_element_count = 0;
- GNUNET_CONTAINER_multihashmap_iterate (s->intersected_elements,
- ©_element_cb,
- s);
- qsort (s->sorted_elements,
- s->used_element_count,
- sizeof (struct MpiElement),
- &element_cmp);
- }
-
- /* parse message */
- msize = ntohs (message->size);
- if (msize <= sizeof (struct EccAliceCryptodataMessage))
- {
- GNUNET_break_op (0);
- return GNUNET_SYSERR;
- }
- msg = (const struct EccAliceCryptodataMessage *) message;
- contained_elements = ntohl (msg->contained_element_count);
- /* Our intersection may still be ongoing, but this is nevertheless
- an upper bound on the required array size */
- max = GNUNET_CONTAINER_multihashmap_size (s->intersected_elements);
- msg_length = sizeof (struct EccAliceCryptodataMessage)
- + contained_elements * sizeof (struct GNUNET_CRYPTO_EccPoint) * 2;
- if ( (msize != msg_length) ||
- (0 == contained_elements) ||
- (contained_elements > UINT16_MAX) ||
- (max < contained_elements + s->cadet_received_element_count) )
- {
- GNUNET_break_op (0);
- return GNUNET_SYSERR;
- }
- GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
- "Received %u crypto values from Alice\n",
- (unsigned int) contained_elements);
- payload = (const struct GNUNET_CRYPTO_EccPoint *) &msg[1];
-
- for (i=0;i<contained_elements;i++)
- {
- b_i = &s->sorted_elements[i + s->cadet_received_element_count];
- g_i = GNUNET_CRYPTO_ecc_bin_to_point (edc,
- &payload[i * 2]);
- g_i_b_i = GNUNET_CRYPTO_ecc_pmul_mpi (edc,
- g_i,
- b_i->value);
- gcry_mpi_point_release (g_i);
- h_i = GNUNET_CRYPTO_ecc_bin_to_point (edc,
- &payload[i * 2 + 1]);
- h_i_b_i = GNUNET_CRYPTO_ecc_pmul_mpi (edc,
- h_i,
- b_i->value);
- gcry_mpi_point_release (h_i);
- if (0 == i + s->cadet_received_element_count)