aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authordurner <durner@140774ce-b5e7-0310-ab8b-a85725594a96>2010-09-28 19:12:19 +0000
committerdurner <durner@140774ce-b5e7-0310-ab8b-a85725594a96>2010-09-28 19:12:19 +0000
commit44f55d30a8b965e5d56e8850a600a65ba91d7e8d (patch)
treef4f1e0d8e9d3c09c6b3da3afe1399bbff1175958
parent1d8e2bb55ba6bcef490257d58937441118ffdf70 (diff)
fixes
git-svn-id: https://gnunet.org/svn/gnunet@13087 140774ce-b5e7-0310-ab8b-a85725594a96
-rw-r--r--src/util/crypto_hkdf.c68
-rw-r--r--src/util/test_crypto_hkdf.c4
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,