summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authortb <>2018-12-07 07:22:09 +0000
committertb <>2018-12-07 07:22:09 +0000
commit8211097db4b9bfe93d90279f0411b17fb91de808 (patch)
tree33d9cafa7e3d9701acb32283c37d292f4dd203c6
parenta52357cd04679e27f0755061807e3ccfb6898a39 (diff)
downloadopenbsd-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.c92
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;