GNUnet  0.11.x
Data Structures | Macros | Typedefs | Enumerations | Functions
GNS Record library

Manipulate GNS record data. More...

Data Structures

struct  GNUNET_GNSRECORD_Data
 A GNS record. More...
 
struct  GNUNET_GNSRECORD_PlaceData
 Data stored in a PLACE record. More...
 
struct  GNUNET_GNSRECORD_EcdsaBlock
 Information we have in an encrypted block with record data (i.e. More...
 
struct  GNUNET_GNSRECORD_EddsaBlock
 Information we have in an encrypted block with record data (i.e. More...
 
struct  GNUNET_GNSRECORD_Block
 
struct  GNUNET_GNSRECORD_BoxRecord
 Record type used to box up SRV and TLSA records. More...
 
struct  GNUNET_GNSRECORD_ReverseRecord
 Record type used internally to keep track of reverse mappings into a namespace. More...
 

Macros

#define GNUNET_GNSRECORD_MAX_BLOCK_SIZE   (63 * 1024)
 Maximum size of a value that can be stored in a GNS block. More...
 
#define GNUNET_GNSRECORD_TYPE_ANY   0
 Record type indicating any record/'*'. More...
 

Typedefs

typedef void(* GNUNET_GNSRECORD_RecordCallback) (void *cls, unsigned int rd_count, const struct GNUNET_GNSRECORD_Data *rd)
 Process a records that were decrypted from a block. More...
 

Enumerations

enum  GNUNET_GNSRECORD_Flags {
  GNUNET_GNSRECORD_RF_NONE = 0 , GNUNET_GNSRECORD_RF_PRIVATE = 2 , GNUNET_GNSRECORD_RF_SUPPLEMENTAL = 4 , GNUNET_GNSRECORD_RF_RELATIVE_EXPIRATION = 8 ,
  GNUNET_GNSRECORD_RF_SHADOW_RECORD
}
 Include the record types generated from GANA. More...
 

Functions

struct GNUNET_JSON_Specification GNUNET_GNSRECORD_JSON_spec_gnsrecord (struct GNUNET_GNSRECORD_Data **rd, unsigned int *rd_count, char **name)
 JSON Specification for GNS Records. More...
 
json_t * GNUNET_GNSRECORD_JSON_from_gnsrecord (const char *rname, const struct GNUNET_GNSRECORD_Data *rd, unsigned int rd_count)
 Convert GNS record to JSON. More...
 
char * GNUNET_GNSRECORD_value_to_string (uint32_t type, const void *data, size_t data_size)
 Convert the binary value data of a record of type type to a human-readable string. More...
 
int GNUNET_GNSRECORD_string_to_value (uint32_t type, const char *s, void **data, size_t *data_size)
 Convert human-readable version of the value s of a record of type type to the respective binary representation. More...
 
uint32_t GNUNET_GNSRECORD_typename_to_number (const char *dns_typename)
 Convert a type name (e.g. More...
 
const char * GNUNET_GNSRECORD_number_to_typename (uint32_t type)
 Convert a type number to the corresponding type string (e.g. More...
 
ssize_t GNUNET_GNSRECORD_records_get_size (unsigned int rd_count, const struct GNUNET_GNSRECORD_Data *rd)
 Calculate how many bytes we will need to serialize the given records. More...
 
ssize_t GNUNET_GNSRECORD_records_serialize (unsigned int rd_count, const struct GNUNET_GNSRECORD_Data *rd, size_t dest_size, char *dest)
 Serialize the given records to the given destination buffer. More...
 
int GNUNET_GNSRECORD_records_deserialize (size_t len, const char *src, unsigned int rd_count, struct GNUNET_GNSRECORD_Data *dest)
 Deserialize the given records to the given destination. More...
 
int GNUNET_GNSRECORD_is_expired (const struct GNUNET_GNSRECORD_Data *rd)
 Test if a given record is expired. More...
 
char * GNUNET_GNSRECORD_string_to_lowercase (const char *src)
 Convert a UTF-8 string to UTF-8 lowercase. More...
 
const char * GNUNET_GNSRECORD_z2s (const struct GNUNET_IDENTITY_PublicKey *z)
 Convert a zone to a string (for printing debug messages). More...
 
const char * GNUNET_GNSRECORD_pkey_to_zkey (const struct GNUNET_IDENTITY_PublicKey *pkey)
 Convert public key to the respective absolute domain name in the ".zkey" pTLD. More...
 
int GNUNET_GNSRECORD_zkey_to_pkey (const char *zkey, struct GNUNET_IDENTITY_PublicKey *pkey)
 Convert an absolute domain name to the respective public key. More...
 
void GNUNET_GNSRECORD_query_from_private_key (const struct GNUNET_IDENTITY_PrivateKey *zone, const char *label, struct GNUNET_HashCode *query)
 Calculate the DHT query for a given label in a given zone. More...
 
void GNUNET_GNSRECORD_query_from_public_key (const struct GNUNET_IDENTITY_PublicKey *pub, const char *label, struct GNUNET_HashCode *query)
 Calculate the DHT query for a given label in a given zone. More...
 
struct GNUNET_GNSRECORD_BlockGNUNET_GNSRECORD_block_create (const struct GNUNET_IDENTITY_PrivateKey *key, struct GNUNET_TIME_Absolute expire, const char *label, const struct GNUNET_GNSRECORD_Data *rd, unsigned int rd_count)
 Sign name and records. More...
 
struct GNUNET_GNSRECORD_BlockGNUNET_GNSRECORD_block_create2 (const struct GNUNET_IDENTITY_PrivateKey *key, struct GNUNET_TIME_Absolute expire, const char *label, const struct GNUNET_GNSRECORD_Data *rd, unsigned int rd_count)
 Sign name and records, cache derived public key (also keeps the private key in static memory, so do not use this function if keeping the private key in the process'es RAM is a major issue). More...
 
int GNUNET_GNSRECORD_block_verify (const struct GNUNET_GNSRECORD_Block *block)
 Check if a signature is valid. More...
 
int GNUNET_GNSRECORD_block_decrypt (const struct GNUNET_GNSRECORD_Block *block, const struct GNUNET_IDENTITY_PublicKey *zone_key, const char *label, GNUNET_GNSRECORD_RecordCallback proc, void *proc_cls)
 Decrypt block. More...
 
int GNUNET_GNSRECORD_records_cmp (const struct GNUNET_GNSRECORD_Data *a, const struct GNUNET_GNSRECORD_Data *b)
 Compares if two records are equal. More...
 
struct GNUNET_TIME_Absolute GNUNET_GNSRECORD_record_get_expiration_time (unsigned int rd_count, const struct GNUNET_GNSRECORD_Data *rd)
 Returns the expiration time of the given block of records. More...
 
size_t GNUNET_GNSRECORD_block_get_size (const struct GNUNET_GNSRECORD_Block *block)
 Returns the length of this block in bytes. More...
 
struct GNUNET_TIME_Absolute GNUNET_GNSRECORD_block_get_expiration (const struct GNUNET_GNSRECORD_Block *block)
 Returns the expiration of a block. More...
 
enum GNUNET_GenericReturnValue GNUNET_GNSRECORD_query_from_block (const struct GNUNET_GNSRECORD_Block *block, struct GNUNET_HashCode *query)
 Builds the query hash from a block. More...
 
enum GNUNET_GenericReturnValue GNUNET_GNSRECORD_identity_from_data (const char *data, size_t data_size, uint32_t type, struct GNUNET_IDENTITY_PublicKey *key)
 Build a #GNUNET_GNSRECORD_PublicKey from zone delegation resource record data. More...
 
enum GNUNET_GenericReturnValue GNUNET_GNSRECORD_data_from_identity (const struct GNUNET_IDENTITY_PublicKey *key, char **data, size_t *data_size, uint32_t *type)
 Create record data and size from an identity key. More...
 
enum GNUNET_GenericReturnValue GNUNET_GNSRECORD_is_zonekey_type (uint32_t type)
 Check if this type is one of the supported GNS zone types. More...
 

Detailed Description

Manipulate GNS record data.

See also
Documentation

Macro Definition Documentation

◆ GNUNET_GNSRECORD_MAX_BLOCK_SIZE

#define GNUNET_GNSRECORD_MAX_BLOCK_SIZE   (63 * 1024)

Maximum size of a value that can be stored in a GNS block.

Definition at line 49 of file gnunet_gnsrecord_lib.h.

◆ GNUNET_GNSRECORD_TYPE_ANY

#define GNUNET_GNSRECORD_TYPE_ANY   0

Record type indicating any record/'*'.

Definition at line 55 of file gnunet_gnsrecord_lib.h.

Typedef Documentation

◆ GNUNET_GNSRECORD_RecordCallback

typedef void(* GNUNET_GNSRECORD_RecordCallback) (void *cls, unsigned int rd_count, const struct GNUNET_GNSRECORD_Data *rd)

Process a records that were decrypted from a block.

Parameters
clsclosure
rd_countnumber of entries in rd array
rdarray of records with data to store

Definition at line 306 of file gnunet_gnsrecord_lib.h.

Enumeration Type Documentation

◆ GNUNET_GNSRECORD_Flags

Include the record types generated from GANA.

Flags that can be set for a record.

Enumerator
GNUNET_GNSRECORD_RF_NONE 

No special options.

GNUNET_GNSRECORD_RF_PRIVATE 

This is a private record of this peer and it should thus not be handed out to other peers.

GNUNET_GNSRECORD_RF_SUPPLEMENTAL 

This is a supplemental record.

GNUNET_GNSRECORD_RF_RELATIVE_EXPIRATION 

This expiration time of the record is a relative time (not an absolute time).

GNUNET_GNSRECORD_RF_SHADOW_RECORD 

This record should not be used unless all (other) records with an absolute expiration time have expired.

Definition at line 65 of file gnunet_gnsrecord_lib.h.

66 {
71 
77 
82 
88 
94 
106 #define GNUNET_GNSRECORD_RF_RCMP_FLAGS (GNUNET_GNSRECORD_RF_RELATIVE_EXPIRATION)
107 };
@ GNUNET_GNSRECORD_RF_RELATIVE_EXPIRATION
This expiration time of the record is a relative time (not an absolute time).
@ GNUNET_GNSRECORD_RF_SUPPLEMENTAL
This is a supplemental record.
@ GNUNET_GNSRECORD_RF_SHADOW_RECORD
This record should not be used unless all (other) records with an absolute expiration time have expir...
@ GNUNET_GNSRECORD_RF_PRIVATE
This is a private record of this peer and it should thus not be handed out to other peers.
@ GNUNET_GNSRECORD_RF_NONE
No special options.

Function Documentation

◆ GNUNET_GNSRECORD_JSON_spec_gnsrecord()

struct GNUNET_JSON_Specification GNUNET_GNSRECORD_JSON_spec_gnsrecord ( struct GNUNET_GNSRECORD_Data **  rd,
unsigned int *  rd_count,
char **  name 
)

JSON Specification for GNS Records.

Parameters
gnsrecord_objectstruct of GNUNET_GNSRECORD_Data to fill
Returns
JSON Specification

Definition at line 247 of file json_gnsrecord.c.

265 {
266  struct GnsRecordInfo *gnsrecord_info = GNUNET_new (struct GnsRecordInfo);
267 
268  gnsrecord_info->rd = rd;
269  gnsrecord_info->name = name;
270  gnsrecord_info->rd_count = rd_count;
272  .cleaner = &clean_gnsrecordobject,
273  .cls = NULL,
274  .field = NULL,
275  .ptr = (struct GnsRecordInfo *)
276  gnsrecord_info,
277  .ptr_size = 0,
278  .size_ptr = NULL };
279  return ret;
280 }
static int ret
Return value of the commandline.
Definition: gnunet-abd.c:81
#define GNUNET_new(type)
Allocate a struct or union of the given type.
static void clean_gnsrecordobject(void *cls, struct GNUNET_JSON_Specification *spec)
Cleanup data left from parsing the record.
static int parse_gnsrecordobject(void *cls, json_t *root, struct GNUNET_JSON_Specification *spec)
const char * name
Entry in parser specification for GNUNET_JSON_parse().
struct GNUNET_GNSRECORD_Data ** rd
unsigned int * rd_count

Referenced by namestore_add_or_update().

Here is the caller graph for this function:

◆ GNUNET_GNSRECORD_JSON_from_gnsrecord()

json_t* GNUNET_GNSRECORD_JSON_from_gnsrecord ( const char *  rname,
const struct GNUNET_GNSRECORD_Data rd,
unsigned int  rd_count 
)

Convert GNS record to JSON.

Parameters
rnamename of record
rdrecord data
Returns
corresponding JSON encoding

Definition at line 291 of file json_gnsrecord.c.

294 {
295  struct GNUNET_TIME_Absolute abs_exp;
296  struct GNUNET_TIME_Relative rel_exp;
297  const char *expiration_time_str;
298  const char *record_type_str;
299  char *value_str;
300  json_t *data;
301  json_t *record;
302  json_t *records;
303 
304  data = json_object ();
305  if (NULL == data)
306  {
307  GNUNET_break (0);
308  return NULL;
309  }
310  if (0 !=
311  json_object_set_new (data,
312  "record_name",
313  json_string (rname)))
314  {
315  GNUNET_break (0);
316  json_decref (data);
317  return NULL;
318  }
319  records = json_array ();
320  if (NULL == records)
321  {
322  GNUNET_break (0);
323  json_decref (data);
324  return NULL;
325  }
326  for (int i = 0; i < rd_count; i++)
327  {
328  value_str = GNUNET_GNSRECORD_value_to_string (rd[i].record_type,
329  rd[i].data,
330  rd[i].data_size);
331  if (GNUNET_GNSRECORD_RF_RELATIVE_EXPIRATION & rd[i].flags)
332  {
333  rel_exp.rel_value_us = rd[i].expiration_time;
334  expiration_time_str = GNUNET_STRINGS_relative_time_to_string (rel_exp,
335  GNUNET_NO);
336  }
337  else
338  {
339  abs_exp.abs_value_us = rd[i].expiration_time;
340  expiration_time_str = GNUNET_STRINGS_absolute_time_to_string (abs_exp);
341  }
342  record_type_str = GNUNET_GNSRECORD_number_to_typename (rd[i].record_type);
344  "Packing %s %s %s %d\n",
345  value_str, record_type_str, expiration_time_str, rd[i].flags);
346  record = json_pack ("{s:s,s:s,s:s,s:b,s:b,s:b,s:b}",
347  "value",
348  value_str,
349  "record_type",
350  record_type_str,
351  "expiration_time",
352  expiration_time_str,
353  "private",
354  rd[i].flags & GNUNET_GNSRECORD_RF_PRIVATE,
355  "relative_expiration",
357  "supplemental",
358  rd[i].flags & GNUNET_GNSRECORD_RF_SUPPLEMENTAL,
359  "shadow",
360  rd[i].flags & GNUNET_GNSRECORD_RF_SHADOW_RECORD);
361  GNUNET_free (value_str);
362  if (NULL == record)
363  {
364  GNUNET_break (0);
365  json_decref (records);
366  json_decref (data);
367  return NULL;
368  }
369  if (0 !=
370  json_array_append_new (records,
371  record))
372  {
373  GNUNET_break (0);
374  json_decref (records);
375  json_decref (data);
376  return NULL;
377  }
378  }
379  if (0 !=
380  json_object_set_new (data,
381  "data",
382  records))
383  {
384  GNUNET_break (0);
385  json_decref (data);
386  return NULL;
387  }
388  return data;
389 }
static size_t data_size
Number of bytes in data.
Definition: gnunet-abd.c:187
static void record(void *cls, size_t data_size, const void *data)
Process recorded audio data.
uint32_t data
The data value.
static unsigned int records
Number of records we found.
#define GNUNET_log(kind,...)
@ GNUNET_NO
Definition: gnunet_common.h:94
const char * GNUNET_GNSRECORD_number_to_typename(uint32_t type)
Convert a type number to the corresponding type string (e.g.
Definition: gnsrecord.c:244
char * GNUNET_GNSRECORD_value_to_string(uint32_t type, const void *data, size_t data_size)
Convert the 'value' of a record to a string.
Definition: gnsrecord.c:156
#define GNUNET_break(cond)
Use this for internal assertion violations that are not fatal (can be handled) but should not occur.
@ GNUNET_ERROR_TYPE_DEBUG
#define GNUNET_free(ptr)
Wrapper around free.
const char * GNUNET_STRINGS_absolute_time_to_string(struct GNUNET_TIME_Absolute t)
Like asctime, except for GNUnet time.
Definition: strings.c:604
const char * GNUNET_STRINGS_relative_time_to_string(struct GNUNET_TIME_Relative delta, int do_round)
Give relative time in human-readable fancy format.
Definition: strings.c:557
uint64_t expiration_time
Expiration time for the DNS record.
Time for absolute times used by GNUnet, in microseconds.
Time for relative time used by GNUnet, in microseconds.

References GNUNET_TIME_Absolute::abs_value_us, data, data_size, GNUNET_GNSRECORD_Data::expiration_time, GNUNET_break, GNUNET_ERROR_TYPE_DEBUG, GNUNET_free, GNUNET_GNSRECORD_number_to_typename(), GNUNET_GNSRECORD_RF_PRIVATE, GNUNET_GNSRECORD_RF_RELATIVE_EXPIRATION, GNUNET_GNSRECORD_RF_SHADOW_RECORD, GNUNET_GNSRECORD_RF_SUPPLEMENTAL, GNUNET_GNSRECORD_value_to_string(), GNUNET_log, GNUNET_NO, GNUNET_STRINGS_absolute_time_to_string(), GNUNET_STRINGS_relative_time_to_string(), record(), records, and GNUNET_TIME_Relative::rel_value_us.

Referenced by handle_gns_response(), namestore_list_iteration(), and ns_get_lookup_cb().

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

◆ GNUNET_GNSRECORD_value_to_string()

char* GNUNET_GNSRECORD_value_to_string ( uint32_t  type,
const void *  data,
size_t  data_size 
)

Convert the binary value data of a record of type type to a human-readable string.

Parameters
typetype of the record
datavalue in binary encoding
data_sizenumber of bytes in data
Returns
NULL on error, otherwise human-readable representation of the value

Convert the binary value data of a record of type type to a human-readable string.

Parameters
typetype of the record
datavalue in binary encoding
data_sizenumber of bytes in data
Returns
NULL on error, otherwise human-readable representation of the value

Definition at line 156 of file gnsrecord.c.

159 {
160  struct Plugin *plugin;
161  char *ret;
162 
163  init ();
164  for (unsigned int i = 0; i < num_plugins; i++)
165  {
166  plugin = gns_plugins[i];
167  if (NULL != (ret = plugin->api->value_to_string (plugin->api->cls,
168  type,
169  data,
170  data_size)))
171  return ret;
172  }
173  return NULL;
174 }
static unsigned int num_plugins
Size of the 'plugins' array.
Definition: gnsrecord.c:63
static struct Plugin ** gns_plugins
Array of our plugins.
Definition: gnsrecord.c:58
static void init()
Loads all plugins (lazy initialization).
Definition: gnsrecord.c:100
struct Plugin * plugin
The process handle to the testbed service.
void * cls
Closure for all of the callbacks.
Handle for a plugin.
Definition: block.c:38
struct GNUNET_BLOCK_PluginFunctions * api
Plugin API.
Definition: block.c:47
enum GNUNET_TESTBED_UnderlayLinkModelType type
the type of this model

References Plugin::api, GNUNET_BLOCK_PluginFunctions::cls, data, data_size, gns_plugins, init(), num_plugins, plugin, ret, and type.

Referenced by check_pkey(), del_monitor(), display_record(), display_records_from_block(), gns_value_to_string(), GNUNET_GNSRECORD_JSON_from_gnsrecord(), GNUNET_GNSRECORD_records_deserialize(), GNUNET_GNSRECORD_records_get_size(), GNUNET_GNSRECORD_records_serialize(), process_lookup_result(), and start_phone().

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

◆ GNUNET_GNSRECORD_string_to_value()

int GNUNET_GNSRECORD_string_to_value ( uint32_t  type,
const char *  s,
void **  data,
size_t *  data_size 
)

Convert human-readable version of the value s of a record of type type to the respective binary representation.

Parameters
typetype of the record
shuman-readable string
dataset to value in binary encoding (will be allocated)
data_sizeset to number of bytes in data
Returns
GNUNET_OK on success

Convert human-readable version of the value s of a record of type type to the respective binary representation.

Parameters
typetype of the record
shuman-readable string
dataset to value in binary encoding (will be allocated)
data_sizeset to number of bytes in data
Returns
GNUNET_OK on success

Definition at line 188 of file gnsrecord.c.

192 {
193  struct Plugin *plugin;
194 
195  init ();
196  for (unsigned int i = 0; i < num_plugins; i++)
197  {
198  plugin = gns_plugins[i];
199  if (GNUNET_OK == plugin->api->string_to_value (plugin->api->cls,
200  type,
201  s,
202  data,
203  data_size))
204  return GNUNET_OK;
205  }
206  return GNUNET_SYSERR;
207 }
@ GNUNET_OK
Definition: gnunet_common.h:95
@ GNUNET_SYSERR
Definition: gnunet_common.h:93

References Plugin::api, GNUNET_BLOCK_PluginFunctions::cls, data, data_size, gns_plugins, GNUNET_OK, GNUNET_SYSERR, init(), num_plugins, plugin, and type.

Referenced by gns_string_to_value(), multirecord_option(), parse_record(), run_edkey(), run_pkey(), run_with_zone_pkey(), and store_cb().

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

◆ GNUNET_GNSRECORD_typename_to_number()

uint32_t GNUNET_GNSRECORD_typename_to_number ( const char *  dns_typename)

Convert a type name (e.g.

"AAAA") to the corresponding number.

Parameters
dns_typenamename to convert
Returns
corresponding number, UINT32_MAX on error

Convert a type name (e.g.

Parameters
dns_typenamename to convert
Returns
corresponding number, UINT32_MAX on error

Definition at line 217 of file gnsrecord.c.

218 {
219  struct Plugin *plugin;
220  uint32_t ret;
221 
222  if (0 == strcasecmp (dns_typename,
223  "ANY"))
225  init ();
226  for (unsigned int i = 0; i < num_plugins; i++)
227  {
228  plugin = gns_plugins[i];
229  if (UINT32_MAX != (ret = plugin->api->typename_to_number (plugin->api->cls,
230  dns_typename)))
231  return ret;
232  }
233  return UINT32_MAX;
234 }
#define GNUNET_GNSRECORD_TYPE_ANY
Record type indicating any record/'*'.

References Plugin::api, GNUNET_BLOCK_PluginFunctions::cls, gns_plugins, GNUNET_GNSRECORD_TYPE_ANY, init(), num_plugins, plugin, and ret.

Referenced by del_monitor(), display_record(), get_gns_cont(), multirecord_option(), namestore_get(), parse_record(), run(), and run_with_zone_pkey().

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

◆ GNUNET_GNSRECORD_number_to_typename()

const char* GNUNET_GNSRECORD_number_to_typename ( uint32_t  type)

Convert a type number to the corresponding type string (e.g.

1 to "A")

Parameters
typenumber of a type to convert
Returns
corresponding typestring, NULL on error

Definition at line 244 of file gnsrecord.c.

245 {
246  struct Plugin *plugin;
247  const char *ret;
248 
250  return "ANY";
251  init ();
252  for (unsigned int i = 0; i < num_plugins; i++)
253  {
254  plugin = gns_plugins[i];
255  if (NULL != (ret = plugin->api->number_to_typename (plugin->api->cls,
256  type)))
257  return ret;
258  }
259  return NULL;
260 }

References Plugin::api, GNUNET_BLOCK_PluginFunctions::cls, gns_plugins, GNUNET_GNSRECORD_TYPE_ANY, init(), num_plugins, plugin, ret, and type.

Referenced by display_record(), display_records_from_block(), GNUNET_GNSRECORD_JSON_from_gnsrecord(), multirecord_option(), process_lookup_result(), and run_with_zone_pkey().

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

◆ GNUNET_GNSRECORD_records_get_size()

ssize_t GNUNET_GNSRECORD_records_get_size ( unsigned int  rd_count,
const struct GNUNET_GNSRECORD_Data rd 
)

Calculate how many bytes we will need to serialize the given records.

Parameters
rd_countnumber of records in the rd array
rdarray of GNUNET_GNSRECORD_Data with rd_count elements
Returns
the required size to serialize, -1 on error
Parameters
rd_countnumber of records in the rd array
rdarray of GNUNET_GNSRECORD_Data with rd_count elements
Returns
the required size to serialize, -1 on error

Efficiently round up to the next power of 2 for padding https://graphics.stanford.edu/~seander/bithacks.html#RoundUpPowerOf2

Definition at line 88 of file gnsrecord_serialization.c.

90 {
91  size_t ret;
92 
93  if (0 == rd_count)
94  return 0;
95 
96  ret = sizeof(struct NetworkRecord) * rd_count;
97  for (unsigned int i = 0; i < rd_count; i++)
98  {
99  if ((ret + rd[i].data_size) < ret)
100  {
101  GNUNET_break (0);
102  return -1;
103  }
104  ret += rd[i].data_size;
105 #if DEBUG_GNSRECORDS
106  {
107  char *str;
108 
110  rd[i].data,
111  rd[i].data_size);
112  if (NULL == str)
113  {
114  GNUNET_break_op (0);
115  return -1;
116  }
117  GNUNET_free (str);
118  }
119 #endif
120  }
121  if (ret > SSIZE_MAX)
122  {
123  GNUNET_break (0);
124  return -1;
125  }
126  // Do not pad PKEY
129  return ret;ret--;
135  ret |= ret >> 1;
136  ret |= ret >> 2;
137  ret |= ret >> 4;
138  ret |= ret >> 8;
139  ret |= ret >> 16;
140  ret++;
141  return (ssize_t) ret;
142 }
#define GNUNET_GNSRECORD_TYPE_PKEY
WARNING: This header is generated! In order to add GNS record types, you must register them in GANA,...
#define GNUNET_GNSRECORD_TYPE_EDKEY
Record type for EDKEY zone delegations.
#define GNUNET_break_op(cond)
Use this for assertion violations caused by other peers (i.e.
uint32_t record_type
Type of the GNS/DNS record.
size_t data_size
Number of bytes in data.
Internal format of a record in the serialized form.
uint32_t record_type
Type of the GNS/DNS record, network byte order.

References data, data_size, GNUNET_GNSRECORD_Data::data_size, GNUNET_break, GNUNET_break_op, GNUNET_free, GNUNET_GNSRECORD_TYPE_EDKEY, GNUNET_GNSRECORD_TYPE_PKEY, GNUNET_GNSRECORD_value_to_string(), NetworkRecord::record_type, GNUNET_GNSRECORD_Data::record_type, and ret.

Referenced by block_create_ecdsa(), block_create_eddsa(), consistency_iter(), GNUNET_NAMESTORE_records_store(), handle_gns_resolution_result(), handle_zone_to_name_it(), lookup_it(), namestore_postgres_store_records(), namestore_sqlite_store_records(), run_edkey(), run_pkey(), rvk_ticket_update(), send_lookup_response(), and store_and_free_entries().

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

◆ GNUNET_GNSRECORD_records_serialize()

ssize_t GNUNET_GNSRECORD_records_serialize ( unsigned int  rd_count,
const struct GNUNET_GNSRECORD_Data rd,
size_t  dest_size,
char *  dest 
)

Serialize the given records to the given destination buffer.

Parameters
rd_countnumber of records in the rd array
rdarray of GNUNET_GNSRECORD_Data with rd_count elements
dest_sizesize of the destination array dst
destwhere to write the result
Returns
the size of serialized records, -1 if records do not fit
Parameters
rd_countnumber of records in the rd array
rdarray of GNUNET_GNSRECORD_Data with rd_count elements
dest_sizesize of the destination array
destwhere to write the result
Returns
the size of serialized records, -1 if records do not fit

Definition at line 155 of file gnsrecord_serialization.c.

159 {
160  struct NetworkRecord rec;
161  size_t off;
162 
163  off = 0;
164  for (unsigned int i = 0; i < rd_count; i++)
165  {
167  "Serializing record %u with flags %d and expiration time %llu\n",
168  i,
169  rd[i].flags,
170  (unsigned long long) rd[i].expiration_time);
171  rec.expiration_time = GNUNET_htonll (rd[i].expiration_time);
172  rec.data_size = htonl ((uint32_t) rd[i].data_size);
173  rec.record_type = htonl (rd[i].record_type);
174  rec.flags = htonl (rd[i].flags);
175  if ((off + sizeof(rec) > dest_size) ||
176  (off + sizeof(rec) < off))
177  {
178  GNUNET_break (0);
179  return -1;
180  }
181  GNUNET_memcpy (&dest[off],
182  &rec,
183  sizeof(rec));
184  off += sizeof(rec);
185  if ((off + rd[i].data_size > dest_size) ||
186  (off + rd[i].data_size < off))
187  {
188  GNUNET_break (0);
189  return -1;
190  }
191  GNUNET_memcpy (&dest[off],
192  rd[i].data,
193  rd[i].data_size);
194  off += rd[i].data_size;
195 #if DEBUG_GNSRECORDS
196  {
197  char *str;
198 
200  rd[i].data,
201  rd[i].data_size);
202  if (NULL == str)
203  {
204  GNUNET_break_op (0);
205  return -1;
206  }
207  GNUNET_free (str);
208  }
209 #endif
210  }
211  memset (&dest[off],
212  0,
213  dest_size - off);
214  return dest_size;
215 }
#define LOG(kind,...)
uint64_t GNUNET_htonll(uint64_t n)
Convert unsigned 64-bit integer to network byte order.
Definition: common_endian.c:36
#define GNUNET_memcpy(dst, src, n)
Call memcpy() but check for n being 0 first.
uint64_t expiration_time
Expiration time for the DNS record; relative or absolute depends on flags, network byte order.
uint32_t flags
Flags for the record, network byte order.

References data, data_size, NetworkRecord::data_size, GNUNET_GNSRECORD_Data::data_size, NetworkRecord::expiration_time, NetworkRecord::flags, GNUNET_break, GNUNET_break_op, GNUNET_ERROR_TYPE_DEBUG, GNUNET_free, GNUNET_GNSRECORD_value_to_string(), GNUNET_htonll(), GNUNET_memcpy, LOG, and NetworkRecord::record_type.

Referenced by block_create_ecdsa(), block_create_eddsa(), consistency_iter(), GNUNET_NAMESTORE_records_store(), handle_gns_resolution_result(), handle_zone_to_name_it(), lookup_it(), namestore_postgres_store_records(), namestore_sqlite_store_records(), run_edkey(), run_pkey(), rvk_ticket_update(), send_lookup_response(), and store_and_free_entries().

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

◆ GNUNET_GNSRECORD_records_deserialize()

int GNUNET_GNSRECORD_records_deserialize ( size_t  len,
const char *  src,
unsigned int  rd_count,
struct GNUNET_GNSRECORD_Data dest 
)

Deserialize the given records to the given destination.

Parameters
lensize of the serialized record data
srcthe serialized record data
rd_countnumber of records in the dest array
destwhere to put the data
Returns
GNUNET_OK on success, GNUNET_SYSERR on error
Parameters
lensize of the serialized record data
srcthe serialized record data
rd_countnumber of records in the rd array
destwhere to put the data
Returns
GNUNET_OK on success, GNUNET_SYSERR on error

Definition at line 228 of file gnsrecord_serialization.c.

232 {
233  struct NetworkRecord rec;
234  size_t off;
235 
236  off = 0;
237  for (unsigned int i = 0; i < rd_count; i++)
238  {
239  if ((off + sizeof(rec) > len) ||
240  (off + sizeof(rec) < off))
241  {
242  GNUNET_break_op (0);
243  return GNUNET_SYSERR;
244  }
245  GNUNET_memcpy (&rec,
246  &src[off],
247  sizeof(rec));
248  dest[i].expiration_time = GNUNET_ntohll (rec.expiration_time);
249  dest[i].data_size = ntohl ((uint32_t) rec.data_size);
250  dest[i].record_type = ntohl (rec.record_type);
251  dest[i].flags = ntohl (rec.flags);
252  off += sizeof(rec);
253  if ((off + dest[i].data_size > len) ||
254  (off + dest[i].data_size < off))
255  {
256  GNUNET_break_op (0);
257  return GNUNET_SYSERR;
258  }
259  dest[i].data = &src[off];
260  off += dest[i].data_size;
261 #if GNUNET_EXTRA_LOGGING
262  {
263  char *str;
264 
266  dest[i].data,
267  dest[i].data_size);
268  if (NULL == str)
269  {
270  GNUNET_break_op (0);
271  return GNUNET_SYSERR;
272  }
273  GNUNET_free (str);
274  }
275 #endif
277  "Deserialized record %u with flags %d and expiration time %llu\n",
278  i,
279  dest[i].flags,
280  (unsigned long long) dest[i].expiration_time);
281  }
282  return GNUNET_OK;
283 }
uint16_t len
length of data (which is always a uint32_t, but presumably this can be used to specify that fewer byt...
uint64_t GNUNET_ntohll(uint64_t n)
Convert unsigned 64-bit integer to host byte order.
Definition: common_endian.c:53
const void * data
Binary value stored in the DNS record.
enum GNUNET_GNSRECORD_Flags flags
Flags for the record.

References GNUNET_GNSRECORD_Data::data, data, data_size, NetworkRecord::data_size, GNUNET_GNSRECORD_Data::data_size, NetworkRecord::expiration_time, GNUNET_GNSRECORD_Data::expiration_time, NetworkRecord::flags, GNUNET_GNSRECORD_Data::flags, GNUNET_break_op, GNUNET_ERROR_TYPE_DEBUG, GNUNET_free, GNUNET_GNSRECORD_value_to_string(), GNUNET_memcpy, GNUNET_ntohll(), GNUNET_OK, GNUNET_SYSERR, len, LOG, NetworkRecord::record_type, and GNUNET_GNSRECORD_Data::record_type.

Referenced by check_rd(), check_result(), continue_store_activity(), database_setup(), get_records_and_call_iterator(), handle_lookup_result(), handle_record_result(), handle_record_store(), handle_result(), handle_zone_to_name_response(), parse_result_call_iterator(), process_tickets(), update_tickets(), and vpn_allocation_cb().

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

◆ GNUNET_GNSRECORD_is_expired()

int GNUNET_GNSRECORD_is_expired ( const struct GNUNET_GNSRECORD_Data rd)

Test if a given record is expired.

Parameters
rdrecord to test
Returns
GNUNET_YES if the record is expired, GNUNET_NO if not
GNUNET_YES if the record is expired, GNUNET_NO if not

Definition at line 216 of file gnsrecord_misc.c.

217 {
218  struct GNUNET_TIME_Absolute at;
219 
221  return GNUNET_NO;
222  at.abs_value_us = rd->expiration_time;
223  return (0 == GNUNET_TIME_absolute_get_remaining (at).rel_value_us) ?
225 }
@ GNUNET_YES
Definition: gnunet_common.h:97
struct GNUNET_TIME_Relative GNUNET_TIME_absolute_get_remaining(struct GNUNET_TIME_Absolute future)
Given a timestamp in the future, how much time remains until then?
Definition: time.c:232

References GNUNET_TIME_Absolute::abs_value_us, GNUNET_GNSRECORD_Data::expiration_time, GNUNET_GNSRECORD_Data::flags, GNUNET_GNSRECORD_RF_RELATIVE_EXPIRATION, GNUNET_NO, GNUNET_TIME_absolute_get_remaining(), and GNUNET_YES.

Here is the call graph for this function:

◆ GNUNET_GNSRECORD_string_to_lowercase()

char* GNUNET_GNSRECORD_string_to_lowercase ( const char *  src)

Convert a UTF-8 string to UTF-8 lowercase.

Parameters
srcsource string
Returns
converted result

Definition at line 46 of file gnsrecord_misc.c.

47 {
48  char *res;
49 
50  res = GNUNET_strdup (src);
52  return res;
53 }
static int res
#define GNUNET_strdup(a)
Wrapper around GNUNET_xstrdup_.
void GNUNET_STRINGS_utf8_tolower(const char *input, char *output)
Convert the utf-8 input string to lower case.
Definition: strings.c:444

References GNUNET_strdup, GNUNET_STRINGS_utf8_tolower(), and res.

Referenced by handle_record_lookup(), and handle_record_store().

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

◆ GNUNET_GNSRECORD_z2s()

const char* GNUNET_GNSRECORD_z2s ( const struct GNUNET_IDENTITY_PublicKey z)

Convert a zone to a string (for printing debug messages).

This is one of the very few calls in the entire API that is NOT reentrant!

Parameters
zpublic key of a zone
Returns
string form; will be overwritten by next call to GNUNET_GNSRECORD_z2s.

Convert a zone to a string (for printing debug messages).

This is one of the very few calls in the entire API that is NOT reentrant!

Parameters
zthe zone key
Returns
string form; will be overwritten by next call to GNUNET_GNSRECORD_z2s

Definition at line 65 of file gnsrecord_misc.c.

66 {
67  static char buf[sizeof(struct GNUNET_IDENTITY_PublicKey) * 8];
68  char *end;
69 
70  end = GNUNET_STRINGS_data_to_string ((const unsigned char *) z,
71  sizeof(struct
73  buf, sizeof(buf));
74  if (NULL == end)
75  {
76  GNUNET_break (0);
77  return NULL;
78  }
79  *end = '\0';
80  return buf;
81 }
static int end
Set if we are to shutdown all services (including ARM).
Definition: gnunet-arm.c:34
static char buf[2048]
char * GNUNET_STRINGS_data_to_string(const void *data, size_t size, char *out, size_t out_size)
Convert binary data to ASCII encoding using CrockfordBase32.
Definition: strings.c:695
An identity key as per LSD0001.

References buf, end, GNUNET_break, and GNUNET_STRINGS_data_to_string().

Referenced by get_nick_record(), handle_gns_resolution_result(), handle_namecache_block_response(), handle_revocation_result(), namestore_flat_zone_to_name(), namestore_sqlite_zone_to_name(), recursive_gns_resolution_namecache(), recursive_gns_resolution_revocation(), and refresh_block().

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

◆ GNUNET_GNSRECORD_pkey_to_zkey()

const char* GNUNET_GNSRECORD_pkey_to_zkey ( const struct GNUNET_IDENTITY_PublicKey pkey)

Convert public key to the respective absolute domain name in the ".zkey" pTLD.

This is one of the very few calls in the entire API that is NOT reentrant!

Parameters
pkeya public key with a point on the eliptic curve
Returns
string "X.zkey" where X is the coordinates of the public key in an encoding suitable for DNS labels.

This is one of the very few calls in the entire API that is NOT reentrant!

Parameters
pkeya public key with a point on the eliptic curve
Returns
string "X.zkey" where X is the public key in an encoding suitable for DNS labels.

Definition at line 239 of file gnsrecord_misc.c.

240 {
241  static char ret[128];
242  char *pkeys;
243 
246  sizeof(ret),
247  "%s",
248  pkeys);
249  GNUNET_free (pkeys);
250  return ret;
251 }
static char * pkey
Public key of the zone to look in, in ASCII.
char * GNUNET_IDENTITY_public_key_to_string(const struct GNUNET_IDENTITY_PublicKey *key)
Creates a (Base32) string representation of the public key.
int GNUNET_snprintf(char *buf, size_t size, const char *format,...) __attribute__((format(printf
Like snprintf, just aborts if the buffer is of insufficient size.

References GNUNET_free, GNUNET_IDENTITY_public_key_to_string(), GNUNET_snprintf(), pkey, and ret.

Referenced by caller_event_handler(), do_accept(), do_call(), do_resume(), do_status(), handle_phone_hangup(), phone_event_handler(), and translate_dot_plus().

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

◆ GNUNET_GNSRECORD_zkey_to_pkey()

int GNUNET_GNSRECORD_zkey_to_pkey ( const char *  zkey,
struct GNUNET_IDENTITY_PublicKey pkey 
)

Convert an absolute domain name to the respective public key.

Parameters
zkeystring "X" where X is the public key in an encoding suitable for DNS labels.
pkeyset to a public key on the eliptic curve
Returns
GNUNET_SYSERR if zkey has the wrong syntax
Parameters
zkeystring encoding the coordinates of the public key in an encoding suitable for DNS labels.
pkeyset to a public key on the eliptic curve
Returns
GNUNET_SYSERR if zkey has the wrong syntax

Definition at line 264 of file gnsrecord_misc.c.

266 {
267  if (GNUNET_OK !=
269  pkey))
270  return GNUNET_SYSERR;
271  return GNUNET_OK;
272 }
enum GNUNET_GenericReturnValue GNUNET_IDENTITY_public_key_from_string(const char *str, struct GNUNET_IDENTITY_PublicKey *key)
Parses a (Base32) string representation of the public key.

Referenced by GNS_find_tld(), handle_gns_cname_result(), and recursive_gns2dns_resolution().

Here is the caller graph for this function:

◆ GNUNET_GNSRECORD_query_from_private_key()

void GNUNET_GNSRECORD_query_from_private_key ( const struct GNUNET_IDENTITY_PrivateKey zone,
const char *  label,
struct GNUNET_HashCode query 
)

Calculate the DHT query for a given label in a given zone.

Parameters
zoneprivate key of the zone
labellabel of the record
queryhash to use for the query

Definition at line 881 of file gnsrecord_crypto.c.

885 {
887  switch (ntohl (zone->type))
888  {
891 
893  &pub);
895  label,
896  query);
897  break;
898  default:
899  GNUNET_assert (0);
900  }
901 }
static char * zone
Name of the zone being managed.
static struct GNUNET_CRYPTO_EddsaPublicKey pub
Definition: gnunet-scrypt.c:46
void GNUNET_GNSRECORD_query_from_public_key(const struct GNUNET_IDENTITY_PublicKey *pub, const char *label, struct GNUNET_HashCode *query)
Calculate the DHT query for a given label in a given zone.
enum GNUNET_GenericReturnValue GNUNET_IDENTITY_key_get_public(const struct GNUNET_IDENTITY_PrivateKey *privkey, struct GNUNET_IDENTITY_PublicKey *key)
Retrieves the public key representation of a private key.
Definition: identity_api.c:175
#define GNUNET_assert(cond)
Use this for fatal errors that cannot be handled.

References GNUNET_assert, GNUNET_GNSRECORD_query_from_public_key(), GNUNET_GNSRECORD_TYPE_EDKEY, GNUNET_GNSRECORD_TYPE_PKEY, GNUNET_IDENTITY_key_get_public(), pub, and zone.

Referenced by perform_dht_put().

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

◆ GNUNET_GNSRECORD_query_from_public_key()

void GNUNET_GNSRECORD_query_from_public_key ( const struct GNUNET_IDENTITY_PublicKey pub,
const char *  label,
struct GNUNET_HashCode query 
)

Calculate the DHT query for a given label in a given zone.

Parameters
pubpublic key of the zone
labellabel of the record
queryhash to use for the query

FIXME: We may want to plugin-ize this at some point.

Parameters
pubpublic key of the zone
labellabel of the record
queryhash to use for the query

Definition at line 913 of file gnsrecord_crypto.c.

917 {
918  struct GNUNET_IDENTITY_PublicKey pd;
919 
920  switch (ntohl (pub->type))
921  {
923  pd.type = pub->type;
925  label,
926  "gns",
927  &pd.ecdsa_key);
928  GNUNET_CRYPTO_hash (&pd.ecdsa_key,
929  sizeof (pd.ecdsa_key),
930  query);
931  break;
933  pd.type = pub->type;
935  label,
936  "gns",
937  &(pd.eddsa_key));
938  GNUNET_CRYPTO_hash (&pd.eddsa_key,
939  sizeof (pd.eddsa_key),
940  query);
941  break;
942  default:
943  GNUNET_assert (0);
944  }
945 }
void GNUNET_CRYPTO_ecdsa_public_key_derive(const struct GNUNET_CRYPTO_EcdsaPublicKey *pub, const char *label, const char *context, struct GNUNET_CRYPTO_EcdsaPublicKey *result)
Derive a public key from a given public key and a label.
void GNUNET_CRYPTO_eddsa_public_key_derive(const struct GNUNET_CRYPTO_EddsaPublicKey *pub, const char *label, const char *context, struct GNUNET_CRYPTO_EddsaPublicKey *result)
Derive a public key from a given public key and a label.
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

