GNUnet  0.19.4
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 
40 
42 
43 #ifdef __cplusplus
44 extern "C" {
45 #if 0 /* keep Emacsens' auto-indent happy */
46 }
47 #endif
48 #endif
49 
54 #define GNUNET_GNS_EMPTY_LABEL_AT "@"
55 
59 #define GNUNET_GNSRECORD_MAX_BLOCK_SIZE (63 * 1024)
60 
61 
65 #define GNUNET_GNSRECORD_TYPE_ANY 0
66 
70 #include "gnu_name_system_record_types.h"
71 
83 #define GNUNET_GNSRECORD_RF_RCMP_FLAGS (GNUNET_GNSRECORD_RF_RELATIVE_EXPIRATION)
84 
85 
99 {
104 
105 
110 
111 
115  GNUNET_GNSRECORD_RF_SHADOW = 1 << (15 - 14),
116 
117 
122 
123 
128 
129 
134 
135 };
136 
137 
142 {
149 
154 
159 
164  // GNUNET_NAMESTORE_FILTER_OMIT_PUBLIC = 4,
165 };
166 
167 
172 {
178  const void *data;
179 
185  uint64_t expiration_time;
186 
190  size_t data_size;
191 
195  uint32_t record_type;
196 
201 };
202 
203 
205 
210 {
215 
220 
225 
226  /* Followed by struct GNUNET_PeerIdentity relays[relay_count] */
227 };
228 
233 {
238 
243 
248 
249  /* followed by encrypted data */
250 };
251 
252 
257 {
262 
267 
272 
273 
274  /* followed by encrypted data */
275 };
276 
277 
279 {
283  uint32_t size;
284 
288  uint32_t type;
289 
290  union
291  {
294  };
295 };
296 
297 
309 {
315 
320 
325 
326  /* followed by the 'original' record */
327 };
328 
337 {
342 
347 
348  /* followed by the name the delegator uses to refer to our namespace */
349 };
350 
351 
360  void *cls, unsigned int rd_count, const struct GNUNET_GNSRECORD_Data *rd);
361 
362 
363 /* ***************** API related to GNSRECORD plugins ************** */
364 
374 char *
375 GNUNET_GNSRECORD_value_to_string (uint32_t type, const void *data,
376  size_t data_size);
377 
378 
389 int
390 GNUNET_GNSRECORD_string_to_value (uint32_t type, const char *s, void **data,
391  size_t *data_size);
392 
393 
400 uint32_t
401 GNUNET_GNSRECORD_typename_to_number (const char *dns_typename);
402 
403 
410 const char *
412 
413 
414 /* convenience APIs for serializing / deserializing GNS records */
415 
424 ssize_t
426  const struct GNUNET_GNSRECORD_Data *rd);
427 
428 
438 ssize_t
440  const struct GNUNET_GNSRECORD_Data *rd,
441  size_t dest_size, char *dest);
442 
443 unsigned int
445  const char *src);
446 
456 int
457 GNUNET_GNSRECORD_records_deserialize (size_t len, const char *src,
458  unsigned int rd_count,
459  struct GNUNET_GNSRECORD_Data *dest);
460 
461 
462 /* ******* general APIs relating to blocks, records and labels ******** */
463 
464 
472 int
474 
475 
482 char *
483 GNUNET_GNSRECORD_string_normalize (const char *src);
484 
485 
495 const char *
497 
498 
509 const char *
511 
512 
522 int
523 GNUNET_GNSRECORD_zkey_to_pkey (const char *zkey,
525 
526 
534 void
536  const struct GNUNET_IDENTITY_PrivateKey *zone, const char *label,
537  struct GNUNET_HashCode *query);
538 
539 
548 void
550  const struct GNUNET_IDENTITY_PublicKey *pub, const char *label,
551  struct GNUNET_HashCode *query);
552 
553 
562 ssize_t
565  const struct GNUNET_GNSRECORD_Data *rd,
566  unsigned int rd_count);
567 
577 GNUNET_GNSRECORD_block_sign (const struct
579  const char *label,
580  struct GNUNET_GNSRECORD_Block *block);
581 
596  const char *label,
597  const struct GNUNET_GNSRECORD_Data *rd,
598  unsigned int rd_count,
599  struct GNUNET_GNSRECORD_Block **block);
600 
601 
621  const char *label,
622  const struct GNUNET_GNSRECORD_Data *rd,
623  unsigned int rd_count,
624  struct GNUNET_GNSRECORD_Block **result);
625 
626 
643  const char *label,
644  const struct GNUNET_GNSRECORD_Data *rd,
645  unsigned int rd_count,
646  struct GNUNET_GNSRECORD_Block **result);
647 
648 
656 int
658 
659 
671 int
673  const struct GNUNET_GNSRECORD_Block *block,
674  const struct GNUNET_IDENTITY_PublicKey *zone_key, const char *label,
675  GNUNET_GNSRECORD_RecordCallback proc, void *proc_cls);
676 
677 
685 int
687  const struct GNUNET_GNSRECORD_Data *b);
688 
689 
702  const struct
704  struct GNUNET_TIME_Absolute min);
705 
706 
714 size_t
716 
725  GNUNET_GNSRECORD_Block *block);
726 
727 
737  struct GNUNET_HashCode *query);
738 
739 
752  size_t data_size,
753  uint32_t type,
755 
756 
769  char **data,
770  size_t *data_size,
771  uint32_t *type);
772 
773 
783 
792 
812 GNUNET_GNSRECORD_normalize_record_set (const char *label,
813  const struct GNUNET_GNSRECORD_Data *rd,
814  unsigned int rd_count,
815  struct GNUNET_GNSRECORD_Data *rd_public,
816  unsigned int *rd_count_public,
817  struct GNUNET_TIME_Absolute *min_expiry,
819  char **emsg);
820 
829 GNUNET_GNSRECORD_label_check (const char*label, char **emsg);
830 
831 #if 0 /* keep Emacsens' auto-indent happy */
832 {
833 #endif
834 #ifdef __cplusplus
835 }
836 #endif
837 
838 #endif
839  /* end of group */
841  /* 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 unsigned int rd_count
Number of records for currently parsed set.
static struct GNUNET_GNSRECORD_Data rd[50]
The record data under a single label.
static int result
Global testing status.
static struct GNUNET_CRYPTO_EddsaPublicKey pub
Definition: gnunet-scrypt.c:47
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:227
GNUNET_GNSRECORD_Flags
Flags that can be set for a record.
@ 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
This record should not be used unless all (other) records in the set with an absolute expiration time...
@ GNUNET_GNSRECORD_RF_PRIVATE
This is a private record of this peer and it should thus not be published.
@ GNUNET_GNSRECORD_RF_NONE
Entry for no flags / cleared flags.
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:155
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:200
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:177
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.
enum GNUNET_GenericReturnValue GNUNET_GNSRECORD_block_sign(const struct GNUNET_IDENTITY_PrivateKey *key, const char *label, struct GNUNET_GNSRECORD_Block *block)
Sign a block create with GNUNET_GNSRECORD_block_create_unsigned.
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:247
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_block_create_unsigned(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)
Create name and records but do not sign! Sign later with GNUNET_GNSRECORD_block_sign().
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_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.
#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