[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[GNUnet-SVN] r18252 - in gnunet: . src/block src/dht src/fs src/vpn
From: |
gnunet |
Subject: |
[GNUnet-SVN] r18252 - in gnunet: . src/block src/dht src/fs src/vpn |
Date: |
Tue, 22 Nov 2011 12:53:26 +0100 |
Author: grothoff
Date: 2011-11-22 12:53:26 +0100 (Tue, 22 Nov 2011)
New Revision: 18252
Added:
gnunet/src/dht/plugin_block_dht.c
gnunet/src/fs/plugin_block_fs.c
gnunet/src/vpn/plugin_block_dns.c
Removed:
gnunet/src/block/plugin_block_dht.c
gnunet/src/block/plugin_block_dns.c
gnunet/src/block/plugin_block_fs.c
Modified:
gnunet/TODO
gnunet/src/block/Makefile.am
gnunet/src/dht/Makefile.am
gnunet/src/fs/Makefile.am
gnunet/src/vpn/Makefile.am
Log:
moving block plugins to respective subsystem
Modified: gnunet/TODO
===================================================================
--- gnunet/TODO 2011-11-22 10:29:55 UTC (rev 18251)
+++ gnunet/TODO 2011-11-22 11:53:26 UTC (rev 18252)
@@ -1,22 +1,12 @@
0.9.0:
-* GNUNET-GTK: [CG]
- - provide context menus to allow aborts of downloads/uploads
- - provide way to handle errors (search, download, publish errors)
* new webpage:
- write chapter on DHT/block [Nate]
- - make a NICE download page
* big code review
* Determine RC bugs and fix those (release should have no known real bugs)
* Transport:
- When receiving SESSION_CONNECT: actually consider switching session
(test this!)
* FS [CG]
- - implement multi-peer FS performance tests + gauger them!
- + insert
- + download
- + search
-* blocks:
- + should block plugins live in block/ or with fs/dht/vpn?
0.9.1:
* TRANSPORT: [MW]
@@ -41,8 +31,10 @@
- Remove KBlocks in gnunet-unindex (see discussion with Kenneth Almquist on
gnunet-devs in 9/2009)
- use different queue prioritization for probe-downloads vs. normal downloads
- re-implement gnunet-auto-share
- - implement 'GNUNET_FS_file_information_create_from_directory', avoiding
- code duplication with gnunet-gtk's similar code (!)
+ - implement multi-peer FS performance tests + gauger them!
+ + insert
+ + download
+ + search
* GNUNET-GTK: [CG]
- add tool bar
- do meaningful update to status line (starting up, peer running,
#connections, shutdown, ...)
@@ -56,6 +48,8 @@
+ normalize keywords (edit subdialog)
- implement download by URI dialog; figure out where to display those
downloads!
- add combo box to select desired mime type for search
+ - provide context menus to allow aborts of downloads/uploads
+ - provide way to handle errors (search, download, publish errors)
* ARM: [CG]
- better tracking of which config changes actually need to cause process
restarts by ARM.
- handle gnunet-arm -k in combination with auto-start magic (what is the
right thing here?)
Modified: gnunet/src/block/Makefile.am
===================================================================
--- gnunet/src/block/Makefile.am 2011-11-22 10:29:55 UTC (rev 18251)
+++ gnunet/src/block/Makefile.am 2011-11-22 11:53:26 UTC (rev 18252)
@@ -13,42 +13,10 @@
lib_LTLIBRARIES = libgnunetblock.la
plugin_LTLIBRARIES = \
- libgnunet_plugin_block_dht.la \
- libgnunet_plugin_block_fs.la \
libgnunet_plugin_block_template.la \
- libgnunet_plugin_block_dns.la \
libgnunet_plugin_block_test.la
-libgnunet_plugin_block_dht_la_SOURCES = \
- plugin_block_dht.c
-libgnunet_plugin_block_dht_la_LIBADD = \
- $(top_builddir)/src/hello/libgnunethello.la \
- $(top_builddir)/src/block/libgnunetblock.la \
- $(top_builddir)/src/util/libgnunetutil.la
-libgnunet_plugin_block_dht_la_LDFLAGS = \
- $(GN_PLUGIN_LDFLAGS)
-libgnunet_plugin_block_dht_la_DEPENDENCIES = \
- libgnunetblock.la
-
-libgnunet_plugin_block_fs_la_SOURCES = \
- plugin_block_fs.c
-libgnunet_plugin_block_fs_la_LIBADD = \
- $(top_builddir)/src/block/libgnunetblock.la \
- $(top_builddir)/src/util/libgnunetutil.la
-libgnunet_plugin_block_fs_la_LDFLAGS = \
- $(GN_PLUGIN_LDFLAGS)
-libgnunet_plugin_block_fs_la_DEPENDENCIES = \
- libgnunetblock.la
-
-
-libgnunet_plugin_block_dns_la_SOURCES = \
- plugin_block_dns.c
-libgnunet_plugin_block_dns_la_LIBADD = \
- $(top_builddir)/src/util/libgnunetutil.la
-libgnunet_plugin_block_dns_la_LDFLAGS = \
- $(GN_PLUGIN_LDFLAGS)
-
libgnunet_plugin_block_template_la_SOURCES = \
plugin_block_template.c
libgnunet_plugin_block_template_la_LIBADD = \
Deleted: gnunet/src/block/plugin_block_dht.c
===================================================================
--- gnunet/src/block/plugin_block_dht.c 2011-11-22 10:29:55 UTC (rev 18251)
+++ gnunet/src/block/plugin_block_dht.c 2011-11-22 11:53:26 UTC (rev 18252)
@@ -1,181 +0,0 @@
-/*
- This file is part of GNUnet
- (C) 2010 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
- by the Free Software Foundation; either version 3, or (at your
- option) any later version.
-
- GNUnet is distributed in the hope that it will be useful, but
- WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with GNUnet; see the file COPYING. If not, write to the
- Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- Boston, MA 02111-1307, USA.
-*/
-
-/**
- * @file block/plugin_block_dht.c
- * @brief block plugin for DHT internals (right now, find-peer requests only);
- * other plugins should be used to store "useful" data in the
- * DHT (see fs block plugin)
- * @author Christian Grothoff
- */
-
-#include "platform.h"
-#include "gnunet_constants.h"
-#include "gnunet_hello_lib.h"
-#include "gnunet_block_plugin.h"
-
-#define DEBUG_DHT GNUNET_EXTRA_LOGGING
-
-
-/**
- * Function called to validate a reply or a request. For
- * request evaluation, simply pass "NULL" for the reply_block.
- *
- * @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 extended query data (can be NULL, depending on type)
- * @param xquery_size number of bytes in xquery
- * @param reply_block response to validate
- * @param reply_block_size number of bytes in reply block
- * @return characterization of result
- */
-static enum GNUNET_BLOCK_EvaluationResult
-block_plugin_dht_evaluate (void *cls, enum GNUNET_BLOCK_Type type,
- const 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)
-{
- GNUNET_HashCode mhash;
- const struct GNUNET_HELLO_Message *hello;
- struct GNUNET_PeerIdentity pid;
- const struct GNUNET_MessageHeader *msg;
-
- if (type != GNUNET_BLOCK_TYPE_DHT_HELLO)
- return GNUNET_BLOCK_EVALUATION_TYPE_NOT_SUPPORTED;
- if (xquery_size != 0)
- return GNUNET_BLOCK_EVALUATION_REQUEST_INVALID;
- if (reply_block_size == 0)
- return GNUNET_BLOCK_EVALUATION_REQUEST_VALID;
- if (reply_block_size < sizeof (struct GNUNET_MessageHeader))
- return GNUNET_BLOCK_EVALUATION_RESULT_INVALID;
- msg = reply_block;
- if (reply_block_size != ntohs (msg->size))
- return GNUNET_BLOCK_EVALUATION_RESULT_INVALID;
- hello = reply_block;
- if (GNUNET_OK != GNUNET_HELLO_get_id (hello, &pid))
- return GNUNET_BLOCK_EVALUATION_RESULT_INVALID;
- if (NULL != bf)
- {
- GNUNET_BLOCK_mingle_hash (&pid.hashPubKey, 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,
- GNUNET_CONSTANTS_BLOOMFILTER_K);
- }
- GNUNET_CONTAINER_bloomfilter_add (*bf, &mhash);
- }
- return GNUNET_BLOCK_EVALUATION_OK_MORE;
-}
-
-
-/**
- * Function called to obtain the key for a block.
- *
- * @param cls closure
- * @param type block type
- * @param block block to get the key for
- * @param block_size number of bytes in block
- * @param key set to the key (query) for the given block
- * @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_dht_get_key (void *cls, enum GNUNET_BLOCK_Type type,
- const void *block, size_t block_size,
- GNUNET_HashCode * key)
-{
- const struct GNUNET_MessageHeader *msg;
- const struct GNUNET_HELLO_Message *hello;
- struct GNUNET_PeerIdentity *pid;
-
- if (type != GNUNET_BLOCK_TYPE_DHT_HELLO)
- return GNUNET_SYSERR;
- if (block_size < sizeof (struct GNUNET_MessageHeader))
- {
- GNUNET_log_from (GNUNET_ERROR_TYPE_ERROR, "block-dht",
- _("Block not of type %u\n"), GNUNET_BLOCK_TYPE_DHT_HELLO);
- return GNUNET_NO;
- }
- msg = block;
- if (block_size != ntohs (msg->size))
- {
- GNUNET_log_from (GNUNET_ERROR_TYPE_ERROR, "block-dht",
- _("Size mismatch for block\n"),
- GNUNET_BLOCK_TYPE_DHT_HELLO);
- return GNUNET_NO;
- }
- hello = block;
- pid = (struct GNUNET_PeerIdentity *) key;
- if (GNUNET_OK != GNUNET_HELLO_get_id (hello, pid))
- {
- GNUNET_log_from (GNUNET_ERROR_TYPE_ERROR, "block-dht",
- _("Block of type %u is malformed\n"),
- GNUNET_BLOCK_TYPE_DHT_HELLO);
- return GNUNET_NO;
- }
- return GNUNET_OK;
-}
-
-
-/**
- * Entry point for the plugin.
- */
-void *
-libgnunet_plugin_block_dht_init (void *cls)
-{
- static enum GNUNET_BLOCK_Type types[] =
- {
- GNUNET_BLOCK_TYPE_DHT_HELLO,
- GNUNET_BLOCK_TYPE_ANY /* end of list */
- };
- struct GNUNET_BLOCK_PluginFunctions *api;
-
- api = GNUNET_malloc (sizeof (struct GNUNET_BLOCK_PluginFunctions));
- api->evaluate = &block_plugin_dht_evaluate;
- api->get_key = &block_plugin_dht_get_key;
- api->types = types;
- return api;
-}
-
-
-/**
- * Exit point from the plugin.
- */
-void *
-libgnunet_plugin_block_dht_done (void *cls)
-{
- struct GNUNET_TRANSPORT_PluginFunctions *api = cls;
-
- GNUNET_free (api);
- return NULL;
-}
-
-/* end of plugin_block_dht.c */
Deleted: gnunet/src/block/plugin_block_dns.c
===================================================================
--- gnunet/src/block/plugin_block_dns.c 2011-11-22 10:29:55 UTC (rev 18251)
+++ gnunet/src/block/plugin_block_dns.c 2011-11-22 11:53:26 UTC (rev 18252)
@@ -1,170 +0,0 @@
-/*
- This file is part of GNUnet
- (C) 2010 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
- by the Free Software Foundation; either version 3, or (at your
- option) any later version.
-
- GNUnet is distributed in the hope that it will be useful, but
- WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with GNUnet; see the file COPYING. If not, write to the
- Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- Boston, MA 02111-1307, USA.
-*/
-
-/**
- * @file block/plugin_block_dns.c
- * @brief block plugin for storing .gnunet-bindings
- * @author Philipp Tölke
- */
-
-#include "platform.h"
-#include "gnunet_block_plugin.h"
-#include "block_dns.h"
-#include "gnunet_signatures.h"
-
-#define DEBUG_DHT GNUNET_EXTRA_LOGGING
-
-/**
- * Function called to validate a reply or a request. For
- * request evaluation, simply pass "NULL" for the reply_block.
- *
- * @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 extended query data (can be NULL, depending on type)
- * @param xquery_size number of bytes in xquery
- * @param reply_block response to validate
- * @param reply_block_size number of bytes in reply block
- * @return characterization of result
- */
-static enum GNUNET_BLOCK_EvaluationResult
-block_plugin_dns_evaluate (void *cls, enum GNUNET_BLOCK_Type type,
- const 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)
-{
- switch (type)
- {
- 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;
-
- if (reply_block_size != sizeof (struct GNUNET_DNS_Record))
- {
- GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
- "DNS-Block is invalid: reply_block_size=%d != %d\n",
- reply_block_size, sizeof (struct GNUNET_DNS_Record));
- return GNUNET_BLOCK_EVALUATION_RESULT_INVALID;
- }
-
- const struct GNUNET_DNS_Record *rec = reply_block;
-
- if (ntohl (rec->purpose.size) !=
- sizeof (struct GNUNET_DNS_Record) -
- sizeof (struct GNUNET_CRYPTO_RsaSignature))
- {
- GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
- "DNS-Block is invalid: rec->purpose.size=%d != %d\n",
- ntohl (rec->purpose.size),
- sizeof (struct GNUNET_DNS_Record) -
- sizeof (struct GNUNET_CRYPTO_RsaSignature));
- return GNUNET_BLOCK_EVALUATION_RESULT_INVALID;
- }
-
- if (GNUNET_TIME_relative_get_zero ().rel_value ==
- GNUNET_TIME_absolute_get_remaining (GNUNET_TIME_absolute_ntoh
- (rec->expiration_time)).rel_value)
- {
- GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "DNS-Block is invalid: Timeout\n");
- return GNUNET_BLOCK_EVALUATION_RESULT_INVALID;
- }
-
- if (GNUNET_OK !=
- GNUNET_CRYPTO_rsa_verify (htonl (GNUNET_SIGNATURE_PURPOSE_DNS_RECORD),
- &rec->purpose, &rec->signature, &rec->peer))
- {
- GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
- "DNS-Block is invalid: invalid signature\n");
- 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;
- }
-}
-
-
-/**
- * Function called to obtain the key for a block.
- *
- * @param cls closure
- * @param type block type
- * @param block block to get the key for
- * @param block_size number of bytes in block
- * @param key set to the key (query) for the given block
- * @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_dns_get_key (void *cls, enum GNUNET_BLOCK_Type type,
- const void *block, size_t block_size,
- GNUNET_HashCode * key)
-{
- if (type != GNUNET_BLOCK_TYPE_DNS)
- return GNUNET_SYSERR;
- const struct GNUNET_DNS_Record *rec = block;
-
- memcpy (key, &rec->service_descriptor, sizeof (GNUNET_HashCode));
- return GNUNET_OK;
-}
-
-/**
- * Entry point for the plugin.
- */
-void *
-libgnunet_plugin_block_dns_init (void *cls)
-{
- static enum GNUNET_BLOCK_Type types[] =
- {
- GNUNET_BLOCK_TYPE_DNS,
- GNUNET_BLOCK_TYPE_ANY /* end of list */
- };
- struct GNUNET_BLOCK_PluginFunctions *api;
-
- api = GNUNET_malloc (sizeof (struct GNUNET_BLOCK_PluginFunctions));
- api->evaluate = &block_plugin_dns_evaluate;
- api->get_key = &block_plugin_dns_get_key;
- api->types = types;
- return api;
-}
-
-
-/**
- * Exit point from the plugin.
- */
-void *
-libgnunet_plugin_block_dns_done (void *cls)
-{
- struct GNUNET_TRANSPORT_PluginFunctions *api = cls;
-
- GNUNET_free (api);
- return NULL;
-}
-
-/* end of plugin_block_dns.c */
Deleted: gnunet/src/block/plugin_block_fs.c
===================================================================
--- gnunet/src/block/plugin_block_fs.c 2011-11-22 10:29:55 UTC (rev 18251)
+++ gnunet/src/block/plugin_block_fs.c 2011-11-22 11:53:26 UTC (rev 18252)
@@ -1,322 +0,0 @@
-/*
- This file is part of GNUnet
- (C) 2010 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
- by the Free Software Foundation; either version 3, or (at your
- option) any later version.
-
- GNUnet is distributed in the hope that it will be useful, but
- WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with GNUnet; see the file COPYING. If not, write to the
- Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- Boston, MA 02111-1307, USA.
-*/
-
-/**
- * @file block/plugin_block_fs.c
- * @brief blocks used for file-sharing
- * @author Christian Grothoff
- */
-
-#include "platform.h"
-#include "gnunet_block_plugin.h"
-#include "block_fs.h"
-#include "gnunet_signatures.h"
-
-#define DEBUG_FS_BLOCK GNUNET_EXTRA_LOGGING
-
-/**
- * Number of bits we set per entry in the bloomfilter.
- * Do not change!
- */
-#define BLOOMFILTER_K 16
-
-/**
- * Function called to validate a reply or a request. For
- * request evaluation, simply pass "NULL" for the reply_block.
- * Note that it is assumed that the reply has already been
- * matched to the key (and signatures checked) as it would
- * be done with the "get_key" function.
- *
- * @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 reply_block response to validate
- * @param reply_block_size number of bytes in reply block
- * @return characterization of result
- */
-static enum GNUNET_BLOCK_EvaluationResult
-block_plugin_fs_evaluate (void *cls, enum GNUNET_BLOCK_Type type,
- const 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 SBlock *sb;
- GNUNET_HashCode chash;
- GNUNET_HashCode mhash;
- const GNUNET_HashCode *nsid;
- GNUNET_HashCode sh;
-
- switch (type)
- {
- case GNUNET_BLOCK_TYPE_FS_DBLOCK:
- case GNUNET_BLOCK_TYPE_FS_IBLOCK:
- if (xquery_size != 0)
- {
- GNUNET_break_op (0);
- return GNUNET_BLOCK_EVALUATION_REQUEST_INVALID;
- }
- if (reply_block == NULL)
- return GNUNET_BLOCK_EVALUATION_REQUEST_VALID;
- return GNUNET_BLOCK_EVALUATION_OK_LAST;
- case GNUNET_BLOCK_TYPE_FS_KBLOCK:
- case GNUNET_BLOCK_TYPE_FS_NBLOCK:
- if (xquery_size != 0)
- {
- GNUNET_break_op (0);
- return GNUNET_BLOCK_EVALUATION_REQUEST_INVALID;
- }
- if (reply_block == NULL)
- return GNUNET_BLOCK_EVALUATION_REQUEST_VALID;
- 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_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);
- }
- return GNUNET_BLOCK_EVALUATION_OK_MORE;
- case GNUNET_BLOCK_TYPE_FS_SBLOCK:
- if (xquery_size != sizeof (GNUNET_HashCode))
- {
- GNUNET_break_op (0);
- return GNUNET_BLOCK_EVALUATION_REQUEST_INVALID;
- }
- if (reply_block == NULL)
- return GNUNET_BLOCK_EVALUATION_REQUEST_VALID;
- nsid = xquery;
- if (reply_block_size < sizeof (struct SBlock))
- {
- GNUNET_break_op (0);
- return GNUNET_BLOCK_EVALUATION_RESULT_INVALID;
- }
- sb = reply_block;
- GNUNET_CRYPTO_hash (&sb->subspace,
- sizeof (struct
GNUNET_CRYPTO_RsaPublicKeyBinaryEncoded),
- &sh);
- if (0 != memcmp (nsid, &sh, sizeof (GNUNET_HashCode)))
- {
- GNUNET_log_from (GNUNET_ERROR_TYPE_WARNING, "block-fs",
- _
- ("Reply mismatched in terms of namespace.
Discarded.\n"));
- 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_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);
- }
- return GNUNET_BLOCK_EVALUATION_OK_MORE;
- default:
- return GNUNET_BLOCK_EVALUATION_TYPE_NOT_SUPPORTED;
- }
-}
-
-
-/**
- * Function called to obtain the key for a block.
- *
- * @param cls closure
- * @param type block type
- * @param block block to get the key for
- * @param block_size number of bytes in block
- * @param key set to the key (query) for the given block
- * @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_fs_get_key (void *cls, enum GNUNET_BLOCK_Type type,
- const void *block, size_t block_size,
- GNUNET_HashCode * key)
-{
- const struct KBlock *kb;
- const struct SBlock *sb;
- const struct NBlock *nb;
-
- switch (type)
- {
- case GNUNET_BLOCK_TYPE_FS_DBLOCK:
- case GNUNET_BLOCK_TYPE_FS_IBLOCK:
- GNUNET_CRYPTO_hash (block, block_size, key);
- return GNUNET_OK;
- case GNUNET_BLOCK_TYPE_FS_KBLOCK:
- if (block_size < sizeof (struct KBlock))
- {
- GNUNET_break_op (0);
- return GNUNET_NO;
- }
- kb = block;
- if (block_size - sizeof (struct KBlock) !=
- ntohl (kb->purpose.size) -
- sizeof (struct GNUNET_CRYPTO_RsaSignaturePurpose) -
- sizeof (struct GNUNET_CRYPTO_RsaPublicKeyBinaryEncoded))
- {
- GNUNET_break_op (0);
- return GNUNET_NO;
- }
- if (GNUNET_OK !=
- GNUNET_CRYPTO_rsa_verify (GNUNET_SIGNATURE_PURPOSE_FS_KBLOCK,
- &kb->purpose, &kb->signature, &kb->keyspace))
- {
- GNUNET_break_op (0);
- return GNUNET_NO;
- }
- if (key != NULL)
- GNUNET_CRYPTO_hash (&kb->keyspace,
- sizeof (struct
- GNUNET_CRYPTO_RsaPublicKeyBinaryEncoded),
- key);
- return GNUNET_OK;
- case GNUNET_BLOCK_TYPE_FS_SBLOCK:
- if (block_size < sizeof (struct SBlock))
- {
- GNUNET_break_op (0);
- return GNUNET_NO;
- }
- sb = block;
- if (block_size !=
- ntohl (sb->purpose.size) + sizeof (struct GNUNET_CRYPTO_RsaSignature))
- {
- GNUNET_break_op (0);
- return GNUNET_NO;
- }
- if (GNUNET_OK !=
- GNUNET_CRYPTO_rsa_verify (GNUNET_SIGNATURE_PURPOSE_FS_SBLOCK,
- &sb->purpose, &sb->signature, &sb->subspace))
- {
- GNUNET_break_op (0);
- return GNUNET_NO;
- }
- if (key != NULL)
- *key = sb->identifier;
- return GNUNET_OK;
- case GNUNET_BLOCK_TYPE_FS_NBLOCK:
- if (block_size < sizeof (struct NBlock))
- {
- GNUNET_break_op (0);
- return GNUNET_NO;
- }
- nb = block;
- if (block_size - sizeof (struct NBlock) !=
- ntohl (nb->ns_purpose.size) -
- sizeof (struct GNUNET_CRYPTO_RsaSignaturePurpose) -
- sizeof (struct GNUNET_CRYPTO_RsaPublicKeyBinaryEncoded))
- {
- GNUNET_break_op (0);
- return GNUNET_NO;
- }
- if (block_size !=
- ntohl (nb->ksk_purpose.size) +
- sizeof (struct GNUNET_CRYPTO_RsaSignature))
- {
- GNUNET_break_op (0);
- return GNUNET_NO;
- }
- if (GNUNET_OK !=
- GNUNET_CRYPTO_rsa_verify (GNUNET_SIGNATURE_PURPOSE_FS_NBLOCK_KSIG,
- &nb->ksk_purpose, &nb->ksk_signature,
- &nb->keyspace))
- {
- GNUNET_break_op (0);
- return GNUNET_NO;
- }
- if (GNUNET_OK !=
- GNUNET_CRYPTO_rsa_verify (GNUNET_SIGNATURE_PURPOSE_FS_NBLOCK,
- &nb->ns_purpose, &nb->ns_signature,
- &nb->subspace))
- {
- GNUNET_break_op (0);
- return GNUNET_NO;
- }
- /* FIXME: we used to xor ID with NSID,
- * why not here? */
- if (key != NULL)
- GNUNET_CRYPTO_hash (&nb->keyspace,
- sizeof (struct
- GNUNET_CRYPTO_RsaPublicKeyBinaryEncoded),
- key);
- return GNUNET_OK;
- default:
- return GNUNET_SYSERR;
- }
-}
-
-
-/**
- * Entry point for the plugin.
- */
-void *
-libgnunet_plugin_block_fs_init (void *cls)
-{
- static enum GNUNET_BLOCK_Type types[] =
- {
- GNUNET_BLOCK_TYPE_FS_DBLOCK,
- GNUNET_BLOCK_TYPE_FS_IBLOCK,
- GNUNET_BLOCK_TYPE_FS_KBLOCK,
- GNUNET_BLOCK_TYPE_FS_SBLOCK,
- GNUNET_BLOCK_TYPE_FS_NBLOCK,
- GNUNET_BLOCK_TYPE_ANY /* end of list */
- };
- struct GNUNET_BLOCK_PluginFunctions *api;
-
- api = GNUNET_malloc (sizeof (struct GNUNET_BLOCK_PluginFunctions));
- api->evaluate = &block_plugin_fs_evaluate;
- api->get_key = &block_plugin_fs_get_key;
- api->types = types;
- return api;
-}
-
-
-/**
- * Exit point from the plugin.
- */
-void *
-libgnunet_plugin_block_fs_done (void *cls)
-{
- struct GNUNET_TRANSPORT_PluginFunctions *api = cls;
-
- GNUNET_free (api);
- return NULL;
-}
-
-/* end of plugin_block_fs.c */
Modified: gnunet/src/dht/Makefile.am
===================================================================
--- gnunet/src/dht/Makefile.am 2011-11-22 10:29:55 UTC (rev 18251)
+++ gnunet/src/dht/Makefile.am 2011-11-22 11:53:26 UTC (rev 18252)
@@ -22,7 +22,6 @@
lib_LTLIBRARIES = \
libgnunetdht.la
-
libgnunetdht_la_SOURCES = \
dht_api.c dht.h
libgnunetdht_la_LIBADD = \
@@ -32,6 +31,23 @@
$(GN_LIB_LDFLAGS) $(WINFLAGS) \
-version-info 0:0:0
+
+plugin_LTLIBRARIES = \
+ libgnunet_plugin_block_dht.la
+
+libgnunet_plugin_block_dht_la_SOURCES = \
+ plugin_block_dht.c
+libgnunet_plugin_block_dht_la_LIBADD = \
+ $(top_builddir)/src/hello/libgnunethello.la \
+ $(top_builddir)/src/block/libgnunetblock.la \
+ $(top_builddir)/src/util/libgnunetutil.la
+libgnunet_plugin_block_dht_la_LDFLAGS = \
+ $(GN_PLUGIN_LDFLAGS)
+libgnunet_plugin_block_dht_la_DEPENDENCIES = \
+ $(top_builddir)/src/block/libgnunetblock.la
+
+
+
bin_PROGRAMS = \
gnunet-service-dht \
gnunet-dht-get \
Copied: gnunet/src/dht/plugin_block_dht.c (from rev 18244,
gnunet/src/block/plugin_block_dht.c)
===================================================================
--- gnunet/src/dht/plugin_block_dht.c (rev 0)
+++ gnunet/src/dht/plugin_block_dht.c 2011-11-22 11:53:26 UTC (rev 18252)
@@ -0,0 +1,181 @@
+/*
+ This file is part of GNUnet
+ (C) 2010 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
+ by the Free Software Foundation; either version 3, or (at your
+ option) any later version.
+
+ GNUnet is distributed in the hope that it will be useful, but
+ WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with GNUnet; see the file COPYING. If not, write to the
+ Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ Boston, MA 02111-1307, USA.
+*/
+
+/**
+ * @file block/plugin_block_dht.c
+ * @brief block plugin for DHT internals (right now, find-peer requests only);
+ * other plugins should be used to store "useful" data in the
+ * DHT (see fs block plugin)
+ * @author Christian Grothoff
+ */
+
+#include "platform.h"
+#include "gnunet_constants.h"
+#include "gnunet_hello_lib.h"
+#include "gnunet_block_plugin.h"
+
+#define DEBUG_DHT GNUNET_EXTRA_LOGGING
+
+
+/**
+ * Function called to validate a reply or a request. For
+ * request evaluation, simply pass "NULL" for the reply_block.
+ *
+ * @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 extended query data (can be NULL, depending on type)
+ * @param xquery_size number of bytes in xquery
+ * @param reply_block response to validate
+ * @param reply_block_size number of bytes in reply block
+ * @return characterization of result
+ */
+static enum GNUNET_BLOCK_EvaluationResult
+block_plugin_dht_evaluate (void *cls, enum GNUNET_BLOCK_Type type,
+ const 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)
+{
+ GNUNET_HashCode mhash;
+ const struct GNUNET_HELLO_Message *hello;
+ struct GNUNET_PeerIdentity pid;
+ const struct GNUNET_MessageHeader *msg;
+
+ if (type != GNUNET_BLOCK_TYPE_DHT_HELLO)
+ return GNUNET_BLOCK_EVALUATION_TYPE_NOT_SUPPORTED;
+ if (xquery_size != 0)
+ return GNUNET_BLOCK_EVALUATION_REQUEST_INVALID;
+ if (reply_block_size == 0)
+ return GNUNET_BLOCK_EVALUATION_REQUEST_VALID;
+ if (reply_block_size < sizeof (struct GNUNET_MessageHeader))
+ return GNUNET_BLOCK_EVALUATION_RESULT_INVALID;
+ msg = reply_block;
+ if (reply_block_size != ntohs (msg->size))
+ return GNUNET_BLOCK_EVALUATION_RESULT_INVALID;
+ hello = reply_block;
+ if (GNUNET_OK != GNUNET_HELLO_get_id (hello, &pid))
+ return GNUNET_BLOCK_EVALUATION_RESULT_INVALID;
+ if (NULL != bf)
+ {
+ GNUNET_BLOCK_mingle_hash (&pid.hashPubKey, 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,
+ GNUNET_CONSTANTS_BLOOMFILTER_K);
+ }
+ GNUNET_CONTAINER_bloomfilter_add (*bf, &mhash);
+ }
+ return GNUNET_BLOCK_EVALUATION_OK_MORE;
+}
+
+
+/**
+ * Function called to obtain the key for a block.
+ *
+ * @param cls closure
+ * @param type block type
+ * @param block block to get the key for
+ * @param block_size number of bytes in block
+ * @param key set to the key (query) for the given block
+ * @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_dht_get_key (void *cls, enum GNUNET_BLOCK_Type type,
+ const void *block, size_t block_size,
+ GNUNET_HashCode * key)
+{
+ const struct GNUNET_MessageHeader *msg;
+ const struct GNUNET_HELLO_Message *hello;
+ struct GNUNET_PeerIdentity *pid;
+
+ if (type != GNUNET_BLOCK_TYPE_DHT_HELLO)
+ return GNUNET_SYSERR;
+ if (block_size < sizeof (struct GNUNET_MessageHeader))
+ {
+ GNUNET_log_from (GNUNET_ERROR_TYPE_ERROR, "block-dht",
+ _("Block not of type %u\n"), GNUNET_BLOCK_TYPE_DHT_HELLO);
+ return GNUNET_NO;
+ }
+ msg = block;
+ if (block_size != ntohs (msg->size))
+ {
+ GNUNET_log_from (GNUNET_ERROR_TYPE_ERROR, "block-dht",
+ _("Size mismatch for block\n"),
+ GNUNET_BLOCK_TYPE_DHT_HELLO);
+ return GNUNET_NO;
+ }
+ hello = block;
+ pid = (struct GNUNET_PeerIdentity *) key;
+ if (GNUNET_OK != GNUNET_HELLO_get_id (hello, pid))
+ {
+ GNUNET_log_from (GNUNET_ERROR_TYPE_ERROR, "block-dht",
+ _("Block of type %u is malformed\n"),
+ GNUNET_BLOCK_TYPE_DHT_HELLO);
+ return GNUNET_NO;
+ }
+ return GNUNET_OK;
+}
+
+
+/**
+ * Entry point for the plugin.
+ */
+void *
+libgnunet_plugin_block_dht_init (void *cls)
+{
+ static enum GNUNET_BLOCK_Type types[] =
+ {
+ GNUNET_BLOCK_TYPE_DHT_HELLO,
+ GNUNET_BLOCK_TYPE_ANY /* end of list */
+ };
+ struct GNUNET_BLOCK_PluginFunctions *api;
+
+ api = GNUNET_malloc (sizeof (struct GNUNET_BLOCK_PluginFunctions));
+ api->evaluate = &block_plugin_dht_evaluate;
+ api->get_key = &block_plugin_dht_get_key;
+ api->types = types;
+ return api;
+}
+
+
+/**
+ * Exit point from the plugin.
+ */
+void *
+libgnunet_plugin_block_dht_done (void *cls)
+{
+ struct GNUNET_TRANSPORT_PluginFunctions *api = cls;
+
+ GNUNET_free (api);
+ return NULL;
+}
+
+/* end of plugin_block_dht.c */
Modified: gnunet/src/fs/Makefile.am
===================================================================
--- gnunet/src/fs/Makefile.am 2011-11-22 10:29:55 UTC (rev 18251)
+++ gnunet/src/fs/Makefile.am 2011-11-22 11:53:26 UTC (rev 18252)
@@ -14,9 +14,14 @@
dist_pkgcfg_DATA = \
fs.conf
+plugindir = $(libdir)/gnunet
+
lib_LTLIBRARIES = libgnunetfs.la
+plugin_LTLIBRARIES = \
+ libgnunet_plugin_block_fs.la
+
noinst_LIBRARIES = libgnunetfstest.a
libgnunetfs_la_SOURCES = \
@@ -151,6 +156,19 @@
gnunet_unindex_DEPENDENCIES = \
libgnunetfs.la
+
+libgnunet_plugin_block_fs_la_SOURCES = \
+ plugin_block_fs.c
+libgnunet_plugin_block_fs_la_LIBADD = \
+ $(top_builddir)/src/block/libgnunetblock.la \
+ $(top_builddir)/src/util/libgnunetutil.la
+libgnunet_plugin_block_fs_la_LDFLAGS = \
+ $(GN_PLUGIN_LDFLAGS)
+libgnunet_plugin_block_fs_la_DEPENDENCIES = \
+ $(top_builddir)/src/block/libgnunetblock.la
+
+
+
if HAVE_BENCHMARKS
FS_BENCHMARKS = \
perf_gnunet_service_fs_p2p \
Copied: gnunet/src/fs/plugin_block_fs.c (from rev 18244,
gnunet/src/block/plugin_block_fs.c)
===================================================================
--- gnunet/src/fs/plugin_block_fs.c (rev 0)
+++ gnunet/src/fs/plugin_block_fs.c 2011-11-22 11:53:26 UTC (rev 18252)
@@ -0,0 +1,322 @@
+/*
+ This file is part of GNUnet
+ (C) 2010 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
+ by the Free Software Foundation; either version 3, or (at your
+ option) any later version.
+
+ GNUnet is distributed in the hope that it will be useful, but
+ WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with GNUnet; see the file COPYING. If not, write to the
+ Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ Boston, MA 02111-1307, USA.
+*/
+
+/**
+ * @file block/plugin_block_fs.c
+ * @brief blocks used for file-sharing
+ * @author Christian Grothoff
+ */
+
+#include "platform.h"
+#include "gnunet_block_plugin.h"
+#include "block_fs.h"
+#include "gnunet_signatures.h"
+
+#define DEBUG_FS_BLOCK GNUNET_EXTRA_LOGGING
+
+/**
+ * Number of bits we set per entry in the bloomfilter.
+ * Do not change!
+ */
+#define BLOOMFILTER_K 16
+
+/**
+ * Function called to validate a reply or a request. For
+ * request evaluation, simply pass "NULL" for the reply_block.
+ * Note that it is assumed that the reply has already been
+ * matched to the key (and signatures checked) as it would
+ * be done with the "get_key" function.
+ *
+ * @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 reply_block response to validate
+ * @param reply_block_size number of bytes in reply block
+ * @return characterization of result
+ */
+static enum GNUNET_BLOCK_EvaluationResult
+block_plugin_fs_evaluate (void *cls, enum GNUNET_BLOCK_Type type,
+ const 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 SBlock *sb;
+ GNUNET_HashCode chash;
+ GNUNET_HashCode mhash;
+ const GNUNET_HashCode *nsid;
+ GNUNET_HashCode sh;
+
+ switch (type)
+ {
+ case GNUNET_BLOCK_TYPE_FS_DBLOCK:
+ case GNUNET_BLOCK_TYPE_FS_IBLOCK:
+ if (xquery_size != 0)
+ {
+ GNUNET_break_op (0);
+ return GNUNET_BLOCK_EVALUATION_REQUEST_INVALID;
+ }
+ if (reply_block == NULL)
+ return GNUNET_BLOCK_EVALUATION_REQUEST_VALID;
+ return GNUNET_BLOCK_EVALUATION_OK_LAST;
+ case GNUNET_BLOCK_TYPE_FS_KBLOCK:
+ case GNUNET_BLOCK_TYPE_FS_NBLOCK:
+ if (xquery_size != 0)
+ {
+ GNUNET_break_op (0);
+ return GNUNET_BLOCK_EVALUATION_REQUEST_INVALID;
+ }
+ if (reply_block == NULL)
+ return GNUNET_BLOCK_EVALUATION_REQUEST_VALID;
+ 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_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);
+ }
+ return GNUNET_BLOCK_EVALUATION_OK_MORE;
+ case GNUNET_BLOCK_TYPE_FS_SBLOCK:
+ if (xquery_size != sizeof (GNUNET_HashCode))
+ {
+ GNUNET_break_op (0);
+ return GNUNET_BLOCK_EVALUATION_REQUEST_INVALID;
+ }
+ if (reply_block == NULL)
+ return GNUNET_BLOCK_EVALUATION_REQUEST_VALID;
+ nsid = xquery;
+ if (reply_block_size < sizeof (struct SBlock))
+ {
+ GNUNET_break_op (0);
+ return GNUNET_BLOCK_EVALUATION_RESULT_INVALID;
+ }
+ sb = reply_block;
+ GNUNET_CRYPTO_hash (&sb->subspace,
+ sizeof (struct
GNUNET_CRYPTO_RsaPublicKeyBinaryEncoded),
+ &sh);
+ if (0 != memcmp (nsid, &sh, sizeof (GNUNET_HashCode)))
+ {
+ GNUNET_log_from (GNUNET_ERROR_TYPE_WARNING, "block-fs",
+ _
+ ("Reply mismatched in terms of namespace.
Discarded.\n"));
+ 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_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);
+ }
+ return GNUNET_BLOCK_EVALUATION_OK_MORE;
+ default:
+ return GNUNET_BLOCK_EVALUATION_TYPE_NOT_SUPPORTED;
+ }
+}
+
+
+/**
+ * Function called to obtain the key for a block.
+ *
+ * @param cls closure
+ * @param type block type
+ * @param block block to get the key for
+ * @param block_size number of bytes in block
+ * @param key set to the key (query) for the given block
+ * @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_fs_get_key (void *cls, enum GNUNET_BLOCK_Type type,
+ const void *block, size_t block_size,
+ GNUNET_HashCode * key)
+{
+ const struct KBlock *kb;
+ const struct SBlock *sb;
+ const struct NBlock *nb;
+
+ switch (type)
+ {
+ case GNUNET_BLOCK_TYPE_FS_DBLOCK:
+ case GNUNET_BLOCK_TYPE_FS_IBLOCK:
+ GNUNET_CRYPTO_hash (block, block_size, key);
+ return GNUNET_OK;
+ case GNUNET_BLOCK_TYPE_FS_KBLOCK:
+ if (block_size < sizeof (struct KBlock))
+ {
+ GNUNET_break_op (0);
+ return GNUNET_NO;
+ }
+ kb = block;
+ if (block_size - sizeof (struct KBlock) !=
+ ntohl (kb->purpose.size) -
+ sizeof (struct GNUNET_CRYPTO_RsaSignaturePurpose) -
+ sizeof (struct GNUNET_CRYPTO_RsaPublicKeyBinaryEncoded))
+ {
+ GNUNET_break_op (0);
+ return GNUNET_NO;
+ }
+ if (GNUNET_OK !=
+ GNUNET_CRYPTO_rsa_verify (GNUNET_SIGNATURE_PURPOSE_FS_KBLOCK,
+ &kb->purpose, &kb->signature, &kb->keyspace))
+ {
+ GNUNET_break_op (0);
+ return GNUNET_NO;
+ }
+ if (key != NULL)
+ GNUNET_CRYPTO_hash (&kb->keyspace,
+ sizeof (struct
+ GNUNET_CRYPTO_RsaPublicKeyBinaryEncoded),
+ key);
+ return GNUNET_OK;
+ case GNUNET_BLOCK_TYPE_FS_SBLOCK:
+ if (block_size < sizeof (struct SBlock))
+ {
+ GNUNET_break_op (0);
+ return GNUNET_NO;
+ }
+ sb = block;
+ if (block_size !=
+ ntohl (sb->purpose.size) + sizeof (struct GNUNET_CRYPTO_RsaSignature))
+ {
+ GNUNET_break_op (0);
+ return GNUNET_NO;
+ }
+ if (GNUNET_OK !=
+ GNUNET_CRYPTO_rsa_verify (GNUNET_SIGNATURE_PURPOSE_FS_SBLOCK,
+ &sb->purpose, &sb->signature, &sb->subspace))
+ {
+ GNUNET_break_op (0);
+ return GNUNET_NO;
+ }
+ if (key != NULL)
+ *key = sb->identifier;
+ return GNUNET_OK;
+ case GNUNET_BLOCK_TYPE_FS_NBLOCK:
+ if (block_size < sizeof (struct NBlock))
+ {
+ GNUNET_break_op (0);
+ return GNUNET_NO;
+ }
+ nb = block;
+ if (block_size - sizeof (struct NBlock) !=
+ ntohl (nb->ns_purpose.size) -
+ sizeof (struct GNUNET_CRYPTO_RsaSignaturePurpose) -
+ sizeof (struct GNUNET_CRYPTO_RsaPublicKeyBinaryEncoded))
+ {
+ GNUNET_break_op (0);
+ return GNUNET_NO;
+ }
+ if (block_size !=
+ ntohl (nb->ksk_purpose.size) +
+ sizeof (struct GNUNET_CRYPTO_RsaSignature))
+ {
+ GNUNET_break_op (0);
+ return GNUNET_NO;
+ }
+ if (GNUNET_OK !=
+ GNUNET_CRYPTO_rsa_verify (GNUNET_SIGNATURE_PURPOSE_FS_NBLOCK_KSIG,
+ &nb->ksk_purpose, &nb->ksk_signature,
+ &nb->keyspace))
+ {
+ GNUNET_break_op (0);
+ return GNUNET_NO;
+ }
+ if (GNUNET_OK !=
+ GNUNET_CRYPTO_rsa_verify (GNUNET_SIGNATURE_PURPOSE_FS_NBLOCK,
+ &nb->ns_purpose, &nb->ns_signature,
+ &nb->subspace))
+ {
+ GNUNET_break_op (0);
+ return GNUNET_NO;
+ }
+ /* FIXME: we used to xor ID with NSID,
+ * why not here? */
+ if (key != NULL)
+ GNUNET_CRYPTO_hash (&nb->keyspace,
+ sizeof (struct
+ GNUNET_CRYPTO_RsaPublicKeyBinaryEncoded),
+ key);
+ return GNUNET_OK;
+ default:
+ return GNUNET_SYSERR;
+ }
+}
+
+
+/**
+ * Entry point for the plugin.
+ */
+void *
+libgnunet_plugin_block_fs_init (void *cls)
+{
+ static enum GNUNET_BLOCK_Type types[] =
+ {
+ GNUNET_BLOCK_TYPE_FS_DBLOCK,
+ GNUNET_BLOCK_TYPE_FS_IBLOCK,
+ GNUNET_BLOCK_TYPE_FS_KBLOCK,
+ GNUNET_BLOCK_TYPE_FS_SBLOCK,
+ GNUNET_BLOCK_TYPE_FS_NBLOCK,
+ GNUNET_BLOCK_TYPE_ANY /* end of list */
+ };
+ struct GNUNET_BLOCK_PluginFunctions *api;
+
+ api = GNUNET_malloc (sizeof (struct GNUNET_BLOCK_PluginFunctions));
+ api->evaluate = &block_plugin_fs_evaluate;
+ api->get_key = &block_plugin_fs_get_key;
+ api->types = types;
+ return api;
+}
+
+
+/**
+ * Exit point from the plugin.
+ */
+void *
+libgnunet_plugin_block_fs_done (void *cls)
+{
+ struct GNUNET_TRANSPORT_PluginFunctions *api = cls;
+
+ GNUNET_free (api);
+ return NULL;
+}
+
+/* end of plugin_block_fs.c */
Modified: gnunet/src/vpn/Makefile.am
===================================================================
--- gnunet/src/vpn/Makefile.am 2011-11-22 10:29:55 UTC (rev 18251)
+++ gnunet/src/vpn/Makefile.am 2011-11-22 11:53:26 UTC (rev 18252)
@@ -10,6 +10,8 @@
pkgcfgdir= $(pkgdatadir)/config.d/
+plugindir = $(libdir)/gnunet
+
dist_pkgcfg_DATA = \
vpn.conf
@@ -72,6 +74,18 @@
$(top_builddir)/src/mesh/libgnunetmesh.la \
$(GN_LIBINTL)
+
+plugin_LTLIBRARIES = \
+ libgnunet_plugin_block_dns.la
+
+libgnunet_plugin_block_dns_la_SOURCES = \
+ plugin_block_dns.c
+libgnunet_plugin_block_dns_la_LIBADD = \
+ $(top_builddir)/src/util/libgnunetutil.la
+libgnunet_plugin_block_dns_la_LDFLAGS = \
+ $(top_builddir)/src/block/$(GN_PLUGIN_LDFLAGS)
+
+
#check_PROGRAMS = \
# test_XXX
Copied: gnunet/src/vpn/plugin_block_dns.c (from rev 18244,
gnunet/src/block/plugin_block_dns.c)
===================================================================
--- gnunet/src/vpn/plugin_block_dns.c (rev 0)
+++ gnunet/src/vpn/plugin_block_dns.c 2011-11-22 11:53:26 UTC (rev 18252)
@@ -0,0 +1,170 @@
+/*
+ This file is part of GNUnet
+ (C) 2010 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
+ by the Free Software Foundation; either version 3, or (at your
+ option) any later version.
+
+ GNUnet is distributed in the hope that it will be useful, but
+ WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with GNUnet; see the file COPYING. If not, write to the
+ Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ Boston, MA 02111-1307, USA.
+*/
+
+/**
+ * @file block/plugin_block_dns.c
+ * @brief block plugin for storing .gnunet-bindings
+ * @author Philipp Tölke
+ */
+
+#include "platform.h"
+#include "gnunet_block_plugin.h"
+#include "block_dns.h"
+#include "gnunet_signatures.h"
+
+#define DEBUG_DHT GNUNET_EXTRA_LOGGING
+
+/**
+ * Function called to validate a reply or a request. For
+ * request evaluation, simply pass "NULL" for the reply_block.
+ *
+ * @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 extended query data (can be NULL, depending on type)
+ * @param xquery_size number of bytes in xquery
+ * @param reply_block response to validate
+ * @param reply_block_size number of bytes in reply block
+ * @return characterization of result
+ */
+static enum GNUNET_BLOCK_EvaluationResult
+block_plugin_dns_evaluate (void *cls, enum GNUNET_BLOCK_Type type,
+ const 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)
+{
+ switch (type)
+ {
+ 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;
+
+ if (reply_block_size != sizeof (struct GNUNET_DNS_Record))
+ {
+ GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
+ "DNS-Block is invalid: reply_block_size=%d != %d\n",
+ reply_block_size, sizeof (struct GNUNET_DNS_Record));
+ return GNUNET_BLOCK_EVALUATION_RESULT_INVALID;
+ }
+
+ const struct GNUNET_DNS_Record *rec = reply_block;
+
+ if (ntohl (rec->purpose.size) !=
+ sizeof (struct GNUNET_DNS_Record) -
+ sizeof (struct GNUNET_CRYPTO_RsaSignature))
+ {
+ GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
+ "DNS-Block is invalid: rec->purpose.size=%d != %d\n",
+ ntohl (rec->purpose.size),
+ sizeof (struct GNUNET_DNS_Record) -
+ sizeof (struct GNUNET_CRYPTO_RsaSignature));
+ return GNUNET_BLOCK_EVALUATION_RESULT_INVALID;
+ }
+
+ if (GNUNET_TIME_relative_get_zero ().rel_value ==
+ GNUNET_TIME_absolute_get_remaining (GNUNET_TIME_absolute_ntoh
+ (rec->expiration_time)).rel_value)
+ {
+ GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "DNS-Block is invalid: Timeout\n");
+ return GNUNET_BLOCK_EVALUATION_RESULT_INVALID;
+ }
+
+ if (GNUNET_OK !=
+ GNUNET_CRYPTO_rsa_verify (htonl (GNUNET_SIGNATURE_PURPOSE_DNS_RECORD),
+ &rec->purpose, &rec->signature, &rec->peer))
+ {
+ GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
+ "DNS-Block is invalid: invalid signature\n");
+ 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;
+ }
+}
+
+
+/**
+ * Function called to obtain the key for a block.
+ *
+ * @param cls closure
+ * @param type block type
+ * @param block block to get the key for
+ * @param block_size number of bytes in block
+ * @param key set to the key (query) for the given block
+ * @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_dns_get_key (void *cls, enum GNUNET_BLOCK_Type type,
+ const void *block, size_t block_size,
+ GNUNET_HashCode * key)
+{
+ if (type != GNUNET_BLOCK_TYPE_DNS)
+ return GNUNET_SYSERR;
+ const struct GNUNET_DNS_Record *rec = block;
+
+ memcpy (key, &rec->service_descriptor, sizeof (GNUNET_HashCode));
+ return GNUNET_OK;
+}
+
+/**
+ * Entry point for the plugin.
+ */
+void *
+libgnunet_plugin_block_dns_init (void *cls)
+{
+ static enum GNUNET_BLOCK_Type types[] =
+ {
+ GNUNET_BLOCK_TYPE_DNS,
+ GNUNET_BLOCK_TYPE_ANY /* end of list */
+ };
+ struct GNUNET_BLOCK_PluginFunctions *api;
+
+ api = GNUNET_malloc (sizeof (struct GNUNET_BLOCK_PluginFunctions));
+ api->evaluate = &block_plugin_dns_evaluate;
+ api->get_key = &block_plugin_dns_get_key;
+ api->types = types;
+ return api;
+}
+
+
+/**
+ * Exit point from the plugin.
+ */
+void *
+libgnunet_plugin_block_dns_done (void *cls)
+{
+ struct GNUNET_TRANSPORT_PluginFunctions *api = cls;
+
+ GNUNET_free (api);
+ return NULL;
+}
+
+/* end of plugin_block_dns.c */
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- [GNUnet-SVN] r18252 - in gnunet: . src/block src/dht src/fs src/vpn,
gnunet <=