Referenced by GNUNET_GNSRECORD_query_from_private_key(), handle_namecache_block_response(), recursive_gns_resolution_namecache(), and run().

Here is the caller graph for this function:

◆ GNUNET_GNSRECORD_block_create()

struct GNUNET_GNSRECORD_Block* GNUNET_GNSRECORD_block_create ( const struct GNUNET_IDENTITY_PrivateKey key,
struct GNUNET_TIME_Absolute  expire,
const char *  label,
const struct GNUNET_GNSRECORD_Data rd,
unsigned int  rd_count 
)

Sign name and records.

Parameters
keythe private key
expireblock expiration
labelthe name for the records
rdrecord data
rd_countnumber of records in rd
keythe private key
expireblock expiration
labelthe name for the records
rdrecord data
rd_countnumber of records
Returns
NULL on error (block too large)

Definition at line 443 of file gnsrecord_crypto.c.

448 {
451  &pkey);
452  switch (ntohl (key->type))
453  {
455  return block_create_ecdsa (&key->ecdsa_key,
456  &pkey.ecdsa_key,
457  expire,
458  label,
459  rd,
460  rd_count);
462  return block_create_eddsa (&key->eddsa_key,
463  &pkey.eddsa_key,
464  expire,
465  label,
466  rd,
467  rd_count);
468  default:
469  GNUNET_assert (0);
470  }
471  return NULL;
472 }
static struct GNUNET_GNSRECORD_Block * block_create_eddsa(const struct GNUNET_CRYPTO_EddsaPrivateKey *key, const struct GNUNET_CRYPTO_EddsaPublicKey *pkey, struct GNUNET_TIME_Absolute expire, const char *label, const struct GNUNET_GNSRECORD_Data *rd, unsigned int rd_count)
Sign name and records (EDDSA version)
static struct GNUNET_GNSRECORD_Block * block_create_ecdsa(const struct GNUNET_CRYPTO_EcdsaPrivateKey *key, const struct GNUNET_CRYPTO_EcdsaPublicKey *pkey, struct GNUNET_TIME_Absolute expire, const char *label, const struct GNUNET_GNSRECORD_Data *rd, unsigned int rd_count)
Sign name and records.
struct GNUNET_HashCode key
The key used in the DHT.
static void expire(void *cls)
Expire a PooledConnection object.

