From ee32003b7e606767f9b89715cb956d863fe067d9 Mon Sep 17 00:00:00 2001 From: Christian Grothoff Date: Tue, 13 Aug 2013 16:40:41 +0000 Subject: -working on new, simplified GNS API --- src/gns/plugin_block_gns.c | 201 +++++++++++++-------------------------------- 1 file changed, 57 insertions(+), 144 deletions(-) (limited to 'src/gns/plugin_block_gns.c') diff --git a/src/gns/plugin_block_gns.c b/src/gns/plugin_block_gns.c index 4d12f02df..22e3d61fd 100644 --- a/src/gns/plugin_block_gns.c +++ b/src/gns/plugin_block_gns.c @@ -1,6 +1,6 @@ /* This file is part of GNUnet - (C) 2010, 2012 Christian Grothoff (and other contributing authors) + (C) 2010-2013 Christian Grothoff (and other contributing authors) GNUnet is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published @@ -27,7 +27,6 @@ #include "platform.h" #include "gnunet_block_plugin.h" #include "gnunet_namestore_service.h" -#include "block_gns.h" #include "gnunet_signatures.h" #include "gns_common.h" @@ -47,49 +46,32 @@ * @param cls closure * @param type block type * @param query original query (hash) - * @param bf pointer to bloom filter associated with query; possibly updated (!) - * @param bf_mutator mutation value for bf - * @param xquery extrended query data (can be NULL, depending on type) - * @param xquery_size number of bytes in xquery + * @param bf pointer to bloom filter associated with @a query; possibly updated (!) + * @param bf_mutator mutation value for @a bf + * @param xquery extrended query data (can be NULL, depending on @a type) + * @param xquery_size number of bytes in @a xquery * @param reply_block response to validate - * @param reply_block_size number of bytes in reply block + * @param reply_block_size number of bytes in @a reply_block * @return characterization of result */ static enum GNUNET_BLOCK_EvaluationResult block_plugin_gns_evaluate (void *cls, enum GNUNET_BLOCK_Type type, - const struct GNUNET_HashCode * query, + const struct GNUNET_HashCode *query, struct GNUNET_CONTAINER_BloomFilter **bf, int32_t bf_mutator, const void *xquery, size_t xquery_size, const void *reply_block, size_t reply_block_size) { - const struct GNSNameRecordBlock *nrb; - const char* name; - const char *name_end; - const char *rd_data; - struct GNUNET_HashCode query_key; - struct GNUNET_HashCode mhash; + const struct GNUNET_NAMESTORE_Block *block; + struct GNUNET_HashCode h; struct GNUNET_HashCode chash; - struct GNUNET_CRYPTO_ShortHashCode pkey_hash; - struct GNUNET_CRYPTO_HashAsciiEncoded xor_exp; - struct GNUNET_CRYPTO_HashAsciiEncoded xor_got; - uint32_t rd_count; - size_t rd_len; - size_t name_len; - uint32_t record_xquery; - unsigned int record_match; - - //GNUNET_log(GNUNET_ERROR_TYPE_DEBUG, "RB SIZE %d\n", reply_block_size); + struct GNUNET_HashCode mhash; if (type != GNUNET_BLOCK_TYPE_GNS_NAMERECORD) return GNUNET_BLOCK_EVALUATION_TYPE_NOT_SUPPORTED; - if (reply_block == NULL) + if (NULL == reply_block) { - /** - * check if request is valid - * FIXME we could check for the record types here - **/ - if (xquery_size < sizeof(uint32_t)) + if (0 != xquery_size) { GNUNET_break_op (0); return GNUNET_BLOCK_EVALUATION_REQUEST_INVALID; @@ -98,111 +80,47 @@ block_plugin_gns_evaluate (void *cls, enum GNUNET_BLOCK_Type type, } /* this is a reply */ - - nrb = (const struct GNSNameRecordBlock *)reply_block; - name = (const char*) &nrb[1]; - name_end = memchr (name, 0, reply_block_size - sizeof (struct GNSNameRecordBlock)); - if (NULL == name_end) - { - GNUNET_break_op (0); - return GNUNET_BLOCK_EVALUATION_RESULT_INVALID; - } - name_len = (name_end - name) + 1; - GNUNET_CRYPTO_short_hash (&nrb->public_key, - sizeof(nrb->public_key), - &pkey_hash); - GNUNET_GNS_get_key_for_record (name, &pkey_hash, &query_key); - - GNUNET_CRYPTO_hash_to_enc (&query_key, &xor_exp); - GNUNET_CRYPTO_hash_to_enc (query, &xor_got); - - //GNUNET_log(GNUNET_ERROR_TYPE_DEBUG, - // "BLOCK_TEST for %s got %s expected %s\n", - // name, (char*) &xor_got, (char*) &xor_exp); - - /* Check query key against public key */ - if (0 != GNUNET_CRYPTO_hash_cmp(query, &query_key)) - { - GNUNET_break_op (0); - return GNUNET_BLOCK_EVALUATION_RESULT_INVALID; - } - - record_match = 0; - rd_count = ntohl(nrb->rd_count); - rd_data = &name[name_len]; - rd_len = reply_block_size - (name_len - + sizeof(struct GNSNameRecordBlock)); - { - struct GNUNET_NAMESTORE_RecordData rd[rd_count]; - unsigned int i; - uint64_t exp = UINT64_MAX; - struct GNUNET_TIME_Absolute et = GNUNET_TIME_UNIT_FOREVER_ABS; - - if (GNUNET_SYSERR == GNUNET_NAMESTORE_records_deserialize (rd_len, - rd_data, - rd_count, - rd)) + if (reply_block_size < sizeof (struct GNUNET_NAMESTORE_Block)) { - GNUNET_log(GNUNET_ERROR_TYPE_DEBUG, - "Data invalid (%d bytes, %d records)\n", rd_len, rd_count); + GNUNET_break_op (0); return GNUNET_BLOCK_EVALUATION_RESULT_INVALID; } - - if (xquery_size < sizeof(uint32_t)) - record_xquery = 0; - else - record_xquery = ntohl(*((uint32_t*)xquery)); - - for (i=0; ipurpose.size) + sizeof (struct GNUNET_CRYPTO_EccSignature) + sizeof (struct GNUNET_CRYPTO_EccPublicKey) != + reply_block_size) + { + GNUNET_break_op (0); + return GNUNET_BLOCK_EVALUATION_RESULT_INVALID; } - et.abs_value_us = exp; - - GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, - "Verifying signature of %d records for name %s with expiration of %s\n", - rd_count, name, - GNUNET_STRINGS_absolute_time_to_string (et)); - - if (GNUNET_OK != - GNUNET_NAMESTORE_verify_signature (&nrb->public_key, - et, - name, - rd_count, - rd, - &nrb->signature)) + GNUNET_CRYPTO_hash (&block->derived_key, + sizeof (block->derived_key), + &h); + if (0 != memcmp (&h, query, sizeof (struct GNUNET_HashCode))) { - GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, - "Signature invalid for %s\n", name); GNUNET_break_op (0); return GNUNET_BLOCK_EVALUATION_RESULT_INVALID; } - } - - if (NULL != bf) - { - GNUNET_CRYPTO_hash (reply_block, reply_block_size, &chash); - GNUNET_BLOCK_mingle_hash (&chash, bf_mutator, &mhash); - if (NULL != *bf) + if (GNUNET_OK != + GNUNET_NAMESTORE_block_verify (block)) { - if (GNUNET_YES == GNUNET_CONTAINER_bloomfilter_test(*bf, &mhash)) - return GNUNET_BLOCK_EVALUATION_OK_DUPLICATE; + GNUNET_break_op (0); + return GNUNET_BLOCK_EVALUATION_RESULT_INVALID; } - else + if (NULL != bf) { - *bf = GNUNET_CONTAINER_bloomfilter_init(NULL, 8, BLOOMFILTER_K); + GNUNET_CRYPTO_hash (reply_block, reply_block_size, &chash); + GNUNET_BLOCK_mingle_hash (&chash, bf_mutator, &mhash); + if (NULL != *bf) + { + if (GNUNET_YES == GNUNET_CONTAINER_bloomfilter_test(*bf, &mhash)) + return GNUNET_BLOCK_EVALUATION_OK_DUPLICATE; + } + else + { + *bf = GNUNET_CONTAINER_bloomfilter_init(NULL, 8, BLOOMFILTER_K); + } + GNUNET_CONTAINER_bloomfilter_add(*bf, &mhash); } - GNUNET_CONTAINER_bloomfilter_add(*bf, &mhash); - } return GNUNET_BLOCK_EVALUATION_OK_MORE; } @@ -212,35 +130,30 @@ block_plugin_gns_evaluate (void *cls, enum GNUNET_BLOCK_Type type, * * @param cls closure * @param type block type - * @param block block to get the key for - * @param block_size number of bytes in block + * @param reply_block block to get the key for + * @param reply_block_size number of bytes in @a reply_block * @param key set to the key (query) for the given block - * @return GNUNET_OK on success, GNUNET_SYSERR if type not supported + * @return #GNUNET_OK on success, #GNUNET_SYSERR if type not supported * (or if extracting a key from a block of this type does not work) */ static int block_plugin_gns_get_key (void *cls, enum GNUNET_BLOCK_Type type, - const void *block, size_t block_size, - struct GNUNET_HashCode * key) + const void *reply_block, size_t reply_block_size, + struct GNUNET_HashCode *key) { - struct GNUNET_CRYPTO_ShortHashCode pkey_hash; - const struct GNSNameRecordBlock *nrb = block; - const char *name; + const struct GNUNET_NAMESTORE_Block *block; if (type != GNUNET_BLOCK_TYPE_GNS_NAMERECORD) return GNUNET_SYSERR; - name = (const char *) &nrb[1]; - if (NULL == memchr (name, '\0', - block_size - sizeof (struct GNSNameRecordBlock))) - { - /* malformed, no 0-termination in name */ - GNUNET_break_op (0); - return GNUNET_SYSERR; - } - GNUNET_CRYPTO_short_hash (&nrb->public_key, - sizeof (struct GNUNET_CRYPTO_EccPublicKey), - &pkey_hash); - GNUNET_GNS_get_key_for_record (name, &pkey_hash, key); + if (reply_block_size < sizeof (struct GNUNET_NAMESTORE_Block)) + { + GNUNET_break_op (0); + return GNUNET_BLOCK_EVALUATION_RESULT_INVALID; + } + block = reply_block; + GNUNET_CRYPTO_hash (&block->derived_key, + sizeof (block->derived_key), + key); return GNUNET_OK; } @@ -258,7 +171,7 @@ libgnunet_plugin_block_gns_init (void *cls) }; struct GNUNET_BLOCK_PluginFunctions *api; - api = GNUNET_malloc (sizeof (struct GNUNET_BLOCK_PluginFunctions)); + api = GNUNET_new (struct GNUNET_BLOCK_PluginFunctions); api->evaluate = &block_plugin_gns_evaluate; api->get_key = &block_plugin_gns_get_key; api->types = types; -- cgit v1.2.3