GNUnet 0.27.0
 
Loading...
Searching...
No Matches
pils_api.c File Reference
#include <string.h>
#include <stdint.h>
#include "gnunet_common.h"
#include "gnunet_protocols.h"
#include "gnunet_signatures.h"
#include "gnunet_util_lib.h"
#include "gnunet_hello_uri_lib.h"
#include "gnunet_pils_service.h"
#include "pils.h"
Include dependency graph for pils_api.c:

Go to the source code of this file.

Data Structures

struct  GNUNET_PILS_Operation
 
struct  GNUNET_PILS_Handle
 A handle for the PILS service. More...
 
struct  GNUNET_PILS_KeyRing
 A simplified handle for using the peer identity key. More...
 

Macros

#define LOG(kind, ...)   GNUNET_log_from (kind, "pils-api", __VA_ARGS__)
 

Functions

static struct GNUNET_PILS_Operationfind_op (struct GNUNET_PILS_Handle *h, uint32_t rid)
 Find the op that matches the rid.
 
static int check_peer_id (void *cls, const struct PeerIdUpdateMessage *msg)
 Handles sign result.
 
static void handle_peer_id (void *cls, const struct PeerIdUpdateMessage *pid_msg)
 Handles peer ids sent from the service.
 
static void handle_sign_result (void *cls, const struct SignResultMessage *msg)
 Handles sign result.
 
static void handle_decaps_result (void *cls, const struct DecapsResultMessage *msg)
 Handles decaps result.
 
static void handle_ecdh_result (void *cls, const struct EcdhResultMessage *msg)
 Handles ecdh result.
 
static void reconnect (void *cls)
 Try again to connect to peer identity lifecycle service.
 
static void mq_error_handler (void *cls, enum GNUNET_MQ_Error error)
 Handles errors with the mq.
 
struct GNUNET_PILS_HandleGNUNET_PILS_connect (const struct GNUNET_CONFIGURATION_Handle *cfg, GNUNET_PILS_PidChangeCallback pid_change_cb, void *cls)
 Connect to the PILS service.
 
void GNUNET_PILS_disconnect (struct GNUNET_PILS_Handle *handle)
 Disconnect from the PILS service.
 
struct GNUNET_PILS_OperationGNUNET_PILS_sign_by_peer_identity (struct GNUNET_PILS_Handle *handle, const struct GNUNET_CRYPTO_SignaturePurpose *purpose, GNUNET_PILS_SignResultCallback cb, void *cb_cls)
 Sign data with the peer id.
 
struct GNUNET_PILS_OperationGNUNET_PILS_kem_decaps (struct GNUNET_PILS_Handle *handle, const struct GNUNET_CRYPTO_HpkeEncapsulation *c, GNUNET_PILS_DecapsResultCallback cb, void *cb_cls)
 Decaps an encapsulated key with our private key.
 
struct GNUNET_PILS_OperationGNUNET_PILS_ecdh (struct GNUNET_PILS_Handle *handle, const struct GNUNET_CRYPTO_EcdhePublicKey *pub, GNUNET_PILS_EcdhResultCallback cb, void *cb_cls)
 Derive key material from a ECDH public key and our private key.
 
void GNUNET_PILS_cancel (struct GNUNET_PILS_Operation *op)
 Cancel request.
 
void GNUNET_PILS_derive_pid (size_t seed_key_bytes, const uint8_t seed_key[seed_key_bytes], const struct GNUNET_HashCode *addrs_hash, struct GNUNET_CRYPTO_EddsaPrivateKey *outkey)
 Generate the peer id from the addresses hash and the initial secret key.
 
void GNUNET_PILS_feed_addresses (struct GNUNET_PILS_Handle *handle, const struct GNUNET_HELLO_Builder *builder)
 Feed a set of addresses to pils so that it will generate a new peer id based on the given set of addresses.
 
struct GNUNET_PILS_OperationGNUNET_PILS_sign_hello (struct GNUNET_PILS_Handle *handle, const struct GNUNET_HELLO_Builder *builder, struct GNUNET_TIME_Absolute et, GNUNET_PILS_SignResultCallback cb, void *cb_cls)
 Create HELLO signature.
 
const struct GNUNET_PeerIdentityGNUNET_PILS_get_identity (const struct GNUNET_PILS_Handle *handle)
 Return the current peer identity of a given handle.
 
const struct GNUNET_HashCodeGNUNET_PILS_get_identity_hash (const struct GNUNET_PILS_Handle *handle)
 Return the hash of the current peer identity from a given handle.
 
void pid_change_cb (void *cls, const struct GNUNET_HELLO_Parser *parser, const struct GNUNET_HashCode *addr_hash)
 
struct GNUNET_PILS_KeyRingGNUNET_PILS_create_key_ring (const struct GNUNET_CONFIGURATION_Handle *cfg, GNUNET_SCHEDULER_TaskCallback init_cb, void *cls)
 Get the initial secret key for generating the peer id.
 
void GNUNET_PILS_destroy_key_ring (struct GNUNET_PILS_KeyRing *key_ring)
 Destroy a key ring handle and free its memory.
 
const struct GNUNET_CRYPTO_EddsaPrivateKeyGNUNET_PILS_key_ring_get_private_key (const struct GNUNET_PILS_KeyRing *key_ring)
 Return the current private key of a given key ring handle.
 

Detailed Description

Author
ch3

Peer Identity Lifecycle Service; the API for managing Peer Identities

This api gives access to the PILS service.

The service maintains the peer identity. On address change it generates a new identity and informs subscribed components. It also signs data with the identity on request.

Definition in file pils_api.c.

Macro Definition Documentation

◆ LOG

#define LOG (   kind,
  ... 
)    GNUNET_log_from (kind, "pils-api", __VA_ARGS__)

Definition at line 44 of file pils_api.c.

Function Documentation

◆ find_op()

static struct GNUNET_PILS_Operation * find_op ( struct GNUNET_PILS_Handle h,
uint32_t  rid 
)
static

Find the op that matches the rid.

Parameters
hPILS handle
ridid to look up
Returns
NULL if rid was not found

Definition at line 177 of file pils_api.c.

178{
180
181 for (op = h->op_head; op != NULL; op = op->next)
182 if (op->op_id == rid)
183 return op;
185 "Finding request with id %u was unsuccessful\n",
186 rid);
187 return NULL;
188}
static struct GNUNET_ARM_Operation * op
Current operation.
Definition gnunet-arm.c:143
static struct GNUNET_ARM_Handle * h
Connection with ARM.
Definition gnunet-arm.c:98
@ GNUNET_ERROR_TYPE_WARNING
#define LOG(kind,...)
Definition pils_api.c:44
struct GNUNET_ARM_Operation * next
This is a doubly-linked list.
Definition arm_api.c:45

