39#include "sodium/utils.h"
41#define LOG(kind, ...) GNUNET_log_from (kind, "util-crypto-hkdf", __VA_ARGS__)
46#include "sodium/crypto_auth_hmacsha256.h"
52 const unsigned char *prk,
57 unsigned char *outbuf = (
unsigned char*)
result;
61 if (out_len > (0xff * crypto_auth_hmacsha256_BYTES))
65 for (i = 0; i < hkdf_args_len; i++)
68 if (nxt + ctx_len < nxt)
77 if ( (crypto_auth_hmacsha256_BYTES + ctx_len < ctx_len) ||
78 (crypto_auth_hmacsha256_BYTES + ctx_len + 1 < ctx_len) )
85 memset (
result, 0, out_len);
88 size_t left = out_len;
89 unsigned char tmp[crypto_auth_hmacsha256_BYTES];
90 unsigned char ctx[ctx_len];
91 unsigned char *dst =
ctx;
92 crypto_auth_hmacsha256_state
st;
93 unsigned char counter = 1U;
95 sodium_memzero (
ctx,
sizeof ctx);
96 for (i = 0; i < hkdf_args_len; i++)
102 for (i = 0; left > 0; i += crypto_auth_hmacsha256_BYTES)
104 crypto_auth_hmacsha256_init (&
st, prk, prk_len);
107 crypto_auth_hmacsha256_update (&
st,
108 &outbuf[i - crypto_auth_hmacsha256_BYTES]
110 crypto_auth_hmacsha256_BYTES);
112 crypto_auth_hmacsha256_update (&
st,
ctx, ctx_len);
113 crypto_auth_hmacsha256_update (&
st, &counter, 1);
114 if (left >= crypto_auth_hmacsha256_BYTES)
116 crypto_auth_hmacsha256_final (&
st, &outbuf[i]);
117 left -= crypto_auth_hmacsha256_BYTES;
121 crypto_auth_hmacsha256_final (&
st, tmp);
122 memcpy (&outbuf[i], tmp, left);
123 sodium_memzero (tmp,
sizeof tmp);
128 sodium_memzero (&
st,
sizeof st);
141 size_t hkdf_args_len,
146 unsigned char prk[crypto_auth_hmacsha512_BYTES];
147 crypto_auth_hmacsha512_state
st;
149 memset (
result, 0, out_len);
150 if (crypto_auth_hmacsha512_init (&
st, xts, xts_len))
152 if (crypto_auth_hmacsha512_update (&
st, skm, skm_len))
154 crypto_auth_hmacsha512_final (&
st, (
unsigned char*) prk);
155 sodium_memzero (&
st,
sizeof st);
169 size_t hkdf_args_len,
175 (
unsigned char*) prk,
sizeof *prk,
188 crypto_auth_hmacsha256_state
st;
189 if (crypto_auth_hmacsha256_init (&
st, xts, xts_len))
191 if (crypto_auth_hmacsha256_update (&
st, skm, skm_len))
193 crypto_auth_hmacsha256_final (&
st, (
unsigned char*) prk);
194 sodium_memzero (&
st,
sizeof st);
enum GNUNET_GenericReturnValue GNUNET_CRYPTO_hkdf_gnunet_v(void *result, size_t out_len, const void *xts, size_t xts_len, const void *skm, size_t skm_len, size_t hkdf_args_len, const struct GNUNET_CRYPTO_KdfInputArgument hkdf_args[hkdf_args_len])
enum GNUNET_GenericReturnValue GNUNET_CRYPTO_hkdf_expand_v(void *result, size_t out_len, const struct GNUNET_ShortHashCode *prk, size_t hkdf_args_len, const struct GNUNET_CRYPTO_KdfInputArgument hkdf_args[hkdf_args_len])
static enum GNUNET_GenericReturnValue hkdf_expand_fixed(void *result, size_t out_len, const unsigned char *prk, size_t prk_len, size_t hkdf_args_len, const struct GNUNET_CRYPTO_KdfInputArgument *hkdf_args)
static struct GNUNET_SCHEDULER_Task * st
The shutdown task.
static char * data
The data to insert into the dht.
static struct GNUNET_FS_Handle * ctx
static int result
Global testing status.
commonly used definitions; globals in this file are exempt from the rule that the module name ("commo...
enum GNUNET_GenericReturnValue GNUNET_CRYPTO_hkdf_extract(struct GNUNET_ShortHashCode *prk, const void *xts, size_t xts_len, const void *skm, size_t skm_len)
HKDF-Extract using SHA256.
#define GNUNET_memcpy(dst, src, n)
Call memcpy() but check for n being 0 first.
GNUNET_GenericReturnValue
Named constants for return values.
#define GNUNET_break(cond)
Use this for internal assertion violations that are not fatal (can be handled) but should not occur.