summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorjsing <>2021-06-29 19:24:07 +0000
committerjsing <>2021-06-29 19:24:07 +0000
commita9fca25b84daaf2725140dc9ed1fae79bc52327b (patch)
treeca55a5ccce9f807b15c802be4db4036709e57de6
parent1c4ffb61b5971d1854050c16ef4555391ac12957 (diff)
downloadopenbsd-a9fca25b84daaf2725140dc9ed1fae79bc52327b.tar.gz
openbsd-a9fca25b84daaf2725140dc9ed1fae79bc52327b.tar.bz2
openbsd-a9fca25b84daaf2725140dc9ed1fae79bc52327b.zip
Convert legacy stack server to ssl_sigalg_for_peer().
ok inoguchi@ tb@
-rw-r--r--src/lib/libssl/ssl_srvr.c76
1 files changed, 29 insertions, 47 deletions
diff --git a/src/lib/libssl/ssl_srvr.c b/src/lib/libssl/ssl_srvr.c
index 04e81a5d76..e3eeddab0f 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.115 2021/06/29 19:10:08 jsing Exp $ */ 1/* $OpenBSD: ssl_srvr.c,v 1.116 2021/06/29 19:24:07 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 *
@@ -2113,7 +2113,7 @@ ssl3_get_cert_verify(SSL *s)
2113{ 2113{
2114 CBS cbs, signature; 2114 CBS cbs, signature;
2115 const struct ssl_sigalg *sigalg = NULL; 2115 const struct ssl_sigalg *sigalg = NULL;
2116 const EVP_MD *md = NULL; 2116 uint16_t sigalg_value = SIGALG_NONE;
2117 EVP_PKEY *pkey = NULL; 2117 EVP_PKEY *pkey = NULL;
2118 X509 *peer = NULL; 2118 X509 *peer = NULL;
2119 EVP_MD_CTX mctx; 2119 EVP_MD_CTX mctx;
@@ -2171,66 +2171,47 @@ ssl3_get_cert_verify(SSL *s)
2171 goto fatal_err; 2171 goto fatal_err;
2172 } 2172 }
2173 2173
2174 if (!SSL_USE_SIGALGS(s)) {
2175 if (!CBS_get_u16_length_prefixed(&cbs, &signature))
2176 goto err;
2177 if (CBS_len(&signature) > EVP_PKEY_size(pkey)) {
2178 SSLerror(s, SSL_R_WRONG_SIGNATURE_SIZE);
2179 al = SSL_AD_DECODE_ERROR;
2180 goto fatal_err;
2181 }
2182 if (CBS_len(&cbs) != 0) {
2183 al = SSL_AD_DECODE_ERROR;
2184 SSLerror(s, SSL_R_EXTRA_DATA_IN_MESSAGE);
2185 goto fatal_err;
2186 }
2187 }
2188
2189 if (SSL_USE_SIGALGS(s)) { 2174 if (SSL_USE_SIGALGS(s)) {
2190 EVP_PKEY_CTX *pctx;
2191 uint16_t sigalg_value;
2192
2193 if (!CBS_get_u16(&cbs, &sigalg_value)) 2175 if (!CBS_get_u16(&cbs, &sigalg_value))
2194 goto decode_err; 2176 goto decode_err;
2195 if ((sigalg = ssl_sigalg_from_value( 2177 }
2196 S3I(s)->hs.negotiated_tls_version, sigalg_value)) == NULL || 2178 if (!CBS_get_u16_length_prefixed(&cbs, &signature))
2197 (md = sigalg->md()) == NULL) { 2179 goto err;
2198 SSLerror(s, SSL_R_UNKNOWN_DIGEST); 2180 if (CBS_len(&cbs) != 0) {
2199 al = SSL_AD_DECODE_ERROR; 2181 al = SSL_AD_DECODE_ERROR;
2200 goto fatal_err; 2182 SSLerror(s, SSL_R_EXTRA_DATA_IN_MESSAGE);
2201 } 2183 goto fatal_err;
2202 if (!ssl_sigalg_pkey_ok(s, sigalg, pkey)) { 2184 }
2203 SSLerror(s, SSL_R_WRONG_SIGNATURE_TYPE);
2204 al = SSL_AD_DECODE_ERROR;
2205 goto fatal_err;
2206 }
2207 2185
2208 if (!CBS_get_u16_length_prefixed(&cbs, &signature)) 2186 if (CBS_len(&signature) > EVP_PKEY_size(pkey)) {
2209 goto err; 2187 SSLerror(s, SSL_R_WRONG_SIGNATURE_SIZE);
2210 if (CBS_len(&signature) > EVP_PKEY_size(pkey)) { 2188 al = SSL_AD_DECODE_ERROR;
2211 SSLerror(s, SSL_R_WRONG_SIGNATURE_SIZE); 2189 goto fatal_err;
2212 al = SSL_AD_DECODE_ERROR; 2190 }
2213 goto fatal_err; 2191
2214 } 2192 if ((sigalg = ssl_sigalg_for_peer(s, pkey,
2215 if (CBS_len(&cbs) != 0) { 2193 sigalg_value)) == NULL) {
2216 al = SSL_AD_DECODE_ERROR; 2194 al = SSL_AD_DECODE_ERROR;
2217 SSLerror(s, SSL_R_EXTRA_DATA_IN_MESSAGE); 2195 goto fatal_err;
2218 goto fatal_err; 2196 }
2219 } 2197
2198 if (SSL_USE_SIGALGS(s)) {
2199 EVP_PKEY_CTX *pctx;
2220 2200
2221 if (!tls1_transcript_data(s, &hdata, &hdatalen)) { 2201 if (!tls1_transcript_data(s, &hdata, &hdatalen)) {
2222 SSLerror(s, ERR_R_INTERNAL_ERROR); 2202 SSLerror(s, ERR_R_INTERNAL_ERROR);
2223 al = SSL_AD_INTERNAL_ERROR; 2203 al = SSL_AD_INTERNAL_ERROR;
2224 goto fatal_err; 2204 goto fatal_err;
2225 } 2205 }
2226 if (!EVP_DigestVerifyInit(&mctx, &pctx, md, NULL, pkey)) { 2206 if (!EVP_DigestVerifyInit(&mctx, &pctx, sigalg->md(),
2207 NULL, pkey)) {
2227 SSLerror(s, ERR_R_EVP_LIB); 2208 SSLerror(s, ERR_R_EVP_LIB);
2228 al = SSL_AD_INTERNAL_ERROR; 2209 al = SSL_AD_INTERNAL_ERROR;
2229 goto fatal_err; 2210 goto fatal_err;
2230 } 2211 }
2231 if ((sigalg->flags & SIGALG_FLAG_RSA_PSS) && 2212 if ((sigalg->flags & SIGALG_FLAG_RSA_PSS) &&
2232 (!EVP_PKEY_CTX_set_rsa_padding 2213 (!EVP_PKEY_CTX_set_rsa_padding(pctx,
2233 (pctx, RSA_PKCS1_PSS_PADDING) || 2214 RSA_PKCS1_PSS_PADDING) ||
2234 !EVP_PKEY_CTX_set_rsa_pss_saltlen(pctx, -1))) { 2215 !EVP_PKEY_CTX_set_rsa_pss_saltlen(pctx, -1))) {
2235 al = SSL_AD_INTERNAL_ERROR; 2216 al = SSL_AD_INTERNAL_ERROR;
2236 goto fatal_err; 2217 goto fatal_err;
@@ -2283,6 +2264,7 @@ ssl3_get_cert_verify(SSL *s)
2283 unsigned char sigbuf[128]; 2264 unsigned char sigbuf[128];
2284 unsigned int siglen = sizeof(sigbuf); 2265 unsigned int siglen = sizeof(sigbuf);
2285 EVP_PKEY_CTX *pctx; 2266 EVP_PKEY_CTX *pctx;
2267 const EVP_MD *md;
2286 int nid; 2268 int nid;
2287 2269
2288 if (!tls1_transcript_data(s, &hdata, &hdatalen)) { 2270 if (!tls1_transcript_data(s, &hdata, &hdatalen)) {