diff options
author | tb <> | 2018-12-07 07:22:09 +0000 |
---|---|---|
committer | tb <> | 2018-12-07 07:22:09 +0000 |
commit | 8211097db4b9bfe93d90279f0411b17fb91de808 (patch) | |
tree | 33d9cafa7e3d9701acb32283c37d292f4dd203c6 | |
parent | a52357cd04679e27f0755061807e3ccfb6898a39 (diff) | |
download | openbsd-8211097db4b9bfe93d90279f0411b17fb91de808.tar.gz openbsd-8211097db4b9bfe93d90279f0411b17fb91de808.tar.bz2 openbsd-8211097db4b9bfe93d90279f0411b17fb91de808.zip |
Remove an ugly hack in the client certificate verification code that works
around broken GOST implementations. It looks like client certificates with
GOST have been completely broken since reimport of the GOST code, so no-one
is using LibreSSL this way. The client side was fixed only last week for
TLSv1.0 and TLSv1.1. This workaround is now in the way of much needed
simplifcation and cleanup, so it is time for it to go.
suggested by and ok jsing
-rw-r--r-- | src/lib/libssl/ssl_srvr.c | 92 |
1 files changed, 44 insertions, 48 deletions
diff --git a/src/lib/libssl/ssl_srvr.c b/src/lib/libssl/ssl_srvr.c index 0667ac8da3..80199d3f2e 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.61 2018/11/21 15:13:29 jsing Exp $ */ | 1 | /* $OpenBSD: ssl_srvr.c,v 1.62 2018/12/07 07:22:09 tb 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 | * |
@@ -2149,55 +2149,53 @@ ssl3_get_cert_verify(SSL *s) | |||
2149 | goto f_err; | 2149 | goto f_err; |
2150 | } | 2150 | } |
2151 | 2151 | ||
2152 | /* | 2152 | if (!SSL_USE_SIGALGS(s)) { |
2153 | * Check for broken implementations of GOST ciphersuites. | ||
2154 | * | ||
2155 | * If key is GOST and n is exactly 64, it is a bare | ||
2156 | * signature without length field. | ||
2157 | */ | ||
2158 | /* This hack is awful and needs to die in fire */ | ||
2159 | if ((pkey->type == NID_id_GostR3410_94 || | ||
2160 | pkey->type == NID_id_GostR3410_2001) && CBS_len(&cbs) == 64) { | ||
2161 | if (SSL_USE_SIGALGS(s)) | ||
2162 | goto truncated; | ||
2163 | CBS_dup(&cbs, &signature); | ||
2164 | if (!CBS_skip(&cbs, CBS_len(&cbs))) | ||
2165 | goto err; | ||
2166 | } else { | ||
2167 | if (SSL_USE_SIGALGS(s)) { | ||
2168 | uint16_t sigalg_value; | ||
2169 | |||
2170 | if (!CBS_get_u16(&cbs, &sigalg_value)) | ||
2171 | goto truncated; | ||
2172 | if ((sigalg = ssl_sigalg(sigalg_value, tls12_sigalgs, | ||
2173 | tls12_sigalgs_len)) == NULL || | ||
2174 | (md = sigalg->md()) == NULL) { | ||
2175 | SSLerror(s, SSL_R_UNKNOWN_DIGEST); | ||
2176 | al = SSL_AD_DECODE_ERROR; | ||
2177 | goto f_err; | ||
2178 | } | ||
2179 | if (!ssl_sigalg_pkey_ok(sigalg, pkey)) { | ||
2180 | SSLerror(s, SSL_R_WRONG_SIGNATURE_TYPE); | ||
2181 | al = SSL_AD_DECODE_ERROR; | ||
2182 | goto f_err; | ||
2183 | } | ||
2184 | } | ||
2185 | if (!CBS_get_u16_length_prefixed(&cbs, &signature)) | 2153 | if (!CBS_get_u16_length_prefixed(&cbs, &signature)) |
2186 | goto err; | 2154 | goto err; |
2187 | } | 2155 | if (CBS_len(&signature) > EVP_PKEY_size(pkey)) { |
2188 | if (CBS_len(&signature) > EVP_PKEY_size(pkey)) { | 2156 | SSLerror(s, SSL_R_WRONG_SIGNATURE_SIZE); |
2189 | SSLerror(s, SSL_R_WRONG_SIGNATURE_SIZE); | 2157 | al = SSL_AD_DECODE_ERROR; |
2190 | al = SSL_AD_DECODE_ERROR; | 2158 | goto f_err; |
2191 | goto f_err; | 2159 | } |
2192 | } | 2160 | if (CBS_len(&cbs) != 0) { |
2193 | if (CBS_len(&cbs) != 0) { | 2161 | al = SSL_AD_DECODE_ERROR; |
2194 | al = SSL_AD_DECODE_ERROR; | 2162 | SSLerror(s, SSL_R_EXTRA_DATA_IN_MESSAGE); |
2195 | SSLerror(s, SSL_R_EXTRA_DATA_IN_MESSAGE); | 2163 | goto f_err; |
2196 | goto f_err; | 2164 | } |
2197 | } | 2165 | } |
2198 | 2166 | ||
2199 | if (SSL_USE_SIGALGS(s)) { | 2167 | if (SSL_USE_SIGALGS(s)) { |
2200 | EVP_PKEY_CTX *pctx; | 2168 | EVP_PKEY_CTX *pctx; |
2169 | uint16_t sigalg_value; | ||
2170 | |||
2171 | if (!CBS_get_u16(&cbs, &sigalg_value)) | ||
2172 | goto truncated; | ||
2173 | if ((sigalg = ssl_sigalg(sigalg_value, tls12_sigalgs, | ||
2174 | tls12_sigalgs_len)) == NULL || | ||
2175 | (md = sigalg->md()) == NULL) { | ||
2176 | SSLerror(s, SSL_R_UNKNOWN_DIGEST); | ||
2177 | al = SSL_AD_DECODE_ERROR; | ||
2178 | goto f_err; | ||
2179 | } | ||
2180 | if (!ssl_sigalg_pkey_ok(sigalg, pkey)) { | ||
2181 | SSLerror(s, SSL_R_WRONG_SIGNATURE_TYPE); | ||
2182 | al = SSL_AD_DECODE_ERROR; | ||
2183 | goto f_err; | ||
2184 | } | ||
2185 | |||
2186 | if (!CBS_get_u16_length_prefixed(&cbs, &signature)) | ||
2187 | goto err; | ||
2188 | if (CBS_len(&signature) > EVP_PKEY_size(pkey)) { | ||
2189 | SSLerror(s, SSL_R_WRONG_SIGNATURE_SIZE); | ||
2190 | al = SSL_AD_DECODE_ERROR; | ||
2191 | goto f_err; | ||
2192 | } | ||
2193 | if (CBS_len(&cbs) != 0) { | ||
2194 | al = SSL_AD_DECODE_ERROR; | ||
2195 | SSLerror(s, SSL_R_EXTRA_DATA_IN_MESSAGE); | ||
2196 | goto f_err; | ||
2197 | } | ||
2198 | |||
2201 | if (!tls1_transcript_data(s, &hdata, &hdatalen)) { | 2199 | if (!tls1_transcript_data(s, &hdata, &hdatalen)) { |
2202 | SSLerror(s, ERR_R_INTERNAL_ERROR); | 2200 | SSLerror(s, ERR_R_INTERNAL_ERROR); |
2203 | al = SSL_AD_INTERNAL_ERROR; | 2201 | al = SSL_AD_INTERNAL_ERROR; |
@@ -2250,9 +2248,8 @@ ssl3_get_cert_verify(SSL *s) | |||
2250 | SSLerror(s, SSL_R_BAD_ECDSA_SIGNATURE); | 2248 | SSLerror(s, SSL_R_BAD_ECDSA_SIGNATURE); |
2251 | goto f_err; | 2249 | goto f_err; |
2252 | } | 2250 | } |
2253 | } else | ||
2254 | #ifndef OPENSSL_NO_GOST | 2251 | #ifndef OPENSSL_NO_GOST |
2255 | if (pkey->type == NID_id_GostR3410_94 || | 2252 | } else if (pkey->type == NID_id_GostR3410_94 || |
2256 | pkey->type == NID_id_GostR3410_2001) { | 2253 | pkey->type == NID_id_GostR3410_2001) { |
2257 | unsigned char sigbuf[128]; | 2254 | unsigned char sigbuf[128]; |
2258 | unsigned int siglen = sizeof(sigbuf); | 2255 | unsigned int siglen = sizeof(sigbuf); |
@@ -2297,9 +2294,8 @@ ssl3_get_cert_verify(SSL *s) | |||
2297 | } | 2294 | } |
2298 | 2295 | ||
2299 | EVP_PKEY_CTX_free(pctx); | 2296 | EVP_PKEY_CTX_free(pctx); |
2300 | } else | ||
2301 | #endif | 2297 | #endif |
2302 | { | 2298 | } else { |
2303 | SSLerror(s, ERR_R_INTERNAL_ERROR); | 2299 | SSLerror(s, ERR_R_INTERNAL_ERROR); |
2304 | al = SSL_AD_UNSUPPORTED_CERTIFICATE; | 2300 | al = SSL_AD_UNSUPPORTED_CERTIFICATE; |
2305 | goto f_err; | 2301 | goto f_err; |