References GNUNET_ERROR_TYPE_WARNING, h, LOG, GNUNET_ARM_Operation::next, and op.

Referenced by handle_decaps_result(), handle_ecdh_result(), and handle_sign_result().

Here is the caller graph for this function:

◆ check_peer_id()

static int check_peer_id ( void *  cls,
const struct PeerIdUpdateMessage msg 
)
static

Handles sign result.

Parameters
clsclosure - Handle to the PILS service
msgthe message containing the signature

Definition at line 198 of file pils_api.c.

199{
200 size_t msg_size;
201 uint32_t block_bytes;
202 (void) cls;
203
204 msg_size = ntohs (msg->header.size);
205 block_bytes = ntohl (msg->block_len);
206 if (msg_size != sizeof (*msg) + block_bytes)
207 {
209 "The msg_size (%lu) is not %lu (header) + %u (block)\n",
210 msg_size,
211 sizeof (*msg),
212 block_bytes);
213 return GNUNET_SYSERR;
214 }
215 return GNUNET_OK;
216
217}
struct GNUNET_MessageHeader * msg
Definition 005.c:2
uint16_t size
The length of the struct (in bytes, including the length field itself), in big-endian format.
@ GNUNET_OK
@ GNUNET_SYSERR
@ GNUNET_ERROR_TYPE_ERROR

References GNUNET_ERROR_TYPE_ERROR, GNUNET_OK, GNUNET_SYSERR, LOG, msg, and GNUNET_MessageHeader::size.

◆ handle_peer_id()

static void handle_peer_id ( void *  cls,
const struct PeerIdUpdateMessage pid_msg 
)
static

Handles peer ids sent from the service.

Parameters
clsclosure - Handle to the PILS service
pid_msgthe message containing peer id and addresses hash

Definition at line 227 of file pils_api.c.

228{
229 struct GNUNET_PILS_Handle *h = cls;
231 uint32_t block_bytes;
232
233 h->reconnect_delay = GNUNET_TIME_UNIT_ZERO;
234 block_bytes = ntohl (pid_msg->block_len);
236 block_bytes);
237 if (NULL == parser)
238 {
240 "Error parsing Hello block from PILS!\n");
241 return;
242 }
243
244 if (NULL == h->peer_id)
245 h->peer_id = GNUNET_new (struct GNUNET_PeerIdentity);
246
247 memcpy (&h->hash, &pid_msg->hash, sizeof (struct GNUNET_HashCode));
248 memcpy (h->peer_id, GNUNET_HELLO_parser_get_id (parser),
249 sizeof (struct GNUNET_PeerIdentity));
250 GNUNET_CRYPTO_hash (h->peer_id, sizeof (struct GNUNET_PeerIdentity),
251 &h->peer_hash);
252
253 if (NULL != h->pid_change_cb)
254 {
255 h->pid_change_cb (h->pid_change_cb_cls,
256 parser,
257 &pid_msg->hash);
258 }
260}
void GNUNET_CRYPTO_hash(const void *block, size_t size, struct GNUNET_HashCode *ret)
Compute hash of a given block.
Definition crypto_hash.c:41
void GNUNET_HELLO_parser_free(struct GNUNET_HELLO_Parser *parser)
Release resources of a builder.
Definition hello-uri.c:380
const struct GNUNET_PeerIdentity * GNUNET_HELLO_parser_get_id(const struct GNUNET_HELLO_Parser *parser)
Get the PeerIdentity for this builder.
Definition hello-uri.c:354
struct GNUNET_HELLO_Parser * GNUNET_HELLO_parser_from_block(const void *block, size_t block_size)
Parse block.
Definition hello-uri.c:560
#define GNUNET_new(type)
Allocate a struct or union of the given type.
#define GNUNET_TIME_UNIT_ZERO
Relative time zero.
Context for parsing HELLOs.
Definition hello-uri.c:233
A 512-bit hashcode.
A handle for the PILS service.
Definition pils_api.c:82
The identity of the host (wraps the signing key of the peer).
struct GNUNET_HashCode hash
The hash from which the peer id was generated.
Definition pils.h:49
uint32_t block_len
Length of the HELLO block in bytes.
Definition pils.h:54

References PeerIdUpdateMessage::block_len, GNUNET_CRYPTO_hash(), GNUNET_ERROR_TYPE_ERROR, GNUNET_HELLO_parser_free(), GNUNET_HELLO_parser_from_block(), GNUNET_HELLO_parser_get_id(), GNUNET_new, GNUNET_TIME_UNIT_ZERO, h, PeerIdUpdateMessage::hash, and LOG.

Here is the call graph for this function:

◆ handle_sign_result()

static void handle_sign_result ( void *  cls,
const struct SignResultMessage msg 
)
static

Handles sign result.

Parameters
clsclosure - Handle to the PILS service
msgthe message containing the signature

Definition at line 270 of file pils_api.c.

271{
272 struct GNUNET_PILS_Handle *h = cls;
274
275 h->reconnect_delay = GNUNET_TIME_UNIT_ZERO;
276 op = find_op (h, ntohl (msg->rid));
277
279 "Received SIGN_RESULT message from service\n");
280
281 if (NULL == op)
282 {
284 "Didn't find the operation corresponding to id %u\n",
285 ntohl (msg->rid));
286 return;
287 }
288 if (NULL != op->sign_cb)
289 {
290 // FIXME maybe return NULL of key is 0ed
291 // as this indicates an error
292 op->sign_cb (op->cb_cls,
293 &msg->peer_id,
294 &msg->sig);
295 }
297 h->op_tail,
298 op);
299 GNUNET_free (op);
300}
#define GNUNET_CONTAINER_DLL_remove(head, tail, element)
Remove an element from a DLL.
@ GNUNET_ERROR_TYPE_DEBUG
#define GNUNET_free(ptr)
Wrapper around free.
static struct GNUNET_PILS_Operation * find_op(struct GNUNET_PILS_Handle *h, uint32_t rid)
Find the op that matches the rid.
Definition pils_api.c:177

References find_op(), GNUNET_CONTAINER_DLL_remove, GNUNET_ERROR_TYPE_DEBUG, GNUNET_ERROR_TYPE_WARNING, GNUNET_free, GNUNET_TIME_UNIT_ZERO, h, LOG, msg, and op.

Here is the call graph for this function:

◆ handle_decaps_result()

static void handle_decaps_result ( void *  cls,
const struct DecapsResultMessage msg 
)
static

Handles decaps result.

Parameters
clsclosure - Handle to the PILS service
msgthe message containing the decapsulation result

Definition at line 310 of file pils_api.c.