References block_create_ecdsa(), block_create_eddsa(), expire(), GNUNET_assert, GNUNET_GNSRECORD_TYPE_EDKEY, GNUNET_GNSRECORD_TYPE_PKEY, GNUNET_IDENTITY_key_get_public(), key, and pkey.

Referenced by perform_dht_put(), refresh_block(), run_edkey(), and run_pkey().

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

◆ GNUNET_GNSRECORD_block_create2()

struct GNUNET_GNSRECORD_Block* GNUNET_GNSRECORD_block_create2 ( const struct GNUNET_IDENTITY_PrivateKey pkey,
struct GNUNET_TIME_Absolute  expire,
const char *  label,
const struct GNUNET_GNSRECORD_Data rd,
unsigned int  rd_count 
)

Sign name and records, cache derived public key (also keeps the private key in static memory, so do not use this function if keeping the private key in the process'es RAM is a major issue).

Parameters
keythe private key
expireblock expiration
labelthe name for the records
rdrecord data
rd_countnumber of records in rd
keythe private key
expireblock expiration
labelthe name for the records
rdrecord data
rd_countnumber of records
Returns
NULL on error (block too large)

Definition at line 505 of file gnsrecord_crypto.c.

510 {
511  const struct GNUNET_CRYPTO_EcdsaPrivateKey *key;
512  struct GNUNET_CRYPTO_EddsaPublicKey edpubkey;
513 
514  if (GNUNET_IDENTITY_TYPE_ECDSA == ntohl (pkey->type))
515  {
516  key = &pkey->ecdsa_key;
517 #define CSIZE 64
518  static struct KeyCacheLine cache[CSIZE];
519  struct KeyCacheLine *line;
520 
521  line = &cache[(*(unsigned int *) key) % CSIZE];
522  if (0 != memcmp (&line->key,
523  key,
524  sizeof(*key)))
525  {
526  /* cache miss, recompute */
527  line->key = *key;
529  &line->pkey);
530  }
531 #undef CSIZE
532  return block_create_ecdsa (key,
533  &line->pkey,
534  expire,
535  label,
536  rd,
537  rd_count);
538  }
539  else if (GNUNET_IDENTITY_TYPE_EDDSA == ntohl (pkey->type))
540  {
542  &edpubkey);
543  return block_create_eddsa (&pkey->eddsa_key,
544  &edpubkey,
545  expire,
546  label,
547  rd,
548  rd_count);
549  }
550  return NULL;
551 }
#define CSIZE
static char * line
Desired phone line (string to be converted to a hash).
static struct GNUNET_CONTAINER_MultiHashMap32 * cache
Hashmap to maintain cache.
void GNUNET_CRYPTO_eddsa_key_get_public(const struct GNUNET_CRYPTO_EddsaPrivateKey *priv, struct GNUNET_CRYPTO_EddsaPublicKey *pub)
Extract the public key for the given private key.
Definition: crypto_ecc.c:197
void GNUNET_CRYPTO_ecdsa_key_get_public(const struct GNUNET_CRYPTO_EcdsaPrivateKey *priv, struct GNUNET_CRYPTO_EcdsaPublicKey *pub)
Extract the public key for the given private key.
Definition: crypto_ecc.c:186
@ GNUNET_IDENTITY_TYPE_ECDSA
The identity type.
@ GNUNET_IDENTITY_TYPE_EDDSA
EDDSA identity.
Private ECC key encoded for transmission.
Public ECC key (always for curve Ed25519) encoded in a format suitable for network transmission and E...
Line in cache mapping private keys to public keys.

