summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/lib/libssl/ssl_clnt.c29
-rw-r--r--src/lib/libssl/ssl_locl.h6
-rw-r--r--src/lib/libssl/ssl_srvr.c26
-rw-r--r--src/lib/libssl/t1_enc.c19
-rw-r--r--src/lib/libssl/tls12_lib.c25
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,
1379void tls1_cleanup_key_block(SSL *s); 1379void tls1_cleanup_key_block(SSL *s);
1380int tls1_change_cipher_state(SSL *s, int which); 1380int tls1_change_cipher_state(SSL *s, int which);
1381int tls1_setup_key_block(SSL *s); 1381int tls1_setup_key_block(SSL *s);
1382int tls1_generate_master_secret(SSL *s, unsigned char *out,
1383 unsigned char *p, int len);
1384int tls1_export_keying_material(SSL *s, unsigned char *out, size_t olen, 1382int 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
1390int tls12_derive_finished(SSL *s); 1388int tls12_derive_finished(SSL *s);
1391int tls12_derive_peer_finished(SSL *s); 1389int tls12_derive_peer_finished(SSL *s);
1390int tls12_derive_master_secret(SSL *s, uint8_t *premaster_secret,
1391 size_t premaster_secret_len);
1392 1392
1393int ssl_using_ecc_cipher(SSL *s); 1393int ssl_using_ecc_cipher(SSL *s);
1394int ssl_check_srvr_ecc_cert_and_alg(X509 *x, SSL *s); 1394int 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
468int 468int
469tls1_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
485int
486tls1_export_keying_material(SSL *s, unsigned char *out, size_t olen, 469tls1_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
94int
95tls12_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}