aboutsummaryrefslogtreecommitdiff
path: root/src/util/crypto_hkdf.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/util/crypto_hkdf.c')
-rw-r--r--src/util/crypto_hkdf.c182
1 files changed, 91 insertions, 91 deletions
diff --git a/src/util/crypto_hkdf.c b/src/util/crypto_hkdf.c
index 58ae6c8ad..fea4f9861 100644
--- a/src/util/crypto_hkdf.c
+++ b/src/util/crypto_hkdf.c
@@ -36,7 +36,7 @@
36 * - Matthias Wachs (08.10.2010) 36 * - Matthias Wachs (08.10.2010)
37 */ 37 */
38 38
39#define LOG(kind, ...) GNUNET_log_from(kind, "util-crypto-hkdf", __VA_ARGS__) 39#define LOG(kind, ...) GNUNET_log_from (kind, "util-crypto-hkdf", __VA_ARGS__)
40 40
41/** 41/**
42 * Set this to 0 if you compile this code outside of GNUnet. 42 * Set this to 0 if you compile this code outside of GNUnet.
@@ -75,13 +75,13 @@
75 * @return HMAC, freed by caller via gcry_md_close/_reset 75 * @return HMAC, freed by caller via gcry_md_close/_reset
76 */ 76 */
77static const void * 77static const void *
78doHMAC(gcry_md_hd_t mac, const void *key, size_t key_len, const void *buf, 78doHMAC (gcry_md_hd_t mac, const void *key, size_t key_len, const void *buf,
79 size_t buf_len) 79 size_t buf_len)
80{ 80{
81 gcry_md_setkey(mac, key, key_len); 81 gcry_md_setkey (mac, key, key_len);
82 gcry_md_write(mac, buf, buf_len); 82 gcry_md_write (mac, buf, buf_len);
83 83
84 return (const void *)gcry_md_read(mac, 0); 84 return (const void *) gcry_md_read (mac, 0);
85} 85}
86 86
87/** 87/**
@@ -95,15 +95,15 @@ doHMAC(gcry_md_hd_t mac, const void *key, size_t key_len, const void *buf,
95 * @return #GNUNET_YES on success 95 * @return #GNUNET_YES on success
96 */ 96 */
97static int 97static int
98getPRK(gcry_md_hd_t mac, const void *xts, size_t xts_len, const void *skm, 98getPRK (gcry_md_hd_t mac, const void *xts, size_t xts_len, const void *skm,
99 size_t skm_len, void *prk) 99 size_t skm_len, void *prk)
100{ 100{
101 const void *ret; 101 const void *ret;
102 102
103 ret = doHMAC(mac, xts, xts_len, skm, skm_len); 103 ret = doHMAC (mac, xts, xts_len, skm, skm_len);
104 if (ret == NULL) 104 if (ret == NULL)
105 return GNUNET_SYSERR; 105 return GNUNET_SYSERR;
106 GNUNET_memcpy(prk, ret, gcry_md_get_algo_dlen(gcry_md_get_algo(mac))); 106 GNUNET_memcpy (prk, ret, gcry_md_get_algo_dlen (gcry_md_get_algo (mac)));
107 107
108 return GNUNET_YES; 108 return GNUNET_YES;
109} 109}
@@ -111,16 +111,16 @@ getPRK(gcry_md_hd_t mac, const void *xts, size_t xts_len, const void *skm,
111 111
112#if DEBUG_HKDF 112#if DEBUG_HKDF
113static void 113static void
114dump(const char *src, const void *p, unsigned int l) 114dump (const char *src, const void *p, unsigned int l)
115{ 115{
116 unsigned int i; 116 unsigned int i;
117 117
118 printf("\n%s: ", src); 118 printf ("\n%s: ", src);
119 for (i = 0; i < l; i++) 119 for (i = 0; i < l; i++)
120 { 120 {
121 printf("%2x", (int)((const unsigned char *)p)[i]); 121 printf ("%2x", (int) ((const unsigned char *) p)[i]);
122 } 122 }
123 printf("\n"); 123 printf ("\n");
124} 124}
125#endif 125#endif
126 126
@@ -139,9 +139,9 @@ dump(const char *src, const void *p, unsigned int l)
139 * @return #GNUNET_YES on success 139 * @return #GNUNET_YES on success
140 */ 140 */
141int 141int
142GNUNET_CRYPTO_hkdf_v(void *result, size_t out_len, int xtr_algo, int prf_algo, 142GNUNET_CRYPTO_hkdf_v (void *result, size_t out_len, int xtr_algo, int prf_algo,
143 const void *xts, size_t xts_len, const void *skm, 143 const void *xts, size_t xts_len, const void *skm,
144 size_t skm_len, va_list argp) 144 size_t skm_len, va_list argp)
145{ 145{
146 gcry_md_hd_t xtr; 146 gcry_md_hd_t xtr;
147 gcry_md_hd_t prf; 147 gcry_md_hd_t prf;
@@ -149,39 +149,39 @@ GNUNET_CRYPTO_hkdf_v(void *result, size_t out_len, int xtr_algo, int prf_algo,
149 unsigned long i; 149 unsigned long i;
150 unsigned long t; 150 unsigned long t;
151 unsigned long d; 151 unsigned long d;
152 unsigned int k = gcry_md_get_algo_dlen(prf_algo); 152 unsigned int k = gcry_md_get_algo_dlen (prf_algo);
153 unsigned int xtr_len = gcry_md_get_algo_dlen(xtr_algo); 153 unsigned int xtr_len = gcry_md_get_algo_dlen (xtr_algo);
154 char prk[xtr_len]; 154 char prk[xtr_len];
155 int ret; 155 int ret;
156 size_t ctx_len; 156 size_t ctx_len;
157 va_list args; 157 va_list args;
158 158
159 BENCHMARK_START(hkdf); 159 BENCHMARK_START (hkdf);
160 160
161 if (0 == k) 161 if (0 == k)
162 return GNUNET_SYSERR; 162 return GNUNET_SYSERR;
163 if (GPG_ERR_NO_ERROR != 163 if (GPG_ERR_NO_ERROR !=
164 gcry_md_open(&xtr, xtr_algo, GCRY_MD_FLAG_HMAC)) 164 gcry_md_open (&xtr, xtr_algo, GCRY_MD_FLAG_HMAC))
165 return GNUNET_SYSERR; 165 return GNUNET_SYSERR;
166 if (GPG_ERR_NO_ERROR != 166 if (GPG_ERR_NO_ERROR !=
167 gcry_md_open(&prf, prf_algo, GCRY_MD_FLAG_HMAC)) 167 gcry_md_open (&prf, prf_algo, GCRY_MD_FLAG_HMAC))
168 { 168 {
169 gcry_md_close(xtr); 169 gcry_md_close (xtr);
170 return GNUNET_SYSERR; 170 return GNUNET_SYSERR;
171 } 171 }
172 va_copy(args, argp); 172 va_copy (args, argp);
173 173
174 ctx_len = 0; 174 ctx_len = 0;
175 while (NULL != va_arg(args, void *)) 175 while (NULL != va_arg (args, void *))
176 ctx_len += va_arg(args, size_t); 176 ctx_len += va_arg (args, size_t);
177 177
178 va_end(args); 178 va_end (args);
179 179
180 memset(result, 0, out_len); 180 memset (result, 0, out_len);
181 if (getPRK(xtr, xts, xts_len, skm, skm_len, prk) != GNUNET_YES) 181 if (getPRK (xtr, xts, xts_len, skm, skm_len, prk) != GNUNET_YES)
182 goto hkdf_error; 182 goto hkdf_error;
183#if DEBUG_HKDF 183#if DEBUG_HKDF
184 dump("PRK", prk, xtr_len); 184 dump ("PRK", prk, xtr_len);
185#endif 185#endif
186 186
187 t = out_len / k; 187 t = out_len / k;
@@ -195,69 +195,69 @@ GNUNET_CRYPTO_hkdf_v(void *result, size_t out_len, int xtr_algo, int prf_algo,
195 char *dst; 195 char *dst;
196 196
197 dst = plain + k; 197 dst = plain + k;
198 va_copy(args, argp); 198 va_copy (args, argp);
199 while ((ctx = va_arg(args, void *))) 199 while ((ctx = va_arg (args, void *)))
200 { 200 {
201 size_t len; 201 size_t len;
202 202
203 len = va_arg(args, size_t); 203 len = va_arg (args, size_t);
204 GNUNET_memcpy(dst, ctx, len); 204 GNUNET_memcpy (dst, ctx, len);
205 dst += len; 205 dst += len;
206 } 206 }
207 va_end(args); 207 va_end (args);
208 208
209 if (t > 0) 209 if (t > 0)
210 { 210 {
211 memset(plain + k + ctx_len, 1, 1); 211 memset (plain + k + ctx_len, 1, 1);
212#if DEBUG_HKDF 212#if DEBUG_HKDF
213 dump("K(1)", plain, plain_len); 213 dump ("K(1)", plain, plain_len);
214#endif 214#endif
215 hc = doHMAC(prf, prk, xtr_len, &plain[k], ctx_len + 1); 215 hc = doHMAC (prf, prk, xtr_len, &plain[k], ctx_len + 1);
216 if (hc == NULL) 216 if (hc == NULL)
217 goto hkdf_error; 217 goto hkdf_error;
218 GNUNET_memcpy(result, hc, k); 218 GNUNET_memcpy (result, hc, k);
219 result += k; 219 result += k;
220 } 220 }
221 221
222 /* K(i+1) */ 222 /* K(i+1) */
223 for (i = 1; i < t; i++) 223 for (i = 1; i < t; i++)
224 { 224 {
225 GNUNET_memcpy(plain, result - k, k); 225 GNUNET_memcpy (plain, result - k, k);
226 memset(plain + k + ctx_len, i + 1, 1); 226 memset (plain + k + ctx_len, i + 1, 1);
227 gcry_md_reset(prf); 227 gcry_md_reset (prf);
228#if DEBUG_HKDF 228#if DEBUG_HKDF
229 dump("K(i+1)", plain, plain_len); 229 dump ("K(i+1)", plain, plain_len);
230#endif 230#endif
231 hc = doHMAC(prf, prk, xtr_len, plain, plain_len); 231 hc = doHMAC (prf, prk, xtr_len, plain, plain_len);
232 if (hc == NULL) 232 if (hc == NULL)
233 goto hkdf_error; 233 goto hkdf_error;
234 GNUNET_memcpy(result, hc, k); 234 GNUNET_memcpy (result, hc, k);
235 result += k; 235 result += k;
236 } 236 }
237 237
238 /* K(t):d */ 238 /* K(t):d */
239 if (d > 0) 239 if (d > 0)
240 {
241 if (t > 0)
240 { 242 {
241 if (t > 0) 243 GNUNET_memcpy (plain, result - k, k);
242 { 244 i++;
243 GNUNET_memcpy(plain, result - k, k); 245 }
244 i++; 246 memset (plain + k + ctx_len, i, 1);
245 } 247 gcry_md_reset (prf);
246 memset(plain + k + ctx_len, i, 1);
247 gcry_md_reset(prf);
248#if DEBUG_HKDF 248#if DEBUG_HKDF
249 dump("K(t):d", plain, plain_len); 249 dump ("K(t):d", plain, plain_len);
250#endif 250#endif
251 if (t > 0) 251 if (t > 0)
252 hc = doHMAC(prf, prk, xtr_len, plain, plain_len); 252 hc = doHMAC (prf, prk, xtr_len, plain, plain_len);
253 else 253 else
254 hc = doHMAC(prf, prk, xtr_len, plain + k, plain_len - k); 254 hc = doHMAC (prf, prk, xtr_len, plain + k, plain_len - k);
255 if (hc == NULL) 255 if (hc == NULL)
256 goto hkdf_error; 256 goto hkdf_error;
257 GNUNET_memcpy(result, hc, d); 257 GNUNET_memcpy (result, hc, d);
258 } 258 }
259#if DEBUG_HKDF 259#if DEBUG_HKDF
260 dump("result", result - k, out_len); 260 dump ("result", result - k, out_len);
261#endif 261#endif
262 262
263 ret = GNUNET_YES; 263 ret = GNUNET_YES;
@@ -266,9 +266,9 @@ GNUNET_CRYPTO_hkdf_v(void *result, size_t out_len, int xtr_algo, int prf_algo,
266hkdf_error: 266hkdf_error:
267 ret = GNUNET_SYSERR; 267 ret = GNUNET_SYSERR;
268hkdf_ok: 268hkdf_ok:
269 gcry_md_close(xtr); 269 gcry_md_close (xtr);
270 gcry_md_close(prf); 270 gcry_md_close (prf);
271 BENCHMARK_END(hkdf); 271 BENCHMARK_END (hkdf);
272 return ret; 272 return ret;
273} 273}
274 274
@@ -286,18 +286,18 @@ hkdf_ok:
286 * @return #GNUNET_YES on success 286 * @return #GNUNET_YES on success
287 */ 287 */
288int 288int
289GNUNET_CRYPTO_hkdf(void *result, size_t out_len, int xtr_algo, int prf_algo, 289GNUNET_CRYPTO_hkdf (void *result, size_t out_len, int xtr_algo, int prf_algo,
290 const void *xts, size_t xts_len, const void *skm, 290 const void *xts, size_t xts_len, const void *skm,
291 size_t skm_len, ...) 291 size_t skm_len, ...)
292{ 292{
293 va_list argp; 293 va_list argp;
294 int ret; 294 int ret;
295 295
296 va_start(argp, skm_len); 296 va_start (argp, skm_len);
297 ret = 297 ret =
298 GNUNET_CRYPTO_hkdf_v(result, out_len, xtr_algo, prf_algo, xts, xts_len, 298 GNUNET_CRYPTO_hkdf_v (result, out_len, xtr_algo, prf_algo, xts, xts_len,
299 skm, skm_len, argp); 299 skm, skm_len, argp);
300 va_end(argp); 300 va_end (argp);
301 301
302 return ret; 302 return ret;
303} 303}