Referenced by perform_dht_put(), and refresh_block().

Here is the caller graph for this function:

◆ GNUNET_GNSRECORD_block_verify()

int GNUNET_GNSRECORD_block_verify ( const struct GNUNET_GNSRECORD_Block block)

Check if a signature is valid.

This API is used by the GNS Block to validate signatures received from the network.

Parameters
blockblock to verify
Returns
GNUNET_OK if the signature is valid

Definition at line 505 of file gnsrecord_crypto.c.

563 {
564  switch (ntohl (block->type))
565  {
569  &block->ecdsa_block.purpose,
570  &block->ecdsa_block.signature,
571  &block->ecdsa_block.derived_key);
575  &block->eddsa_block.purpose,
576  &block->eddsa_block.signature,
577  &block->eddsa_block.derived_key);
578  default:
579  return GNUNET_NO;
580  }
581 }
int GNUNET_CRYPTO_eddsa_verify_(uint32_t purpose, const struct GNUNET_CRYPTO_EccSignaturePurpose *validate, const struct GNUNET_CRYPTO_EddsaSignature *sig, const struct GNUNET_CRYPTO_EddsaPublicKey *pub)
Verify EdDSA signature.
Definition: crypto_ecc.c:682
int 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
#define GNUNET_SIGNATURE_PURPOSE_GNS_RECORD_SIGN
Signature of a gnunet naming system record block.
struct GNUNET_GNSRECORD_EcdsaBlock ecdsa_block
struct GNUNET_GNSRECORD_EddsaBlock eddsa_block
struct GNUNET_CRYPTO_EccSignaturePurpose purpose
Number of bytes signed; also specifies the number of bytes of encrypted data that follow.
struct GNUNET_CRYPTO_EcdsaSignature signature
Signature of the block.
struct GNUNET_CRYPTO_EcdsaPublicKey derived_key
Derived key used for signing; hash of this is the query.
struct GNUNET_CRYPTO_EddsaPublicKey derived_key
Derived key used for signing; hash of this is the query.
struct GNUNET_CRYPTO_EddsaSignature signature
Signature of the block.
struct GNUNET_CRYPTO_EccSignaturePurpose purpose
Number of bytes signed; also specifies the number of bytes of encrypted data that follow.

