diff options
author | durner <durner@140774ce-b5e7-0310-ab8b-a85725594a96> | 2010-09-28 19:12:19 +0000 |
---|---|---|
committer | durner <durner@140774ce-b5e7-0310-ab8b-a85725594a96> | 2010-09-28 19:12:19 +0000 |
commit | 44f55d30a8b965e5d56e8850a600a65ba91d7e8d (patch) | |
tree | f4f1e0d8e9d3c09c6b3da3afe1399bbff1175958 | |
parent | 1d8e2bb55ba6bcef490257d58937441118ffdf70 (diff) |
fixes
git-svn-id: https://gnunet.org/svn/gnunet@13087 140774ce-b5e7-0310-ab8b-a85725594a96
-rw-r--r-- | src/util/crypto_hkdf.c | 68 | ||||
-rw-r--r-- | src/util/test_crypto_hkdf.c | 4 |
2 files changed, 53 insertions, 19 deletions
diff --git a/src/util/crypto_hkdf.c b/src/util/crypto_hkdf.c index 4415b75519..00750554f8 100644 --- a/src/util/crypto_hkdf.c +++ b/src/util/crypto_hkdf.c @@ -101,14 +101,13 @@ static void dump(char *src, void *p, unsigned int l) * @param xts_len length of xts * @param skm source key material * @param skm_len length of skm - * @param ctx context info - * @param ctx_len length of ctx + * @param argp va_list of void * & size_t pairs for context chunks * @return GNUNET_YES on success */ int -GNUNET_CRYPTO_hkdf (void *result, const unsigned long long out_len, +GNUNET_CRYPTO_hkdf_v (void *result, const unsigned long long out_len, int xtr_algo, int prf_algo, const void *xts, const size_t xts_len, - const void *skm, const size_t skm_len, ...) + const void *skm, const size_t skm_len, va_list argp) { void *prk, *hc, *plain; unsigned long long plain_len; @@ -117,7 +116,7 @@ GNUNET_CRYPTO_hkdf (void *result, const unsigned long long out_len, int ret; gcry_md_hd_t xtr, prf; size_t ctx_len; - va_list argp; + va_list args; prk = plain = NULL; xtr_len = gcry_md_get_algo_dlen (xtr_algo); @@ -128,10 +127,10 @@ GNUNET_CRYPTO_hkdf (void *result, const unsigned long long out_len, if (out_len > (2 ^ 32 * k) || !xtr_algo || !prf_algo) return GNUNET_SYSERR; - va_start(argp, skm_len); - for (ctx_len = 0; va_arg (argp, void *);) - ctx_len += va_arg (argp, size_t); - va_end(argp); + va_copy (args, argp); + for (ctx_len = 0; va_arg (args, void *);) + ctx_len += va_arg (args, size_t); + va_end(args); prk = GNUNET_malloc (xtr_len); @@ -155,16 +154,16 @@ GNUNET_CRYPTO_hkdf (void *result, const unsigned long long out_len, void *ctx, *dst; dst = plain; - va_start (argp, skm_len); - while ((ctx = va_arg (argp, void *))) + va_copy (args, argp); + while ((ctx = va_arg (args, void *))) { size_t len; - len = va_arg (argp, size_t); + len = va_arg (args, size_t); memcpy (dst, ctx, len); dst += len; } - va_end (argp); + va_end (args); memset (dst, 1, 1); gcry_md_reset (prf); @@ -183,10 +182,16 @@ GNUNET_CRYPTO_hkdf (void *result, const unsigned long long out_len, void *ctx, *dst; dst = plain + k; - va_start(argp, skm_len); - while ((ctx = va_arg (argp, void *))) - memcpy (dst, ctx, va_arg (argp, size_t)); - va_end (argp); + va_copy (args, argp); + while ((ctx = va_arg (args, void *))) + { + size_t len; + + len = va_arg (args, size_t); + memcpy (dst, ctx, len); + dst += len; + } + va_end (args); } /* K(i+1) */ @@ -238,5 +243,34 @@ hkdf_ok: return ret; } +/** + * @brief Derive key + * @param result buffer for the derived key, allocated by caller + * @param out_len desired length of the derived key + * @param xtr_algo hash algorithm for the extraction phase, GCRY_MD_... + * @param prf_algo hash algorithm for the expansion phase, GCRY_MD_... + * @param xts salt + * @param xts_len length of xts + * @param skm source key material + * @param skm_len length of skm + * @param ctx context info + * @param ctx_len length of ctx + * @return GNUNET_YES on success + */ +int +GNUNET_CRYPTO_hkdf (void *result, const unsigned long long out_len, + int xtr_algo, int prf_algo, const void *xts, const size_t xts_len, + const void *skm, const size_t skm_len, ...) +{ + va_list argp; + int ret; + + va_start(argp, skm_len); + ret = GNUNET_CRYPTO_hkdf_v (result, out_len, xtr_algo, prf_algo, xts, + xts_len, skm, skm_len, argp); + va_end(argp); + + return ret; +} /* end of crypto_hkdf.c */ diff --git a/src/util/test_crypto_hkdf.c b/src/util/test_crypto_hkdf.c index 1b4d368aaa..1cbe41b4a0 100644 --- a/src/util/test_crypto_hkdf.c +++ b/src/util/test_crypto_hkdf.c @@ -214,11 +214,11 @@ tc7 () 0x8e, 0x8f, 0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97, 0x98, 0x99, 0x9a, 0x9b, 0x9c, 0x9d, 0x9e, 0x9f, 0xa0, 0xa1, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7, 0xa8, 0xa9, 0xaa, 0xab, 0xac, 0xad, 0xae, 0xaf }; - unsigned char info1[80] = { 0xb0, 0xb1, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6, 0xb7, + unsigned char info1[34] = { 0xb0, 0xb1, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6, 0xb7, 0xb8, 0xb9, 0xba, 0xbb, 0xbc, 0xbd, 0xbe, 0xbf, 0xc0, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7, 0xc8, 0xc9, 0xca, 0xcb, 0xcc, 0xcd, 0xce, 0xcf, 0xd0, 0xd1 }; - unsigned char info2[80] = { 0xd2, 0xd3, 0xd4, 0xd5, 0xd6, 0xd7, 0xd8, 0xd9, + unsigned char info2[46] = { 0xd2, 0xd3, 0xd4, 0xd5, 0xd6, 0xd7, 0xd8, 0xd9, 0xda, 0xdb, 0xdc, 0xdd, 0xde, 0xdf, 0xe0, 0xe1, 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7, 0xe8, 0xe9, 0xea, 0xeb, 0xec, 0xed, 0xee, 0xef, 0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, 0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, |