diff options
Diffstat (limited to 'src/util/crypto_hkdf.c')
-rw-r--r-- | src/util/crypto_hkdf.c | 118 |
1 files changed, 59 insertions, 59 deletions
diff --git a/src/util/crypto_hkdf.c b/src/util/crypto_hkdf.c index 6af76ba68..40bfa6774 100644 --- a/src/util/crypto_hkdf.c +++ b/src/util/crypto_hkdf.c | |||
@@ -74,7 +74,7 @@ | |||
74 | */ | 74 | */ |
75 | static const void * | 75 | static const void * |
76 | doHMAC (gcry_md_hd_t mac, const void *key, size_t key_len, const void *buf, | 76 | doHMAC (gcry_md_hd_t mac, const void *key, size_t key_len, const void *buf, |
77 | size_t buf_len) | 77 | size_t buf_len) |
78 | { | 78 | { |
79 | gcry_md_setkey (mac, key, key_len); | 79 | gcry_md_setkey (mac, key, key_len); |
80 | gcry_md_write (mac, buf, buf_len); | 80 | gcry_md_write (mac, buf, buf_len); |
@@ -94,7 +94,7 @@ doHMAC (gcry_md_hd_t mac, const void *key, size_t key_len, const void *buf, | |||
94 | */ | 94 | */ |
95 | static int | 95 | static int |
96 | getPRK (gcry_md_hd_t mac, const void *xts, size_t xts_len, const void *skm, | 96 | getPRK (gcry_md_hd_t mac, const void *xts, size_t xts_len, const void *skm, |
97 | size_t skm_len, void *prk) | 97 | size_t skm_len, void *prk) |
98 | { | 98 | { |
99 | const void *ret; | 99 | const void *ret; |
100 | 100 | ||
@@ -115,9 +115,9 @@ dump (const char *src, const void *p, unsigned int l) | |||
115 | 115 | ||
116 | printf ("\n%s: ", src); | 116 | printf ("\n%s: ", src); |
117 | for (i = 0; i < l; i++) | 117 | for (i = 0; i < l; i++) |
118 | { | 118 | { |
119 | printf ("%2x", (int) ((const unsigned char *) p)[i]); | 119 | printf ("%2x", (int) ((const unsigned char *) p)[i]); |
120 | } | 120 | } |
121 | printf ("\n"); | 121 | printf ("\n"); |
122 | } | 122 | } |
123 | #endif | 123 | #endif |
@@ -137,9 +137,9 @@ dump (const char *src, const void *p, unsigned int l) | |||
137 | * @return GNUNET_YES on success | 137 | * @return GNUNET_YES on success |
138 | */ | 138 | */ |
139 | int | 139 | int |
140 | GNUNET_CRYPTO_hkdf_v (void *result, size_t out_len, int xtr_algo, | 140 | GNUNET_CRYPTO_hkdf_v (void *result, size_t out_len, int xtr_algo, int prf_algo, |
141 | int prf_algo, const void *xts, size_t xts_len, | 141 | const void *xts, size_t xts_len, const void *skm, |
142 | const void *skm, size_t skm_len, va_list argp) | 142 | size_t skm_len, va_list argp) |
143 | { | 143 | { |
144 | const void *hc; | 144 | const void *hc; |
145 | unsigned long i, t, d; | 145 | unsigned long i, t, d; |
@@ -158,16 +158,16 @@ GNUNET_CRYPTO_hkdf_v (void *result, size_t out_len, int xtr_algo, | |||
158 | return GNUNET_SYSERR; | 158 | return GNUNET_SYSERR; |
159 | 159 | ||
160 | if (gcry_md_open (&prf, prf_algo, GCRY_MD_FLAG_HMAC) != GPG_ERR_NO_ERROR) | 160 | if (gcry_md_open (&prf, prf_algo, GCRY_MD_FLAG_HMAC) != GPG_ERR_NO_ERROR) |
161 | { | 161 | { |
162 | gcry_md_close (xtr); | 162 | gcry_md_close (xtr); |
163 | return GNUNET_SYSERR; | 163 | return GNUNET_SYSERR; |
164 | } | 164 | } |
165 | 165 | ||
166 | va_copy (args, argp); | 166 | va_copy (args, argp); |
167 | 167 | ||
168 | ctx_len = 0; | 168 | ctx_len = 0; |
169 | while (NULL != va_arg (args, void *)) | 169 | while (NULL != va_arg (args, void *)) |
170 | ctx_len += va_arg (args, size_t); | 170 | ctx_len += va_arg (args, size_t); |
171 | 171 | ||
172 | va_end (args); | 172 | va_end (args); |
173 | 173 | ||
@@ -191,65 +191,65 @@ GNUNET_CRYPTO_hkdf_v (void *result, size_t out_len, int xtr_algo, | |||
191 | dst = plain + k; | 191 | dst = plain + k; |
192 | va_copy (args, argp); | 192 | va_copy (args, argp); |
193 | while ((ctx = va_arg (args, void *))) | 193 | while ((ctx = va_arg (args, void *))) |
194 | { | 194 | { |
195 | size_t len; | 195 | size_t len; |
196 | 196 | ||
197 | len = va_arg (args, size_t); | 197 | len = va_arg (args, size_t); |
198 | memcpy (dst, ctx, len); | 198 | memcpy (dst, ctx, len); |
199 | dst += len; | 199 | dst += len; |
200 | } | 200 | } |
201 | va_end (args); | 201 | va_end (args); |
202 | 202 | ||
203 | if (t > 0) | 203 | if (t > 0) |
204 | { | 204 | { |
205 | memset (plain + k + ctx_len, 1, 1); | 205 | memset (plain + k + ctx_len, 1, 1); |
206 | #if DEBUG_HKDF | 206 | #if DEBUG_HKDF |
207 | dump ("K(1)", plain, plain_len); | 207 | dump ("K(1)", plain, plain_len); |
208 | #endif | 208 | #endif |
209 | hc = doHMAC (prf, prk, xtr_len, &plain[k], ctx_len + 1); | 209 | hc = doHMAC (prf, prk, xtr_len, &plain[k], ctx_len + 1); |
210 | if (hc == NULL) | 210 | if (hc == NULL) |
211 | goto hkdf_error; | 211 | goto hkdf_error; |
212 | memcpy (result, hc, k); | 212 | memcpy (result, hc, k); |
213 | result += k; | 213 | result += k; |
214 | } | 214 | } |
215 | 215 | ||
216 | /* K(i+1) */ | 216 | /* K(i+1) */ |
217 | for (i = 1; i < t; i++) | 217 | for (i = 1; i < t; i++) |
218 | { | 218 | { |
219 | memcpy (plain, result - k, k); | 219 | memcpy (plain, result - k, k); |
220 | memset (plain + k + ctx_len, i + 1, 1); | 220 | memset (plain + k + ctx_len, i + 1, 1); |
221 | gcry_md_reset (prf); | 221 | gcry_md_reset (prf); |
222 | #if DEBUG_HKDF | 222 | #if DEBUG_HKDF |
223 | dump ("K(i+1)", plain, plain_len); | 223 | dump ("K(i+1)", plain, plain_len); |
224 | #endif | 224 | #endif |
225 | hc = doHMAC (prf, prk, xtr_len, plain, plain_len); | 225 | hc = doHMAC (prf, prk, xtr_len, plain, plain_len); |
226 | if (hc == NULL) | 226 | if (hc == NULL) |
227 | goto hkdf_error; | 227 | goto hkdf_error; |
228 | memcpy (result, hc, k); | 228 | memcpy (result, hc, k); |
229 | result += k; | 229 | result += k; |
230 | } | 230 | } |
231 | 231 | ||
232 | /* K(t):d */ | 232 | /* K(t):d */ |
233 | if (d > 0) | 233 | if (d > 0) |
234 | { | ||
235 | if (t > 0) | ||
234 | { | 236 | { |
235 | if (t > 0) | 237 | memcpy (plain, result - k, k); |
236 | { | 238 | i++; |
237 | memcpy (plain, result - k, k); | 239 | } |
238 | i++; | 240 | memset (plain + k + ctx_len, i, 1); |
239 | } | 241 | gcry_md_reset (prf); |
240 | memset (plain + k + ctx_len, i, 1); | ||
241 | gcry_md_reset (prf); | ||
242 | #if DEBUG_HKDF | 242 | #if DEBUG_HKDF |
243 | dump ("K(t):d", plain, plain_len); | 243 | dump ("K(t):d", plain, plain_len); |
244 | #endif | 244 | #endif |
245 | if (t > 0) | 245 | if (t > 0) |
246 | hc = doHMAC (prf, prk, xtr_len, plain, plain_len); | 246 | hc = doHMAC (prf, prk, xtr_len, plain, plain_len); |
247 | else | 247 | else |
248 | hc = doHMAC (prf, prk, xtr_len, plain + k, plain_len - k); | 248 | hc = doHMAC (prf, prk, xtr_len, plain + k, plain_len - k); |
249 | if (hc == NULL) | 249 | if (hc == NULL) |
250 | goto hkdf_error; | 250 | goto hkdf_error; |
251 | memcpy (result, hc, d); | 251 | memcpy (result, hc, d); |
252 | } | 252 | } |
253 | #if DEBUG_HKDF | 253 | #if DEBUG_HKDF |
254 | dump ("result", result - k, out_len); | 254 | dump ("result", result - k, out_len); |
255 | #endif | 255 | #endif |
@@ -281,16 +281,16 @@ hkdf_ok: | |||
281 | */ | 281 | */ |
282 | int | 282 | int |
283 | GNUNET_CRYPTO_hkdf (void *result, size_t out_len, int xtr_algo, int prf_algo, | 283 | GNUNET_CRYPTO_hkdf (void *result, size_t out_len, int xtr_algo, int prf_algo, |
284 | const void *xts, size_t xts_len, const void *skm, | 284 | const void *xts, size_t xts_len, const void *skm, |
285 | size_t skm_len, ...) | 285 | size_t skm_len, ...) |
286 | { | 286 | { |
287 | va_list argp; | 287 | va_list argp; |
288 | int ret; | 288 | int ret; |
289 | 289 | ||
290 | va_start (argp, skm_len); | 290 | va_start (argp, skm_len); |
291 | ret = | 291 | ret = |
292 | GNUNET_CRYPTO_hkdf_v (result, out_len, xtr_algo, prf_algo, xts, xts_len, | 292 | GNUNET_CRYPTO_hkdf_v (result, out_len, xtr_algo, prf_algo, xts, xts_len, |
293 | skm, skm_len, argp); | 293 | skm, skm_len, argp); |
294 | va_end (argp); | 294 | va_end (argp); |
295 | 295 | ||
296 | return ret; | 296 | return ret; |