GNUnet  0.11.x
gnunet_gnsrecord_lib.h
Go to the documentation of this file.
1 /*
2  This file is part of GNUnet
3  Copyright (C) 2012, 2013 GNUnet e.V.
4 
5  GNUnet is free software: you can redistribute it and/or modify it
6  under the terms of the GNU Affero General Public License as published
7  by the Free Software Foundation, either version 3 of the License,
8  or (at your option) any later version.
9 
10  GNUnet is distributed in the hope that it will be useful, but
11  WITHOUT ANY WARRANTY; without even the implied warranty of
12  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13  Affero General Public License for more details.
14 
15  You should have received a copy of the GNU Affero General Public License
16  along with this program. If not, see <http://www.gnu.org/licenses/>.
17 
18  SPDX-License-Identifier: AGPL3.0-or-later
19  */
20 
34 #ifndef GNUNET_GNSRECORD_LIB_H
35 #define GNUNET_GNSRECORD_LIB_H
36 
38 
39 #ifdef __cplusplus
40 extern "C" {
41 #if 0 /* keep Emacsens' auto-indent happy */
42 }
43 #endif
44 #endif
45 
49 #define GNUNET_GNSRECORD_MAX_BLOCK_SIZE (63 * 1024)
50 
51 
55 #define GNUNET_GNSRECORD_TYPE_ANY 0
56 
61 
66 {
71 
77 
82 
88 
94 
106 #define GNUNET_GNSRECORD_RF_RCMP_FLAGS (GNUNET_GNSRECORD_RF_RELATIVE_EXPIRATION)
107 };
108 
109 
114 {
120  const void *data;
121 
127  uint64_t expiration_time;
128 
132  size_t data_size;
133 
137  uint32_t record_type;
138 
143 };
144 
145 
147 
152 {
156  struct GNUNET_CRYPTO_EddsaPublicKey place_pub_key;
157 
161  struct GNUNET_PeerIdentity origin;
162 
166  uint32_t relay_count GNUNET_PACKED;
167 
168  /* Followed by struct GNUNET_PeerIdentity relays[relay_count] */
169 };
170 
175 {
179  struct GNUNET_CRYPTO_EcdsaPublicKey derived_key;
180 
185 
191 
196 
197  /* followed by encrypted data */
198 };
199 
201 {
202  uint32_t type;
203 
204  union
205  {
206  struct GNUNET_GNSRECORD_EcdsaBlock ecdsa_block;
207  //struct GNUNET_GNSRECORD_EddsaBlock eddsa_block;
208  };
209 };
210 
211 
223 {
228  uint16_t protocol GNUNET_PACKED;
229 
234 
239 
240  /* followed by the 'original' record */
241 };
242 
251 {
256 
261 
262  /* followed by the name the delegator uses to refer to our namespace */
263 };
264 
266 
267 
276  void *cls, unsigned int rd_count, const struct GNUNET_GNSRECORD_Data *rd);
277 
278 
279 /* ***************** API related to GNSRECORD plugins ************** */
280 
290 char *
291 GNUNET_GNSRECORD_value_to_string (uint32_t type, const void *data,
292  size_t data_size);
293 
294 
305 int
306 GNUNET_GNSRECORD_string_to_value (uint32_t type, const char *s, void **data,
307  size_t *data_size);
308 
309 
316 uint32_t
317 GNUNET_GNSRECORD_typename_to_number (const char *dns_typename);
318 
319 
326 const char *
328 
329 
330 /* convenience APIs for serializing / deserializing GNS records */
331 
340 ssize_t
341 GNUNET_GNSRECORD_records_get_size (unsigned int rd_count,
342  const struct GNUNET_GNSRECORD_Data *rd);
343 
344 
354 ssize_t
355 GNUNET_GNSRECORD_records_serialize (unsigned int rd_count,
356  const struct GNUNET_GNSRECORD_Data *rd,
357  size_t dest_size, char *dest);
358 
359 
369 int
370 GNUNET_GNSRECORD_records_deserialize (size_t len, const char *src,
371  unsigned int rd_count,
372  struct GNUNET_GNSRECORD_Data *dest);
373 
374 
375 /* ******* general APIs relating to blocks, records and labels ******** */
376 
377 
385 int
387 
388 
394 char *
395 GNUNET_GNSRECORD_string_to_lowercase (const char *src);
396 
397 
407 const char *
409 
410 
421 const char *
423 
424 
434 int
435 GNUNET_GNSRECORD_zkey_to_pkey (const char *zkey,
437 
438 
446 void
448  const struct GNUNET_IDENTITY_PrivateKey *zone, const char *label,
449  struct GNUNET_HashCode *query);
450 
451 
459 void
461  const struct GNUNET_IDENTITY_PublicKey *pub, const char *label,
462  struct GNUNET_HashCode *query);
463 
464 
474 struct GNUNET_GNSRECORD_Block *
477  const char *label,
478  const struct GNUNET_GNSRECORD_Data *rd,
479  unsigned int rd_count);
480 
481 
493 struct GNUNET_GNSRECORD_Block *
496  const char *label,
497  const struct GNUNET_GNSRECORD_Data *rd,
498  unsigned int rd_count);
499 
500 
508 int
510 
511 
523 int
525  const struct GNUNET_GNSRECORD_Block *block,
526  const struct GNUNET_IDENTITY_PublicKey *zone_key, const char *label,
527  GNUNET_GNSRECORD_RecordCallback proc, void *proc_cls);
528 
529 
537 int
539  const struct GNUNET_GNSRECORD_Data *b);
540 
541 
553  unsigned int rd_count, const struct GNUNET_GNSRECORD_Data *rd);
554 
555 
563 size_t
565 
574 
575 
585  struct GNUNET_HashCode *query);
586 
587 
600  size_t data_size,
601  uint32_t type,
603 
604 
616  char **data,
617  size_t *data_size,
618  uint32_t *type);
619 
620 
630 
631 
632 #if 0 /* keep Emacsens' auto-indent happy */
633 {
634 #endif
635 #ifdef __cplusplus
636 }
637 #endif
638 
639 #endif
640  /* end of group */
Information we have in an encrypted block with record data (i.e.
This record should not be used unless all (other) records with an absolute expiration time have expir...
static struct GNUNET_SERVICE_Handle * service
Handle to our service instance.
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.
Record type used to box up SRV and TLSA records.
char * GNUNET_GNSRECORD_string_to_lowercase(const char *src)
Convert a UTF-8 string to UTF-8 lowercase.
static char * pkey
Public key of the zone to look in, in ASCII.
uint32_t purpose
What does this signature vouch for? This must contain a GNUNET_SIGNATURE_PURPOSE_XXX constant (from g...
int GNUNET_GNSRECORD_zkey_to_pkey(const char *zkey, struct GNUNET_IDENTITY_PublicKey *pkey)
Convert an absolute domain name to the respective public key.
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.
static void expire(void *cls)
Expire a PooledConnection object.
uint32_t GNUNET_GNSRECORD_typename_to_number(const char *dns_typename)
Convert a type name (i.e.
Definition: gnsrecord.c:220
A private key for an identity as per LSD0001.
GNUNET_GenericReturnValue
Named constants for return values.
Definition: gnunet_common.h:83
This is a supplemental record.
size_t data_size
Number of bytes in data.
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.
Time for absolute time used by GNUnet, in microseconds and in network byte order. ...
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.
#define GNUNET_NETWORK_STRUCT_BEGIN
Define as empty, GNUNET_PACKED should suffice, but this won&#39;t work on W32.
static char * zone
Name of the zone we manage.
header of what an ECC signature signs this must be followed by "size - 8" bytes of the actual signed ...
const void * data
Binary value stored in the DNS record.
enum GNUNET_GenericReturnValue GNUNET_GNSRECORD_is_zonekey_type(uint32_t type)
Check if this type is one of the supported GNS zone types.
size_t GNUNET_GNSRECORD_block_get_size(const struct GNUNET_GNSRECORD_Block *block)
Returns the length of this block in bytes.
uint64_t expiration_time
Expiration time for the DNS record.
struct GNUNET_GNSRECORD_Block * GNUNET_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...
an ECC signature using ECDSA
This is a private record of this peer and it should thus not be handed out to other peers...
A 512-bit hashcode.
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 repre...
Definition: gnsrecord.c:191
static char * expiration
Credential TTL.
Definition: gnunet-abd.c:96
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.
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.
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.
int GNUNET_GNSRECORD_block_verify(const struct GNUNET_GNSRECORD_Block *block)
Check if a signature is valid.
struct GNUNET_HashCode key
The key used in the DHT.
int GNUNET_GNSRECORD_records_cmp(const struct GNUNET_GNSRECORD_Data *a, const struct GNUNET_GNSRECORD_Data *b)
Compares if two records are equal.
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.
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.
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.
#define GNUNET_NETWORK_STRUCT_END
Define as empty, GNUNET_PACKED should suffice, but this won&#39;t work on W32;.
int GNUNET_GNSRECORD_is_expired(const struct GNUNET_GNSRECORD_Data *rd)
Test if a given record is expired.
The identity of the host (wraps the signing key of the peer).
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.
An identity key as per LSD0001.
uint32_t record_type
Type of the GNS/DNS record.
#define GNUNET_PACKED
gcc-ism to get packed structs.
static struct GNUNET_CRYPTO_EddsaPublicKey pub
Definition: gnunet-scrypt.c:46
Public ECC key (always for Curve25519) encoded in a format suitable for network transmission and ECDS...
Data stored in a PLACE record.
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.
enum GNUNET_TESTBED_UnderlayLinkModelType type
the type of this model
Time for absolute times used by GNUnet, in microseconds.
GNUNET_GNSRECORD_Flags
Include the record types generated from GANA.
enum GNUNET_GNSRECORD_Flags flags
Flags for the record.
This expiration time of the record is a relative time (not an absolute time).
struct GNUNET_TIME_Absolute GNUNET_GNSRECORD_block_get_expiration(const struct GNUNET_GNSRECORD_Block *block)
Returns the expiration of a block.
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.
Definition: gnsrecord.c:159
const char * GNUNET_GNSRECORD_z2s(const struct GNUNET_IDENTITY_PublicKey *z)
Convert a zone to a string (for printing debug messages).
const char * GNUNET_GNSRECORD_number_to_typename(uint32_t type)
Convert a type number (i.e.
Definition: gnsrecord.c:247
Record type used internally to keep track of reverse mappings into a namespace.
uint16_t len
length of data (which is always a uint32_t, but presumably this can be used to specify that fewer byt...
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.
Public ECC key (always for curve Ed25519) encoded in a format suitable for network transmission and E...