diff options
-rw-r--r-- | src/lib/libssl/ssl_clnt.c | 29 | ||||
-rw-r--r-- | src/lib/libssl/ssl_locl.h | 6 | ||||
-rw-r--r-- | src/lib/libssl/ssl_srvr.c | 26 | ||||
-rw-r--r-- | src/lib/libssl/t1_enc.c | 19 | ||||
-rw-r--r-- | src/lib/libssl/tls12_lib.c | 25 |
5 files changed, 51 insertions, 54 deletions
diff --git a/src/lib/libssl/ssl_clnt.c b/src/lib/libssl/ssl_clnt.c index c129bb6d66..a38d1f1ed4 100644 --- a/src/lib/libssl/ssl_clnt.c +++ b/src/lib/libssl/ssl_clnt.c | |||
@@ -1,4 +1,4 @@ | |||
1 | /* $OpenBSD: ssl_clnt.c,v 1.93 2021/04/25 13:15:22 jsing Exp $ */ | 1 | /* $OpenBSD: ssl_clnt.c,v 1.94 2021/04/30 19:26:44 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 | * |
@@ -2001,9 +2001,8 @@ ssl3_send_client_kex_rsa(SSL *s, SESS_CERT *sess_cert, CBB *cbb) | |||
2001 | if (!CBB_flush(cbb)) | 2001 | if (!CBB_flush(cbb)) |
2002 | goto err; | 2002 | goto err; |
2003 | 2003 | ||
2004 | s->session->master_key_length = | 2004 | if (!tls12_derive_master_secret(s, pms, sizeof(pms))) |
2005 | tls1_generate_master_secret(s, | 2005 | goto err; |
2006 | s->session->master_key, pms, sizeof(pms)); | ||
2007 | 2006 | ||
2008 | ret = 1; | 2007 | ret = 1; |
2009 | 2008 | ||
@@ -2055,10 +2054,8 @@ ssl3_send_client_kex_dhe(SSL *s, SESS_CERT *sess_cert, CBB *cbb) | |||
2055 | goto err; | 2054 | goto err; |
2056 | } | 2055 | } |
2057 | 2056 | ||
2058 | /* Generate master key from the result. */ | 2057 | if (!tls12_derive_master_secret(s, key, key_len)) |
2059 | s->session->master_key_length = | 2058 | goto err; |
2060 | tls1_generate_master_secret(s, | ||
2061 | s->session->master_key, key, key_len); | ||
2062 | 2059 | ||
2063 | if (!CBB_add_u16_length_prefixed(cbb, &dh_Yc)) | 2060 | if (!CBB_add_u16_length_prefixed(cbb, &dh_Yc)) |
2064 | goto err; | 2061 | goto err; |
@@ -2104,8 +2101,8 @@ ssl3_send_client_kex_ecdhe_ecp(SSL *s, SESS_CERT *sc, CBB *cbb) | |||
2104 | 2101 | ||
2105 | if (!ssl_kex_derive_ecdhe_ecp(ecdh, sc->peer_ecdh_tmp, &key, &key_len)) | 2102 | if (!ssl_kex_derive_ecdhe_ecp(ecdh, sc->peer_ecdh_tmp, &key, &key_len)) |
2106 | goto err; | 2103 | goto err; |
2107 | s->session->master_key_length = tls1_generate_master_secret(s, | 2104 | if (!tls12_derive_master_secret(s, key, key_len)) |
2108 | s->session->master_key, key, key_len); | 2105 | goto err; |
2109 | 2106 | ||
2110 | ret = 1; | 2107 | ret = 1; |
2111 | 2108 | ||
@@ -2142,10 +2139,8 @@ ssl3_send_client_kex_ecdhe_ecx(SSL *s, SESS_CERT *sc, CBB *cbb) | |||
2142 | if (!CBB_flush(cbb)) | 2139 | if (!CBB_flush(cbb)) |
2143 | goto err; | 2140 | goto err; |
2144 | 2141 | ||
2145 | /* Generate master key from the result. */ | 2142 | if (!tls12_derive_master_secret(s, shared_key, X25519_KEY_LENGTH)) |
2146 | s->session->master_key_length = | 2143 | goto err; |
2147 | tls1_generate_master_secret(s, | ||
2148 | s->session->master_key, shared_key, X25519_KEY_LENGTH); | ||
2149 | 2144 | ||
2150 | ret = 1; | 2145 | ret = 1; |
2151 | 2146 | ||
@@ -2276,9 +2271,9 @@ ssl3_send_client_kex_gost(SSL *s, SESS_CERT *sess_cert, CBB *cbb) | |||
2276 | s->s3->flags |= TLS1_FLAGS_SKIP_CERT_VERIFY; | 2271 | s->s3->flags |= TLS1_FLAGS_SKIP_CERT_VERIFY; |
2277 | } | 2272 | } |
2278 | EVP_PKEY_CTX_free(pkey_ctx); | 2273 | EVP_PKEY_CTX_free(pkey_ctx); |
2279 | s->session->master_key_length = | 2274 | |
2280 | tls1_generate_master_secret(s, | 2275 | if (!tls12_derive_master_secret(s, premaster_secret, 32)) |
2281 | s->session->master_key, premaster_secret, 32); | 2276 | goto err; |
2282 | 2277 | ||
2283 | ret = 1; | 2278 | ret = 1; |
2284 | 2279 | ||
diff --git a/src/lib/libssl/ssl_locl.h b/src/lib/libssl/ssl_locl.h index a9cab69ee0..c55dada70f 100644 --- a/src/lib/libssl/ssl_locl.h +++ b/src/lib/libssl/ssl_locl.h | |||
@@ -1,4 +1,4 @@ | |||
1 | /* $OpenBSD: ssl_locl.h,v 1.338 2021/04/25 13:15:22 jsing Exp $ */ | 1 | /* $OpenBSD: ssl_locl.h,v 1.339 2021/04/30 19:26:44 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 | * |
@@ -1379,8 +1379,6 @@ int tls1_PRF(SSL *s, const unsigned char *secret, size_t secret_len, | |||
1379 | void tls1_cleanup_key_block(SSL *s); | 1379 | void tls1_cleanup_key_block(SSL *s); |
1380 | int tls1_change_cipher_state(SSL *s, int which); | 1380 | int tls1_change_cipher_state(SSL *s, int which); |
1381 | int tls1_setup_key_block(SSL *s); | 1381 | int tls1_setup_key_block(SSL *s); |
1382 | int tls1_generate_master_secret(SSL *s, unsigned char *out, | ||
1383 | unsigned char *p, int len); | ||
1384 | int tls1_export_keying_material(SSL *s, unsigned char *out, size_t olen, | 1382 | int tls1_export_keying_material(SSL *s, unsigned char *out, size_t olen, |
1385 | const char *label, size_t llen, const unsigned char *p, size_t plen, | 1383 | const char *label, size_t llen, const unsigned char *p, size_t plen, |
1386 | int use_context); | 1384 | int use_context); |
@@ -1389,6 +1387,8 @@ int ssl_ok(SSL *s); | |||
1389 | 1387 | ||
1390 | int tls12_derive_finished(SSL *s); | 1388 | int tls12_derive_finished(SSL *s); |
1391 | int tls12_derive_peer_finished(SSL *s); | 1389 | int tls12_derive_peer_finished(SSL *s); |
1390 | int tls12_derive_master_secret(SSL *s, uint8_t *premaster_secret, | ||
1391 | size_t premaster_secret_len); | ||
1392 | 1392 | ||
1393 | int ssl_using_ecc_cipher(SSL *s); | 1393 | int ssl_using_ecc_cipher(SSL *s); |
1394 | int ssl_check_srvr_ecc_cert_and_alg(X509 *x, SSL *s); | 1394 | int ssl_check_srvr_ecc_cert_and_alg(X509 *x, SSL *s); |
diff --git a/src/lib/libssl/ssl_srvr.c b/src/lib/libssl/ssl_srvr.c index 2c15081f45..32ffa88f15 100644 --- a/src/lib/libssl/ssl_srvr.c +++ b/src/lib/libssl/ssl_srvr.c | |||
@@ -1,4 +1,4 @@ | |||
1 | /* $OpenBSD: ssl_srvr.c,v 1.104 2021/04/25 13:15:22 jsing Exp $ */ | 1 | /* $OpenBSD: ssl_srvr.c,v 1.105 2021/04/30 19:26:45 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 | * |
@@ -1797,9 +1797,8 @@ ssl3_get_client_kex_rsa(SSL *s, CBS *cbs) | |||
1797 | p = fakekey; | 1797 | p = fakekey; |
1798 | } | 1798 | } |
1799 | 1799 | ||
1800 | s->session->master_key_length = | 1800 | if (!tls12_derive_master_secret(s, p, SSL_MAX_MASTER_KEY_LENGTH)) |
1801 | tls1_generate_master_secret(s, | 1801 | goto err; |
1802 | s->session->master_key, p, SSL_MAX_MASTER_KEY_LENGTH); | ||
1803 | 1802 | ||
1804 | freezero(pms, pms_len); | 1803 | freezero(pms, pms_len); |
1805 | 1804 | ||
@@ -1867,8 +1866,8 @@ ssl3_get_client_kex_dhe(SSL *s, CBS *cbs) | |||
1867 | goto fatal_err; | 1866 | goto fatal_err; |
1868 | } | 1867 | } |
1869 | 1868 | ||
1870 | s->session->master_key_length = tls1_generate_master_secret(s, | 1869 | if (!tls12_derive_master_secret(s, key, key_len)) |
1871 | s->session->master_key, key, key_len); | 1870 | goto err; |
1872 | 1871 | ||
1873 | DH_free(S3I(s)->tmp.dh); | 1872 | DH_free(S3I(s)->tmp.dh); |
1874 | S3I(s)->tmp.dh = NULL; | 1873 | S3I(s)->tmp.dh = NULL; |
@@ -1928,8 +1927,8 @@ ssl3_get_client_kex_ecdhe_ecp(SSL *s, CBS *cbs) | |||
1928 | /* Derive the shared secret and compute master secret. */ | 1927 | /* Derive the shared secret and compute master secret. */ |
1929 | if (!ssl_kex_derive_ecdhe_ecp(ecdh, ecdh_peer, &key, &key_len)) | 1928 | if (!ssl_kex_derive_ecdhe_ecp(ecdh, ecdh_peer, &key, &key_len)) |
1930 | goto err; | 1929 | goto err; |
1931 | s->session->master_key_length = tls1_generate_master_secret(s, | 1930 | if (!tls12_derive_master_secret(s, key, key_len)) |
1932 | s->session->master_key, key, key_len); | 1931 | goto err; |
1933 | 1932 | ||
1934 | EC_KEY_free(S3I(s)->tmp.ecdh); | 1933 | EC_KEY_free(S3I(s)->tmp.ecdh); |
1935 | S3I(s)->tmp.ecdh = NULL; | 1934 | S3I(s)->tmp.ecdh = NULL; |
@@ -1966,9 +1965,8 @@ ssl3_get_client_kex_ecdhe_ecx(SSL *s, CBS *cbs) | |||
1966 | freezero(S3I(s)->tmp.x25519, X25519_KEY_LENGTH); | 1965 | freezero(S3I(s)->tmp.x25519, X25519_KEY_LENGTH); |
1967 | S3I(s)->tmp.x25519 = NULL; | 1966 | S3I(s)->tmp.x25519 = NULL; |
1968 | 1967 | ||
1969 | s->session->master_key_length = | 1968 | if (!tls12_derive_master_secret(s, shared_key, X25519_KEY_LENGTH)) |
1970 | tls1_generate_master_secret( | 1969 | goto err; |
1971 | s, s->session->master_key, shared_key, X25519_KEY_LENGTH); | ||
1972 | 1970 | ||
1973 | ret = 1; | 1971 | ret = 1; |
1974 | 1972 | ||
@@ -2033,10 +2031,8 @@ ssl3_get_client_kex_gost(SSL *s, CBS *cbs) | |||
2033 | goto gerr; | 2031 | goto gerr; |
2034 | } | 2032 | } |
2035 | 2033 | ||
2036 | /* Generate master secret */ | 2034 | if (!tls12_derive_master_secret(s, premaster_secret, 32)) |
2037 | s->session->master_key_length = | 2035 | goto err; |
2038 | tls1_generate_master_secret( | ||
2039 | s, s->session->master_key, premaster_secret, 32); | ||
2040 | 2036 | ||
2041 | /* Check if pubkey from client certificate was used */ | 2037 | /* Check if pubkey from client certificate was used */ |
2042 | if (EVP_PKEY_CTX_ctrl(pkey_ctx, -1, -1, | 2038 | if (EVP_PKEY_CTX_ctrl(pkey_ctx, -1, -1, |
diff --git a/src/lib/libssl/t1_enc.c b/src/lib/libssl/t1_enc.c index 3f93bcecf5..642c210900 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.139 2021/04/25 13:15:22 jsing Exp $ */ | 1 | /* $OpenBSD: t1_enc.c,v 1.140 2021/04/30 19:26:45 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 | * |
@@ -466,23 +466,6 @@ tls1_setup_key_block(SSL *s) | |||
466 | } | 466 | } |
467 | 467 | ||
468 | int | 468 | int |
469 | tls1_generate_master_secret(SSL *s, unsigned char *out, unsigned char *p, | ||
470 | int len) | ||
471 | { | ||
472 | if (len < 0) | ||
473 | return 0; | ||
474 | |||
475 | if (!tls1_PRF(s, p, len, | ||
476 | TLS_MD_MASTER_SECRET_CONST, TLS_MD_MASTER_SECRET_CONST_SIZE, | ||
477 | s->s3->client_random, SSL3_RANDOM_SIZE, NULL, 0, | ||
478 | s->s3->server_random, SSL3_RANDOM_SIZE, NULL, 0, | ||
479 | s->session->master_key, SSL_MAX_MASTER_KEY_LENGTH)) | ||
480 | return 0; | ||
481 | |||
482 | return (SSL_MAX_MASTER_KEY_LENGTH); | ||
483 | } | ||
484 | |||
485 | int | ||
486 | tls1_export_keying_material(SSL *s, unsigned char *out, size_t olen, | 469 | tls1_export_keying_material(SSL *s, unsigned char *out, size_t olen, |
487 | const char *label, size_t llen, const unsigned char *context, | 470 | const char *label, size_t llen, const unsigned char *context, |
488 | size_t contextlen, int use_context) | 471 | size_t contextlen, int use_context) |
diff --git a/src/lib/libssl/tls12_lib.c b/src/lib/libssl/tls12_lib.c index 520f41678d..e7171ba833 100644 --- a/src/lib/libssl/tls12_lib.c +++ b/src/lib/libssl/tls12_lib.c | |||
@@ -1,4 +1,4 @@ | |||
1 | /* $OpenBSD: tls12_lib.c,v 1.1 2021/04/25 13:15:23 jsing Exp $ */ | 1 | /* $OpenBSD: tls12_lib.c,v 1.2 2021/04/30 19:26:45 jsing Exp $ */ |
2 | /* | 2 | /* |
3 | * Copyright (c) 2021 Joel Sing <jsing@openbsd.org> | 3 | * Copyright (c) 2021 Joel Sing <jsing@openbsd.org> |
4 | * | 4 | * |
@@ -90,3 +90,26 @@ tls12_derive_peer_finished(SSL *s) | |||
90 | &S3I(s)->hs.peer_finished_len); | 90 | &S3I(s)->hs.peer_finished_len); |
91 | } | 91 | } |
92 | } | 92 | } |
93 | |||
94 | int | ||
95 | tls12_derive_master_secret(SSL *s, uint8_t *premaster_secret, | ||
96 | size_t premaster_secret_len) | ||
97 | { | ||
98 | s->session->master_key_length = 0; | ||
99 | |||
100 | if (premaster_secret_len == 0) | ||
101 | return 0; | ||
102 | |||
103 | CTASSERT(sizeof(s->session->master_key) == SSL_MAX_MASTER_KEY_LENGTH); | ||
104 | |||
105 | if (!tls1_PRF(s, premaster_secret, premaster_secret_len, | ||
106 | TLS_MD_MASTER_SECRET_CONST, TLS_MD_MASTER_SECRET_CONST_SIZE, | ||
107 | s->s3->client_random, SSL3_RANDOM_SIZE, NULL, 0, | ||
108 | s->s3->server_random, SSL3_RANDOM_SIZE, NULL, 0, | ||
109 | s->session->master_key, sizeof(s->session->master_key))) | ||
110 | return 0; | ||
111 | |||
112 | s->session->master_key_length = SSL_MAX_MASTER_KEY_LENGTH; | ||
113 | |||
114 | return 1; | ||
115 | } | ||