diff options
author | beck <> | 2018-11-10 01:19:09 +0000 |
---|---|---|
committer | beck <> | 2018-11-10 01:19:09 +0000 |
commit | 1dd4b0628e51e31516f047e02f51b266d74539df (patch) | |
tree | 7a38d18aacac062bf470573f237552369c229a80 /src/lib/libssl/ssl_srvr.c | |
parent | bd7257fa650660bcef2977e47cf52e067801b716 (diff) | |
download | openbsd-1dd4b0628e51e31516f047e02f51b266d74539df.tar.gz openbsd-1dd4b0628e51e31516f047e02f51b266d74539df.tar.bz2 openbsd-1dd4b0628e51e31516f047e02f51b266d74539df.zip |
Stop keeping track of sigalgs by guessing it from digest and pkey,
just keep the sigalg around so we can remember what we actually
decided to use.
ok jsing@
Diffstat (limited to '')
-rw-r--r-- | src/lib/libssl/ssl_srvr.c | 35 |
1 files changed, 12 insertions, 23 deletions
diff --git a/src/lib/libssl/ssl_srvr.c b/src/lib/libssl/ssl_srvr.c index 51e5475f54..587a538060 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.54 2018/11/09 05:43:39 beck Exp $ */ | 1 | /* $OpenBSD: ssl_srvr.c,v 1.55 2018/11/10 01:19:09 beck 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 | * |
@@ -1483,6 +1483,7 @@ int | |||
1483 | ssl3_send_server_key_exchange(SSL *s) | 1483 | ssl3_send_server_key_exchange(SSL *s) |
1484 | { | 1484 | { |
1485 | CBB cbb, cbb_params, cbb_signature, server_kex; | 1485 | CBB cbb, cbb_params, cbb_signature, server_kex; |
1486 | const struct ssl_sigalg *sigalg = NULL; | ||
1486 | unsigned char *signature = NULL; | 1487 | unsigned char *signature = NULL; |
1487 | unsigned int signature_len; | 1488 | unsigned int signature_len; |
1488 | unsigned char *params = NULL; | 1489 | unsigned char *params = NULL; |
@@ -1529,28 +1530,14 @@ ssl3_send_server_key_exchange(SSL *s) | |||
1529 | /* Add signature unless anonymous. */ | 1530 | /* Add signature unless anonymous. */ |
1530 | if (!(S3I(s)->hs.new_cipher->algorithm_auth & SSL_aNULL)) { | 1531 | if (!(S3I(s)->hs.new_cipher->algorithm_auth & SSL_aNULL)) { |
1531 | if ((pkey = ssl_get_sign_pkey(s, S3I(s)->hs.new_cipher, | 1532 | if ((pkey = ssl_get_sign_pkey(s, S3I(s)->hs.new_cipher, |
1532 | &md)) == NULL) { | 1533 | &md, &sigalg)) == NULL) { |
1533 | al = SSL_AD_DECODE_ERROR; | 1534 | al = SSL_AD_DECODE_ERROR; |
1534 | goto f_err; | 1535 | goto f_err; |
1535 | } | 1536 | } |
1536 | 1537 | ||
1537 | if (pkey->type == EVP_PKEY_RSA && !SSL_USE_SIGALGS(s)) | ||
1538 | md = EVP_md5_sha1(); | ||
1539 | |||
1540 | if (md == NULL) { | ||
1541 | /* Is this error check actually needed? */ | ||
1542 | al = SSL_AD_HANDSHAKE_FAILURE; | ||
1543 | SSLerror(s, SSL_R_UNKNOWN_PKEY_TYPE); | ||
1544 | goto f_err; | ||
1545 | } | ||
1546 | |||
1547 | /* Send signature algorithm. */ | 1538 | /* Send signature algorithm. */ |
1548 | if (SSL_USE_SIGALGS(s)) { | 1539 | if (SSL_USE_SIGALGS(s)) { |
1549 | uint16_t sigalg; | 1540 | if (!CBB_add_u16(&server_kex, sigalg->value)) { |
1550 | if ((sigalg = ssl_sigalg_value(pkey, md)) == | ||
1551 | SIGALG_NONE || | ||
1552 | !CBB_add_u16(&server_kex, sigalg)) { | ||
1553 | /* Should never happen */ | ||
1554 | al = SSL_AD_INTERNAL_ERROR; | 1541 | al = SSL_AD_INTERNAL_ERROR; |
1555 | SSLerror(s, ERR_R_INTERNAL_ERROR); | 1542 | SSLerror(s, ERR_R_INTERNAL_ERROR); |
1556 | goto f_err; | 1543 | goto f_err; |
@@ -1595,7 +1582,7 @@ ssl3_send_server_key_exchange(SSL *s) | |||
1595 | free(signature); | 1582 | free(signature); |
1596 | 1583 | ||
1597 | return (ssl3_handshake_write(s)); | 1584 | return (ssl3_handshake_write(s)); |
1598 | 1585 | ||
1599 | f_err: | 1586 | f_err: |
1600 | ssl3_send_alert(s, SSL3_AL_FATAL, al); | 1587 | ssl3_send_alert(s, SSL3_AL_FATAL, al); |
1601 | err: | 1588 | err: |
@@ -2155,17 +2142,19 @@ ssl3_get_cert_verify(SSL *s) | |||
2155 | goto err; | 2142 | goto err; |
2156 | } else { | 2143 | } else { |
2157 | if (SSL_USE_SIGALGS(s)) { | 2144 | if (SSL_USE_SIGALGS(s)) { |
2158 | uint16_t sigalg; | 2145 | const struct ssl_sigalg *sigalg; |
2146 | uint16_t sigalg_value; | ||
2159 | 2147 | ||
2160 | if (!CBS_get_u16(&cbs, &sigalg)) | 2148 | if (!CBS_get_u16(&cbs, &sigalg_value)) |
2161 | goto truncated; | 2149 | goto truncated; |
2162 | if ((md = ssl_sigalg_md(sigalg, tls12_sigalgs, | 2150 | if ((sigalg = ssl_sigalg(sigalg_value, tls12_sigalgs, |
2163 | tls12_sigalgs_len)) == NULL) { | 2151 | tls12_sigalgs_len)) == NULL || |
2152 | (md = sigalg->md()) == NULL) { | ||
2164 | SSLerror(s, SSL_R_UNKNOWN_DIGEST); | 2153 | SSLerror(s, SSL_R_UNKNOWN_DIGEST); |
2165 | al = SSL_AD_DECODE_ERROR; | 2154 | al = SSL_AD_DECODE_ERROR; |
2166 | goto f_err; | 2155 | goto f_err; |
2167 | } | 2156 | } |
2168 | if (!ssl_sigalg_pkey_check(sigalg, pkey)) { | 2157 | if (sigalg->key_type != pkey->type) { |
2169 | SSLerror(s, SSL_R_WRONG_SIGNATURE_TYPE); | 2158 | SSLerror(s, SSL_R_WRONG_SIGNATURE_TYPE); |
2170 | al = SSL_AD_DECODE_ERROR; | 2159 | al = SSL_AD_DECODE_ERROR; |
2171 | goto f_err; | 2160 | goto f_err; |