311{
312 struct GNUNET_PILS_Handle *h = cls;
314
316 "Received KEM_DECAPS result from service!\n");
317
318 h->reconnect_delay = GNUNET_TIME_UNIT_ZERO;
319 op = find_op (h, ntohl (msg->rid));
320
321 if (NULL == op)
322 {
324 "Didn't find the operation corresponding to id %u\n",
325 ntohl (msg->rid));
326 return;
327 }
328 if (NULL != op->decaps_cb)
329 {
330 // FIXME maybe return NULL of key is 0ed
331 // as this indicates an error
332 op->decaps_cb (op->cb_cls,
333 &msg->key);
334 }
336 h->op_tail,
337 op);
338 GNUNET_free (op);
339}

References find_op(), GNUNET_CONTAINER_DLL_remove, GNUNET_ERROR_TYPE_DEBUG, GNUNET_ERROR_TYPE_WARNING, GNUNET_free, GNUNET_TIME_UNIT_ZERO, h, LOG, msg, and op.

Here is the call graph for this function:

◆ handle_ecdh_result()

static void handle_ecdh_result ( void *  cls,
const struct EcdhResultMessage msg 
)
static

Handles ecdh result.

Parameters
clsclosure - Handle to the PILS service
msgthe message containing the ecdh result

Definition at line 349 of file pils_api.c.

350{
351 struct GNUNET_PILS_Handle *h = cls;
353
355 "Received ECDH result from service!\n");
356
357 h->reconnect_delay = GNUNET_TIME_UNIT_ZERO;
358 op = find_op (h, ntohl (msg->rid));
359
360 if (NULL == op)
361 {
363 "Didn't find the operation corresponding to id %u\n",
364 ntohl (msg->rid));
365 return;
366 }
367 if (NULL != op->ecdh_cb)
368 op->ecdh_cb (op->cb_cls,
369 &msg->key);
371 h->op_tail,
372 op);
373 GNUNET_free (op);
374}

References find_op(), GNUNET_CONTAINER_DLL_remove, GNUNET_ERROR_TYPE_DEBUG, GNUNET_ERROR_TYPE_WARNING, GNUNET_free, GNUNET_TIME_UNIT_ZERO, h, LOG, msg, and op.

Here is the call graph for this function:

◆ reconnect()

static void reconnect ( void *  cls)
static

Try again to connect to peer identity lifecycle service.

Parameters
clsthe struct GNUNET_PILS_Handle *

Definition at line 416 of file pils_api.c.

417{
418 struct GNUNET_PILS_Handle *h = cls;
422 struct PeerIdUpdateMessage,
423 h),
424 GNUNET_MQ_hd_fixed_size (decaps_result,
426 struct DecapsResultMessage,
427 h),
428 GNUNET_MQ_hd_fixed_size (ecdh_result,
430 struct EcdhResultMessage,
431 h),
432 GNUNET_MQ_hd_fixed_size (sign_result,
434 struct SignResultMessage,
435 h),
437 };
438
439 h->reconnect_task = NULL;
441 "Connecting to peer identity lifecycle service.\n");
442 GNUNET_assert (NULL == h->mq);
444 "pils",
445 handlers,
447 h);
448 if (NULL == h->mq)
449 {
451 "Failed to connect.\n");
452 {
454 GNUNET_SCHEDULER_add_delayed (h->reconnect_delay, &reconnect, h);
455 h->reconnect_delay = GNUNET_TIME_STD_BACKOFF (h->reconnect_delay);
456 }
457 return;
458 }
460 "Connection to service successful!\n");
461}
struct GNUNET_MQ_MessageHandlers handlers[]
Definition 003.c:1
static char * peer_id
Option –peer.
struct GNUNET_MQ_Handle * GNUNET_CLIENT_connect(const struct GNUNET_CONFIGURATION_Handle *cfg, const char *service_name, const struct GNUNET_MQ_MessageHandler *handlers, GNUNET_MQ_ErrorHandler error_handler, void *error_handler_cls)
Create a message queue to connect to a GNUnet service.
Definition client.c:1060
#define GNUNET_assert(cond)
Use this for fatal errors that cannot be handled.
#define GNUNET_MQ_handler_end()
End-marker for the handlers array.
#define GNUNET_MQ_hd_var_size(name, code, str, ctx)
#define GNUNET_MQ_hd_fixed_size(name, code, str, ctx)
#define GNUNET_MESSAGE_TYPE_PILS_ECDH_RESULT
Ecdh result.
#define GNUNET_MESSAGE_TYPE_PILS_DECAPS_RESULT
Decaps result.
#define GNUNET_MESSAGE_TYPE_PILS_PEER_ID
Message passing the new peer id from the service to the client.
#define GNUNET_MESSAGE_TYPE_PILS_SIGN_RESULT
The service sends the requested signature to the client.
struct GNUNET_SCHEDULER_Task * GNUNET_SCHEDULER_add_delayed(struct GNUNET_TIME_Relative delay, GNUNET_SCHEDULER_TaskCallback task, void *task_cls)
Schedule a new task to be run with a specified delay.
Definition scheduler.c:1283
#define GNUNET_TIME_STD_BACKOFF(r)
Perform our standard exponential back-off calculation, starting at 1 ms and then going by a factor of...
static void mq_error_handler(void *cls, enum GNUNET_MQ_Error error)
Handles errors with the mq.
Definition pils_api.c:394
static void reconnect(void)
Adjust exponential back-off and reconnect to the service.
Message containing the decapsulated key.
Definition pils.h:163
struct GNUNET_MQ_Handle * mq
Our connection to the ARM service.
Definition arm_api.c:107
const struct GNUNET_CONFIGURATION_Handle * cfg
The configuration that we are using.
Definition arm_api.c:112
struct GNUNET_SCHEDULER_Task * reconnect_task
ID of the reconnect task (if any).
Definition arm_api.c:147
Message handler for a specific message type.
Message containing the current peer id and the hash from which it was generated.
Definition pils.h:40
Message containing the signature.
Definition pils.h:220

References GNUNET_ARM_Handle::cfg, GNUNET_assert, GNUNET_CLIENT_connect(), GNUNET_ERROR_TYPE_DEBUG, GNUNET_ERROR_TYPE_ERROR, GNUNET_MESSAGE_TYPE_PILS_DECAPS_RESULT, GNUNET_MESSAGE_TYPE_PILS_ECDH_RESULT, GNUNET_MESSAGE_TYPE_PILS_PEER_ID, GNUNET_MESSAGE_TYPE_PILS_SIGN_RESULT, GNUNET_MQ_handler_end, GNUNET_MQ_hd_fixed_size, GNUNET_MQ_hd_var_size, GNUNET_SCHEDULER_add_delayed(), GNUNET_TIME_STD_BACKOFF, h, handlers, LOG, GNUNET_ARM_Handle::mq, mq_error_handler(), peer_id, reconnect(), and GNUNET_ARM_Handle::reconnect_task.

