GNUnet 0.22.2
did_core.c File Reference

Core functionality for DID. More...

#include "did_core.h"
Include dependency graph for did_core.c:

Go to the source code of this file.

Data Structures

struct  DID_resolve_return
 
struct  DID_action_return
 
struct  DID_create_namestore_lookup_closure
 

Functions

static void DID_resolve_gns_lookup_cb (void *cls, uint32_t rd_count, const struct GNUNET_GNSRECORD_Data *rd)
 GNS lookup callback. More...
 
enum GNUNET_GenericReturnValue DID_resolve (const char *did, struct GNUNET_GNS_Handle *gns_handle, DID_resolve_callback *cont, void *cls)
 Resolve a DID. More...
 
static void DID_create_did_store_cb (void *cls, enum GNUNET_ErrorCode ec)
 
static void DID_create_namestore_lookup_cb (void *cls, const struct GNUNET_CRYPTO_PrivateKey *zone, const char *label, unsigned int rd_count, const struct GNUNET_GNSRECORD_Data *rd)
 
enum GNUNET_GenericReturnValue DID_create (const struct GNUNET_IDENTITY_Ego *ego, const char *did_document, const struct GNUNET_TIME_Relative *expire_time, struct GNUNET_NAMESTORE_Handle *namestore_handle, DID_action_callback *cont, void *cls)
 Creates a DID and saves DID Document in Namestore. More...
 

Detailed Description

Core functionality for DID.

Author
Tristan Schwieren

Definition in file did_core.c.

Function Documentation

◆ DID_resolve_gns_lookup_cb()

static void DID_resolve_gns_lookup_cb ( void *  cls,
uint32_t  rd_count,
const struct GNUNET_GNSRECORD_Data rd 
)
static

GNS lookup callback.

Calls the given callback function and gives it the DID Document. Fails if there is more than one DID record.

Parameters
clsclosure
rd_countnumber of records in rd
rdthe records in the reply

Definition at line 58 of file did_core.c.

62{
63 char *did_document;
64 DID_resolve_callback *cb = ((struct DID_resolve_return *) cls)->cb;
65 void *cls_did_resolve_cb = ((struct DID_resolve_return *) cls)->cls;
66 free (cls);
67
68 for (int i = 0; i < rd_count; i++)
69 {
70 if (rd[i].record_type != GNUNET_GNSRECORD_TYPE_DID_DOCUMENT)
71 continue;
72 did_document = (char *) rd[i].data;
73 cb (GNUNET_OK, did_document, cls_did_resolve_cb);
74 return;
75 }
76 cb (GNUNET_NO, "DID Document is not a DID_DOCUMENT record\n",
77 cls_did_resolve_cb);
78}
void DID_resolve_callback(enum GNUNET_GenericReturnValue status, const char *did_document, void *cls)
Signature of a callback function that is called after a did has been resolved.
Definition: did_core.h:50
static char * data
The data to insert into the dht.
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.
@ GNUNET_OK
@ GNUNET_NO
#define GNUNET_GNSRECORD_TYPE_DID_DOCUMENT
Record type to store DID Documents.
DID_resolve_callback * cb
Definition: did_core.c:34

References DID_resolve_return::cb, DID_resolve_return::cls, data, GNUNET_GNSRECORD_TYPE_DID_DOCUMENT, GNUNET_NO, GNUNET_OK, rd, and rd_count.

Referenced by DID_resolve().

Here is the caller graph for this function:

◆ DID_resolve()

enum GNUNET_GenericReturnValue DID_resolve ( const char *  did,
struct GNUNET_GNS_Handle gns_handle,
DID_resolve_callback cont,
void *  cls 
)

Resolve a DID.

Calls the given callback function with the resolved DID Document and the given closure. If the did can not be resolved did_document is NULL.

Parameters
didDID that is resolve

Definition at line 89 of file did_core.c.