Referenced by handle_lookup_block_response().

Here is the caller graph for this function:

◆ GNUNET_GNSRECORD_block_decrypt()

int GNUNET_GNSRECORD_block_decrypt ( const struct GNUNET_GNSRECORD_Block block,
const struct GNUNET_IDENTITY_PublicKey zone_key,
const char *  label,
GNUNET_GNSRECORD_RecordCallback  proc,
void *  proc_cls 
)

Decrypt block.

Parameters
blockblock to decrypt
zone_keypublic key of the zone
labelthe name for the records
procfunction to call with the result
proc_clsclosure for proc
Returns
GNUNET_OK on success, GNUNET_SYSERR if the block was not well-formed
Parameters
blockblock to decrypt
zone_keypublic key of the zone
labelthe name for the records
procfunction to call with the result
proc_clsclosure for proc
Returns
GNUNET_OK on success, GNUNET_SYSERR if the block was not well-formed

Definition at line 505 of file gnsrecord_crypto.c.

858 {
859  switch (ntohl (zone_key->type))
860  {
862  return block_decrypt_ecdsa (&block->ecdsa_block,
863  &zone_key->ecdsa_key, label, proc, proc_cls);
865  return block_decrypt_eddsa (&block->eddsa_block,
866  &zone_key->eddsa_key, label, proc, proc_cls);
867  default:
868  return GNUNET_SYSERR;
869  }
870 }
enum GNUNET_GenericReturnValue block_decrypt_eddsa(const struct GNUNET_GNSRECORD_EddsaBlock *block, const struct GNUNET_CRYPTO_EddsaPublicKey *zone_key, const char *label, GNUNET_GNSRECORD_RecordCallback proc, void *proc_cls)
enum GNUNET_GenericReturnValue block_decrypt_ecdsa(const struct GNUNET_GNSRECORD_EcdsaBlock *block, const struct GNUNET_CRYPTO_EcdsaPublicKey *zone_key, const char *label, GNUNET_GNSRECORD_RecordCallback proc, void *proc_cls)
static const struct GNUNET_IDENTITY_PrivateKey * zone_key
Private key of the zone.
uint32_t type
Type of public key.
struct GNUNET_CRYPTO_EcdsaPrivateKey ecdsa_key
An ECDSA identity key.
struct GNUNET_CRYPTO_EddsaPrivateKey eddsa_key
AN EdDSA identtiy key.