Here is the call graph for this function:

◆ mq_error_handler()

static void mq_error_handler ( void *  cls,
enum GNUNET_MQ_Error  error 
)
static

Handles errors with the mq.

Schedules the reconnect task and updates the reconnect delay.

Parameters
clsclosure - handle to PILS
errorerror type indicating the kind of problem with mq

Definition at line 394 of file pils_api.c.

395{
396 struct GNUNET_PILS_Handle *h = cls;
397 (void) error;
398
399 // TODO logging
401 "Connection to pils service failed!\n");
403 h->mq = NULL;
405 GNUNET_SCHEDULER_add_delayed (h->reconnect_delay, &reconnect, h);
406 h->reconnect_delay = GNUNET_TIME_STD_BACKOFF (h->reconnect_delay);
407}
void GNUNET_MQ_destroy(struct GNUNET_MQ_Handle *mq)
Destroy the message queue.
Definition mq.c:700

References GNUNET_ERROR_TYPE_WARNING, GNUNET_MQ_destroy(), GNUNET_SCHEDULER_add_delayed(), GNUNET_TIME_STD_BACKOFF, h, LOG, GNUNET_ARM_Handle::mq, reconnect(), and GNUNET_ARM_Handle::reconnect_task.

Referenced by reconnect().

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

◆ GNUNET_PILS_connect()

struct GNUNET_PILS_Handle * GNUNET_PILS_connect ( const struct GNUNET_CONFIGURATION_Handle cfg,
GNUNET_PILS_PidChangeCallback  pid_change_cb,
void *  cls 
)

Connect to the PILS service.

Parameters
cfgconfiguration to use
pid_change_cbhandler/callback called once the peer id changes
clsclosure for pid_change_cb
Returns
Handle to the PILS service

Definition at line 465 of file pils_api.c.

468{
469 struct GNUNET_PILS_Handle *h;
470
472 h->cfg = cfg;
473 h->pid_change_cb = pid_change_cb;
474 h->pid_change_cb_cls = cls;
475 h->reconnect_delay = GNUNET_TIME_UNIT_ZERO;
476 reconnect (h);
477 return h;
478}
static struct GNUNET_CONFIGURATION_Handle * cfg
Our configuration.
Definition gnunet-arm.c:108
void pid_change_cb(void *cls, const struct GNUNET_HELLO_Parser *parser, const struct GNUNET_HashCode *addr_hash)
Definition pils_api.c:748

References cfg, GNUNET_ARM_Handle::cfg, GNUNET_new, GNUNET_TIME_UNIT_ZERO, h, pid_change_cb(), and reconnect().

Referenced by advertise_dns_exit(), create_service(), DHTU_gnunet_init(), GCH_init(), GNUNET_PILS_create_key_ring(), GSC_KX_init(), main_init(), run(), run(), run(), run(), run(), run(), run(), run(), run(), run(), run(), run(), run(), run(), and run().

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

◆ GNUNET_PILS_disconnect()

void GNUNET_PILS_disconnect ( struct GNUNET_PILS_Handle handle)

Disconnect from the PILS service.

Parameters
handlehandle to the PILS service (was returned by GNUNET_PILS_connect)

Definition at line 488 of file pils_api.c.

489{
491
492 GNUNET_assert (NULL != handle);
494 "Disonnecting from peer identity lifecycle service.\n");
495 if (NULL != handle->reconnect_task)
496 {
497 GNUNET_SCHEDULER_cancel (handle->reconnect_task);
498 handle->reconnect_task = NULL;
499 }
500 if (NULL != handle->mq)
501 {
503 handle->mq = NULL;
504 }
505 LOG (GNUNET_ERROR_TYPE_DEBUG, "Cleaning up\n");
506 while (NULL != (op = handle->op_head))
507 {
508 GNUNET_CONTAINER_DLL_remove (handle->op_head, handle->op_tail, op);
509 GNUNET_free (op);
510 }
511 if (handle->peer_id)
512 GNUNET_free (handle->peer_id);
514}
static struct GNUNET_VPN_Handle * handle
Handle to vpn service.
Definition gnunet-vpn.c:35
void * GNUNET_SCHEDULER_cancel(struct GNUNET_SCHEDULER_Task *task)
Cancel the task with the specified identifier.
Definition scheduler.c:986
struct GNUNET_MQ_Handle * mq
Connection to VPN service.
Definition vpn_api.c:44

References GNUNET_assert, GNUNET_CONTAINER_DLL_remove, GNUNET_ERROR_TYPE_DEBUG, GNUNET_free, GNUNET_MQ_destroy(), GNUNET_SCHEDULER_cancel(), handle, LOG, GNUNET_VPN_Handle::mq, and op.

Referenced by cleaning_task(), cleanup(), cleanup_task(), destroy_service(), DHTU_gnunet_done(), do_shutdown(), do_shutdown(), do_shutdown(), do_shutdown(), do_shutdown(), do_shutdown(), do_shutdown(), GCH_shutdown(), GNUNET_PILS_destroy_key_ring(), GSC_KX_done(), run(), shutdown_task(), shutdown_task(), shutdown_task(), shutdown_task(), shutdown_task(), shutdown_task(), and shutdown_task().

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

◆ GNUNET_PILS_sign_by_peer_identity()

struct GNUNET_PILS_Operation * GNUNET_PILS_sign_by_peer_identity ( struct GNUNET_PILS_Handle handle,
const struct GNUNET_CRYPTO_SignaturePurpose purpose,
GNUNET_PILS_SignResultCallback  cb,
void *  cb_cls 
)

Sign data with the peer id.

Parameters
handlehandle to the PILS service
purposewhat to sign (size, purpose and data)
cbcallback to call once the signature is ready
cb_clsclosure to cb
Returns
handle to the operation, NULL on error

Definition at line 528 of file pils_api.c.

534{
536 struct SignRequestMessage *msg;
537
539 op->env = GNUNET_MQ_msg_extra (msg,
540 ntohl (purpose->size),
542 op->h = handle;
543 op->sign_cb = cb;
544 op->cb_cls = cb_cls;
545 msg->rid = htonl (handle->op_id_counter++);
546 op->op_id = ntohl (msg->rid);
547 memcpy (&msg[1], purpose, ntohl (purpose->size));
549 handle->op_tail,
550 op);
551 // FIXME resend?
552 GNUNET_MQ_send (handle->mq, op->env);
553 op->env = NULL;
554 return op;
555}
#define GNUNET_CONTAINER_DLL_insert(head, tail, element)
Insert an element at the head of a DLL.
void GNUNET_MQ_send(struct GNUNET_MQ_Handle *mq, struct GNUNET_MQ_Envelope *ev)
Send a message with the given message queue.
Definition mq.c:305
#define GNUNET_MQ_msg_extra(mvar, esize, type)
Allocate an envelope, with extra space allocated after the space needed by the message struct.
#define GNUNET_MESSAGE_TYPE_PILS_SIGN_REQUEST
The client requests data to be signed with the peer identity.
struct GNUNET_ARM_Handle * h
ARM handle.
Definition arm_api.c:55
uint32_t size
How many bytes does this signature sign? (including this purpose header); in network byte order (!...
Message to request a signature from PILS.
Definition pils.h:248

References GNUNET_CONTAINER_DLL_insert, GNUNET_MESSAGE_TYPE_PILS_SIGN_REQUEST, GNUNET_MQ_msg_extra, GNUNET_MQ_send(), GNUNET_new, GNUNET_ARM_Operation::h, handle, GNUNET_VPN_Handle::mq, msg, op, and GNUNET_CRYPTO_SignaturePurpose::size.

Referenced by do_dht_put(), forward_dv_learn(), GDS_helper_sign_path(), GNUNET_PILS_sign_hello(), handle_validation_challenge(), pils_sign_address(), regex_iterator(), send_create(), sign_ephemeral(), sign_message_by_peer(), start_dv_learn(), and transmit_task_cb().

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

◆ GNUNET_PILS_kem_decaps()

struct GNUNET_PILS_Operation * GNUNET_PILS_kem_decaps ( struct GNUNET_PILS_Handle handle,
const struct GNUNET_CRYPTO_HpkeEncapsulation c,
GNUNET_PILS_DecapsResultCallback  cb,
void *  cb_cls 
)

Decaps an encapsulated key with our private key.

Parameters
handlehandle to the PILS service
cthe encapsulated key
prkwhere to write the key material HKDF-Extract(c||aX)=HKDF-Extract(c||x(aG))
Returns
handle to the operation, NULL on error

Definition at line 568 of file pils_api.c.

572{
574 struct DecapsMessage *msg;
575
578 msg->c = *c;
579 op->h = handle;
580 op->decaps_cb = cb;
581 op->cb_cls = cb_cls;
582 msg->rid = htonl (handle->op_id_counter++);
583 op->op_id = ntohl (msg->rid);
585 handle->op_tail,
586 op);
587 // FIXME resend?
588 GNUNET_MQ_send (handle->mq, op->env);
589 op->env = NULL;
590 return op;
591}
#define GNUNET_MQ_msg(mvar, type)
Allocate a GNUNET_MQ_Envelope.
#define GNUNET_MESSAGE_TYPE_PILS_KEM_DECAPS
Decaps request.
Message to request a decapsulation from PILS.
Definition pils.h:142
struct GNUNET_CRYPTO_HpkeEncapsulation c
Encapsulation to decapsulate.
Definition pils.h:151

References DecapsMessage::c, GNUNET_CONTAINER_DLL_insert, GNUNET_MESSAGE_TYPE_PILS_KEM_DECAPS, GNUNET_MQ_msg, GNUNET_MQ_send(), GNUNET_new, GNUNET_ARM_Operation::h, handle, GNUNET_VPN_Handle::mq, msg, and op.

Referenced by handle_dv_box(), handle_initiator_hello(), and handle_responder_hello().

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

◆ GNUNET_PILS_ecdh()

struct GNUNET_PILS_Operation * GNUNET_PILS_ecdh ( struct GNUNET_PILS_Handle handle,
const struct GNUNET_CRYPTO_EcdhePublicKey pub,
GNUNET_PILS_EcdhResultCallback  cb,
void *  cb_cls 
)

Derive key material from a ECDH public key and our private key.

Parameters
handlehandle to the PILS service
pubthe public key
cbthe callback to call with the derived key material
cb_clscallback closure
Returns
handle to the operation, NULL on error

Definition at line 595 of file pils_api.c.

599{
601 struct EcdhMessage *msg;
602
603 GNUNET_assert ((handle) && (pub));
604
607 msg->pub = *pub;
608 op->h = handle;
609 op->ecdh_cb = cb;
610 op->cb_cls = cb_cls;
611 msg->rid = htonl (handle->op_id_counter++);
612 op->op_id = ntohl (msg->rid);
614 handle->op_tail,
615 op);
616 GNUNET_MQ_send (handle->mq, op->env);
617 op->env = NULL;
618 return op;
619}
static struct GNUNET_CRYPTO_EddsaPublicKey pub
#define GNUNET_MESSAGE_TYPE_PILS_ECDH
Ecdh request.

References GNUNET_assert, GNUNET_CONTAINER_DLL_insert, GNUNET_MESSAGE_TYPE_PILS_ECDH, GNUNET_MQ_msg, GNUNET_MQ_send(), GNUNET_new, GNUNET_ARM_Operation::h, handle, GNUNET_VPN_Handle::mq, msg, op, and pub.

Referenced by GCT_handle_kx(), and GCT_handle_kx_auth().

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

◆ GNUNET_PILS_cancel()

void GNUNET_PILS_cancel ( struct GNUNET_PILS_Operation op)

Cancel request.

Parameters
opcancel PILS operation

Definition at line 623 of file pils_api.c.

624{
625 struct GNUNET_PILS_Handle *h = op->h;
626
627 GNUNET_CONTAINER_DLL_remove (h->op_head, h->op_tail, op);
628 if (NULL != op->env)
629 GNUNET_MQ_discard (op->env);
630 GNUNET_free (op);
631}
void GNUNET_MQ_discard(struct GNUNET_MQ_Envelope *mqm)
Discard the message queue message, free all allocated resources.
Definition mq.c:285

References GNUNET_CONTAINER_DLL_remove, GNUNET_free, GNUNET_MQ_discard(), h, GNUNET_ARM_Operation::h, and op.

Referenced by cleanup(), cleanup_helper_operation(), destroy_tunnel(), do_dht_put(), do_initial_dht_put(), do_shutdown(), GCC_destroy(), GCH_shutdown(), GCT_handle_kx(), GCT_handle_kx_auth(), GSC_KX_done(), iterate_cancel_signature(), regex_iterator(), send_create(), shutdown_task(), and shutdown_task().

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

◆ GNUNET_PILS_derive_pid()

void GNUNET_PILS_derive_pid ( size_t  seed_key_bytes,
const uint8_t  seed_key[seed_key_bytes],
const struct GNUNET_HashCode addrs_hash,
struct GNUNET_CRYPTO_EddsaPrivateKey outkey 
)

Generate the peer id from the addresses hash and the initial secret key.

Parameters
seed_key_byteslength of the seed key in bytes
seed_keythe initial secret key
addrs_hashthe address to use for derivation
[out]outkeythe (private) peer identity key

Since we should have initial keying material of good quality here, this is effectively a PRF called on the address hash with a uniform random key.

We now expand the PRK to the key size we actually require. FIXME: IF we want to use elligator, we need to find a private key that can actually be used as such. For that, we may want to add a counter to the initial secret key to the above PRF.

Definition at line 635 of file pils_api.c.

639{
640 struct GNUNET_ShortHashCode prk;
641
649 addrs_hash,
650 sizeof *addrs_hash,
651 seed_key,
652 seed_key_bytes));
661 outkey,
662 sizeof *outkey,
663 &prk,
664 GNUNET_CRYPTO_kdf_arg_string ("gnunet-pils-ephemeral-peer-key"));
665}
static uint8_t seed_key[256/8]
enum GNUNET_GenericReturnValue GNUNET_CRYPTO_hkdf_extract(struct GNUNET_ShortHashCode *prk, const void *salt, size_t salt_len, const void *ikm, size_t ikm_len)
HKDF-Extract using SHA256.
#define GNUNET_CRYPTO_hkdf_expand(result, out_len, prk,...)
HKDF-Expand using SHA256.
#define GNUNET_CRYPTO_kdf_arg_string(d)
A 256-bit hashcode.

References GNUNET_assert, GNUNET_CRYPTO_hkdf_expand, GNUNET_CRYPTO_hkdf_extract(), GNUNET_CRYPTO_kdf_arg_string, GNUNET_OK, and seed_key.

Referenced by do_generate_pid(), pid_change_cb(), and run().

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

◆ GNUNET_PILS_feed_addresses()

void GNUNET_PILS_feed_addresses ( struct GNUNET_PILS_Handle handle,
const struct GNUNET_HELLO_Builder addresses_builder 
)

Feed a set of addresses to pils so that it will generate a new peer id based on the given set of addresses.

THIS IS ONLY TO BE CALLED FROM CORE!

The address representation will be canonicalized/sorted by pils before the new peer id is generated.

Parameters
handlethe handle to the PILS service
addresses_builderaddresses to feed as builder

Definition at line 669 of file pils_api.c.

671{
673 struct GNUNET_MQ_Envelope *env;
674 size_t block_bytes;
675
677 // TODO check whether the new hash and the 'current' hash are the same -
678 // nothing to do in that case (directly return the peer id?)
680 block_bytes,
682 msg->block_len = htonl (block_bytes);
684 builder,
685 NULL,
686 NULL,
688 (char*) &msg[1]);
690}
struct GNUNET_MQ_Envelope * env
Definition 005.c:1
static struct HostSet * builder
NULL if we are not currently iterating over peer information.
void GNUNET_HELLO_builder_to_block(const struct GNUNET_HELLO_Builder *builder, const struct GNUNET_PeerIdentity *pid, const struct GNUNET_CRYPTO_EddsaSignature *sig, struct GNUNET_TIME_Absolute expiration_time, char *outbuf)
Generate DHT block from a builder.
Definition hello-uri.c:1280
size_t GNUNET_HELLO_get_builder_to_block_size(const struct GNUNET_HELLO_Builder *builder)
Get projected block size for builder.
Definition hello-uri.c:1348
#define GNUNET_MESSAGE_TYPE_PILS_FEED_ADDRESSES
The client (core) provides new addresses to the service, so the service can generate the new peer id.
struct GNUNET_TIME_Absolute GNUNET_TIME_relative_to_absolute(struct GNUNET_TIME_Relative rel)
Convert relative time to an absolute time in the future.
Definition time.c:316
Message requesting a signature on data with the current peer id.
Definition pils.h:122

References builder, env, GNUNET_HELLO_builder_to_block(), GNUNET_HELLO_get_builder_to_block_size(), GNUNET_MESSAGE_TYPE_PILS_FEED_ADDRESSES, GNUNET_MQ_msg_extra, GNUNET_MQ_send(), GNUNET_TIME_relative_to_absolute(), GNUNET_TIME_UNIT_ZERO, handle, GNUNET_VPN_Handle::mq, and msg.

Referenced by feed_addresses_to_pils().

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

◆ GNUNET_PILS_sign_hello()

struct GNUNET_PILS_Operation * GNUNET_PILS_sign_hello ( struct GNUNET_PILS_Handle handle,
const struct GNUNET_HELLO_Builder builder,
struct GNUNET_TIME_Absolute  et,
GNUNET_PILS_SignResultCallback  cb,
void *  cb_cls 
)

Create HELLO signature.

Parameters
handlehandle to the pils service
builderthe builder to use
etexpiration time to sign
cbcallback to call with the signature
cb_clsclosure to cb

Definition at line 703 of file pils_api.c.

708{
709 struct PilsHelloSignaturePurpose hsp = {
710 .purpose.size = htonl (sizeof (hsp)),
711 .purpose.purpose = htonl (GNUNET_SIGNATURE_PURPOSE_HELLO),
712 .expiration_time = GNUNET_TIME_absolute_hton (et)
713 };
715 &hsp.h_addrs);
717 "Address hash is %s\n",
718 GNUNET_h2s_full (&hsp.h_addrs));
720 &hsp.purpose,
721 cb,
722 cb_cls);
723}
#define GNUNET_SIGNATURE_PURPOSE_HELLO
Signature by which a peer affirms its address.
void GNUNET_HELLO_builder_hash_addresses(const struct GNUNET_HELLO_Builder *builder, struct GNUNET_HashCode *hash)
Compute hash over addresses in builder.
Definition hello-uri.c:1170
#define GNUNET_log(kind,...)
const char * GNUNET_h2s_full(const struct GNUNET_HashCode *hc)
Convert a hash value to a string (for printing debug messages).
struct GNUNET_TIME_AbsoluteNBO GNUNET_TIME_absolute_hton(struct GNUNET_TIME_Absolute a)
Convert absolute time to network byte order.
Definition time.c:636
struct GNUNET_PILS_Operation * GNUNET_PILS_sign_by_peer_identity(struct GNUNET_PILS_Handle *handle, const struct GNUNET_CRYPTO_SignaturePurpose *purpose, GNUNET_PILS_SignResultCallback cb, void *cb_cls)
Sign data with the peer id.
Definition pils_api.c:528
Message signed as part of a HELLO block/URL.
Definition hello-uri.c:51
struct GNUNET_HashCode h_addrs
Hash over all addresses.
Definition hello-uri.c:65
struct GNUNET_CRYPTO_SignaturePurpose purpose
Purpose must be GNUNET_SIGNATURE_PURPOSE_HELLO.
Definition hello-uri.c:55

References builder, GNUNET_ERROR_TYPE_DEBUG, GNUNET_h2s_full(), GNUNET_HELLO_builder_hash_addresses(), GNUNET_log, GNUNET_PILS_sign_by_peer_identity(), GNUNET_SIGNATURE_PURPOSE_HELLO, GNUNET_TIME_absolute_hton(), PilsHelloSignaturePurpose::h_addrs, handle, PilsHelloSignaturePurpose::purpose, and GNUNET_CRYPTO_SignaturePurpose::size.

Referenced by peerstore_store_own_cb(), and pid_changed_cb().

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

◆ GNUNET_PILS_get_identity()

const struct GNUNET_PeerIdentity * GNUNET_PILS_get_identity ( const struct GNUNET_PILS_Handle handle)

Return the current peer identity of a given handle.

Parameters
handlehandle to the pils service
Returns
Peer identity or NULL on failure

Definition at line 727 of file pils_api.c.

728{
730
731 return handle->peer_id;
732}

References GNUNET_assert, and handle.

Referenced by announce_id(), cb_path_signed(), check_dv_box(), check_dv_learn(), decaps_dv_box_cb(), decrypt_and_check_tc(), dir_ready_cb(), do_initial_dht_put(), do_rekey(), encapsulate_for_dv(), find_proof(), forward_dv_learn(), forward_reply(), GCCH_bind(), GCCH_channel_local_new(), GCPP_try_path_from_dht(), GCT_alice_or_betty(), GDS_CLIENTS_handle_reply(), GDS_NEIGHBOURS_get_id(), GDS_NEIGHBOURS_handle_get(), GDS_NEIGHBOURS_handle_put(), GDS_NEIGHBOURS_handle_reply(), GDS_try_connect(), GDS_u_connect(), get_next_free_ctn(), got_hello(), GSC_CLIENTS_solicit_request(), GSC_complete_initialization_cb(), GSC_KX_start(), GSC_SESSIONS_dequeue_request(), GSF_peer_connect_handler(), handle_backchannel_encapsulation(), handle_client_init(), handle_client_send_request(), handle_communicator_available(), handle_connection_create(), handle_core_connect(), handle_core_disconnect(), handle_dht_local_hello_get(), handle_dht_p2p_get(), handle_dht_p2p_put(), handle_dht_p2p_result(), handle_dv_box(), handle_dv_learn(), handle_find_my_hello(), handle_hello_for_client(), handle_hello_for_incoming(), handle_p2p_estimate(), handle_port_open(), handle_suggest(), handle_transport_notify_connect(), handshake_monotime_cb(), iface_proc(), inject_rekey(), learn_dv_path(), mq_send(), peerinfo_cb(), pid_change_cb(), pils_id_change_cb(), pils_pid_change_cb(), recv_rx_key_cb(), regex_iterator(), route_message(), run(), send_broken_without_mqm(), send_challenge(), send_create(), send_initiator_hello(), send_msg_with_kx(), setup_flood_message(), setup_in_cipher(), setup_in_cipher_elligator(), sign_dv_init_cb(), sock_read(), sock_read(), start_dv_learn(), store_pi(), tokenized_cb(), transmit_kx(), try_connection_reversal(), try_handle_plaintext(), update_flood_message(), and verify_confirmation().

◆ GNUNET_PILS_get_identity_hash()

const struct GNUNET_HashCode * GNUNET_PILS_get_identity_hash ( const struct GNUNET_PILS_Handle handle)

Return the hash of the current peer identity from a given handle.

Parameters
handlehandle to the pils service
Returns
Peer identity hash or NULL on failure

Definition at line 736 of file pils_api.c.

737{
739
740 if (NULL == handle->peer_id)
741 return NULL;
742
743 return &handle->peer_hash;
744}

References GNUNET_assert, and handle.

Referenced by find_bucket(), GDS_am_closest_peer(), GDS_DATACACHE_handle_put(), GDS_NEIGHBOURS_handle_get(), GDS_NEIGHBOURS_handle_put(), handle_find_my_hello(), handle_initiator_hello(), handle_initiator_hello_cont(), restart_kx(), select_peer(), and send_find_peer_message().

Here is the caller graph for this function:

◆ pid_change_cb()

void pid_change_cb ( void *  cls,
const struct GNUNET_HELLO_Parser parser,
const struct GNUNET_HashCode addr_hash 
)

Definition at line 748 of file pils_api.c.

751{
754
755 GNUNET_assert ((cls) && (addr_hash));
756
757 key_ring = cls;
758
760 "Got PID to derive from `%s':\n",
761 GNUNET_h2s (addr_hash));
762 if (NULL == key_ring->private_key)
763 {
766 }
767 else
769
772 addr_hash,
777 sizeof (key_ring->identity),
778 &(key_ring->hash));
779
780
782 &(key_ring->identity)));
783
784 if (GNUNET_YES != initialized)
785 return;
786
787 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Initialize key ring\n");
788
789 if (key_ring->init_cb)
791}
static struct GNUNET_PILS_KeyRing * key_ring
For PILS.
void GNUNET_CRYPTO_eddsa_key_get_public(const struct GNUNET_CRYPTO_EddsaPrivateKey *priv, struct GNUNET_CRYPTO_EddsaPublicKey *pub)
Extract the public key for the given private key.
Definition crypto_ecc.c:201
#define GNUNET_memcmp(a, b)
Compare memory in a and b, where both must be of the same pointer type.
GNUNET_GenericReturnValue
Named constants for return values.
@ GNUNET_YES
@ GNUNET_NO
const char * GNUNET_h2s(const struct GNUNET_HashCode *hc)
Convert a hash value to a string (for printing debug messages).
void GNUNET_PILS_derive_pid(size_t seed_key_bytes, const uint8_t seed_key[seed_key_bytes], const struct GNUNET_HashCode *addrs_hash, struct GNUNET_CRYPTO_EddsaPrivateKey *outkey)
Generate the peer id from the addresses hash and the initial secret key.
Definition pils_api.c:635
const struct GNUNET_PeerIdentity * GNUNET_PILS_get_identity(const struct GNUNET_PILS_Handle *handle)
Return the current peer identity of a given handle.
Definition pils_api.c:727
static int initialized
Have we been initialized?
Definition plugin.c:57
Private ECC key encoded for transmission.
A simplified handle for using the peer identity key.
Definition pils_api.c:132
struct GNUNET_CRYPTO_EddsaPrivateKey * private_key
Private key.
Definition pils_api.c:156
GNUNET_SCHEDULER_TaskCallback init_cb
Initial callback.
Definition pils_api.c:141
struct GNUNET_HashCode hash
Hash of peer identity.
Definition pils_api.c:166
struct GNUNET_PeerIdentity identity
Peer identity.
Definition pils_api.c:161
unsigned char initial_key_material[256/8]
Initial key material.
Definition pils_api.c:151
void * cls
Closure for initial callback.
Definition pils_api.c:146
struct GNUNET_PILS_Handle * pils
PILS handle.
Definition pils_api.c:136
struct GNUNET_CRYPTO_EddsaPublicKey public_key

References GNUNET_PILS_KeyRing::cls, GNUNET_assert, GNUNET_CRYPTO_eddsa_key_get_public(), GNUNET_CRYPTO_hash(), GNUNET_ERROR_TYPE_DEBUG, GNUNET_h2s(), GNUNET_log, GNUNET_memcmp, GNUNET_new, GNUNET_NO, GNUNET_PILS_derive_pid(), GNUNET_PILS_get_identity(), GNUNET_YES, GNUNET_PILS_KeyRing::hash, GNUNET_PILS_KeyRing::identity, GNUNET_PILS_KeyRing::init_cb, GNUNET_PILS_KeyRing::initial_key_material, initialized, key_ring, GNUNET_PILS_KeyRing::pils, GNUNET_PILS_KeyRing::private_key, and GNUNET_PeerIdentity::public_key.

Referenced by GNUNET_PILS_connect(), and GNUNET_PILS_create_key_ring().

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

◆ GNUNET_PILS_create_key_ring()

struct GNUNET_PILS_KeyRing * GNUNET_PILS_create_key_ring ( const struct GNUNET_CONFIGURATION_Handle cfg,
GNUNET_SCHEDULER_TaskCallback  init_cb,
void *  cls 
)

Get the initial secret key for generating the peer id.

Create a key ring handle to use the current peer identity key.

This is supposed to be generated at random once in the lifetime of a peer, so all generated peer ids use the same initial secret key to obtain the same peer id per set of addresses.

First check whether there's already a initial secret key. If so: return it. If no initial secret key exists yet, generate at random and store it where it will be found.

Definition at line 804 of file pils_api.c.

807{
808 char *keyfile;
810
812
813 LOG (GNUNET_ERROR_TYPE_DEBUG, "Create key ring!\n");
814
815 if (GNUNET_OK !=
817 "PEER",
818 "PRIVATE_KEY",
819 &keyfile))
820 {
822 "PEER",
823 "PRIVATE_KEY");
824 return NULL;
825 }
826
827 if (GNUNET_SYSERR ==
830 &key))
831 {
833 "Failed to setup peer's private key\n");
834 GNUNET_free (keyfile);
835 return NULL;
836 }
837
838 GNUNET_free (keyfile);
839
842 if (NULL == key_ring)
843 return NULL;
845 key_ring->cls = cls;
846
847 GNUNET_assert (sizeof (key_ring->initial_key_material) == sizeof key.d);
848
850 if (NULL == key_ring->pils)
851 {
853 return NULL;
854 }
855
858
859 return key_ring;
860}
struct GNUNET_HashCode key
The key used in the DHT.
enum GNUNET_GenericReturnValue GNUNET_CONFIGURATION_get_value_filename(const struct GNUNET_CONFIGURATION_Handle *cfg, const char *section, const char *option, char **value)
Get a configuration value that should be the name of a file or directory.
enum GNUNET_GenericReturnValue GNUNET_CRYPTO_eddsa_key_from_file(const char *filename, int do_create, struct GNUNET_CRYPTO_EddsaPrivateKey *pkey)
Create a new private key by reading it from a file.
void GNUNET_log_config_missing(enum GNUNET_ErrorType kind, const char *section, const char *option)
Log error message about missing configuration option.
struct GNUNET_PILS_Handle * GNUNET_PILS_connect(const struct GNUNET_CONFIGURATION_Handle *cfg, GNUNET_PILS_PidChangeCallback pid_change_cb, void *cls)
Connect to the PILS service.
Definition pils_api.c:465
static void init_cb(void *cls, const struct GNUNET_PeerIdentity *my_identity)

References cfg, GNUNET_PILS_KeyRing::cls, GNUNET_assert, GNUNET_CONFIGURATION_get_value_filename(), GNUNET_CRYPTO_eddsa_key_from_file(), GNUNET_ERROR_TYPE_DEBUG, GNUNET_ERROR_TYPE_ERROR, GNUNET_free, GNUNET_log, GNUNET_log_config_missing(), GNUNET_new, GNUNET_OK, GNUNET_PILS_connect(), GNUNET_SYSERR, GNUNET_YES, init_cb(), GNUNET_PILS_KeyRing::init_cb, GNUNET_PILS_KeyRing::initial_key_material, key, key_ring, LOG, pid_change_cb(), and GNUNET_PILS_KeyRing::pils.

Referenced by run(), and run().

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

◆ GNUNET_PILS_destroy_key_ring()

void GNUNET_PILS_destroy_key_ring ( struct GNUNET_PILS_KeyRing key_ring)

Destroy a key ring handle and free its memory.

Parameters
key_ringkey ring handle

Definition at line 864 of file pils_api.c.

865{
867
868 LOG (GNUNET_ERROR_TYPE_DEBUG, "Destroy key ring!\n");
869
870 if (key_ring->pils)
872
874 {
876 sizeof (*(key_ring->private_key)));
878 }
879
883}
void GNUNET_CRYPTO_zero_keys(void *buffer, size_t length)
Zero out buffer, securely against compiler optimizations.
void GNUNET_PILS_disconnect(struct GNUNET_PILS_Handle *handle)
Disconnect from the PILS service.
Definition pils_api.c:488

References GNUNET_assert, GNUNET_CRYPTO_zero_keys(), GNUNET_ERROR_TYPE_DEBUG, GNUNET_free, GNUNET_PILS_disconnect(), GNUNET_PILS_KeyRing::initial_key_material, key_ring, LOG, GNUNET_PILS_KeyRing::pils, and GNUNET_PILS_KeyRing::private_key.

Referenced by do_shutdown(), and do_shutdown().

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

◆ GNUNET_PILS_key_ring_get_private_key()

const struct GNUNET_CRYPTO_EddsaPrivateKey * GNUNET_PILS_key_ring_get_private_key ( const struct GNUNET_PILS_KeyRing key_ring)

Return the current private key of a given key ring handle.

Parameters
key_ringkey ring handle
Returns
Private key or NULL on failure

Definition at line 887 of file pils_api.c.

889{
891
892 return key_ring->private_key;
893}

References GNUNET_assert, key_ring, and GNUNET_PILS_KeyRing::private_key.

Referenced by iface_proc(), inject_rekey(), send_challenge(), send_msg_with_kx(), setup_in_cipher(), setup_in_cipher_elligator(), setup_initial_shared_secret_dec(), setup_shared_secret_dec(), and transmit_kx().

Here is the caller graph for this function: