summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorjsing <>2021-06-29 18:59:25 +0000
committerjsing <>2021-06-29 18:59:25 +0000
commit380f15298c687e6a5ba2ad209905f15c7bf7efda (patch)
tree0feafb5df41d0e58c20844bb36a6b310a0b6eeb1
parent070373cba7b3f3dc81af2ce338d511cd874ce2d7 (diff)
downloadopenbsd-380f15298c687e6a5ba2ad209905f15c7bf7efda.tar.gz
openbsd-380f15298c687e6a5ba2ad209905f15c7bf7efda.tar.bz2
openbsd-380f15298c687e6a5ba2ad209905f15c7bf7efda.zip
Factor out handling of legacy default signature algorithms.
In the case of TLSv1.0 and TLSv1.1 there is no signature algorithms extension and default signature algorithms are used - similar applies to TLSv1.2 when the signature algorithms extension has been omitted. ok inoguchi@ tb@
-rw-r--r--src/lib/libssl/ssl_sigalgs.c59
1 files changed, 27 insertions, 32 deletions
diff --git a/src/lib/libssl/ssl_sigalgs.c b/src/lib/libssl/ssl_sigalgs.c
index dbb08e0a46..456332e7cf 100644
--- a/src/lib/libssl/ssl_sigalgs.c
+++ b/src/lib/libssl/ssl_sigalgs.c
@@ -1,4 +1,4 @@
1/* $OpenBSD: ssl_sigalgs.c,v 1.30 2021/06/29 18:55:47 jsing Exp $ */ 1/* $OpenBSD: ssl_sigalgs.c,v 1.31 2021/06/29 18:59:25 jsing Exp $ */
2/* 2/*
3 * Copyright (c) 2018-2020 Bob Beck <beck@openbsd.org> 3 * Copyright (c) 2018-2020 Bob Beck <beck@openbsd.org>
4 * 4 *
@@ -239,6 +239,26 @@ ssl_sigalgs_build(uint16_t tls_version, CBB *cbb)
239 return 1; 239 return 1;
240} 240}
241 241
242static const struct ssl_sigalg *
243ssl_sigalg_for_legacy(SSL *s, EVP_PKEY *pkey)
244{
245 /* Default signature algorithms used for TLSv1.2 and earlier. */
246 switch (pkey->type) {
247 case EVP_PKEY_RSA:
248 if (S3I(s)->hs.negotiated_tls_version < TLS1_2_VERSION)
249 return ssl_sigalg_lookup(SIGALG_RSA_PKCS1_MD5_SHA1);
250 return ssl_sigalg_lookup(SIGALG_RSA_PKCS1_SHA1);
251 case EVP_PKEY_EC:
252 return ssl_sigalg_lookup(SIGALG_ECDSA_SHA1);
253#ifndef OPENSSL_NO_GOST
254 case EVP_PKEY_GOSTR01:
255 return ssl_sigalg_lookup(SIGALG_GOSTR01_GOST94);
256#endif
257 }
258 SSLerror(s, SSL_R_UNKNOWN_PKEY_TYPE);
259 return (NULL);
260}
261
242int 262int
243ssl_sigalg_pkey_ok(const struct ssl_sigalg *sigalg, EVP_PKEY *pkey, 263ssl_sigalg_pkey_ok(const struct ssl_sigalg *sigalg, EVP_PKEY *pkey,
244 int check_curve) 264 int check_curve)
@@ -280,41 +300,16 @@ ssl_sigalg_select(SSL *s, EVP_PKEY *pkey)
280 if (S3I(s)->hs.negotiated_tls_version >= TLS1_3_VERSION) 300 if (S3I(s)->hs.negotiated_tls_version >= TLS1_3_VERSION)
281 check_curve = 1; 301 check_curve = 1;
282 302
283 /* Pre TLS 1.2 defaults */ 303 if (!SSL_USE_SIGALGS(s))
284 if (!SSL_USE_SIGALGS(s)) { 304 return ssl_sigalg_for_legacy(s, pkey);
285 switch (pkey->type) {
286 case EVP_PKEY_RSA:
287 return ssl_sigalg_lookup(SIGALG_RSA_PKCS1_MD5_SHA1);
288 case EVP_PKEY_EC:
289 return ssl_sigalg_lookup(SIGALG_ECDSA_SHA1);
290#ifndef OPENSSL_NO_GOST
291 case EVP_PKEY_GOSTR01:
292 return ssl_sigalg_lookup(SIGALG_GOSTR01_GOST94);
293#endif
294 }
295 SSLerror(s, SSL_R_UNKNOWN_PKEY_TYPE);
296 return (NULL);
297 }
298 305
299 /* 306 /*
300 * RFC 5246 allows a TLS 1.2 client to send no sigalgs, in 307 * RFC 5246 allows a TLS 1.2 client to send no sigalgs extension,
301 * which case the server must use the the default. 308 * in which case the server must use the default.
302 */ 309 */
303 if (S3I(s)->hs.negotiated_tls_version < TLS1_3_VERSION && 310 if (S3I(s)->hs.negotiated_tls_version < TLS1_3_VERSION &&
304 S3I(s)->hs.sigalgs == NULL) { 311 S3I(s)->hs.sigalgs == NULL)
305 switch (pkey->type) { 312 return ssl_sigalg_for_legacy(s, pkey);
306 case EVP_PKEY_RSA:
307 return ssl_sigalg_lookup(SIGALG_RSA_PKCS1_SHA1);
308 case EVP_PKEY_EC:
309 return ssl_sigalg_lookup(SIGALG_ECDSA_SHA1);
310#ifndef OPENSSL_NO_GOST
311 case EVP_PKEY_GOSTR01:
312 return ssl_sigalg_lookup(SIGALG_GOSTR01_GOST94);
313#endif
314 }
315 SSLerror(s, SSL_R_UNKNOWN_PKEY_TYPE);
316 return (NULL);
317 }
318 313
319 /* 314 /*
320 * If we get here, we have client or server sent sigalgs, use one. 315 * If we get here, we have client or server sent sigalgs, use one.