/** * @brief This function is the GNUnet iteration handler called while iterating the connected peers. * * \latexonly \\ \\ \endlatexonly * \em Detailed \em description \n * This function is the GNUnet iteration handler called while iterating the connected peers. It is used to flood data to all known peers. * * @param cls the GNUnet closure; it contains a reference to a data structure (see above) containing a parameters needed to send data to the current peer. * @param peer the peer of the current iteration * @param atsi a reference to the GNUnet ATS information (not used) * @param atsi_count the length of the ATS information (not used) */ static void gnunet_search_flooding_peer_iterate_handler(void *cls, const struct GNUNET_PeerIdentity *peer, const struct GNUNET_ATS_Information *atsi, unsigned int atsi_count) { if(!peer) { // printf("Iterating done...\n"); struct gnunet_search_flooding_data_flood_parameters *parameters = (struct gnunet_search_flooding_data_flood_parameters*) cls; GNUNET_free(parameters->data); if(parameters->sender) GNUNET_free(parameters->sender); GNUNET_free(parameters); return; } struct gnunet_search_flooding_data_flood_parameters *parameters = (struct gnunet_search_flooding_data_flood_parameters*) cls; if(parameters->sender && !GNUNET_CRYPTO_hash_cmp(¶meters->sender->hashPubKey, &peer->hashPubKey)) { // printf("Skipping sender...\n"); return; } struct GNUNET_CRYPTO_HashAsciiEncoded result; GNUNET_CRYPTO_hash_to_enc(&peer->hashPubKey, &result); // printf("Flooding message to peer %.*s...\n", 104, (char*) &result); gnunet_search_flooding_to_peer_message_send(peer, parameters->data, parameters->size); }
/** * Compare two `struct MpiValue`s by key for sorting. * * @param a pointer to first `struct MpiValue *` * @param b pointer to first `struct MpiValue *` * @return -1 for a < b, 0 for a=b, 1 for a > b. * TODO: code duplication with Alice! */ static int element_cmp (const void *a, const void *b) { const struct MpiElement *ma = a; const struct MpiElement *mb = b; return GNUNET_CRYPTO_hash_cmp (ma->key, mb->key); }
static int testArithmetic () { static struct GNUNET_CRYPTO_AesSessionKey zskey; static struct GNUNET_CRYPTO_AesInitializationVector ziv; struct GNUNET_HashCode h1; struct GNUNET_HashCode h2; struct GNUNET_HashCode d; struct GNUNET_HashCode s; struct GNUNET_CRYPTO_AesSessionKey skey; struct GNUNET_CRYPTO_AesInitializationVector iv; GNUNET_CRYPTO_hash_create_random (GNUNET_CRYPTO_QUALITY_WEAK, &h1); GNUNET_CRYPTO_hash_create_random (GNUNET_CRYPTO_QUALITY_WEAK, &h2); if (GNUNET_CRYPTO_hash_distance_u32 (&h1, &h2) != GNUNET_CRYPTO_hash_distance_u32 (&h2, &h1)) return 1; GNUNET_CRYPTO_hash_difference (&h1, &h2, &d); GNUNET_CRYPTO_hash_sum (&h1, &d, &s); if (0 != GNUNET_CRYPTO_hash_cmp (&s, &h2)) return 1; GNUNET_CRYPTO_hash_xor (&h1, &h2, &d); GNUNET_CRYPTO_hash_xor (&h1, &d, &s); if (0 != GNUNET_CRYPTO_hash_cmp (&s, &h2)) return 1; if (0 != GNUNET_CRYPTO_hash_xorcmp (&s, &h2, &h1)) return 1; if (-1 != GNUNET_CRYPTO_hash_xorcmp (&h1, &h2, &h1)) return 1; if (1 != GNUNET_CRYPTO_hash_xorcmp (&h1, &h2, &h2)) return 1; memset (&d, 0xF0, sizeof (d)); if (0 != GNUNET_CRYPTO_hash_get_bit (&d, 3)) return 1; if (1 != GNUNET_CRYPTO_hash_get_bit (&d, 6)) return 1; memset (&d, 0, sizeof (d)); GNUNET_CRYPTO_hash_to_aes_key (&d, &skey, &iv); if ((0 != memcmp (&skey, &zskey, sizeof (skey) - sizeof (unsigned int))) || (0 != memcmp (&iv, &ziv, sizeof (iv)))) return 1; return 0; }