summaryrefslogtreecommitdiff
path: root/src/lib
diff options
context:
space:
mode:
authorjsing <>2019-03-25 17:21:18 +0000
committerjsing <>2019-03-25 17:21:18 +0000
commite54e43a6f31368338de68eeea77a87ad2be5b85f (patch)
treeeb5e58a5d9b8198b8475b96156e908c92c86e532 /src/lib
parentd6a095cfa3d05c1eea376148faa4717ae6179ef0 (diff)
downloadopenbsd-e54e43a6f31368338de68eeea77a87ad2be5b85f.tar.gz
openbsd-e54e43a6f31368338de68eeea77a87ad2be5b85f.tar.bz2
openbsd-e54e43a6f31368338de68eeea77a87ad2be5b85f.zip
Defer sigalgs selection until the certificate is known.
Previously the signature algorithm was selected when the TLS extension was parsed (or the client received a certificate request), however the actual certificate to be used is not known at this stage. This leads to various problems, including the selection of a signature algorithm that cannot be used with the certificate key size (as found by jeremy@ via ruby regress). Instead, store the signature algorithms list and only select a signature algorithm when we're ready to do signature generation. Joint work with beck@.
Diffstat (limited to 'src/lib')
-rw-r--r--src/lib/libssl/s3_lib.c6
-rw-r--r--src/lib/libssl/ssl_clnt.c30
-rw-r--r--src/lib/libssl/ssl_lib.c15
-rw-r--r--src/lib/libssl/ssl_locl.h6
-rw-r--r--src/lib/libssl/ssl_sigalgs.c84
-rw-r--r--src/lib/libssl/ssl_sigalgs.h8
-rw-r--r--src/lib/libssl/ssl_srvr.c4
-rw-r--r--src/lib/libssl/ssl_tlsext.c15
-rw-r--r--src/lib/libssl/tls13_client.c4
9 files changed, 124 insertions, 48 deletions
diff --git a/src/lib/libssl/s3_lib.c b/src/lib/libssl/s3_lib.c
index de928bd70e..49f402d065 100644
--- a/src/lib/libssl/s3_lib.c
+++ b/src/lib/libssl/s3_lib.c
@@ -1,4 +1,4 @@
1/* $OpenBSD: s3_lib.c,v 1.184 2019/02/09 15:26:15 jsing Exp $ */ 1/* $OpenBSD: s3_lib.c,v 1.185 2019/03/25 17:21:18 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 *
@@ -1559,6 +1559,7 @@ ssl3_free(SSL *s)
1559 tls1_cleanup_key_block(s); 1559 tls1_cleanup_key_block(s);
1560 ssl3_release_read_buffer(s); 1560 ssl3_release_read_buffer(s);
1561 ssl3_release_write_buffer(s); 1561 ssl3_release_write_buffer(s);
1562 freezero(S3I(s)->hs.sigalgs, S3I(s)->hs.sigalgs_len);
1562 1563
1563 DH_free(S3I(s)->tmp.dh); 1564 DH_free(S3I(s)->tmp.dh);
1564 EC_KEY_free(S3I(s)->tmp.ecdh); 1565 EC_KEY_free(S3I(s)->tmp.ecdh);
@@ -1598,6 +1599,9 @@ ssl3_clear(SSL *s)
1598 S3I(s)->tmp.dh = NULL; 1599 S3I(s)->tmp.dh = NULL;
1599 EC_KEY_free(S3I(s)->tmp.ecdh); 1600 EC_KEY_free(S3I(s)->tmp.ecdh);
1600 S3I(s)->tmp.ecdh = NULL; 1601 S3I(s)->tmp.ecdh = NULL;
1602 freezero(S3I(s)->hs.sigalgs, S3I(s)->hs.sigalgs_len);
1603 S3I(s)->hs.sigalgs = NULL;
1604 S3I(s)->hs.sigalgs_len = 0;
1601 1605
1602 freezero(S3I(s)->tmp.x25519, X25519_KEY_LENGTH); 1606 freezero(S3I(s)->tmp.x25519, X25519_KEY_LENGTH);
1603 S3I(s)->tmp.x25519 = NULL; 1607 S3I(s)->tmp.x25519 = NULL;
diff --git a/src/lib/libssl/ssl_clnt.c b/src/lib/libssl/ssl_clnt.c
index 262e09fe5e..2174e3a83d 100644
--- a/src/lib/libssl/ssl_clnt.c
+++ b/src/lib/libssl/ssl_clnt.c
@@ -1,4 +1,4 @@
1/* $OpenBSD: ssl_clnt.c,v 1.59 2019/03/25 16:35:48 jsing Exp $ */ 1/* $OpenBSD: ssl_clnt.c,v 1.60 2019/03/25 17:21:18 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 *
@@ -1512,7 +1512,7 @@ ssl3_get_server_key_exchange(SSL *s)
1512 if (!CBS_get_u16(&cbs, &sigalg_value)) 1512 if (!CBS_get_u16(&cbs, &sigalg_value))
1513 goto truncated; 1513 goto truncated;
1514 if ((sigalg = ssl_sigalg(sigalg_value, tls12_sigalgs, 1514 if ((sigalg = ssl_sigalg(sigalg_value, tls12_sigalgs,
1515 tls12_sigalgs_len)) == NULL) { 1515 tls12_sigalgs_len)) == NULL) {
1516 SSLerror(s, SSL_R_UNKNOWN_DIGEST); 1516 SSLerror(s, SSL_R_UNKNOWN_DIGEST);
1517 al = SSL_AD_DECODE_ERROR; 1517 al = SSL_AD_DECODE_ERROR;
1518 goto f_err; 1518 goto f_err;
@@ -1522,7 +1522,7 @@ ssl3_get_server_key_exchange(SSL *s)
1522 al = SSL_AD_DECODE_ERROR; 1522 al = SSL_AD_DECODE_ERROR;
1523 goto f_err; 1523 goto f_err;
1524 } 1524 }
1525 if (!ssl_sigalg_pkey_ok(sigalg, pkey)) { 1525 if (!ssl_sigalg_pkey_ok(sigalg, pkey, 0)) {
1526 SSLerror(s, SSL_R_WRONG_SIGNATURE_TYPE); 1526 SSLerror(s, SSL_R_WRONG_SIGNATURE_TYPE);
1527 al = SSL_AD_DECODE_ERROR; 1527 al = SSL_AD_DECODE_ERROR;
1528 goto f_err; 1528 goto f_err;
@@ -1671,21 +1671,19 @@ ssl3_get_certificate_request(SSL *s)
1671 SSLerror(s, SSL_R_DATA_LENGTH_TOO_LONG); 1671 SSLerror(s, SSL_R_DATA_LENGTH_TOO_LONG);
1672 goto err; 1672 goto err;
1673 } 1673 }
1674
1675 /* Check we have enough room for signature algorithms and
1676 * following length value.
1677 */
1678 if (!CBS_get_u16_length_prefixed(&cert_request, &sigalgs)) { 1674 if (!CBS_get_u16_length_prefixed(&cert_request, &sigalgs)) {
1679 ssl3_send_alert(s, SSL3_AL_FATAL, SSL_AD_DECODE_ERROR); 1675 ssl3_send_alert(s, SSL3_AL_FATAL, SSL_AD_DECODE_ERROR);
1680 SSLerror(s, SSL_R_DATA_LENGTH_TOO_LONG); 1676 SSLerror(s, SSL_R_DATA_LENGTH_TOO_LONG);
1681 goto err; 1677 goto err;
1682 } 1678 }
1683 if (!tls1_process_sigalgs(s, &sigalgs, tls12_sigalgs, 1679 if (CBS_len(&sigalgs) % 2 != 0 || CBS_len(&sigalgs) > 64) {
1684 tls12_sigalgs_len)) {
1685 ssl3_send_alert(s, SSL3_AL_FATAL, SSL_AD_DECODE_ERROR); 1680 ssl3_send_alert(s, SSL3_AL_FATAL, SSL_AD_DECODE_ERROR);
1686 SSLerror(s, SSL_R_SIGNATURE_ALGORITHMS_ERROR); 1681 SSLerror(s, SSL_R_SIGNATURE_ALGORITHMS_ERROR);
1687 goto err; 1682 goto err;
1688 } 1683 }
1684 if (!CBS_stow(&sigalgs, &S3I(s)->hs.sigalgs,
1685 &S3I(s)->hs.sigalgs_len))
1686 goto err;
1689 } 1687 }
1690 1688
1691 /* get the CA RDNs */ 1689 /* get the CA RDNs */
@@ -2372,6 +2370,7 @@ err:
2372static int 2370static int
2373ssl3_send_client_verify_sigalgs(SSL *s, CBB *cert_verify) 2371ssl3_send_client_verify_sigalgs(SSL *s, CBB *cert_verify)
2374{ 2372{
2373 const struct ssl_sigalg *sigalg;
2375 CBB cbb_signature; 2374 CBB cbb_signature;
2376 EVP_PKEY_CTX *pctx = NULL; 2375 EVP_PKEY_CTX *pctx = NULL;
2377 EVP_PKEY *pkey; 2376 EVP_PKEY *pkey;
@@ -2387,10 +2386,17 @@ ssl3_send_client_verify_sigalgs(SSL *s, CBB *cert_verify)
2387 EVP_MD_CTX_init(&mctx); 2386 EVP_MD_CTX_init(&mctx);
2388 2387
2389 pkey = s->cert->key->privatekey; 2388 pkey = s->cert->key->privatekey;
2390 md = s->cert->key->sigalg->md(); 2389 if ((sigalg = ssl_sigalg_select(s, pkey)) == NULL) {
2390 SSLerror(s, SSL_R_SIGNATURE_ALGORITHMS_ERROR);
2391 goto err;
2392 }
2393 if ((md = sigalg->md()) == NULL) {
2394 SSLerror(s, SSL_R_UNKNOWN_DIGEST);
2395 goto err;
2396 }
2391 2397
2392 if (!tls1_transcript_data(s, &hdata, &hdatalen) || 2398 if (!tls1_transcript_data(s, &hdata, &hdatalen) ||
2393 !CBB_add_u16(cert_verify, s->cert->key->sigalg->value)) { 2399 !CBB_add_u16(cert_verify, sigalg->value)) {
2394 SSLerror(s, ERR_R_INTERNAL_ERROR); 2400 SSLerror(s, ERR_R_INTERNAL_ERROR);
2395 goto err; 2401 goto err;
2396 } 2402 }
@@ -2398,7 +2404,7 @@ ssl3_send_client_verify_sigalgs(SSL *s, CBB *cert_verify)
2398 SSLerror(s, ERR_R_EVP_LIB); 2404 SSLerror(s, ERR_R_EVP_LIB);
2399 goto err; 2405 goto err;
2400 } 2406 }
2401 if ((s->cert->key->sigalg->flags & SIGALG_FLAG_RSA_PSS) && 2407 if ((sigalg->flags & SIGALG_FLAG_RSA_PSS) &&
2402 (!EVP_PKEY_CTX_set_rsa_padding(pctx, RSA_PKCS1_PSS_PADDING) || 2408 (!EVP_PKEY_CTX_set_rsa_padding(pctx, RSA_PKCS1_PSS_PADDING) ||
2403 !EVP_PKEY_CTX_set_rsa_pss_saltlen(pctx, -1))) { 2409 !EVP_PKEY_CTX_set_rsa_pss_saltlen(pctx, -1))) {
2404 SSLerror(s, ERR_R_EVP_LIB); 2410 SSLerror(s, ERR_R_EVP_LIB);
diff --git a/src/lib/libssl/ssl_lib.c b/src/lib/libssl/ssl_lib.c
index 52ede46f7e..70a4c6d16f 100644
--- a/src/lib/libssl/ssl_lib.c
+++ b/src/lib/libssl/ssl_lib.c
@@ -1,4 +1,4 @@
1/* $OpenBSD: ssl_lib.c,v 1.202 2019/03/25 16:37:52 jsing Exp $ */ 1/* $OpenBSD: ssl_lib.c,v 1.203 2019/03/25 17:21:18 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 *
@@ -2120,18 +2120,7 @@ ssl_get_sign_pkey(SSL *s, const SSL_CIPHER *cipher, const EVP_MD **pmd,
2120 } 2120 }
2121 2121
2122 pkey = c->pkeys[idx].privatekey; 2122 pkey = c->pkeys[idx].privatekey;
2123 sigalg = c->pkeys[idx].sigalg; 2123 if ((sigalg = ssl_sigalg_select(s, pkey)) == NULL) {
2124 if (!SSL_USE_SIGALGS(s)) {
2125 if (pkey->type == EVP_PKEY_RSA) {
2126 sigalg = ssl_sigalg_lookup(SIGALG_RSA_PKCS1_MD5_SHA1);
2127 } else if (pkey->type == EVP_PKEY_EC) {
2128 sigalg = ssl_sigalg_lookup(SIGALG_ECDSA_SHA1);
2129 } else {
2130 SSLerror(s, SSL_R_UNKNOWN_PKEY_TYPE);
2131 return (NULL);
2132 }
2133 }
2134 if (sigalg == NULL) {
2135 SSLerror(s, SSL_R_SIGNATURE_ALGORITHMS_ERROR); 2124 SSLerror(s, SSL_R_SIGNATURE_ALGORITHMS_ERROR);
2136 return (NULL); 2125 return (NULL);
2137 } 2126 }
diff --git a/src/lib/libssl/ssl_locl.h b/src/lib/libssl/ssl_locl.h
index 9d06deeb7a..44abb6d6da 100644
--- a/src/lib/libssl/ssl_locl.h
+++ b/src/lib/libssl/ssl_locl.h
@@ -1,4 +1,4 @@
1/* $OpenBSD: ssl_locl.h,v 1.241 2019/03/25 16:37:52 jsing Exp $ */ 1/* $OpenBSD: ssl_locl.h,v 1.242 2019/03/25 17:21:18 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 *
@@ -432,6 +432,10 @@ typedef struct ssl_handshake_st {
432 432
433 /* Extensions seen in this handshake. */ 433 /* Extensions seen in this handshake. */
434 uint32_t extensions_seen; 434 uint32_t extensions_seen;
435
436 /* sigalgs offered in this handshake in wire form */
437 size_t sigalgs_len;
438 uint8_t *sigalgs;
435} SSL_HANDSHAKE; 439} SSL_HANDSHAKE;
436 440
437typedef struct ssl_handshake_tls13_st { 441typedef struct ssl_handshake_tls13_st {
diff --git a/src/lib/libssl/ssl_sigalgs.c b/src/lib/libssl/ssl_sigalgs.c
index 3a7f6d6687..50f4802fdb 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.17 2019/03/19 16:56:04 jsing Exp $ */ 1/* $OpenBSD: ssl_sigalgs.c,v 1.18 2019/03/25 17:21:18 jsing Exp $ */
2/* 2/*
3 * Copyright (c) 2018-2019 Bob Beck <beck@openbsd.org> 3 * Copyright (c) 2018-2019 Bob Beck <beck@openbsd.org>
4 * 4 *
@@ -246,7 +246,8 @@ ssl_sigalgs_build(CBB *cbb, uint16_t *values, size_t len)
246} 246}
247 247
248int 248int
249ssl_sigalg_pkey_ok(const struct ssl_sigalg *sigalg, EVP_PKEY *pkey) 249ssl_sigalg_pkey_ok(const struct ssl_sigalg *sigalg, EVP_PKEY *pkey,
250 int check_curve)
250{ 251{
251 if (sigalg == NULL || pkey == NULL) 252 if (sigalg == NULL || pkey == NULL)
252 return 0; 253 return 0;
@@ -266,12 +267,85 @@ ssl_sigalg_pkey_ok(const struct ssl_sigalg *sigalg, EVP_PKEY *pkey)
266 if (pkey->type == EVP_PKEY_EC) { 267 if (pkey->type == EVP_PKEY_EC) {
267 if (sigalg->curve_nid == 0) 268 if (sigalg->curve_nid == 0)
268 return 0; 269 return 0;
269 /* Curve must match for EC keys */ 270 /* Curve must match for EC keys. */
270 if (EC_GROUP_get_curve_name(EC_KEY_get0_group 271 if (check_curve && EC_GROUP_get_curve_name(EC_KEY_get0_group
271 (EVP_PKEY_get0_EC_KEY(pkey))) != sigalg->curve_nid) { 272 (EVP_PKEY_get0_EC_KEY(pkey))) != sigalg->curve_nid) {
272 return 1; /* XXX www.videolan.org curve mismatch */ 273 return 0;
273 } 274 }
274 } 275 }
275 276
276 return 1; 277 return 1;
277} 278}
279
280const struct ssl_sigalg *
281ssl_sigalg_select(SSL *s, EVP_PKEY *pkey)
282{
283 uint16_t *tls_sigalgs = tls12_sigalgs;
284 size_t tls_sigalgs_len = tls12_sigalgs_len;
285 int check_curve = 0;
286 CBS cbs;
287
288 if (TLS1_get_version(s) >= TLS1_3_VERSION) {
289 tls_sigalgs = tls13_sigalgs;
290 tls_sigalgs_len = tls13_sigalgs_len;
291 check_curve = 1;
292 }
293
294 /* Pre TLS 1.2 defaults */
295 if (!SSL_USE_SIGALGS(s)) {
296 switch (pkey->type) {
297 case EVP_PKEY_RSA:
298 return ssl_sigalg_lookup(SIGALG_RSA_PKCS1_MD5_SHA1);
299 case EVP_PKEY_EC:
300 return ssl_sigalg_lookup(SIGALG_ECDSA_SHA1);
301#ifndef OPENSSL_NO_GOST
302 case EVP_PKEY_GOSTR01:
303 return ssl_sigalg_lookup(SIGALG_GOSTR01_GOST94);
304#endif
305 }
306 SSLerror(s, SSL_R_UNKNOWN_PKEY_TYPE);
307 return (NULL);
308 }
309
310 /*
311 * RFC 5246 allows a TLS 1.2 client to send no sigalgs, in
312 * which case the server must use the the default.
313 */
314 if (TLS1_get_version(s) < TLS1_3_VERSION &&
315 S3I(s)->hs.sigalgs == NULL) {
316 switch (pkey->type) {
317 case EVP_PKEY_RSA:
318 return ssl_sigalg_lookup(SIGALG_RSA_PKCS1_SHA1);
319 case EVP_PKEY_EC:
320 return ssl_sigalg_lookup(SIGALG_ECDSA_SHA1);
321#ifndef OPENSSL_NO_GOST
322 case EVP_PKEY_GOSTR01:
323 return ssl_sigalg_lookup(SIGALG_GOSTR01_GOST94);
324#endif
325 }
326 SSLerror(s, SSL_R_UNKNOWN_PKEY_TYPE);
327 return (NULL);
328 }
329
330 /*
331 * If we get here, we have client or server sent sigalgs, use one.
332 */
333 CBS_init(&cbs, S3I(s)->hs.sigalgs, S3I(s)->hs.sigalgs_len);
334 while (CBS_len(&cbs) > 0) {
335 uint16_t sig_alg;
336 const struct ssl_sigalg *sigalg;
337
338 if (!CBS_get_u16(&cbs, &sig_alg))
339 return 0;
340
341 if ((sigalg = ssl_sigalg(sig_alg, tls_sigalgs,
342 tls_sigalgs_len)) == NULL)
343 continue;
344
345 if (ssl_sigalg_pkey_ok(sigalg, pkey, check_curve))
346 return sigalg;
347 }
348
349 SSLerror(s, SSL_R_UNKNOWN_PKEY_TYPE);
350 return NULL;
351}
diff --git a/src/lib/libssl/ssl_sigalgs.h b/src/lib/libssl/ssl_sigalgs.h
index d05f66f7ba..d06731e10d 100644
--- a/src/lib/libssl/ssl_sigalgs.h
+++ b/src/lib/libssl/ssl_sigalgs.h
@@ -1,6 +1,6 @@
1/* $OpenBSD: ssl_sigalgs.h,v 1.12 2019/01/23 23:47:13 beck Exp $ */ 1/* $OpenBSD: ssl_sigalgs.h,v 1.13 2019/03/25 17:21:18 jsing Exp $ */
2/* 2/*
3 * Copyright (c) 2018, Bob Beck <beck@openbsd.org> 3 * Copyright (c) 2018-2019 Bob Beck <beck@openbsd.org>
4 * 4 *
5 * Permission to use, copy, modify, and/or distribute this software for any 5 * Permission to use, copy, modify, and/or distribute this software for any
6 * purpose with or without fee is hereby granted, provided that the above 6 * purpose with or without fee is hereby granted, provided that the above
@@ -78,7 +78,9 @@ const struct ssl_sigalg *ssl_sigalg_lookup(uint16_t sigalg);
78const struct ssl_sigalg *ssl_sigalg(uint16_t sigalg, uint16_t *values, size_t len); 78const struct ssl_sigalg *ssl_sigalg(uint16_t sigalg, uint16_t *values, size_t len);
79int ssl_sigalgs_build(CBB *cbb, uint16_t *values, size_t len); 79int ssl_sigalgs_build(CBB *cbb, uint16_t *values, size_t len);
80int ssl_sigalg_pkey_check(uint16_t sigalg, EVP_PKEY *pk); 80int ssl_sigalg_pkey_check(uint16_t sigalg, EVP_PKEY *pk);
81int ssl_sigalg_pkey_ok(const struct ssl_sigalg *sigalg, EVP_PKEY *pkey); 81int ssl_sigalg_pkey_ok(const struct ssl_sigalg *sigalg, EVP_PKEY *pkey,
82 int check_curve);
83const struct ssl_sigalg *ssl_sigalg_select(SSL *s, EVP_PKEY *pkey);
82 84
83__END_HIDDEN_DECLS 85__END_HIDDEN_DECLS
84 86
diff --git a/src/lib/libssl/ssl_srvr.c b/src/lib/libssl/ssl_srvr.c
index f2aafc3032..745d0228f3 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.65 2019/03/25 16:35:48 jsing Exp $ */ 1/* $OpenBSD: ssl_srvr.c,v 1.66 2019/03/25 17:21:18 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 *
@@ -2177,7 +2177,7 @@ ssl3_get_cert_verify(SSL *s)
2177 al = SSL_AD_DECODE_ERROR; 2177 al = SSL_AD_DECODE_ERROR;
2178 goto f_err; 2178 goto f_err;
2179 } 2179 }
2180 if (!ssl_sigalg_pkey_ok(sigalg, pkey)) { 2180 if (!ssl_sigalg_pkey_ok(sigalg, pkey, 0)) {
2181 SSLerror(s, SSL_R_WRONG_SIGNATURE_TYPE); 2181 SSLerror(s, SSL_R_WRONG_SIGNATURE_TYPE);
2182 al = SSL_AD_DECODE_ERROR; 2182 al = SSL_AD_DECODE_ERROR;
2183 goto f_err; 2183 goto f_err;
diff --git a/src/lib/libssl/ssl_tlsext.c b/src/lib/libssl/ssl_tlsext.c
index de9fabd4c7..0e37cc3cc0 100644
--- a/src/lib/libssl/ssl_tlsext.c
+++ b/src/lib/libssl/ssl_tlsext.c
@@ -1,4 +1,4 @@
1/* $OpenBSD: ssl_tlsext.c,v 1.43 2019/03/19 16:53:03 jsing Exp $ */ 1/* $OpenBSD: ssl_tlsext.c,v 1.44 2019/03/25 17:21:18 jsing Exp $ */
2/* 2/*
3 * Copyright (c) 2016, 2017, 2019 Joel Sing <jsing@openbsd.org> 3 * Copyright (c) 2016, 2017, 2019 Joel Sing <jsing@openbsd.org>
4 * Copyright (c) 2017 Doug Hogan <doug@openbsd.org> 4 * Copyright (c) 2017 Doug Hogan <doug@openbsd.org>
@@ -556,19 +556,16 @@ tlsext_sigalgs_client_build(SSL *s, CBB *cbb)
556int 556int
557tlsext_sigalgs_server_parse(SSL *s, CBS *cbs, int *alert) 557tlsext_sigalgs_server_parse(SSL *s, CBS *cbs, int *alert)
558{ 558{
559 uint16_t *tls_sigalgs = tls12_sigalgs;
560 size_t tls_sigalgs_len = tls12_sigalgs_len;
561 CBS sigalgs; 559 CBS sigalgs;
562 560
563 if (s->version >= TLS1_3_VERSION) {
564 tls_sigalgs = tls13_sigalgs;
565 tls_sigalgs_len = tls13_sigalgs_len;
566 }
567
568 if (!CBS_get_u16_length_prefixed(cbs, &sigalgs)) 561 if (!CBS_get_u16_length_prefixed(cbs, &sigalgs))
569 return 0; 562 return 0;
563 if (CBS_len(&sigalgs) % 2 != 0 || CBS_len(&sigalgs) > 64)
564 return 0;
565 if (!CBS_stow(&sigalgs, &S3I(s)->hs.sigalgs, &S3I(s)->hs.sigalgs_len))
566 return 0;
570 567
571 return tls1_process_sigalgs(s, &sigalgs, tls_sigalgs, tls_sigalgs_len); 568 return 1;
572} 569}
573 570
574int 571int
diff --git a/src/lib/libssl/tls13_client.c b/src/lib/libssl/tls13_client.c
index 56faf3f5d4..5b4ecdb47d 100644
--- a/src/lib/libssl/tls13_client.c
+++ b/src/lib/libssl/tls13_client.c
@@ -1,4 +1,4 @@
1/* $OpenBSD: tls13_client.c,v 1.13 2019/02/28 17:51:19 jsing Exp $ */ 1/* $OpenBSD: tls13_client.c,v 1.14 2019/03/25 17:21:18 jsing Exp $ */
2/* 2/*
3 * Copyright (c) 2018, 2019 Joel Sing <jsing@openbsd.org> 3 * Copyright (c) 2018, 2019 Joel Sing <jsing@openbsd.org>
4 * 4 *
@@ -527,7 +527,7 @@ tls13_server_certificate_verify_recv(struct tls13_ctx *ctx)
527 goto err; 527 goto err;
528 if ((pkey = X509_get0_pubkey(cert)) == NULL) 528 if ((pkey = X509_get0_pubkey(cert)) == NULL)
529 goto err; 529 goto err;
530 if (!ssl_sigalg_pkey_ok(sigalg, pkey)) 530 if (!ssl_sigalg_pkey_ok(sigalg, pkey, 1))
531 goto err; 531 goto err;
532 532
533 if (CBS_len(&signature) > EVP_PKEY_size(pkey)) 533 if (CBS_len(&signature) > EVP_PKEY_size(pkey))