diff options
author | jsing <> | 2016-12-07 13:40:17 +0000 |
---|---|---|
committer | jsing <> | 2016-12-07 13:40:17 +0000 |
commit | 56e95909d58e61a460296a319d62a0a4333ec6c1 (patch) | |
tree | 0c579fc46a140feba99f1eced8bdadb68c2ac81a /src/lib | |
parent | 44e1e78161e8bc96a33689084d1e4b3f0f5956a4 (diff) | |
download | openbsd-56e95909d58e61a460296a319d62a0a4333ec6c1.tar.gz openbsd-56e95909d58e61a460296a319d62a0a4333ec6c1.tar.bz2 openbsd-56e95909d58e61a460296a319d62a0a4333ec6c1.zip |
Convert ssl3_send_client_kex_dhe() to CBB.
ok doug@
Diffstat (limited to 'src/lib')
-rw-r--r-- | src/lib/libssl/s3_clnt.c | 37 |
1 files changed, 23 insertions, 14 deletions
diff --git a/src/lib/libssl/s3_clnt.c b/src/lib/libssl/s3_clnt.c index c88835b91e..136bd4c6b4 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.151 2016/12/06 13:42:32 jsing Exp $ */ | 1 | /* $OpenBSD: s3_clnt.c,v 1.152 2016/12/07 13:40:17 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 | * |
@@ -1938,13 +1938,14 @@ err: | |||
1938 | } | 1938 | } |
1939 | 1939 | ||
1940 | static int | 1940 | static int |
1941 | ssl3_send_client_kex_dhe(SSL *s, SESS_CERT *sess_cert, unsigned char *p, | 1941 | ssl3_send_client_kex_dhe(SSL *s, SESS_CERT *sess_cert, CBB *cbb) |
1942 | int *outlen) | ||
1943 | { | 1942 | { |
1944 | DH *dh_srvr = NULL, *dh_clnt = NULL; | 1943 | DH *dh_srvr = NULL, *dh_clnt = NULL; |
1945 | unsigned char *key = NULL; | 1944 | unsigned char *key = NULL; |
1946 | int key_size, n; | 1945 | int key_size, key_len; |
1946 | unsigned char *data; | ||
1947 | int ret = -1; | 1947 | int ret = -1; |
1948 | CBB dh_Yc; | ||
1948 | 1949 | ||
1949 | /* Ensure that we have an ephemeral key for DHE. */ | 1950 | /* Ensure that we have an ephemeral key for DHE. */ |
1950 | if (sess_cert->peer_dh_tmp == NULL) { | 1951 | if (sess_cert->peer_dh_tmp == NULL) { |
@@ -1970,8 +1971,8 @@ ssl3_send_client_kex_dhe(SSL *s, SESS_CERT *sess_cert, unsigned char *p, | |||
1970 | ERR_R_MALLOC_FAILURE); | 1971 | ERR_R_MALLOC_FAILURE); |
1971 | goto err; | 1972 | goto err; |
1972 | } | 1973 | } |
1973 | n = DH_compute_key(key, dh_srvr->pub_key, dh_clnt); | 1974 | key_len = DH_compute_key(key, dh_srvr->pub_key, dh_clnt); |
1974 | if (n <= 0) { | 1975 | if (key_len <= 0) { |
1975 | SSLerr(SSL_F_SSL3_SEND_CLIENT_KEY_EXCHANGE, ERR_R_DH_LIB); | 1976 | SSLerr(SSL_F_SSL3_SEND_CLIENT_KEY_EXCHANGE, ERR_R_DH_LIB); |
1976 | goto err; | 1977 | goto err; |
1977 | } | 1978 | } |
@@ -1979,15 +1980,16 @@ ssl3_send_client_kex_dhe(SSL *s, SESS_CERT *sess_cert, unsigned char *p, | |||
1979 | /* Generate master key from the result. */ | 1980 | /* Generate master key from the result. */ |
1980 | s->session->master_key_length = | 1981 | s->session->master_key_length = |
1981 | s->method->ssl3_enc->generate_master_secret(s, | 1982 | s->method->ssl3_enc->generate_master_secret(s, |
1982 | s->session->master_key, key, n); | 1983 | s->session->master_key, key, key_len); |
1983 | 1984 | ||
1984 | /* Send off the data. */ | 1985 | if (!CBB_add_u16_length_prefixed(cbb, &dh_Yc)) |
1985 | n = BN_num_bytes(dh_clnt->pub_key); | 1986 | goto err; |
1986 | s2n(n, p); | 1987 | if (!CBB_add_space(&dh_Yc, &data, BN_num_bytes(dh_clnt->pub_key))) |
1987 | BN_bn2bin(dh_clnt->pub_key, p); | 1988 | goto err; |
1988 | n += 2; | 1989 | BN_bn2bin(dh_clnt->pub_key, data); |
1990 | if (!CBB_flush(cbb)) | ||
1991 | goto err; | ||
1989 | 1992 | ||
1990 | *outlen = n; | ||
1991 | ret = 1; | 1993 | ret = 1; |
1992 | 1994 | ||
1993 | err: | 1995 | err: |
@@ -2264,8 +2266,15 @@ ssl3_send_client_key_exchange(SSL *s) | |||
2264 | goto err; | 2266 | goto err; |
2265 | n = (int)outlen; | 2267 | n = (int)outlen; |
2266 | } else if (alg_k & SSL_kDHE) { | 2268 | } else if (alg_k & SSL_kDHE) { |
2267 | if (ssl3_send_client_kex_dhe(s, sess_cert, p, &n) != 1) | 2269 | if (!CBB_init_fixed(&cbb, p, bufend - p)) |
2270 | goto err; | ||
2271 | if (ssl3_send_client_kex_dhe(s, sess_cert, &cbb) != 1) | ||
2272 | goto err; | ||
2273 | if (!CBB_finish(&cbb, NULL, &outlen)) | ||
2274 | goto err; | ||
2275 | if (outlen > INT_MAX) | ||
2268 | goto err; | 2276 | goto err; |
2277 | n = (int)outlen; | ||
2269 | } else if (alg_k & SSL_kECDHE) { | 2278 | } else if (alg_k & SSL_kECDHE) { |
2270 | if (ssl3_send_client_kex_ecdhe(s, sess_cert, p, | 2279 | if (ssl3_send_client_kex_ecdhe(s, sess_cert, p, |
2271 | &n) != 1) | 2280 | &n) != 1) |