Merge branch 'master' of ssh://gnunet.org/gnunet
[oweals/gnunet.git] / src / util / crypto_hkdf.c
index d97f516fe06546c34b83b969b5158380d9acb03a..f04d3e67505105f3febbc94aefc3067fe25f60a0 100644 (file)
@@ -36,6 +36,8 @@
  * - Matthias Wachs (08.10.2010)
  */
 
+#define LOG(kind,...) GNUNET_log_from (kind, "util-crypto-hkdf", __VA_ARGS__)
+
 /**
  * Set this to 0 if you compile this code outside of GNUnet.
  */
@@ -47,6 +49,7 @@
 #define DEBUG_HKDF 0
 
 
+
 #if GNUNET_BUILD
 #include "platform.h"
 #include "gnunet_crypto_lib.h"
@@ -71,8 +74,8 @@
  * @return HMAC, freed by caller via gcry_md_close/_reset
  */
 static const void *
-doHMAC (gcry_md_hd_t mac,
-        const void *key, size_t key_len, const void *buf, size_t buf_len)
+doHMAC (gcry_md_hd_t mac, const void *key, size_t key_len, const void *buf,
+        size_t buf_len)
 {
   gcry_md_setkey (mac, key, key_len);
   gcry_md_write (mac, buf, buf_len);
@@ -84,23 +87,22 @@ doHMAC (gcry_md_hd_t mac,
  * @brief Generate pseudo-random key
  * @param mac gcrypt HMAC handle
  * @param xts salt
- * @param xts_len length of the salt
+ * @param xts_len length of the @a xts salt
  * @param skm source key material
- * @param skm_len length of skm
+ * @param skm_len length of @a skm
  * @param prk result buffer (allocated by caller; at least gcry_md_dlen() bytes)
- * @return GNUNET_YES on success
+ * @return #GNUNET_YES on success
  */
 static int
-getPRK (gcry_md_hd_t mac,
-        const void *xts, size_t xts_len,
-        const void *skm, size_t skm_len, void *prk)
+getPRK (gcry_md_hd_t mac, const void *xts, size_t xts_len, const void *skm,
+        size_t skm_len, void *prk)
 {
   const void *ret;
 
   ret = doHMAC (mac, xts, xts_len, skm, skm_len);
   if (ret == NULL)
     return GNUNET_SYSERR;
-  memcpy (prk, ret, gcry_md_get_algo_dlen (gcry_md_get_algo (mac)));
+  GNUNET_memcpy (prk, ret, gcry_md_get_algo_dlen (gcry_md_get_algo (mac)));
 
   return GNUNET_YES;
 }
@@ -129,40 +131,41 @@ dump (const char *src, const void *p, unsigned int l)
  * @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 xts_len length of @a xts
  * @param skm source key material
- * @param skm_len length of skm
+ * @param skm_len length of @a skm
  * @param argp va_list of void * & size_t pairs for context chunks
- * @return GNUNET_YES on success
+ * @return #GNUNET_YES on success
  */
 int
-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)
+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)
 {
+  gcry_md_hd_t xtr;
+  gcry_md_hd_t prf;
   const void *hc;
-  unsigned long i, t, d;
+  unsigned long i;
+  unsigned long t;
+  unsigned long d;
   unsigned int k = gcry_md_get_algo_dlen (prf_algo);
   unsigned int xtr_len = gcry_md_get_algo_dlen (xtr_algo);
   char prk[xtr_len];
   int ret;
-  gcry_md_hd_t xtr, prf;
   size_t ctx_len;
   va_list args;
 
-  if (k == 0)
+  if (0 == k)
     return GNUNET_SYSERR;
-
-  if (gcry_md_open (&xtr, xtr_algo, GCRY_MD_FLAG_HMAC) != GPG_ERR_NO_ERROR)
+  if (GPG_ERR_NO_ERROR !=
+      gcry_md_open (&xtr, xtr_algo, GCRY_MD_FLAG_HMAC))
     return GNUNET_SYSERR;
-
-  if (gcry_md_open (&prf, prf_algo, GCRY_MD_FLAG_HMAC) != GPG_ERR_NO_ERROR)
+  if (GPG_ERR_NO_ERROR !=
+      gcry_md_open (&prf, prf_algo, GCRY_MD_FLAG_HMAC))
   {
     gcry_md_close (xtr);
     return GNUNET_SYSERR;
   }
-
   va_copy (args, argp);
 
   ctx_len = 0;
@@ -195,7 +198,7 @@ GNUNET_CRYPTO_hkdf_v (void *result, size_t out_len,
       size_t len;
 
       len = va_arg (args, size_t);
-      memcpy (dst, ctx, len);
+      GNUNET_memcpy (dst, ctx, len);
       dst += len;
     }
     va_end (args);
@@ -209,14 +212,14 @@ GNUNET_CRYPTO_hkdf_v (void *result, size_t out_len,
       hc = doHMAC (prf, prk, xtr_len, &plain[k], ctx_len + 1);
       if (hc == NULL)
         goto hkdf_error;
-      memcpy (result, hc, k);
+      GNUNET_memcpy (result, hc, k);
       result += k;
     }
 
     /* K(i+1) */
     for (i = 1; i < t; i++)
     {
-      memcpy (plain, result - k, k);
+      GNUNET_memcpy (plain, result - k, k);
       memset (plain + k + ctx_len, i + 1, 1);
       gcry_md_reset (prf);
 #if DEBUG_HKDF
@@ -225,7 +228,7 @@ GNUNET_CRYPTO_hkdf_v (void *result, size_t out_len,
       hc = doHMAC (prf, prk, xtr_len, plain, plain_len);
       if (hc == NULL)
         goto hkdf_error;
-      memcpy (result, hc, k);
+      GNUNET_memcpy (result, hc, k);
       result += k;
     }
 
@@ -234,7 +237,7 @@ GNUNET_CRYPTO_hkdf_v (void *result, size_t out_len,
     {
       if (t > 0)
       {
-        memcpy (plain, result - k, k);
+        GNUNET_memcpy (plain, result - k, k);
         i++;
       }
       memset (plain + k + ctx_len, i, 1);
@@ -248,7 +251,7 @@ GNUNET_CRYPTO_hkdf_v (void *result, size_t out_len,
         hc = doHMAC (prf, prk, xtr_len, plain + k, plain_len - k);
       if (hc == NULL)
         goto hkdf_error;
-      memcpy (result, hc, d);
+      GNUNET_memcpy (result, hc, d);
     }
 #if DEBUG_HKDF
     dump ("result", result - k, out_len);
@@ -260,9 +263,8 @@ GNUNET_CRYPTO_hkdf_v (void *result, size_t out_len,
 hkdf_error:
   ret = GNUNET_SYSERR;
 hkdf_ok:
-  gcry_md_close (prf);
   gcry_md_close (xtr);
-
+  gcry_md_close (prf);
   return ret;
 }
 
@@ -274,23 +276,23 @@ hkdf_ok:
  * @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 xts_len length of @a xts
  * @param skm source key material
- * @param skm_len length of skm
- * @return GNUNET_YES on success
+ * @param skm_len length of @a skm
+ * @return #GNUNET_YES on success
  */
 int
-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, ...)
+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, ...)
 {
   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);
+  ret =
+      GNUNET_CRYPTO_hkdf_v (result, out_len, xtr_algo, prf_algo, xts, xts_len,
+                            skm, skm_len, argp);
   va_end (argp);
 
   return ret;