diff options
Diffstat (limited to 'src/lib')
-rw-r--r-- | src/lib/libssl/t1_enc.c | 67 |
1 files changed, 19 insertions, 48 deletions
diff --git a/src/lib/libssl/t1_enc.c b/src/lib/libssl/t1_enc.c index 62578beeea..84f2e182d9 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.97 2017/03/05 14:39:53 jsing Exp $ */ | 1 | /* $OpenBSD: t1_enc.c,v 1.98 2017/03/06 15:08:57 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 | * |
@@ -372,67 +372,39 @@ err: | |||
372 | 372 | ||
373 | /* seed1 through seed5 are virtually concatenated */ | 373 | /* seed1 through seed5 are virtually concatenated */ |
374 | static int | 374 | static int |
375 | tls1_PRF(long digest_mask, const void *seed1, int seed1_len, const void *seed2, | 375 | tls1_PRF(SSL *s, const void *seed1, int seed1_len, const void *seed2, |
376 | int seed2_len, const void *seed3, int seed3_len, const void *seed4, | 376 | int seed2_len, const void *seed3, int seed3_len, const void *seed4, |
377 | int seed4_len, const void *seed5, int seed5_len, const unsigned char *sec, | 377 | int seed4_len, const void *seed5, int seed5_len, const unsigned char *sec, |
378 | int slen, unsigned char *out1, unsigned char *out2, int olen) | 378 | int slen, unsigned char *out1, unsigned char *out2, int olen) |
379 | { | 379 | { |
380 | int len, i, idx, count; | ||
381 | const unsigned char *S1; | ||
382 | long m; | ||
383 | const EVP_MD *md; | 380 | const EVP_MD *md; |
384 | int ret = 0; | 381 | int i; |
385 | 382 | ||
386 | /* Count number of digests and partition sec evenly */ | ||
387 | count = 0; | ||
388 | for (idx = 0; ssl_get_handshake_digest(idx, &m, &md); idx++) { | ||
389 | if ((m << TLS1_PRF_DGST_SHIFT) & digest_mask) | ||
390 | count++; | ||
391 | } | ||
392 | if (count == 0) { | ||
393 | SSLerrorx(SSL_R_SSL_HANDSHAKE_FAILURE); | ||
394 | goto err; | ||
395 | } | ||
396 | len = slen / count; | ||
397 | if (count == 1) | ||
398 | slen = 0; | ||
399 | S1 = sec; | ||
400 | memset(out1, 0, olen); | 383 | memset(out1, 0, olen); |
401 | for (idx = 0; ssl_get_handshake_digest(idx, &m, &md); idx++) { | ||
402 | if ((m << TLS1_PRF_DGST_SHIFT) & digest_mask) { | ||
403 | if (!md) { | ||
404 | SSLerrorx(SSL_R_UNSUPPORTED_DIGEST_TYPE); | ||
405 | goto err; | ||
406 | } | ||
407 | if (!tls1_P_hash(md , S1, len + (slen&1), seed1, | ||
408 | seed1_len, seed2, seed2_len, seed3, seed3_len, | ||
409 | seed4, seed4_len, seed5, seed5_len, out2, olen)) | ||
410 | goto err; | ||
411 | S1 += len; | ||
412 | for (i = 0; i < olen; i++) { | ||
413 | out1[i] ^= out2[i]; | ||
414 | } | ||
415 | } | ||
416 | } | ||
417 | ret = 1; | ||
418 | 384 | ||
419 | err: | 385 | if (!ssl_get_handshake_evp_md(s, &md)) |
420 | return ret; | 386 | return (0); |
387 | |||
388 | if (!tls1_P_hash(md, sec, slen, seed1, seed1_len, seed2, seed2_len, | ||
389 | seed3, seed3_len, seed4, seed4_len, seed5, seed5_len, out2, olen)) | ||
390 | return (0); | ||
391 | |||
392 | for (i = 0; i < olen; i++) | ||
393 | out1[i] ^= out2[i]; | ||
394 | |||
395 | return (1); | ||
421 | } | 396 | } |
422 | 397 | ||
423 | static int | 398 | static int |
424 | tls1_generate_key_block(SSL *s, unsigned char *km, unsigned char *tmp, int num) | 399 | tls1_generate_key_block(SSL *s, unsigned char *km, unsigned char *tmp, int num) |
425 | { | 400 | { |
426 | int ret; | 401 | return tls1_PRF(s, |
427 | |||
428 | ret = tls1_PRF(ssl_get_algorithm2(s), | ||
429 | TLS_MD_KEY_EXPANSION_CONST, TLS_MD_KEY_EXPANSION_CONST_SIZE, | 402 | TLS_MD_KEY_EXPANSION_CONST, TLS_MD_KEY_EXPANSION_CONST_SIZE, |
430 | s->s3->server_random, SSL3_RANDOM_SIZE, | 403 | s->s3->server_random, SSL3_RANDOM_SIZE, |
431 | s->s3->client_random, SSL3_RANDOM_SIZE, | 404 | s->s3->client_random, SSL3_RANDOM_SIZE, |
432 | NULL, 0, NULL, 0, | 405 | NULL, 0, NULL, 0, |
433 | s->session->master_key, s->session->master_key_length, | 406 | s->session->master_key, s->session->master_key_length, |
434 | km, tmp, num); | 407 | km, tmp, num); |
435 | return ret; | ||
436 | } | 408 | } |
437 | 409 | ||
438 | /* | 410 | /* |
@@ -1138,8 +1110,7 @@ tls1_final_finish_mac(SSL *s, const char *str, int slen, unsigned char *out) | |||
1138 | if (hlen > INT_MAX) | 1110 | if (hlen > INT_MAX) |
1139 | return 0; | 1111 | return 0; |
1140 | 1112 | ||
1141 | if (!tls1_PRF(ssl_get_algorithm2(s), str, slen, buf1, hlen, | 1113 | if (!tls1_PRF(s, str, slen, buf1, hlen, NULL, 0, NULL, 0, NULL, 0, |
1142 | NULL, 0, NULL, 0, NULL, 0, | ||
1143 | s->session->master_key, s->session->master_key_length, | 1114 | s->session->master_key, s->session->master_key_length, |
1144 | out, buf2, sizeof(buf2))) | 1115 | out, buf2, sizeof(buf2))) |
1145 | return 0; | 1116 | return 0; |
@@ -1235,7 +1206,8 @@ tls1_generate_master_secret(SSL *s, unsigned char *out, unsigned char *p, | |||
1235 | { | 1206 | { |
1236 | unsigned char buff[SSL_MAX_MASTER_KEY_LENGTH]; | 1207 | unsigned char buff[SSL_MAX_MASTER_KEY_LENGTH]; |
1237 | 1208 | ||
1238 | tls1_PRF(ssl_get_algorithm2(s), | 1209 | /* XXX - check return value. */ |
1210 | tls1_PRF(s, | ||
1239 | TLS_MD_MASTER_SECRET_CONST, TLS_MD_MASTER_SECRET_CONST_SIZE, | 1211 | TLS_MD_MASTER_SECRET_CONST, TLS_MD_MASTER_SECRET_CONST_SIZE, |
1240 | s->s3->client_random, SSL3_RANDOM_SIZE, NULL, 0, | 1212 | s->s3->client_random, SSL3_RANDOM_SIZE, NULL, 0, |
1241 | s->s3->server_random, SSL3_RANDOM_SIZE, NULL, 0, | 1213 | s->s3->server_random, SSL3_RANDOM_SIZE, NULL, 0, |
@@ -1307,8 +1279,7 @@ tls1_export_keying_material(SSL *s, unsigned char *out, size_t olen, | |||
1307 | TLS_MD_KEY_EXPANSION_CONST_SIZE) == 0) | 1279 | TLS_MD_KEY_EXPANSION_CONST_SIZE) == 0) |
1308 | goto err1; | 1280 | goto err1; |
1309 | 1281 | ||
1310 | rv = tls1_PRF(ssl_get_algorithm2(s), | 1282 | rv = tls1_PRF(s, val, vallen, NULL, 0, NULL, 0, NULL, 0, NULL, 0, |
1311 | val, vallen, NULL, 0, NULL, 0, NULL, 0, NULL, 0, | ||
1312 | s->session->master_key, s->session->master_key_length, | 1283 | s->session->master_key, s->session->master_key_length, |
1313 | out, buff, olen); | 1284 | out, buff, olen); |
1314 | 1285 | ||