Referenced by handle_block(), handle_dht_response(), and handle_namecache_block_response().

Here is the caller graph for this function:

◆ GNUNET_GNSRECORD_records_cmp()

int GNUNET_GNSRECORD_records_cmp ( const struct GNUNET_GNSRECORD_Data a,
const struct GNUNET_GNSRECORD_Data b 
)

Compares if two records are equal.

Parameters
aa record
banother record
Returns
GNUNET_YES if the records are equal, or GNUNET_NO if not.

Compares if two records are equal.

absolute expiration time).

Parameters
arecord
brecord
Returns
GNUNET_YES if the records are equal or GNUNET_NO if they are not

Definition at line 94 of file gnsrecord_misc.c.

96 {
98  "Comparing records\n");
99  if (a->record_type != b->record_type)
100  {
102  "Record type %u != %u\n", a->record_type, b->record_type);
103  return GNUNET_NO;
104  }
105  if ((a->expiration_time != b->expiration_time) &&
106  ((a->expiration_time != 0) && (b->expiration_time != 0)))
107  {
109  "Expiration time %llu != %llu\n",
110  (unsigned long long) a->expiration_time,
111  (unsigned long long) b->expiration_time);
112  return GNUNET_NO;
113  }
115  != (b->flags & GNUNET_GNSRECORD_RF_RCMP_FLAGS))
116  {
118  "Flags %u (%u) != %u (%u)\n", a->flags,
121  return GNUNET_NO;
122  }
123  if (a->data_size != b->data_size)
124  {
126  "Data size %lu != %lu\n",
127  a->data_size,
128  b->data_size);
129  return GNUNET_NO;
130  }
131  if (0 != memcmp (a->data, b->data, a->data_size))
132  {
134  "Data contents do not match\n");
135  return GNUNET_NO;
136  }
138  "Records are equal\n");
139  return GNUNET_YES;
140 }
#define LOG(kind,...)
#define GNUNET_GNSRECORD_RF_RCMP_FLAGS