93{
95 struct DID_resolve_return *cls_gns_lookup_cb;
96
97 // did, gns_handle and cont must me set
98 if ((did == NULL) || (gns_handle == NULL) || (cont == NULL))
99 return GNUNET_NO;
100
102 return GNUNET_NO;
103
104 // Create closure for lookup callback
105 cls_gns_lookup_cb = GNUNET_malloc (sizeof(struct DID_resolve_return));
106 cls_gns_lookup_cb->cb = cont;
107 cls_gns_lookup_cb->cls = cls;
108
111 &pkey,
115 cls_gns_lookup_cb);
116
117 return GNUNET_OK;
118}
static void DID_resolve_gns_lookup_cb(void *cls, uint32_t rd_count, const struct GNUNET_GNSRECORD_Data *rd)
GNS lookup callback.
Definition: did_core.c:58
#define DID_DOCUMENT_LABEL
Definition: did_core.h:37
enum GNUNET_GenericReturnValue DID_did_to_pkey(const char *did, struct GNUNET_CRYPTO_PublicKey *pkey)
Return the public key of a DID.
Definition: did_helper.c:79
static struct GNUNET_GNS_Handle * gns_handle
Definition: gnunet-did.c:102
static char * did
DID Attribute String.
Definition: gnunet-did.c:82
static char * pkey
Public key of the zone to look in, in ASCII.
struct GNUNET_GNS_LookupRequest * GNUNET_GNS_lookup(struct GNUNET_GNS_Handle *handle, const char *name, const struct GNUNET_CRYPTO_PublicKey *zone, uint32_t type, enum GNUNET_GNS_LocalOptions options, GNUNET_GNS_LookupResultProcessor proc, void *proc_cls)
Perform an asynchronous lookup operation on the GNS.
Definition: gns_api.c:421
@ GNUNET_GNS_LO_DEFAULT
Defaults, look in cache, then in DHT.
#define GNUNET_malloc(size)
Wrapper around malloc.
An identity key as per LSD0001.

References DID_resolve_return::cb, DID_resolve_return::cls, did, DID_did_to_pkey(), DID_DOCUMENT_LABEL, DID_resolve_gns_lookup_cb(), gns_handle, GNUNET_GNS_LO_DEFAULT, GNUNET_GNS_lookup(), GNUNET_GNSRECORD_TYPE_DID_DOCUMENT, GNUNET_malloc, GNUNET_NO, GNUNET_OK, and pkey.

Referenced by resolve_did().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ DID_create_did_store_cb()

static void DID_create_did_store_cb ( void *  cls,
enum GNUNET_ErrorCode  ec 
)
static

Definition at line 126 of file did_core.c.

128{
129 DID_action_callback *cb = ((struct DID_action_return *) cls)->cb;
130 void *cls_did_create_cb = ((struct DID_action_return *) cls)->cls;
131 free (cls);
132
133 if (GNUNET_EC_NONE == ec)
134 {
135 cb (GNUNET_OK, (void *) cls_did_create_cb);
136 }
137 else
138 {
139 // TODO: Log emsg. Not writing it to STDOUT
140 printf ("%s\n", GNUNET_ErrorCode_get_hint (ec));
141 cb (GNUNET_NO, (void *) cls_did_create_cb);
142 }
143}
void DID_action_callback(enum GNUNET_GenericReturnValue status, void *cls)
Signature of a callback function that is called after a did has been removed status = 0 if action was...
Definition: did_core.h:62
const char * GNUNET_ErrorCode_get_hint(enum GNUNET_ErrorCode ec)
Returns a hint for a given error code.
@ GNUNET_EC_NONE
No error (success).
DID_action_callback * cb
Definition: did_core.c:40

References DID_resolve_return::cb, DID_action_return::cb, DID_action_return::cls, GNUNET_EC_NONE, GNUNET_ErrorCode_get_hint(), GNUNET_NO, and GNUNET_OK.

Referenced by DID_create_namestore_lookup_cb().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ DID_create_namestore_lookup_cb()

static void DID_create_namestore_lookup_cb ( void *  cls,
const struct GNUNET_CRYPTO_PrivateKey zone,
const char *  label,
unsigned int  rd_count,
const struct GNUNET_GNSRECORD_Data rd 
)
static

Definition at line 155 of file did_core.c.

