xref: /dflybsd-src/crypto/libressl/ssl/ssl_sigalgs.c (revision 961e30ea7dc61d1112b778ea4981eac68129fb86)
1*de0e0e4dSAntonio Huete Jimenez /* $OpenBSD: ssl_sigalgs.c,v 1.47 2022/07/02 16:31:04 tb Exp $ */
272c33676SMaxim Ag /*
38edacedfSDaniel Fojt  * Copyright (c) 2018-2020 Bob Beck <beck@openbsd.org>
4*de0e0e4dSAntonio Huete Jimenez  * Copyright (c) 2021 Joel Sing <jsing@openbsd.org>
572c33676SMaxim Ag  *
672c33676SMaxim Ag  * Permission to use, copy, modify, and/or distribute this software for any
772c33676SMaxim Ag  * purpose with or without fee is hereby granted, provided that the above
872c33676SMaxim Ag  * copyright notice and this permission notice appear in all copies.
972c33676SMaxim Ag  *
1072c33676SMaxim Ag  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
1172c33676SMaxim Ag  * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
1272c33676SMaxim Ag  * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
1372c33676SMaxim Ag  * SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
1472c33676SMaxim Ag  * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION
1572c33676SMaxim Ag  * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
1672c33676SMaxim Ag  * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
1772c33676SMaxim Ag  */
18*de0e0e4dSAntonio Huete Jimenez 
1972c33676SMaxim Ag #include <string.h>
2072c33676SMaxim Ag #include <stdlib.h>
2172c33676SMaxim Ag 
2272c33676SMaxim Ag #include <openssl/evp.h>
23*de0e0e4dSAntonio Huete Jimenez #include <openssl/opensslconf.h>
2472c33676SMaxim Ag 
2572c33676SMaxim Ag #include "bytestring.h"
2672c33676SMaxim Ag #include "ssl_locl.h"
2772c33676SMaxim Ag #include "ssl_sigalgs.h"
2872c33676SMaxim Ag #include "tls13_internal.h"
2972c33676SMaxim Ag 
3072c33676SMaxim Ag const struct ssl_sigalg sigalgs[] = {
3172c33676SMaxim Ag 	{
3272c33676SMaxim Ag 		.value = SIGALG_RSA_PKCS1_SHA512,
3372c33676SMaxim Ag 		.key_type = EVP_PKEY_RSA,
34*de0e0e4dSAntonio Huete Jimenez 		.md = EVP_sha512,
35*de0e0e4dSAntonio Huete Jimenez 		.security_level = 5,
3672c33676SMaxim Ag 	},
3772c33676SMaxim Ag 	{
3872c33676SMaxim Ag 		.value = SIGALG_ECDSA_SECP521R1_SHA512,
3972c33676SMaxim Ag 		.key_type = EVP_PKEY_EC,
40*de0e0e4dSAntonio Huete Jimenez 		.md = EVP_sha512,
41*de0e0e4dSAntonio Huete Jimenez 		.security_level = 5,
42*de0e0e4dSAntonio Huete Jimenez 		.group_nid = NID_secp521r1,
4372c33676SMaxim Ag 	},
4472c33676SMaxim Ag #ifndef OPENSSL_NO_GOST
4572c33676SMaxim Ag 	{
4672c33676SMaxim Ag 		.value = SIGALG_GOSTR12_512_STREEBOG_512,
4772c33676SMaxim Ag 		.key_type = EVP_PKEY_GOSTR12_512,
48*de0e0e4dSAntonio Huete Jimenez 		.md = EVP_streebog512,
49*de0e0e4dSAntonio Huete Jimenez 		.security_level = 0,
5072c33676SMaxim Ag 	},
5172c33676SMaxim Ag #endif
5272c33676SMaxim Ag 	{
5372c33676SMaxim Ag 		.value = SIGALG_RSA_PKCS1_SHA384,
5472c33676SMaxim Ag 		.key_type = EVP_PKEY_RSA,
55*de0e0e4dSAntonio Huete Jimenez 		.md = EVP_sha384,
56*de0e0e4dSAntonio Huete Jimenez 		.security_level = 4,
5772c33676SMaxim Ag 	},
5872c33676SMaxim Ag 	{
5972c33676SMaxim Ag 		.value = SIGALG_ECDSA_SECP384R1_SHA384,
6072c33676SMaxim Ag 		.key_type = EVP_PKEY_EC,
61*de0e0e4dSAntonio Huete Jimenez 		.md = EVP_sha384,
62*de0e0e4dSAntonio Huete Jimenez 		.security_level = 4,
63*de0e0e4dSAntonio Huete Jimenez 		.group_nid = NID_secp384r1,
6472c33676SMaxim Ag 	},
6572c33676SMaxim Ag 	{
6672c33676SMaxim Ag 		.value = SIGALG_RSA_PKCS1_SHA256,
6772c33676SMaxim Ag 		.key_type = EVP_PKEY_RSA,
68*de0e0e4dSAntonio Huete Jimenez 		.md = EVP_sha256,
69*de0e0e4dSAntonio Huete Jimenez 		.security_level = 3,
7072c33676SMaxim Ag 	},
7172c33676SMaxim Ag 	{
7272c33676SMaxim Ag 		.value = SIGALG_ECDSA_SECP256R1_SHA256,
7372c33676SMaxim Ag 		.key_type = EVP_PKEY_EC,
74*de0e0e4dSAntonio Huete Jimenez 		.md = EVP_sha256,
75*de0e0e4dSAntonio Huete Jimenez 		.security_level = 3,
76*de0e0e4dSAntonio Huete Jimenez 		.group_nid = NID_X9_62_prime256v1,
7772c33676SMaxim Ag 	},
7872c33676SMaxim Ag #ifndef OPENSSL_NO_GOST
7972c33676SMaxim Ag 	{
8072c33676SMaxim Ag 		.value = SIGALG_GOSTR12_256_STREEBOG_256,
8172c33676SMaxim Ag 		.key_type = EVP_PKEY_GOSTR12_256,
82*de0e0e4dSAntonio Huete Jimenez 		.md = EVP_streebog256,
83*de0e0e4dSAntonio Huete Jimenez 		.security_level = 0,
8472c33676SMaxim Ag 	},
8572c33676SMaxim Ag 	{
8672c33676SMaxim Ag 		.value = SIGALG_GOSTR01_GOST94,
8772c33676SMaxim Ag 		.key_type = EVP_PKEY_GOSTR01,
88*de0e0e4dSAntonio Huete Jimenez 		.md = EVP_gostr341194,
89*de0e0e4dSAntonio Huete Jimenez 		.security_level = 0, /* XXX */
9072c33676SMaxim Ag 	},
9172c33676SMaxim Ag #endif
9272c33676SMaxim Ag 	{
9372c33676SMaxim Ag 		.value = SIGALG_RSA_PSS_RSAE_SHA256,
9472c33676SMaxim Ag 		.key_type = EVP_PKEY_RSA,
95*de0e0e4dSAntonio Huete Jimenez 		.md = EVP_sha256,
96*de0e0e4dSAntonio Huete Jimenez 		.security_level = 3,
9772c33676SMaxim Ag 		.flags = SIGALG_FLAG_RSA_PSS,
9872c33676SMaxim Ag 	},
9972c33676SMaxim Ag 	{
10072c33676SMaxim Ag 		.value = SIGALG_RSA_PSS_RSAE_SHA384,
10172c33676SMaxim Ag 		.key_type = EVP_PKEY_RSA,
102*de0e0e4dSAntonio Huete Jimenez 		.md = EVP_sha384,
103*de0e0e4dSAntonio Huete Jimenez 		.security_level = 4,
10472c33676SMaxim Ag 		.flags = SIGALG_FLAG_RSA_PSS,
10572c33676SMaxim Ag 	},
10672c33676SMaxim Ag 	{
10772c33676SMaxim Ag 		.value = SIGALG_RSA_PSS_RSAE_SHA512,
10872c33676SMaxim Ag 		.key_type = EVP_PKEY_RSA,
109*de0e0e4dSAntonio Huete Jimenez 		.md = EVP_sha512,
110*de0e0e4dSAntonio Huete Jimenez 		.security_level = 5,
11172c33676SMaxim Ag 		.flags = SIGALG_FLAG_RSA_PSS,
11272c33676SMaxim Ag 	},
11372c33676SMaxim Ag 	{
11472c33676SMaxim Ag 		.value = SIGALG_RSA_PSS_PSS_SHA256,
11572c33676SMaxim Ag 		.key_type = EVP_PKEY_RSA,
116*de0e0e4dSAntonio Huete Jimenez 		.md = EVP_sha256,
117*de0e0e4dSAntonio Huete Jimenez 		.security_level = 3,
11872c33676SMaxim Ag 		.flags = SIGALG_FLAG_RSA_PSS,
11972c33676SMaxim Ag 	},
12072c33676SMaxim Ag 	{
12172c33676SMaxim Ag 		.value = SIGALG_RSA_PSS_PSS_SHA384,
12272c33676SMaxim Ag 		.key_type = EVP_PKEY_RSA,
123*de0e0e4dSAntonio Huete Jimenez 		.md = EVP_sha384,
124*de0e0e4dSAntonio Huete Jimenez 		.security_level = 4,
12572c33676SMaxim Ag 		.flags = SIGALG_FLAG_RSA_PSS,
12672c33676SMaxim Ag 	},
12772c33676SMaxim Ag 	{
12872c33676SMaxim Ag 		.value = SIGALG_RSA_PSS_PSS_SHA512,
12972c33676SMaxim Ag 		.key_type = EVP_PKEY_RSA,
130*de0e0e4dSAntonio Huete Jimenez 		.md = EVP_sha512,
131*de0e0e4dSAntonio Huete Jimenez 		.security_level = 5,
13272c33676SMaxim Ag 		.flags = SIGALG_FLAG_RSA_PSS,
13372c33676SMaxim Ag 	},
13472c33676SMaxim Ag 	{
13572c33676SMaxim Ag 		.value = SIGALG_RSA_PKCS1_SHA224,
13672c33676SMaxim Ag 		.key_type = EVP_PKEY_RSA,
137*de0e0e4dSAntonio Huete Jimenez 		.md = EVP_sha224,
138*de0e0e4dSAntonio Huete Jimenez 		.security_level = 2,
13972c33676SMaxim Ag 	},
14072c33676SMaxim Ag 	{
14172c33676SMaxim Ag 		.value = SIGALG_ECDSA_SECP224R1_SHA224,
14272c33676SMaxim Ag 		.key_type = EVP_PKEY_EC,
143*de0e0e4dSAntonio Huete Jimenez 		.md = EVP_sha224,
144*de0e0e4dSAntonio Huete Jimenez 		.security_level = 2,
14572c33676SMaxim Ag 	},
14672c33676SMaxim Ag 	{
14772c33676SMaxim Ag 		.value = SIGALG_RSA_PKCS1_SHA1,
14872c33676SMaxim Ag 		.key_type = EVP_PKEY_RSA,
14972c33676SMaxim Ag 		.md = EVP_sha1,
150*de0e0e4dSAntonio Huete Jimenez 		.security_level = 1,
15172c33676SMaxim Ag 	},
15272c33676SMaxim Ag 	{
15372c33676SMaxim Ag 		.value = SIGALG_ECDSA_SHA1,
15472c33676SMaxim Ag 		.key_type = EVP_PKEY_EC,
15572c33676SMaxim Ag 		.md = EVP_sha1,
156*de0e0e4dSAntonio Huete Jimenez 		.security_level = 1,
15772c33676SMaxim Ag 	},
15872c33676SMaxim Ag 	{
15972c33676SMaxim Ag 		.value = SIGALG_RSA_PKCS1_MD5_SHA1,
16072c33676SMaxim Ag 		.key_type = EVP_PKEY_RSA,
16172c33676SMaxim Ag 		.md = EVP_md5_sha1,
162*de0e0e4dSAntonio Huete Jimenez 		.security_level = 1,
16372c33676SMaxim Ag 	},
16472c33676SMaxim Ag 	{
16572c33676SMaxim Ag 		.value = SIGALG_NONE,
16672c33676SMaxim Ag 	},
16772c33676SMaxim Ag };
16872c33676SMaxim Ag 
169*de0e0e4dSAntonio Huete Jimenez /* Sigalgs for TLSv1.3, in preference order. */
170*de0e0e4dSAntonio Huete Jimenez const uint16_t tls13_sigalgs[] = {
17172c33676SMaxim Ag 	SIGALG_RSA_PSS_RSAE_SHA512,
17272c33676SMaxim Ag 	SIGALG_RSA_PKCS1_SHA512,
17372c33676SMaxim Ag 	SIGALG_ECDSA_SECP521R1_SHA512,
17472c33676SMaxim Ag 	SIGALG_RSA_PSS_RSAE_SHA384,
17572c33676SMaxim Ag 	SIGALG_RSA_PKCS1_SHA384,
17672c33676SMaxim Ag 	SIGALG_ECDSA_SECP384R1_SHA384,
17772c33676SMaxim Ag 	SIGALG_RSA_PSS_RSAE_SHA256,
17872c33676SMaxim Ag 	SIGALG_RSA_PKCS1_SHA256,
17972c33676SMaxim Ag 	SIGALG_ECDSA_SECP256R1_SHA256,
18072c33676SMaxim Ag };
181*de0e0e4dSAntonio Huete Jimenez const size_t tls13_sigalgs_len = (sizeof(tls13_sigalgs) / sizeof(tls13_sigalgs[0]));
18272c33676SMaxim Ag 
183*de0e0e4dSAntonio Huete Jimenez /* Sigalgs for TLSv1.2, in preference order. */
184*de0e0e4dSAntonio Huete Jimenez const uint16_t tls12_sigalgs[] = {
18572c33676SMaxim Ag 	SIGALG_RSA_PSS_RSAE_SHA512,
18672c33676SMaxim Ag 	SIGALG_RSA_PKCS1_SHA512,
18772c33676SMaxim Ag 	SIGALG_ECDSA_SECP521R1_SHA512,
18872c33676SMaxim Ag 	SIGALG_RSA_PSS_RSAE_SHA384,
18972c33676SMaxim Ag 	SIGALG_RSA_PKCS1_SHA384,
19072c33676SMaxim Ag 	SIGALG_ECDSA_SECP384R1_SHA384,
19172c33676SMaxim Ag 	SIGALG_RSA_PSS_RSAE_SHA256,
19272c33676SMaxim Ag 	SIGALG_RSA_PKCS1_SHA256,
19372c33676SMaxim Ag 	SIGALG_ECDSA_SECP256R1_SHA256,
19472c33676SMaxim Ag 	SIGALG_RSA_PKCS1_SHA1, /* XXX */
19572c33676SMaxim Ag 	SIGALG_ECDSA_SHA1,     /* XXX */
19672c33676SMaxim Ag };
197*de0e0e4dSAntonio Huete Jimenez const size_t tls12_sigalgs_len = (sizeof(tls12_sigalgs) / sizeof(tls12_sigalgs[0]));
19872c33676SMaxim Ag 
199*de0e0e4dSAntonio Huete Jimenez static void
ssl_sigalgs_for_version(uint16_t tls_version,const uint16_t ** out_values,size_t * out_len)200*de0e0e4dSAntonio Huete Jimenez ssl_sigalgs_for_version(uint16_t tls_version, const uint16_t **out_values,
201*de0e0e4dSAntonio Huete Jimenez     size_t *out_len)
202*de0e0e4dSAntonio Huete Jimenez {
203*de0e0e4dSAntonio Huete Jimenez 	if (tls_version >= TLS1_3_VERSION) {
204*de0e0e4dSAntonio Huete Jimenez 		*out_values = tls13_sigalgs;
205*de0e0e4dSAntonio Huete Jimenez 		*out_len = tls13_sigalgs_len;
206*de0e0e4dSAntonio Huete Jimenez 	} else {
207*de0e0e4dSAntonio Huete Jimenez 		*out_values = tls12_sigalgs;
208*de0e0e4dSAntonio Huete Jimenez 		*out_len = tls12_sigalgs_len;
209*de0e0e4dSAntonio Huete Jimenez 	}
210*de0e0e4dSAntonio Huete Jimenez }
211*de0e0e4dSAntonio Huete Jimenez 
212*de0e0e4dSAntonio Huete Jimenez static const struct ssl_sigalg *
ssl_sigalg_lookup(uint16_t value)213*de0e0e4dSAntonio Huete Jimenez ssl_sigalg_lookup(uint16_t value)
21472c33676SMaxim Ag {
21572c33676SMaxim Ag 	int i;
21672c33676SMaxim Ag 
21772c33676SMaxim Ag 	for (i = 0; sigalgs[i].value != SIGALG_NONE; i++) {
218*de0e0e4dSAntonio Huete Jimenez 		if (sigalgs[i].value == value)
21972c33676SMaxim Ag 			return &sigalgs[i];
22072c33676SMaxim Ag 	}
22172c33676SMaxim Ag 
22272c33676SMaxim Ag 	return NULL;
22372c33676SMaxim Ag }
22472c33676SMaxim Ag 
225*de0e0e4dSAntonio Huete Jimenez static const struct ssl_sigalg *
ssl_sigalg_from_value(SSL * s,uint16_t value)226*de0e0e4dSAntonio Huete Jimenez ssl_sigalg_from_value(SSL *s, uint16_t value)
22772c33676SMaxim Ag {
228*de0e0e4dSAntonio Huete Jimenez 	const uint16_t *values;
229*de0e0e4dSAntonio Huete Jimenez 	size_t len;
23072c33676SMaxim Ag 	int i;
23172c33676SMaxim Ag 
232*de0e0e4dSAntonio Huete Jimenez 	ssl_sigalgs_for_version(s->s3->hs.negotiated_tls_version,
233*de0e0e4dSAntonio Huete Jimenez 	    &values, &len);
234*de0e0e4dSAntonio Huete Jimenez 
23572c33676SMaxim Ag 	for (i = 0; i < len; i++) {
236*de0e0e4dSAntonio Huete Jimenez 		if (values[i] == value)
237*de0e0e4dSAntonio Huete Jimenez 			return ssl_sigalg_lookup(value);
23872c33676SMaxim Ag 	}
23972c33676SMaxim Ag 
24072c33676SMaxim Ag 	return NULL;
24172c33676SMaxim Ag }
24272c33676SMaxim Ag 
24372c33676SMaxim Ag int
ssl_sigalgs_build(uint16_t tls_version,CBB * cbb,int security_level)244*de0e0e4dSAntonio Huete Jimenez ssl_sigalgs_build(uint16_t tls_version, CBB *cbb, int security_level)
24572c33676SMaxim Ag {
246*de0e0e4dSAntonio Huete Jimenez 	const struct ssl_sigalg *sigalg;
247*de0e0e4dSAntonio Huete Jimenez 	const uint16_t *values;
248*de0e0e4dSAntonio Huete Jimenez 	size_t len;
24972c33676SMaxim Ag 	size_t i;
250*de0e0e4dSAntonio Huete Jimenez 	int ret = 0;
25172c33676SMaxim Ag 
252*de0e0e4dSAntonio Huete Jimenez 	ssl_sigalgs_for_version(tls_version, &values, &len);
25372c33676SMaxim Ag 
25472c33676SMaxim Ag 	/* Add values in order as long as they are supported. */
25572c33676SMaxim Ag 	for (i = 0; i < len; i++) {
256*de0e0e4dSAntonio Huete Jimenez 		/* Do not allow the legacy value for < 1.2 to be used. */
25772c33676SMaxim Ag 		if (values[i] == SIGALG_RSA_PKCS1_MD5_SHA1)
25872c33676SMaxim Ag 			return 0;
259*de0e0e4dSAntonio Huete Jimenez 		if ((sigalg = ssl_sigalg_lookup(values[i])) == NULL)
260*de0e0e4dSAntonio Huete Jimenez 			return 0;
261*de0e0e4dSAntonio Huete Jimenez 		if (sigalg->security_level < security_level)
262*de0e0e4dSAntonio Huete Jimenez 			continue;
26372c33676SMaxim Ag 
26472c33676SMaxim Ag 		if (!CBB_add_u16(cbb, values[i]))
26572c33676SMaxim Ag 			return 0;
266*de0e0e4dSAntonio Huete Jimenez 
267*de0e0e4dSAntonio Huete Jimenez 		ret = 1;
26872c33676SMaxim Ag 	}
269*de0e0e4dSAntonio Huete Jimenez 	return ret;
27072c33676SMaxim Ag }
27172c33676SMaxim Ag 
272*de0e0e4dSAntonio Huete Jimenez static const struct ssl_sigalg *
ssl_sigalg_for_legacy(SSL * s,EVP_PKEY * pkey)273*de0e0e4dSAntonio Huete Jimenez ssl_sigalg_for_legacy(SSL *s, EVP_PKEY *pkey)
27472c33676SMaxim Ag {
275*de0e0e4dSAntonio Huete Jimenez 	if (SSL_get_security_level(s) > 1)
276*de0e0e4dSAntonio Huete Jimenez 		return NULL;
27772c33676SMaxim Ag 
278*de0e0e4dSAntonio Huete Jimenez 	/* Default signature algorithms used for TLSv1.2 and earlier. */
279*de0e0e4dSAntonio Huete Jimenez 	switch (EVP_PKEY_id(pkey)) {
28072c33676SMaxim Ag 	case EVP_PKEY_RSA:
281*de0e0e4dSAntonio Huete Jimenez 		if (s->s3->hs.negotiated_tls_version < TLS1_2_VERSION)
28272c33676SMaxim Ag 			return ssl_sigalg_lookup(SIGALG_RSA_PKCS1_MD5_SHA1);
28372c33676SMaxim Ag 		return ssl_sigalg_lookup(SIGALG_RSA_PKCS1_SHA1);
28472c33676SMaxim Ag 	case EVP_PKEY_EC:
28572c33676SMaxim Ag 		return ssl_sigalg_lookup(SIGALG_ECDSA_SHA1);
28672c33676SMaxim Ag #ifndef OPENSSL_NO_GOST
28772c33676SMaxim Ag 	case EVP_PKEY_GOSTR01:
28872c33676SMaxim Ag 		return ssl_sigalg_lookup(SIGALG_GOSTR01_GOST94);
28972c33676SMaxim Ag #endif
29072c33676SMaxim Ag 	}
29172c33676SMaxim Ag 	SSLerror(s, SSL_R_UNKNOWN_PKEY_TYPE);
292*de0e0e4dSAntonio Huete Jimenez 	return NULL;
29372c33676SMaxim Ag }
29472c33676SMaxim Ag 
295*de0e0e4dSAntonio Huete Jimenez static int
ssl_sigalg_pkey_ok(SSL * s,const struct ssl_sigalg * sigalg,EVP_PKEY * pkey)296*de0e0e4dSAntonio Huete Jimenez ssl_sigalg_pkey_ok(SSL *s, const struct ssl_sigalg *sigalg, EVP_PKEY *pkey)
297*de0e0e4dSAntonio Huete Jimenez {
298*de0e0e4dSAntonio Huete Jimenez 	if (sigalg == NULL || pkey == NULL)
299*de0e0e4dSAntonio Huete Jimenez 		return 0;
300*de0e0e4dSAntonio Huete Jimenez 	if (sigalg->key_type != EVP_PKEY_id(pkey))
301*de0e0e4dSAntonio Huete Jimenez 		return 0;
302*de0e0e4dSAntonio Huete Jimenez 
303*de0e0e4dSAntonio Huete Jimenez 	/* RSA PSS must have a sufficiently large RSA key. */
304*de0e0e4dSAntonio Huete Jimenez 	if ((sigalg->flags & SIGALG_FLAG_RSA_PSS)) {
305*de0e0e4dSAntonio Huete Jimenez 		if (EVP_PKEY_id(pkey) != EVP_PKEY_RSA ||
306*de0e0e4dSAntonio Huete Jimenez 		    EVP_PKEY_size(pkey) < (2 * EVP_MD_size(sigalg->md()) + 2))
307*de0e0e4dSAntonio Huete Jimenez 			return 0;
308*de0e0e4dSAntonio Huete Jimenez 	}
309*de0e0e4dSAntonio Huete Jimenez 
310*de0e0e4dSAntonio Huete Jimenez 	if (!ssl_security_sigalg_check(s, pkey))
311*de0e0e4dSAntonio Huete Jimenez 		return 0;
312*de0e0e4dSAntonio Huete Jimenez 
313*de0e0e4dSAntonio Huete Jimenez 	if (s->s3->hs.negotiated_tls_version < TLS1_3_VERSION)
314*de0e0e4dSAntonio Huete Jimenez 		return 1;
315*de0e0e4dSAntonio Huete Jimenez 
316*de0e0e4dSAntonio Huete Jimenez 	/* RSA cannot be used without PSS in TLSv1.3. */
317*de0e0e4dSAntonio Huete Jimenez 	if (sigalg->key_type == EVP_PKEY_RSA &&
318*de0e0e4dSAntonio Huete Jimenez 	    (sigalg->flags & SIGALG_FLAG_RSA_PSS) == 0)
319*de0e0e4dSAntonio Huete Jimenez 		return 0;
320*de0e0e4dSAntonio Huete Jimenez 
321*de0e0e4dSAntonio Huete Jimenez 	/* Ensure that group matches for EC keys. */
322*de0e0e4dSAntonio Huete Jimenez 	if (EVP_PKEY_id(pkey) == EVP_PKEY_EC) {
323*de0e0e4dSAntonio Huete Jimenez 		if (sigalg->group_nid == 0)
324*de0e0e4dSAntonio Huete Jimenez 			return 0;
325*de0e0e4dSAntonio Huete Jimenez 		if (EC_GROUP_get_curve_name(EC_KEY_get0_group(
326*de0e0e4dSAntonio Huete Jimenez 		    EVP_PKEY_get0_EC_KEY(pkey))) != sigalg->group_nid)
327*de0e0e4dSAntonio Huete Jimenez 			return 0;
328*de0e0e4dSAntonio Huete Jimenez 	}
329*de0e0e4dSAntonio Huete Jimenez 
330*de0e0e4dSAntonio Huete Jimenez 	return 1;
331*de0e0e4dSAntonio Huete Jimenez }
332*de0e0e4dSAntonio Huete Jimenez 
333*de0e0e4dSAntonio Huete Jimenez const struct ssl_sigalg *
ssl_sigalg_select(SSL * s,EVP_PKEY * pkey)334*de0e0e4dSAntonio Huete Jimenez ssl_sigalg_select(SSL *s, EVP_PKEY *pkey)
335*de0e0e4dSAntonio Huete Jimenez {
336*de0e0e4dSAntonio Huete Jimenez 	CBS cbs;
337*de0e0e4dSAntonio Huete Jimenez 
338*de0e0e4dSAntonio Huete Jimenez 	if (!SSL_USE_SIGALGS(s))
339*de0e0e4dSAntonio Huete Jimenez 		return ssl_sigalg_for_legacy(s, pkey);
340*de0e0e4dSAntonio Huete Jimenez 
341*de0e0e4dSAntonio Huete Jimenez 	/*
342*de0e0e4dSAntonio Huete Jimenez 	 * RFC 5246 allows a TLS 1.2 client to send no sigalgs extension,
343*de0e0e4dSAntonio Huete Jimenez 	 * in which case the server must use the default.
344*de0e0e4dSAntonio Huete Jimenez 	 */
345*de0e0e4dSAntonio Huete Jimenez 	if (s->s3->hs.negotiated_tls_version < TLS1_3_VERSION &&
346*de0e0e4dSAntonio Huete Jimenez 	    s->s3->hs.sigalgs == NULL)
347*de0e0e4dSAntonio Huete Jimenez 		return ssl_sigalg_for_legacy(s, pkey);
348*de0e0e4dSAntonio Huete Jimenez 
34972c33676SMaxim Ag 	/*
35072c33676SMaxim Ag 	 * If we get here, we have client or server sent sigalgs, use one.
35172c33676SMaxim Ag 	 */
352*de0e0e4dSAntonio Huete Jimenez 	CBS_init(&cbs, s->s3->hs.sigalgs, s->s3->hs.sigalgs_len);
35372c33676SMaxim Ag 	while (CBS_len(&cbs) > 0) {
35472c33676SMaxim Ag 		const struct ssl_sigalg *sigalg;
355*de0e0e4dSAntonio Huete Jimenez 		uint16_t sigalg_value;
35672c33676SMaxim Ag 
357*de0e0e4dSAntonio Huete Jimenez 		if (!CBS_get_u16(&cbs, &sigalg_value))
358*de0e0e4dSAntonio Huete Jimenez 			return NULL;
35972c33676SMaxim Ag 
360*de0e0e4dSAntonio Huete Jimenez 		if ((sigalg = ssl_sigalg_from_value(s, sigalg_value)) == NULL)
36172c33676SMaxim Ag 			continue;
362*de0e0e4dSAntonio Huete Jimenez 		if (ssl_sigalg_pkey_ok(s, sigalg, pkey))
36372c33676SMaxim Ag 			return sigalg;
36472c33676SMaxim Ag 	}
36572c33676SMaxim Ag 
36672c33676SMaxim Ag 	SSLerror(s, SSL_R_UNKNOWN_PKEY_TYPE);
36772c33676SMaxim Ag 	return NULL;
36872c33676SMaxim Ag }
369*de0e0e4dSAntonio Huete Jimenez 
370*de0e0e4dSAntonio Huete Jimenez const struct ssl_sigalg *
ssl_sigalg_for_peer(SSL * s,EVP_PKEY * pkey,uint16_t sigalg_value)371*de0e0e4dSAntonio Huete Jimenez ssl_sigalg_for_peer(SSL *s, EVP_PKEY *pkey, uint16_t sigalg_value)
372*de0e0e4dSAntonio Huete Jimenez {
373*de0e0e4dSAntonio Huete Jimenez 	const struct ssl_sigalg *sigalg;
374*de0e0e4dSAntonio Huete Jimenez 
375*de0e0e4dSAntonio Huete Jimenez 	if (!SSL_USE_SIGALGS(s))
376*de0e0e4dSAntonio Huete Jimenez 		return ssl_sigalg_for_legacy(s, pkey);
377*de0e0e4dSAntonio Huete Jimenez 
378*de0e0e4dSAntonio Huete Jimenez 	if ((sigalg = ssl_sigalg_from_value(s, sigalg_value)) == NULL) {
379*de0e0e4dSAntonio Huete Jimenez 		SSLerror(s, SSL_R_UNKNOWN_DIGEST);
380*de0e0e4dSAntonio Huete Jimenez 		return NULL;
381*de0e0e4dSAntonio Huete Jimenez 	}
382*de0e0e4dSAntonio Huete Jimenez 	if (!ssl_sigalg_pkey_ok(s, sigalg, pkey)) {
383*de0e0e4dSAntonio Huete Jimenez 		SSLerror(s, SSL_R_WRONG_SIGNATURE_TYPE);
384*de0e0e4dSAntonio Huete Jimenez 		return NULL;
385*de0e0e4dSAntonio Huete Jimenez 	}
386*de0e0e4dSAntonio Huete Jimenez 
387*de0e0e4dSAntonio Huete Jimenez 	return sigalg;
388*de0e0e4dSAntonio Huete Jimenez }
389