diff options
author | Christian Grothoff <christian@grothoff.org> | 2011-08-15 21:46:35 +0000 |
---|---|---|
committer | Christian Grothoff <christian@grothoff.org> | 2011-08-15 21:46:35 +0000 |
commit | 502af2167f7c218366666ca4944bd7cc54b5b19a (patch) | |
tree | a91fec5cc9769d260640bd91c6633cb9cf395524 /src/util/crypto_hkdf.c | |
parent | 03af5a603b7cc53432249d5854cd412aa90dde0d (diff) | |
download | gnunet-502af2167f7c218366666ca4944bd7cc54b5b19a.tar.gz gnunet-502af2167f7c218366666ca4944bd7cc54b5b19a.zip |
indentation
Diffstat (limited to 'src/util/crypto_hkdf.c')
-rw-r--r-- | src/util/crypto_hkdf.c | 134 |
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 | */ |
73 | static const void * | 73 | static const void * |
74 | doHMAC (gcry_md_hd_t mac, | 74 | doHMAC (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 | */ |
94 | static int | 93 | static int |
95 | getPRK (gcry_md_hd_t mac, | 94 | getPRK (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 |
114 | static void | 110 | static void |
115 | dump(const char *src, | 111 | dump (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 | */ |
144 | int | 138 | int |
145 | GNUNET_CRYPTO_hkdf_v (void *result, size_t out_len, | 139 | GNUNET_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 | } |
269 | hkdf_error: | 260 | hkdf_error: |
270 | ret = GNUNET_SYSERR; | 261 | ret = GNUNET_SYSERR; |
@@ -290,18 +281,17 @@ hkdf_ok: | |||
290 | */ | 281 | */ |
291 | int | 282 | int |
292 | GNUNET_CRYPTO_hkdf (void *result, size_t out_len, | 283 | GNUNET_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 | } |