39 #define LOG(kind, ...) GNUNET_log_from (kind, "util-crypto-hkdf", __VA_ARGS__)
44 #define GNUNET_BUILD 1
60 #define GNUNET_SYSERR -1
84 if (GPG_ERR_NO_ERROR !=
85 gcry_md_setkey (mac,
key, key_len))
93 return (
const void *) gcry_md_read (mac, 0);
118 dlen = gcry_md_get_algo_dlen (gcry_md_get_algo (mac));
129 char zero_salt[dlen];
131 memset (zero_salt, 0, dlen);
132 ret =
doHMAC (mac, zero_salt, dlen, skm, skm_len);
136 ret =
doHMAC (mac, xts, xts_len, skm, skm_len);
149 dump (
const char *src,
153 printf (
"\n%s: ", src);
154 for (
unsigned int i = 0; i <
l; i++)
156 printf (
"%2x", (
int) ((
const unsigned char *)
p)[i]);
182 unsigned int k = gcry_md_get_algo_dlen (prf_algo);
183 unsigned int xtr_len = gcry_md_get_algo_dlen (xtr_algo);
193 if (GPG_ERR_NO_ERROR !=
198 if (GPG_ERR_NO_ERROR !=
206 va_copy (
args, argp);
209 while (NULL != va_arg (
args,
void *))
211 size_t nxt = va_arg (
args,
size_t);
212 if (nxt + ctx_len < nxt)
224 if ( (k + ctx_len < ctx_len) ||
225 (k + ctx_len + 1 < ctx_len) )
232 memset (
result, 0, out_len);
234 getPRK (xtr, xts, xts_len, skm, skm_len, prk))
237 dump (
"PRK", prk, xtr_len);
245 size_t plain_len = k + ctx_len + 1;
252 va_copy (
args, argp);
253 while ((
ctx = va_arg (
args,
void *)))
265 plain[k + ctx_len] = (char) 1;
267 dump (
"K(1)", plain, plain_len);
269 hc =
doHMAC (prf, prk, xtr_len, &plain[k], ctx_len + 1);
280 for (i = 1; i <
t; i++)
283 plain[k + ctx_len] = (char) (i + 1);
286 dump (
"K(i+1)", plain, plain_len);
288 hc =
doHMAC (prf, prk, xtr_len, plain, plain_len);
306 plain[k + ctx_len] = (char) i;
309 dump (
"K(t):d", plain, plain_len);
312 hc =
doHMAC (prf, prk, xtr_len, plain, plain_len);
314 hc =
doHMAC (prf, prk, xtr_len, plain + k, plain_len - k);
353 va_start (argp, skm_len);
benchmarking for various operations
#define BENCHMARK_START(opname)
#define BENCHMARK_END(opname)
static enum GNUNET_GenericReturnValue getPRK(gcry_md_hd_t mac, const void *xts, size_t xts_len, const void *skm, size_t skm_len, void *prk)
Generate pseudo-random key.
static const void * doHMAC(gcry_md_hd_t mac, const void *key, size_t key_len, const void *buf, size_t buf_len)
Compute the HMAC.
static int ret
Return value of the commandline.
static struct LoggingHandle * l
static int dump
Dump the database.
struct GNUNET_HashCode key
The key used in the DHT.
uint16_t len
length of data (which is always a uint32_t, but presumably this can be used to specify that fewer byt...
static int result
Global testing status.
static struct GNUNET_OS_Process * p
Helper process we started.
static struct GNUNET_DNSSTUB_Context * ctx
Context for DNS resolution.
static struct GNUNET_SCHEDULER_Task * t
Main task.
enum GNUNET_GenericReturnValue GNUNET_CRYPTO_hkdf_v(void *result, size_t out_len, int xtr_algo, int prf_algo, const void *xts, size_t xts_len, const void *skm, size_t skm_len, va_list argp)
Derive key.
enum GNUNET_GenericReturnValue GNUNET_CRYPTO_hkdf(void *result, size_t out_len, int xtr_algo, int prf_algo, const void *xts, size_t xts_len, const void *skm, size_t skm_len,...)
Derive key.
#define GNUNET_memcpy(dst, src, n)
Call memcpy() but check for n being 0 first.
GNUNET_GenericReturnValue
Named constants for return values.
#define GNUNET_assert(cond)
Use this for fatal errors that cannot be handled.
#define GNUNET_break(cond)
Use this for internal assertion violations that are not fatal (can be handled) but should not occur.
#define GNUNET_malloc(size)
Wrapper around malloc.
#define GNUNET_free(ptr)
Wrapper around free.