GNUnet  0.17.6
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 
37 #ifndef GNUNET_GNSRECORD_LIB_H
38 #define GNUNET_GNSRECORD_LIB_H
39 
41 
42 #ifdef __cplusplus
43 extern "C" {
44 #if 0 /* keep Emacsens' auto-indent happy */
45 }
46 #endif
47 #endif
48 
53 #define GNUNET_GNS_EMPTY_LABEL_AT "@"
54 
58 #define GNUNET_GNSRECORD_MAX_BLOCK_SIZE (63 * 1024)
59 
60 
64 #define GNUNET_GNSRECORD_TYPE_ANY 0
65 
69 #include "gnu_name_system_record_types.h"
70 
76 {
81 
88 
94 
99 
105 
110  GNUNET_GNSRECORD_RF_PRIVATE = 32768, /* 2^15 */
111 
112 
124 #define GNUNET_GNSRECORD_RF_RCMP_FLAGS (GNUNET_GNSRECORD_RF_RELATIVE_EXPIRATION)
125 };
126 
131 {
138 
143 
148 
153  //GNUNET_NAMESTORE_FILTER_OMIT_PUBLIC = 4,
154 };
155 
156 
161 {
167  const void *data;
168 
174  uint64_t expiration_time;
175 
179  size_t data_size;
180 
184  uint32_t record_type;
185 
190 };
191 
192 
194 
199 {
204 
209 
214 
215  /* Followed by struct GNUNET_PeerIdentity relays[relay_count] */
216 };
217 
222 {
227 
232 
237 
238  /* followed by encrypted data */
239 };
240 
241 
246 {
251 
256 
261 
262 
263  /* followed by encrypted data */
264 };
265 
266 
268 {
272  uint32_t size;
273 
277  uint32_t type;
278 
279  union
280  {
283  };
284 };
285 
286 
298 {
304 
309 
314 
315  /* followed by the 'original' record */
316 };
317 
326 {
331 
336 
337  /* followed by the name the delegator uses to refer to our namespace */
338 };
339 
340 
349  void *cls, unsigned int rd_count, const struct GNUNET_GNSRECORD_Data *rd);
350 
351 
352 /* ***************** API related to GNSRECORD plugins ************** */
353 
363 char *
364 GNUNET_GNSRECORD_value_to_string (uint32_t type, const void *data,
365  size_t data_size);
366 
367 
378 int
379 GNUNET_GNSRECORD_string_to_value (uint32_t type, const char *s, void **data,
380  size_t *data_size);
381 
382 
389 uint32_t
390 GNUNET_GNSRECORD_typename_to_number (const char *dns_typename);
391 
392 
399 const char *
401 
402 
403 /* convenience APIs for serializing / deserializing GNS records */
404 
413 ssize_t
414 GNUNET_GNSRECORD_records_get_size (unsigned int rd_count,
415  const struct GNUNET_GNSRECORD_Data *rd);
416 
417 
427 ssize_t
428 GNUNET_GNSRECORD_records_serialize (unsigned int rd_count,
429  const struct GNUNET_GNSRECORD_Data *rd,
430  size_t dest_size, char *dest);
431 
432 unsigned int
434  const char *src);
435 
445 int
446 GNUNET_GNSRECORD_records_deserialize (size_t len, const char *src,
447  unsigned int rd_count,
448  struct GNUNET_GNSRECORD_Data *dest);
449 
450 
451 /* ******* general APIs relating to blocks, records and labels ******** */
452 
453 
461 int
463 
464 
471 char *
472 GNUNET_GNSRECORD_string_normalize (const char *src);
473 
474 
484 const char *
486 
487 
498 const char *
500 
501 
511 int
512 GNUNET_GNSRECORD_zkey_to_pkey (const char *zkey,
514 
515 
523 void
525  const struct GNUNET_IDENTITY_PrivateKey *zone, const char *label,
526  struct GNUNET_HashCode *query);
527 
528 
536 void
538  const struct GNUNET_IDENTITY_PublicKey *pub, const char *label,
539  struct GNUNET_HashCode *query);
540 
541 
550 ssize_t
553  const struct GNUNET_GNSRECORD_Data *rd,
554  unsigned int rd_count);
555 
556 
571  const char *label,
572  const struct GNUNET_GNSRECORD_Data *rd,
573  unsigned int rd_count,
574  struct GNUNET_GNSRECORD_Block **block);
575 
576 
593  const char *label,
594  const struct GNUNET_GNSRECORD_Data *rd,
595  unsigned int rd_count,
596  struct GNUNET_GNSRECORD_Block **result);
597 
598 
606 int
608 
609 
621 int
623  const struct GNUNET_GNSRECORD_Block *block,
624  const struct GNUNET_IDENTITY_PublicKey *zone_key, const char *label,
625  GNUNET_GNSRECORD_RecordCallback proc, void *proc_cls);
626 
627 
635 int
637  const struct GNUNET_GNSRECORD_Data *b);
638 
639 
652  const struct
654  struct GNUNET_TIME_Absolute min);
655 
656 
664 size_t
666 
675  GNUNET_GNSRECORD_Block *block);
676 
677 
687  struct GNUNET_HashCode *query);
688 
689 
702  size_t data_size,
703  uint32_t type,
705 
706 
719  char **data,
720  size_t *data_size,
721  uint32_t *type);
722 
723 
733 
742 
762 GNUNET_GNSRECORD_normalize_record_set (const char *label,
763  const struct GNUNET_GNSRECORD_Data *rd,
764  unsigned int rd_count,
765  struct GNUNET_GNSRECORD_Data *rd_public,
766  unsigned int *rd_count_public,
767  struct GNUNET_TIME_Absolute *min_expiry,
769  char **emsg);
770 
771 
780 GNUNET_GNSRECORD_label_check (const char*label, char **emsg);
781 
782 #if 0 /* keep Emacsens' auto-indent happy */
783 {
784 #endif
785 #ifdef __cplusplus
786 }
787 #endif
788 
789 #endif
790  /* end of group */
792  /* end of group addition */
static size_t data_size
Number of bytes in data.
Definition: gnunet-abd.c:187
struct GNUNET_HashCode key
The key used in the DHT.
static char * expire
DID Document expiration Date Attribut String.
Definition: gnunet-did.c:101
uint32_t data
The data value.
uint16_t len
length of data (which is always a uint32_t, but presumably this can be used to specify that fewer byt...
static char * pkey
Public key of the zone to look in, in ASCII.
static char * zone
Name of the zone being managed.
static const struct GNUNET_IDENTITY_PrivateKey * zone_key
Private key of the zone.
static int result
Global testing status.
static struct GNUNET_CRYPTO_EddsaPublicKey pub
Definition: gnunet-scrypt.c:46
static struct GNUNET_CONTAINER_BloomFilter * filter
Bloomfilter to quickly tell if we don't have the content.
Identity service; implements identity management for GNUnet.
char * GNUNET_GNSRECORD_string_normalize(const char *src)
Normalize a UTF-8 string to a GNS name.
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.
enum GNUNET_GenericReturnValue GNUNET_GNSRECORD_label_check(const char *label, char **emsg)
Check label for invalid characters.
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
GNUNET_GNSRECORD_Flags
Include the record types generated from GANA.
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_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.
enum GNUNET_GenericReturnValue 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, struct GNUNET_GNSRECORD_Block **result)
Sign name and records, cache derived public key (also keeps the private key in static memory,...
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
enum GNUNET_GenericReturnValue 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, struct GNUNET_GNSRECORD_Block **block)
Sign name and records.
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.
uint32_t GNUNET_GNSRECORD_typename_to_number(const char *dns_typename)
Convert a type name (e.g.
Definition: gnsrecord.c:217
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.
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
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.
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.
int GNUNET_GNSRECORD_block_verify(const struct GNUNET_GNSRECORD_Block *block)
Check if a signature is valid.
struct GNUNET_TIME_Absolute GNUNET_GNSRECORD_record_get_expiration_time(unsigned int rd_count, const struct GNUNET_GNSRECORD_Data *rd, struct GNUNET_TIME_Absolute min)
Returns the expiration time of the given block of records.
size_t GNUNET_GNSRECORD_block_get_size(const struct GNUNET_GNSRECORD_Block *block)
Returns the length of this block in bytes.
unsigned int GNUNET_GNSRECORD_records_deserialize_get_size(size_t len, const char *src)
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.
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.
int GNUNET_GNSRECORD_is_expired(const struct GNUNET_GNSRECORD_Data *rd)
Test if a given record is expired.
ssize_t GNUNET_GNSRECORD_block_calculate_size(const struct GNUNET_IDENTITY_PrivateKey *key, const struct GNUNET_GNSRECORD_Data *rd, unsigned int rd_count)
Get size of buffer for block creation.
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.
enum GNUNET_GenericReturnValue GNUNET_GNSRECORD_is_critical(uint32_t type)
Check if this type is a critical record.
Definition: gnsrecord.c:264
int GNUNET_GNSRECORD_zkey_to_pkey(const char *zkey, struct GNUNET_IDENTITY_PublicKey *pkey)
Convert an absolute domain name to the respective public key.
enum GNUNET_GenericReturnValue GNUNET_GNSRECORD_is_zonekey_type(uint32_t type)
Check if this type is one of the supported GNS zone types.
const char * GNUNET_GNSRECORD_z2s(const struct GNUNET_IDENTITY_PublicKey *z)
Convert a zone to a string (for printing debug messages).
GNUNET_GNSRECORD_Filter
Filter for GNUNET_GNSRECORD_normalize_record_set().
enum GNUNET_GenericReturnValue GNUNET_GNSRECORD_normalize_record_set(const char *label, const struct GNUNET_GNSRECORD_Data *rd, unsigned int rd_count, struct GNUNET_GNSRECORD_Data *rd_public, unsigned int *rd_count_public, struct GNUNET_TIME_Absolute *min_expiry, enum GNUNET_GNSRECORD_Filter filter, char **emsg)
Normalize namestore records: Check for consistency and expirations.
int GNUNET_GNSRECORD_records_cmp(const struct GNUNET_GNSRECORD_Data *a, const struct GNUNET_GNSRECORD_Data *b)
Compares if two records are equal.
struct GNUNET_TIME_Absolute GNUNET_GNSRECORD_block_get_expiration(const struct GNUNET_GNSRECORD_Block *block)
Returns the expiration of a block.
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.
@ GNUNET_GNSRECORD_RF_RELATIVE_EXPIRATION
This expiration time of the record is a relative time (not an absolute time).
@ GNUNET_GNSRECORD_RF_CRITICAL
This record is critical.
@ 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.
@ GNUNET_GNSRECORD_FILTER_NONE
No filter flags set.
@ GNUNET_GNSRECORD_FILTER_INCLUDE_MAINTENANCE
Include maintenance records (TOMBSTONE etc).
@ GNUNET_GNSRECORD_FILTER_OMIT_PRIVATE
Filter private records.
#define GNUNET_NETWORK_STRUCT_BEGIN
Define as empty, GNUNET_PACKED should suffice, but this won't work on W32.
GNUNET_GenericReturnValue
Named constants for return values.
Definition: gnunet_common.h:96
#define GNUNET_PACKED
gcc-ism to get packed structs.
#define min(x, y)
Public ECC key (always for Curve25519) encoded in a format suitable for network transmission and ECDS...
an ECC signature using ECDSA
Public ECC key (always for curve Ed25519) encoded in a format suitable for network transmission and E...
an ECC signature using EdDSA.
uint32_t type
The zone type (GNUNET_GNSRECORD_TYPE_PKEY)
struct GNUNET_GNSRECORD_EcdsaBlock ecdsa_block
struct GNUNET_GNSRECORD_EddsaBlock eddsa_block
uint32_t size
Size of the block.
Record type used to box up SRV and TLSA records.
uint32_t record_type
GNS record type of the boxed record.
uint16_t service
Service of the boxed record (aka port number), in NBO.
uint16_t protocol
Protocol of the boxed record (6 = TCP, 17 = UDP, etc.).
uint32_t record_type
Type of the GNS/DNS record.
const void * data
Binary value stored in the DNS record.
size_t data_size
Number of bytes in data.
enum GNUNET_GNSRECORD_Flags flags
Flags for the record.
uint64_t expiration_time
Expiration time for the DNS record.
Information we have in an encrypted block with record data (i.e.
struct GNUNET_CRYPTO_EcdsaSignature signature
Signature of the block.
struct GNUNET_TIME_AbsoluteNBO expiration_time
Expiration time of the block.
struct GNUNET_CRYPTO_EcdsaPublicKey derived_key
Derived key used for signing; hash of this is the query.
Information we have in an encrypted block with record data (i.e.
struct GNUNET_CRYPTO_EddsaPublicKey derived_key
Derived key used for signing; hash of this is the query.
struct GNUNET_TIME_AbsoluteNBO expiration_time
Expiration time of the block.
struct GNUNET_CRYPTO_EddsaSignature signature
Signature of the block.
Data stored in a PLACE record.
uint32_t relay_count
Number of relays that follow.
struct GNUNET_PeerIdentity origin
Peer identity of the origin.
struct GNUNET_CRYPTO_EddsaPublicKey place_pub_key
Public key of the place.
Record type used internally to keep track of reverse mappings into a namespace.
struct GNUNET_IDENTITY_PublicKey pkey
The public key of the namespace the is delegating to our namespace.
struct GNUNET_TIME_Absolute expiration
The expiration time of the delegation.
A 512-bit hashcode.
A private key for an identity as per LSD0001.
An identity key as per LSD0001.
The identity of the host (wraps the signing key of the peer).
Time for absolute time used by GNUnet, in microseconds and in network byte order.
Time for absolute times used by GNUnet, in microseconds.
enum GNUNET_TESTBED_UnderlayLinkModelType type
the type of this model