summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/lib/libssl/t1_enc.c39
1 files changed, 19 insertions, 20 deletions
diff --git a/src/lib/libssl/t1_enc.c b/src/lib/libssl/t1_enc.c
index fe822a98ef..0179ac3061 100644
--- a/src/lib/libssl/t1_enc.c
+++ b/src/lib/libssl/t1_enc.c
@@ -1,4 +1,4 @@
1/* $OpenBSD: t1_enc.c,v 1.100 2017/03/10 15:03:59 jsing Exp $ */ 1/* $OpenBSD: t1_enc.c,v 1.101 2017/03/10 15:08:49 jsing Exp $ */
2/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) 2/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
3 * All rights reserved. 3 * All rights reserved.
4 * 4 *
@@ -288,33 +288,33 @@ tls1_record_sequence_increment(unsigned char *seq)
288 } 288 }
289} 289}
290 290
291/* seed1 through seed5 are virtually concatenated */ 291/*
292 * TLS P_hash() data expansion function - see RFC 5246, section 5.
293 */
292static int 294static int
293tls1_P_hash(const EVP_MD *md, const unsigned char *sec, int sec_len, 295tls1_P_hash(const EVP_MD *md, const unsigned char *sec, int sec_len,
294 const void *seed1, int seed1_len, const void *seed2, int seed2_len, 296 const void *seed1, int seed1_len, const void *seed2, int seed2_len,
295 const void *seed3, int seed3_len, const void *seed4, int seed4_len, 297 const void *seed3, int seed3_len, const void *seed4, int seed4_len,
296 const void *seed5, int seed5_len, unsigned char *out, int olen) 298 const void *seed5, int seed5_len, unsigned char *out, int olen)
297{ 299{
298 int chunk;
299 size_t j;
300 EVP_MD_CTX ctx, ctx_tmp;
301 EVP_PKEY *mac_key;
302 unsigned char A1[EVP_MAX_MD_SIZE]; 300 unsigned char A1[EVP_MAX_MD_SIZE];
301 EVP_MD_CTX ctx;
302 EVP_PKEY *mac_key;
303 size_t A1_len; 303 size_t A1_len;
304 int ret = 0; 304 int ret = 0;
305 int chunk;
306 size_t j;
305 307
306 chunk = EVP_MD_size(md); 308 chunk = EVP_MD_size(md);
307 OPENSSL_assert(chunk >= 0); 309 OPENSSL_assert(chunk >= 0);
308 310
309 EVP_MD_CTX_init(&ctx); 311 EVP_MD_CTX_init(&ctx);
310 EVP_MD_CTX_init(&ctx_tmp); 312
311 mac_key = EVP_PKEY_new_mac_key(EVP_PKEY_HMAC, NULL, sec, sec_len); 313 mac_key = EVP_PKEY_new_mac_key(EVP_PKEY_HMAC, NULL, sec, sec_len);
312 if (!mac_key) 314 if (!mac_key)
313 goto err; 315 goto err;
314 if (!EVP_DigestSignInit(&ctx, NULL, md, NULL, mac_key)) 316 if (!EVP_DigestSignInit(&ctx, NULL, md, NULL, mac_key))
315 goto err; 317 goto err;
316 if (!EVP_DigestSignInit(&ctx_tmp, NULL, md, NULL, mac_key))
317 goto err;
318 if (seed1 && !EVP_DigestSignUpdate(&ctx, seed1, seed1_len)) 318 if (seed1 && !EVP_DigestSignUpdate(&ctx, seed1, seed1_len))
319 goto err; 319 goto err;
320 if (seed2 && !EVP_DigestSignUpdate(&ctx, seed2, seed2_len)) 320 if (seed2 && !EVP_DigestSignUpdate(&ctx, seed2, seed2_len))
@@ -329,15 +329,10 @@ tls1_P_hash(const EVP_MD *md, const unsigned char *sec, int sec_len,
329 goto err; 329 goto err;
330 330
331 for (;;) { 331 for (;;) {
332 /* Reinit mac contexts */
333 if (!EVP_DigestSignInit(&ctx, NULL, md, NULL, mac_key)) 332 if (!EVP_DigestSignInit(&ctx, NULL, md, NULL, mac_key))
334 goto err; 333 goto err;
335 if (!EVP_DigestSignInit(&ctx_tmp, NULL, md, NULL, mac_key))
336 goto err;
337 if (!EVP_DigestSignUpdate(&ctx, A1, A1_len)) 334 if (!EVP_DigestSignUpdate(&ctx, A1, A1_len))
338 goto err; 335 goto err;
339 if (!EVP_DigestSignUpdate(&ctx_tmp, A1, A1_len))
340 goto err;
341 if (seed1 && !EVP_DigestSignUpdate(&ctx, seed1, seed1_len)) 336 if (seed1 && !EVP_DigestSignUpdate(&ctx, seed1, seed1_len))
342 goto err; 337 goto err;
343 if (seed2 && !EVP_DigestSignUpdate(&ctx, seed2, seed2_len)) 338 if (seed2 && !EVP_DigestSignUpdate(&ctx, seed2, seed2_len))
@@ -354,24 +349,28 @@ tls1_P_hash(const EVP_MD *md, const unsigned char *sec, int sec_len,
354 goto err; 349 goto err;
355 out += j; 350 out += j;
356 olen -= j; 351 olen -= j;
357 /* calc the next A1 value */
358 if (!EVP_DigestSignFinal(&ctx_tmp, A1, &A1_len))
359 goto err;
360 } else { 352 } else {
361 /* last one */
362 if (!EVP_DigestSignFinal(&ctx, A1, &A1_len)) 353 if (!EVP_DigestSignFinal(&ctx, A1, &A1_len))
363 goto err; 354 goto err;
364 memcpy(out, A1, olen); 355 memcpy(out, A1, olen);
365 break; 356 break;
366 } 357 }
358
359 if (!EVP_DigestSignInit(&ctx, NULL, md, NULL, mac_key))
360 goto err;
361 if (!EVP_DigestSignUpdate(&ctx, A1, A1_len))
362 goto err;
363 if (!EVP_DigestSignFinal(&ctx, A1, &A1_len))
364 goto err;
367 } 365 }
368 ret = 1; 366 ret = 1;
369 367
370err: 368 err:
371 EVP_PKEY_free(mac_key); 369 EVP_PKEY_free(mac_key);
372 EVP_MD_CTX_cleanup(&ctx); 370 EVP_MD_CTX_cleanup(&ctx);
373 EVP_MD_CTX_cleanup(&ctx_tmp); 371
374 explicit_bzero(A1, sizeof(A1)); 372 explicit_bzero(A1, sizeof(A1));
373
375 return ret; 374 return ret;
376} 375}
377 376