GNUnet  0.16.x
Macros | Functions
plugin_block_fs.c File Reference

blocks used for file-sharing More...

#include "platform.h"
#include "gnunet_block_plugin.h"
#include "gnunet_fs_service.h"
#include "block_fs.h"
#include "gnunet_signatures.h"
#include "gnunet_block_group_lib.h"
Include dependency graph for plugin_block_fs.c:

Go to the source code of this file.

Macros

#define BLOOMFILTER_K   16
 Number of bits we set per entry in the bloomfilter. More...
 

Functions

static struct GNUNET_BLOCK_Groupblock_plugin_fs_create_group (void *cls, enum GNUNET_BLOCK_Type type, uint32_t nonce, const void *raw_data, size_t raw_data_size, va_list va)
 Create a new block group. More...
 
static enum GNUNET_GenericReturnValue block_plugin_fs_get_key (void *cls, enum GNUNET_BLOCK_Type type, const void *block, size_t block_size, struct GNUNET_HashCode *key)
 Function called to obtain the key for a block. More...
 
static enum GNUNET_GenericReturnValue block_plugin_fs_check_query (void *cls, enum GNUNET_BLOCK_Type type, const struct GNUNET_HashCode *query, const void *xquery, size_t xquery_size)
 Function called to validate a query. More...
 
static enum GNUNET_GenericReturnValue block_plugin_fs_check_block (void *cls, enum GNUNET_BLOCK_Type type, const void *block, size_t block_size)
 Function called to validate a block for storage. More...
 
static enum GNUNET_BLOCK_ReplyEvaluationResult block_plugin_fs_check_reply (void *cls, enum GNUNET_BLOCK_Type type, struct GNUNET_BLOCK_Group *group, const struct GNUNET_HashCode *query, const void *xquery, size_t xquery_size, const void *reply_block, size_t reply_block_size)
 Function called to validate a reply to a request. More...
 
void * libgnunet_plugin_block_fs_init (void *cls)
 Entry point for the plugin. More...
 
void * libgnunet_plugin_block_fs_done (void *cls)
 Exit point from the plugin. More...
 

Detailed Description

blocks used for file-sharing

Author
Christian Grothoff

Definition in file plugin_block_fs.c.

Macro Definition Documentation

◆ BLOOMFILTER_K

#define BLOOMFILTER_K   16

Number of bits we set per entry in the bloomfilter.

Do not change!

Definition at line 38 of file plugin_block_fs.c.

Function Documentation

◆ block_plugin_fs_create_group()

static struct GNUNET_BLOCK_Group* block_plugin_fs_create_group ( void *  cls,
enum GNUNET_BLOCK_Type  type,
uint32_t  nonce,
const void *  raw_data,
size_t  raw_data_size,
va_list  va 
)
static

Create a new block group.

Parameters
ctxblock context in which the block group is created
typetype of the block for which we are creating the group
noncerandom value used to seed the group creation
raw_dataoptional serialized prior state of the group, NULL if unavailable/fresh
raw_data_sizenumber of bytes in raw_data, 0 if unavailable/fresh
vavariable arguments specific to type
Returns
block group handle, NULL if block groups are not supported by this type of block (this is not an error)

Definition at line 54 of file plugin_block_fs.c.

60 {
61  unsigned int size;
62  const char *guard;
63 
64  switch (type)
65  {
67  GNUNET_break (NULL == va_arg (va, const char *));
68  return NULL;
69 
71  GNUNET_break (NULL == va_arg (va, const char *));
72  return NULL;
73 
75  guard = va_arg (va, const char *);
76  if (0 == strcmp (guard,
77  "seen-set-size"))
78  {
80  int),
82  }
83  else if (0 == strcmp (guard,
84  "filter-size"))
85  {
86  size = va_arg (va, unsigned int);
87  }
88  else
89  {
90  /* va-args invalid! bad bug, complain! */
91  GNUNET_break (0);
92  size = 8;
93  }
94  if (0 == size)
95  size = raw_data_size; /* not for us to determine, use what we got! */
96  GNUNET_break (NULL == va_arg (va, const char *));
97  return GNUNET_BLOCK_GROUP_bf_create (cls,
98  size,
100  type,
101  nonce,
102  raw_data,
103  raw_data_size);
104 
105  default:
106  GNUNET_break (NULL == va_arg (va, const char *));
107  GNUNET_break (0);
108  return NULL;
109  }
110 }
@ GNUNET_BLOCK_TYPE_FS_DBLOCK
Data block (leaf) in the CHK tree.
@ GNUNET_BLOCK_TYPE_FS_IBLOCK
Inner block in the CHK tree.
@ GNUNET_BLOCK_TYPE_FS_UBLOCK
Type of a block representing any type of search result (universal).
size_t GNUNET_BLOCK_GROUP_compute_bloomfilter_size(unsigned int entry_count, unsigned int k)
How many bytes should a bloomfilter be if we have already seen entry_count responses?...
Definition: bg_bf.c:250
struct GNUNET_BLOCK_Group * GNUNET_BLOCK_GROUP_bf_create(void *cls, size_t bf_size, unsigned int bf_k, enum GNUNET_BLOCK_Type type, uint32_t nonce, const void *raw_data, size_t raw_data_size)
Create a new block group that filters duplicates using a Bloom filter.
Definition: bg_bf.c:174
#define GNUNET_break(cond)
Use this for internal assertion violations that are not fatal (can be handled) but should not occur.
static unsigned int size
Size of the "table".
Definition: peer.c:67
#define BLOOMFILTER_K
Number of bits we set per entry in the bloomfilter.
enum GNUNET_TESTBED_UnderlayLinkModelType type
the type of this model