◆ GNUNET_GNSRECORD_record_get_expiration_time()

struct GNUNET_TIME_Absolute GNUNET_GNSRECORD_record_get_expiration_time ( unsigned int  rd_count,
const struct GNUNET_GNSRECORD_Data rd 
)

Returns the expiration time of the given block of records.

The block expiration time is the expiration time of the record with smallest expiration time.

Parameters
rd_countnumber of records given in rd
rdarray of records
Returns
absolute expiration time

Definition at line 94 of file gnsrecord_misc.c.

156 {
158  struct GNUNET_TIME_Absolute at;
159  struct GNUNET_TIME_Relative rt;
160  struct GNUNET_TIME_Absolute at_shadow;
161  struct GNUNET_TIME_Relative rt_shadow;
162 
163  if (NULL == rd)
166  for (unsigned int c = 0; c < rd_count; c++)
167  {
168  if (0 != (rd[c].flags & GNUNET_GNSRECORD_RF_RELATIVE_EXPIRATION))
169  {
170  rt.rel_value_us = rd[c].expiration_time;
172  }
173  else
174  {
175  at.abs_value_us = rd[c].expiration_time;
176  }
177 
178  for (unsigned int c2 = 0; c2 < rd_count; c2++)
179  {
180  /* Check for shadow record */
181  if ((c == c2) ||
182  (rd[c].record_type != rd[c2].record_type) ||
183  (0 == (rd[c2].flags & GNUNET_GNSRECORD_RF_SHADOW_RECORD)))
184  continue;
185  /* We have a shadow record */
186  if (0 != (rd[c2].flags & GNUNET_GNSRECORD_RF_RELATIVE_EXPIRATION))
187  {
188  rt_shadow.rel_value_us = rd[c2].expiration_time;
189  at_shadow = GNUNET_TIME_relative_to_absolute (rt_shadow);
190  }
191  else
192  {
193  at_shadow.abs_value_us = rd[c2].expiration_time;
194  }
195  at = GNUNET_TIME_absolute_max (at,
196  at_shadow);
197  }
199  expire);
200  }
202  "Determined expiration time for block with %u records to be %s\n",
203  rd_count,
205  return expire;
206 }
struct GNUNET_TIME_Absolute GNUNET_TIME_absolute_max(struct GNUNET_TIME_Absolute t1, struct GNUNET_TIME_Absolute t2)
Return the maximum of two absolute time values.
Definition: time.c:224
struct GNUNET_TIME_Absolute GNUNET_TIME_relative_to_absolute(struct GNUNET_TIME_Relative rel)
Convert relative time to an absolute time in the future.
Definition: time.c:181
struct GNUNET_TIME_Absolute GNUNET_TIME_absolute_min(struct GNUNET_TIME_Absolute t1, struct GNUNET_TIME_Absolute t2)
Return the minimum of two absolute time values.
Definition: time.c:216
#define GNUNET_TIME_UNIT_ZERO_ABS
Absolute time zero.
#define GNUNET_TIME_UNIT_FOREVER_ABS
Constant used to specify "forever".

