diff options
| author | jsing <> | 2017-03-06 15:08:57 +0000 |
|---|---|---|
| committer | jsing <> | 2017-03-06 15:08:57 +0000 |
| commit | 25f2f941d93428b13aded2bfda76810e86bf8597 (patch) | |
| tree | c1c01de6ef5f35eebd6d5f3a02cf8ee690341ff2 /src/lib/libssl/t1_enc.c | |
| parent | 87117ac52c1642f68394967df52a4cac4effcfd4 (diff) | |
| download | openbsd-25f2f941d93428b13aded2bfda76810e86bf8597.tar.gz openbsd-25f2f941d93428b13aded2bfda76810e86bf8597.tar.bz2 openbsd-25f2f941d93428b13aded2bfda76810e86bf8597.zip | |
Clean up and simplify the tls1_PRF() implementation now that we have a
single EVP MD for the PRF hash.
ok beck@ inoguchi@
Diffstat (limited to 'src/lib/libssl/t1_enc.c')
| -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 | ||