Referenced by libgnunet_plugin_block_fs_init().

Here is the caller graph for this function:

◆ block_plugin_fs_get_key()

static enum GNUNET_GenericReturnValue block_plugin_fs_get_key ( void *  cls,
enum GNUNET_BLOCK_Type  type,
const void *  block,
size_t  block_size,
struct GNUNET_HashCode key 
)
static

Function called to obtain the key for a block.

Parameters
clsclosure
typeblock type
blockblock to get the key for
block_sizenumber of bytes in block
keyset to the key (query) for the given block
Returns
GNUNET_OK on success, GNUNET_SYSERR if type not supported (or if extracting a key from a block of this type does not work)

Definition at line 54 of file plugin_block_fs.c.

130 {
131  const struct UBlock *ub;
132 
133  switch (type)
134  {
137  GNUNET_CRYPTO_hash (block,
138  block_size,
139  key);
140  return GNUNET_OK;
142  if (block_size < sizeof(struct UBlock))
143  {
144  GNUNET_break_op (0);
145  memset (key,
146  0,
147  sizeof (*key));
148  return GNUNET_OK;
149  }
150  ub = block;
152  sizeof(ub->verification_key),
153  key);
154  return GNUNET_OK;
155  default:
156  GNUNET_break (0);
157  return GNUNET_SYSERR;
158  }
159 }
struct GNUNET_HashCode key
The key used in the DHT.
@ GNUNET_OK
Definition: gnunet_common.h:95
@ GNUNET_SYSERR
Definition: gnunet_common.h:93
void GNUNET_CRYPTO_hash(const void *block, size_t size, struct GNUNET_HashCode *ret)
Compute hash of a given block.
Definition: crypto_hash.c:41
#define GNUNET_break_op(cond)
Use this for assertion violations caused by other peers (i.e.
universal block for keyword and namespace search results
Definition: block_fs.h:50
struct GNUNET_CRYPTO_EcdsaPublicKey verification_key
Public key used to sign this block.
Definition: block_fs.h:64

Referenced by libgnunet_plugin_block_fs_init().

Here is the caller graph for this function:

◆ block_plugin_fs_check_query()

static enum GNUNET_GenericReturnValue block_plugin_fs_check_query ( void *  cls,
enum GNUNET_BLOCK_Type  type,
const struct GNUNET_HashCode query,
const void *  xquery,
size_t  xquery_size 
)
static

Function called to validate a query.

Parameters
clsclosure
ctxblock context
typeblock type
queryoriginal query (hash)
xqueryextrended query data (can be NULL, depending on type)
xquery_sizenumber of bytes in xquery
Returns
GNUNET_OK if the query is fine, GNUNET_NO if not

Definition at line 54 of file plugin_block_fs.c.

179 {
180  switch (type)
181  {
185  if (0 != xquery_size)
186  {
187  GNUNET_break_op (0);
188  return GNUNET_NO;
189  }
190  return GNUNET_OK;
191  default:
192  GNUNET_break (0);
193  return GNUNET_SYSERR;
194  }
195 }
@ GNUNET_NO
Definition: gnunet_common.h:94

Referenced by libgnunet_plugin_block_fs_init().

Here is the caller graph for this function:

◆ block_plugin_fs_check_block()

static enum GNUNET_GenericReturnValue block_plugin_fs_check_block ( void *  cls,
enum GNUNET_BLOCK_Type  type,
const void *  block,
size_t  block_size 
)
static

Function called to validate a block for storage.

Parameters
clsclosure
typeblock type
blockblock data to validate
block_sizenumber of bytes in block
Returns
GNUNET_OK if the block is fine, GNUNET_NO if not

Definition at line 54 of file plugin_block_fs.c.

212 {
213  switch (type)
214  {
217  return GNUNET_OK;
219  {
220  const struct UBlock *ub;
221 
222  if (block_size < sizeof(struct UBlock))
223  {
224  GNUNET_break_op (0);
225  return GNUNET_NO;
226  }
227  ub = block;
228  if (block_size !=
229  ntohl (ub->purpose.size) +
230  sizeof (struct GNUNET_CRYPTO_EcdsaSignature))
231  {
232  GNUNET_break_op (0);
233  return GNUNET_NO;
234  }
235  if (GNUNET_OK !=
237  &ub->purpose,
238  &ub->signature,
239  &ub->verification_key))
240  {
241  GNUNET_break_op (0);
242  return GNUNET_NO;
243  }
244  return GNUNET_OK;
245  }
246  default:
247  GNUNET_break (0);
248  return GNUNET_SYSERR;
249  }
250 }
#define GNUNET_SIGNATURE_PURPOSE_FS_UBLOCK
UBlock Signature, done using DSS, not ECC (GNUnet-FS)
enum GNUNET_GenericReturnValue GNUNET_CRYPTO_ecdsa_verify_(uint32_t purpose, const struct GNUNET_CRYPTO_EccSignaturePurpose *validate, const struct GNUNET_CRYPTO_EcdsaSignature *sig, const struct GNUNET_CRYPTO_EcdsaPublicKey *pub)
Verify ECDSA signature.
Definition: crypto_ecc.c:623
uint32_t size
How many bytes does this signature sign? (including this purpose header); in network byte order (!...
an ECC signature using ECDSA
struct GNUNET_CRYPTO_EccSignaturePurpose purpose
What is being signed and why?
Definition: block_fs.h:59
struct GNUNET_CRYPTO_EcdsaSignature signature
Signature using pseudonym and search keyword / identifier.
Definition: block_fs.h:54

References BLOOMFILTER_K, GNUNET_BLOCK_GROUP_bf_create(), GNUNET_BLOCK_GROUP_compute_bloomfilter_size(), GNUNET_BLOCK_TYPE_FS_DBLOCK, GNUNET_BLOCK_TYPE_FS_IBLOCK, GNUNET_BLOCK_TYPE_FS_UBLOCK, GNUNET_break, size, and type.

Referenced by libgnunet_plugin_block_fs_init().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ block_plugin_fs_check_reply()

static enum GNUNET_BLOCK_ReplyEvaluationResult block_plugin_fs_check_reply ( void *  cls,
enum GNUNET_BLOCK_Type  type,
struct GNUNET_BLOCK_Group group,
const struct GNUNET_HashCode query,
const void *  xquery,
size_t  xquery_size,
const void *  reply_block,
size_t  reply_block_size 
)
static

Function called to validate a reply to a request.

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 GetKeyFunction and the BlockEvaluationFunction.

Parameters
clsclosure
typeblock type
groupwhich block group to use for evaluation
queryoriginal query (hash)
xqueryextrended query data (can be NULL, depending on type)
xquery_sizenumber of bytes in xquery
reply_blockresponse to validate
reply_block_sizenumber of bytes in reply_block
Returns
characterization of result

Definition at line 54 of file plugin_block_fs.c.

278 {
279  switch (type)
280  {
285  {
286  struct GNUNET_HashCode chash;
287 
288  GNUNET_CRYPTO_hash (reply_block,
289  reply_block_size,
290  &chash);
291  if (GNUNET_YES ==
293  &chash))
296  }
297  default:
298  GNUNET_break (0);
300  }
301 }
@ GNUNET_YES
Definition: gnunet_common.h:97
int GNUNET_BLOCK_GROUP_bf_test_and_set(struct GNUNET_BLOCK_Group *bg, const struct GNUNET_HashCode *hc)
Test if hc is contained in the Bloom filter of bg.
Definition: bg_bf.c:214
@ GNUNET_BLOCK_REPLY_OK_MORE
Valid result, and there may be more.
@ GNUNET_BLOCK_REPLY_OK_DUPLICATE
Valid result, but suppressed because it is a duplicate.
@ GNUNET_BLOCK_REPLY_OK_LAST
Last possible valid result.
@ GNUNET_BLOCK_REPLY_TYPE_NOT_SUPPORTED
Specified block type not supported by any plugin.
A 512-bit hashcode.

