aboutsummaryrefslogtreecommitdiff
path: root/src/util/crypto_hkdf.c
diff options
context:
space:
mode:
authorChristian Grothoff <christian@grothoff.org>2011-08-15 21:46:35 +0000
committerChristian Grothoff <christian@grothoff.org>2011-08-15 21:46:35 +0000
commit502af2167f7c218366666ca4944bd7cc54b5b19a (patch)
treea91fec5cc9769d260640bd91c6633cb9cf395524 /src/util/crypto_hkdf.c
parent03af5a603b7cc53432249d5854cd412aa90dde0d (diff)
downloadgnunet-502af2167f7c218366666ca4944bd7cc54b5b19a.tar.gz
gnunet-502af2167f7c218366666ca4944bd7cc54b5b19a.zip
indentation
Diffstat (limited to 'src/util/crypto_hkdf.c')
-rw-r--r--src/util/crypto_hkdf.c134
1 files changed, 62 insertions, 72 deletions
diff --git a/src/util/crypto_hkdf.c b/src/util/crypto_hkdf.c
index 494f3d0ab..d97f516fe 100644
--- a/src/util/crypto_hkdf.c
+++ b/src/util/crypto_hkdf.c
@@ -71,9 +71,8 @@
71 * @return HMAC, freed by caller via gcry_md_close/_reset 71 * @return HMAC, freed by caller via gcry_md_close/_reset
72 */ 72 */
73static const void * 73static const void *
74doHMAC (gcry_md_hd_t mac, 74doHMAC (gcry_md_hd_t mac,
75 const void *key, size_t key_len, 75 const void *key, size_t key_len, const void *buf, size_t buf_len)
76 const void *buf, size_t buf_len)
77{ 76{
78 gcry_md_setkey (mac, key, key_len); 77 gcry_md_setkey (mac, key, key_len);
79 gcry_md_write (mac, buf, buf_len); 78 gcry_md_write (mac, buf, buf_len);
@@ -92,38 +91,33 @@ doHMAC (gcry_md_hd_t mac,
92 * @return GNUNET_YES on success 91 * @return GNUNET_YES on success
93 */ 92 */
94static int 93static int
95getPRK (gcry_md_hd_t mac, 94getPRK (gcry_md_hd_t mac,
96 const void *xts, size_t xts_len, 95 const void *xts, size_t xts_len,
97 const void *skm, size_t skm_len, 96 const void *skm, size_t skm_len, void *prk)
98 void *prk)
99{ 97{
100 const void *ret; 98 const void *ret;
101 99
102 ret = doHMAC (mac, xts, xts_len, skm, skm_len); 100 ret = doHMAC (mac, xts, xts_len, skm, skm_len);
103 if (ret == NULL) 101 if (ret == NULL)
104 return GNUNET_SYSERR; 102 return GNUNET_SYSERR;
105 memcpy (prk, 103 memcpy (prk, ret, gcry_md_get_algo_dlen (gcry_md_get_algo (mac)));
106 ret,
107 gcry_md_get_algo_dlen (gcry_md_get_algo (mac)));
108 104
109 return GNUNET_YES; 105 return GNUNET_YES;
110} 106}
111 107
112 108
113#if DEBUG_HKDF 109#if DEBUG_HKDF
114static void 110static void
115dump(const char *src, 111dump (const char *src, const void *p, unsigned int l)
116 const void *p,
117 unsigned int l)
118{ 112{
119 unsigned int i; 113 unsigned int i;
120 114
121 printf("\n%s: ", src); 115 printf ("\n%s: ", src);
122 for (i = 0; i < l; i++) 116 for (i = 0; i < l; i++)
123 { 117 {
124 printf("%2x", (int) ((const unsigned char *) p)[i]); 118 printf ("%2x", (int) ((const unsigned char *) p)[i]);
125 } 119 }
126 printf("\n"); 120 printf ("\n");
127} 121}
128#endif 122#endif
129 123
@@ -143,10 +137,9 @@ dump(const char *src,
143 */ 137 */
144int 138int
145GNUNET_CRYPTO_hkdf_v (void *result, size_t out_len, 139GNUNET_CRYPTO_hkdf_v (void *result, size_t out_len,
146 int xtr_algo, int prf_algo, 140 int xtr_algo, int prf_algo,
147 const void *xts, size_t xts_len, 141 const void *xts, size_t xts_len,
148 const void *skm, size_t skm_len, 142 const void *skm, size_t skm_len, va_list argp)
149 va_list argp)
150{ 143{
151 const void *hc; 144 const void *hc;
152 unsigned long i, t, d; 145 unsigned long i, t, d;
@@ -161,10 +154,10 @@ GNUNET_CRYPTO_hkdf_v (void *result, size_t out_len,
161 if (k == 0) 154 if (k == 0)
162 return GNUNET_SYSERR; 155 return GNUNET_SYSERR;
163 156
164 if (gcry_md_open(&xtr, xtr_algo, GCRY_MD_FLAG_HMAC) != GPG_ERR_NO_ERROR) 157 if (gcry_md_open (&xtr, xtr_algo, GCRY_MD_FLAG_HMAC) != GPG_ERR_NO_ERROR)
165 return GNUNET_SYSERR; 158 return GNUNET_SYSERR;
166 159
167 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)
168 { 161 {
169 gcry_md_close (xtr); 162 gcry_md_close (xtr);
170 return GNUNET_SYSERR; 163 return GNUNET_SYSERR;
@@ -174,15 +167,15 @@ GNUNET_CRYPTO_hkdf_v (void *result, size_t out_len,
174 167
175 ctx_len = 0; 168 ctx_len = 0;
176 while (NULL != va_arg (args, void *)) 169 while (NULL != va_arg (args, void *))
177 ctx_len += va_arg (args, size_t); 170 ctx_len += va_arg (args, size_t);
178 va_end(args); 171
172 va_end (args);
179 173
180 memset (result, 0, out_len); 174 memset (result, 0, out_len);
181 if (getPRK (xtr, xts, xts_len, skm, skm_len, prk) 175 if (getPRK (xtr, xts, xts_len, skm, skm_len, prk) != GNUNET_YES)
182 != GNUNET_YES)
183 goto hkdf_error; 176 goto hkdf_error;
184#if DEBUG_HKDF 177#if DEBUG_HKDF
185 dump("PRK", prk, xtr_len); 178 dump ("PRK", prk, xtr_len);
186#endif 179#endif
187 180
188 t = out_len / k; 181 t = out_len / k;
@@ -190,46 +183,44 @@ GNUNET_CRYPTO_hkdf_v (void *result, size_t out_len,
190 183
191 /* K(1) */ 184 /* K(1) */
192 { 185 {
193 size_t plain_len = k + ctx_len + 1; 186 size_t plain_len = k + ctx_len + 1;
194 char plain[plain_len]; 187 char plain[plain_len];
195 const void *ctx; 188 const void *ctx;
196 char *dst; 189 char *dst;
197 190
198 dst = plain + k; 191 dst = plain + k;
199 va_copy (args, argp); 192 va_copy (args, argp);
200 while ((ctx = va_arg (args, void *))) 193 while ((ctx = va_arg (args, void *)))
201 { 194 {
202 size_t len; 195 size_t len;
203 196
204 len = va_arg (args, size_t); 197 len = va_arg (args, size_t);
205 memcpy (dst, ctx, len); 198 memcpy (dst, ctx, len);
206 dst += len; 199 dst += len;
207 } 200 }
208 va_end (args); 201 va_end (args);
209 202
210 if (t > 0) 203 if (t > 0)
211 { 204 {
212 memset (plain + k + ctx_len, 1, 1); 205 memset (plain + k + ctx_len, 1, 1);
213#if DEBUG_HKDF 206#if DEBUG_HKDF
214 dump("K(1)", plain, plain_len); 207 dump ("K(1)", plain, plain_len);
215#endif 208#endif
216 hc = doHMAC (prf, 209 hc = doHMAC (prf, prk, xtr_len, &plain[k], ctx_len + 1);
217 prk,
218 xtr_len, &plain[k], ctx_len + 1);
219 if (hc == NULL) 210 if (hc == NULL)
220 goto hkdf_error; 211 goto hkdf_error;
221 memcpy (result, hc, k); 212 memcpy (result, hc, k);
222 result += k; 213 result += k;
223 } 214 }
224 215
225 /* K(i+1) */ 216 /* K(i+1) */
226 for (i = 1; i < t; i++) 217 for (i = 1; i < t; i++)
227 { 218 {
228 memcpy (plain, result - k, k); 219 memcpy (plain, result - k, k);
229 memset (plain + k + ctx_len, i + 1, 1); 220 memset (plain + k + ctx_len, i + 1, 1);
230 gcry_md_reset (prf); 221 gcry_md_reset (prf);
231#if DEBUG_HKDF 222#if DEBUG_HKDF
232 dump("K(i+1)", plain, plain_len); 223 dump ("K(i+1)", plain, plain_len);
233#endif 224#endif
234 hc = doHMAC (prf, prk, xtr_len, plain, plain_len); 225 hc = doHMAC (prf, prk, xtr_len, plain, plain_len);
235 if (hc == NULL) 226 if (hc == NULL)
@@ -238,18 +229,18 @@ GNUNET_CRYPTO_hkdf_v (void *result, size_t out_len,
238 result += k; 229 result += k;
239 } 230 }
240 231
241 /* K(t):d */ 232 /* K(t):d */
242 if (d > 0) 233 if (d > 0)
243 { 234 {
244 if (t > 0) 235 if (t > 0)
245 { 236 {
246 memcpy (plain, result - k, k); 237 memcpy (plain, result - k, k);
247 i++; 238 i++;
248 } 239 }
249 memset (plain + k + ctx_len, i, 1); 240 memset (plain + k + ctx_len, i, 1);
250 gcry_md_reset (prf); 241 gcry_md_reset (prf);
251#if DEBUG_HKDF 242#if DEBUG_HKDF
252 dump("K(t):d", plain, plain_len); 243 dump ("K(t):d", plain, plain_len);
253#endif 244#endif
254 if (t > 0) 245 if (t > 0)
255 hc = doHMAC (prf, prk, xtr_len, plain, plain_len); 246 hc = doHMAC (prf, prk, xtr_len, plain, plain_len);
@@ -260,11 +251,11 @@ GNUNET_CRYPTO_hkdf_v (void *result, size_t out_len,
260 memcpy (result, hc, d); 251 memcpy (result, hc, d);
261 } 252 }
262#if DEBUG_HKDF 253#if DEBUG_HKDF
263 dump("result", result - k, out_len); 254 dump ("result", result - k, out_len);
264#endif 255#endif
265 256
266 ret = GNUNET_YES; 257 ret = GNUNET_YES;
267 goto hkdf_ok; 258 goto hkdf_ok;
268 } 259 }
269hkdf_error: 260hkdf_error:
270 ret = GNUNET_SYSERR; 261 ret = GNUNET_SYSERR;
@@ -290,18 +281,17 @@ hkdf_ok:
290 */ 281 */
291int 282int
292GNUNET_CRYPTO_hkdf (void *result, size_t out_len, 283GNUNET_CRYPTO_hkdf (void *result, size_t out_len,
293 int xtr_algo, int prf_algo, 284 int xtr_algo, int prf_algo,
294 const void *xts, size_t xts_len, 285 const void *xts, size_t xts_len,
295 const void *skm, size_t skm_len, 286 const void *skm, size_t skm_len, ...)
296 ...)
297{ 287{
298 va_list argp; 288 va_list argp;
299 int ret; 289 int ret;
300 290
301 va_start(argp, skm_len); 291 va_start (argp, skm_len);
302 ret = GNUNET_CRYPTO_hkdf_v (result, out_len, xtr_algo, prf_algo, xts, 292 ret = GNUNET_CRYPTO_hkdf_v (result, out_len, xtr_algo, prf_algo, xts,
303 xts_len, skm, skm_len, argp); 293 xts_len, skm, skm_len, argp);
304 va_end(argp); 294 va_end (argp);
305 295
306 return ret; 296 return ret;
307} 297}