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 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 * 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 * 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 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 * 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 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 * 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 * 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