diff options
Diffstat (limited to 'src/util/crypto_hkdf.c')
-rw-r--r-- | src/util/crypto_hkdf.c | 184 |
1 files changed, 92 insertions, 92 deletions
diff --git a/src/util/crypto_hkdf.c b/src/util/crypto_hkdf.c index 5ed22269f..58ae6c8ad 100644 --- a/src/util/crypto_hkdf.c +++ b/src/util/crypto_hkdf.c | |||
@@ -18,7 +18,7 @@ | |||
18 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, | 18 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, |
19 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN | 19 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN |
20 | THE SOFTWARE. | 20 | THE SOFTWARE. |
21 | */ | 21 | */ |
22 | 22 | ||
23 | /** | 23 | /** |
24 | * @file src/util/crypto_hkdf.c | 24 | * @file 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 | */ |
77 | static const void * | 77 | static const void * |
78 | doHMAC (gcry_md_hd_t mac, const void *key, size_t key_len, const void *buf, | 78 | doHMAC(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 | */ |
97 | static int | 97 | static int |
98 | getPRK (gcry_md_hd_t mac, const void *xts, size_t xts_len, const void *skm, | 98 | getPRK(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 |
113 | static void | 113 | static void |
114 | dump (const char *src, const void *p, unsigned int l) | 114 | dump(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 | */ |
141 | int | 141 | int |
142 | GNUNET_CRYPTO_hkdf_v (void *result, size_t out_len, int xtr_algo, int prf_algo, | 142 | GNUNET_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) | ||
242 | { | 240 | { |
243 | GNUNET_memcpy (plain, result - k, k); | 241 | if (t > 0) |
244 | i++; | 242 | { |
245 | } | 243 | GNUNET_memcpy(plain, result - k, k); |
246 | memset (plain + k + ctx_len, i, 1); | 244 | i++; |
247 | gcry_md_reset (prf); | 245 | } |
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, | |||
266 | hkdf_error: | 266 | hkdf_error: |
267 | ret = GNUNET_SYSERR; | 267 | ret = GNUNET_SYSERR; |
268 | hkdf_ok: | 268 | hkdf_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 | */ |
288 | int | 288 | int |
289 | GNUNET_CRYPTO_hkdf (void *result, size_t out_len, int xtr_algo, int prf_algo, | 289 | GNUNET_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 | } |