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 
37 #ifdef __cplusplus
38 extern "C" {
39 #if 0 /* keep Emacsens' auto-indent happy */
40 }
41 #endif
42 #endif
43 
47 #define GNUNET_GNSRECORD_MAX_BLOCK_SIZE (63 * 1024)
48 
49 
53 #define GNUNET_GNSRECORD_TYPE_ANY 0
54 
58 #define GNUNET_GNSRECORD_TYPE_PKEY 65536
59 
63 #define GNUNET_GNSRECORD_TYPE_NICK 65537
64 
68 #define GNUNET_GNSRECORD_TYPE_LEHO 65538
69 
73 #define GNUNET_GNSRECORD_TYPE_VPN 65539
74 
78 #define GNUNET_GNSRECORD_TYPE_GNS2DNS 65540
79 
83 #define GNUNET_GNSRECORD_TYPE_BOX 65541
84 
88 #define GNUNET_GNSRECORD_TYPE_PLACE 65542
89 
93 #define GNUNET_GNSRECORD_TYPE_PHONE 65543
94 
98 #define GNUNET_GNSRECORD_TYPE_RECLAIM_ATTRIBUTE 65544
99 
103 #define GNUNET_GNSRECORD_TYPE_RECLAIM_TICKET 65545
104 
116 #define GNUNET_GNSRECORD_TYPE_DELEGATE 65548
117 
121 #define GNUNET_GNSRECORD_TYPE_ATTRIBUTE 65549
122 
126 #define GNUNET_GNSRECORD_TYPE_RECLAIM_ATTRIBUTE_REF 65550
127 
131 #define GNUNET_GNSRECORD_TYPE_RECLAIM_MASTER 65551
132 
136 #define GNUNET_GNSRECORD_TYPE_RECLAIM_OIDC_CLIENT 65552
137 
141 #define GNUNET_GNSRECORD_TYPE_RECLAIM_OIDC_REDIRECT 65553
142 
146 #define GNUNET_GNSRECORD_TYPE_RECLAIM_ATTESTATION 65554
147 
151 #define GNUNET_GNSRECORD_TYPE_RECLAIM_ATTESTATION_REF 65555
152 
153 
158 {
163 
169 
174 
180 
186 
198 #define GNUNET_GNSRECORD_RF_RCMP_FLAGS (GNUNET_GNSRECORD_RF_RELATIVE_EXPIRATION)
199 };
200 
201 
206 {
212  const void *data;
213 
219  uint64_t expiration_time;
220 
224  size_t data_size;
225 
229  uint32_t record_type;
230 
235 };
236 
237 
239 
244 {
248  struct GNUNET_CRYPTO_EddsaPublicKey place_pub_key;
249 
253  struct GNUNET_PeerIdentity origin;
254 
258  uint32_t relay_count GNUNET_PACKED;
259 
260  /* Followed by struct GNUNET_PeerIdentity relays[relay_count] */
261 };
262 
263 
268 {
273 
277  struct GNUNET_CRYPTO_EcdsaPublicKey derived_key;
278 
284 
289 
290  /* followed by encrypted data */
291 };
292 
293 
305 {
310  uint16_t protocol GNUNET_PACKED;
311 
316 
321 
322  /* followed by the 'original' record */
323 };
324 
333 {
338 
343 
344  /* followed by the name the delegator uses to refer to our namespace */
345 };
346 
348 
349 
358  void *cls, unsigned int rd_count, const struct GNUNET_GNSRECORD_Data *rd);
359 
360 
361 /* ***************** API related to GNSRECORD plugins ************** */
362 
372 char *
373 GNUNET_GNSRECORD_value_to_string (uint32_t type, const void *data,
374  size_t data_size);
375 
376 
387 int
388 GNUNET_GNSRECORD_string_to_value (uint32_t type, const char *s, void **data,
389  size_t *data_size);
390 
391 
398 uint32_t
399 GNUNET_GNSRECORD_typename_to_number (const char *dns_typename);
400 
401 
408 const char *
410 
411 
412 /* convenience APIs for serializing / deserializing GNS records */
413 
422 ssize_t
423 GNUNET_GNSRECORD_records_get_size (unsigned int rd_count,
424  const struct GNUNET_GNSRECORD_Data *rd);
425 
426 
436 ssize_t
437 GNUNET_GNSRECORD_records_serialize (unsigned int rd_count,
438  const struct GNUNET_GNSRECORD_Data *rd,
439  size_t dest_size, char *dest);
440 
441 
451 int
452 GNUNET_GNSRECORD_records_deserialize (size_t len, const char *src,
453  unsigned int rd_count,
454  struct GNUNET_GNSRECORD_Data *dest);
455 
456 
457 /* ******* general APIs relating to blocks, records and labels ******** */
458 
459 
467 int
469 
470 
476 char *
477 GNUNET_GNSRECORD_string_to_lowercase (const char *src);
478 
479 
489 const char *
491 
492 
503 const char *
505 
506 
516 int
517 GNUNET_GNSRECORD_zkey_to_pkey (const char *zkey,
519 
520 
528 void
530  const struct GNUNET_CRYPTO_EcdsaPrivateKey *zone, const char *label,
531  struct GNUNET_HashCode *query);
532 
533 
541 void
543  const struct GNUNET_CRYPTO_EcdsaPublicKey *pub, const char *label,
544  struct GNUNET_HashCode *query);
545 
546 
556 struct GNUNET_GNSRECORD_Block *
559  const char *label,
560  const struct GNUNET_GNSRECORD_Data *rd,
561  unsigned int rd_count);
562 
563 
575 struct GNUNET_GNSRECORD_Block *
578  const char *label,
579  const struct GNUNET_GNSRECORD_Data *rd,
580  unsigned int rd_count);
581 
582 
590 int
592 
593 
605 int
607  const struct GNUNET_GNSRECORD_Block *block,
608  const struct GNUNET_CRYPTO_EcdsaPublicKey *zone_key, const char *label,
609  GNUNET_GNSRECORD_RecordCallback proc, void *proc_cls);
610 
611 
619 int
621  const struct GNUNET_GNSRECORD_Data *b);
622 
623 
635  unsigned int rd_count, const struct GNUNET_GNSRECORD_Data *rd);
636 
637 
638 #if 0 /* keep Emacsens' auto-indent happy */
639 {
640 #endif
641 #ifdef __cplusplus
642 }
643 #endif
644 
645 #endif
646  /* end of group */
GNUNET_NETWORK_STRUCT_END 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.
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.
struct GNUNET_GNSRECORD_Block * GNUNET_GNSRECORD_block_create(const struct GNUNET_CRYPTO_EcdsaPrivateKey *key, struct GNUNET_TIME_Absolute expire, const char *label, const struct GNUNET_GNSRECORD_Data *rd, unsigned int rd_count)
Sign name and records.
uint32_t purpose
What does this signature vouch for? This must contain a GNUNET_SIGNATURE_PURPOSE_XXX constant (from g...
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:204
struct GNUNET_GNSRECORD_Block * GNUNET_GNSRECORD_block_create2(const struct GNUNET_CRYPTO_EcdsaPrivateKey *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...
int GNUNET_GNSRECORD_zkey_to_pkey(const char *zkey, struct GNUNET_CRYPTO_EcdsaPublicKey *pkey)
Convert an absolute domain name to the respective public key.
This is a supplemental record.
size_t data_size
Number of bytes in data.
Private ECC key encoded for transmission.
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.
Information we have in an encrypted block with record data (i.e.
Time for absolute time used by GNUnet, in microseconds and in network byte order. ...
#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.
void GNUNET_GNSRECORD_query_from_private_key(const struct GNUNET_CRYPTO_EcdsaPrivateKey *zone, const char *label, struct GNUNET_HashCode *query)
Calculate the DHT query for a given label in a given zone.
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.
uint64_t expiration_time
Expiration time for the DNS record.
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:175
static char * expiration
Credential TTL.
Definition: gnunet-abd.c:96
const char * GNUNET_GNSRECORD_z2s(const struct GNUNET_CRYPTO_EcdsaPublicKey *z)
Convert a zone to a string (for printing debug messages).
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.
const char * GNUNET_GNSRECORD_pkey_to_zkey(const struct GNUNET_CRYPTO_EcdsaPublicKey *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).
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:39
int GNUNET_GNSRECORD_block_decrypt(const struct GNUNET_GNSRECORD_Block *block, const struct GNUNET_CRYPTO_EcdsaPublicKey *zone_key, const char *label, GNUNET_GNSRECORD_RecordCallback proc, void *proc_cls)
Decrypt block.
Public ECC key (always for Curve25519) encoded in a format suitable for network transmission and ECDS...
Data stored in a PLACE record.
enum GNUNET_TESTBED_UnderlayLinkModelType type
the type of this model
Time for absolute times used by GNUnet, in microseconds.
GNUNET_GNSRECORD_Flags
Flags that can be set for a record.
void GNUNET_GNSRECORD_query_from_public_key(const struct GNUNET_CRYPTO_EcdsaPublicKey *pub, const char *label, struct GNUNET_HashCode *query)
Calculate the DHT query for a given label in a given zone.
enum GNUNET_GNSRECORD_Flags flags
Flags for the record.
This expiration time of the record is a relative time (not an absolute time).
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:143
const char * GNUNET_GNSRECORD_number_to_typename(uint32_t type)
Convert a type number (i.e.
Definition: gnsrecord.c:231
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...
Public ECC key (always for curve Ed25519) encoded in a format suitable for network transmission and E...