References testconfigure::b, GNUNET_GNSRECORD_Data::data, GNUNET_GNSRECORD_Data::data_size, GNUNET_GNSRECORD_Data::expiration_time, GNUNET_GNSRECORD_Data::flags, GNUNET_ERROR_TYPE_DEBUG, GNUNET_GNSRECORD_RF_RCMP_FLAGS, GNUNET_NO, GNUNET_YES, LOG, and GNUNET_GNSRECORD_Data::record_type.

Referenced by perform_dht_put(), and refresh_block().

Here is the caller graph for this function:

◆ GNUNET_GNSRECORD_block_get_size()

size_t GNUNET_GNSRECORD_block_get_size ( const struct GNUNET_GNSRECORD_Block block)

Returns the length of this block in bytes.

Block length strongly depends on the zone type.

Parameters
blockthe block.
Returns
the length of this block in bytes

Definition at line 331 of file gnsrecord_misc.c.

332 {
333  switch (ntohl (block->type))
334  {
336  return sizeof (uint32_t) /* zone type */
337  + sizeof (block->ecdsa_block) /* EcdsaBlock */
338  + ntohl (block->ecdsa_block.purpose.size) /* Length of signed data */
339  - sizeof (block->ecdsa_block.purpose); /* Purpose already in EcdsaBlock */
340  break;
342  return sizeof (uint32_t) /* zone type */
343  + sizeof (block->eddsa_block) /* EddsaBlock */
344  + ntohl (block->eddsa_block.purpose.size) /* Length of signed data */
345  - sizeof (block->ecdsa_block.purpose); /* Purpose already in EcdsaBlock */
346 
347  default:
348  return 0;
349  }
350  return 0;
351 }
uint32_t size
How many bytes does this signature sign? (including this purpose header); in network byte order (!...

Referenced by GNUNET_NAMECACHE_block_cache(), handle_dht_response(), handle_lookup_block_it(), namecache_cache_block(), namecache_postgres_cache_block(), namecache_sqlite_cache_block(), perform_dht_put(), and store_and_free_entries().

Here is the caller graph for this function:

◆ GNUNET_GNSRECORD_block_get_expiration()

struct GNUNET_TIME_Absolute GNUNET_GNSRECORD_block_get_expiration ( const struct GNUNET_GNSRECORD_Block block)

Returns the expiration of a block.

Parameters
blockthe block.
Returns
the block expiration.

Definition at line 331 of file gnsrecord_misc.c.

357 {
358 
359  switch (ntohl (block->type))
360  {
365  default:
366  GNUNET_break (0); /* Hopefully we never get here, but we might */
367  }
369 
370 }
struct GNUNET_TIME_Absolute GNUNET_TIME_absolute_get_zero_(void)
Return absolute time of 0ms.
Definition: time.c:109
struct GNUNET_TIME_Absolute GNUNET_TIME_absolute_ntoh(struct GNUNET_TIME_AbsoluteNBO a)
Convert absolute time from network byte order.
Definition: time.c:542
struct GNUNET_TIME_AbsoluteNBO expiration_time
Expiration time of the block.
struct GNUNET_TIME_AbsoluteNBO expiration_time
Expiration time of the block.

References GNUNET_GNSRECORD_Block::ecdsa_block, GNUNET_GNSRECORD_Block::eddsa_block, GNUNET_GNSRECORD_TYPE_EDKEY, GNUNET_GNSRECORD_TYPE_PKEY, GNUNET_GNSRECORD_EddsaBlock::purpose, GNUNET_GNSRECORD_EcdsaBlock::purpose, GNUNET_CRYPTO_EccSignaturePurpose::size, and GNUNET_GNSRECORD_Block::type.

Referenced by expire_blocks(), handle_dht_response(), handle_lookup_block_it(), handle_namecache_block_response(), namecache_postgres_cache_block(), and namecache_sqlite_cache_block().

Here is the caller graph for this function:

◆ GNUNET_GNSRECORD_query_from_block()

enum GNUNET_GenericReturnValue GNUNET_GNSRECORD_query_from_block ( const struct GNUNET_GNSRECORD_Block block,
struct GNUNET_HashCode query 
)

Builds the query hash from a block.

Parameters
blockthe block.
querywhere to write the query hash.
Returns
GNUNET_SYSERR on error.

Definition at line 331 of file gnsrecord_misc.c.

376 {
377  switch (ntohl (block->type))
378  {
381  sizeof (block->ecdsa_block.derived_key),
382  query);
383  return GNUNET_OK;
386  sizeof (block->eddsa_block.derived_key),
387  query);
388  return GNUNET_OK;
389  default:
390  return GNUNET_SYSERR;
391  }
392  return GNUNET_SYSERR;
393 
394 }

Referenced by block_plugin_gns_get_key(), namecache_cache_block(), namecache_postgres_cache_block(), and namecache_sqlite_cache_block().

Here is the caller graph for this function:

◆ GNUNET_GNSRECORD_identity_from_data()

enum GNUNET_GenericReturnValue GNUNET_GNSRECORD_identity_from_data ( const char *  data,
size_t  data_size,
uint32_t  type,
struct GNUNET_IDENTITY_PublicKey key 
)

Build a #GNUNET_GNSRECORD_PublicKey from zone delegation resource record data.

Parameters
datathe record data-
data_sizethe data size.
typethe record type
keythe identity key to store the data in (must be allocated).
Returns
GNUNET_OK if successful.

Definition at line 264 of file gnsrecord_misc.c.

280 {
282  return GNUNET_SYSERR;
283  if (data_size > sizeof (struct GNUNET_IDENTITY_PublicKey))
284  return GNUNET_SYSERR;
286  data_size?
287  GNUNET_OK :
288  GNUNET_SYSERR);
289 }
enum GNUNET_GenericReturnValue GNUNET_GNSRECORD_is_zonekey_type(uint32_t type)
Check if this type is one of the supported GNS zone types.
ssize_t GNUNET_IDENTITY_read_key_from_buffer(struct GNUNET_IDENTITY_PublicKey *key, const void *buffer, size_t len)
Reads a GNUNET_IDENTITY_PublicKey from a compact buffer.
Definition: identity_api.c:994

Referenced by check_pkey(), gns_value_to_string(), handle_gns_resolution_result(), namestore_postgres_store_records(), namestore_sqlite_store_records(), and recursive_pkey_resolution().

Here is the caller graph for this function:

◆ GNUNET_GNSRECORD_data_from_identity()

enum GNUNET_GenericReturnValue GNUNET_GNSRECORD_data_from_identity ( const struct GNUNET_IDENTITY_PublicKey key,
char **  data,
size_t *  data_size,
uint32_t *  type 
)

Create record data and size from an identity key.

Parameters
keythe identity key to use.
datathe record data (will be allocated)
data_sizethe allocated data size.
typethe resulting record type
Returns
GNUNET_OK if successful.

Definition at line 264 of file gnsrecord_misc.c.

298 {
299  char *tmp;
300  *type = ntohl (key->type);
302  if (0 == *data_size)
303  return GNUNET_SYSERR;
304  tmp = GNUNET_malloc (*data_size);
306  != *data_size) {
307  GNUNET_free (tmp);
308  *data_size = 0;
309  return GNUNET_SYSERR;
310  }
311  *data = tmp;
312  return GNUNET_OK;
313 }
ssize_t GNUNET_IDENTITY_write_key_to_buffer(const struct GNUNET_IDENTITY_PublicKey *key, void *buffer, size_t len)
Writes a GNUNET_IDENTITY_PublicKey to a compact buffer.
ssize_t GNUNET_IDENTITY_key_get_length(const struct GNUNET_IDENTITY_PublicKey *key)
Get the compacted length of a GNUNET_IDENTITY_PublicKey.
Definition: identity_api.c:976
#define GNUNET_malloc(size)
Wrapper around malloc.

References GNUNET_IDENTITY_public_key_from_string(), GNUNET_OK, GNUNET_SYSERR, and pkey.

Referenced by gns_string_to_value(), and register_do_cb().

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

◆ GNUNET_GNSRECORD_is_zonekey_type()

enum GNUNET_GenericReturnValue GNUNET_GNSRECORD_is_zonekey_type ( uint32_t  type)

Check if this type is one of the supported GNS zone types.

Parameters
typethe type to check
Returns
GNUNET_YES if it is one of the supported types.

Definition at line 264 of file gnsrecord_misc.c.

318 {
319  switch (type)
320  {
323  return GNUNET_YES;
324  default:
325  return GNUNET_NO;
326  }
327 }

Referenced by namestore_postgres_store_records(), namestore_sqlite_store_records(), and zone_to_name().

Here is the caller graph for this function: