31#include "sodium/crypto_scalarmult.h"
32#include "sodium/crypto_scalarmult_curve25519.h"
33#include "sodium/utils.h"
52 const void *
salt,
size_t salt_len,
53 const void *label,
size_t label_len,
54 const void *
ikm,
size_t ikm_len,
55 const uint8_t *suite_id,
size_t suite_id_len,
58 size_t labeled_ikm_len = strlen (ctx_str) + suite_id_len
59 + label_len + ikm_len;
60 uint8_t labeled_ikm[labeled_ikm_len];
61 uint8_t *tmp = labeled_ikm;
64 memcpy (tmp, ctx_str, strlen (ctx_str));
65 tmp += strlen (ctx_str);
66 memcpy (tmp, suite_id, suite_id_len);
68 memcpy (tmp, label, label_len);
70 memcpy (tmp,
ikm, ikm_len);
74 labeled_ikm, labeled_ikm_len);
96 const char *label,
size_t label_len,
97 const void *
info,
size_t info_len,
98 const uint8_t *suite_id,
size_t suite_id_len,
102 uint8_t labeled_info[2 + strlen (ctx_str) + suite_id_len + label_len
104 uint8_t *tmp = labeled_info;
105 uint16_t out_len_nbo = htons (out_len);
109 memcpy (tmp, &out_len_nbo, 2);
111 memcpy (tmp, ctx_str, strlen (ctx_str));
112 tmp += strlen (ctx_str);
113 memcpy (tmp, suite_id, suite_id_len);
115 memcpy (tmp, label, label_len);
117 memcpy (tmp,
info, info_len);
119 labeled_info,
sizeof labeled_info, NULL);
126 const char *extract_ctx,
127 const char *expand_ctx,
128 const void*extract_lbl,
size_t
130 const void*expand_lbl,
size_t
132 const uint8_t *kem_context,
133 size_t kem_context_len,
134 const uint8_t *suite_id,
size_t
143 extract_lbl, extract_lbl_len,
145 suite_id, suite_id_len,
149 expand_lbl, expand_lbl_len,
150 kem_context, kem_context_len,
151 suite_id, suite_id_len,
152 shared_secret,
sizeof *shared_secret);
174 uint8_t kem_context[
sizeof *c +
sizeof *pkR];
181 "HPKE KEM encaps: Validation error\n");
187 memcpy (kem_context, c,
sizeof *c);
188 memcpy (kem_context +
sizeof *c, pkR,
sizeof *pkR);
194 "eae_prk", strlen (
"eae_prk"),
195 "shared_secret", strlen (
"shared_secret"),
196 kem_context,
sizeof kem_context,
197 suite_id, suite_id_len,
215 pkR,
enc, skE, shared_secret);
240 if (0 != crypto_sign_ed25519_pk_to_curve25519 (pkR.
q_y,
pub->
q_y))
253 uint8_t kem_context[
sizeof *c + crypto_scalarmult_curve25519_BYTES];
254 uint8_t pkR[crypto_scalarmult_BYTES];
265 crypto_scalarmult_curve25519_base (pkR, skR->
d);
267 memcpy (kem_context, c,
sizeof *c);
268 memcpy (kem_context +
sizeof *c, pkR,
sizeof pkR);
274 "eae_prk", strlen (
"eae_prk"),
275 "shared_secret", strlen (
"shared_secret"),
276 kem_context,
sizeof kem_context,
293 if (0 != crypto_sign_ed25519_sk_to_curve25519 (skR.
d, priv->
d))
302 uint8_t random_tweak,
320 pkR, c, (
const struct
332 uint8_t random_tweak;
343 &skE, shared_secret);
356 uint8_t kem_context[
sizeof *
r + crypto_scalarmult_curve25519_BYTES];
357 uint8_t pkR[crypto_scalarmult_BYTES];
366 crypto_scalarmult_curve25519_base (pkR, skR->
d);
367 memcpy (kem_context,
r,
sizeof *
r);
368 memcpy (kem_context +
sizeof *
r, pkR,
sizeof pkR);
374 "eae_prk", strlen (
"eae_prk"),
375 "shared_secret", strlen (
"shared_secret"),
376 kem_context,
sizeof kem_context,
385 const uint8_t *psk,
size_t psk_len,
386 const uint8_t *psk_id,
size_t psk_id_len)
391 got_psk = (0 != psk_len);
392 got_psk_id = (0 != psk_id_len);
394 if (got_psk != got_psk_id)
397 "Inconsistent PSK inputs\n");
406 "PSK input provided when not needed\n");
414 "Missing required PSK input\n");
425 const uint8_t *
info,
size_t info_len,
426 const uint8_t *psk,
size_t psk_len,
427 const uint8_t *psk_id,
size_t psk_id_len,
433 uint8_t key_schedule_context[1 +
sizeof info_hash * 2];
434 uint8_t suite_id[strlen (
"HPKE") + 6];
435 uint16_t kem_id = htons (32);
436 uint16_t kdf_id = htons (1);
437 uint16_t aead_id = htons (3);
441 memcpy (suite_id,
"HPKE", 4);
442 memcpy (suite_id + 4, &kem_id, 2);
443 memcpy (suite_id + 6, &kdf_id, 2);
444 memcpy (suite_id + 8, &aead_id, 2);
450 "psk_id_hash", strlen (
"psk_id_hash"),
452 suite_id,
sizeof suite_id, &psk_id_hash))
455 "info_hash", strlen (
"info_hash"),
457 suite_id,
sizeof suite_id, &info_hash))
459 memcpy (key_schedule_context, &
mode, 1);
460 memcpy (key_schedule_context + 1, &psk_id_hash,
sizeof psk_id_hash);
461 memcpy (key_schedule_context + 1 +
sizeof psk_id_hash,
462 &info_hash,
sizeof info_hash);
464 shared_secret,
sizeof *shared_secret,
465 "secret", strlen (
"secret"),
467 suite_id,
sizeof suite_id, &secret))
473 "key", strlen (
"key"),
474 &key_schedule_context,
475 sizeof key_schedule_context,
476 suite_id,
sizeof suite_id,
477 ctx->key,
sizeof ctx->key))
483 "base_nonce", strlen (
"base_nonce"),
484 &key_schedule_context,
485 sizeof key_schedule_context,
486 suite_id,
sizeof suite_id,
487 ctx->base_nonce,
sizeof ctx->base_nonce))
493 "exp", strlen (
"exp"),
494 &key_schedule_context,
495 sizeof key_schedule_context,
496 suite_id,
sizeof suite_id,
497 &
ctx->exporter_secret,
498 sizeof ctx->exporter_secret))
513 const uint8_t *
info,
size_t info_len,
514 const uint8_t *psk,
size_t psk_len,
515 const uint8_t *psk_id,
size_t psk_id_len,
535 uint8_t random_tweak;
567 const uint8_t *
info,
size_t info_len,
594 const uint8_t *
info,
size_t info_len,
595 const uint8_t *psk,
size_t psk_len,
596 const uint8_t *psk_id,
size_t psk_id_len,
639 const uint8_t *
info,
size_t info_len,
647 NULL, 0, NULL, 0,
ctx);
654 if (
ctx->seq >= UINT64_MAX)
674 memset (&nonce[i],
ctx->base_nonce[i], 1);
676 nonce[i] =
ctx->base_nonce[i] ^ ((uint8_t*) &
ctx->seq)[j++];
683 const uint8_t*aad,
size_t aad_len,
684 const uint8_t *pt,
size_t pt_len,
685 uint8_t *ct,
unsigned long long *ct_len_p)
691 "HPKE: Wrong role; called as receiver (%d)!\n",
696 crypto_aead_chacha20poly1305_ietf_encrypt (ct, ct_len_p,
705 "HPKE: Seq increment failed!\n");
714 const uint8_t*aad,
size_t aad_len,
715 const uint8_t *ct,
size_t ct_len,
716 uint8_t *pt,
unsigned long long *pt_len)
722 "HPKE: Wrong role; called as sender (%d)!\n",
727 if (0 != crypto_aead_chacha20poly1305_ietf_decrypt (pt, pt_len,
740 "HPKE: Seq increment failed!\n");
749 const uint8_t *
info,
size_t info_len,
750 const uint8_t*aad,
size_t aad_len,
751 const uint8_t *pt,
size_t pt_len,
752 uint8_t *ct,
unsigned long long *ct_len_p)
759 ct_off = (uint8_t*) &
enc[1];
765 "HPKE: Sender setup failed!\n");
779 const uint8_t *
info,
size_t info_len,
780 const uint8_t*aad,
size_t aad_len,
781 const uint8_t *ct,
size_t ct_len,
782 uint8_t *pt,
unsigned long long *pt_len_p)
789 ct_off = (uint8_t*) &
enc[1];
795 "HPKE: Receiver setup failed!\n");
801 ct_len -
sizeof *
enc,
814 if (0 != crypto_sign_ed25519_pk_to_curve25519 (x25519->
q_y,
819 if (0 != crypto_sign_ed25519_pk_to_curve25519 (x25519->
q_y,
835 switch (ntohl (sk->
type))
842 if (0 != crypto_sign_ed25519_sk_to_curve25519 (x25519->
d,
static void compute_nonce(struct GNUNET_CRYPTO_HpkeContext *ctx, uint8_t *nonce)
static enum GNUNET_GenericReturnValue key_schedule(enum GNUNET_CRYPTO_HpkeRole role, enum GNUNET_CRYPTO_HpkeMode mode, const struct GNUNET_ShortHashCode *shared_secret, const uint8_t *info, size_t info_len, const uint8_t *psk, size_t psk_len, const uint8_t *psk_id, size_t psk_id_len, struct GNUNET_CRYPTO_HpkeContext *ctx)
static enum GNUNET_GenericReturnValue increment_seq(struct GNUNET_CRYPTO_HpkeContext *ctx)
static enum GNUNET_GenericReturnValue labeled_extract(const char *ctx_str, const void *salt, size_t salt_len, const void *label, size_t label_len, const void *ikm, size_t ikm_len, const uint8_t *suite_id, size_t suite_id_len, struct GNUNET_ShortHashCode *prk)
A RFC9180 inspired labeled extract.
static enum GNUNET_GenericReturnValue kem_encaps_norand(uint8_t *suite_id, size_t suite_id_len, const struct GNUNET_CRYPTO_EcdhePublicKey *pkR, const struct GNUNET_CRYPTO_HpkeEncapsulation *c, const struct GNUNET_CRYPTO_EcdhePrivateKey *skE, struct GNUNET_ShortHashCode *shared_secret)
static enum GNUNET_GenericReturnValue verify_psk_inputs(enum GNUNET_CRYPTO_HpkeMode mode, const uint8_t *psk, size_t psk_len, const uint8_t *psk_id, size_t psk_id_len)
static uint8_t GNUNET_CRYPTO_HPKE_KEM_SUITE_ID[]
static enum GNUNET_GenericReturnValue GNUNET_CRYPTO_hpke_labeled_extract_and_expand(const void *dh, size_t dh_len, const char *extract_ctx, const char *expand_ctx, const void *extract_lbl, size_t extract_lbl_len, const void *expand_lbl, size_t expand_lbl_len, const uint8_t *kem_context, size_t kem_context_len, const uint8_t *suite_id, size_t suite_id_len, struct GNUNET_ShortHashCode *shared_secret)
static enum GNUNET_GenericReturnValue labeled_expand(const char *ctx_str, const struct GNUNET_ShortHashCode *prk, const char *label, size_t label_len, const void *info, size_t info_len, const uint8_t *suite_id, size_t suite_id_len, void *out_buf, uint16_t out_len)
A RFC9180 inspired labeled extract.
static uint8_t GNUNET_CRYPTO_HPKE_KEM_ELLIGATOR_SUITE_ID[]
static struct GNUNET_FS_Handle * ctx
static OpusEncoder * enc
OPUS encoder.
struct GNUNET_CRYPTO_PrivateKey pk
Private key from command line option, or NULL.
static struct GNUNET_CRYPTO_EddsaPublicKey pub
static struct GNUNET_CRYPTO_PowSalt salt
Salt for PoW calculations.
static unsigned char ikm[256/8]
The initial key material for the peer.
commonly used definitions; globals in this file are exempt from the rule that the module name ("commo...
static enum @44 mode
Should we do a PUT (mode = 0) or GET (mode = 1);.
enum GNUNET_GenericReturnValue GNUNET_CRYPTO_hpke_kem_encaps_norand(const struct GNUNET_CRYPTO_EcdhePublicKey *pkR, struct GNUNET_CRYPTO_HpkeEncapsulation *enc, const struct GNUNET_CRYPTO_EcdhePrivateKey *skE, struct GNUNET_ShortHashCode *shared_secret)
Deterministic variant of GNUNET_CRYPTO_hpke_kem_encaps.
void GNUNET_CRYPTO_ecdhe_key_create(struct GNUNET_CRYPTO_EcdhePrivateKey *pk)
Create a new private key.
enum GNUNET_GenericReturnValue GNUNET_CRYPTO_eddsa_kem_decaps(const struct GNUNET_CRYPTO_EddsaPrivateKey *priv, const struct GNUNET_CRYPTO_HpkeEncapsulation *c, struct GNUNET_ShortHashCode *shared_secret)
Decapsulate a key for a private EdDSA key.
enum GNUNET_GenericReturnValue GNUNET_CRYPTO_x25519_ecdh(const struct GNUNET_CRYPTO_EcdhePrivateKey *sk, const struct GNUNET_CRYPTO_EcdhePublicKey *pk, struct GNUNET_CRYPTO_EcdhePublicKey *dh)
Derive key material from a ECDH public key and a private X25519 key.
void GNUNET_CRYPTO_ecdhe_elligator_key_create(struct GNUNET_CRYPTO_ElligatorEcdhePrivateKey *sk)
Generates a private key for Curve25519.
enum GNUNET_GenericReturnValue GNUNET_CRYPTO_hpke_elligator_kem_decaps(const struct GNUNET_CRYPTO_EcdhePrivateKey *skR, const struct GNUNET_CRYPTO_HpkeEncapsulation *c, struct GNUNET_ShortHashCode *shared_secret)
Carries out ecdh decapsulation with own private key and the representative of the received public key...
enum GNUNET_GenericReturnValue GNUNET_CRYPTO_hpke_kem_encaps(const struct GNUNET_CRYPTO_EcdhePublicKey *pub, struct GNUNET_CRYPTO_HpkeEncapsulation *c, struct GNUNET_ShortHashCode *shared_secret)
Encapsulate key material for a X25519 public key.
void GNUNET_CRYPTO_random_block(enum GNUNET_CRYPTO_Quality mode, void *buffer, size_t length)
Fill block with a random values.
enum GNUNET_GenericReturnValue GNUNET_CRYPTO_hpke_kem_decaps(const struct GNUNET_CRYPTO_EcdhePrivateKey *skR, const struct GNUNET_CRYPTO_HpkeEncapsulation *c, struct GNUNET_ShortHashCode *shared_secret)
Decapsulate a key for a private X25519 key.
void GNUNET_CRYPTO_ecdhe_elligator_decoding(struct GNUNET_CRYPTO_EcdhePublicKey *point, bool *high_y, const struct GNUNET_CRYPTO_ElligatorRepresentative *representative)
Clears the most significant bit and second most significant bit of the serialized representaive befor...
enum GNUNET_GenericReturnValue GNUNET_CRYPTO_ecdhe_elligator_key_get_public_norand(uint8_t random_tweak, const struct GNUNET_CRYPTO_ElligatorEcdhePrivateKey *sk, struct GNUNET_CRYPTO_EcdhePublicKey *pub, struct GNUNET_CRYPTO_ElligatorRepresentative *repr)
Generates a valid public key for elligator's inverse map by adding a lower order point to a prime ord...
enum GNUNET_GenericReturnValue GNUNET_CRYPTO_hpke_elligator_kem_encaps(const struct GNUNET_CRYPTO_EcdhePublicKey *pkR, struct GNUNET_CRYPTO_HpkeEncapsulation *c, struct GNUNET_ShortHashCode *shared_secret)
Carries out ecdh encapsulation with given public key and the private key from a freshly created ephem...
enum GNUNET_GenericReturnValue GNUNET_CRYPTO_hpke_elligator_kem_encaps_norand(uint8_t random_tweak, const struct GNUNET_CRYPTO_EcdhePublicKey *pkR, struct GNUNET_CRYPTO_HpkeEncapsulation *c, const struct GNUNET_CRYPTO_ElligatorEcdhePrivateKey *skE, struct GNUNET_ShortHashCode *shared_secret)
Carries out ecdh encapsulation with given public key and the private key from a freshly created ephem...
enum GNUNET_GenericReturnValue GNUNET_CRYPTO_ecdh_x25519(const struct GNUNET_CRYPTO_EcdhePrivateKey *priv, const struct GNUNET_CRYPTO_EcdhePublicKey *pub, struct GNUNET_CRYPTO_EcdhePublicKey *dh)
Derive key material from a EdDSA public key and a private ECDH key.
enum GNUNET_GenericReturnValue GNUNET_CRYPTO_eddsa_kem_encaps(const struct GNUNET_CRYPTO_EddsaPublicKey *pub, struct GNUNET_CRYPTO_HpkeEncapsulation *c, struct GNUNET_ShortHashCode *shared_secret)
Encapsulate key material for a EdDSA public key.
void GNUNET_CRYPTO_ecdhe_key_get_public(const struct GNUNET_CRYPTO_EcdhePrivateKey *priv, struct GNUNET_CRYPTO_EcdhePublicKey *pub)
Extract the public key for the given private key.
@ GNUNET_CRYPTO_QUALITY_NONCE
Randomness for IVs etc.
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.
enum GNUNET_GenericReturnValue GNUNET_CRYPTO_hkdf_expand(void *result, size_t out_len, const struct GNUNET_ShortHashCode *prk,...)
HKDF-Expand using SHA256.
enum GNUNET_GenericReturnValue GNUNET_CRYPTO_hpke_open_oneshot(const struct GNUNET_CRYPTO_EcdhePrivateKey *skR, const uint8_t *info, size_t info_len, const uint8_t *aad, size_t aad_len, const uint8_t *ct, size_t ct_len, uint8_t *pt, unsigned long long *pt_len_p)
RFC9180 HPKE encryption.
enum GNUNET_GenericReturnValue GNUNET_CRYPTO_hpke_sender_setup2(enum GNUNET_CRYPTO_HpkeKem kem, enum GNUNET_CRYPTO_HpkeMode mode, struct GNUNET_CRYPTO_EcdhePrivateKey *skE, struct GNUNET_CRYPTO_EcdhePrivateKey *skS, const struct GNUNET_CRYPTO_EcdhePublicKey *pkR, const uint8_t *info, size_t info_len, const uint8_t *psk, size_t psk_len, const uint8_t *psk_id, size_t psk_id_len, struct GNUNET_CRYPTO_HpkeEncapsulation *enc, struct GNUNET_CRYPTO_HpkeContext *ctx)
RFC9180 HPKE encryption.
GNUNET_CRYPTO_HpkeKem
HPKE KEM identifier TODO: Elligator KEM was requested at IANA; Number is currently a placeholder.
#define GNUNET_log(kind,...)
enum GNUNET_GenericReturnValue GNUNET_CRYPTO_hpke_seal_oneshot(const struct GNUNET_CRYPTO_EcdhePublicKey *pkR, const uint8_t *info, size_t info_len, const uint8_t *aad, size_t aad_len, const uint8_t *pt, size_t pt_len, uint8_t *ct, unsigned long long *ct_len_p)
RFC9180 HPKE encryption.
enum GNUNET_GenericReturnValue GNUNET_CRYPTO_hpke_seal(struct GNUNET_CRYPTO_HpkeContext *ctx, const uint8_t *aad, size_t aad_len, const uint8_t *pt, size_t pt_len, uint8_t *ct, unsigned long long *ct_len_p)
RFC9180 HPKE encryption.
uint64_t GNUNET_ntohll(uint64_t n)
Convert unsigned 64-bit integer to host byte order.
enum GNUNET_GenericReturnValue GNUNET_CRYPTO_hpke_open(struct GNUNET_CRYPTO_HpkeContext *ctx, const uint8_t *aad, size_t aad_len, const uint8_t *ct, size_t ct_len, uint8_t *pt, unsigned long long *pt_len)
RFC9180 HPKE encryption.
uint64_t GNUNET_htonll(uint64_t n)
Convert unsigned 64-bit integer to network byte order.
#define GNUNET_CRYPTO_HPKE_NONCE_LEN
enum GNUNET_GenericReturnValue GNUNET_CRYPTO_hpke_sk_to_x25519(const struct GNUNET_CRYPTO_PrivateKey *sk, struct GNUNET_CRYPTO_EcdhePrivateKey *x25519)
Convert a GNUnet identity key to a key sutiable for HPKE (X25519)
GNUNET_CRYPTO_HpkeMode
HPKE RFC 9180.
enum GNUNET_GenericReturnValue GNUNET_CRYPTO_hpke_pk_to_x25519(const struct GNUNET_CRYPTO_PublicKey *pk, struct GNUNET_CRYPTO_EcdhePublicKey *x25519)
Convert a GNUnet identity key to a key sutiable for HPKE (X25519)
GNUNET_GenericReturnValue
Named constants for return values.
enum GNUNET_GenericReturnValue GNUNET_CRYPTO_hpke_receiver_setup(const struct GNUNET_CRYPTO_HpkeEncapsulation *enc, const struct GNUNET_CRYPTO_EcdhePrivateKey *skR, const uint8_t *info, size_t info_len, struct GNUNET_CRYPTO_HpkeContext *ctx)
RFC9180 HPKE encryption.
enum GNUNET_GenericReturnValue GNUNET_CRYPTO_hpke_receiver_setup2(enum GNUNET_CRYPTO_HpkeKem kem, enum GNUNET_CRYPTO_HpkeMode mode, const struct GNUNET_CRYPTO_HpkeEncapsulation *enc, const struct GNUNET_CRYPTO_EcdhePrivateKey *skR, const struct GNUNET_CRYPTO_EcdhePublicKey *pkS, const uint8_t *info, size_t info_len, const uint8_t *psk, size_t psk_len, const uint8_t *psk_id, size_t psk_id_len, struct GNUNET_CRYPTO_HpkeContext *ctx)
RFC9180 HPKE encryption.
enum GNUNET_GenericReturnValue GNUNET_CRYPTO_hpke_sender_setup(const struct GNUNET_CRYPTO_EcdhePublicKey *pkR, const uint8_t *info, size_t info_len, struct GNUNET_CRYPTO_HpkeEncapsulation *enc, struct GNUNET_CRYPTO_HpkeContext *ctx)
RFC9180 HPKE encryption.
GNUNET_CRYPTO_HpkeRole
Role of the HPKE participant.
@ GNUNET_CRYPTO_HPKE_KEM_DH_X25519_HKDF256
@ GNUNET_CRYPTO_HPKE_KEM_DH_X25519ELLIGATOR_HKDF256
@ GNUNET_PUBLIC_KEY_TYPE_EDDSA
EDDSA identity.
@ GNUNET_PUBLIC_KEY_TYPE_ECDSA
The identity type.
@ GNUNET_CRYPTO_HPKE_MODE_PSK
@ GNUNET_CRYPTO_HPKE_MODE_AUTH_PSK
@ GNUNET_CRYPTO_HPKE_MODE_BASE
@ GNUNET_CRYPTO_HPKE_MODE_AUTH
@ GNUNET_CRYPTO_HPKE_ROLE_R
@ GNUNET_CRYPTO_HPKE_ROLE_S
#define GNUNET_assert(cond)
Use this for fatal errors that cannot be handled.
@ GNUNET_ERROR_TYPE_ERROR
Private ECC key encoded for transmission.
unsigned char d[256/8]
d is a value mod n, where n has at most 256 bits.
Public ECC key (always for Curve25519) encoded in a format suitable for network transmission and encr...
unsigned char q_y[256/8]
Q consists of an x- and a y-value, each mod p (256 bits), given here in affine coordinates and Ed2551...
unsigned char d[256/8]
d is a value mod n, where n has at most 256 bits.
Private ECC key encoded for transmission.
unsigned char d[256/8]
d is a value mod n, where n has at most 256 bits.
Public ECC key (always for curve Ed25519) encoded in a format suitable for network transmission and E...
unsigned char q_y[256/8]
Point Q consists of a y-value mod p (256 bits); the x-value is always positive.
Special private ECC key generated by GNUNET_CRYPTO_ecdhe_elligator_key_create.
Elligator representative (always for Curve25519)
uint8_t r[256/8]
Represents an element of Curve25519 finite field.
HPKE DHKEM encapsulation (X25519) See RFC 9180.
A private key for an identity as per LSD0001.
uint32_t type
Type of public key.
struct GNUNET_CRYPTO_EddsaPrivateKey eddsa_key
AN EdDSA identtiy key.
struct GNUNET_CRYPTO_EcdsaPrivateKey ecdsa_key
An ECDSA identity key.
An identity key as per LSD0001.