summaryrefslogtreecommitdiff
path: root/src/lib
diff options
context:
space:
mode:
authorjsing <>2016-12-06 13:42:32 +0000
committerjsing <>2016-12-06 13:42:32 +0000
commitc8fdaf9d2407f531ba07c41625df95cbb4e54726 (patch)
tree84ce79cdfb35706abdfabf3496181155b11cdf23 /src/lib
parent95a901d22cb8e548a73bd42d95b1bdf70996f7f2 (diff)
downloadopenbsd-c8fdaf9d2407f531ba07c41625df95cbb4e54726.tar.gz
openbsd-c8fdaf9d2407f531ba07c41625df95cbb4e54726.tar.bz2
openbsd-c8fdaf9d2407f531ba07c41625df95cbb4e54726.zip
Convert ssl3_send_client_kex_rsa() to CBB.
ok doug@
Diffstat (limited to 'src/lib')
-rw-r--r--src/lib/libssl/s3_clnt.c50
1 files changed, 36 insertions, 14 deletions
diff --git a/src/lib/libssl/s3_clnt.c b/src/lib/libssl/s3_clnt.c
index 772bb703dd..c88835b91e 100644
--- a/src/lib/libssl/s3_clnt.c
+++ b/src/lib/libssl/s3_clnt.c
@@ -1,4 +1,4 @@
1/* $OpenBSD: s3_clnt.c,v 1.150 2016/12/06 13:17:52 jsing Exp $ */ 1/* $OpenBSD: s3_clnt.c,v 1.151 2016/12/06 13:42:32 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 *
@@ -1877,14 +1877,14 @@ ssl3_get_server_done(SSL *s)
1877} 1877}
1878 1878
1879static int 1879static int
1880ssl3_send_client_kex_rsa(SSL *s, SESS_CERT *sess_cert, unsigned char *p, 1880ssl3_send_client_kex_rsa(SSL *s, SESS_CERT *sess_cert, CBB *cbb)
1881 int *outlen)
1882{ 1881{
1883 unsigned char pms[SSL_MAX_MASTER_KEY_LENGTH]; 1882 unsigned char pms[SSL_MAX_MASTER_KEY_LENGTH];
1883 unsigned char *enc_pms = NULL;
1884 EVP_PKEY *pkey = NULL; 1884 EVP_PKEY *pkey = NULL;
1885 unsigned char *q;
1886 int ret = -1; 1885 int ret = -1;
1887 int n; 1886 int enc_len;
1887 CBB epms;
1888 1888
1889 /* 1889 /*
1890 * RSA-Encrypted Premaster Secret Message - RFC 5246 section 7.4.7.1. 1890 * RSA-Encrypted Premaster Secret Message - RFC 5246 section 7.4.7.1.
@@ -1902,30 +1902,37 @@ ssl3_send_client_kex_rsa(SSL *s, SESS_CERT *sess_cert, unsigned char *p,
1902 pms[1] = s->client_version & 0xff; 1902 pms[1] = s->client_version & 0xff;
1903 arc4random_buf(&pms[2], sizeof(pms) - 2); 1903 arc4random_buf(&pms[2], sizeof(pms) - 2);
1904 1904
1905 q = p; 1905 if ((enc_pms = malloc(RSA_size(pkey->pkey.rsa))) == NULL) {
1906 p += 2; 1906 SSLerr(SSL_F_SSL3_SEND_CLIENT_KEY_EXCHANGE,
1907 ERR_R_MALLOC_FAILURE);
1908 goto err;
1909 }
1907 1910
1908 n = RSA_public_encrypt(sizeof(pms), pms, p, pkey->pkey.rsa, 1911 enc_len = RSA_public_encrypt(sizeof(pms), pms, enc_pms, pkey->pkey.rsa,
1909 RSA_PKCS1_PADDING); 1912 RSA_PKCS1_PADDING);
1910 if (n <= 0) { 1913 if (enc_len <= 0) {
1911 SSLerr(SSL_F_SSL3_SEND_CLIENT_KEY_EXCHANGE, 1914 SSLerr(SSL_F_SSL3_SEND_CLIENT_KEY_EXCHANGE,
1912 SSL_R_BAD_RSA_ENCRYPT); 1915 SSL_R_BAD_RSA_ENCRYPT);
1913 goto err; 1916 goto err;
1914 } 1917 }
1915 1918
1916 s2n(n, q); 1919 if (!CBB_add_u16_length_prefixed(cbb, &epms))
1917 n += 2; 1920 goto err;
1921 if (!CBB_add_bytes(&epms, enc_pms, enc_len))
1922 goto err;
1923 if (!CBB_flush(cbb))
1924 goto err;
1918 1925
1919 s->session->master_key_length = 1926 s->session->master_key_length =
1920 s->method->ssl3_enc->generate_master_secret(s, 1927 s->method->ssl3_enc->generate_master_secret(s,
1921 s->session->master_key, pms, sizeof(pms)); 1928 s->session->master_key, pms, sizeof(pms));
1922 1929
1923 *outlen = n;
1924 ret = 1; 1930 ret = 1;
1925 1931
1926err: 1932err:
1927 explicit_bzero(pms, sizeof(pms)); 1933 explicit_bzero(pms, sizeof(pms));
1928 EVP_PKEY_free(pkey); 1934 EVP_PKEY_free(pkey);
1935 free(enc_pms);
1929 1936
1930 return (ret); 1937 return (ret);
1931} 1938}
@@ -2224,8 +2231,14 @@ ssl3_send_client_key_exchange(SSL *s)
2224{ 2231{
2225 SESS_CERT *sess_cert; 2232 SESS_CERT *sess_cert;
2226 unsigned long alg_k; 2233 unsigned long alg_k;
2227 unsigned char *p; 2234 unsigned char *bufend, *p;
2235 size_t outlen;
2228 int n = 0; 2236 int n = 0;
2237 CBB cbb;
2238
2239 memset(&cbb, 0, sizeof(cbb));
2240
2241 bufend = (unsigned char *)s->init_buf->data + s->init_buf->max;
2229 2242
2230 if (s->state == SSL3_ST_CW_KEY_EXCH_A) { 2243 if (s->state == SSL3_ST_CW_KEY_EXCH_A) {
2231 p = ssl3_handshake_msg_start(s, SSL3_MT_CLIENT_KEY_EXCHANGE); 2244 p = ssl3_handshake_msg_start(s, SSL3_MT_CLIENT_KEY_EXCHANGE);
@@ -2241,8 +2254,15 @@ ssl3_send_client_key_exchange(SSL *s)
2241 } 2254 }
2242 2255
2243 if (alg_k & SSL_kRSA) { 2256 if (alg_k & SSL_kRSA) {
2244 if (ssl3_send_client_kex_rsa(s, sess_cert, p, &n) != 1) 2257 if (!CBB_init_fixed(&cbb, p, bufend - p))
2245 goto err; 2258 goto err;
2259 if (ssl3_send_client_kex_rsa(s, sess_cert, &cbb) != 1)
2260 goto err;
2261 if (!CBB_finish(&cbb, NULL, &outlen))
2262 goto err;
2263 if (outlen > INT_MAX)
2264 goto err;
2265 n = (int)outlen;
2246 } else if (alg_k & SSL_kDHE) { 2266 } else if (alg_k & SSL_kDHE) {
2247 if (ssl3_send_client_kex_dhe(s, sess_cert, p, &n) != 1) 2267 if (ssl3_send_client_kex_dhe(s, sess_cert, p, &n) != 1)
2248 goto err; 2268 goto err;
@@ -2270,6 +2290,8 @@ ssl3_send_client_key_exchange(SSL *s)
2270 return (ssl3_handshake_write(s)); 2290 return (ssl3_handshake_write(s));
2271 2291
2272err: 2292err:
2293 CBB_cleanup(&cbb);
2294
2273 return (-1); 2295 return (-1);
2274} 2296}
2275 2297