161{
162 struct GNUNET_GNSRECORD_Data record_data;
164
165 const char *did_document
166 = ((struct DID_create_namestore_lookup_closure *) cls)->did_document;
167
168 const struct GNUNET_TIME_Relative expire_time
169 = ((struct DID_create_namestore_lookup_closure *) cls)->expire_time;
170
172 = ((struct DID_create_namestore_lookup_closure *) cls)->namestore_handle;
173
174 struct DID_action_return *cls_record_store_cb
175 = ((struct DID_create_namestore_lookup_closure *) cls)->ret;
176
177 free (cls);
178
179 if (rd_count > 0)
180 {
181 printf ("Ego already has a DID Document. Abort.\n");
182 cls_record_store_cb->cb (GNUNET_NO, cls_record_store_cb->cls);
183 }
184 else
185 {
186 // Get public key
188
189 // If no DID Document is given a default one is created
190 if (did_document != NULL)
191 printf (
192 "DID Document is read from \"DID-document\" argument (EXPERIMENTAL)\n");
193 else
195
196 // Create record
197 record_data.data = did_document;
198 record_data.expiration_time = expire_time.rel_value_us;
199 record_data.data_size = strlen (did_document) + 1;
200 record_data.record_type = GNUNET_GNSRECORD_typename_to_number ("TXT"),
201 record_data.flags = GNUNET_GNSRECORD_RF_RELATIVE_EXPIRATION;
202
203 // Store record
205 zone,
207 1, // FIXME what if GNUNET_GNS_EMPTY_LABEL_AT has records
208 &record_data,
210 (void *) cls_record_store_cb);
211 }
212}
static void DID_create_did_store_cb(void *cls, enum GNUNET_ErrorCode ec)
Definition: did_core.c:126
char * DID_pkey_to_did_document(struct GNUNET_CRYPTO_PublicKey *pkey)
Create a did generate did object.
Definition: did_helper.c:129
static struct GNUNET_NAMESTORE_Handle * namestore_handle
Definition: gnunet-did.c:107
uint32_t GNUNET_GNSRECORD_typename_to_number(const char *dns_typename)
Convert a type name (e.g.
Definition: gnsrecord.c:192
@ GNUNET_GNSRECORD_RF_RELATIVE_EXPIRATION
This expiration time of the record is a relative time (not an absolute time).
enum GNUNET_GenericReturnValue GNUNET_CRYPTO_key_get_public(const struct GNUNET_CRYPTO_PrivateKey *privkey, struct GNUNET_CRYPTO_PublicKey *key)
Retrieves the public key representation of a private key.
Definition: crypto_pkey.c:430
struct GNUNET_NAMESTORE_QueueEntry * GNUNET_NAMESTORE_record_set_store(struct GNUNET_NAMESTORE_Handle *h, const struct GNUNET_CRYPTO_PrivateKey *pkey, const char *label, unsigned int rd_count, const struct GNUNET_GNSRECORD_Data *rd, GNUNET_NAMESTORE_ContinuationWithStatus cont, void *cont_cls)
Store an item in the namestore.
struct GNUNET_TIME_Relative expire_time
Definition: did_core.c:149
Connection to the NAMESTORE service.
Time for relative time used by GNUnet, in microseconds.
uint64_t rel_value_us
The actual value.

References DID_action_return::cb, DID_action_return::cls, GNUNET_GNSRECORD_Data::data, GNUNET_GNSRECORD_Data::data_size, DID_create_did_store_cb(), DID_create_namestore_lookup_closure::did_document, DID_DOCUMENT_LABEL, DID_pkey_to_did_document(), GNUNET_GNSRECORD_Data::expiration_time, DID_create_namestore_lookup_closure::expire_time, GNUNET_GNSRECORD_Data::flags, GNUNET_CRYPTO_key_get_public(), GNUNET_GNSRECORD_RF_RELATIVE_EXPIRATION, GNUNET_GNSRECORD_typename_to_number(), GNUNET_NAMESTORE_record_set_store(), GNUNET_NO, namestore_handle, pkey, rd_count, GNUNET_GNSRECORD_Data::record_type, and GNUNET_TIME_Relative::rel_value_us.

Referenced by DID_create().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ DID_create()

enum GNUNET_GenericReturnValue DID_create ( const struct GNUNET_IDENTITY_Ego ego,
const char *  did_document,
const struct GNUNET_TIME_Relative expire_time,
struct GNUNET_NAMESTORE_Handle namestore_handle,
DID_action_callback cont,
void *  cls 
)

Creates a DID and saves DID Document in Namestore.

Parameters
egoego for which the DID should be created.
did_documentdid_document that should be saved in namestore. If did_document==NULL -> Default DID document is created.
namestore_handle
contcallback function
clsclosure

Definition at line 226 of file did_core.c.

232{
234 struct DID_create_namestore_lookup_closure *cls_name_store_lookup_cb;
235
236 // Ego, namestore_handle and cont must be set
237 if ((ego == NULL) || (namestore_handle == NULL) || (cont == NULL))
238 return GNUNET_NO;
239
240 // Check if ego has EdDSA key
242 &pkey);
243 if (ntohl (pkey.type) != GNUNET_GNSRECORD_TYPE_EDKEY)
244 {
245 printf ("The EGO has to have an EdDSA key pair\n");
246 return GNUNET_NO;
247 }
248
249 cls_name_store_lookup_cb = GNUNET_malloc (sizeof(struct DID_create_namestore_lookup_closure));
250 cls_name_store_lookup_cb->ret = GNUNET_malloc (sizeof(struct DID_action_return));
251 cls_name_store_lookup_cb->ret->cb = cont;
252 cls_name_store_lookup_cb->ret->cls = cls;
253 cls_name_store_lookup_cb->did_document = did_document;
254 cls_name_store_lookup_cb->expire_time = (*expire_time);
255 cls_name_store_lookup_cb->namestore_handle = namestore_handle;
256
257 // Check if ego already has a DID Document
261 NULL,
262 NULL,
264 (void *) cls_name_store_lookup_cb);
265
266 return GNUNET_OK;
267}
static void DID_create_namestore_lookup_cb(void *cls, const struct GNUNET_CRYPTO_PrivateKey *zone, const char *label, unsigned int rd_count, const struct GNUNET_GNSRECORD_Data *rd)
Definition: did_core.c:155
const struct GNUNET_CRYPTO_PrivateKey * GNUNET_IDENTITY_ego_get_private_key(const struct GNUNET_IDENTITY_Ego *ego)
Obtain the ECC key associated with a ego.
Definition: identity_api.c:517
void GNUNET_IDENTITY_ego_get_public_key(struct GNUNET_IDENTITY_Ego *ego, struct GNUNET_CRYPTO_PublicKey *pk)
Get the identifier (public key) of an ego.
Definition: identity_api.c:529
struct GNUNET_NAMESTORE_QueueEntry * GNUNET_NAMESTORE_records_lookup(struct GNUNET_NAMESTORE_Handle *h, const struct GNUNET_CRYPTO_PrivateKey *pkey, const char *label, GNUNET_SCHEDULER_TaskCallback error_cb, void *error_cb_cls, GNUNET_NAMESTORE_RecordMonitor rm, void *rm_cls)
Lookup an item in the namestore.
#define GNUNET_GNSRECORD_TYPE_EDKEY
GNS zone delegation (EDKEY)
struct GNUNET_NAMESTORE_Handle * namestore_handle
Definition: did_core.c:150
struct DID_action_return * ret
Definition: did_core.c:151
Handle for an ego.
Definition: identity.h:37

References DID_action_return::cb, DID_action_return::cls, DID_create_namestore_lookup_cb(), DID_create_namestore_lookup_closure::did_document, DID_DOCUMENT_LABEL, DID_create_namestore_lookup_closure::expire_time, GNUNET_GNSRECORD_TYPE_EDKEY, GNUNET_IDENTITY_ego_get_private_key(), GNUNET_IDENTITY_ego_get_public_key(), GNUNET_malloc, GNUNET_NAMESTORE_records_lookup(), GNUNET_NO, GNUNET_OK, namestore_handle, DID_create_namestore_lookup_closure::namestore_handle, pkey, and DID_create_namestore_lookup_closure::ret.

Referenced by create_did_ego_lockup_cb().

Here is the call graph for this function:
Here is the caller graph for this function: