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 
200 
205 {
209  struct GNUNET_CRYPTO_EddsaPublicKey derived_key;
210 
215 
221 
225  struct GNUNET_TIME_AbsoluteNBO expiration_time;
226 
227  /* followed by encrypted data */
228 };
229 
230 
232 {
233  uint32_t type;
234 
235  union
236  {
237  struct GNUNET_GNSRECORD_EcdsaBlock ecdsa_block;
238  struct GNUNET_GNSRECORD_EddsaBlock eddsa_block;
239  };
240 };
241 
242 
254 {
259  uint16_t protocol GNUNET_PACKED;
260 
265 
270 
271  /* followed by the 'original' record */
272 };
273 
282 {
287 
292 
293  /* followed by the name the delegator uses to refer to our namespace */
294 };
295 
297 
298 
307  void *cls, unsigned int rd_count, const struct GNUNET_GNSRECORD_Data *rd);
308 
309 
310 /* ***************** API related to GNSRECORD plugins ************** */
311 
321 char *
322 GNUNET_GNSRECORD_value_to_string (uint32_t type, const void *data,
323  size_t data_size);
324 
325 
336 int
337 GNUNET_GNSRECORD_string_to_value (uint32_t type, const char *s, void **data,
338  size_t *data_size);
339 
340 
347 uint32_t
348 GNUNET_GNSRECORD_typename_to_number (const char *dns_typename);
349 
350 
357 const char *
359 
360 
361 /* convenience APIs for serializing / deserializing GNS records */
362 
371 ssize_t
372 GNUNET_GNSRECORD_records_get_size (unsigned int rd_count,
373  const struct GNUNET_GNSRECORD_Data *rd);
374 
375 
385 ssize_t
386 GNUNET_GNSRECORD_records_serialize (unsigned int rd_count,
387  const struct GNUNET_GNSRECORD_Data *rd,
388  size_t dest_size, char *dest);
389 
390 
400 int
401 GNUNET_GNSRECORD_records_deserialize (size_t len, const char *src,
402  unsigned int rd_count,
403  struct GNUNET_GNSRECORD_Data *dest);
404 
405 
406 /* ******* general APIs relating to blocks, records and labels ******** */
407 
408 
416 int
418 
419 
425 char *
426 GNUNET_GNSRECORD_string_to_lowercase (const char *src);
427 
428 
438 const char *
440 
441 
452 const char *
454 
455 
465 int
466 GNUNET_GNSRECORD_zkey_to_pkey (const char *zkey,
468 
469 
477 void
479  const struct GNUNET_IDENTITY_PrivateKey *zone, const char *label,
480  struct GNUNET_HashCode *query);
481 
482 
490 void
492  const struct GNUNET_IDENTITY_PublicKey *pub, const char *label,
493  struct GNUNET_HashCode *query);
494 
495 
505 struct GNUNET_GNSRECORD_Block *
508  const char *label,
509  const struct GNUNET_GNSRECORD_Data *rd,
510  unsigned int rd_count);
511 
512 
524 struct GNUNET_GNSRECORD_Block *
527  const char *label,
528  const struct GNUNET_GNSRECORD_Data *rd,
529  unsigned int rd_count);
530 
531 
539 int
541 
542 
554 int
556  const struct GNUNET_GNSRECORD_Block *block,
557  const struct GNUNET_IDENTITY_PublicKey *zone_key, const char *label,
558  GNUNET_GNSRECORD_RecordCallback proc, void *proc_cls);
559 
560 
568 int
570  const struct GNUNET_GNSRECORD_Data *b);
571 
572 
584  unsigned int rd_count, const struct GNUNET_GNSRECORD_Data *rd);
585 
586 
594 size_t
596 
605  GNUNET_GNSRECORD_Block *block);
606 
607 
617  struct GNUNET_HashCode *query);
618 
619 
632  size_t data_size,
633  uint32_t type,
635 
636 
649  char **data,
650  size_t *data_size,
651  uint32_t *type);
652 
653 
663 
664 
665 #if 0 /* keep Emacsens' auto-indent happy */
666 {
667 #endif
668 #ifdef __cplusplus
669 }
670 #endif
671 
672 #endif
673  /* end of group */
Information we have in an encrypted block with record data (i.e.
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 (e.g.
Definition: gnsrecord.c:217
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 being managed.
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.
static const struct GNUNET_IDENTITY_PrivateKey * zone_key
Private key of the zone.
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:188
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.
an ECC signature using EdDSA.
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:156
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 to the corresponding type string (e.g.
Definition: gnsrecord.c:244
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...