aboutsummaryrefslogtreecommitdiff
path: root/src/util
diff options
context:
space:
mode:
authorFlorian Dold <florian@dold.me>2021-10-19 13:55:28 +0200
committerFlorian Dold <florian@dold.me>2021-10-19 13:55:53 +0200
commit2e2abc61db54f3a25fcb261e2d93277673770d70 (patch)
tree514387c82aa9f65b86fc84fc5661ffe57b47638c /src/util
parentd64ac269856744b9bab170964e1d6f36896ecc55 (diff)
downloadgnunet-2e2abc61db54f3a25fcb261e2d93277673770d70.tar.gz
gnunet-2e2abc61db54f3a25fcb261e2d93277673770d70.zip
make KDF conform to RFC 5869
Diffstat (limited to 'src/util')
-rw-r--r--src/util/crypto_hkdf.c22
1 files changed, 20 insertions, 2 deletions
diff --git a/src/util/crypto_hkdf.c b/src/util/crypto_hkdf.c
index 7270b87b6..ba3626e1a 100644
--- a/src/util/crypto_hkdf.c
+++ b/src/util/crypto_hkdf.c
@@ -103,11 +103,29 @@ getPRK (gcry_md_hd_t mac, const void *xts, size_t xts_len, const void *skm,
103 size_t skm_len, void *prk) 103 size_t skm_len, void *prk)
104{ 104{
105 const void *ret; 105 const void *ret;
106 size_t dlen;
106 107
107 ret = doHMAC (mac, xts, xts_len, skm, skm_len); 108 dlen = gcry_md_get_algo_dlen (gcry_md_get_algo (mac));
109
110 /* sanity check to bound stack allocation */
111 GNUNET_assert (dlen <= 512);
112
113 /* From RFC 5869:
114 * salt - optional salt value (a non-secret random value);
115 * if not provided, it is set to a string of HashLen zeros. */
116
117 if (xts_len == 0)
118 {
119 char zero_salt[dlen] = { 0 };
120 ret = doHMAC (mac, zero_salt, dlen, skm, skm_len);
121 }
122 else
123 {
124 ret = doHMAC (mac, xts, xts_len, skm, skm_len);
125 }
108 if (ret == NULL) 126 if (ret == NULL)
109 return GNUNET_SYSERR; 127 return GNUNET_SYSERR;
110 GNUNET_memcpy (prk, ret, gcry_md_get_algo_dlen (gcry_md_get_algo (mac))); 128 GNUNET_memcpy (prk, ret, dlen);
111 129
112 return GNUNET_YES; 130 return GNUNET_YES;
113} 131}