summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authortedu <>2014-12-29 16:12:59 +0000
committertedu <>2014-12-29 16:12:59 +0000
commit91106b4c90b48b9064630173be7bc0822d7c8043 (patch)
treea2c18c6c3329f18637e0be843cec170757390714
parent44a4c9b1a7df6686d39c7a10ac9bc7b96226ab2e (diff)
downloadopenbsd-91106b4c90b48b9064630173be7bc0822d7c8043.tar.gz
openbsd-91106b4c90b48b9064630173be7bc0822d7c8043.tar.bz2
openbsd-91106b4c90b48b9064630173be7bc0822d7c8043.zip
don't leak timing info about padding errors by generating a fake key
afterwards. openssl has a more complicated fix, but it's less intrusive for now to simply hoist the expensive part (fake key generation) up without sweating a branch or two. ok bcook jsing
-rw-r--r--src/lib/libssl/s3_srvr.c15
-rw-r--r--src/lib/libssl/src/ssl/s3_srvr.c15
2 files changed, 20 insertions, 10 deletions
diff --git a/src/lib/libssl/s3_srvr.c b/src/lib/libssl/s3_srvr.c
index 5e4a605c60..fd8f9aabab 100644
--- a/src/lib/libssl/s3_srvr.c
+++ b/src/lib/libssl/s3_srvr.c
@@ -1,4 +1,4 @@
1/* $OpenBSD: s3_srvr.c,v 1.95 2014/12/15 00:46:53 doug Exp $ */ 1/* $OpenBSD: s3_srvr.c,v 1.96 2014/12/29 16:12:59 tedu 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 *
@@ -1822,6 +1822,12 @@ ssl3_get_client_key_exchange(SSL *s)
1822 alg_k = s->s3->tmp.new_cipher->algorithm_mkey; 1822 alg_k = s->s3->tmp.new_cipher->algorithm_mkey;
1823 1823
1824 if (alg_k & SSL_kRSA) { 1824 if (alg_k & SSL_kRSA) {
1825 char fakekey[SSL_MAX_MASTER_KEY_LENGTH];
1826
1827 arc4random_buf(fakekey, sizeof(fakekey));
1828 fakekey[0] = s->client_version >> 8;
1829 fakekey[1] = s->client_version & 0xff;
1830
1825 pkey = s->cert->pkeys[SSL_PKEY_RSA_ENC].privatekey; 1831 pkey = s->cert->pkeys[SSL_PKEY_RSA_ENC].privatekey;
1826 if ((pkey == NULL) || (pkey->type != EVP_PKEY_RSA) || 1832 if ((pkey == NULL) || (pkey->type != EVP_PKEY_RSA) ||
1827 (pkey->pkey.rsa == NULL)) { 1833 (pkey->pkey.rsa == NULL)) {
@@ -1851,6 +1857,8 @@ ssl3_get_client_key_exchange(SSL *s)
1851 1857
1852 i = RSA_private_decrypt((int)n, p, p, rsa, RSA_PKCS1_PADDING); 1858 i = RSA_private_decrypt((int)n, p, p, rsa, RSA_PKCS1_PADDING);
1853 1859
1860 ERR_clear_error();
1861
1854 al = -1; 1862 al = -1;
1855 1863
1856 if (i != SSL_MAX_MASTER_KEY_LENGTH) { 1864 if (i != SSL_MAX_MASTER_KEY_LENGTH) {
@@ -1902,11 +1910,8 @@ ssl3_get_client_key_exchange(SSL *s)
1902 * on PKCS #1 v1.5 RSA padding (see RFC 2246, 1910 * on PKCS #1 v1.5 RSA padding (see RFC 2246,
1903 * section 7.4.7.1). 1911 * section 7.4.7.1).
1904 */ 1912 */
1905 ERR_clear_error();
1906 i = SSL_MAX_MASTER_KEY_LENGTH; 1913 i = SSL_MAX_MASTER_KEY_LENGTH;
1907 p[0] = s->client_version >> 8; 1914 p = fakekey;
1908 p[1] = s->client_version & 0xff;
1909 arc4random_buf(p + 2, i - 2);
1910 } 1915 }
1911 1916
1912 s->session->master_key_length = 1917 s->session->master_key_length =
diff --git a/src/lib/libssl/src/ssl/s3_srvr.c b/src/lib/libssl/src/ssl/s3_srvr.c
index 5e4a605c60..fd8f9aabab 100644
--- a/src/lib/libssl/src/ssl/s3_srvr.c
+++ b/src/lib/libssl/src/ssl/s3_srvr.c
@@ -1,4 +1,4 @@
1/* $OpenBSD: s3_srvr.c,v 1.95 2014/12/15 00:46:53 doug Exp $ */ 1/* $OpenBSD: s3_srvr.c,v 1.96 2014/12/29 16:12:59 tedu 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 *
@@ -1822,6 +1822,12 @@ ssl3_get_client_key_exchange(SSL *s)
1822 alg_k = s->s3->tmp.new_cipher->algorithm_mkey; 1822 alg_k = s->s3->tmp.new_cipher->algorithm_mkey;
1823 1823
1824 if (alg_k & SSL_kRSA) { 1824 if (alg_k & SSL_kRSA) {
1825 char fakekey[SSL_MAX_MASTER_KEY_LENGTH];
1826
1827 arc4random_buf(fakekey, sizeof(fakekey));
1828 fakekey[0] = s->client_version >> 8;
1829 fakekey[1] = s->client_version & 0xff;
1830
1825 pkey = s->cert->pkeys[SSL_PKEY_RSA_ENC].privatekey; 1831 pkey = s->cert->pkeys[SSL_PKEY_RSA_ENC].privatekey;
1826 if ((pkey == NULL) || (pkey->type != EVP_PKEY_RSA) || 1832 if ((pkey == NULL) || (pkey->type != EVP_PKEY_RSA) ||
1827 (pkey->pkey.rsa == NULL)) { 1833 (pkey->pkey.rsa == NULL)) {
@@ -1851,6 +1857,8 @@ ssl3_get_client_key_exchange(SSL *s)
1851 1857
1852 i = RSA_private_decrypt((int)n, p, p, rsa, RSA_PKCS1_PADDING); 1858 i = RSA_private_decrypt((int)n, p, p, rsa, RSA_PKCS1_PADDING);
1853 1859
1860 ERR_clear_error();
1861
1854 al = -1; 1862 al = -1;
1855 1863
1856 if (i != SSL_MAX_MASTER_KEY_LENGTH) { 1864 if (i != SSL_MAX_MASTER_KEY_LENGTH) {
@@ -1902,11 +1910,8 @@ ssl3_get_client_key_exchange(SSL *s)
1902 * on PKCS #1 v1.5 RSA padding (see RFC 2246, 1910 * on PKCS #1 v1.5 RSA padding (see RFC 2246,
1903 * section 7.4.7.1). 1911 * section 7.4.7.1).
1904 */ 1912 */
1905 ERR_clear_error();
1906 i = SSL_MAX_MASTER_KEY_LENGTH; 1913 i = SSL_MAX_MASTER_KEY_LENGTH;
1907 p[0] = s->client_version >> 8; 1914 p = fakekey;
1908 p[1] = s->client_version & 0xff;
1909 arc4random_buf(p + 2, i - 2);
1910 } 1915 }
1911 1916
1912 s->session->master_key_length = 1917 s->session->master_key_length =