plugin_block_gns.c   plugin_block_gns.c 
skipping to change at line 65 skipping to change at line 65
* @return characterization of result * @return characterization of result
*/ */
static enum GNUNET_BLOCK_EvaluationResult static enum GNUNET_BLOCK_EvaluationResult
block_plugin_gns_evaluate (void *cls, enum GNUNET_BLOCK_Type type, block_plugin_gns_evaluate (void *cls, enum GNUNET_BLOCK_Type type,
const GNUNET_HashCode * query, const GNUNET_HashCode * query,
struct GNUNET_CONTAINER_BloomFilter **bf, struct GNUNET_CONTAINER_BloomFilter **bf,
int32_t bf_mutator, const void *xquery, int32_t bf_mutator, const void *xquery,
size_t xquery_size, const void *reply_block, size_t xquery_size, const void *reply_block,
size_t reply_block_size) size_t reply_block_size)
{ {
if (type != GNUNET_BLOCK_TYPE_GNS_NAMERECORD)
return GNUNET_BLOCK_EVALUATION_TYPE_NOT_SUPPORTED;
if (reply_block_size == 0)
return GNUNET_BLOCK_EVALUATION_REQUEST_VALID;
char* name; char* name;
GNUNET_HashCode pkey_hash; GNUNET_HashCode pkey_hash_double;
GNUNET_HashCode query_key; GNUNET_HashCode query_key;
GNUNET_HashCode name_hash; GNUNET_HashCode name_hash_double;
GNUNET_HashCode mhash; GNUNET_HashCode mhash;
GNUNET_HashCode chash; GNUNET_HashCode chash;
struct GNUNET_CRYPTO_ShortHashCode pkey_hash;
struct GNUNET_CRYPTO_ShortHashCode name_hash;
struct GNSNameRecordBlock *nrb; struct GNSNameRecordBlock *nrb;
struct GNSRecordBlock *rb;
uint32_t rd_count; uint32_t rd_count;
char* rd_data = NULL;
int rd_len;
uint32_t record_xquery;
unsigned int record_match;
//GNUNET_log(GNUNET_ERROR_TYPE_DEBUG, "RB SIZE %d\n", reply_block_size);
if (type != GNUNET_BLOCK_TYPE_GNS_NAMERECORD)
return GNUNET_BLOCK_EVALUATION_TYPE_NOT_SUPPORTED;
if (reply_block == NULL)
{
/**
* check if request is valid
* FIXME we could check for the record types here
**/
if (xquery_size < sizeof(uint32_t))
{
GNUNET_break_op (0);
return GNUNET_BLOCK_EVALUATION_REQUEST_INVALID;
}
return GNUNET_BLOCK_EVALUATION_REQUEST_VALID;
}
/* this is a reply */
nrb = (struct GNSNameRecordBlock *)reply_block; nrb = (struct GNSNameRecordBlock *)reply_block;
name = (char*)&nrb[1]; name = (char*)&nrb[1];
GNUNET_CRYPTO_hash(&nrb->public_key, GNUNET_CRYPTO_short_hash(&nrb->public_key,
sizeof(nrb->public_key), sizeof(nrb->public_key),
&pkey_hash); &pkey_hash);
GNUNET_CRYPTO_hash(name, strlen(name), &name_hash); GNUNET_CRYPTO_short_hash(name, strlen(name), &name_hash);
GNUNET_CRYPTO_hash_xor(&pkey_hash, &name_hash, &query_key); GNUNET_CRYPTO_short_hash_double(&name_hash, &name_hash_double);
GNUNET_CRYPTO_short_hash_double(&pkey_hash, &pkey_hash_double);
GNUNET_CRYPTO_hash_xor(&pkey_hash_double, &name_hash_double, &query_key);
struct GNUNET_CRYPTO_HashAsciiEncoded xor_exp;
struct GNUNET_CRYPTO_HashAsciiEncoded xor_got;
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 */ /* Check query key against public key */
if (0 != GNUNET_CRYPTO_hash_cmp(query, &query_key)) if (0 != GNUNET_CRYPTO_hash_cmp(query, &query_key))
return GNUNET_BLOCK_EVALUATION_REQUEST_VALID; {
GNUNET_break_op (0);
return GNUNET_BLOCK_EVALUATION_RESULT_INVALID;
}
record_match = 0;
rd_count = ntohl(nrb->rd_count); rd_count = ntohl(nrb->rd_count);
rd_data = (char*)&nrb[1];
rd_data += strlen(name) + 1;
rd_len = reply_block_size - (strlen(name) + 1
+ sizeof(struct GNSNameRecordBlock));
{
struct GNUNET_NAMESTORE_RecordData rd[rd_count];
unsigned int i;
struct GNUNET_TIME_Absolute exp = GNUNET_TIME_UNIT_FOREVER_ABS;
if (GNUNET_SYSERR == GNUNET_NAMESTORE_records_deserialize (rd_len,
rd_data,
rd_count,
rd))
{
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;
}
struct GNUNET_NAMESTORE_RecordData rd[rd_count]; if (xquery_size < sizeof(uint32_t))
int i = 0; record_xquery = 0;
int record_match = 0; else
uint32_t record_xquery = ntohl(*((uint32_t*)xquery)); record_xquery = ntohl(*((uint32_t*)xquery));
rb = (struct GNSRecordBlock*)(&name[strlen(name) + 1]);
for (i=0; i<rd_count; i++) for (i=0; i<rd_count; i++)
{ {
rd[i].record_type = ntohl(rb->type);
rd[i].expiration = exp = GNUNET_TIME_absolute_min (exp, rd[i].expiration);
GNUNET_TIME_absolute_ntoh(rb->expiration);
rd[i].data_size = ntohl(rb->data_length);
rd[i].flags = ntohl(rb->flags);
rd[i].data = (char*)&rb[1];
rb = (struct GNSRecordBlock *)((char*)&rb[1] + rd[i].data_size);
if (xquery_size == 0) GNUNET_log(GNUNET_ERROR_TYPE_DEBUG,
continue; "Got record of size %d\n", rd[i].data_size);
if (rd[i].record_type == record_xquery) if ((record_xquery != 0)
&& (rd[i].record_type == record_xquery))
{
record_match++;
}
}
GNUNET_log(GNUNET_ERROR_TYPE_DEBUG,
"Verifying signature of %d records for name %s\n",
rd_count, name);
if (GNUNET_OK != GNUNET_NAMESTORE_verify_signature (&nrb->public_key,
exp,
name,
rd_count,
rd,
&nrb->signature))
{ {
record_match++; GNUNET_log(GNUNET_ERROR_TYPE_DEBUG, "Signature invalid for name %s\n"
);
GNUNET_break_op (0);
return GNUNET_BLOCK_EVALUATION_RESULT_INVALID;
} }
} }
/*if (GNUNET_OK != GNUNET_NAMESTORE_verify_signature (&nrb->public_key,
name,
rd_count,
rd,
NULL))
{
GNUNET_log(GNUNET_ERROR_TYPE_INFO, "Signature invalid\n");
return GNUNET_BLOCK_EVALUATION_REQUEST_INVALID;
}*/
//No record matches query
if ((xquery_size > 0) && (record_match == 0))
return GNUNET_BLOCK_EVALUATION_REQUEST_VALID;
GNUNET_log(GNUNET_ERROR_TYPE_INFO, "Records match\n");
//FIXME do bf check before or after crypto??
if (NULL != bf) if (NULL != bf)
{ {
GNUNET_CRYPTO_hash(reply_block, reply_block_size, &chash); GNUNET_CRYPTO_hash(reply_block, reply_block_size, &chash);
GNUNET_BLOCK_mingle_hash(&chash, bf_mutator, &mhash); GNUNET_BLOCK_mingle_hash(&chash, bf_mutator, &mhash);
if (NULL != *bf) if (NULL != *bf)
{ {
GNUNET_log(GNUNET_ERROR_TYPE_INFO, "Check BF\n");
if (GNUNET_YES == GNUNET_CONTAINER_bloomfilter_test(*bf, &mhash)) if (GNUNET_YES == GNUNET_CONTAINER_bloomfilter_test(*bf, &mhash))
return GNUNET_BLOCK_EVALUATION_OK_DUPLICATE; return GNUNET_BLOCK_EVALUATION_OK_DUPLICATE;
} }
else else
{ {
*bf = GNUNET_CONTAINER_bloomfilter_init(NULL, 8, BLOOMFILTER_K); *bf = GNUNET_CONTAINER_bloomfilter_init(NULL, 8, BLOOMFILTER_K);
} }
GNUNET_CONTAINER_bloomfilter_add(*bf, &mhash); GNUNET_CONTAINER_bloomfilter_add(*bf, &mhash);
} }
GNUNET_log(GNUNET_ERROR_TYPE_INFO, "No dup\n");
return GNUNET_BLOCK_EVALUATION_OK_MORE; return GNUNET_BLOCK_EVALUATION_OK_MORE;
} }
/** /**
* Function called to obtain the key for a block. * Function called to obtain the key for a block.
* *
* @param cls closure * @param cls closure
* @param type block type * @param type block type
* @param block block to get the key for * @param block block to get the key for
* @param block_size number of bytes in block * @param block_size number of bytes in block
skipping to change at line 175 skipping to change at line 224
* @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) * (or if extracting a key from a block of this type does not work)
*/ */
static int static int
block_plugin_gns_get_key (void *cls, enum GNUNET_BLOCK_Type type, block_plugin_gns_get_key (void *cls, enum GNUNET_BLOCK_Type type,
const void *block, size_t block_size, const void *block, size_t block_size,
GNUNET_HashCode * key) GNUNET_HashCode * key)
{ {
if (type != GNUNET_BLOCK_TYPE_GNS_NAMERECORD) if (type != GNUNET_BLOCK_TYPE_GNS_NAMERECORD)
return GNUNET_SYSERR; return GNUNET_SYSERR;
GNUNET_HashCode name_hash; struct GNUNET_CRYPTO_ShortHashCode name_hash;
GNUNET_HashCode pkey_hash; struct GNUNET_CRYPTO_ShortHashCode pkey_hash;
GNUNET_HashCode name_hash_double;
GNUNET_HashCode pkey_hash_double;
struct GNSNameRecordBlock *nrb = (struct GNSNameRecordBlock *)block; struct GNSNameRecordBlock *nrb = (struct GNSNameRecordBlock *)block;
GNUNET_CRYPTO_hash(&nrb[1], strlen((char*)&nrb[1]), &name_hash); GNUNET_CRYPTO_short_hash(&nrb[1], strlen((char*)&nrb[1]), &name_hash);
GNUNET_CRYPTO_hash(&nrb->public_key, GNUNET_CRYPTO_short_hash(&nrb->public_key,
sizeof(struct GNUNET_CRYPTO_RsaPublicKeyBinaryEncoded) , sizeof(struct GNUNET_CRYPTO_RsaPublicKeyBinaryEncoded) ,
&pkey_hash); &pkey_hash);
GNUNET_CRYPTO_hash_xor(&name_hash, &pkey_hash, key); GNUNET_CRYPTO_short_hash_double(&name_hash, &name_hash_double);
GNUNET_CRYPTO_short_hash_double(&pkey_hash, &pkey_hash_double);
GNUNET_CRYPTO_hash_xor(&name_hash_double, &pkey_hash_double, key);
//FIXME calculate key from name and hash(pkey) here
return GNUNET_OK; return GNUNET_OK;
} }
/** /**
* Entry point for the plugin. * Entry point for the plugin.
*/ */
void * void *
libgnunet_plugin_block_gns_init (void *cls) libgnunet_plugin_block_gns_init (void *cls)
{ {
static enum GNUNET_BLOCK_Type types[] = static enum GNUNET_BLOCK_Type types[] =
 End of changes. 24 change blocks. 
54 lines changed or deleted 110 lines changed or added

This html diff was produced by rfcdiff 1.41. The latest version is available from http://tools.ietf.org/tools/rfcdiff/