Referenced by libgnunet_plugin_block_fs_init().

Here is the caller graph for this function:

◆ libgnunet_plugin_block_fs_init()

void* libgnunet_plugin_block_fs_init ( void *  cls)

Entry point for the plugin.

Definition at line 308 of file plugin_block_fs.c.

309 {
310  static const enum GNUNET_BLOCK_Type types[] = {
314  GNUNET_BLOCK_TYPE_ANY /* end of list */
315  };
316  struct GNUNET_BLOCK_PluginFunctions *api;
317 
324  api->types = types;
325  return api;
326 }
GNUNET_BLOCK_Type
WARNING: This header is generated! In order to add DHT block types, you must register them in GANA,...
@ GNUNET_BLOCK_TYPE_ANY
Identifier for any block.
#define GNUNET_new(type)
Allocate a struct or union of the given type.
static enum GNUNET_GenericReturnValue block_plugin_fs_check_query(void *cls, enum GNUNET_BLOCK_Type type, const struct GNUNET_HashCode *query, const void *xquery, size_t xquery_size)
Function called to validate a query.
static enum GNUNET_GenericReturnValue block_plugin_fs_get_key(void *cls, enum GNUNET_BLOCK_Type type, const void *block, size_t block_size, struct GNUNET_HashCode *key)
Function called to obtain the key for a block.
static struct GNUNET_BLOCK_Group * block_plugin_fs_create_group(void *cls, enum GNUNET_BLOCK_Type type, uint32_t nonce, const void *raw_data, size_t raw_data_size, va_list va)
Create a new block group.
static enum GNUNET_GenericReturnValue block_plugin_fs_check_block(void *cls, enum GNUNET_BLOCK_Type type, const void *block, size_t block_size)
Function called to validate a block for storage.
static enum GNUNET_BLOCK_ReplyEvaluationResult block_plugin_fs_check_reply(void *cls, enum GNUNET_BLOCK_Type type, struct GNUNET_BLOCK_Group *group, const struct GNUNET_HashCode *query, const void *xquery, size_t xquery_size, const void *reply_block, size_t reply_block_size)
Function called to validate a reply to a request.
Each plugin is required to return a pointer to a struct of this type as the return value from its ent...
enum GNUNET_BLOCK_Type * types
0-terminated array of block types supported by this plugin.
GNUNET_BLOCK_QueryEvaluationFunction check_query
Check that a query is well-formed.
GNUNET_BLOCK_BlockEvaluationFunction check_block
Check that a block is well-formed.
GNUNET_BLOCK_GetKeyFunction get_key
Obtain the key for a given block (if possible).
GNUNET_BLOCK_ReplyEvaluationFunction check_reply
Check that a reply block matches a query.
GNUNET_BLOCK_GroupCreateFunction create_group
Create a block group to process a bunch of blocks in a shared context (i.e.

References block_plugin_fs_check_block(), block_plugin_fs_check_query(), block_plugin_fs_check_reply(), block_plugin_fs_create_group(), block_plugin_fs_get_key(), GNUNET_BLOCK_PluginFunctions::check_block, GNUNET_BLOCK_PluginFunctions::check_query, GNUNET_BLOCK_PluginFunctions::check_reply, GNUNET_BLOCK_PluginFunctions::create_group, GNUNET_BLOCK_PluginFunctions::get_key, GNUNET_BLOCK_TYPE_ANY, GNUNET_BLOCK_TYPE_FS_DBLOCK, GNUNET_BLOCK_TYPE_FS_IBLOCK, GNUNET_BLOCK_TYPE_FS_UBLOCK, GNUNET_new, and GNUNET_BLOCK_PluginFunctions::types.

Here is the call graph for this function:

◆ libgnunet_plugin_block_fs_done()

void* libgnunet_plugin_block_fs_done ( void *  cls)

Exit point from the plugin.

Definition at line 333 of file plugin_block_fs.c.

334 {
335  struct GNUNET_BLOCK_PluginFunctions *api = cls;
336 
337  GNUNET_free (api);
338  return NULL;
339 }
#define GNUNET_free(ptr)
Wrapper around free.
void * cls
Closure for all of the callbacks.

References GNUNET_BLOCK_PluginFunctions::cls, and GNUNET_free.