summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorjsing <>2018-06-03 15:33:37 +0000
committerjsing <>2018-06-03 15:33:37 +0000
commit7f27f09eb6c6a98f827221c3c0e7c09e0e57314e (patch)
tree9e483bb8cbd122fd639f44ad85e773f059334b08 /src
parent1811b2ca6472f39211dd2559ff4abbd95fd0f0f2 (diff)
downloadopenbsd-7f27f09eb6c6a98f827221c3c0e7c09e0e57314e.tar.gz
openbsd-7f27f09eb6c6a98f827221c3c0e7c09e0e57314e.tar.bz2
openbsd-7f27f09eb6c6a98f827221c3c0e7c09e0e57314e.zip
Allocate a dedicated buffer for use when deriving a shared key during
client KEX DHE processing, rather than reusing the buffer that is used to send/receive handshake messages. ok beck@ inoguchi@
Diffstat (limited to 'src')
-rw-r--r--src/lib/libssl/ssl_srvr.c28
1 files changed, 18 insertions, 10 deletions
diff --git a/src/lib/libssl/ssl_srvr.c b/src/lib/libssl/ssl_srvr.c
index 4de4b08db5..3bd3319989 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.33 2018/06/02 16:45:31 jsing Exp $ */ 1/* $OpenBSD: ssl_srvr.c,v 1.34 2018/06/03 15:33:37 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 *
@@ -1829,8 +1829,9 @@ ssl3_get_client_kex_rsa(SSL *s, unsigned char *p, long n)
1829static int 1829static int
1830ssl3_get_client_kex_dhe(SSL *s, unsigned char *p, long n) 1830ssl3_get_client_kex_dhe(SSL *s, unsigned char *p, long n)
1831{ 1831{
1832 int key_size = 0, key_len, al;
1833 unsigned char *key = NULL;
1832 BIGNUM *bn = NULL; 1834 BIGNUM *bn = NULL;
1833 int key_size, al;
1834 CBS cbs, dh_Yc; 1835 CBS cbs, dh_Yc;
1835 DH *dh; 1836 DH *dh;
1836 1837
@@ -1857,22 +1858,26 @@ ssl3_get_client_kex_dhe(SSL *s, unsigned char *p, long n)
1857 goto err; 1858 goto err;
1858 } 1859 }
1859 1860
1860 key_size = DH_compute_key(p, bn, dh); 1861 if ((key_size = DH_size(dh)) <= 0) {
1861 if (key_size <= 0) { 1862 SSLerror(s, ERR_R_DH_LIB);
1863 goto err;
1864 }
1865 if ((key = malloc(key_size)) == NULL) {
1866 SSLerror(s, ERR_R_MALLOC_FAILURE);
1867 goto err;
1868 }
1869 if ((key_len = DH_compute_key(key, bn, dh)) <= 0) {
1862 SSLerror(s, ERR_R_DH_LIB); 1870 SSLerror(s, ERR_R_DH_LIB);
1863 BN_clear_free(bn);
1864 goto err; 1871 goto err;
1865 } 1872 }
1866 1873
1867 s->session->master_key_length = 1874 s->session->master_key_length = tls1_generate_master_secret(s,
1868 tls1_generate_master_secret( 1875 s->session->master_key, key, key_len);
1869 s, s->session->master_key, p, key_size);
1870
1871 explicit_bzero(p, key_size);
1872 1876
1873 DH_free(S3I(s)->tmp.dh); 1877 DH_free(S3I(s)->tmp.dh);
1874 S3I(s)->tmp.dh = NULL; 1878 S3I(s)->tmp.dh = NULL;
1875 1879
1880 freezero(key, key_size);
1876 BN_clear_free(bn); 1881 BN_clear_free(bn);
1877 1882
1878 return (1); 1883 return (1);
@@ -1883,6 +1888,9 @@ ssl3_get_client_kex_dhe(SSL *s, unsigned char *p, long n)
1883 f_err: 1888 f_err:
1884 ssl3_send_alert(s, SSL3_AL_FATAL, al); 1889 ssl3_send_alert(s, SSL3_AL_FATAL, al);
1885 err: 1890 err:
1891 freezero(key, key_size);
1892 BN_clear_free(bn);
1893
1886 return (-1); 1894 return (-1);
1887} 1895}
1888 1896