From: Philipp Tölke Date: Fri, 8 Oct 2010 07:36:36 +0000 (+0000) Subject: hash and validate a dns-block X-Git-Tag: initial-import-from-subversion-38251~20122 X-Git-Url: https://git.librecmc.org/?a=commitdiff_plain;h=bab9c4ab9624c1b2693e2e5820c1820fd32e6fb1;p=oweals%2Fgnunet.git hash and validate a dns-block --- diff --git a/src/block/plugin_block_dns.c b/src/block/plugin_block_dns.c index 743747c85..8435c1be0 100644 --- a/src/block/plugin_block_dns.c +++ b/src/block/plugin_block_dns.c @@ -26,6 +26,7 @@ #include "platform.h" #include "plugin_block.h" +#include "gnunet_block_dns.h" #define DEBUG_DHT GNUNET_NO @@ -60,9 +61,19 @@ block_plugin_dht_evaluate (void *cls, case GNUNET_BLOCK_TYPE_DNS: if (xquery_size != 0) return GNUNET_BLOCK_EVALUATION_REQUEST_INVALID; + if (reply_block_size == 0) return GNUNET_BLOCK_EVALUATION_REQUEST_VALID; - return GNUNET_BLOCK_EVALUATION_OK_LAST; + + if (reply_block_size < sizeof(struct GNUNET_DNS_Record)) + return GNUNET_BLOCK_EVALUATION_RESULT_INVALID; + + const struct GNUNET_DNS_Record* rec = reply_block; + if(reply_block_size != (sizeof(struct GNUNET_DNS_Record) + rec->namelen - 1)) + return GNUNET_BLOCK_EVALUATION_RESULT_INVALID; + + /* How to decide whether there are no more? */ + return GNUNET_BLOCK_EVALUATION_OK_MORE; default: return GNUNET_BLOCK_EVALUATION_TYPE_NOT_SUPPORTED; } @@ -89,7 +100,8 @@ block_plugin_dht_get_key (void *cls, { if (type != GNUNET_BLOCK_TYPE_DNS) return GNUNET_SYSERR; - return GNUNET_SYSERR; + GNUNET_CRYPTO_hash(block, block_size, key); + return GNUNET_OK; } /** diff --git a/src/include/gnunet_block_dns.h b/src/include/gnunet_block_dns.h new file mode 100644 index 000000000..d8f3fa50e --- /dev/null +++ b/src/include/gnunet_block_dns.h @@ -0,0 +1,49 @@ +#ifndef _GNVPN_BLOCKDNS_H_ +#define _GNVPN_BLOCKDNS_H_ + +#include "gnunet_common.h" + +/** + * Bitmask describing what ip-services are supported by services + * It is 2 bytes long + */ +struct GNUNET_ipservices { + unsigned UDP:1 GNUNET_PACKED; + unsigned TCP:1 GNUNET_PACKED; + unsigned RESERVED:14 GNUNET_PACKED; +}; + +/** + * This is the structure describing an dns-record such as www.gnunet. + */ +struct GNUNET_DNS_Record +{ + /** + * The peer providing this service + */ + struct GNUNET_PeerIdentity peer; + + /** + * The descriptor for the service + * (a peer may provide more than one service) + */ + GNUNET_HashCode service_descriptor; + + /** + * What connection-types (UDP, TCP, ...) are supported by the service + */ + struct GNUNET_ipservices connectiontypes; + + /** + * The length of the name of the service + */ + unsigned char namelen; + + /** + * The name of the service + * This is namelen bytes + */ + char name[1]; +}; + +#endif diff --git a/src/vpn/gnunet-block-dns.h b/src/vpn/gnunet-block-dns.h deleted file mode 100644 index d8f3fa50e..000000000 --- a/src/vpn/gnunet-block-dns.h +++ /dev/null @@ -1,49 +0,0 @@ -#ifndef _GNVPN_BLOCKDNS_H_ -#define _GNVPN_BLOCKDNS_H_ - -#include "gnunet_common.h" - -/** - * Bitmask describing what ip-services are supported by services - * It is 2 bytes long - */ -struct GNUNET_ipservices { - unsigned UDP:1 GNUNET_PACKED; - unsigned TCP:1 GNUNET_PACKED; - unsigned RESERVED:14 GNUNET_PACKED; -}; - -/** - * This is the structure describing an dns-record such as www.gnunet. - */ -struct GNUNET_DNS_Record -{ - /** - * The peer providing this service - */ - struct GNUNET_PeerIdentity peer; - - /** - * The descriptor for the service - * (a peer may provide more than one service) - */ - GNUNET_HashCode service_descriptor; - - /** - * What connection-types (UDP, TCP, ...) are supported by the service - */ - struct GNUNET_ipservices connectiontypes; - - /** - * The length of the name of the service - */ - unsigned char namelen; - - /** - * The name of the service - * This is namelen bytes - */ - char name[1]; -}; - -#endif