1e1051a39Sopenharmony_ci/* 2e1051a39Sopenharmony_ci * Copyright 1995-2023 The OpenSSL Project Authors. All Rights Reserved. 3e1051a39Sopenharmony_ci * 4e1051a39Sopenharmony_ci * Licensed under the Apache License 2.0 (the "License"). You may not use 5e1051a39Sopenharmony_ci * this file except in compliance with the License. You can obtain a copy 6e1051a39Sopenharmony_ci * in the file LICENSE in the source distribution or at 7e1051a39Sopenharmony_ci * https://www.openssl.org/source/license.html 8e1051a39Sopenharmony_ci */ 9e1051a39Sopenharmony_ci 10e1051a39Sopenharmony_ci#include <stdio.h> 11e1051a39Sopenharmony_ci#include <stdlib.h> 12e1051a39Sopenharmony_ci#include <openssl/objects.h> 13e1051a39Sopenharmony_ci#include <openssl/evp.h> 14e1051a39Sopenharmony_ci#include <openssl/hmac.h> 15e1051a39Sopenharmony_ci#include <openssl/core_names.h> 16e1051a39Sopenharmony_ci#include <openssl/ocsp.h> 17e1051a39Sopenharmony_ci#include <openssl/conf.h> 18e1051a39Sopenharmony_ci#include <openssl/x509v3.h> 19e1051a39Sopenharmony_ci#include <openssl/dh.h> 20e1051a39Sopenharmony_ci#include <openssl/bn.h> 21e1051a39Sopenharmony_ci#include <openssl/provider.h> 22e1051a39Sopenharmony_ci#include <openssl/param_build.h> 23e1051a39Sopenharmony_ci#include "internal/nelem.h" 24e1051a39Sopenharmony_ci#include "internal/sizes.h" 25e1051a39Sopenharmony_ci#include "internal/tlsgroups.h" 26e1051a39Sopenharmony_ci#include "ssl_local.h" 27e1051a39Sopenharmony_ci#include <openssl/ct.h> 28e1051a39Sopenharmony_ci 29e1051a39Sopenharmony_cistatic const SIGALG_LOOKUP *find_sig_alg(SSL *s, X509 *x, EVP_PKEY *pkey); 30e1051a39Sopenharmony_cistatic int tls12_sigalg_allowed(const SSL *s, int op, const SIGALG_LOOKUP *lu); 31e1051a39Sopenharmony_ci 32e1051a39Sopenharmony_ciSSL3_ENC_METHOD const TLSv1_enc_data = { 33e1051a39Sopenharmony_ci tls1_enc, 34e1051a39Sopenharmony_ci tls1_mac, 35e1051a39Sopenharmony_ci tls1_setup_key_block, 36e1051a39Sopenharmony_ci tls1_generate_master_secret, 37e1051a39Sopenharmony_ci tls1_change_cipher_state, 38e1051a39Sopenharmony_ci tls1_final_finish_mac, 39e1051a39Sopenharmony_ci TLS_MD_CLIENT_FINISH_CONST, TLS_MD_CLIENT_FINISH_CONST_SIZE, 40e1051a39Sopenharmony_ci TLS_MD_SERVER_FINISH_CONST, TLS_MD_SERVER_FINISH_CONST_SIZE, 41e1051a39Sopenharmony_ci tls1_alert_code, 42e1051a39Sopenharmony_ci tls1_export_keying_material, 43e1051a39Sopenharmony_ci 0, 44e1051a39Sopenharmony_ci ssl3_set_handshake_header, 45e1051a39Sopenharmony_ci tls_close_construct_packet, 46e1051a39Sopenharmony_ci ssl3_handshake_write 47e1051a39Sopenharmony_ci}; 48e1051a39Sopenharmony_ci 49e1051a39Sopenharmony_ciSSL3_ENC_METHOD const TLSv1_1_enc_data = { 50e1051a39Sopenharmony_ci tls1_enc, 51e1051a39Sopenharmony_ci tls1_mac, 52e1051a39Sopenharmony_ci tls1_setup_key_block, 53e1051a39Sopenharmony_ci tls1_generate_master_secret, 54e1051a39Sopenharmony_ci tls1_change_cipher_state, 55e1051a39Sopenharmony_ci tls1_final_finish_mac, 56e1051a39Sopenharmony_ci TLS_MD_CLIENT_FINISH_CONST, TLS_MD_CLIENT_FINISH_CONST_SIZE, 57e1051a39Sopenharmony_ci TLS_MD_SERVER_FINISH_CONST, TLS_MD_SERVER_FINISH_CONST_SIZE, 58e1051a39Sopenharmony_ci tls1_alert_code, 59e1051a39Sopenharmony_ci tls1_export_keying_material, 60e1051a39Sopenharmony_ci SSL_ENC_FLAG_EXPLICIT_IV, 61e1051a39Sopenharmony_ci ssl3_set_handshake_header, 62e1051a39Sopenharmony_ci tls_close_construct_packet, 63e1051a39Sopenharmony_ci ssl3_handshake_write 64e1051a39Sopenharmony_ci}; 65e1051a39Sopenharmony_ci 66e1051a39Sopenharmony_ciSSL3_ENC_METHOD const TLSv1_2_enc_data = { 67e1051a39Sopenharmony_ci tls1_enc, 68e1051a39Sopenharmony_ci tls1_mac, 69e1051a39Sopenharmony_ci tls1_setup_key_block, 70e1051a39Sopenharmony_ci tls1_generate_master_secret, 71e1051a39Sopenharmony_ci tls1_change_cipher_state, 72e1051a39Sopenharmony_ci tls1_final_finish_mac, 73e1051a39Sopenharmony_ci TLS_MD_CLIENT_FINISH_CONST, TLS_MD_CLIENT_FINISH_CONST_SIZE, 74e1051a39Sopenharmony_ci TLS_MD_SERVER_FINISH_CONST, TLS_MD_SERVER_FINISH_CONST_SIZE, 75e1051a39Sopenharmony_ci tls1_alert_code, 76e1051a39Sopenharmony_ci tls1_export_keying_material, 77e1051a39Sopenharmony_ci SSL_ENC_FLAG_EXPLICIT_IV | SSL_ENC_FLAG_SIGALGS | SSL_ENC_FLAG_SHA256_PRF 78e1051a39Sopenharmony_ci | SSL_ENC_FLAG_TLS1_2_CIPHERS, 79e1051a39Sopenharmony_ci ssl3_set_handshake_header, 80e1051a39Sopenharmony_ci tls_close_construct_packet, 81e1051a39Sopenharmony_ci ssl3_handshake_write 82e1051a39Sopenharmony_ci}; 83e1051a39Sopenharmony_ci 84e1051a39Sopenharmony_ciSSL3_ENC_METHOD const TLSv1_3_enc_data = { 85e1051a39Sopenharmony_ci tls13_enc, 86e1051a39Sopenharmony_ci tls1_mac, 87e1051a39Sopenharmony_ci tls13_setup_key_block, 88e1051a39Sopenharmony_ci tls13_generate_master_secret, 89e1051a39Sopenharmony_ci tls13_change_cipher_state, 90e1051a39Sopenharmony_ci tls13_final_finish_mac, 91e1051a39Sopenharmony_ci TLS_MD_CLIENT_FINISH_CONST, TLS_MD_CLIENT_FINISH_CONST_SIZE, 92e1051a39Sopenharmony_ci TLS_MD_SERVER_FINISH_CONST, TLS_MD_SERVER_FINISH_CONST_SIZE, 93e1051a39Sopenharmony_ci tls13_alert_code, 94e1051a39Sopenharmony_ci tls13_export_keying_material, 95e1051a39Sopenharmony_ci SSL_ENC_FLAG_SIGALGS | SSL_ENC_FLAG_SHA256_PRF, 96e1051a39Sopenharmony_ci ssl3_set_handshake_header, 97e1051a39Sopenharmony_ci tls_close_construct_packet, 98e1051a39Sopenharmony_ci ssl3_handshake_write 99e1051a39Sopenharmony_ci}; 100e1051a39Sopenharmony_ci 101e1051a39Sopenharmony_cilong tls1_default_timeout(void) 102e1051a39Sopenharmony_ci{ 103e1051a39Sopenharmony_ci /* 104e1051a39Sopenharmony_ci * 2 hours, the 24 hours mentioned in the TLSv1 spec is way too long for 105e1051a39Sopenharmony_ci * http, the cache would over fill 106e1051a39Sopenharmony_ci */ 107e1051a39Sopenharmony_ci return (60 * 60 * 2); 108e1051a39Sopenharmony_ci} 109e1051a39Sopenharmony_ci 110e1051a39Sopenharmony_ciint tls1_new(SSL *s) 111e1051a39Sopenharmony_ci{ 112e1051a39Sopenharmony_ci if (!ssl3_new(s)) 113e1051a39Sopenharmony_ci return 0; 114e1051a39Sopenharmony_ci if (!s->method->ssl_clear(s)) 115e1051a39Sopenharmony_ci return 0; 116e1051a39Sopenharmony_ci 117e1051a39Sopenharmony_ci return 1; 118e1051a39Sopenharmony_ci} 119e1051a39Sopenharmony_ci 120e1051a39Sopenharmony_civoid tls1_free(SSL *s) 121e1051a39Sopenharmony_ci{ 122e1051a39Sopenharmony_ci OPENSSL_free(s->ext.session_ticket); 123e1051a39Sopenharmony_ci ssl3_free(s); 124e1051a39Sopenharmony_ci} 125e1051a39Sopenharmony_ci 126e1051a39Sopenharmony_ciint tls1_clear(SSL *s) 127e1051a39Sopenharmony_ci{ 128e1051a39Sopenharmony_ci if (!ssl3_clear(s)) 129e1051a39Sopenharmony_ci return 0; 130e1051a39Sopenharmony_ci 131e1051a39Sopenharmony_ci if (s->method->version == TLS_ANY_VERSION) 132e1051a39Sopenharmony_ci s->version = TLS_MAX_VERSION_INTERNAL; 133e1051a39Sopenharmony_ci else 134e1051a39Sopenharmony_ci s->version = s->method->version; 135e1051a39Sopenharmony_ci 136e1051a39Sopenharmony_ci return 1; 137e1051a39Sopenharmony_ci} 138e1051a39Sopenharmony_ci 139e1051a39Sopenharmony_ci/* Legacy NID to group_id mapping. Only works for groups we know about */ 140e1051a39Sopenharmony_cistatic struct { 141e1051a39Sopenharmony_ci int nid; 142e1051a39Sopenharmony_ci uint16_t group_id; 143e1051a39Sopenharmony_ci} nid_to_group[] = { 144e1051a39Sopenharmony_ci {NID_sect163k1, OSSL_TLS_GROUP_ID_sect163k1}, 145e1051a39Sopenharmony_ci {NID_sect163r1, OSSL_TLS_GROUP_ID_sect163r1}, 146e1051a39Sopenharmony_ci {NID_sect163r2, OSSL_TLS_GROUP_ID_sect163r2}, 147e1051a39Sopenharmony_ci {NID_sect193r1, OSSL_TLS_GROUP_ID_sect193r1}, 148e1051a39Sopenharmony_ci {NID_sect193r2, OSSL_TLS_GROUP_ID_sect193r2}, 149e1051a39Sopenharmony_ci {NID_sect233k1, OSSL_TLS_GROUP_ID_sect233k1}, 150e1051a39Sopenharmony_ci {NID_sect233r1, OSSL_TLS_GROUP_ID_sect233r1}, 151e1051a39Sopenharmony_ci {NID_sect239k1, OSSL_TLS_GROUP_ID_sect239k1}, 152e1051a39Sopenharmony_ci {NID_sect283k1, OSSL_TLS_GROUP_ID_sect283k1}, 153e1051a39Sopenharmony_ci {NID_sect283r1, OSSL_TLS_GROUP_ID_sect283r1}, 154e1051a39Sopenharmony_ci {NID_sect409k1, OSSL_TLS_GROUP_ID_sect409k1}, 155e1051a39Sopenharmony_ci {NID_sect409r1, OSSL_TLS_GROUP_ID_sect409r1}, 156e1051a39Sopenharmony_ci {NID_sect571k1, OSSL_TLS_GROUP_ID_sect571k1}, 157e1051a39Sopenharmony_ci {NID_sect571r1, OSSL_TLS_GROUP_ID_sect571r1}, 158e1051a39Sopenharmony_ci {NID_secp160k1, OSSL_TLS_GROUP_ID_secp160k1}, 159e1051a39Sopenharmony_ci {NID_secp160r1, OSSL_TLS_GROUP_ID_secp160r1}, 160e1051a39Sopenharmony_ci {NID_secp160r2, OSSL_TLS_GROUP_ID_secp160r2}, 161e1051a39Sopenharmony_ci {NID_secp192k1, OSSL_TLS_GROUP_ID_secp192k1}, 162e1051a39Sopenharmony_ci {NID_X9_62_prime192v1, OSSL_TLS_GROUP_ID_secp192r1}, 163e1051a39Sopenharmony_ci {NID_secp224k1, OSSL_TLS_GROUP_ID_secp224k1}, 164e1051a39Sopenharmony_ci {NID_secp224r1, OSSL_TLS_GROUP_ID_secp224r1}, 165e1051a39Sopenharmony_ci {NID_secp256k1, OSSL_TLS_GROUP_ID_secp256k1}, 166e1051a39Sopenharmony_ci {NID_X9_62_prime256v1, OSSL_TLS_GROUP_ID_secp256r1}, 167e1051a39Sopenharmony_ci {NID_secp384r1, OSSL_TLS_GROUP_ID_secp384r1}, 168e1051a39Sopenharmony_ci {NID_secp521r1, OSSL_TLS_GROUP_ID_secp521r1}, 169e1051a39Sopenharmony_ci {NID_brainpoolP256r1, OSSL_TLS_GROUP_ID_brainpoolP256r1}, 170e1051a39Sopenharmony_ci {NID_brainpoolP384r1, OSSL_TLS_GROUP_ID_brainpoolP384r1}, 171e1051a39Sopenharmony_ci {NID_brainpoolP512r1, OSSL_TLS_GROUP_ID_brainpoolP512r1}, 172e1051a39Sopenharmony_ci {EVP_PKEY_X25519, OSSL_TLS_GROUP_ID_x25519}, 173e1051a39Sopenharmony_ci {EVP_PKEY_X448, OSSL_TLS_GROUP_ID_x448}, 174e1051a39Sopenharmony_ci {NID_id_tc26_gost_3410_2012_256_paramSetA, 0x0022}, 175e1051a39Sopenharmony_ci {NID_id_tc26_gost_3410_2012_256_paramSetB, 0x0023}, 176e1051a39Sopenharmony_ci {NID_id_tc26_gost_3410_2012_256_paramSetC, 0x0024}, 177e1051a39Sopenharmony_ci {NID_id_tc26_gost_3410_2012_256_paramSetD, 0x0025}, 178e1051a39Sopenharmony_ci {NID_id_tc26_gost_3410_2012_512_paramSetA, 0x0026}, 179e1051a39Sopenharmony_ci {NID_id_tc26_gost_3410_2012_512_paramSetB, 0x0027}, 180e1051a39Sopenharmony_ci {NID_id_tc26_gost_3410_2012_512_paramSetC, 0x0028}, 181e1051a39Sopenharmony_ci {NID_ffdhe2048, OSSL_TLS_GROUP_ID_ffdhe2048}, 182e1051a39Sopenharmony_ci {NID_ffdhe3072, OSSL_TLS_GROUP_ID_ffdhe3072}, 183e1051a39Sopenharmony_ci {NID_ffdhe4096, OSSL_TLS_GROUP_ID_ffdhe4096}, 184e1051a39Sopenharmony_ci {NID_ffdhe6144, OSSL_TLS_GROUP_ID_ffdhe6144}, 185e1051a39Sopenharmony_ci {NID_ffdhe8192, OSSL_TLS_GROUP_ID_ffdhe8192} 186e1051a39Sopenharmony_ci}; 187e1051a39Sopenharmony_ci 188e1051a39Sopenharmony_cistatic const unsigned char ecformats_default[] = { 189e1051a39Sopenharmony_ci TLSEXT_ECPOINTFORMAT_uncompressed, 190e1051a39Sopenharmony_ci TLSEXT_ECPOINTFORMAT_ansiX962_compressed_prime, 191e1051a39Sopenharmony_ci TLSEXT_ECPOINTFORMAT_ansiX962_compressed_char2 192e1051a39Sopenharmony_ci}; 193e1051a39Sopenharmony_ci 194e1051a39Sopenharmony_ci/* The default curves */ 195e1051a39Sopenharmony_cistatic const uint16_t supported_groups_default[] = { 196e1051a39Sopenharmony_ci 29, /* X25519 (29) */ 197e1051a39Sopenharmony_ci 23, /* secp256r1 (23) */ 198e1051a39Sopenharmony_ci 30, /* X448 (30) */ 199e1051a39Sopenharmony_ci 25, /* secp521r1 (25) */ 200e1051a39Sopenharmony_ci 24, /* secp384r1 (24) */ 201e1051a39Sopenharmony_ci 34, /* GC256A (34) */ 202e1051a39Sopenharmony_ci 35, /* GC256B (35) */ 203e1051a39Sopenharmony_ci 36, /* GC256C (36) */ 204e1051a39Sopenharmony_ci 37, /* GC256D (37) */ 205e1051a39Sopenharmony_ci 38, /* GC512A (38) */ 206e1051a39Sopenharmony_ci 39, /* GC512B (39) */ 207e1051a39Sopenharmony_ci 40, /* GC512C (40) */ 208e1051a39Sopenharmony_ci 0x100, /* ffdhe2048 (0x100) */ 209e1051a39Sopenharmony_ci 0x101, /* ffdhe3072 (0x101) */ 210e1051a39Sopenharmony_ci 0x102, /* ffdhe4096 (0x102) */ 211e1051a39Sopenharmony_ci 0x103, /* ffdhe6144 (0x103) */ 212e1051a39Sopenharmony_ci 0x104, /* ffdhe8192 (0x104) */ 213e1051a39Sopenharmony_ci}; 214e1051a39Sopenharmony_ci 215e1051a39Sopenharmony_cistatic const uint16_t suiteb_curves[] = { 216e1051a39Sopenharmony_ci TLSEXT_curve_P_256, 217e1051a39Sopenharmony_ci TLSEXT_curve_P_384 218e1051a39Sopenharmony_ci}; 219e1051a39Sopenharmony_ci 220e1051a39Sopenharmony_cistruct provider_group_data_st { 221e1051a39Sopenharmony_ci SSL_CTX *ctx; 222e1051a39Sopenharmony_ci OSSL_PROVIDER *provider; 223e1051a39Sopenharmony_ci}; 224e1051a39Sopenharmony_ci 225e1051a39Sopenharmony_ci#define TLS_GROUP_LIST_MALLOC_BLOCK_SIZE 10 226e1051a39Sopenharmony_cistatic OSSL_CALLBACK add_provider_groups; 227e1051a39Sopenharmony_cistatic int add_provider_groups(const OSSL_PARAM params[], void *data) 228e1051a39Sopenharmony_ci{ 229e1051a39Sopenharmony_ci struct provider_group_data_st *pgd = data; 230e1051a39Sopenharmony_ci SSL_CTX *ctx = pgd->ctx; 231e1051a39Sopenharmony_ci OSSL_PROVIDER *provider = pgd->provider; 232e1051a39Sopenharmony_ci const OSSL_PARAM *p; 233e1051a39Sopenharmony_ci TLS_GROUP_INFO *ginf = NULL; 234e1051a39Sopenharmony_ci EVP_KEYMGMT *keymgmt; 235e1051a39Sopenharmony_ci unsigned int gid; 236e1051a39Sopenharmony_ci unsigned int is_kem = 0; 237e1051a39Sopenharmony_ci int ret = 0; 238e1051a39Sopenharmony_ci 239e1051a39Sopenharmony_ci if (ctx->group_list_max_len == ctx->group_list_len) { 240e1051a39Sopenharmony_ci TLS_GROUP_INFO *tmp = NULL; 241e1051a39Sopenharmony_ci 242e1051a39Sopenharmony_ci if (ctx->group_list_max_len == 0) 243e1051a39Sopenharmony_ci tmp = OPENSSL_malloc(sizeof(TLS_GROUP_INFO) 244e1051a39Sopenharmony_ci * TLS_GROUP_LIST_MALLOC_BLOCK_SIZE); 245e1051a39Sopenharmony_ci else 246e1051a39Sopenharmony_ci tmp = OPENSSL_realloc(ctx->group_list, 247e1051a39Sopenharmony_ci (ctx->group_list_max_len 248e1051a39Sopenharmony_ci + TLS_GROUP_LIST_MALLOC_BLOCK_SIZE) 249e1051a39Sopenharmony_ci * sizeof(TLS_GROUP_INFO)); 250e1051a39Sopenharmony_ci if (tmp == NULL) { 251e1051a39Sopenharmony_ci ERR_raise(ERR_LIB_SSL, ERR_R_MALLOC_FAILURE); 252e1051a39Sopenharmony_ci return 0; 253e1051a39Sopenharmony_ci } 254e1051a39Sopenharmony_ci ctx->group_list = tmp; 255e1051a39Sopenharmony_ci memset(tmp + ctx->group_list_max_len, 256e1051a39Sopenharmony_ci 0, 257e1051a39Sopenharmony_ci sizeof(TLS_GROUP_INFO) * TLS_GROUP_LIST_MALLOC_BLOCK_SIZE); 258e1051a39Sopenharmony_ci ctx->group_list_max_len += TLS_GROUP_LIST_MALLOC_BLOCK_SIZE; 259e1051a39Sopenharmony_ci } 260e1051a39Sopenharmony_ci 261e1051a39Sopenharmony_ci ginf = &ctx->group_list[ctx->group_list_len]; 262e1051a39Sopenharmony_ci 263e1051a39Sopenharmony_ci p = OSSL_PARAM_locate_const(params, OSSL_CAPABILITY_TLS_GROUP_NAME); 264e1051a39Sopenharmony_ci if (p == NULL || p->data_type != OSSL_PARAM_UTF8_STRING) { 265e1051a39Sopenharmony_ci ERR_raise(ERR_LIB_SSL, ERR_R_PASSED_INVALID_ARGUMENT); 266e1051a39Sopenharmony_ci goto err; 267e1051a39Sopenharmony_ci } 268e1051a39Sopenharmony_ci ginf->tlsname = OPENSSL_strdup(p->data); 269e1051a39Sopenharmony_ci if (ginf->tlsname == NULL) { 270e1051a39Sopenharmony_ci ERR_raise(ERR_LIB_SSL, ERR_R_MALLOC_FAILURE); 271e1051a39Sopenharmony_ci goto err; 272e1051a39Sopenharmony_ci } 273e1051a39Sopenharmony_ci 274e1051a39Sopenharmony_ci p = OSSL_PARAM_locate_const(params, OSSL_CAPABILITY_TLS_GROUP_NAME_INTERNAL); 275e1051a39Sopenharmony_ci if (p == NULL || p->data_type != OSSL_PARAM_UTF8_STRING) { 276e1051a39Sopenharmony_ci ERR_raise(ERR_LIB_SSL, ERR_R_PASSED_INVALID_ARGUMENT); 277e1051a39Sopenharmony_ci goto err; 278e1051a39Sopenharmony_ci } 279e1051a39Sopenharmony_ci ginf->realname = OPENSSL_strdup(p->data); 280e1051a39Sopenharmony_ci if (ginf->realname == NULL) { 281e1051a39Sopenharmony_ci ERR_raise(ERR_LIB_SSL, ERR_R_MALLOC_FAILURE); 282e1051a39Sopenharmony_ci goto err; 283e1051a39Sopenharmony_ci } 284e1051a39Sopenharmony_ci 285e1051a39Sopenharmony_ci p = OSSL_PARAM_locate_const(params, OSSL_CAPABILITY_TLS_GROUP_ID); 286e1051a39Sopenharmony_ci if (p == NULL || !OSSL_PARAM_get_uint(p, &gid) || gid > UINT16_MAX) { 287e1051a39Sopenharmony_ci ERR_raise(ERR_LIB_SSL, ERR_R_PASSED_INVALID_ARGUMENT); 288e1051a39Sopenharmony_ci goto err; 289e1051a39Sopenharmony_ci } 290e1051a39Sopenharmony_ci ginf->group_id = (uint16_t)gid; 291e1051a39Sopenharmony_ci 292e1051a39Sopenharmony_ci p = OSSL_PARAM_locate_const(params, OSSL_CAPABILITY_TLS_GROUP_ALG); 293e1051a39Sopenharmony_ci if (p == NULL || p->data_type != OSSL_PARAM_UTF8_STRING) { 294e1051a39Sopenharmony_ci ERR_raise(ERR_LIB_SSL, ERR_R_PASSED_INVALID_ARGUMENT); 295e1051a39Sopenharmony_ci goto err; 296e1051a39Sopenharmony_ci } 297e1051a39Sopenharmony_ci ginf->algorithm = OPENSSL_strdup(p->data); 298e1051a39Sopenharmony_ci if (ginf->algorithm == NULL) { 299e1051a39Sopenharmony_ci ERR_raise(ERR_LIB_SSL, ERR_R_MALLOC_FAILURE); 300e1051a39Sopenharmony_ci goto err; 301e1051a39Sopenharmony_ci } 302e1051a39Sopenharmony_ci 303e1051a39Sopenharmony_ci p = OSSL_PARAM_locate_const(params, OSSL_CAPABILITY_TLS_GROUP_SECURITY_BITS); 304e1051a39Sopenharmony_ci if (p == NULL || !OSSL_PARAM_get_uint(p, &ginf->secbits)) { 305e1051a39Sopenharmony_ci ERR_raise(ERR_LIB_SSL, ERR_R_PASSED_INVALID_ARGUMENT); 306e1051a39Sopenharmony_ci goto err; 307e1051a39Sopenharmony_ci } 308e1051a39Sopenharmony_ci 309e1051a39Sopenharmony_ci p = OSSL_PARAM_locate_const(params, OSSL_CAPABILITY_TLS_GROUP_IS_KEM); 310e1051a39Sopenharmony_ci if (p != NULL && (!OSSL_PARAM_get_uint(p, &is_kem) || is_kem > 1)) { 311e1051a39Sopenharmony_ci ERR_raise(ERR_LIB_SSL, ERR_R_PASSED_INVALID_ARGUMENT); 312e1051a39Sopenharmony_ci goto err; 313e1051a39Sopenharmony_ci } 314e1051a39Sopenharmony_ci ginf->is_kem = 1 & is_kem; 315e1051a39Sopenharmony_ci 316e1051a39Sopenharmony_ci p = OSSL_PARAM_locate_const(params, OSSL_CAPABILITY_TLS_GROUP_MIN_TLS); 317e1051a39Sopenharmony_ci if (p == NULL || !OSSL_PARAM_get_int(p, &ginf->mintls)) { 318e1051a39Sopenharmony_ci ERR_raise(ERR_LIB_SSL, ERR_R_PASSED_INVALID_ARGUMENT); 319e1051a39Sopenharmony_ci goto err; 320e1051a39Sopenharmony_ci } 321e1051a39Sopenharmony_ci 322e1051a39Sopenharmony_ci p = OSSL_PARAM_locate_const(params, OSSL_CAPABILITY_TLS_GROUP_MAX_TLS); 323e1051a39Sopenharmony_ci if (p == NULL || !OSSL_PARAM_get_int(p, &ginf->maxtls)) { 324e1051a39Sopenharmony_ci ERR_raise(ERR_LIB_SSL, ERR_R_PASSED_INVALID_ARGUMENT); 325e1051a39Sopenharmony_ci goto err; 326e1051a39Sopenharmony_ci } 327e1051a39Sopenharmony_ci 328e1051a39Sopenharmony_ci p = OSSL_PARAM_locate_const(params, OSSL_CAPABILITY_TLS_GROUP_MIN_DTLS); 329e1051a39Sopenharmony_ci if (p == NULL || !OSSL_PARAM_get_int(p, &ginf->mindtls)) { 330e1051a39Sopenharmony_ci ERR_raise(ERR_LIB_SSL, ERR_R_PASSED_INVALID_ARGUMENT); 331e1051a39Sopenharmony_ci goto err; 332e1051a39Sopenharmony_ci } 333e1051a39Sopenharmony_ci 334e1051a39Sopenharmony_ci p = OSSL_PARAM_locate_const(params, OSSL_CAPABILITY_TLS_GROUP_MAX_DTLS); 335e1051a39Sopenharmony_ci if (p == NULL || !OSSL_PARAM_get_int(p, &ginf->maxdtls)) { 336e1051a39Sopenharmony_ci ERR_raise(ERR_LIB_SSL, ERR_R_PASSED_INVALID_ARGUMENT); 337e1051a39Sopenharmony_ci goto err; 338e1051a39Sopenharmony_ci } 339e1051a39Sopenharmony_ci /* 340e1051a39Sopenharmony_ci * Now check that the algorithm is actually usable for our property query 341e1051a39Sopenharmony_ci * string. Regardless of the result we still return success because we have 342e1051a39Sopenharmony_ci * successfully processed this group, even though we may decide not to use 343e1051a39Sopenharmony_ci * it. 344e1051a39Sopenharmony_ci */ 345e1051a39Sopenharmony_ci ret = 1; 346e1051a39Sopenharmony_ci ERR_set_mark(); 347e1051a39Sopenharmony_ci keymgmt = EVP_KEYMGMT_fetch(ctx->libctx, ginf->algorithm, ctx->propq); 348e1051a39Sopenharmony_ci if (keymgmt != NULL) { 349e1051a39Sopenharmony_ci /* 350e1051a39Sopenharmony_ci * We have successfully fetched the algorithm - however if the provider 351e1051a39Sopenharmony_ci * doesn't match this one then we ignore it. 352e1051a39Sopenharmony_ci * 353e1051a39Sopenharmony_ci * Note: We're cheating a little here. Technically if the same algorithm 354e1051a39Sopenharmony_ci * is available from more than one provider then it is undefined which 355e1051a39Sopenharmony_ci * implementation you will get back. Theoretically this could be 356e1051a39Sopenharmony_ci * different every time...we assume here that you'll always get the 357e1051a39Sopenharmony_ci * same one back if you repeat the exact same fetch. Is this a reasonable 358e1051a39Sopenharmony_ci * assumption to make (in which case perhaps we should document this 359e1051a39Sopenharmony_ci * behaviour)? 360e1051a39Sopenharmony_ci */ 361e1051a39Sopenharmony_ci if (EVP_KEYMGMT_get0_provider(keymgmt) == provider) { 362e1051a39Sopenharmony_ci /* We have a match - so we will use this group */ 363e1051a39Sopenharmony_ci ctx->group_list_len++; 364e1051a39Sopenharmony_ci ginf = NULL; 365e1051a39Sopenharmony_ci } 366e1051a39Sopenharmony_ci EVP_KEYMGMT_free(keymgmt); 367e1051a39Sopenharmony_ci } 368e1051a39Sopenharmony_ci ERR_pop_to_mark(); 369e1051a39Sopenharmony_ci err: 370e1051a39Sopenharmony_ci if (ginf != NULL) { 371e1051a39Sopenharmony_ci OPENSSL_free(ginf->tlsname); 372e1051a39Sopenharmony_ci OPENSSL_free(ginf->realname); 373e1051a39Sopenharmony_ci OPENSSL_free(ginf->algorithm); 374e1051a39Sopenharmony_ci ginf->algorithm = ginf->tlsname = ginf->realname = NULL; 375e1051a39Sopenharmony_ci } 376e1051a39Sopenharmony_ci return ret; 377e1051a39Sopenharmony_ci} 378e1051a39Sopenharmony_ci 379e1051a39Sopenharmony_cistatic int discover_provider_groups(OSSL_PROVIDER *provider, void *vctx) 380e1051a39Sopenharmony_ci{ 381e1051a39Sopenharmony_ci struct provider_group_data_st pgd; 382e1051a39Sopenharmony_ci 383e1051a39Sopenharmony_ci pgd.ctx = vctx; 384e1051a39Sopenharmony_ci pgd.provider = provider; 385e1051a39Sopenharmony_ci return OSSL_PROVIDER_get_capabilities(provider, "TLS-GROUP", 386e1051a39Sopenharmony_ci add_provider_groups, &pgd); 387e1051a39Sopenharmony_ci} 388e1051a39Sopenharmony_ci 389e1051a39Sopenharmony_ciint ssl_load_groups(SSL_CTX *ctx) 390e1051a39Sopenharmony_ci{ 391e1051a39Sopenharmony_ci size_t i, j, num_deflt_grps = 0; 392e1051a39Sopenharmony_ci uint16_t tmp_supp_groups[OSSL_NELEM(supported_groups_default)]; 393e1051a39Sopenharmony_ci 394e1051a39Sopenharmony_ci if (!OSSL_PROVIDER_do_all(ctx->libctx, discover_provider_groups, ctx)) 395e1051a39Sopenharmony_ci return 0; 396e1051a39Sopenharmony_ci 397e1051a39Sopenharmony_ci for (i = 0; i < OSSL_NELEM(supported_groups_default); i++) { 398e1051a39Sopenharmony_ci for (j = 0; j < ctx->group_list_len; j++) { 399e1051a39Sopenharmony_ci if (ctx->group_list[j].group_id == supported_groups_default[i]) { 400e1051a39Sopenharmony_ci tmp_supp_groups[num_deflt_grps++] = ctx->group_list[j].group_id; 401e1051a39Sopenharmony_ci break; 402e1051a39Sopenharmony_ci } 403e1051a39Sopenharmony_ci } 404e1051a39Sopenharmony_ci } 405e1051a39Sopenharmony_ci 406e1051a39Sopenharmony_ci if (num_deflt_grps == 0) 407e1051a39Sopenharmony_ci return 1; 408e1051a39Sopenharmony_ci 409e1051a39Sopenharmony_ci ctx->ext.supported_groups_default 410e1051a39Sopenharmony_ci = OPENSSL_malloc(sizeof(uint16_t) * num_deflt_grps); 411e1051a39Sopenharmony_ci 412e1051a39Sopenharmony_ci if (ctx->ext.supported_groups_default == NULL) { 413e1051a39Sopenharmony_ci ERR_raise(ERR_LIB_SSL, ERR_R_MALLOC_FAILURE); 414e1051a39Sopenharmony_ci return 0; 415e1051a39Sopenharmony_ci } 416e1051a39Sopenharmony_ci 417e1051a39Sopenharmony_ci memcpy(ctx->ext.supported_groups_default, 418e1051a39Sopenharmony_ci tmp_supp_groups, 419e1051a39Sopenharmony_ci num_deflt_grps * sizeof(tmp_supp_groups[0])); 420e1051a39Sopenharmony_ci ctx->ext.supported_groups_default_len = num_deflt_grps; 421e1051a39Sopenharmony_ci 422e1051a39Sopenharmony_ci return 1; 423e1051a39Sopenharmony_ci} 424e1051a39Sopenharmony_ci 425e1051a39Sopenharmony_cistatic uint16_t tls1_group_name2id(SSL_CTX *ctx, const char *name) 426e1051a39Sopenharmony_ci{ 427e1051a39Sopenharmony_ci size_t i; 428e1051a39Sopenharmony_ci 429e1051a39Sopenharmony_ci for (i = 0; i < ctx->group_list_len; i++) { 430e1051a39Sopenharmony_ci if (strcmp(ctx->group_list[i].tlsname, name) == 0 431e1051a39Sopenharmony_ci || strcmp(ctx->group_list[i].realname, name) == 0) 432e1051a39Sopenharmony_ci return ctx->group_list[i].group_id; 433e1051a39Sopenharmony_ci } 434e1051a39Sopenharmony_ci 435e1051a39Sopenharmony_ci return 0; 436e1051a39Sopenharmony_ci} 437e1051a39Sopenharmony_ci 438e1051a39Sopenharmony_ciconst TLS_GROUP_INFO *tls1_group_id_lookup(SSL_CTX *ctx, uint16_t group_id) 439e1051a39Sopenharmony_ci{ 440e1051a39Sopenharmony_ci size_t i; 441e1051a39Sopenharmony_ci 442e1051a39Sopenharmony_ci for (i = 0; i < ctx->group_list_len; i++) { 443e1051a39Sopenharmony_ci if (ctx->group_list[i].group_id == group_id) 444e1051a39Sopenharmony_ci return &ctx->group_list[i]; 445e1051a39Sopenharmony_ci } 446e1051a39Sopenharmony_ci 447e1051a39Sopenharmony_ci return NULL; 448e1051a39Sopenharmony_ci} 449e1051a39Sopenharmony_ci 450e1051a39Sopenharmony_ciint tls1_group_id2nid(uint16_t group_id, int include_unknown) 451e1051a39Sopenharmony_ci{ 452e1051a39Sopenharmony_ci size_t i; 453e1051a39Sopenharmony_ci 454e1051a39Sopenharmony_ci if (group_id == 0) 455e1051a39Sopenharmony_ci return NID_undef; 456e1051a39Sopenharmony_ci 457e1051a39Sopenharmony_ci /* 458e1051a39Sopenharmony_ci * Return well known Group NIDs - for backwards compatibility. This won't 459e1051a39Sopenharmony_ci * work for groups we don't know about. 460e1051a39Sopenharmony_ci */ 461e1051a39Sopenharmony_ci for (i = 0; i < OSSL_NELEM(nid_to_group); i++) 462e1051a39Sopenharmony_ci { 463e1051a39Sopenharmony_ci if (nid_to_group[i].group_id == group_id) 464e1051a39Sopenharmony_ci return nid_to_group[i].nid; 465e1051a39Sopenharmony_ci } 466e1051a39Sopenharmony_ci if (!include_unknown) 467e1051a39Sopenharmony_ci return NID_undef; 468e1051a39Sopenharmony_ci return TLSEXT_nid_unknown | (int)group_id; 469e1051a39Sopenharmony_ci} 470e1051a39Sopenharmony_ci 471e1051a39Sopenharmony_ciuint16_t tls1_nid2group_id(int nid) 472e1051a39Sopenharmony_ci{ 473e1051a39Sopenharmony_ci size_t i; 474e1051a39Sopenharmony_ci 475e1051a39Sopenharmony_ci /* 476e1051a39Sopenharmony_ci * Return well known Group ids - for backwards compatibility. This won't 477e1051a39Sopenharmony_ci * work for groups we don't know about. 478e1051a39Sopenharmony_ci */ 479e1051a39Sopenharmony_ci for (i = 0; i < OSSL_NELEM(nid_to_group); i++) 480e1051a39Sopenharmony_ci { 481e1051a39Sopenharmony_ci if (nid_to_group[i].nid == nid) 482e1051a39Sopenharmony_ci return nid_to_group[i].group_id; 483e1051a39Sopenharmony_ci } 484e1051a39Sopenharmony_ci 485e1051a39Sopenharmony_ci return 0; 486e1051a39Sopenharmony_ci} 487e1051a39Sopenharmony_ci 488e1051a39Sopenharmony_ci/* 489e1051a39Sopenharmony_ci * Set *pgroups to the supported groups list and *pgroupslen to 490e1051a39Sopenharmony_ci * the number of groups supported. 491e1051a39Sopenharmony_ci */ 492e1051a39Sopenharmony_civoid tls1_get_supported_groups(SSL *s, const uint16_t **pgroups, 493e1051a39Sopenharmony_ci size_t *pgroupslen) 494e1051a39Sopenharmony_ci{ 495e1051a39Sopenharmony_ci /* For Suite B mode only include P-256, P-384 */ 496e1051a39Sopenharmony_ci switch (tls1_suiteb(s)) { 497e1051a39Sopenharmony_ci case SSL_CERT_FLAG_SUITEB_128_LOS: 498e1051a39Sopenharmony_ci *pgroups = suiteb_curves; 499e1051a39Sopenharmony_ci *pgroupslen = OSSL_NELEM(suiteb_curves); 500e1051a39Sopenharmony_ci break; 501e1051a39Sopenharmony_ci 502e1051a39Sopenharmony_ci case SSL_CERT_FLAG_SUITEB_128_LOS_ONLY: 503e1051a39Sopenharmony_ci *pgroups = suiteb_curves; 504e1051a39Sopenharmony_ci *pgroupslen = 1; 505e1051a39Sopenharmony_ci break; 506e1051a39Sopenharmony_ci 507e1051a39Sopenharmony_ci case SSL_CERT_FLAG_SUITEB_192_LOS: 508e1051a39Sopenharmony_ci *pgroups = suiteb_curves + 1; 509e1051a39Sopenharmony_ci *pgroupslen = 1; 510e1051a39Sopenharmony_ci break; 511e1051a39Sopenharmony_ci 512e1051a39Sopenharmony_ci default: 513e1051a39Sopenharmony_ci if (s->ext.supportedgroups == NULL) { 514e1051a39Sopenharmony_ci *pgroups = s->ctx->ext.supported_groups_default; 515e1051a39Sopenharmony_ci *pgroupslen = s->ctx->ext.supported_groups_default_len; 516e1051a39Sopenharmony_ci } else { 517e1051a39Sopenharmony_ci *pgroups = s->ext.supportedgroups; 518e1051a39Sopenharmony_ci *pgroupslen = s->ext.supportedgroups_len; 519e1051a39Sopenharmony_ci } 520e1051a39Sopenharmony_ci break; 521e1051a39Sopenharmony_ci } 522e1051a39Sopenharmony_ci} 523e1051a39Sopenharmony_ci 524e1051a39Sopenharmony_ciint tls_valid_group(SSL *s, uint16_t group_id, int minversion, int maxversion, 525e1051a39Sopenharmony_ci int isec, int *okfortls13) 526e1051a39Sopenharmony_ci{ 527e1051a39Sopenharmony_ci const TLS_GROUP_INFO *ginfo = tls1_group_id_lookup(s->ctx, group_id); 528e1051a39Sopenharmony_ci int ret; 529e1051a39Sopenharmony_ci 530e1051a39Sopenharmony_ci if (okfortls13 != NULL) 531e1051a39Sopenharmony_ci *okfortls13 = 0; 532e1051a39Sopenharmony_ci 533e1051a39Sopenharmony_ci if (ginfo == NULL) 534e1051a39Sopenharmony_ci return 0; 535e1051a39Sopenharmony_ci 536e1051a39Sopenharmony_ci if (SSL_IS_DTLS(s)) { 537e1051a39Sopenharmony_ci if (ginfo->mindtls < 0 || ginfo->maxdtls < 0) 538e1051a39Sopenharmony_ci return 0; 539e1051a39Sopenharmony_ci if (ginfo->maxdtls == 0) 540e1051a39Sopenharmony_ci ret = 1; 541e1051a39Sopenharmony_ci else 542e1051a39Sopenharmony_ci ret = DTLS_VERSION_LE(minversion, ginfo->maxdtls); 543e1051a39Sopenharmony_ci if (ginfo->mindtls > 0) 544e1051a39Sopenharmony_ci ret &= DTLS_VERSION_GE(maxversion, ginfo->mindtls); 545e1051a39Sopenharmony_ci } else { 546e1051a39Sopenharmony_ci if (ginfo->mintls < 0 || ginfo->maxtls < 0) 547e1051a39Sopenharmony_ci return 0; 548e1051a39Sopenharmony_ci if (ginfo->maxtls == 0) 549e1051a39Sopenharmony_ci ret = 1; 550e1051a39Sopenharmony_ci else 551e1051a39Sopenharmony_ci ret = (minversion <= ginfo->maxtls); 552e1051a39Sopenharmony_ci if (ginfo->mintls > 0) 553e1051a39Sopenharmony_ci ret &= (maxversion >= ginfo->mintls); 554e1051a39Sopenharmony_ci if (ret && okfortls13 != NULL && maxversion == TLS1_3_VERSION) 555e1051a39Sopenharmony_ci *okfortls13 = (ginfo->maxtls == 0) 556e1051a39Sopenharmony_ci || (ginfo->maxtls >= TLS1_3_VERSION); 557e1051a39Sopenharmony_ci } 558e1051a39Sopenharmony_ci ret &= !isec 559e1051a39Sopenharmony_ci || strcmp(ginfo->algorithm, "EC") == 0 560e1051a39Sopenharmony_ci || strcmp(ginfo->algorithm, "X25519") == 0 561e1051a39Sopenharmony_ci || strcmp(ginfo->algorithm, "X448") == 0; 562e1051a39Sopenharmony_ci 563e1051a39Sopenharmony_ci return ret; 564e1051a39Sopenharmony_ci} 565e1051a39Sopenharmony_ci 566e1051a39Sopenharmony_ci/* See if group is allowed by security callback */ 567e1051a39Sopenharmony_ciint tls_group_allowed(SSL *s, uint16_t group, int op) 568e1051a39Sopenharmony_ci{ 569e1051a39Sopenharmony_ci const TLS_GROUP_INFO *ginfo = tls1_group_id_lookup(s->ctx, group); 570e1051a39Sopenharmony_ci unsigned char gtmp[2]; 571e1051a39Sopenharmony_ci 572e1051a39Sopenharmony_ci if (ginfo == NULL) 573e1051a39Sopenharmony_ci return 0; 574e1051a39Sopenharmony_ci 575e1051a39Sopenharmony_ci gtmp[0] = group >> 8; 576e1051a39Sopenharmony_ci gtmp[1] = group & 0xff; 577e1051a39Sopenharmony_ci return ssl_security(s, op, ginfo->secbits, 578e1051a39Sopenharmony_ci tls1_group_id2nid(ginfo->group_id, 0), (void *)gtmp); 579e1051a39Sopenharmony_ci} 580e1051a39Sopenharmony_ci 581e1051a39Sopenharmony_ci/* Return 1 if "id" is in "list" */ 582e1051a39Sopenharmony_cistatic int tls1_in_list(uint16_t id, const uint16_t *list, size_t listlen) 583e1051a39Sopenharmony_ci{ 584e1051a39Sopenharmony_ci size_t i; 585e1051a39Sopenharmony_ci for (i = 0; i < listlen; i++) 586e1051a39Sopenharmony_ci if (list[i] == id) 587e1051a39Sopenharmony_ci return 1; 588e1051a39Sopenharmony_ci return 0; 589e1051a39Sopenharmony_ci} 590e1051a39Sopenharmony_ci 591e1051a39Sopenharmony_ci/*- 592e1051a39Sopenharmony_ci * For nmatch >= 0, return the id of the |nmatch|th shared group or 0 593e1051a39Sopenharmony_ci * if there is no match. 594e1051a39Sopenharmony_ci * For nmatch == -1, return number of matches 595e1051a39Sopenharmony_ci * For nmatch == -2, return the id of the group to use for 596e1051a39Sopenharmony_ci * a tmp key, or 0 if there is no match. 597e1051a39Sopenharmony_ci */ 598e1051a39Sopenharmony_ciuint16_t tls1_shared_group(SSL *s, int nmatch) 599e1051a39Sopenharmony_ci{ 600e1051a39Sopenharmony_ci const uint16_t *pref, *supp; 601e1051a39Sopenharmony_ci size_t num_pref, num_supp, i; 602e1051a39Sopenharmony_ci int k; 603e1051a39Sopenharmony_ci 604e1051a39Sopenharmony_ci /* Can't do anything on client side */ 605e1051a39Sopenharmony_ci if (s->server == 0) 606e1051a39Sopenharmony_ci return 0; 607e1051a39Sopenharmony_ci if (nmatch == -2) { 608e1051a39Sopenharmony_ci if (tls1_suiteb(s)) { 609e1051a39Sopenharmony_ci /* 610e1051a39Sopenharmony_ci * For Suite B ciphersuite determines curve: we already know 611e1051a39Sopenharmony_ci * these are acceptable due to previous checks. 612e1051a39Sopenharmony_ci */ 613e1051a39Sopenharmony_ci unsigned long cid = s->s3.tmp.new_cipher->id; 614e1051a39Sopenharmony_ci 615e1051a39Sopenharmony_ci if (cid == TLS1_CK_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256) 616e1051a39Sopenharmony_ci return TLSEXT_curve_P_256; 617e1051a39Sopenharmony_ci if (cid == TLS1_CK_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384) 618e1051a39Sopenharmony_ci return TLSEXT_curve_P_384; 619e1051a39Sopenharmony_ci /* Should never happen */ 620e1051a39Sopenharmony_ci return 0; 621e1051a39Sopenharmony_ci } 622e1051a39Sopenharmony_ci /* If not Suite B just return first preference shared curve */ 623e1051a39Sopenharmony_ci nmatch = 0; 624e1051a39Sopenharmony_ci } 625e1051a39Sopenharmony_ci /* 626e1051a39Sopenharmony_ci * If server preference set, our groups are the preference order 627e1051a39Sopenharmony_ci * otherwise peer decides. 628e1051a39Sopenharmony_ci */ 629e1051a39Sopenharmony_ci if (s->options & SSL_OP_CIPHER_SERVER_PREFERENCE) { 630e1051a39Sopenharmony_ci tls1_get_supported_groups(s, &pref, &num_pref); 631e1051a39Sopenharmony_ci tls1_get_peer_groups(s, &supp, &num_supp); 632e1051a39Sopenharmony_ci } else { 633e1051a39Sopenharmony_ci tls1_get_peer_groups(s, &pref, &num_pref); 634e1051a39Sopenharmony_ci tls1_get_supported_groups(s, &supp, &num_supp); 635e1051a39Sopenharmony_ci } 636e1051a39Sopenharmony_ci 637e1051a39Sopenharmony_ci for (k = 0, i = 0; i < num_pref; i++) { 638e1051a39Sopenharmony_ci uint16_t id = pref[i]; 639e1051a39Sopenharmony_ci 640e1051a39Sopenharmony_ci if (!tls1_in_list(id, supp, num_supp) 641e1051a39Sopenharmony_ci || !tls_group_allowed(s, id, SSL_SECOP_CURVE_SHARED)) 642e1051a39Sopenharmony_ci continue; 643e1051a39Sopenharmony_ci if (nmatch == k) 644e1051a39Sopenharmony_ci return id; 645e1051a39Sopenharmony_ci k++; 646e1051a39Sopenharmony_ci } 647e1051a39Sopenharmony_ci if (nmatch == -1) 648e1051a39Sopenharmony_ci return k; 649e1051a39Sopenharmony_ci /* Out of range (nmatch > k). */ 650e1051a39Sopenharmony_ci return 0; 651e1051a39Sopenharmony_ci} 652e1051a39Sopenharmony_ci 653e1051a39Sopenharmony_ciint tls1_set_groups(uint16_t **pext, size_t *pextlen, 654e1051a39Sopenharmony_ci int *groups, size_t ngroups) 655e1051a39Sopenharmony_ci{ 656e1051a39Sopenharmony_ci uint16_t *glist; 657e1051a39Sopenharmony_ci size_t i; 658e1051a39Sopenharmony_ci /* 659e1051a39Sopenharmony_ci * Bitmap of groups included to detect duplicates: two variables are added 660e1051a39Sopenharmony_ci * to detect duplicates as some values are more than 32. 661e1051a39Sopenharmony_ci */ 662e1051a39Sopenharmony_ci unsigned long *dup_list = NULL; 663e1051a39Sopenharmony_ci unsigned long dup_list_egrp = 0; 664e1051a39Sopenharmony_ci unsigned long dup_list_dhgrp = 0; 665e1051a39Sopenharmony_ci 666e1051a39Sopenharmony_ci if (ngroups == 0) { 667e1051a39Sopenharmony_ci ERR_raise(ERR_LIB_SSL, SSL_R_BAD_LENGTH); 668e1051a39Sopenharmony_ci return 0; 669e1051a39Sopenharmony_ci } 670e1051a39Sopenharmony_ci if ((glist = OPENSSL_malloc(ngroups * sizeof(*glist))) == NULL) { 671e1051a39Sopenharmony_ci ERR_raise(ERR_LIB_SSL, ERR_R_MALLOC_FAILURE); 672e1051a39Sopenharmony_ci return 0; 673e1051a39Sopenharmony_ci } 674e1051a39Sopenharmony_ci for (i = 0; i < ngroups; i++) { 675e1051a39Sopenharmony_ci unsigned long idmask; 676e1051a39Sopenharmony_ci uint16_t id; 677e1051a39Sopenharmony_ci id = tls1_nid2group_id(groups[i]); 678e1051a39Sopenharmony_ci if ((id & 0x00FF) >= (sizeof(unsigned long) * 8)) 679e1051a39Sopenharmony_ci goto err; 680e1051a39Sopenharmony_ci idmask = 1L << (id & 0x00FF); 681e1051a39Sopenharmony_ci dup_list = (id < 0x100) ? &dup_list_egrp : &dup_list_dhgrp; 682e1051a39Sopenharmony_ci if (!id || ((*dup_list) & idmask)) 683e1051a39Sopenharmony_ci goto err; 684e1051a39Sopenharmony_ci *dup_list |= idmask; 685e1051a39Sopenharmony_ci glist[i] = id; 686e1051a39Sopenharmony_ci } 687e1051a39Sopenharmony_ci OPENSSL_free(*pext); 688e1051a39Sopenharmony_ci *pext = glist; 689e1051a39Sopenharmony_ci *pextlen = ngroups; 690e1051a39Sopenharmony_ci return 1; 691e1051a39Sopenharmony_cierr: 692e1051a39Sopenharmony_ci OPENSSL_free(glist); 693e1051a39Sopenharmony_ci return 0; 694e1051a39Sopenharmony_ci} 695e1051a39Sopenharmony_ci 696e1051a39Sopenharmony_ci# define GROUPLIST_INCREMENT 40 697e1051a39Sopenharmony_ci# define GROUP_NAME_BUFFER_LENGTH 64 698e1051a39Sopenharmony_citypedef struct { 699e1051a39Sopenharmony_ci SSL_CTX *ctx; 700e1051a39Sopenharmony_ci size_t gidcnt; 701e1051a39Sopenharmony_ci size_t gidmax; 702e1051a39Sopenharmony_ci uint16_t *gid_arr; 703e1051a39Sopenharmony_ci} gid_cb_st; 704e1051a39Sopenharmony_ci 705e1051a39Sopenharmony_cistatic int gid_cb(const char *elem, int len, void *arg) 706e1051a39Sopenharmony_ci{ 707e1051a39Sopenharmony_ci gid_cb_st *garg = arg; 708e1051a39Sopenharmony_ci size_t i; 709e1051a39Sopenharmony_ci uint16_t gid = 0; 710e1051a39Sopenharmony_ci char etmp[GROUP_NAME_BUFFER_LENGTH]; 711e1051a39Sopenharmony_ci 712e1051a39Sopenharmony_ci if (elem == NULL) 713e1051a39Sopenharmony_ci return 0; 714e1051a39Sopenharmony_ci if (garg->gidcnt == garg->gidmax) { 715e1051a39Sopenharmony_ci uint16_t *tmp = 716e1051a39Sopenharmony_ci OPENSSL_realloc(garg->gid_arr, 717e1051a39Sopenharmony_ci (garg->gidmax + GROUPLIST_INCREMENT) * sizeof(*garg->gid_arr)); 718e1051a39Sopenharmony_ci if (tmp == NULL) 719e1051a39Sopenharmony_ci return 0; 720e1051a39Sopenharmony_ci garg->gidmax += GROUPLIST_INCREMENT; 721e1051a39Sopenharmony_ci garg->gid_arr = tmp; 722e1051a39Sopenharmony_ci } 723e1051a39Sopenharmony_ci if (len > (int)(sizeof(etmp) - 1)) 724e1051a39Sopenharmony_ci return 0; 725e1051a39Sopenharmony_ci memcpy(etmp, elem, len); 726e1051a39Sopenharmony_ci etmp[len] = 0; 727e1051a39Sopenharmony_ci 728e1051a39Sopenharmony_ci gid = tls1_group_name2id(garg->ctx, etmp); 729e1051a39Sopenharmony_ci if (gid == 0) { 730e1051a39Sopenharmony_ci ERR_raise_data(ERR_LIB_SSL, ERR_R_PASSED_INVALID_ARGUMENT, 731e1051a39Sopenharmony_ci "group '%s' cannot be set", etmp); 732e1051a39Sopenharmony_ci return 0; 733e1051a39Sopenharmony_ci } 734e1051a39Sopenharmony_ci for (i = 0; i < garg->gidcnt; i++) 735e1051a39Sopenharmony_ci if (garg->gid_arr[i] == gid) 736e1051a39Sopenharmony_ci return 0; 737e1051a39Sopenharmony_ci garg->gid_arr[garg->gidcnt++] = gid; 738e1051a39Sopenharmony_ci return 1; 739e1051a39Sopenharmony_ci} 740e1051a39Sopenharmony_ci 741e1051a39Sopenharmony_ci/* Set groups based on a colon separated list */ 742e1051a39Sopenharmony_ciint tls1_set_groups_list(SSL_CTX *ctx, uint16_t **pext, size_t *pextlen, 743e1051a39Sopenharmony_ci const char *str) 744e1051a39Sopenharmony_ci{ 745e1051a39Sopenharmony_ci gid_cb_st gcb; 746e1051a39Sopenharmony_ci uint16_t *tmparr; 747e1051a39Sopenharmony_ci int ret = 0; 748e1051a39Sopenharmony_ci 749e1051a39Sopenharmony_ci gcb.gidcnt = 0; 750e1051a39Sopenharmony_ci gcb.gidmax = GROUPLIST_INCREMENT; 751e1051a39Sopenharmony_ci gcb.gid_arr = OPENSSL_malloc(gcb.gidmax * sizeof(*gcb.gid_arr)); 752e1051a39Sopenharmony_ci if (gcb.gid_arr == NULL) 753e1051a39Sopenharmony_ci return 0; 754e1051a39Sopenharmony_ci gcb.ctx = ctx; 755e1051a39Sopenharmony_ci if (!CONF_parse_list(str, ':', 1, gid_cb, &gcb)) 756e1051a39Sopenharmony_ci goto end; 757e1051a39Sopenharmony_ci if (pext == NULL) { 758e1051a39Sopenharmony_ci ret = 1; 759e1051a39Sopenharmony_ci goto end; 760e1051a39Sopenharmony_ci } 761e1051a39Sopenharmony_ci 762e1051a39Sopenharmony_ci /* 763e1051a39Sopenharmony_ci * gid_cb ensurse there are no duplicates so we can just go ahead and set 764e1051a39Sopenharmony_ci * the result 765e1051a39Sopenharmony_ci */ 766e1051a39Sopenharmony_ci tmparr = OPENSSL_memdup(gcb.gid_arr, gcb.gidcnt * sizeof(*tmparr)); 767e1051a39Sopenharmony_ci if (tmparr == NULL) 768e1051a39Sopenharmony_ci goto end; 769e1051a39Sopenharmony_ci OPENSSL_free(*pext); 770e1051a39Sopenharmony_ci *pext = tmparr; 771e1051a39Sopenharmony_ci *pextlen = gcb.gidcnt; 772e1051a39Sopenharmony_ci ret = 1; 773e1051a39Sopenharmony_ci end: 774e1051a39Sopenharmony_ci OPENSSL_free(gcb.gid_arr); 775e1051a39Sopenharmony_ci return ret; 776e1051a39Sopenharmony_ci} 777e1051a39Sopenharmony_ci 778e1051a39Sopenharmony_ci/* Check a group id matches preferences */ 779e1051a39Sopenharmony_ciint tls1_check_group_id(SSL *s, uint16_t group_id, int check_own_groups) 780e1051a39Sopenharmony_ci { 781e1051a39Sopenharmony_ci const uint16_t *groups; 782e1051a39Sopenharmony_ci size_t groups_len; 783e1051a39Sopenharmony_ci 784e1051a39Sopenharmony_ci if (group_id == 0) 785e1051a39Sopenharmony_ci return 0; 786e1051a39Sopenharmony_ci 787e1051a39Sopenharmony_ci /* Check for Suite B compliance */ 788e1051a39Sopenharmony_ci if (tls1_suiteb(s) && s->s3.tmp.new_cipher != NULL) { 789e1051a39Sopenharmony_ci unsigned long cid = s->s3.tmp.new_cipher->id; 790e1051a39Sopenharmony_ci 791e1051a39Sopenharmony_ci if (cid == TLS1_CK_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256) { 792e1051a39Sopenharmony_ci if (group_id != TLSEXT_curve_P_256) 793e1051a39Sopenharmony_ci return 0; 794e1051a39Sopenharmony_ci } else if (cid == TLS1_CK_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384) { 795e1051a39Sopenharmony_ci if (group_id != TLSEXT_curve_P_384) 796e1051a39Sopenharmony_ci return 0; 797e1051a39Sopenharmony_ci } else { 798e1051a39Sopenharmony_ci /* Should never happen */ 799e1051a39Sopenharmony_ci return 0; 800e1051a39Sopenharmony_ci } 801e1051a39Sopenharmony_ci } 802e1051a39Sopenharmony_ci 803e1051a39Sopenharmony_ci if (check_own_groups) { 804e1051a39Sopenharmony_ci /* Check group is one of our preferences */ 805e1051a39Sopenharmony_ci tls1_get_supported_groups(s, &groups, &groups_len); 806e1051a39Sopenharmony_ci if (!tls1_in_list(group_id, groups, groups_len)) 807e1051a39Sopenharmony_ci return 0; 808e1051a39Sopenharmony_ci } 809e1051a39Sopenharmony_ci 810e1051a39Sopenharmony_ci if (!tls_group_allowed(s, group_id, SSL_SECOP_CURVE_CHECK)) 811e1051a39Sopenharmony_ci return 0; 812e1051a39Sopenharmony_ci 813e1051a39Sopenharmony_ci /* For clients, nothing more to check */ 814e1051a39Sopenharmony_ci if (!s->server) 815e1051a39Sopenharmony_ci return 1; 816e1051a39Sopenharmony_ci 817e1051a39Sopenharmony_ci /* Check group is one of peers preferences */ 818e1051a39Sopenharmony_ci tls1_get_peer_groups(s, &groups, &groups_len); 819e1051a39Sopenharmony_ci 820e1051a39Sopenharmony_ci /* 821e1051a39Sopenharmony_ci * RFC 4492 does not require the supported elliptic curves extension 822e1051a39Sopenharmony_ci * so if it is not sent we can just choose any curve. 823e1051a39Sopenharmony_ci * It is invalid to send an empty list in the supported groups 824e1051a39Sopenharmony_ci * extension, so groups_len == 0 always means no extension. 825e1051a39Sopenharmony_ci */ 826e1051a39Sopenharmony_ci if (groups_len == 0) 827e1051a39Sopenharmony_ci return 1; 828e1051a39Sopenharmony_ci return tls1_in_list(group_id, groups, groups_len); 829e1051a39Sopenharmony_ci} 830e1051a39Sopenharmony_ci 831e1051a39Sopenharmony_civoid tls1_get_formatlist(SSL *s, const unsigned char **pformats, 832e1051a39Sopenharmony_ci size_t *num_formats) 833e1051a39Sopenharmony_ci{ 834e1051a39Sopenharmony_ci /* 835e1051a39Sopenharmony_ci * If we have a custom point format list use it otherwise use default 836e1051a39Sopenharmony_ci */ 837e1051a39Sopenharmony_ci if (s->ext.ecpointformats) { 838e1051a39Sopenharmony_ci *pformats = s->ext.ecpointformats; 839e1051a39Sopenharmony_ci *num_formats = s->ext.ecpointformats_len; 840e1051a39Sopenharmony_ci } else { 841e1051a39Sopenharmony_ci *pformats = ecformats_default; 842e1051a39Sopenharmony_ci /* For Suite B we don't support char2 fields */ 843e1051a39Sopenharmony_ci if (tls1_suiteb(s)) 844e1051a39Sopenharmony_ci *num_formats = sizeof(ecformats_default) - 1; 845e1051a39Sopenharmony_ci else 846e1051a39Sopenharmony_ci *num_formats = sizeof(ecformats_default); 847e1051a39Sopenharmony_ci } 848e1051a39Sopenharmony_ci} 849e1051a39Sopenharmony_ci 850e1051a39Sopenharmony_ci/* Check a key is compatible with compression extension */ 851e1051a39Sopenharmony_cistatic int tls1_check_pkey_comp(SSL *s, EVP_PKEY *pkey) 852e1051a39Sopenharmony_ci{ 853e1051a39Sopenharmony_ci unsigned char comp_id; 854e1051a39Sopenharmony_ci size_t i; 855e1051a39Sopenharmony_ci int point_conv; 856e1051a39Sopenharmony_ci 857e1051a39Sopenharmony_ci /* If not an EC key nothing to check */ 858e1051a39Sopenharmony_ci if (!EVP_PKEY_is_a(pkey, "EC")) 859e1051a39Sopenharmony_ci return 1; 860e1051a39Sopenharmony_ci 861e1051a39Sopenharmony_ci 862e1051a39Sopenharmony_ci /* Get required compression id */ 863e1051a39Sopenharmony_ci point_conv = EVP_PKEY_get_ec_point_conv_form(pkey); 864e1051a39Sopenharmony_ci if (point_conv == 0) 865e1051a39Sopenharmony_ci return 0; 866e1051a39Sopenharmony_ci if (point_conv == POINT_CONVERSION_UNCOMPRESSED) { 867e1051a39Sopenharmony_ci comp_id = TLSEXT_ECPOINTFORMAT_uncompressed; 868e1051a39Sopenharmony_ci } else if (SSL_IS_TLS13(s)) { 869e1051a39Sopenharmony_ci /* 870e1051a39Sopenharmony_ci * ec_point_formats extension is not used in TLSv1.3 so we ignore 871e1051a39Sopenharmony_ci * this check. 872e1051a39Sopenharmony_ci */ 873e1051a39Sopenharmony_ci return 1; 874e1051a39Sopenharmony_ci } else { 875e1051a39Sopenharmony_ci int field_type = EVP_PKEY_get_field_type(pkey); 876e1051a39Sopenharmony_ci 877e1051a39Sopenharmony_ci if (field_type == NID_X9_62_prime_field) 878e1051a39Sopenharmony_ci comp_id = TLSEXT_ECPOINTFORMAT_ansiX962_compressed_prime; 879e1051a39Sopenharmony_ci else if (field_type == NID_X9_62_characteristic_two_field) 880e1051a39Sopenharmony_ci comp_id = TLSEXT_ECPOINTFORMAT_ansiX962_compressed_char2; 881e1051a39Sopenharmony_ci else 882e1051a39Sopenharmony_ci return 0; 883e1051a39Sopenharmony_ci } 884e1051a39Sopenharmony_ci /* 885e1051a39Sopenharmony_ci * If point formats extension present check it, otherwise everything is 886e1051a39Sopenharmony_ci * supported (see RFC4492). 887e1051a39Sopenharmony_ci */ 888e1051a39Sopenharmony_ci if (s->ext.peer_ecpointformats == NULL) 889e1051a39Sopenharmony_ci return 1; 890e1051a39Sopenharmony_ci 891e1051a39Sopenharmony_ci for (i = 0; i < s->ext.peer_ecpointformats_len; i++) { 892e1051a39Sopenharmony_ci if (s->ext.peer_ecpointformats[i] == comp_id) 893e1051a39Sopenharmony_ci return 1; 894e1051a39Sopenharmony_ci } 895e1051a39Sopenharmony_ci return 0; 896e1051a39Sopenharmony_ci} 897e1051a39Sopenharmony_ci 898e1051a39Sopenharmony_ci/* Return group id of a key */ 899e1051a39Sopenharmony_cistatic uint16_t tls1_get_group_id(EVP_PKEY *pkey) 900e1051a39Sopenharmony_ci{ 901e1051a39Sopenharmony_ci int curve_nid = ssl_get_EC_curve_nid(pkey); 902e1051a39Sopenharmony_ci 903e1051a39Sopenharmony_ci if (curve_nid == NID_undef) 904e1051a39Sopenharmony_ci return 0; 905e1051a39Sopenharmony_ci return tls1_nid2group_id(curve_nid); 906e1051a39Sopenharmony_ci} 907e1051a39Sopenharmony_ci 908e1051a39Sopenharmony_ci/* 909e1051a39Sopenharmony_ci * Check cert parameters compatible with extensions: currently just checks EC 910e1051a39Sopenharmony_ci * certificates have compatible curves and compression. 911e1051a39Sopenharmony_ci */ 912e1051a39Sopenharmony_cistatic int tls1_check_cert_param(SSL *s, X509 *x, int check_ee_md) 913e1051a39Sopenharmony_ci{ 914e1051a39Sopenharmony_ci uint16_t group_id; 915e1051a39Sopenharmony_ci EVP_PKEY *pkey; 916e1051a39Sopenharmony_ci pkey = X509_get0_pubkey(x); 917e1051a39Sopenharmony_ci if (pkey == NULL) 918e1051a39Sopenharmony_ci return 0; 919e1051a39Sopenharmony_ci /* If not EC nothing to do */ 920e1051a39Sopenharmony_ci if (!EVP_PKEY_is_a(pkey, "EC")) 921e1051a39Sopenharmony_ci return 1; 922e1051a39Sopenharmony_ci /* Check compression */ 923e1051a39Sopenharmony_ci if (!tls1_check_pkey_comp(s, pkey)) 924e1051a39Sopenharmony_ci return 0; 925e1051a39Sopenharmony_ci group_id = tls1_get_group_id(pkey); 926e1051a39Sopenharmony_ci /* 927e1051a39Sopenharmony_ci * For a server we allow the certificate to not be in our list of supported 928e1051a39Sopenharmony_ci * groups. 929e1051a39Sopenharmony_ci */ 930e1051a39Sopenharmony_ci if (!tls1_check_group_id(s, group_id, !s->server)) 931e1051a39Sopenharmony_ci return 0; 932e1051a39Sopenharmony_ci /* 933e1051a39Sopenharmony_ci * Special case for suite B. We *MUST* sign using SHA256+P-256 or 934e1051a39Sopenharmony_ci * SHA384+P-384. 935e1051a39Sopenharmony_ci */ 936e1051a39Sopenharmony_ci if (check_ee_md && tls1_suiteb(s)) { 937e1051a39Sopenharmony_ci int check_md; 938e1051a39Sopenharmony_ci size_t i; 939e1051a39Sopenharmony_ci 940e1051a39Sopenharmony_ci /* Check to see we have necessary signing algorithm */ 941e1051a39Sopenharmony_ci if (group_id == TLSEXT_curve_P_256) 942e1051a39Sopenharmony_ci check_md = NID_ecdsa_with_SHA256; 943e1051a39Sopenharmony_ci else if (group_id == TLSEXT_curve_P_384) 944e1051a39Sopenharmony_ci check_md = NID_ecdsa_with_SHA384; 945e1051a39Sopenharmony_ci else 946e1051a39Sopenharmony_ci return 0; /* Should never happen */ 947e1051a39Sopenharmony_ci for (i = 0; i < s->shared_sigalgslen; i++) { 948e1051a39Sopenharmony_ci if (check_md == s->shared_sigalgs[i]->sigandhash) 949e1051a39Sopenharmony_ci return 1;; 950e1051a39Sopenharmony_ci } 951e1051a39Sopenharmony_ci return 0; 952e1051a39Sopenharmony_ci } 953e1051a39Sopenharmony_ci return 1; 954e1051a39Sopenharmony_ci} 955e1051a39Sopenharmony_ci 956e1051a39Sopenharmony_ci/* 957e1051a39Sopenharmony_ci * tls1_check_ec_tmp_key - Check EC temporary key compatibility 958e1051a39Sopenharmony_ci * @s: SSL connection 959e1051a39Sopenharmony_ci * @cid: Cipher ID we're considering using 960e1051a39Sopenharmony_ci * 961e1051a39Sopenharmony_ci * Checks that the kECDHE cipher suite we're considering using 962e1051a39Sopenharmony_ci * is compatible with the client extensions. 963e1051a39Sopenharmony_ci * 964e1051a39Sopenharmony_ci * Returns 0 when the cipher can't be used or 1 when it can. 965e1051a39Sopenharmony_ci */ 966e1051a39Sopenharmony_ciint tls1_check_ec_tmp_key(SSL *s, unsigned long cid) 967e1051a39Sopenharmony_ci{ 968e1051a39Sopenharmony_ci /* If not Suite B just need a shared group */ 969e1051a39Sopenharmony_ci if (!tls1_suiteb(s)) 970e1051a39Sopenharmony_ci return tls1_shared_group(s, 0) != 0; 971e1051a39Sopenharmony_ci /* 972e1051a39Sopenharmony_ci * If Suite B, AES128 MUST use P-256 and AES256 MUST use P-384, no other 973e1051a39Sopenharmony_ci * curves permitted. 974e1051a39Sopenharmony_ci */ 975e1051a39Sopenharmony_ci if (cid == TLS1_CK_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256) 976e1051a39Sopenharmony_ci return tls1_check_group_id(s, TLSEXT_curve_P_256, 1); 977e1051a39Sopenharmony_ci if (cid == TLS1_CK_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384) 978e1051a39Sopenharmony_ci return tls1_check_group_id(s, TLSEXT_curve_P_384, 1); 979e1051a39Sopenharmony_ci 980e1051a39Sopenharmony_ci return 0; 981e1051a39Sopenharmony_ci} 982e1051a39Sopenharmony_ci 983e1051a39Sopenharmony_ci/* Default sigalg schemes */ 984e1051a39Sopenharmony_cistatic const uint16_t tls12_sigalgs[] = { 985e1051a39Sopenharmony_ci TLSEXT_SIGALG_ecdsa_secp256r1_sha256, 986e1051a39Sopenharmony_ci TLSEXT_SIGALG_ecdsa_secp384r1_sha384, 987e1051a39Sopenharmony_ci TLSEXT_SIGALG_ecdsa_secp521r1_sha512, 988e1051a39Sopenharmony_ci TLSEXT_SIGALG_ed25519, 989e1051a39Sopenharmony_ci TLSEXT_SIGALG_ed448, 990e1051a39Sopenharmony_ci 991e1051a39Sopenharmony_ci TLSEXT_SIGALG_rsa_pss_pss_sha256, 992e1051a39Sopenharmony_ci TLSEXT_SIGALG_rsa_pss_pss_sha384, 993e1051a39Sopenharmony_ci TLSEXT_SIGALG_rsa_pss_pss_sha512, 994e1051a39Sopenharmony_ci TLSEXT_SIGALG_rsa_pss_rsae_sha256, 995e1051a39Sopenharmony_ci TLSEXT_SIGALG_rsa_pss_rsae_sha384, 996e1051a39Sopenharmony_ci TLSEXT_SIGALG_rsa_pss_rsae_sha512, 997e1051a39Sopenharmony_ci 998e1051a39Sopenharmony_ci TLSEXT_SIGALG_rsa_pkcs1_sha256, 999e1051a39Sopenharmony_ci TLSEXT_SIGALG_rsa_pkcs1_sha384, 1000e1051a39Sopenharmony_ci TLSEXT_SIGALG_rsa_pkcs1_sha512, 1001e1051a39Sopenharmony_ci 1002e1051a39Sopenharmony_ci TLSEXT_SIGALG_ecdsa_sha224, 1003e1051a39Sopenharmony_ci TLSEXT_SIGALG_ecdsa_sha1, 1004e1051a39Sopenharmony_ci 1005e1051a39Sopenharmony_ci TLSEXT_SIGALG_rsa_pkcs1_sha224, 1006e1051a39Sopenharmony_ci TLSEXT_SIGALG_rsa_pkcs1_sha1, 1007e1051a39Sopenharmony_ci 1008e1051a39Sopenharmony_ci TLSEXT_SIGALG_dsa_sha224, 1009e1051a39Sopenharmony_ci TLSEXT_SIGALG_dsa_sha1, 1010e1051a39Sopenharmony_ci 1011e1051a39Sopenharmony_ci TLSEXT_SIGALG_dsa_sha256, 1012e1051a39Sopenharmony_ci TLSEXT_SIGALG_dsa_sha384, 1013e1051a39Sopenharmony_ci TLSEXT_SIGALG_dsa_sha512, 1014e1051a39Sopenharmony_ci 1015e1051a39Sopenharmony_ci#ifndef OPENSSL_NO_GOST 1016e1051a39Sopenharmony_ci TLSEXT_SIGALG_gostr34102012_256_intrinsic, 1017e1051a39Sopenharmony_ci TLSEXT_SIGALG_gostr34102012_512_intrinsic, 1018e1051a39Sopenharmony_ci TLSEXT_SIGALG_gostr34102012_256_gostr34112012_256, 1019e1051a39Sopenharmony_ci TLSEXT_SIGALG_gostr34102012_512_gostr34112012_512, 1020e1051a39Sopenharmony_ci TLSEXT_SIGALG_gostr34102001_gostr3411, 1021e1051a39Sopenharmony_ci#endif 1022e1051a39Sopenharmony_ci}; 1023e1051a39Sopenharmony_ci 1024e1051a39Sopenharmony_ci 1025e1051a39Sopenharmony_cistatic const uint16_t suiteb_sigalgs[] = { 1026e1051a39Sopenharmony_ci TLSEXT_SIGALG_ecdsa_secp256r1_sha256, 1027e1051a39Sopenharmony_ci TLSEXT_SIGALG_ecdsa_secp384r1_sha384 1028e1051a39Sopenharmony_ci}; 1029e1051a39Sopenharmony_ci 1030e1051a39Sopenharmony_cistatic const SIGALG_LOOKUP sigalg_lookup_tbl[] = { 1031e1051a39Sopenharmony_ci {"ecdsa_secp256r1_sha256", TLSEXT_SIGALG_ecdsa_secp256r1_sha256, 1032e1051a39Sopenharmony_ci NID_sha256, SSL_MD_SHA256_IDX, EVP_PKEY_EC, SSL_PKEY_ECC, 1033e1051a39Sopenharmony_ci NID_ecdsa_with_SHA256, NID_X9_62_prime256v1, 1}, 1034e1051a39Sopenharmony_ci {"ecdsa_secp384r1_sha384", TLSEXT_SIGALG_ecdsa_secp384r1_sha384, 1035e1051a39Sopenharmony_ci NID_sha384, SSL_MD_SHA384_IDX, EVP_PKEY_EC, SSL_PKEY_ECC, 1036e1051a39Sopenharmony_ci NID_ecdsa_with_SHA384, NID_secp384r1, 1}, 1037e1051a39Sopenharmony_ci {"ecdsa_secp521r1_sha512", TLSEXT_SIGALG_ecdsa_secp521r1_sha512, 1038e1051a39Sopenharmony_ci NID_sha512, SSL_MD_SHA512_IDX, EVP_PKEY_EC, SSL_PKEY_ECC, 1039e1051a39Sopenharmony_ci NID_ecdsa_with_SHA512, NID_secp521r1, 1}, 1040e1051a39Sopenharmony_ci {"ed25519", TLSEXT_SIGALG_ed25519, 1041e1051a39Sopenharmony_ci NID_undef, -1, EVP_PKEY_ED25519, SSL_PKEY_ED25519, 1042e1051a39Sopenharmony_ci NID_undef, NID_undef, 1}, 1043e1051a39Sopenharmony_ci {"ed448", TLSEXT_SIGALG_ed448, 1044e1051a39Sopenharmony_ci NID_undef, -1, EVP_PKEY_ED448, SSL_PKEY_ED448, 1045e1051a39Sopenharmony_ci NID_undef, NID_undef, 1}, 1046e1051a39Sopenharmony_ci {NULL, TLSEXT_SIGALG_ecdsa_sha224, 1047e1051a39Sopenharmony_ci NID_sha224, SSL_MD_SHA224_IDX, EVP_PKEY_EC, SSL_PKEY_ECC, 1048e1051a39Sopenharmony_ci NID_ecdsa_with_SHA224, NID_undef, 1}, 1049e1051a39Sopenharmony_ci {NULL, TLSEXT_SIGALG_ecdsa_sha1, 1050e1051a39Sopenharmony_ci NID_sha1, SSL_MD_SHA1_IDX, EVP_PKEY_EC, SSL_PKEY_ECC, 1051e1051a39Sopenharmony_ci NID_ecdsa_with_SHA1, NID_undef, 1}, 1052e1051a39Sopenharmony_ci {"rsa_pss_rsae_sha256", TLSEXT_SIGALG_rsa_pss_rsae_sha256, 1053e1051a39Sopenharmony_ci NID_sha256, SSL_MD_SHA256_IDX, EVP_PKEY_RSA_PSS, SSL_PKEY_RSA, 1054e1051a39Sopenharmony_ci NID_undef, NID_undef, 1}, 1055e1051a39Sopenharmony_ci {"rsa_pss_rsae_sha384", TLSEXT_SIGALG_rsa_pss_rsae_sha384, 1056e1051a39Sopenharmony_ci NID_sha384, SSL_MD_SHA384_IDX, EVP_PKEY_RSA_PSS, SSL_PKEY_RSA, 1057e1051a39Sopenharmony_ci NID_undef, NID_undef, 1}, 1058e1051a39Sopenharmony_ci {"rsa_pss_rsae_sha512", TLSEXT_SIGALG_rsa_pss_rsae_sha512, 1059e1051a39Sopenharmony_ci NID_sha512, SSL_MD_SHA512_IDX, EVP_PKEY_RSA_PSS, SSL_PKEY_RSA, 1060e1051a39Sopenharmony_ci NID_undef, NID_undef, 1}, 1061e1051a39Sopenharmony_ci {"rsa_pss_pss_sha256", TLSEXT_SIGALG_rsa_pss_pss_sha256, 1062e1051a39Sopenharmony_ci NID_sha256, SSL_MD_SHA256_IDX, EVP_PKEY_RSA_PSS, SSL_PKEY_RSA_PSS_SIGN, 1063e1051a39Sopenharmony_ci NID_undef, NID_undef, 1}, 1064e1051a39Sopenharmony_ci {"rsa_pss_pss_sha384", TLSEXT_SIGALG_rsa_pss_pss_sha384, 1065e1051a39Sopenharmony_ci NID_sha384, SSL_MD_SHA384_IDX, EVP_PKEY_RSA_PSS, SSL_PKEY_RSA_PSS_SIGN, 1066e1051a39Sopenharmony_ci NID_undef, NID_undef, 1}, 1067e1051a39Sopenharmony_ci {"rsa_pss_pss_sha512", TLSEXT_SIGALG_rsa_pss_pss_sha512, 1068e1051a39Sopenharmony_ci NID_sha512, SSL_MD_SHA512_IDX, EVP_PKEY_RSA_PSS, SSL_PKEY_RSA_PSS_SIGN, 1069e1051a39Sopenharmony_ci NID_undef, NID_undef, 1}, 1070e1051a39Sopenharmony_ci {"rsa_pkcs1_sha256", TLSEXT_SIGALG_rsa_pkcs1_sha256, 1071e1051a39Sopenharmony_ci NID_sha256, SSL_MD_SHA256_IDX, EVP_PKEY_RSA, SSL_PKEY_RSA, 1072e1051a39Sopenharmony_ci NID_sha256WithRSAEncryption, NID_undef, 1}, 1073e1051a39Sopenharmony_ci {"rsa_pkcs1_sha384", TLSEXT_SIGALG_rsa_pkcs1_sha384, 1074e1051a39Sopenharmony_ci NID_sha384, SSL_MD_SHA384_IDX, EVP_PKEY_RSA, SSL_PKEY_RSA, 1075e1051a39Sopenharmony_ci NID_sha384WithRSAEncryption, NID_undef, 1}, 1076e1051a39Sopenharmony_ci {"rsa_pkcs1_sha512", TLSEXT_SIGALG_rsa_pkcs1_sha512, 1077e1051a39Sopenharmony_ci NID_sha512, SSL_MD_SHA512_IDX, EVP_PKEY_RSA, SSL_PKEY_RSA, 1078e1051a39Sopenharmony_ci NID_sha512WithRSAEncryption, NID_undef, 1}, 1079e1051a39Sopenharmony_ci {"rsa_pkcs1_sha224", TLSEXT_SIGALG_rsa_pkcs1_sha224, 1080e1051a39Sopenharmony_ci NID_sha224, SSL_MD_SHA224_IDX, EVP_PKEY_RSA, SSL_PKEY_RSA, 1081e1051a39Sopenharmony_ci NID_sha224WithRSAEncryption, NID_undef, 1}, 1082e1051a39Sopenharmony_ci {"rsa_pkcs1_sha1", TLSEXT_SIGALG_rsa_pkcs1_sha1, 1083e1051a39Sopenharmony_ci NID_sha1, SSL_MD_SHA1_IDX, EVP_PKEY_RSA, SSL_PKEY_RSA, 1084e1051a39Sopenharmony_ci NID_sha1WithRSAEncryption, NID_undef, 1}, 1085e1051a39Sopenharmony_ci {NULL, TLSEXT_SIGALG_dsa_sha256, 1086e1051a39Sopenharmony_ci NID_sha256, SSL_MD_SHA256_IDX, EVP_PKEY_DSA, SSL_PKEY_DSA_SIGN, 1087e1051a39Sopenharmony_ci NID_dsa_with_SHA256, NID_undef, 1}, 1088e1051a39Sopenharmony_ci {NULL, TLSEXT_SIGALG_dsa_sha384, 1089e1051a39Sopenharmony_ci NID_sha384, SSL_MD_SHA384_IDX, EVP_PKEY_DSA, SSL_PKEY_DSA_SIGN, 1090e1051a39Sopenharmony_ci NID_undef, NID_undef, 1}, 1091e1051a39Sopenharmony_ci {NULL, TLSEXT_SIGALG_dsa_sha512, 1092e1051a39Sopenharmony_ci NID_sha512, SSL_MD_SHA512_IDX, EVP_PKEY_DSA, SSL_PKEY_DSA_SIGN, 1093e1051a39Sopenharmony_ci NID_undef, NID_undef, 1}, 1094e1051a39Sopenharmony_ci {NULL, TLSEXT_SIGALG_dsa_sha224, 1095e1051a39Sopenharmony_ci NID_sha224, SSL_MD_SHA224_IDX, EVP_PKEY_DSA, SSL_PKEY_DSA_SIGN, 1096e1051a39Sopenharmony_ci NID_undef, NID_undef, 1}, 1097e1051a39Sopenharmony_ci {NULL, TLSEXT_SIGALG_dsa_sha1, 1098e1051a39Sopenharmony_ci NID_sha1, SSL_MD_SHA1_IDX, EVP_PKEY_DSA, SSL_PKEY_DSA_SIGN, 1099e1051a39Sopenharmony_ci NID_dsaWithSHA1, NID_undef, 1}, 1100e1051a39Sopenharmony_ci#ifndef OPENSSL_NO_GOST 1101e1051a39Sopenharmony_ci {NULL, TLSEXT_SIGALG_gostr34102012_256_intrinsic, 1102e1051a39Sopenharmony_ci NID_id_GostR3411_2012_256, SSL_MD_GOST12_256_IDX, 1103e1051a39Sopenharmony_ci NID_id_GostR3410_2012_256, SSL_PKEY_GOST12_256, 1104e1051a39Sopenharmony_ci NID_undef, NID_undef, 1}, 1105e1051a39Sopenharmony_ci {NULL, TLSEXT_SIGALG_gostr34102012_512_intrinsic, 1106e1051a39Sopenharmony_ci NID_id_GostR3411_2012_512, SSL_MD_GOST12_512_IDX, 1107e1051a39Sopenharmony_ci NID_id_GostR3410_2012_512, SSL_PKEY_GOST12_512, 1108e1051a39Sopenharmony_ci NID_undef, NID_undef, 1}, 1109e1051a39Sopenharmony_ci {NULL, TLSEXT_SIGALG_gostr34102012_256_gostr34112012_256, 1110e1051a39Sopenharmony_ci NID_id_GostR3411_2012_256, SSL_MD_GOST12_256_IDX, 1111e1051a39Sopenharmony_ci NID_id_GostR3410_2012_256, SSL_PKEY_GOST12_256, 1112e1051a39Sopenharmony_ci NID_undef, NID_undef, 1}, 1113e1051a39Sopenharmony_ci {NULL, TLSEXT_SIGALG_gostr34102012_512_gostr34112012_512, 1114e1051a39Sopenharmony_ci NID_id_GostR3411_2012_512, SSL_MD_GOST12_512_IDX, 1115e1051a39Sopenharmony_ci NID_id_GostR3410_2012_512, SSL_PKEY_GOST12_512, 1116e1051a39Sopenharmony_ci NID_undef, NID_undef, 1}, 1117e1051a39Sopenharmony_ci {NULL, TLSEXT_SIGALG_gostr34102001_gostr3411, 1118e1051a39Sopenharmony_ci NID_id_GostR3411_94, SSL_MD_GOST94_IDX, 1119e1051a39Sopenharmony_ci NID_id_GostR3410_2001, SSL_PKEY_GOST01, 1120e1051a39Sopenharmony_ci NID_undef, NID_undef, 1} 1121e1051a39Sopenharmony_ci#endif 1122e1051a39Sopenharmony_ci}; 1123e1051a39Sopenharmony_ci/* Legacy sigalgs for TLS < 1.2 RSA TLS signatures */ 1124e1051a39Sopenharmony_cistatic const SIGALG_LOOKUP legacy_rsa_sigalg = { 1125e1051a39Sopenharmony_ci "rsa_pkcs1_md5_sha1", 0, 1126e1051a39Sopenharmony_ci NID_md5_sha1, SSL_MD_MD5_SHA1_IDX, 1127e1051a39Sopenharmony_ci EVP_PKEY_RSA, SSL_PKEY_RSA, 1128e1051a39Sopenharmony_ci NID_undef, NID_undef, 1 1129e1051a39Sopenharmony_ci}; 1130e1051a39Sopenharmony_ci 1131e1051a39Sopenharmony_ci/* 1132e1051a39Sopenharmony_ci * Default signature algorithm values used if signature algorithms not present. 1133e1051a39Sopenharmony_ci * From RFC5246. Note: order must match certificate index order. 1134e1051a39Sopenharmony_ci */ 1135e1051a39Sopenharmony_cistatic const uint16_t tls_default_sigalg[] = { 1136e1051a39Sopenharmony_ci TLSEXT_SIGALG_rsa_pkcs1_sha1, /* SSL_PKEY_RSA */ 1137e1051a39Sopenharmony_ci 0, /* SSL_PKEY_RSA_PSS_SIGN */ 1138e1051a39Sopenharmony_ci TLSEXT_SIGALG_dsa_sha1, /* SSL_PKEY_DSA_SIGN */ 1139e1051a39Sopenharmony_ci TLSEXT_SIGALG_ecdsa_sha1, /* SSL_PKEY_ECC */ 1140e1051a39Sopenharmony_ci TLSEXT_SIGALG_gostr34102001_gostr3411, /* SSL_PKEY_GOST01 */ 1141e1051a39Sopenharmony_ci TLSEXT_SIGALG_gostr34102012_256_intrinsic, /* SSL_PKEY_GOST12_256 */ 1142e1051a39Sopenharmony_ci TLSEXT_SIGALG_gostr34102012_512_intrinsic, /* SSL_PKEY_GOST12_512 */ 1143e1051a39Sopenharmony_ci 0, /* SSL_PKEY_ED25519 */ 1144e1051a39Sopenharmony_ci 0, /* SSL_PKEY_ED448 */ 1145e1051a39Sopenharmony_ci}; 1146e1051a39Sopenharmony_ci 1147e1051a39Sopenharmony_ciint ssl_setup_sig_algs(SSL_CTX *ctx) 1148e1051a39Sopenharmony_ci{ 1149e1051a39Sopenharmony_ci size_t i; 1150e1051a39Sopenharmony_ci const SIGALG_LOOKUP *lu; 1151e1051a39Sopenharmony_ci SIGALG_LOOKUP *cache 1152e1051a39Sopenharmony_ci = OPENSSL_malloc(sizeof(*lu) * OSSL_NELEM(sigalg_lookup_tbl)); 1153e1051a39Sopenharmony_ci EVP_PKEY *tmpkey = EVP_PKEY_new(); 1154e1051a39Sopenharmony_ci int ret = 0; 1155e1051a39Sopenharmony_ci 1156e1051a39Sopenharmony_ci if (cache == NULL || tmpkey == NULL) 1157e1051a39Sopenharmony_ci goto err; 1158e1051a39Sopenharmony_ci 1159e1051a39Sopenharmony_ci ERR_set_mark(); 1160e1051a39Sopenharmony_ci for (i = 0, lu = sigalg_lookup_tbl; 1161e1051a39Sopenharmony_ci i < OSSL_NELEM(sigalg_lookup_tbl); lu++, i++) { 1162e1051a39Sopenharmony_ci EVP_PKEY_CTX *pctx; 1163e1051a39Sopenharmony_ci 1164e1051a39Sopenharmony_ci cache[i] = *lu; 1165e1051a39Sopenharmony_ci 1166e1051a39Sopenharmony_ci /* 1167e1051a39Sopenharmony_ci * Check hash is available. 1168e1051a39Sopenharmony_ci * This test is not perfect. A provider could have support 1169e1051a39Sopenharmony_ci * for a signature scheme, but not a particular hash. However the hash 1170e1051a39Sopenharmony_ci * could be available from some other loaded provider. In that case it 1171e1051a39Sopenharmony_ci * could be that the signature is available, and the hash is available 1172e1051a39Sopenharmony_ci * independently - but not as a combination. We ignore this for now. 1173e1051a39Sopenharmony_ci */ 1174e1051a39Sopenharmony_ci if (lu->hash != NID_undef 1175e1051a39Sopenharmony_ci && ctx->ssl_digest_methods[lu->hash_idx] == NULL) { 1176e1051a39Sopenharmony_ci cache[i].enabled = 0; 1177e1051a39Sopenharmony_ci continue; 1178e1051a39Sopenharmony_ci } 1179e1051a39Sopenharmony_ci 1180e1051a39Sopenharmony_ci if (!EVP_PKEY_set_type(tmpkey, lu->sig)) { 1181e1051a39Sopenharmony_ci cache[i].enabled = 0; 1182e1051a39Sopenharmony_ci continue; 1183e1051a39Sopenharmony_ci } 1184e1051a39Sopenharmony_ci pctx = EVP_PKEY_CTX_new_from_pkey(ctx->libctx, tmpkey, ctx->propq); 1185e1051a39Sopenharmony_ci /* If unable to create pctx we assume the sig algorithm is unavailable */ 1186e1051a39Sopenharmony_ci if (pctx == NULL) 1187e1051a39Sopenharmony_ci cache[i].enabled = 0; 1188e1051a39Sopenharmony_ci EVP_PKEY_CTX_free(pctx); 1189e1051a39Sopenharmony_ci } 1190e1051a39Sopenharmony_ci ERR_pop_to_mark(); 1191e1051a39Sopenharmony_ci ctx->sigalg_lookup_cache = cache; 1192e1051a39Sopenharmony_ci cache = NULL; 1193e1051a39Sopenharmony_ci 1194e1051a39Sopenharmony_ci ret = 1; 1195e1051a39Sopenharmony_ci err: 1196e1051a39Sopenharmony_ci OPENSSL_free(cache); 1197e1051a39Sopenharmony_ci EVP_PKEY_free(tmpkey); 1198e1051a39Sopenharmony_ci return ret; 1199e1051a39Sopenharmony_ci} 1200e1051a39Sopenharmony_ci 1201e1051a39Sopenharmony_ci/* Lookup TLS signature algorithm */ 1202e1051a39Sopenharmony_cistatic const SIGALG_LOOKUP *tls1_lookup_sigalg(const SSL *s, uint16_t sigalg) 1203e1051a39Sopenharmony_ci{ 1204e1051a39Sopenharmony_ci size_t i; 1205e1051a39Sopenharmony_ci const SIGALG_LOOKUP *lu; 1206e1051a39Sopenharmony_ci 1207e1051a39Sopenharmony_ci for (i = 0, lu = s->ctx->sigalg_lookup_cache; 1208e1051a39Sopenharmony_ci /* cache should have the same number of elements as sigalg_lookup_tbl */ 1209e1051a39Sopenharmony_ci i < OSSL_NELEM(sigalg_lookup_tbl); 1210e1051a39Sopenharmony_ci lu++, i++) { 1211e1051a39Sopenharmony_ci if (lu->sigalg == sigalg) { 1212e1051a39Sopenharmony_ci if (!lu->enabled) 1213e1051a39Sopenharmony_ci return NULL; 1214e1051a39Sopenharmony_ci return lu; 1215e1051a39Sopenharmony_ci } 1216e1051a39Sopenharmony_ci } 1217e1051a39Sopenharmony_ci return NULL; 1218e1051a39Sopenharmony_ci} 1219e1051a39Sopenharmony_ci/* Lookup hash: return 0 if invalid or not enabled */ 1220e1051a39Sopenharmony_ciint tls1_lookup_md(SSL_CTX *ctx, const SIGALG_LOOKUP *lu, const EVP_MD **pmd) 1221e1051a39Sopenharmony_ci{ 1222e1051a39Sopenharmony_ci const EVP_MD *md; 1223e1051a39Sopenharmony_ci if (lu == NULL) 1224e1051a39Sopenharmony_ci return 0; 1225e1051a39Sopenharmony_ci /* lu->hash == NID_undef means no associated digest */ 1226e1051a39Sopenharmony_ci if (lu->hash == NID_undef) { 1227e1051a39Sopenharmony_ci md = NULL; 1228e1051a39Sopenharmony_ci } else { 1229e1051a39Sopenharmony_ci md = ssl_md(ctx, lu->hash_idx); 1230e1051a39Sopenharmony_ci if (md == NULL) 1231e1051a39Sopenharmony_ci return 0; 1232e1051a39Sopenharmony_ci } 1233e1051a39Sopenharmony_ci if (pmd) 1234e1051a39Sopenharmony_ci *pmd = md; 1235e1051a39Sopenharmony_ci return 1; 1236e1051a39Sopenharmony_ci} 1237e1051a39Sopenharmony_ci 1238e1051a39Sopenharmony_ci/* 1239e1051a39Sopenharmony_ci * Check if key is large enough to generate RSA-PSS signature. 1240e1051a39Sopenharmony_ci * 1241e1051a39Sopenharmony_ci * The key must greater than or equal to 2 * hash length + 2. 1242e1051a39Sopenharmony_ci * SHA512 has a hash length of 64 bytes, which is incompatible 1243e1051a39Sopenharmony_ci * with a 128 byte (1024 bit) key. 1244e1051a39Sopenharmony_ci */ 1245e1051a39Sopenharmony_ci#define RSA_PSS_MINIMUM_KEY_SIZE(md) (2 * EVP_MD_get_size(md) + 2) 1246e1051a39Sopenharmony_cistatic int rsa_pss_check_min_key_size(SSL_CTX *ctx, const EVP_PKEY *pkey, 1247e1051a39Sopenharmony_ci const SIGALG_LOOKUP *lu) 1248e1051a39Sopenharmony_ci{ 1249e1051a39Sopenharmony_ci const EVP_MD *md; 1250e1051a39Sopenharmony_ci 1251e1051a39Sopenharmony_ci if (pkey == NULL) 1252e1051a39Sopenharmony_ci return 0; 1253e1051a39Sopenharmony_ci if (!tls1_lookup_md(ctx, lu, &md) || md == NULL) 1254e1051a39Sopenharmony_ci return 0; 1255e1051a39Sopenharmony_ci if (EVP_PKEY_get_size(pkey) < RSA_PSS_MINIMUM_KEY_SIZE(md)) 1256e1051a39Sopenharmony_ci return 0; 1257e1051a39Sopenharmony_ci return 1; 1258e1051a39Sopenharmony_ci} 1259e1051a39Sopenharmony_ci 1260e1051a39Sopenharmony_ci/* 1261e1051a39Sopenharmony_ci * Returns a signature algorithm when the peer did not send a list of supported 1262e1051a39Sopenharmony_ci * signature algorithms. The signature algorithm is fixed for the certificate 1263e1051a39Sopenharmony_ci * type. |idx| is a certificate type index (SSL_PKEY_*). When |idx| is -1 the 1264e1051a39Sopenharmony_ci * certificate type from |s| will be used. 1265e1051a39Sopenharmony_ci * Returns the signature algorithm to use, or NULL on error. 1266e1051a39Sopenharmony_ci */ 1267e1051a39Sopenharmony_cistatic const SIGALG_LOOKUP *tls1_get_legacy_sigalg(const SSL *s, int idx) 1268e1051a39Sopenharmony_ci{ 1269e1051a39Sopenharmony_ci if (idx == -1) { 1270e1051a39Sopenharmony_ci if (s->server) { 1271e1051a39Sopenharmony_ci size_t i; 1272e1051a39Sopenharmony_ci 1273e1051a39Sopenharmony_ci /* Work out index corresponding to ciphersuite */ 1274e1051a39Sopenharmony_ci for (i = 0; i < SSL_PKEY_NUM; i++) { 1275e1051a39Sopenharmony_ci const SSL_CERT_LOOKUP *clu = ssl_cert_lookup_by_idx(i); 1276e1051a39Sopenharmony_ci 1277e1051a39Sopenharmony_ci if (clu == NULL) 1278e1051a39Sopenharmony_ci continue; 1279e1051a39Sopenharmony_ci if (clu->amask & s->s3.tmp.new_cipher->algorithm_auth) { 1280e1051a39Sopenharmony_ci idx = i; 1281e1051a39Sopenharmony_ci break; 1282e1051a39Sopenharmony_ci } 1283e1051a39Sopenharmony_ci } 1284e1051a39Sopenharmony_ci 1285e1051a39Sopenharmony_ci /* 1286e1051a39Sopenharmony_ci * Some GOST ciphersuites allow more than one signature algorithms 1287e1051a39Sopenharmony_ci * */ 1288e1051a39Sopenharmony_ci if (idx == SSL_PKEY_GOST01 && s->s3.tmp.new_cipher->algorithm_auth != SSL_aGOST01) { 1289e1051a39Sopenharmony_ci int real_idx; 1290e1051a39Sopenharmony_ci 1291e1051a39Sopenharmony_ci for (real_idx = SSL_PKEY_GOST12_512; real_idx >= SSL_PKEY_GOST01; 1292e1051a39Sopenharmony_ci real_idx--) { 1293e1051a39Sopenharmony_ci if (s->cert->pkeys[real_idx].privatekey != NULL) { 1294e1051a39Sopenharmony_ci idx = real_idx; 1295e1051a39Sopenharmony_ci break; 1296e1051a39Sopenharmony_ci } 1297e1051a39Sopenharmony_ci } 1298e1051a39Sopenharmony_ci } 1299e1051a39Sopenharmony_ci /* 1300e1051a39Sopenharmony_ci * As both SSL_PKEY_GOST12_512 and SSL_PKEY_GOST12_256 indices can be used 1301e1051a39Sopenharmony_ci * with new (aGOST12-only) ciphersuites, we should find out which one is available really. 1302e1051a39Sopenharmony_ci */ 1303e1051a39Sopenharmony_ci else if (idx == SSL_PKEY_GOST12_256) { 1304e1051a39Sopenharmony_ci int real_idx; 1305e1051a39Sopenharmony_ci 1306e1051a39Sopenharmony_ci for (real_idx = SSL_PKEY_GOST12_512; real_idx >= SSL_PKEY_GOST12_256; 1307e1051a39Sopenharmony_ci real_idx--) { 1308e1051a39Sopenharmony_ci if (s->cert->pkeys[real_idx].privatekey != NULL) { 1309e1051a39Sopenharmony_ci idx = real_idx; 1310e1051a39Sopenharmony_ci break; 1311e1051a39Sopenharmony_ci } 1312e1051a39Sopenharmony_ci } 1313e1051a39Sopenharmony_ci } 1314e1051a39Sopenharmony_ci } else { 1315e1051a39Sopenharmony_ci idx = s->cert->key - s->cert->pkeys; 1316e1051a39Sopenharmony_ci } 1317e1051a39Sopenharmony_ci } 1318e1051a39Sopenharmony_ci if (idx < 0 || idx >= (int)OSSL_NELEM(tls_default_sigalg)) 1319e1051a39Sopenharmony_ci return NULL; 1320e1051a39Sopenharmony_ci if (SSL_USE_SIGALGS(s) || idx != SSL_PKEY_RSA) { 1321e1051a39Sopenharmony_ci const SIGALG_LOOKUP *lu = tls1_lookup_sigalg(s, tls_default_sigalg[idx]); 1322e1051a39Sopenharmony_ci 1323e1051a39Sopenharmony_ci if (lu == NULL) 1324e1051a39Sopenharmony_ci return NULL; 1325e1051a39Sopenharmony_ci if (!tls1_lookup_md(s->ctx, lu, NULL)) 1326e1051a39Sopenharmony_ci return NULL; 1327e1051a39Sopenharmony_ci if (!tls12_sigalg_allowed(s, SSL_SECOP_SIGALG_SUPPORTED, lu)) 1328e1051a39Sopenharmony_ci return NULL; 1329e1051a39Sopenharmony_ci return lu; 1330e1051a39Sopenharmony_ci } 1331e1051a39Sopenharmony_ci if (!tls12_sigalg_allowed(s, SSL_SECOP_SIGALG_SUPPORTED, &legacy_rsa_sigalg)) 1332e1051a39Sopenharmony_ci return NULL; 1333e1051a39Sopenharmony_ci return &legacy_rsa_sigalg; 1334e1051a39Sopenharmony_ci} 1335e1051a39Sopenharmony_ci/* Set peer sigalg based key type */ 1336e1051a39Sopenharmony_ciint tls1_set_peer_legacy_sigalg(SSL *s, const EVP_PKEY *pkey) 1337e1051a39Sopenharmony_ci{ 1338e1051a39Sopenharmony_ci size_t idx; 1339e1051a39Sopenharmony_ci const SIGALG_LOOKUP *lu; 1340e1051a39Sopenharmony_ci 1341e1051a39Sopenharmony_ci if (ssl_cert_lookup_by_pkey(pkey, &idx) == NULL) 1342e1051a39Sopenharmony_ci return 0; 1343e1051a39Sopenharmony_ci lu = tls1_get_legacy_sigalg(s, idx); 1344e1051a39Sopenharmony_ci if (lu == NULL) 1345e1051a39Sopenharmony_ci return 0; 1346e1051a39Sopenharmony_ci s->s3.tmp.peer_sigalg = lu; 1347e1051a39Sopenharmony_ci return 1; 1348e1051a39Sopenharmony_ci} 1349e1051a39Sopenharmony_ci 1350e1051a39Sopenharmony_cisize_t tls12_get_psigalgs(SSL *s, int sent, const uint16_t **psigs) 1351e1051a39Sopenharmony_ci{ 1352e1051a39Sopenharmony_ci /* 1353e1051a39Sopenharmony_ci * If Suite B mode use Suite B sigalgs only, ignore any other 1354e1051a39Sopenharmony_ci * preferences. 1355e1051a39Sopenharmony_ci */ 1356e1051a39Sopenharmony_ci switch (tls1_suiteb(s)) { 1357e1051a39Sopenharmony_ci case SSL_CERT_FLAG_SUITEB_128_LOS: 1358e1051a39Sopenharmony_ci *psigs = suiteb_sigalgs; 1359e1051a39Sopenharmony_ci return OSSL_NELEM(suiteb_sigalgs); 1360e1051a39Sopenharmony_ci 1361e1051a39Sopenharmony_ci case SSL_CERT_FLAG_SUITEB_128_LOS_ONLY: 1362e1051a39Sopenharmony_ci *psigs = suiteb_sigalgs; 1363e1051a39Sopenharmony_ci return 1; 1364e1051a39Sopenharmony_ci 1365e1051a39Sopenharmony_ci case SSL_CERT_FLAG_SUITEB_192_LOS: 1366e1051a39Sopenharmony_ci *psigs = suiteb_sigalgs + 1; 1367e1051a39Sopenharmony_ci return 1; 1368e1051a39Sopenharmony_ci } 1369e1051a39Sopenharmony_ci /* 1370e1051a39Sopenharmony_ci * We use client_sigalgs (if not NULL) if we're a server 1371e1051a39Sopenharmony_ci * and sending a certificate request or if we're a client and 1372e1051a39Sopenharmony_ci * determining which shared algorithm to use. 1373e1051a39Sopenharmony_ci */ 1374e1051a39Sopenharmony_ci if ((s->server == sent) && s->cert->client_sigalgs != NULL) { 1375e1051a39Sopenharmony_ci *psigs = s->cert->client_sigalgs; 1376e1051a39Sopenharmony_ci return s->cert->client_sigalgslen; 1377e1051a39Sopenharmony_ci } else if (s->cert->conf_sigalgs) { 1378e1051a39Sopenharmony_ci *psigs = s->cert->conf_sigalgs; 1379e1051a39Sopenharmony_ci return s->cert->conf_sigalgslen; 1380e1051a39Sopenharmony_ci } else { 1381e1051a39Sopenharmony_ci *psigs = tls12_sigalgs; 1382e1051a39Sopenharmony_ci return OSSL_NELEM(tls12_sigalgs); 1383e1051a39Sopenharmony_ci } 1384e1051a39Sopenharmony_ci} 1385e1051a39Sopenharmony_ci 1386e1051a39Sopenharmony_ci/* 1387e1051a39Sopenharmony_ci * Called by servers only. Checks that we have a sig alg that supports the 1388e1051a39Sopenharmony_ci * specified EC curve. 1389e1051a39Sopenharmony_ci */ 1390e1051a39Sopenharmony_ciint tls_check_sigalg_curve(const SSL *s, int curve) 1391e1051a39Sopenharmony_ci{ 1392e1051a39Sopenharmony_ci const uint16_t *sigs; 1393e1051a39Sopenharmony_ci size_t siglen, i; 1394e1051a39Sopenharmony_ci 1395e1051a39Sopenharmony_ci if (s->cert->conf_sigalgs) { 1396e1051a39Sopenharmony_ci sigs = s->cert->conf_sigalgs; 1397e1051a39Sopenharmony_ci siglen = s->cert->conf_sigalgslen; 1398e1051a39Sopenharmony_ci } else { 1399e1051a39Sopenharmony_ci sigs = tls12_sigalgs; 1400e1051a39Sopenharmony_ci siglen = OSSL_NELEM(tls12_sigalgs); 1401e1051a39Sopenharmony_ci } 1402e1051a39Sopenharmony_ci 1403e1051a39Sopenharmony_ci for (i = 0; i < siglen; i++) { 1404e1051a39Sopenharmony_ci const SIGALG_LOOKUP *lu = tls1_lookup_sigalg(s, sigs[i]); 1405e1051a39Sopenharmony_ci 1406e1051a39Sopenharmony_ci if (lu == NULL) 1407e1051a39Sopenharmony_ci continue; 1408e1051a39Sopenharmony_ci if (lu->sig == EVP_PKEY_EC 1409e1051a39Sopenharmony_ci && lu->curve != NID_undef 1410e1051a39Sopenharmony_ci && curve == lu->curve) 1411e1051a39Sopenharmony_ci return 1; 1412e1051a39Sopenharmony_ci } 1413e1051a39Sopenharmony_ci 1414e1051a39Sopenharmony_ci return 0; 1415e1051a39Sopenharmony_ci} 1416e1051a39Sopenharmony_ci 1417e1051a39Sopenharmony_ci/* 1418e1051a39Sopenharmony_ci * Return the number of security bits for the signature algorithm, or 0 on 1419e1051a39Sopenharmony_ci * error. 1420e1051a39Sopenharmony_ci */ 1421e1051a39Sopenharmony_cistatic int sigalg_security_bits(SSL_CTX *ctx, const SIGALG_LOOKUP *lu) 1422e1051a39Sopenharmony_ci{ 1423e1051a39Sopenharmony_ci const EVP_MD *md = NULL; 1424e1051a39Sopenharmony_ci int secbits = 0; 1425e1051a39Sopenharmony_ci 1426e1051a39Sopenharmony_ci if (!tls1_lookup_md(ctx, lu, &md)) 1427e1051a39Sopenharmony_ci return 0; 1428e1051a39Sopenharmony_ci if (md != NULL) 1429e1051a39Sopenharmony_ci { 1430e1051a39Sopenharmony_ci int md_type = EVP_MD_get_type(md); 1431e1051a39Sopenharmony_ci 1432e1051a39Sopenharmony_ci /* Security bits: half digest bits */ 1433e1051a39Sopenharmony_ci secbits = EVP_MD_get_size(md) * 4; 1434e1051a39Sopenharmony_ci /* 1435e1051a39Sopenharmony_ci * SHA1 and MD5 are known to be broken. Reduce security bits so that 1436e1051a39Sopenharmony_ci * they're no longer accepted at security level 1. The real values don't 1437e1051a39Sopenharmony_ci * really matter as long as they're lower than 80, which is our 1438e1051a39Sopenharmony_ci * security level 1. 1439e1051a39Sopenharmony_ci * https://eprint.iacr.org/2020/014 puts a chosen-prefix attack for 1440e1051a39Sopenharmony_ci * SHA1 at 2^63.4 and MD5+SHA1 at 2^67.2 1441e1051a39Sopenharmony_ci * https://documents.epfl.ch/users/l/le/lenstra/public/papers/lat.pdf 1442e1051a39Sopenharmony_ci * puts a chosen-prefix attack for MD5 at 2^39. 1443e1051a39Sopenharmony_ci */ 1444e1051a39Sopenharmony_ci if (md_type == NID_sha1) 1445e1051a39Sopenharmony_ci secbits = 64; 1446e1051a39Sopenharmony_ci else if (md_type == NID_md5_sha1) 1447e1051a39Sopenharmony_ci secbits = 67; 1448e1051a39Sopenharmony_ci else if (md_type == NID_md5) 1449e1051a39Sopenharmony_ci secbits = 39; 1450e1051a39Sopenharmony_ci } else { 1451e1051a39Sopenharmony_ci /* Values from https://tools.ietf.org/html/rfc8032#section-8.5 */ 1452e1051a39Sopenharmony_ci if (lu->sigalg == TLSEXT_SIGALG_ed25519) 1453e1051a39Sopenharmony_ci secbits = 128; 1454e1051a39Sopenharmony_ci else if (lu->sigalg == TLSEXT_SIGALG_ed448) 1455e1051a39Sopenharmony_ci secbits = 224; 1456e1051a39Sopenharmony_ci } 1457e1051a39Sopenharmony_ci return secbits; 1458e1051a39Sopenharmony_ci} 1459e1051a39Sopenharmony_ci 1460e1051a39Sopenharmony_ci/* 1461e1051a39Sopenharmony_ci * Check signature algorithm is consistent with sent supported signature 1462e1051a39Sopenharmony_ci * algorithms and if so set relevant digest and signature scheme in 1463e1051a39Sopenharmony_ci * s. 1464e1051a39Sopenharmony_ci */ 1465e1051a39Sopenharmony_ciint tls12_check_peer_sigalg(SSL *s, uint16_t sig, EVP_PKEY *pkey) 1466e1051a39Sopenharmony_ci{ 1467e1051a39Sopenharmony_ci const uint16_t *sent_sigs; 1468e1051a39Sopenharmony_ci const EVP_MD *md = NULL; 1469e1051a39Sopenharmony_ci char sigalgstr[2]; 1470e1051a39Sopenharmony_ci size_t sent_sigslen, i, cidx; 1471e1051a39Sopenharmony_ci int pkeyid = -1; 1472e1051a39Sopenharmony_ci const SIGALG_LOOKUP *lu; 1473e1051a39Sopenharmony_ci int secbits = 0; 1474e1051a39Sopenharmony_ci 1475e1051a39Sopenharmony_ci pkeyid = EVP_PKEY_get_id(pkey); 1476e1051a39Sopenharmony_ci /* Should never happen */ 1477e1051a39Sopenharmony_ci if (pkeyid == -1) 1478e1051a39Sopenharmony_ci return -1; 1479e1051a39Sopenharmony_ci if (SSL_IS_TLS13(s)) { 1480e1051a39Sopenharmony_ci /* Disallow DSA for TLS 1.3 */ 1481e1051a39Sopenharmony_ci if (pkeyid == EVP_PKEY_DSA) { 1482e1051a39Sopenharmony_ci SSLfatal(s, SSL_AD_ILLEGAL_PARAMETER, SSL_R_WRONG_SIGNATURE_TYPE); 1483e1051a39Sopenharmony_ci return 0; 1484e1051a39Sopenharmony_ci } 1485e1051a39Sopenharmony_ci /* Only allow PSS for TLS 1.3 */ 1486e1051a39Sopenharmony_ci if (pkeyid == EVP_PKEY_RSA) 1487e1051a39Sopenharmony_ci pkeyid = EVP_PKEY_RSA_PSS; 1488e1051a39Sopenharmony_ci } 1489e1051a39Sopenharmony_ci lu = tls1_lookup_sigalg(s, sig); 1490e1051a39Sopenharmony_ci /* 1491e1051a39Sopenharmony_ci * Check sigalgs is known. Disallow SHA1/SHA224 with TLS 1.3. Check key type 1492e1051a39Sopenharmony_ci * is consistent with signature: RSA keys can be used for RSA-PSS 1493e1051a39Sopenharmony_ci */ 1494e1051a39Sopenharmony_ci if (lu == NULL 1495e1051a39Sopenharmony_ci || (SSL_IS_TLS13(s) && (lu->hash == NID_sha1 || lu->hash == NID_sha224)) 1496e1051a39Sopenharmony_ci || (pkeyid != lu->sig 1497e1051a39Sopenharmony_ci && (lu->sig != EVP_PKEY_RSA_PSS || pkeyid != EVP_PKEY_RSA))) { 1498e1051a39Sopenharmony_ci SSLfatal(s, SSL_AD_ILLEGAL_PARAMETER, SSL_R_WRONG_SIGNATURE_TYPE); 1499e1051a39Sopenharmony_ci return 0; 1500e1051a39Sopenharmony_ci } 1501e1051a39Sopenharmony_ci /* Check the sigalg is consistent with the key OID */ 1502e1051a39Sopenharmony_ci if (!ssl_cert_lookup_by_nid(EVP_PKEY_get_id(pkey), &cidx) 1503e1051a39Sopenharmony_ci || lu->sig_idx != (int)cidx) { 1504e1051a39Sopenharmony_ci SSLfatal(s, SSL_AD_ILLEGAL_PARAMETER, SSL_R_WRONG_SIGNATURE_TYPE); 1505e1051a39Sopenharmony_ci return 0; 1506e1051a39Sopenharmony_ci } 1507e1051a39Sopenharmony_ci 1508e1051a39Sopenharmony_ci if (pkeyid == EVP_PKEY_EC) { 1509e1051a39Sopenharmony_ci 1510e1051a39Sopenharmony_ci /* Check point compression is permitted */ 1511e1051a39Sopenharmony_ci if (!tls1_check_pkey_comp(s, pkey)) { 1512e1051a39Sopenharmony_ci SSLfatal(s, SSL_AD_ILLEGAL_PARAMETER, 1513e1051a39Sopenharmony_ci SSL_R_ILLEGAL_POINT_COMPRESSION); 1514e1051a39Sopenharmony_ci return 0; 1515e1051a39Sopenharmony_ci } 1516e1051a39Sopenharmony_ci 1517e1051a39Sopenharmony_ci /* For TLS 1.3 or Suite B check curve matches signature algorithm */ 1518e1051a39Sopenharmony_ci if (SSL_IS_TLS13(s) || tls1_suiteb(s)) { 1519e1051a39Sopenharmony_ci int curve = ssl_get_EC_curve_nid(pkey); 1520e1051a39Sopenharmony_ci 1521e1051a39Sopenharmony_ci if (lu->curve != NID_undef && curve != lu->curve) { 1522e1051a39Sopenharmony_ci SSLfatal(s, SSL_AD_ILLEGAL_PARAMETER, SSL_R_WRONG_CURVE); 1523e1051a39Sopenharmony_ci return 0; 1524e1051a39Sopenharmony_ci } 1525e1051a39Sopenharmony_ci } 1526e1051a39Sopenharmony_ci if (!SSL_IS_TLS13(s)) { 1527e1051a39Sopenharmony_ci /* Check curve matches extensions */ 1528e1051a39Sopenharmony_ci if (!tls1_check_group_id(s, tls1_get_group_id(pkey), 1)) { 1529e1051a39Sopenharmony_ci SSLfatal(s, SSL_AD_ILLEGAL_PARAMETER, SSL_R_WRONG_CURVE); 1530e1051a39Sopenharmony_ci return 0; 1531e1051a39Sopenharmony_ci } 1532e1051a39Sopenharmony_ci if (tls1_suiteb(s)) { 1533e1051a39Sopenharmony_ci /* Check sigalg matches a permissible Suite B value */ 1534e1051a39Sopenharmony_ci if (sig != TLSEXT_SIGALG_ecdsa_secp256r1_sha256 1535e1051a39Sopenharmony_ci && sig != TLSEXT_SIGALG_ecdsa_secp384r1_sha384) { 1536e1051a39Sopenharmony_ci SSLfatal(s, SSL_AD_HANDSHAKE_FAILURE, 1537e1051a39Sopenharmony_ci SSL_R_WRONG_SIGNATURE_TYPE); 1538e1051a39Sopenharmony_ci return 0; 1539e1051a39Sopenharmony_ci } 1540e1051a39Sopenharmony_ci } 1541e1051a39Sopenharmony_ci } 1542e1051a39Sopenharmony_ci } else if (tls1_suiteb(s)) { 1543e1051a39Sopenharmony_ci SSLfatal(s, SSL_AD_HANDSHAKE_FAILURE, SSL_R_WRONG_SIGNATURE_TYPE); 1544e1051a39Sopenharmony_ci return 0; 1545e1051a39Sopenharmony_ci } 1546e1051a39Sopenharmony_ci 1547e1051a39Sopenharmony_ci /* Check signature matches a type we sent */ 1548e1051a39Sopenharmony_ci sent_sigslen = tls12_get_psigalgs(s, 1, &sent_sigs); 1549e1051a39Sopenharmony_ci for (i = 0; i < sent_sigslen; i++, sent_sigs++) { 1550e1051a39Sopenharmony_ci if (sig == *sent_sigs) 1551e1051a39Sopenharmony_ci break; 1552e1051a39Sopenharmony_ci } 1553e1051a39Sopenharmony_ci /* Allow fallback to SHA1 if not strict mode */ 1554e1051a39Sopenharmony_ci if (i == sent_sigslen && (lu->hash != NID_sha1 1555e1051a39Sopenharmony_ci || s->cert->cert_flags & SSL_CERT_FLAGS_CHECK_TLS_STRICT)) { 1556e1051a39Sopenharmony_ci SSLfatal(s, SSL_AD_HANDSHAKE_FAILURE, SSL_R_WRONG_SIGNATURE_TYPE); 1557e1051a39Sopenharmony_ci return 0; 1558e1051a39Sopenharmony_ci } 1559e1051a39Sopenharmony_ci if (!tls1_lookup_md(s->ctx, lu, &md)) { 1560e1051a39Sopenharmony_ci SSLfatal(s, SSL_AD_HANDSHAKE_FAILURE, SSL_R_UNKNOWN_DIGEST); 1561e1051a39Sopenharmony_ci return 0; 1562e1051a39Sopenharmony_ci } 1563e1051a39Sopenharmony_ci /* 1564e1051a39Sopenharmony_ci * Make sure security callback allows algorithm. For historical 1565e1051a39Sopenharmony_ci * reasons we have to pass the sigalg as a two byte char array. 1566e1051a39Sopenharmony_ci */ 1567e1051a39Sopenharmony_ci sigalgstr[0] = (sig >> 8) & 0xff; 1568e1051a39Sopenharmony_ci sigalgstr[1] = sig & 0xff; 1569e1051a39Sopenharmony_ci secbits = sigalg_security_bits(s->ctx, lu); 1570e1051a39Sopenharmony_ci if (secbits == 0 || 1571e1051a39Sopenharmony_ci !ssl_security(s, SSL_SECOP_SIGALG_CHECK, secbits, 1572e1051a39Sopenharmony_ci md != NULL ? EVP_MD_get_type(md) : NID_undef, 1573e1051a39Sopenharmony_ci (void *)sigalgstr)) { 1574e1051a39Sopenharmony_ci SSLfatal(s, SSL_AD_HANDSHAKE_FAILURE, SSL_R_WRONG_SIGNATURE_TYPE); 1575e1051a39Sopenharmony_ci return 0; 1576e1051a39Sopenharmony_ci } 1577e1051a39Sopenharmony_ci /* Store the sigalg the peer uses */ 1578e1051a39Sopenharmony_ci s->s3.tmp.peer_sigalg = lu; 1579e1051a39Sopenharmony_ci return 1; 1580e1051a39Sopenharmony_ci} 1581e1051a39Sopenharmony_ci 1582e1051a39Sopenharmony_ciint SSL_get_peer_signature_type_nid(const SSL *s, int *pnid) 1583e1051a39Sopenharmony_ci{ 1584e1051a39Sopenharmony_ci if (s->s3.tmp.peer_sigalg == NULL) 1585e1051a39Sopenharmony_ci return 0; 1586e1051a39Sopenharmony_ci *pnid = s->s3.tmp.peer_sigalg->sig; 1587e1051a39Sopenharmony_ci return 1; 1588e1051a39Sopenharmony_ci} 1589e1051a39Sopenharmony_ci 1590e1051a39Sopenharmony_ciint SSL_get_signature_type_nid(const SSL *s, int *pnid) 1591e1051a39Sopenharmony_ci{ 1592e1051a39Sopenharmony_ci if (s->s3.tmp.sigalg == NULL) 1593e1051a39Sopenharmony_ci return 0; 1594e1051a39Sopenharmony_ci *pnid = s->s3.tmp.sigalg->sig; 1595e1051a39Sopenharmony_ci return 1; 1596e1051a39Sopenharmony_ci} 1597e1051a39Sopenharmony_ci 1598e1051a39Sopenharmony_ci/* 1599e1051a39Sopenharmony_ci * Set a mask of disabled algorithms: an algorithm is disabled if it isn't 1600e1051a39Sopenharmony_ci * supported, doesn't appear in supported signature algorithms, isn't supported 1601e1051a39Sopenharmony_ci * by the enabled protocol versions or by the security level. 1602e1051a39Sopenharmony_ci * 1603e1051a39Sopenharmony_ci * This function should only be used for checking which ciphers are supported 1604e1051a39Sopenharmony_ci * by the client. 1605e1051a39Sopenharmony_ci * 1606e1051a39Sopenharmony_ci * Call ssl_cipher_disabled() to check that it's enabled or not. 1607e1051a39Sopenharmony_ci */ 1608e1051a39Sopenharmony_ciint ssl_set_client_disabled(SSL *s) 1609e1051a39Sopenharmony_ci{ 1610e1051a39Sopenharmony_ci s->s3.tmp.mask_a = 0; 1611e1051a39Sopenharmony_ci s->s3.tmp.mask_k = 0; 1612e1051a39Sopenharmony_ci ssl_set_sig_mask(&s->s3.tmp.mask_a, s, SSL_SECOP_SIGALG_MASK); 1613e1051a39Sopenharmony_ci if (ssl_get_min_max_version(s, &s->s3.tmp.min_ver, 1614e1051a39Sopenharmony_ci &s->s3.tmp.max_ver, NULL) != 0) 1615e1051a39Sopenharmony_ci return 0; 1616e1051a39Sopenharmony_ci#ifndef OPENSSL_NO_PSK 1617e1051a39Sopenharmony_ci /* with PSK there must be client callback set */ 1618e1051a39Sopenharmony_ci if (!s->psk_client_callback) { 1619e1051a39Sopenharmony_ci s->s3.tmp.mask_a |= SSL_aPSK; 1620e1051a39Sopenharmony_ci s->s3.tmp.mask_k |= SSL_PSK; 1621e1051a39Sopenharmony_ci } 1622e1051a39Sopenharmony_ci#endif /* OPENSSL_NO_PSK */ 1623e1051a39Sopenharmony_ci#ifndef OPENSSL_NO_SRP 1624e1051a39Sopenharmony_ci if (!(s->srp_ctx.srp_Mask & SSL_kSRP)) { 1625e1051a39Sopenharmony_ci s->s3.tmp.mask_a |= SSL_aSRP; 1626e1051a39Sopenharmony_ci s->s3.tmp.mask_k |= SSL_kSRP; 1627e1051a39Sopenharmony_ci } 1628e1051a39Sopenharmony_ci#endif 1629e1051a39Sopenharmony_ci return 1; 1630e1051a39Sopenharmony_ci} 1631e1051a39Sopenharmony_ci 1632e1051a39Sopenharmony_ci/* 1633e1051a39Sopenharmony_ci * ssl_cipher_disabled - check that a cipher is disabled or not 1634e1051a39Sopenharmony_ci * @s: SSL connection that you want to use the cipher on 1635e1051a39Sopenharmony_ci * @c: cipher to check 1636e1051a39Sopenharmony_ci * @op: Security check that you want to do 1637e1051a39Sopenharmony_ci * @ecdhe: If set to 1 then TLSv1 ECDHE ciphers are also allowed in SSLv3 1638e1051a39Sopenharmony_ci * 1639e1051a39Sopenharmony_ci * Returns 1 when it's disabled, 0 when enabled. 1640e1051a39Sopenharmony_ci */ 1641e1051a39Sopenharmony_ciint ssl_cipher_disabled(const SSL *s, const SSL_CIPHER *c, int op, int ecdhe) 1642e1051a39Sopenharmony_ci{ 1643e1051a39Sopenharmony_ci if (c->algorithm_mkey & s->s3.tmp.mask_k 1644e1051a39Sopenharmony_ci || c->algorithm_auth & s->s3.tmp.mask_a) 1645e1051a39Sopenharmony_ci return 1; 1646e1051a39Sopenharmony_ci if (s->s3.tmp.max_ver == 0) 1647e1051a39Sopenharmony_ci return 1; 1648e1051a39Sopenharmony_ci if (!SSL_IS_DTLS(s)) { 1649e1051a39Sopenharmony_ci int min_tls = c->min_tls; 1650e1051a39Sopenharmony_ci 1651e1051a39Sopenharmony_ci /* 1652e1051a39Sopenharmony_ci * For historical reasons we will allow ECHDE to be selected by a server 1653e1051a39Sopenharmony_ci * in SSLv3 if we are a client 1654e1051a39Sopenharmony_ci */ 1655e1051a39Sopenharmony_ci if (min_tls == TLS1_VERSION && ecdhe 1656e1051a39Sopenharmony_ci && (c->algorithm_mkey & (SSL_kECDHE | SSL_kECDHEPSK)) != 0) 1657e1051a39Sopenharmony_ci min_tls = SSL3_VERSION; 1658e1051a39Sopenharmony_ci 1659e1051a39Sopenharmony_ci if ((min_tls > s->s3.tmp.max_ver) || (c->max_tls < s->s3.tmp.min_ver)) 1660e1051a39Sopenharmony_ci return 1; 1661e1051a39Sopenharmony_ci } 1662e1051a39Sopenharmony_ci if (SSL_IS_DTLS(s) && (DTLS_VERSION_GT(c->min_dtls, s->s3.tmp.max_ver) 1663e1051a39Sopenharmony_ci || DTLS_VERSION_LT(c->max_dtls, s->s3.tmp.min_ver))) 1664e1051a39Sopenharmony_ci return 1; 1665e1051a39Sopenharmony_ci 1666e1051a39Sopenharmony_ci return !ssl_security(s, op, c->strength_bits, 0, (void *)c); 1667e1051a39Sopenharmony_ci} 1668e1051a39Sopenharmony_ci 1669e1051a39Sopenharmony_ciint tls_use_ticket(SSL *s) 1670e1051a39Sopenharmony_ci{ 1671e1051a39Sopenharmony_ci if ((s->options & SSL_OP_NO_TICKET)) 1672e1051a39Sopenharmony_ci return 0; 1673e1051a39Sopenharmony_ci return ssl_security(s, SSL_SECOP_TICKET, 0, 0, NULL); 1674e1051a39Sopenharmony_ci} 1675e1051a39Sopenharmony_ci 1676e1051a39Sopenharmony_ciint tls1_set_server_sigalgs(SSL *s) 1677e1051a39Sopenharmony_ci{ 1678e1051a39Sopenharmony_ci size_t i; 1679e1051a39Sopenharmony_ci 1680e1051a39Sopenharmony_ci /* Clear any shared signature algorithms */ 1681e1051a39Sopenharmony_ci OPENSSL_free(s->shared_sigalgs); 1682e1051a39Sopenharmony_ci s->shared_sigalgs = NULL; 1683e1051a39Sopenharmony_ci s->shared_sigalgslen = 0; 1684e1051a39Sopenharmony_ci /* Clear certificate validity flags */ 1685e1051a39Sopenharmony_ci for (i = 0; i < SSL_PKEY_NUM; i++) 1686e1051a39Sopenharmony_ci s->s3.tmp.valid_flags[i] = 0; 1687e1051a39Sopenharmony_ci /* 1688e1051a39Sopenharmony_ci * If peer sent no signature algorithms check to see if we support 1689e1051a39Sopenharmony_ci * the default algorithm for each certificate type 1690e1051a39Sopenharmony_ci */ 1691e1051a39Sopenharmony_ci if (s->s3.tmp.peer_cert_sigalgs == NULL 1692e1051a39Sopenharmony_ci && s->s3.tmp.peer_sigalgs == NULL) { 1693e1051a39Sopenharmony_ci const uint16_t *sent_sigs; 1694e1051a39Sopenharmony_ci size_t sent_sigslen = tls12_get_psigalgs(s, 1, &sent_sigs); 1695e1051a39Sopenharmony_ci 1696e1051a39Sopenharmony_ci for (i = 0; i < SSL_PKEY_NUM; i++) { 1697e1051a39Sopenharmony_ci const SIGALG_LOOKUP *lu = tls1_get_legacy_sigalg(s, i); 1698e1051a39Sopenharmony_ci size_t j; 1699e1051a39Sopenharmony_ci 1700e1051a39Sopenharmony_ci if (lu == NULL) 1701e1051a39Sopenharmony_ci continue; 1702e1051a39Sopenharmony_ci /* Check default matches a type we sent */ 1703e1051a39Sopenharmony_ci for (j = 0; j < sent_sigslen; j++) { 1704e1051a39Sopenharmony_ci if (lu->sigalg == sent_sigs[j]) { 1705e1051a39Sopenharmony_ci s->s3.tmp.valid_flags[i] = CERT_PKEY_SIGN; 1706e1051a39Sopenharmony_ci break; 1707e1051a39Sopenharmony_ci } 1708e1051a39Sopenharmony_ci } 1709e1051a39Sopenharmony_ci } 1710e1051a39Sopenharmony_ci return 1; 1711e1051a39Sopenharmony_ci } 1712e1051a39Sopenharmony_ci 1713e1051a39Sopenharmony_ci if (!tls1_process_sigalgs(s)) { 1714e1051a39Sopenharmony_ci SSLfatal(s, SSL_AD_INTERNAL_ERROR, ERR_R_INTERNAL_ERROR); 1715e1051a39Sopenharmony_ci return 0; 1716e1051a39Sopenharmony_ci } 1717e1051a39Sopenharmony_ci if (s->shared_sigalgs != NULL) 1718e1051a39Sopenharmony_ci return 1; 1719e1051a39Sopenharmony_ci 1720e1051a39Sopenharmony_ci /* Fatal error if no shared signature algorithms */ 1721e1051a39Sopenharmony_ci SSLfatal(s, SSL_AD_HANDSHAKE_FAILURE, 1722e1051a39Sopenharmony_ci SSL_R_NO_SHARED_SIGNATURE_ALGORITHMS); 1723e1051a39Sopenharmony_ci return 0; 1724e1051a39Sopenharmony_ci} 1725e1051a39Sopenharmony_ci 1726e1051a39Sopenharmony_ci/*- 1727e1051a39Sopenharmony_ci * Gets the ticket information supplied by the client if any. 1728e1051a39Sopenharmony_ci * 1729e1051a39Sopenharmony_ci * hello: The parsed ClientHello data 1730e1051a39Sopenharmony_ci * ret: (output) on return, if a ticket was decrypted, then this is set to 1731e1051a39Sopenharmony_ci * point to the resulting session. 1732e1051a39Sopenharmony_ci */ 1733e1051a39Sopenharmony_ciSSL_TICKET_STATUS tls_get_ticket_from_client(SSL *s, CLIENTHELLO_MSG *hello, 1734e1051a39Sopenharmony_ci SSL_SESSION **ret) 1735e1051a39Sopenharmony_ci{ 1736e1051a39Sopenharmony_ci size_t size; 1737e1051a39Sopenharmony_ci RAW_EXTENSION *ticketext; 1738e1051a39Sopenharmony_ci 1739e1051a39Sopenharmony_ci *ret = NULL; 1740e1051a39Sopenharmony_ci s->ext.ticket_expected = 0; 1741e1051a39Sopenharmony_ci 1742e1051a39Sopenharmony_ci /* 1743e1051a39Sopenharmony_ci * If tickets disabled or not supported by the protocol version 1744e1051a39Sopenharmony_ci * (e.g. TLSv1.3) behave as if no ticket present to permit stateful 1745e1051a39Sopenharmony_ci * resumption. 1746e1051a39Sopenharmony_ci */ 1747e1051a39Sopenharmony_ci if (s->version <= SSL3_VERSION || !tls_use_ticket(s)) 1748e1051a39Sopenharmony_ci return SSL_TICKET_NONE; 1749e1051a39Sopenharmony_ci 1750e1051a39Sopenharmony_ci ticketext = &hello->pre_proc_exts[TLSEXT_IDX_session_ticket]; 1751e1051a39Sopenharmony_ci if (!ticketext->present) 1752e1051a39Sopenharmony_ci return SSL_TICKET_NONE; 1753e1051a39Sopenharmony_ci 1754e1051a39Sopenharmony_ci size = PACKET_remaining(&ticketext->data); 1755e1051a39Sopenharmony_ci 1756e1051a39Sopenharmony_ci return tls_decrypt_ticket(s, PACKET_data(&ticketext->data), size, 1757e1051a39Sopenharmony_ci hello->session_id, hello->session_id_len, ret); 1758e1051a39Sopenharmony_ci} 1759e1051a39Sopenharmony_ci 1760e1051a39Sopenharmony_ci/*- 1761e1051a39Sopenharmony_ci * tls_decrypt_ticket attempts to decrypt a session ticket. 1762e1051a39Sopenharmony_ci * 1763e1051a39Sopenharmony_ci * If s->tls_session_secret_cb is set and we're not doing TLSv1.3 then we are 1764e1051a39Sopenharmony_ci * expecting a pre-shared key ciphersuite, in which case we have no use for 1765e1051a39Sopenharmony_ci * session tickets and one will never be decrypted, nor will 1766e1051a39Sopenharmony_ci * s->ext.ticket_expected be set to 1. 1767e1051a39Sopenharmony_ci * 1768e1051a39Sopenharmony_ci * Side effects: 1769e1051a39Sopenharmony_ci * Sets s->ext.ticket_expected to 1 if the server will have to issue 1770e1051a39Sopenharmony_ci * a new session ticket to the client because the client indicated support 1771e1051a39Sopenharmony_ci * (and s->tls_session_secret_cb is NULL) but the client either doesn't have 1772e1051a39Sopenharmony_ci * a session ticket or we couldn't use the one it gave us, or if 1773e1051a39Sopenharmony_ci * s->ctx->ext.ticket_key_cb asked to renew the client's ticket. 1774e1051a39Sopenharmony_ci * Otherwise, s->ext.ticket_expected is set to 0. 1775e1051a39Sopenharmony_ci * 1776e1051a39Sopenharmony_ci * etick: points to the body of the session ticket extension. 1777e1051a39Sopenharmony_ci * eticklen: the length of the session tickets extension. 1778e1051a39Sopenharmony_ci * sess_id: points at the session ID. 1779e1051a39Sopenharmony_ci * sesslen: the length of the session ID. 1780e1051a39Sopenharmony_ci * psess: (output) on return, if a ticket was decrypted, then this is set to 1781e1051a39Sopenharmony_ci * point to the resulting session. 1782e1051a39Sopenharmony_ci */ 1783e1051a39Sopenharmony_ciSSL_TICKET_STATUS tls_decrypt_ticket(SSL *s, const unsigned char *etick, 1784e1051a39Sopenharmony_ci size_t eticklen, const unsigned char *sess_id, 1785e1051a39Sopenharmony_ci size_t sesslen, SSL_SESSION **psess) 1786e1051a39Sopenharmony_ci{ 1787e1051a39Sopenharmony_ci SSL_SESSION *sess = NULL; 1788e1051a39Sopenharmony_ci unsigned char *sdec; 1789e1051a39Sopenharmony_ci const unsigned char *p; 1790e1051a39Sopenharmony_ci int slen, ivlen, renew_ticket = 0, declen; 1791e1051a39Sopenharmony_ci SSL_TICKET_STATUS ret = SSL_TICKET_FATAL_ERR_OTHER; 1792e1051a39Sopenharmony_ci size_t mlen; 1793e1051a39Sopenharmony_ci unsigned char tick_hmac[EVP_MAX_MD_SIZE]; 1794e1051a39Sopenharmony_ci SSL_HMAC *hctx = NULL; 1795e1051a39Sopenharmony_ci EVP_CIPHER_CTX *ctx = NULL; 1796e1051a39Sopenharmony_ci SSL_CTX *tctx = s->session_ctx; 1797e1051a39Sopenharmony_ci 1798e1051a39Sopenharmony_ci if (eticklen == 0) { 1799e1051a39Sopenharmony_ci /* 1800e1051a39Sopenharmony_ci * The client will accept a ticket but doesn't currently have 1801e1051a39Sopenharmony_ci * one (TLSv1.2 and below), or treated as a fatal error in TLSv1.3 1802e1051a39Sopenharmony_ci */ 1803e1051a39Sopenharmony_ci ret = SSL_TICKET_EMPTY; 1804e1051a39Sopenharmony_ci goto end; 1805e1051a39Sopenharmony_ci } 1806e1051a39Sopenharmony_ci if (!SSL_IS_TLS13(s) && s->ext.session_secret_cb) { 1807e1051a39Sopenharmony_ci /* 1808e1051a39Sopenharmony_ci * Indicate that the ticket couldn't be decrypted rather than 1809e1051a39Sopenharmony_ci * generating the session from ticket now, trigger 1810e1051a39Sopenharmony_ci * abbreviated handshake based on external mechanism to 1811e1051a39Sopenharmony_ci * calculate the master secret later. 1812e1051a39Sopenharmony_ci */ 1813e1051a39Sopenharmony_ci ret = SSL_TICKET_NO_DECRYPT; 1814e1051a39Sopenharmony_ci goto end; 1815e1051a39Sopenharmony_ci } 1816e1051a39Sopenharmony_ci 1817e1051a39Sopenharmony_ci /* Need at least keyname + iv */ 1818e1051a39Sopenharmony_ci if (eticklen < TLSEXT_KEYNAME_LENGTH + EVP_MAX_IV_LENGTH) { 1819e1051a39Sopenharmony_ci ret = SSL_TICKET_NO_DECRYPT; 1820e1051a39Sopenharmony_ci goto end; 1821e1051a39Sopenharmony_ci } 1822e1051a39Sopenharmony_ci 1823e1051a39Sopenharmony_ci /* Initialize session ticket encryption and HMAC contexts */ 1824e1051a39Sopenharmony_ci hctx = ssl_hmac_new(tctx); 1825e1051a39Sopenharmony_ci if (hctx == NULL) { 1826e1051a39Sopenharmony_ci ret = SSL_TICKET_FATAL_ERR_MALLOC; 1827e1051a39Sopenharmony_ci goto end; 1828e1051a39Sopenharmony_ci } 1829e1051a39Sopenharmony_ci ctx = EVP_CIPHER_CTX_new(); 1830e1051a39Sopenharmony_ci if (ctx == NULL) { 1831e1051a39Sopenharmony_ci ret = SSL_TICKET_FATAL_ERR_MALLOC; 1832e1051a39Sopenharmony_ci goto end; 1833e1051a39Sopenharmony_ci } 1834e1051a39Sopenharmony_ci#ifndef OPENSSL_NO_DEPRECATED_3_0 1835e1051a39Sopenharmony_ci if (tctx->ext.ticket_key_evp_cb != NULL || tctx->ext.ticket_key_cb != NULL) 1836e1051a39Sopenharmony_ci#else 1837e1051a39Sopenharmony_ci if (tctx->ext.ticket_key_evp_cb != NULL) 1838e1051a39Sopenharmony_ci#endif 1839e1051a39Sopenharmony_ci { 1840e1051a39Sopenharmony_ci unsigned char *nctick = (unsigned char *)etick; 1841e1051a39Sopenharmony_ci int rv = 0; 1842e1051a39Sopenharmony_ci 1843e1051a39Sopenharmony_ci if (tctx->ext.ticket_key_evp_cb != NULL) 1844e1051a39Sopenharmony_ci rv = tctx->ext.ticket_key_evp_cb(s, nctick, 1845e1051a39Sopenharmony_ci nctick + TLSEXT_KEYNAME_LENGTH, 1846e1051a39Sopenharmony_ci ctx, 1847e1051a39Sopenharmony_ci ssl_hmac_get0_EVP_MAC_CTX(hctx), 1848e1051a39Sopenharmony_ci 0); 1849e1051a39Sopenharmony_ci#ifndef OPENSSL_NO_DEPRECATED_3_0 1850e1051a39Sopenharmony_ci else if (tctx->ext.ticket_key_cb != NULL) 1851e1051a39Sopenharmony_ci /* if 0 is returned, write an empty ticket */ 1852e1051a39Sopenharmony_ci rv = tctx->ext.ticket_key_cb(s, nctick, 1853e1051a39Sopenharmony_ci nctick + TLSEXT_KEYNAME_LENGTH, 1854e1051a39Sopenharmony_ci ctx, ssl_hmac_get0_HMAC_CTX(hctx), 0); 1855e1051a39Sopenharmony_ci#endif 1856e1051a39Sopenharmony_ci if (rv < 0) { 1857e1051a39Sopenharmony_ci ret = SSL_TICKET_FATAL_ERR_OTHER; 1858e1051a39Sopenharmony_ci goto end; 1859e1051a39Sopenharmony_ci } 1860e1051a39Sopenharmony_ci if (rv == 0) { 1861e1051a39Sopenharmony_ci ret = SSL_TICKET_NO_DECRYPT; 1862e1051a39Sopenharmony_ci goto end; 1863e1051a39Sopenharmony_ci } 1864e1051a39Sopenharmony_ci if (rv == 2) 1865e1051a39Sopenharmony_ci renew_ticket = 1; 1866e1051a39Sopenharmony_ci } else { 1867e1051a39Sopenharmony_ci EVP_CIPHER *aes256cbc = NULL; 1868e1051a39Sopenharmony_ci 1869e1051a39Sopenharmony_ci /* Check key name matches */ 1870e1051a39Sopenharmony_ci if (memcmp(etick, tctx->ext.tick_key_name, 1871e1051a39Sopenharmony_ci TLSEXT_KEYNAME_LENGTH) != 0) { 1872e1051a39Sopenharmony_ci ret = SSL_TICKET_NO_DECRYPT; 1873e1051a39Sopenharmony_ci goto end; 1874e1051a39Sopenharmony_ci } 1875e1051a39Sopenharmony_ci 1876e1051a39Sopenharmony_ci aes256cbc = EVP_CIPHER_fetch(s->ctx->libctx, "AES-256-CBC", 1877e1051a39Sopenharmony_ci s->ctx->propq); 1878e1051a39Sopenharmony_ci if (aes256cbc == NULL 1879e1051a39Sopenharmony_ci || ssl_hmac_init(hctx, tctx->ext.secure->tick_hmac_key, 1880e1051a39Sopenharmony_ci sizeof(tctx->ext.secure->tick_hmac_key), 1881e1051a39Sopenharmony_ci "SHA256") <= 0 1882e1051a39Sopenharmony_ci || EVP_DecryptInit_ex(ctx, aes256cbc, NULL, 1883e1051a39Sopenharmony_ci tctx->ext.secure->tick_aes_key, 1884e1051a39Sopenharmony_ci etick + TLSEXT_KEYNAME_LENGTH) <= 0) { 1885e1051a39Sopenharmony_ci EVP_CIPHER_free(aes256cbc); 1886e1051a39Sopenharmony_ci ret = SSL_TICKET_FATAL_ERR_OTHER; 1887e1051a39Sopenharmony_ci goto end; 1888e1051a39Sopenharmony_ci } 1889e1051a39Sopenharmony_ci EVP_CIPHER_free(aes256cbc); 1890e1051a39Sopenharmony_ci if (SSL_IS_TLS13(s)) 1891e1051a39Sopenharmony_ci renew_ticket = 1; 1892e1051a39Sopenharmony_ci } 1893e1051a39Sopenharmony_ci /* 1894e1051a39Sopenharmony_ci * Attempt to process session ticket, first conduct sanity and integrity 1895e1051a39Sopenharmony_ci * checks on ticket. 1896e1051a39Sopenharmony_ci */ 1897e1051a39Sopenharmony_ci mlen = ssl_hmac_size(hctx); 1898e1051a39Sopenharmony_ci if (mlen == 0) { 1899e1051a39Sopenharmony_ci ret = SSL_TICKET_FATAL_ERR_OTHER; 1900e1051a39Sopenharmony_ci goto end; 1901e1051a39Sopenharmony_ci } 1902e1051a39Sopenharmony_ci 1903e1051a39Sopenharmony_ci ivlen = EVP_CIPHER_CTX_get_iv_length(ctx); 1904e1051a39Sopenharmony_ci if (ivlen < 0) { 1905e1051a39Sopenharmony_ci ret = SSL_TICKET_FATAL_ERR_OTHER; 1906e1051a39Sopenharmony_ci goto end; 1907e1051a39Sopenharmony_ci } 1908e1051a39Sopenharmony_ci 1909e1051a39Sopenharmony_ci /* Sanity check ticket length: must exceed keyname + IV + HMAC */ 1910e1051a39Sopenharmony_ci if (eticklen <= TLSEXT_KEYNAME_LENGTH + ivlen + mlen) { 1911e1051a39Sopenharmony_ci ret = SSL_TICKET_NO_DECRYPT; 1912e1051a39Sopenharmony_ci goto end; 1913e1051a39Sopenharmony_ci } 1914e1051a39Sopenharmony_ci eticklen -= mlen; 1915e1051a39Sopenharmony_ci /* Check HMAC of encrypted ticket */ 1916e1051a39Sopenharmony_ci if (ssl_hmac_update(hctx, etick, eticklen) <= 0 1917e1051a39Sopenharmony_ci || ssl_hmac_final(hctx, tick_hmac, NULL, sizeof(tick_hmac)) <= 0) { 1918e1051a39Sopenharmony_ci ret = SSL_TICKET_FATAL_ERR_OTHER; 1919e1051a39Sopenharmony_ci goto end; 1920e1051a39Sopenharmony_ci } 1921e1051a39Sopenharmony_ci 1922e1051a39Sopenharmony_ci if (CRYPTO_memcmp(tick_hmac, etick + eticklen, mlen)) { 1923e1051a39Sopenharmony_ci ret = SSL_TICKET_NO_DECRYPT; 1924e1051a39Sopenharmony_ci goto end; 1925e1051a39Sopenharmony_ci } 1926e1051a39Sopenharmony_ci /* Attempt to decrypt session data */ 1927e1051a39Sopenharmony_ci /* Move p after IV to start of encrypted ticket, update length */ 1928e1051a39Sopenharmony_ci p = etick + TLSEXT_KEYNAME_LENGTH + ivlen; 1929e1051a39Sopenharmony_ci eticklen -= TLSEXT_KEYNAME_LENGTH + ivlen; 1930e1051a39Sopenharmony_ci sdec = OPENSSL_malloc(eticklen); 1931e1051a39Sopenharmony_ci if (sdec == NULL || EVP_DecryptUpdate(ctx, sdec, &slen, p, 1932e1051a39Sopenharmony_ci (int)eticklen) <= 0) { 1933e1051a39Sopenharmony_ci OPENSSL_free(sdec); 1934e1051a39Sopenharmony_ci ret = SSL_TICKET_FATAL_ERR_OTHER; 1935e1051a39Sopenharmony_ci goto end; 1936e1051a39Sopenharmony_ci } 1937e1051a39Sopenharmony_ci if (EVP_DecryptFinal(ctx, sdec + slen, &declen) <= 0) { 1938e1051a39Sopenharmony_ci OPENSSL_free(sdec); 1939e1051a39Sopenharmony_ci ret = SSL_TICKET_NO_DECRYPT; 1940e1051a39Sopenharmony_ci goto end; 1941e1051a39Sopenharmony_ci } 1942e1051a39Sopenharmony_ci slen += declen; 1943e1051a39Sopenharmony_ci p = sdec; 1944e1051a39Sopenharmony_ci 1945e1051a39Sopenharmony_ci sess = d2i_SSL_SESSION(NULL, &p, slen); 1946e1051a39Sopenharmony_ci slen -= p - sdec; 1947e1051a39Sopenharmony_ci OPENSSL_free(sdec); 1948e1051a39Sopenharmony_ci if (sess) { 1949e1051a39Sopenharmony_ci /* Some additional consistency checks */ 1950e1051a39Sopenharmony_ci if (slen != 0) { 1951e1051a39Sopenharmony_ci SSL_SESSION_free(sess); 1952e1051a39Sopenharmony_ci sess = NULL; 1953e1051a39Sopenharmony_ci ret = SSL_TICKET_NO_DECRYPT; 1954e1051a39Sopenharmony_ci goto end; 1955e1051a39Sopenharmony_ci } 1956e1051a39Sopenharmony_ci /* 1957e1051a39Sopenharmony_ci * The session ID, if non-empty, is used by some clients to detect 1958e1051a39Sopenharmony_ci * that the ticket has been accepted. So we copy it to the session 1959e1051a39Sopenharmony_ci * structure. If it is empty set length to zero as required by 1960e1051a39Sopenharmony_ci * standard. 1961e1051a39Sopenharmony_ci */ 1962e1051a39Sopenharmony_ci if (sesslen) { 1963e1051a39Sopenharmony_ci memcpy(sess->session_id, sess_id, sesslen); 1964e1051a39Sopenharmony_ci sess->session_id_length = sesslen; 1965e1051a39Sopenharmony_ci } 1966e1051a39Sopenharmony_ci if (renew_ticket) 1967e1051a39Sopenharmony_ci ret = SSL_TICKET_SUCCESS_RENEW; 1968e1051a39Sopenharmony_ci else 1969e1051a39Sopenharmony_ci ret = SSL_TICKET_SUCCESS; 1970e1051a39Sopenharmony_ci goto end; 1971e1051a39Sopenharmony_ci } 1972e1051a39Sopenharmony_ci ERR_clear_error(); 1973e1051a39Sopenharmony_ci /* 1974e1051a39Sopenharmony_ci * For session parse failure, indicate that we need to send a new ticket. 1975e1051a39Sopenharmony_ci */ 1976e1051a39Sopenharmony_ci ret = SSL_TICKET_NO_DECRYPT; 1977e1051a39Sopenharmony_ci 1978e1051a39Sopenharmony_ci end: 1979e1051a39Sopenharmony_ci EVP_CIPHER_CTX_free(ctx); 1980e1051a39Sopenharmony_ci ssl_hmac_free(hctx); 1981e1051a39Sopenharmony_ci 1982e1051a39Sopenharmony_ci /* 1983e1051a39Sopenharmony_ci * If set, the decrypt_ticket_cb() is called unless a fatal error was 1984e1051a39Sopenharmony_ci * detected above. The callback is responsible for checking |ret| before it 1985e1051a39Sopenharmony_ci * performs any action 1986e1051a39Sopenharmony_ci */ 1987e1051a39Sopenharmony_ci if (s->session_ctx->decrypt_ticket_cb != NULL 1988e1051a39Sopenharmony_ci && (ret == SSL_TICKET_EMPTY 1989e1051a39Sopenharmony_ci || ret == SSL_TICKET_NO_DECRYPT 1990e1051a39Sopenharmony_ci || ret == SSL_TICKET_SUCCESS 1991e1051a39Sopenharmony_ci || ret == SSL_TICKET_SUCCESS_RENEW)) { 1992e1051a39Sopenharmony_ci size_t keyname_len = eticklen; 1993e1051a39Sopenharmony_ci int retcb; 1994e1051a39Sopenharmony_ci 1995e1051a39Sopenharmony_ci if (keyname_len > TLSEXT_KEYNAME_LENGTH) 1996e1051a39Sopenharmony_ci keyname_len = TLSEXT_KEYNAME_LENGTH; 1997e1051a39Sopenharmony_ci retcb = s->session_ctx->decrypt_ticket_cb(s, sess, etick, keyname_len, 1998e1051a39Sopenharmony_ci ret, 1999e1051a39Sopenharmony_ci s->session_ctx->ticket_cb_data); 2000e1051a39Sopenharmony_ci switch (retcb) { 2001e1051a39Sopenharmony_ci case SSL_TICKET_RETURN_ABORT: 2002e1051a39Sopenharmony_ci ret = SSL_TICKET_FATAL_ERR_OTHER; 2003e1051a39Sopenharmony_ci break; 2004e1051a39Sopenharmony_ci 2005e1051a39Sopenharmony_ci case SSL_TICKET_RETURN_IGNORE: 2006e1051a39Sopenharmony_ci ret = SSL_TICKET_NONE; 2007e1051a39Sopenharmony_ci SSL_SESSION_free(sess); 2008e1051a39Sopenharmony_ci sess = NULL; 2009e1051a39Sopenharmony_ci break; 2010e1051a39Sopenharmony_ci 2011e1051a39Sopenharmony_ci case SSL_TICKET_RETURN_IGNORE_RENEW: 2012e1051a39Sopenharmony_ci if (ret != SSL_TICKET_EMPTY && ret != SSL_TICKET_NO_DECRYPT) 2013e1051a39Sopenharmony_ci ret = SSL_TICKET_NO_DECRYPT; 2014e1051a39Sopenharmony_ci /* else the value of |ret| will already do the right thing */ 2015e1051a39Sopenharmony_ci SSL_SESSION_free(sess); 2016e1051a39Sopenharmony_ci sess = NULL; 2017e1051a39Sopenharmony_ci break; 2018e1051a39Sopenharmony_ci 2019e1051a39Sopenharmony_ci case SSL_TICKET_RETURN_USE: 2020e1051a39Sopenharmony_ci case SSL_TICKET_RETURN_USE_RENEW: 2021e1051a39Sopenharmony_ci if (ret != SSL_TICKET_SUCCESS 2022e1051a39Sopenharmony_ci && ret != SSL_TICKET_SUCCESS_RENEW) 2023e1051a39Sopenharmony_ci ret = SSL_TICKET_FATAL_ERR_OTHER; 2024e1051a39Sopenharmony_ci else if (retcb == SSL_TICKET_RETURN_USE) 2025e1051a39Sopenharmony_ci ret = SSL_TICKET_SUCCESS; 2026e1051a39Sopenharmony_ci else 2027e1051a39Sopenharmony_ci ret = SSL_TICKET_SUCCESS_RENEW; 2028e1051a39Sopenharmony_ci break; 2029e1051a39Sopenharmony_ci 2030e1051a39Sopenharmony_ci default: 2031e1051a39Sopenharmony_ci ret = SSL_TICKET_FATAL_ERR_OTHER; 2032e1051a39Sopenharmony_ci } 2033e1051a39Sopenharmony_ci } 2034e1051a39Sopenharmony_ci 2035e1051a39Sopenharmony_ci if (s->ext.session_secret_cb == NULL || SSL_IS_TLS13(s)) { 2036e1051a39Sopenharmony_ci switch (ret) { 2037e1051a39Sopenharmony_ci case SSL_TICKET_NO_DECRYPT: 2038e1051a39Sopenharmony_ci case SSL_TICKET_SUCCESS_RENEW: 2039e1051a39Sopenharmony_ci case SSL_TICKET_EMPTY: 2040e1051a39Sopenharmony_ci s->ext.ticket_expected = 1; 2041e1051a39Sopenharmony_ci } 2042e1051a39Sopenharmony_ci } 2043e1051a39Sopenharmony_ci 2044e1051a39Sopenharmony_ci *psess = sess; 2045e1051a39Sopenharmony_ci 2046e1051a39Sopenharmony_ci return ret; 2047e1051a39Sopenharmony_ci} 2048e1051a39Sopenharmony_ci 2049e1051a39Sopenharmony_ci/* Check to see if a signature algorithm is allowed */ 2050e1051a39Sopenharmony_cistatic int tls12_sigalg_allowed(const SSL *s, int op, const SIGALG_LOOKUP *lu) 2051e1051a39Sopenharmony_ci{ 2052e1051a39Sopenharmony_ci unsigned char sigalgstr[2]; 2053e1051a39Sopenharmony_ci int secbits; 2054e1051a39Sopenharmony_ci 2055e1051a39Sopenharmony_ci if (lu == NULL || !lu->enabled) 2056e1051a39Sopenharmony_ci return 0; 2057e1051a39Sopenharmony_ci /* DSA is not allowed in TLS 1.3 */ 2058e1051a39Sopenharmony_ci if (SSL_IS_TLS13(s) && lu->sig == EVP_PKEY_DSA) 2059e1051a39Sopenharmony_ci return 0; 2060e1051a39Sopenharmony_ci /* 2061e1051a39Sopenharmony_ci * At some point we should fully axe DSA/etc. in ClientHello as per TLS 1.3 2062e1051a39Sopenharmony_ci * spec 2063e1051a39Sopenharmony_ci */ 2064e1051a39Sopenharmony_ci if (!s->server && !SSL_IS_DTLS(s) && s->s3.tmp.min_ver >= TLS1_3_VERSION 2065e1051a39Sopenharmony_ci && (lu->sig == EVP_PKEY_DSA || lu->hash_idx == SSL_MD_SHA1_IDX 2066e1051a39Sopenharmony_ci || lu->hash_idx == SSL_MD_MD5_IDX 2067e1051a39Sopenharmony_ci || lu->hash_idx == SSL_MD_SHA224_IDX)) 2068e1051a39Sopenharmony_ci return 0; 2069e1051a39Sopenharmony_ci 2070e1051a39Sopenharmony_ci /* See if public key algorithm allowed */ 2071e1051a39Sopenharmony_ci if (ssl_cert_is_disabled(s->ctx, lu->sig_idx)) 2072e1051a39Sopenharmony_ci return 0; 2073e1051a39Sopenharmony_ci 2074e1051a39Sopenharmony_ci if (lu->sig == NID_id_GostR3410_2012_256 2075e1051a39Sopenharmony_ci || lu->sig == NID_id_GostR3410_2012_512 2076e1051a39Sopenharmony_ci || lu->sig == NID_id_GostR3410_2001) { 2077e1051a39Sopenharmony_ci /* We never allow GOST sig algs on the server with TLSv1.3 */ 2078e1051a39Sopenharmony_ci if (s->server && SSL_IS_TLS13(s)) 2079e1051a39Sopenharmony_ci return 0; 2080e1051a39Sopenharmony_ci if (!s->server 2081e1051a39Sopenharmony_ci && s->method->version == TLS_ANY_VERSION 2082e1051a39Sopenharmony_ci && s->s3.tmp.max_ver >= TLS1_3_VERSION) { 2083e1051a39Sopenharmony_ci int i, num; 2084e1051a39Sopenharmony_ci STACK_OF(SSL_CIPHER) *sk; 2085e1051a39Sopenharmony_ci 2086e1051a39Sopenharmony_ci /* 2087e1051a39Sopenharmony_ci * We're a client that could negotiate TLSv1.3. We only allow GOST 2088e1051a39Sopenharmony_ci * sig algs if we could negotiate TLSv1.2 or below and we have GOST 2089e1051a39Sopenharmony_ci * ciphersuites enabled. 2090e1051a39Sopenharmony_ci */ 2091e1051a39Sopenharmony_ci 2092e1051a39Sopenharmony_ci if (s->s3.tmp.min_ver >= TLS1_3_VERSION) 2093e1051a39Sopenharmony_ci return 0; 2094e1051a39Sopenharmony_ci 2095e1051a39Sopenharmony_ci sk = SSL_get_ciphers(s); 2096e1051a39Sopenharmony_ci num = sk != NULL ? sk_SSL_CIPHER_num(sk) : 0; 2097e1051a39Sopenharmony_ci for (i = 0; i < num; i++) { 2098e1051a39Sopenharmony_ci const SSL_CIPHER *c; 2099e1051a39Sopenharmony_ci 2100e1051a39Sopenharmony_ci c = sk_SSL_CIPHER_value(sk, i); 2101e1051a39Sopenharmony_ci /* Skip disabled ciphers */ 2102e1051a39Sopenharmony_ci if (ssl_cipher_disabled(s, c, SSL_SECOP_CIPHER_SUPPORTED, 0)) 2103e1051a39Sopenharmony_ci continue; 2104e1051a39Sopenharmony_ci 2105e1051a39Sopenharmony_ci if ((c->algorithm_mkey & (SSL_kGOST | SSL_kGOST18)) != 0) 2106e1051a39Sopenharmony_ci break; 2107e1051a39Sopenharmony_ci } 2108e1051a39Sopenharmony_ci if (i == num) 2109e1051a39Sopenharmony_ci return 0; 2110e1051a39Sopenharmony_ci } 2111e1051a39Sopenharmony_ci } 2112e1051a39Sopenharmony_ci 2113e1051a39Sopenharmony_ci /* Finally see if security callback allows it */ 2114e1051a39Sopenharmony_ci secbits = sigalg_security_bits(s->ctx, lu); 2115e1051a39Sopenharmony_ci sigalgstr[0] = (lu->sigalg >> 8) & 0xff; 2116e1051a39Sopenharmony_ci sigalgstr[1] = lu->sigalg & 0xff; 2117e1051a39Sopenharmony_ci return ssl_security(s, op, secbits, lu->hash, (void *)sigalgstr); 2118e1051a39Sopenharmony_ci} 2119e1051a39Sopenharmony_ci 2120e1051a39Sopenharmony_ci/* 2121e1051a39Sopenharmony_ci * Get a mask of disabled public key algorithms based on supported signature 2122e1051a39Sopenharmony_ci * algorithms. For example if no signature algorithm supports RSA then RSA is 2123e1051a39Sopenharmony_ci * disabled. 2124e1051a39Sopenharmony_ci */ 2125e1051a39Sopenharmony_ci 2126e1051a39Sopenharmony_civoid ssl_set_sig_mask(uint32_t *pmask_a, SSL *s, int op) 2127e1051a39Sopenharmony_ci{ 2128e1051a39Sopenharmony_ci const uint16_t *sigalgs; 2129e1051a39Sopenharmony_ci size_t i, sigalgslen; 2130e1051a39Sopenharmony_ci uint32_t disabled_mask = SSL_aRSA | SSL_aDSS | SSL_aECDSA; 2131e1051a39Sopenharmony_ci /* 2132e1051a39Sopenharmony_ci * Go through all signature algorithms seeing if we support any 2133e1051a39Sopenharmony_ci * in disabled_mask. 2134e1051a39Sopenharmony_ci */ 2135e1051a39Sopenharmony_ci sigalgslen = tls12_get_psigalgs(s, 1, &sigalgs); 2136e1051a39Sopenharmony_ci for (i = 0; i < sigalgslen; i++, sigalgs++) { 2137e1051a39Sopenharmony_ci const SIGALG_LOOKUP *lu = tls1_lookup_sigalg(s, *sigalgs); 2138e1051a39Sopenharmony_ci const SSL_CERT_LOOKUP *clu; 2139e1051a39Sopenharmony_ci 2140e1051a39Sopenharmony_ci if (lu == NULL) 2141e1051a39Sopenharmony_ci continue; 2142e1051a39Sopenharmony_ci 2143e1051a39Sopenharmony_ci clu = ssl_cert_lookup_by_idx(lu->sig_idx); 2144e1051a39Sopenharmony_ci if (clu == NULL) 2145e1051a39Sopenharmony_ci continue; 2146e1051a39Sopenharmony_ci 2147e1051a39Sopenharmony_ci /* If algorithm is disabled see if we can enable it */ 2148e1051a39Sopenharmony_ci if ((clu->amask & disabled_mask) != 0 2149e1051a39Sopenharmony_ci && tls12_sigalg_allowed(s, op, lu)) 2150e1051a39Sopenharmony_ci disabled_mask &= ~clu->amask; 2151e1051a39Sopenharmony_ci } 2152e1051a39Sopenharmony_ci *pmask_a |= disabled_mask; 2153e1051a39Sopenharmony_ci} 2154e1051a39Sopenharmony_ci 2155e1051a39Sopenharmony_ciint tls12_copy_sigalgs(SSL *s, WPACKET *pkt, 2156e1051a39Sopenharmony_ci const uint16_t *psig, size_t psiglen) 2157e1051a39Sopenharmony_ci{ 2158e1051a39Sopenharmony_ci size_t i; 2159e1051a39Sopenharmony_ci int rv = 0; 2160e1051a39Sopenharmony_ci 2161e1051a39Sopenharmony_ci for (i = 0; i < psiglen; i++, psig++) { 2162e1051a39Sopenharmony_ci const SIGALG_LOOKUP *lu = tls1_lookup_sigalg(s, *psig); 2163e1051a39Sopenharmony_ci 2164e1051a39Sopenharmony_ci if (lu == NULL 2165e1051a39Sopenharmony_ci || !tls12_sigalg_allowed(s, SSL_SECOP_SIGALG_SUPPORTED, lu)) 2166e1051a39Sopenharmony_ci continue; 2167e1051a39Sopenharmony_ci if (!WPACKET_put_bytes_u16(pkt, *psig)) 2168e1051a39Sopenharmony_ci return 0; 2169e1051a39Sopenharmony_ci /* 2170e1051a39Sopenharmony_ci * If TLS 1.3 must have at least one valid TLS 1.3 message 2171e1051a39Sopenharmony_ci * signing algorithm: i.e. neither RSA nor SHA1/SHA224 2172e1051a39Sopenharmony_ci */ 2173e1051a39Sopenharmony_ci if (rv == 0 && (!SSL_IS_TLS13(s) 2174e1051a39Sopenharmony_ci || (lu->sig != EVP_PKEY_RSA 2175e1051a39Sopenharmony_ci && lu->hash != NID_sha1 2176e1051a39Sopenharmony_ci && lu->hash != NID_sha224))) 2177e1051a39Sopenharmony_ci rv = 1; 2178e1051a39Sopenharmony_ci } 2179e1051a39Sopenharmony_ci if (rv == 0) 2180e1051a39Sopenharmony_ci ERR_raise(ERR_LIB_SSL, SSL_R_NO_SUITABLE_SIGNATURE_ALGORITHM); 2181e1051a39Sopenharmony_ci return rv; 2182e1051a39Sopenharmony_ci} 2183e1051a39Sopenharmony_ci 2184e1051a39Sopenharmony_ci/* Given preference and allowed sigalgs set shared sigalgs */ 2185e1051a39Sopenharmony_cistatic size_t tls12_shared_sigalgs(SSL *s, const SIGALG_LOOKUP **shsig, 2186e1051a39Sopenharmony_ci const uint16_t *pref, size_t preflen, 2187e1051a39Sopenharmony_ci const uint16_t *allow, size_t allowlen) 2188e1051a39Sopenharmony_ci{ 2189e1051a39Sopenharmony_ci const uint16_t *ptmp, *atmp; 2190e1051a39Sopenharmony_ci size_t i, j, nmatch = 0; 2191e1051a39Sopenharmony_ci for (i = 0, ptmp = pref; i < preflen; i++, ptmp++) { 2192e1051a39Sopenharmony_ci const SIGALG_LOOKUP *lu = tls1_lookup_sigalg(s, *ptmp); 2193e1051a39Sopenharmony_ci 2194e1051a39Sopenharmony_ci /* Skip disabled hashes or signature algorithms */ 2195e1051a39Sopenharmony_ci if (lu == NULL 2196e1051a39Sopenharmony_ci || !tls12_sigalg_allowed(s, SSL_SECOP_SIGALG_SHARED, lu)) 2197e1051a39Sopenharmony_ci continue; 2198e1051a39Sopenharmony_ci for (j = 0, atmp = allow; j < allowlen; j++, atmp++) { 2199e1051a39Sopenharmony_ci if (*ptmp == *atmp) { 2200e1051a39Sopenharmony_ci nmatch++; 2201e1051a39Sopenharmony_ci if (shsig) 2202e1051a39Sopenharmony_ci *shsig++ = lu; 2203e1051a39Sopenharmony_ci break; 2204e1051a39Sopenharmony_ci } 2205e1051a39Sopenharmony_ci } 2206e1051a39Sopenharmony_ci } 2207e1051a39Sopenharmony_ci return nmatch; 2208e1051a39Sopenharmony_ci} 2209e1051a39Sopenharmony_ci 2210e1051a39Sopenharmony_ci/* Set shared signature algorithms for SSL structures */ 2211e1051a39Sopenharmony_cistatic int tls1_set_shared_sigalgs(SSL *s) 2212e1051a39Sopenharmony_ci{ 2213e1051a39Sopenharmony_ci const uint16_t *pref, *allow, *conf; 2214e1051a39Sopenharmony_ci size_t preflen, allowlen, conflen; 2215e1051a39Sopenharmony_ci size_t nmatch; 2216e1051a39Sopenharmony_ci const SIGALG_LOOKUP **salgs = NULL; 2217e1051a39Sopenharmony_ci CERT *c = s->cert; 2218e1051a39Sopenharmony_ci unsigned int is_suiteb = tls1_suiteb(s); 2219e1051a39Sopenharmony_ci 2220e1051a39Sopenharmony_ci OPENSSL_free(s->shared_sigalgs); 2221e1051a39Sopenharmony_ci s->shared_sigalgs = NULL; 2222e1051a39Sopenharmony_ci s->shared_sigalgslen = 0; 2223e1051a39Sopenharmony_ci /* If client use client signature algorithms if not NULL */ 2224e1051a39Sopenharmony_ci if (!s->server && c->client_sigalgs && !is_suiteb) { 2225e1051a39Sopenharmony_ci conf = c->client_sigalgs; 2226e1051a39Sopenharmony_ci conflen = c->client_sigalgslen; 2227e1051a39Sopenharmony_ci } else if (c->conf_sigalgs && !is_suiteb) { 2228e1051a39Sopenharmony_ci conf = c->conf_sigalgs; 2229e1051a39Sopenharmony_ci conflen = c->conf_sigalgslen; 2230e1051a39Sopenharmony_ci } else 2231e1051a39Sopenharmony_ci conflen = tls12_get_psigalgs(s, 0, &conf); 2232e1051a39Sopenharmony_ci if (s->options & SSL_OP_CIPHER_SERVER_PREFERENCE || is_suiteb) { 2233e1051a39Sopenharmony_ci pref = conf; 2234e1051a39Sopenharmony_ci preflen = conflen; 2235e1051a39Sopenharmony_ci allow = s->s3.tmp.peer_sigalgs; 2236e1051a39Sopenharmony_ci allowlen = s->s3.tmp.peer_sigalgslen; 2237e1051a39Sopenharmony_ci } else { 2238e1051a39Sopenharmony_ci allow = conf; 2239e1051a39Sopenharmony_ci allowlen = conflen; 2240e1051a39Sopenharmony_ci pref = s->s3.tmp.peer_sigalgs; 2241e1051a39Sopenharmony_ci preflen = s->s3.tmp.peer_sigalgslen; 2242e1051a39Sopenharmony_ci } 2243e1051a39Sopenharmony_ci nmatch = tls12_shared_sigalgs(s, NULL, pref, preflen, allow, allowlen); 2244e1051a39Sopenharmony_ci if (nmatch) { 2245e1051a39Sopenharmony_ci if ((salgs = OPENSSL_malloc(nmatch * sizeof(*salgs))) == NULL) { 2246e1051a39Sopenharmony_ci ERR_raise(ERR_LIB_SSL, ERR_R_MALLOC_FAILURE); 2247e1051a39Sopenharmony_ci return 0; 2248e1051a39Sopenharmony_ci } 2249e1051a39Sopenharmony_ci nmatch = tls12_shared_sigalgs(s, salgs, pref, preflen, allow, allowlen); 2250e1051a39Sopenharmony_ci } else { 2251e1051a39Sopenharmony_ci salgs = NULL; 2252e1051a39Sopenharmony_ci } 2253e1051a39Sopenharmony_ci s->shared_sigalgs = salgs; 2254e1051a39Sopenharmony_ci s->shared_sigalgslen = nmatch; 2255e1051a39Sopenharmony_ci return 1; 2256e1051a39Sopenharmony_ci} 2257e1051a39Sopenharmony_ci 2258e1051a39Sopenharmony_ciint tls1_save_u16(PACKET *pkt, uint16_t **pdest, size_t *pdestlen) 2259e1051a39Sopenharmony_ci{ 2260e1051a39Sopenharmony_ci unsigned int stmp; 2261e1051a39Sopenharmony_ci size_t size, i; 2262e1051a39Sopenharmony_ci uint16_t *buf; 2263e1051a39Sopenharmony_ci 2264e1051a39Sopenharmony_ci size = PACKET_remaining(pkt); 2265e1051a39Sopenharmony_ci 2266e1051a39Sopenharmony_ci /* Invalid data length */ 2267e1051a39Sopenharmony_ci if (size == 0 || (size & 1) != 0) 2268e1051a39Sopenharmony_ci return 0; 2269e1051a39Sopenharmony_ci 2270e1051a39Sopenharmony_ci size >>= 1; 2271e1051a39Sopenharmony_ci 2272e1051a39Sopenharmony_ci if ((buf = OPENSSL_malloc(size * sizeof(*buf))) == NULL) { 2273e1051a39Sopenharmony_ci ERR_raise(ERR_LIB_SSL, ERR_R_MALLOC_FAILURE); 2274e1051a39Sopenharmony_ci return 0; 2275e1051a39Sopenharmony_ci } 2276e1051a39Sopenharmony_ci for (i = 0; i < size && PACKET_get_net_2(pkt, &stmp); i++) 2277e1051a39Sopenharmony_ci buf[i] = stmp; 2278e1051a39Sopenharmony_ci 2279e1051a39Sopenharmony_ci if (i != size) { 2280e1051a39Sopenharmony_ci OPENSSL_free(buf); 2281e1051a39Sopenharmony_ci return 0; 2282e1051a39Sopenharmony_ci } 2283e1051a39Sopenharmony_ci 2284e1051a39Sopenharmony_ci OPENSSL_free(*pdest); 2285e1051a39Sopenharmony_ci *pdest = buf; 2286e1051a39Sopenharmony_ci *pdestlen = size; 2287e1051a39Sopenharmony_ci 2288e1051a39Sopenharmony_ci return 1; 2289e1051a39Sopenharmony_ci} 2290e1051a39Sopenharmony_ci 2291e1051a39Sopenharmony_ciint tls1_save_sigalgs(SSL *s, PACKET *pkt, int cert) 2292e1051a39Sopenharmony_ci{ 2293e1051a39Sopenharmony_ci /* Extension ignored for inappropriate versions */ 2294e1051a39Sopenharmony_ci if (!SSL_USE_SIGALGS(s)) 2295e1051a39Sopenharmony_ci return 1; 2296e1051a39Sopenharmony_ci /* Should never happen */ 2297e1051a39Sopenharmony_ci if (s->cert == NULL) 2298e1051a39Sopenharmony_ci return 0; 2299e1051a39Sopenharmony_ci 2300e1051a39Sopenharmony_ci if (cert) 2301e1051a39Sopenharmony_ci return tls1_save_u16(pkt, &s->s3.tmp.peer_cert_sigalgs, 2302e1051a39Sopenharmony_ci &s->s3.tmp.peer_cert_sigalgslen); 2303e1051a39Sopenharmony_ci else 2304e1051a39Sopenharmony_ci return tls1_save_u16(pkt, &s->s3.tmp.peer_sigalgs, 2305e1051a39Sopenharmony_ci &s->s3.tmp.peer_sigalgslen); 2306e1051a39Sopenharmony_ci 2307e1051a39Sopenharmony_ci} 2308e1051a39Sopenharmony_ci 2309e1051a39Sopenharmony_ci/* Set preferred digest for each key type */ 2310e1051a39Sopenharmony_ci 2311e1051a39Sopenharmony_ciint tls1_process_sigalgs(SSL *s) 2312e1051a39Sopenharmony_ci{ 2313e1051a39Sopenharmony_ci size_t i; 2314e1051a39Sopenharmony_ci uint32_t *pvalid = s->s3.tmp.valid_flags; 2315e1051a39Sopenharmony_ci 2316e1051a39Sopenharmony_ci if (!tls1_set_shared_sigalgs(s)) 2317e1051a39Sopenharmony_ci return 0; 2318e1051a39Sopenharmony_ci 2319e1051a39Sopenharmony_ci for (i = 0; i < SSL_PKEY_NUM; i++) 2320e1051a39Sopenharmony_ci pvalid[i] = 0; 2321e1051a39Sopenharmony_ci 2322e1051a39Sopenharmony_ci for (i = 0; i < s->shared_sigalgslen; i++) { 2323e1051a39Sopenharmony_ci const SIGALG_LOOKUP *sigptr = s->shared_sigalgs[i]; 2324e1051a39Sopenharmony_ci int idx = sigptr->sig_idx; 2325e1051a39Sopenharmony_ci 2326e1051a39Sopenharmony_ci /* Ignore PKCS1 based sig algs in TLSv1.3 */ 2327e1051a39Sopenharmony_ci if (SSL_IS_TLS13(s) && sigptr->sig == EVP_PKEY_RSA) 2328e1051a39Sopenharmony_ci continue; 2329e1051a39Sopenharmony_ci /* If not disabled indicate we can explicitly sign */ 2330e1051a39Sopenharmony_ci if (pvalid[idx] == 0 && !ssl_cert_is_disabled(s->ctx, idx)) 2331e1051a39Sopenharmony_ci pvalid[idx] = CERT_PKEY_EXPLICIT_SIGN | CERT_PKEY_SIGN; 2332e1051a39Sopenharmony_ci } 2333e1051a39Sopenharmony_ci return 1; 2334e1051a39Sopenharmony_ci} 2335e1051a39Sopenharmony_ci 2336e1051a39Sopenharmony_ciint SSL_get_sigalgs(SSL *s, int idx, 2337e1051a39Sopenharmony_ci int *psign, int *phash, int *psignhash, 2338e1051a39Sopenharmony_ci unsigned char *rsig, unsigned char *rhash) 2339e1051a39Sopenharmony_ci{ 2340e1051a39Sopenharmony_ci uint16_t *psig = s->s3.tmp.peer_sigalgs; 2341e1051a39Sopenharmony_ci size_t numsigalgs = s->s3.tmp.peer_sigalgslen; 2342e1051a39Sopenharmony_ci if (psig == NULL || numsigalgs > INT_MAX) 2343e1051a39Sopenharmony_ci return 0; 2344e1051a39Sopenharmony_ci if (idx >= 0) { 2345e1051a39Sopenharmony_ci const SIGALG_LOOKUP *lu; 2346e1051a39Sopenharmony_ci 2347e1051a39Sopenharmony_ci if (idx >= (int)numsigalgs) 2348e1051a39Sopenharmony_ci return 0; 2349e1051a39Sopenharmony_ci psig += idx; 2350e1051a39Sopenharmony_ci if (rhash != NULL) 2351e1051a39Sopenharmony_ci *rhash = (unsigned char)((*psig >> 8) & 0xff); 2352e1051a39Sopenharmony_ci if (rsig != NULL) 2353e1051a39Sopenharmony_ci *rsig = (unsigned char)(*psig & 0xff); 2354e1051a39Sopenharmony_ci lu = tls1_lookup_sigalg(s, *psig); 2355e1051a39Sopenharmony_ci if (psign != NULL) 2356e1051a39Sopenharmony_ci *psign = lu != NULL ? lu->sig : NID_undef; 2357e1051a39Sopenharmony_ci if (phash != NULL) 2358e1051a39Sopenharmony_ci *phash = lu != NULL ? lu->hash : NID_undef; 2359e1051a39Sopenharmony_ci if (psignhash != NULL) 2360e1051a39Sopenharmony_ci *psignhash = lu != NULL ? lu->sigandhash : NID_undef; 2361e1051a39Sopenharmony_ci } 2362e1051a39Sopenharmony_ci return (int)numsigalgs; 2363e1051a39Sopenharmony_ci} 2364e1051a39Sopenharmony_ci 2365e1051a39Sopenharmony_ciint SSL_get_shared_sigalgs(SSL *s, int idx, 2366e1051a39Sopenharmony_ci int *psign, int *phash, int *psignhash, 2367e1051a39Sopenharmony_ci unsigned char *rsig, unsigned char *rhash) 2368e1051a39Sopenharmony_ci{ 2369e1051a39Sopenharmony_ci const SIGALG_LOOKUP *shsigalgs; 2370e1051a39Sopenharmony_ci if (s->shared_sigalgs == NULL 2371e1051a39Sopenharmony_ci || idx < 0 2372e1051a39Sopenharmony_ci || idx >= (int)s->shared_sigalgslen 2373e1051a39Sopenharmony_ci || s->shared_sigalgslen > INT_MAX) 2374e1051a39Sopenharmony_ci return 0; 2375e1051a39Sopenharmony_ci shsigalgs = s->shared_sigalgs[idx]; 2376e1051a39Sopenharmony_ci if (phash != NULL) 2377e1051a39Sopenharmony_ci *phash = shsigalgs->hash; 2378e1051a39Sopenharmony_ci if (psign != NULL) 2379e1051a39Sopenharmony_ci *psign = shsigalgs->sig; 2380e1051a39Sopenharmony_ci if (psignhash != NULL) 2381e1051a39Sopenharmony_ci *psignhash = shsigalgs->sigandhash; 2382e1051a39Sopenharmony_ci if (rsig != NULL) 2383e1051a39Sopenharmony_ci *rsig = (unsigned char)(shsigalgs->sigalg & 0xff); 2384e1051a39Sopenharmony_ci if (rhash != NULL) 2385e1051a39Sopenharmony_ci *rhash = (unsigned char)((shsigalgs->sigalg >> 8) & 0xff); 2386e1051a39Sopenharmony_ci return (int)s->shared_sigalgslen; 2387e1051a39Sopenharmony_ci} 2388e1051a39Sopenharmony_ci 2389e1051a39Sopenharmony_ci/* Maximum possible number of unique entries in sigalgs array */ 2390e1051a39Sopenharmony_ci#define TLS_MAX_SIGALGCNT (OSSL_NELEM(sigalg_lookup_tbl) * 2) 2391e1051a39Sopenharmony_ci 2392e1051a39Sopenharmony_citypedef struct { 2393e1051a39Sopenharmony_ci size_t sigalgcnt; 2394e1051a39Sopenharmony_ci /* TLSEXT_SIGALG_XXX values */ 2395e1051a39Sopenharmony_ci uint16_t sigalgs[TLS_MAX_SIGALGCNT]; 2396e1051a39Sopenharmony_ci} sig_cb_st; 2397e1051a39Sopenharmony_ci 2398e1051a39Sopenharmony_cistatic void get_sigorhash(int *psig, int *phash, const char *str) 2399e1051a39Sopenharmony_ci{ 2400e1051a39Sopenharmony_ci if (strcmp(str, "RSA") == 0) { 2401e1051a39Sopenharmony_ci *psig = EVP_PKEY_RSA; 2402e1051a39Sopenharmony_ci } else if (strcmp(str, "RSA-PSS") == 0 || strcmp(str, "PSS") == 0) { 2403e1051a39Sopenharmony_ci *psig = EVP_PKEY_RSA_PSS; 2404e1051a39Sopenharmony_ci } else if (strcmp(str, "DSA") == 0) { 2405e1051a39Sopenharmony_ci *psig = EVP_PKEY_DSA; 2406e1051a39Sopenharmony_ci } else if (strcmp(str, "ECDSA") == 0) { 2407e1051a39Sopenharmony_ci *psig = EVP_PKEY_EC; 2408e1051a39Sopenharmony_ci } else { 2409e1051a39Sopenharmony_ci *phash = OBJ_sn2nid(str); 2410e1051a39Sopenharmony_ci if (*phash == NID_undef) 2411e1051a39Sopenharmony_ci *phash = OBJ_ln2nid(str); 2412e1051a39Sopenharmony_ci } 2413e1051a39Sopenharmony_ci} 2414e1051a39Sopenharmony_ci/* Maximum length of a signature algorithm string component */ 2415e1051a39Sopenharmony_ci#define TLS_MAX_SIGSTRING_LEN 40 2416e1051a39Sopenharmony_ci 2417e1051a39Sopenharmony_cistatic int sig_cb(const char *elem, int len, void *arg) 2418e1051a39Sopenharmony_ci{ 2419e1051a39Sopenharmony_ci sig_cb_st *sarg = arg; 2420e1051a39Sopenharmony_ci size_t i; 2421e1051a39Sopenharmony_ci const SIGALG_LOOKUP *s; 2422e1051a39Sopenharmony_ci char etmp[TLS_MAX_SIGSTRING_LEN], *p; 2423e1051a39Sopenharmony_ci int sig_alg = NID_undef, hash_alg = NID_undef; 2424e1051a39Sopenharmony_ci if (elem == NULL) 2425e1051a39Sopenharmony_ci return 0; 2426e1051a39Sopenharmony_ci if (sarg->sigalgcnt == TLS_MAX_SIGALGCNT) 2427e1051a39Sopenharmony_ci return 0; 2428e1051a39Sopenharmony_ci if (len > (int)(sizeof(etmp) - 1)) 2429e1051a39Sopenharmony_ci return 0; 2430e1051a39Sopenharmony_ci memcpy(etmp, elem, len); 2431e1051a39Sopenharmony_ci etmp[len] = 0; 2432e1051a39Sopenharmony_ci p = strchr(etmp, '+'); 2433e1051a39Sopenharmony_ci /* 2434e1051a39Sopenharmony_ci * We only allow SignatureSchemes listed in the sigalg_lookup_tbl; 2435e1051a39Sopenharmony_ci * if there's no '+' in the provided name, look for the new-style combined 2436e1051a39Sopenharmony_ci * name. If not, match both sig+hash to find the needed SIGALG_LOOKUP. 2437e1051a39Sopenharmony_ci * Just sig+hash is not unique since TLS 1.3 adds rsa_pss_pss_* and 2438e1051a39Sopenharmony_ci * rsa_pss_rsae_* that differ only by public key OID; in such cases 2439e1051a39Sopenharmony_ci * we will pick the _rsae_ variant, by virtue of them appearing earlier 2440e1051a39Sopenharmony_ci * in the table. 2441e1051a39Sopenharmony_ci */ 2442e1051a39Sopenharmony_ci if (p == NULL) { 2443e1051a39Sopenharmony_ci for (i = 0, s = sigalg_lookup_tbl; i < OSSL_NELEM(sigalg_lookup_tbl); 2444e1051a39Sopenharmony_ci i++, s++) { 2445e1051a39Sopenharmony_ci if (s->name != NULL && strcmp(etmp, s->name) == 0) { 2446e1051a39Sopenharmony_ci sarg->sigalgs[sarg->sigalgcnt++] = s->sigalg; 2447e1051a39Sopenharmony_ci break; 2448e1051a39Sopenharmony_ci } 2449e1051a39Sopenharmony_ci } 2450e1051a39Sopenharmony_ci if (i == OSSL_NELEM(sigalg_lookup_tbl)) 2451e1051a39Sopenharmony_ci return 0; 2452e1051a39Sopenharmony_ci } else { 2453e1051a39Sopenharmony_ci *p = 0; 2454e1051a39Sopenharmony_ci p++; 2455e1051a39Sopenharmony_ci if (*p == 0) 2456e1051a39Sopenharmony_ci return 0; 2457e1051a39Sopenharmony_ci get_sigorhash(&sig_alg, &hash_alg, etmp); 2458e1051a39Sopenharmony_ci get_sigorhash(&sig_alg, &hash_alg, p); 2459e1051a39Sopenharmony_ci if (sig_alg == NID_undef || hash_alg == NID_undef) 2460e1051a39Sopenharmony_ci return 0; 2461e1051a39Sopenharmony_ci for (i = 0, s = sigalg_lookup_tbl; i < OSSL_NELEM(sigalg_lookup_tbl); 2462e1051a39Sopenharmony_ci i++, s++) { 2463e1051a39Sopenharmony_ci if (s->hash == hash_alg && s->sig == sig_alg) { 2464e1051a39Sopenharmony_ci sarg->sigalgs[sarg->sigalgcnt++] = s->sigalg; 2465e1051a39Sopenharmony_ci break; 2466e1051a39Sopenharmony_ci } 2467e1051a39Sopenharmony_ci } 2468e1051a39Sopenharmony_ci if (i == OSSL_NELEM(sigalg_lookup_tbl)) 2469e1051a39Sopenharmony_ci return 0; 2470e1051a39Sopenharmony_ci } 2471e1051a39Sopenharmony_ci 2472e1051a39Sopenharmony_ci /* Reject duplicates */ 2473e1051a39Sopenharmony_ci for (i = 0; i < sarg->sigalgcnt - 1; i++) { 2474e1051a39Sopenharmony_ci if (sarg->sigalgs[i] == sarg->sigalgs[sarg->sigalgcnt - 1]) { 2475e1051a39Sopenharmony_ci sarg->sigalgcnt--; 2476e1051a39Sopenharmony_ci return 0; 2477e1051a39Sopenharmony_ci } 2478e1051a39Sopenharmony_ci } 2479e1051a39Sopenharmony_ci return 1; 2480e1051a39Sopenharmony_ci} 2481e1051a39Sopenharmony_ci 2482e1051a39Sopenharmony_ci/* 2483e1051a39Sopenharmony_ci * Set supported signature algorithms based on a colon separated list of the 2484e1051a39Sopenharmony_ci * form sig+hash e.g. RSA+SHA512:DSA+SHA512 2485e1051a39Sopenharmony_ci */ 2486e1051a39Sopenharmony_ciint tls1_set_sigalgs_list(CERT *c, const char *str, int client) 2487e1051a39Sopenharmony_ci{ 2488e1051a39Sopenharmony_ci sig_cb_st sig; 2489e1051a39Sopenharmony_ci sig.sigalgcnt = 0; 2490e1051a39Sopenharmony_ci if (!CONF_parse_list(str, ':', 1, sig_cb, &sig)) 2491e1051a39Sopenharmony_ci return 0; 2492e1051a39Sopenharmony_ci if (c == NULL) 2493e1051a39Sopenharmony_ci return 1; 2494e1051a39Sopenharmony_ci return tls1_set_raw_sigalgs(c, sig.sigalgs, sig.sigalgcnt, client); 2495e1051a39Sopenharmony_ci} 2496e1051a39Sopenharmony_ci 2497e1051a39Sopenharmony_ciint tls1_set_raw_sigalgs(CERT *c, const uint16_t *psigs, size_t salglen, 2498e1051a39Sopenharmony_ci int client) 2499e1051a39Sopenharmony_ci{ 2500e1051a39Sopenharmony_ci uint16_t *sigalgs; 2501e1051a39Sopenharmony_ci 2502e1051a39Sopenharmony_ci if ((sigalgs = OPENSSL_malloc(salglen * sizeof(*sigalgs))) == NULL) { 2503e1051a39Sopenharmony_ci ERR_raise(ERR_LIB_SSL, ERR_R_MALLOC_FAILURE); 2504e1051a39Sopenharmony_ci return 0; 2505e1051a39Sopenharmony_ci } 2506e1051a39Sopenharmony_ci memcpy(sigalgs, psigs, salglen * sizeof(*sigalgs)); 2507e1051a39Sopenharmony_ci 2508e1051a39Sopenharmony_ci if (client) { 2509e1051a39Sopenharmony_ci OPENSSL_free(c->client_sigalgs); 2510e1051a39Sopenharmony_ci c->client_sigalgs = sigalgs; 2511e1051a39Sopenharmony_ci c->client_sigalgslen = salglen; 2512e1051a39Sopenharmony_ci } else { 2513e1051a39Sopenharmony_ci OPENSSL_free(c->conf_sigalgs); 2514e1051a39Sopenharmony_ci c->conf_sigalgs = sigalgs; 2515e1051a39Sopenharmony_ci c->conf_sigalgslen = salglen; 2516e1051a39Sopenharmony_ci } 2517e1051a39Sopenharmony_ci 2518e1051a39Sopenharmony_ci return 1; 2519e1051a39Sopenharmony_ci} 2520e1051a39Sopenharmony_ci 2521e1051a39Sopenharmony_ciint tls1_set_sigalgs(CERT *c, const int *psig_nids, size_t salglen, int client) 2522e1051a39Sopenharmony_ci{ 2523e1051a39Sopenharmony_ci uint16_t *sigalgs, *sptr; 2524e1051a39Sopenharmony_ci size_t i; 2525e1051a39Sopenharmony_ci 2526e1051a39Sopenharmony_ci if (salglen & 1) 2527e1051a39Sopenharmony_ci return 0; 2528e1051a39Sopenharmony_ci if ((sigalgs = OPENSSL_malloc((salglen / 2) * sizeof(*sigalgs))) == NULL) { 2529e1051a39Sopenharmony_ci ERR_raise(ERR_LIB_SSL, ERR_R_MALLOC_FAILURE); 2530e1051a39Sopenharmony_ci return 0; 2531e1051a39Sopenharmony_ci } 2532e1051a39Sopenharmony_ci for (i = 0, sptr = sigalgs; i < salglen; i += 2) { 2533e1051a39Sopenharmony_ci size_t j; 2534e1051a39Sopenharmony_ci const SIGALG_LOOKUP *curr; 2535e1051a39Sopenharmony_ci int md_id = *psig_nids++; 2536e1051a39Sopenharmony_ci int sig_id = *psig_nids++; 2537e1051a39Sopenharmony_ci 2538e1051a39Sopenharmony_ci for (j = 0, curr = sigalg_lookup_tbl; j < OSSL_NELEM(sigalg_lookup_tbl); 2539e1051a39Sopenharmony_ci j++, curr++) { 2540e1051a39Sopenharmony_ci if (curr->hash == md_id && curr->sig == sig_id) { 2541e1051a39Sopenharmony_ci *sptr++ = curr->sigalg; 2542e1051a39Sopenharmony_ci break; 2543e1051a39Sopenharmony_ci } 2544e1051a39Sopenharmony_ci } 2545e1051a39Sopenharmony_ci 2546e1051a39Sopenharmony_ci if (j == OSSL_NELEM(sigalg_lookup_tbl)) 2547e1051a39Sopenharmony_ci goto err; 2548e1051a39Sopenharmony_ci } 2549e1051a39Sopenharmony_ci 2550e1051a39Sopenharmony_ci if (client) { 2551e1051a39Sopenharmony_ci OPENSSL_free(c->client_sigalgs); 2552e1051a39Sopenharmony_ci c->client_sigalgs = sigalgs; 2553e1051a39Sopenharmony_ci c->client_sigalgslen = salglen / 2; 2554e1051a39Sopenharmony_ci } else { 2555e1051a39Sopenharmony_ci OPENSSL_free(c->conf_sigalgs); 2556e1051a39Sopenharmony_ci c->conf_sigalgs = sigalgs; 2557e1051a39Sopenharmony_ci c->conf_sigalgslen = salglen / 2; 2558e1051a39Sopenharmony_ci } 2559e1051a39Sopenharmony_ci 2560e1051a39Sopenharmony_ci return 1; 2561e1051a39Sopenharmony_ci 2562e1051a39Sopenharmony_ci err: 2563e1051a39Sopenharmony_ci OPENSSL_free(sigalgs); 2564e1051a39Sopenharmony_ci return 0; 2565e1051a39Sopenharmony_ci} 2566e1051a39Sopenharmony_ci 2567e1051a39Sopenharmony_cistatic int tls1_check_sig_alg(SSL *s, X509 *x, int default_nid) 2568e1051a39Sopenharmony_ci{ 2569e1051a39Sopenharmony_ci int sig_nid, use_pc_sigalgs = 0; 2570e1051a39Sopenharmony_ci size_t i; 2571e1051a39Sopenharmony_ci const SIGALG_LOOKUP *sigalg; 2572e1051a39Sopenharmony_ci size_t sigalgslen; 2573e1051a39Sopenharmony_ci if (default_nid == -1) 2574e1051a39Sopenharmony_ci return 1; 2575e1051a39Sopenharmony_ci sig_nid = X509_get_signature_nid(x); 2576e1051a39Sopenharmony_ci if (default_nid) 2577e1051a39Sopenharmony_ci return sig_nid == default_nid ? 1 : 0; 2578e1051a39Sopenharmony_ci 2579e1051a39Sopenharmony_ci if (SSL_IS_TLS13(s) && s->s3.tmp.peer_cert_sigalgs != NULL) { 2580e1051a39Sopenharmony_ci /* 2581e1051a39Sopenharmony_ci * If we're in TLSv1.3 then we only get here if we're checking the 2582e1051a39Sopenharmony_ci * chain. If the peer has specified peer_cert_sigalgs then we use them 2583e1051a39Sopenharmony_ci * otherwise we default to normal sigalgs. 2584e1051a39Sopenharmony_ci */ 2585e1051a39Sopenharmony_ci sigalgslen = s->s3.tmp.peer_cert_sigalgslen; 2586e1051a39Sopenharmony_ci use_pc_sigalgs = 1; 2587e1051a39Sopenharmony_ci } else { 2588e1051a39Sopenharmony_ci sigalgslen = s->shared_sigalgslen; 2589e1051a39Sopenharmony_ci } 2590e1051a39Sopenharmony_ci for (i = 0; i < sigalgslen; i++) { 2591e1051a39Sopenharmony_ci sigalg = use_pc_sigalgs 2592e1051a39Sopenharmony_ci ? tls1_lookup_sigalg(s, s->s3.tmp.peer_cert_sigalgs[i]) 2593e1051a39Sopenharmony_ci : s->shared_sigalgs[i]; 2594e1051a39Sopenharmony_ci if (sigalg != NULL && sig_nid == sigalg->sigandhash) 2595e1051a39Sopenharmony_ci return 1; 2596e1051a39Sopenharmony_ci } 2597e1051a39Sopenharmony_ci return 0; 2598e1051a39Sopenharmony_ci} 2599e1051a39Sopenharmony_ci 2600e1051a39Sopenharmony_ci/* Check to see if a certificate issuer name matches list of CA names */ 2601e1051a39Sopenharmony_cistatic int ssl_check_ca_name(STACK_OF(X509_NAME) *names, X509 *x) 2602e1051a39Sopenharmony_ci{ 2603e1051a39Sopenharmony_ci const X509_NAME *nm; 2604e1051a39Sopenharmony_ci int i; 2605e1051a39Sopenharmony_ci nm = X509_get_issuer_name(x); 2606e1051a39Sopenharmony_ci for (i = 0; i < sk_X509_NAME_num(names); i++) { 2607e1051a39Sopenharmony_ci if (!X509_NAME_cmp(nm, sk_X509_NAME_value(names, i))) 2608e1051a39Sopenharmony_ci return 1; 2609e1051a39Sopenharmony_ci } 2610e1051a39Sopenharmony_ci return 0; 2611e1051a39Sopenharmony_ci} 2612e1051a39Sopenharmony_ci 2613e1051a39Sopenharmony_ci/* 2614e1051a39Sopenharmony_ci * Check certificate chain is consistent with TLS extensions and is usable by 2615e1051a39Sopenharmony_ci * server. This servers two purposes: it allows users to check chains before 2616e1051a39Sopenharmony_ci * passing them to the server and it allows the server to check chains before 2617e1051a39Sopenharmony_ci * attempting to use them. 2618e1051a39Sopenharmony_ci */ 2619e1051a39Sopenharmony_ci 2620e1051a39Sopenharmony_ci/* Flags which need to be set for a certificate when strict mode not set */ 2621e1051a39Sopenharmony_ci 2622e1051a39Sopenharmony_ci#define CERT_PKEY_VALID_FLAGS \ 2623e1051a39Sopenharmony_ci (CERT_PKEY_EE_SIGNATURE|CERT_PKEY_EE_PARAM) 2624e1051a39Sopenharmony_ci/* Strict mode flags */ 2625e1051a39Sopenharmony_ci#define CERT_PKEY_STRICT_FLAGS \ 2626e1051a39Sopenharmony_ci (CERT_PKEY_VALID_FLAGS|CERT_PKEY_CA_SIGNATURE|CERT_PKEY_CA_PARAM \ 2627e1051a39Sopenharmony_ci | CERT_PKEY_ISSUER_NAME|CERT_PKEY_CERT_TYPE) 2628e1051a39Sopenharmony_ci 2629e1051a39Sopenharmony_ciint tls1_check_chain(SSL *s, X509 *x, EVP_PKEY *pk, STACK_OF(X509) *chain, 2630e1051a39Sopenharmony_ci int idx) 2631e1051a39Sopenharmony_ci{ 2632e1051a39Sopenharmony_ci int i; 2633e1051a39Sopenharmony_ci int rv = 0; 2634e1051a39Sopenharmony_ci int check_flags = 0, strict_mode; 2635e1051a39Sopenharmony_ci CERT_PKEY *cpk = NULL; 2636e1051a39Sopenharmony_ci CERT *c = s->cert; 2637e1051a39Sopenharmony_ci uint32_t *pvalid; 2638e1051a39Sopenharmony_ci unsigned int suiteb_flags = tls1_suiteb(s); 2639e1051a39Sopenharmony_ci /* idx == -1 means checking server chains */ 2640e1051a39Sopenharmony_ci if (idx != -1) { 2641e1051a39Sopenharmony_ci /* idx == -2 means checking client certificate chains */ 2642e1051a39Sopenharmony_ci if (idx == -2) { 2643e1051a39Sopenharmony_ci cpk = c->key; 2644e1051a39Sopenharmony_ci idx = (int)(cpk - c->pkeys); 2645e1051a39Sopenharmony_ci } else 2646e1051a39Sopenharmony_ci cpk = c->pkeys + idx; 2647e1051a39Sopenharmony_ci pvalid = s->s3.tmp.valid_flags + idx; 2648e1051a39Sopenharmony_ci x = cpk->x509; 2649e1051a39Sopenharmony_ci pk = cpk->privatekey; 2650e1051a39Sopenharmony_ci chain = cpk->chain; 2651e1051a39Sopenharmony_ci strict_mode = c->cert_flags & SSL_CERT_FLAGS_CHECK_TLS_STRICT; 2652e1051a39Sopenharmony_ci /* If no cert or key, forget it */ 2653e1051a39Sopenharmony_ci if (!x || !pk) 2654e1051a39Sopenharmony_ci goto end; 2655e1051a39Sopenharmony_ci } else { 2656e1051a39Sopenharmony_ci size_t certidx; 2657e1051a39Sopenharmony_ci 2658e1051a39Sopenharmony_ci if (!x || !pk) 2659e1051a39Sopenharmony_ci return 0; 2660e1051a39Sopenharmony_ci 2661e1051a39Sopenharmony_ci if (ssl_cert_lookup_by_pkey(pk, &certidx) == NULL) 2662e1051a39Sopenharmony_ci return 0; 2663e1051a39Sopenharmony_ci idx = certidx; 2664e1051a39Sopenharmony_ci pvalid = s->s3.tmp.valid_flags + idx; 2665e1051a39Sopenharmony_ci 2666e1051a39Sopenharmony_ci if (c->cert_flags & SSL_CERT_FLAGS_CHECK_TLS_STRICT) 2667e1051a39Sopenharmony_ci check_flags = CERT_PKEY_STRICT_FLAGS; 2668e1051a39Sopenharmony_ci else 2669e1051a39Sopenharmony_ci check_flags = CERT_PKEY_VALID_FLAGS; 2670e1051a39Sopenharmony_ci strict_mode = 1; 2671e1051a39Sopenharmony_ci } 2672e1051a39Sopenharmony_ci 2673e1051a39Sopenharmony_ci if (suiteb_flags) { 2674e1051a39Sopenharmony_ci int ok; 2675e1051a39Sopenharmony_ci if (check_flags) 2676e1051a39Sopenharmony_ci check_flags |= CERT_PKEY_SUITEB; 2677e1051a39Sopenharmony_ci ok = X509_chain_check_suiteb(NULL, x, chain, suiteb_flags); 2678e1051a39Sopenharmony_ci if (ok == X509_V_OK) 2679e1051a39Sopenharmony_ci rv |= CERT_PKEY_SUITEB; 2680e1051a39Sopenharmony_ci else if (!check_flags) 2681e1051a39Sopenharmony_ci goto end; 2682e1051a39Sopenharmony_ci } 2683e1051a39Sopenharmony_ci 2684e1051a39Sopenharmony_ci /* 2685e1051a39Sopenharmony_ci * Check all signature algorithms are consistent with signature 2686e1051a39Sopenharmony_ci * algorithms extension if TLS 1.2 or later and strict mode. 2687e1051a39Sopenharmony_ci */ 2688e1051a39Sopenharmony_ci if (TLS1_get_version(s) >= TLS1_2_VERSION && strict_mode) { 2689e1051a39Sopenharmony_ci int default_nid; 2690e1051a39Sopenharmony_ci int rsign = 0; 2691e1051a39Sopenharmony_ci if (s->s3.tmp.peer_cert_sigalgs != NULL 2692e1051a39Sopenharmony_ci || s->s3.tmp.peer_sigalgs != NULL) { 2693e1051a39Sopenharmony_ci default_nid = 0; 2694e1051a39Sopenharmony_ci /* If no sigalgs extension use defaults from RFC5246 */ 2695e1051a39Sopenharmony_ci } else { 2696e1051a39Sopenharmony_ci switch (idx) { 2697e1051a39Sopenharmony_ci case SSL_PKEY_RSA: 2698e1051a39Sopenharmony_ci rsign = EVP_PKEY_RSA; 2699e1051a39Sopenharmony_ci default_nid = NID_sha1WithRSAEncryption; 2700e1051a39Sopenharmony_ci break; 2701e1051a39Sopenharmony_ci 2702e1051a39Sopenharmony_ci case SSL_PKEY_DSA_SIGN: 2703e1051a39Sopenharmony_ci rsign = EVP_PKEY_DSA; 2704e1051a39Sopenharmony_ci default_nid = NID_dsaWithSHA1; 2705e1051a39Sopenharmony_ci break; 2706e1051a39Sopenharmony_ci 2707e1051a39Sopenharmony_ci case SSL_PKEY_ECC: 2708e1051a39Sopenharmony_ci rsign = EVP_PKEY_EC; 2709e1051a39Sopenharmony_ci default_nid = NID_ecdsa_with_SHA1; 2710e1051a39Sopenharmony_ci break; 2711e1051a39Sopenharmony_ci 2712e1051a39Sopenharmony_ci case SSL_PKEY_GOST01: 2713e1051a39Sopenharmony_ci rsign = NID_id_GostR3410_2001; 2714e1051a39Sopenharmony_ci default_nid = NID_id_GostR3411_94_with_GostR3410_2001; 2715e1051a39Sopenharmony_ci break; 2716e1051a39Sopenharmony_ci 2717e1051a39Sopenharmony_ci case SSL_PKEY_GOST12_256: 2718e1051a39Sopenharmony_ci rsign = NID_id_GostR3410_2012_256; 2719e1051a39Sopenharmony_ci default_nid = NID_id_tc26_signwithdigest_gost3410_2012_256; 2720e1051a39Sopenharmony_ci break; 2721e1051a39Sopenharmony_ci 2722e1051a39Sopenharmony_ci case SSL_PKEY_GOST12_512: 2723e1051a39Sopenharmony_ci rsign = NID_id_GostR3410_2012_512; 2724e1051a39Sopenharmony_ci default_nid = NID_id_tc26_signwithdigest_gost3410_2012_512; 2725e1051a39Sopenharmony_ci break; 2726e1051a39Sopenharmony_ci 2727e1051a39Sopenharmony_ci default: 2728e1051a39Sopenharmony_ci default_nid = -1; 2729e1051a39Sopenharmony_ci break; 2730e1051a39Sopenharmony_ci } 2731e1051a39Sopenharmony_ci } 2732e1051a39Sopenharmony_ci /* 2733e1051a39Sopenharmony_ci * If peer sent no signature algorithms extension and we have set 2734e1051a39Sopenharmony_ci * preferred signature algorithms check we support sha1. 2735e1051a39Sopenharmony_ci */ 2736e1051a39Sopenharmony_ci if (default_nid > 0 && c->conf_sigalgs) { 2737e1051a39Sopenharmony_ci size_t j; 2738e1051a39Sopenharmony_ci const uint16_t *p = c->conf_sigalgs; 2739e1051a39Sopenharmony_ci for (j = 0; j < c->conf_sigalgslen; j++, p++) { 2740e1051a39Sopenharmony_ci const SIGALG_LOOKUP *lu = tls1_lookup_sigalg(s, *p); 2741e1051a39Sopenharmony_ci 2742e1051a39Sopenharmony_ci if (lu != NULL && lu->hash == NID_sha1 && lu->sig == rsign) 2743e1051a39Sopenharmony_ci break; 2744e1051a39Sopenharmony_ci } 2745e1051a39Sopenharmony_ci if (j == c->conf_sigalgslen) { 2746e1051a39Sopenharmony_ci if (check_flags) 2747e1051a39Sopenharmony_ci goto skip_sigs; 2748e1051a39Sopenharmony_ci else 2749e1051a39Sopenharmony_ci goto end; 2750e1051a39Sopenharmony_ci } 2751e1051a39Sopenharmony_ci } 2752e1051a39Sopenharmony_ci /* Check signature algorithm of each cert in chain */ 2753e1051a39Sopenharmony_ci if (SSL_IS_TLS13(s)) { 2754e1051a39Sopenharmony_ci /* 2755e1051a39Sopenharmony_ci * We only get here if the application has called SSL_check_chain(), 2756e1051a39Sopenharmony_ci * so check_flags is always set. 2757e1051a39Sopenharmony_ci */ 2758e1051a39Sopenharmony_ci if (find_sig_alg(s, x, pk) != NULL) 2759e1051a39Sopenharmony_ci rv |= CERT_PKEY_EE_SIGNATURE; 2760e1051a39Sopenharmony_ci } else if (!tls1_check_sig_alg(s, x, default_nid)) { 2761e1051a39Sopenharmony_ci if (!check_flags) 2762e1051a39Sopenharmony_ci goto end; 2763e1051a39Sopenharmony_ci } else 2764e1051a39Sopenharmony_ci rv |= CERT_PKEY_EE_SIGNATURE; 2765e1051a39Sopenharmony_ci rv |= CERT_PKEY_CA_SIGNATURE; 2766e1051a39Sopenharmony_ci for (i = 0; i < sk_X509_num(chain); i++) { 2767e1051a39Sopenharmony_ci if (!tls1_check_sig_alg(s, sk_X509_value(chain, i), default_nid)) { 2768e1051a39Sopenharmony_ci if (check_flags) { 2769e1051a39Sopenharmony_ci rv &= ~CERT_PKEY_CA_SIGNATURE; 2770e1051a39Sopenharmony_ci break; 2771e1051a39Sopenharmony_ci } else 2772e1051a39Sopenharmony_ci goto end; 2773e1051a39Sopenharmony_ci } 2774e1051a39Sopenharmony_ci } 2775e1051a39Sopenharmony_ci } 2776e1051a39Sopenharmony_ci /* Else not TLS 1.2, so mark EE and CA signing algorithms OK */ 2777e1051a39Sopenharmony_ci else if (check_flags) 2778e1051a39Sopenharmony_ci rv |= CERT_PKEY_EE_SIGNATURE | CERT_PKEY_CA_SIGNATURE; 2779e1051a39Sopenharmony_ci skip_sigs: 2780e1051a39Sopenharmony_ci /* Check cert parameters are consistent */ 2781e1051a39Sopenharmony_ci if (tls1_check_cert_param(s, x, 1)) 2782e1051a39Sopenharmony_ci rv |= CERT_PKEY_EE_PARAM; 2783e1051a39Sopenharmony_ci else if (!check_flags) 2784e1051a39Sopenharmony_ci goto end; 2785e1051a39Sopenharmony_ci if (!s->server) 2786e1051a39Sopenharmony_ci rv |= CERT_PKEY_CA_PARAM; 2787e1051a39Sopenharmony_ci /* In strict mode check rest of chain too */ 2788e1051a39Sopenharmony_ci else if (strict_mode) { 2789e1051a39Sopenharmony_ci rv |= CERT_PKEY_CA_PARAM; 2790e1051a39Sopenharmony_ci for (i = 0; i < sk_X509_num(chain); i++) { 2791e1051a39Sopenharmony_ci X509 *ca = sk_X509_value(chain, i); 2792e1051a39Sopenharmony_ci if (!tls1_check_cert_param(s, ca, 0)) { 2793e1051a39Sopenharmony_ci if (check_flags) { 2794e1051a39Sopenharmony_ci rv &= ~CERT_PKEY_CA_PARAM; 2795e1051a39Sopenharmony_ci break; 2796e1051a39Sopenharmony_ci } else 2797e1051a39Sopenharmony_ci goto end; 2798e1051a39Sopenharmony_ci } 2799e1051a39Sopenharmony_ci } 2800e1051a39Sopenharmony_ci } 2801e1051a39Sopenharmony_ci if (!s->server && strict_mode) { 2802e1051a39Sopenharmony_ci STACK_OF(X509_NAME) *ca_dn; 2803e1051a39Sopenharmony_ci int check_type = 0; 2804e1051a39Sopenharmony_ci 2805e1051a39Sopenharmony_ci if (EVP_PKEY_is_a(pk, "RSA")) 2806e1051a39Sopenharmony_ci check_type = TLS_CT_RSA_SIGN; 2807e1051a39Sopenharmony_ci else if (EVP_PKEY_is_a(pk, "DSA")) 2808e1051a39Sopenharmony_ci check_type = TLS_CT_DSS_SIGN; 2809e1051a39Sopenharmony_ci else if (EVP_PKEY_is_a(pk, "EC")) 2810e1051a39Sopenharmony_ci check_type = TLS_CT_ECDSA_SIGN; 2811e1051a39Sopenharmony_ci 2812e1051a39Sopenharmony_ci if (check_type) { 2813e1051a39Sopenharmony_ci const uint8_t *ctypes = s->s3.tmp.ctype; 2814e1051a39Sopenharmony_ci size_t j; 2815e1051a39Sopenharmony_ci 2816e1051a39Sopenharmony_ci for (j = 0; j < s->s3.tmp.ctype_len; j++, ctypes++) { 2817e1051a39Sopenharmony_ci if (*ctypes == check_type) { 2818e1051a39Sopenharmony_ci rv |= CERT_PKEY_CERT_TYPE; 2819e1051a39Sopenharmony_ci break; 2820e1051a39Sopenharmony_ci } 2821e1051a39Sopenharmony_ci } 2822e1051a39Sopenharmony_ci if (!(rv & CERT_PKEY_CERT_TYPE) && !check_flags) 2823e1051a39Sopenharmony_ci goto end; 2824e1051a39Sopenharmony_ci } else { 2825e1051a39Sopenharmony_ci rv |= CERT_PKEY_CERT_TYPE; 2826e1051a39Sopenharmony_ci } 2827e1051a39Sopenharmony_ci 2828e1051a39Sopenharmony_ci ca_dn = s->s3.tmp.peer_ca_names; 2829e1051a39Sopenharmony_ci 2830e1051a39Sopenharmony_ci if (ca_dn == NULL 2831e1051a39Sopenharmony_ci || sk_X509_NAME_num(ca_dn) == 0 2832e1051a39Sopenharmony_ci || ssl_check_ca_name(ca_dn, x)) 2833e1051a39Sopenharmony_ci rv |= CERT_PKEY_ISSUER_NAME; 2834e1051a39Sopenharmony_ci else 2835e1051a39Sopenharmony_ci for (i = 0; i < sk_X509_num(chain); i++) { 2836e1051a39Sopenharmony_ci X509 *xtmp = sk_X509_value(chain, i); 2837e1051a39Sopenharmony_ci 2838e1051a39Sopenharmony_ci if (ssl_check_ca_name(ca_dn, xtmp)) { 2839e1051a39Sopenharmony_ci rv |= CERT_PKEY_ISSUER_NAME; 2840e1051a39Sopenharmony_ci break; 2841e1051a39Sopenharmony_ci } 2842e1051a39Sopenharmony_ci } 2843e1051a39Sopenharmony_ci 2844e1051a39Sopenharmony_ci if (!check_flags && !(rv & CERT_PKEY_ISSUER_NAME)) 2845e1051a39Sopenharmony_ci goto end; 2846e1051a39Sopenharmony_ci } else 2847e1051a39Sopenharmony_ci rv |= CERT_PKEY_ISSUER_NAME | CERT_PKEY_CERT_TYPE; 2848e1051a39Sopenharmony_ci 2849e1051a39Sopenharmony_ci if (!check_flags || (rv & check_flags) == check_flags) 2850e1051a39Sopenharmony_ci rv |= CERT_PKEY_VALID; 2851e1051a39Sopenharmony_ci 2852e1051a39Sopenharmony_ci end: 2853e1051a39Sopenharmony_ci 2854e1051a39Sopenharmony_ci if (TLS1_get_version(s) >= TLS1_2_VERSION) 2855e1051a39Sopenharmony_ci rv |= *pvalid & (CERT_PKEY_EXPLICIT_SIGN | CERT_PKEY_SIGN); 2856e1051a39Sopenharmony_ci else 2857e1051a39Sopenharmony_ci rv |= CERT_PKEY_SIGN | CERT_PKEY_EXPLICIT_SIGN; 2858e1051a39Sopenharmony_ci 2859e1051a39Sopenharmony_ci /* 2860e1051a39Sopenharmony_ci * When checking a CERT_PKEY structure all flags are irrelevant if the 2861e1051a39Sopenharmony_ci * chain is invalid. 2862e1051a39Sopenharmony_ci */ 2863e1051a39Sopenharmony_ci if (!check_flags) { 2864e1051a39Sopenharmony_ci if (rv & CERT_PKEY_VALID) { 2865e1051a39Sopenharmony_ci *pvalid = rv; 2866e1051a39Sopenharmony_ci } else { 2867e1051a39Sopenharmony_ci /* Preserve sign and explicit sign flag, clear rest */ 2868e1051a39Sopenharmony_ci *pvalid &= CERT_PKEY_EXPLICIT_SIGN | CERT_PKEY_SIGN; 2869e1051a39Sopenharmony_ci return 0; 2870e1051a39Sopenharmony_ci } 2871e1051a39Sopenharmony_ci } 2872e1051a39Sopenharmony_ci return rv; 2873e1051a39Sopenharmony_ci} 2874e1051a39Sopenharmony_ci 2875e1051a39Sopenharmony_ci/* Set validity of certificates in an SSL structure */ 2876e1051a39Sopenharmony_civoid tls1_set_cert_validity(SSL *s) 2877e1051a39Sopenharmony_ci{ 2878e1051a39Sopenharmony_ci tls1_check_chain(s, NULL, NULL, NULL, SSL_PKEY_RSA); 2879e1051a39Sopenharmony_ci tls1_check_chain(s, NULL, NULL, NULL, SSL_PKEY_RSA_PSS_SIGN); 2880e1051a39Sopenharmony_ci tls1_check_chain(s, NULL, NULL, NULL, SSL_PKEY_DSA_SIGN); 2881e1051a39Sopenharmony_ci tls1_check_chain(s, NULL, NULL, NULL, SSL_PKEY_ECC); 2882e1051a39Sopenharmony_ci tls1_check_chain(s, NULL, NULL, NULL, SSL_PKEY_GOST01); 2883e1051a39Sopenharmony_ci tls1_check_chain(s, NULL, NULL, NULL, SSL_PKEY_GOST12_256); 2884e1051a39Sopenharmony_ci tls1_check_chain(s, NULL, NULL, NULL, SSL_PKEY_GOST12_512); 2885e1051a39Sopenharmony_ci tls1_check_chain(s, NULL, NULL, NULL, SSL_PKEY_ED25519); 2886e1051a39Sopenharmony_ci tls1_check_chain(s, NULL, NULL, NULL, SSL_PKEY_ED448); 2887e1051a39Sopenharmony_ci} 2888e1051a39Sopenharmony_ci 2889e1051a39Sopenharmony_ci/* User level utility function to check a chain is suitable */ 2890e1051a39Sopenharmony_ciint SSL_check_chain(SSL *s, X509 *x, EVP_PKEY *pk, STACK_OF(X509) *chain) 2891e1051a39Sopenharmony_ci{ 2892e1051a39Sopenharmony_ci return tls1_check_chain(s, x, pk, chain, -1); 2893e1051a39Sopenharmony_ci} 2894e1051a39Sopenharmony_ci 2895e1051a39Sopenharmony_ciEVP_PKEY *ssl_get_auto_dh(SSL *s) 2896e1051a39Sopenharmony_ci{ 2897e1051a39Sopenharmony_ci EVP_PKEY *dhp = NULL; 2898e1051a39Sopenharmony_ci BIGNUM *p; 2899e1051a39Sopenharmony_ci int dh_secbits = 80, sec_level_bits; 2900e1051a39Sopenharmony_ci EVP_PKEY_CTX *pctx = NULL; 2901e1051a39Sopenharmony_ci OSSL_PARAM_BLD *tmpl = NULL; 2902e1051a39Sopenharmony_ci OSSL_PARAM *params = NULL; 2903e1051a39Sopenharmony_ci 2904e1051a39Sopenharmony_ci if (s->cert->dh_tmp_auto != 2) { 2905e1051a39Sopenharmony_ci if (s->s3.tmp.new_cipher->algorithm_auth & (SSL_aNULL | SSL_aPSK)) { 2906e1051a39Sopenharmony_ci if (s->s3.tmp.new_cipher->strength_bits == 256) 2907e1051a39Sopenharmony_ci dh_secbits = 128; 2908e1051a39Sopenharmony_ci else 2909e1051a39Sopenharmony_ci dh_secbits = 80; 2910e1051a39Sopenharmony_ci } else { 2911e1051a39Sopenharmony_ci if (s->s3.tmp.cert == NULL) 2912e1051a39Sopenharmony_ci return NULL; 2913e1051a39Sopenharmony_ci dh_secbits = EVP_PKEY_get_security_bits(s->s3.tmp.cert->privatekey); 2914e1051a39Sopenharmony_ci } 2915e1051a39Sopenharmony_ci } 2916e1051a39Sopenharmony_ci 2917e1051a39Sopenharmony_ci /* Do not pick a prime that is too weak for the current security level */ 2918e1051a39Sopenharmony_ci sec_level_bits = ssl_get_security_level_bits(s, NULL, NULL); 2919e1051a39Sopenharmony_ci if (dh_secbits < sec_level_bits) 2920e1051a39Sopenharmony_ci dh_secbits = sec_level_bits; 2921e1051a39Sopenharmony_ci 2922e1051a39Sopenharmony_ci if (dh_secbits >= 192) 2923e1051a39Sopenharmony_ci p = BN_get_rfc3526_prime_8192(NULL); 2924e1051a39Sopenharmony_ci else if (dh_secbits >= 152) 2925e1051a39Sopenharmony_ci p = BN_get_rfc3526_prime_4096(NULL); 2926e1051a39Sopenharmony_ci else if (dh_secbits >= 128) 2927e1051a39Sopenharmony_ci p = BN_get_rfc3526_prime_3072(NULL); 2928e1051a39Sopenharmony_ci else if (dh_secbits >= 112) 2929e1051a39Sopenharmony_ci p = BN_get_rfc3526_prime_2048(NULL); 2930e1051a39Sopenharmony_ci else 2931e1051a39Sopenharmony_ci p = BN_get_rfc2409_prime_1024(NULL); 2932e1051a39Sopenharmony_ci if (p == NULL) 2933e1051a39Sopenharmony_ci goto err; 2934e1051a39Sopenharmony_ci 2935e1051a39Sopenharmony_ci pctx = EVP_PKEY_CTX_new_from_name(s->ctx->libctx, "DH", s->ctx->propq); 2936e1051a39Sopenharmony_ci if (pctx == NULL 2937e1051a39Sopenharmony_ci || EVP_PKEY_fromdata_init(pctx) != 1) 2938e1051a39Sopenharmony_ci goto err; 2939e1051a39Sopenharmony_ci 2940e1051a39Sopenharmony_ci tmpl = OSSL_PARAM_BLD_new(); 2941e1051a39Sopenharmony_ci if (tmpl == NULL 2942e1051a39Sopenharmony_ci || !OSSL_PARAM_BLD_push_BN(tmpl, OSSL_PKEY_PARAM_FFC_P, p) 2943e1051a39Sopenharmony_ci || !OSSL_PARAM_BLD_push_uint(tmpl, OSSL_PKEY_PARAM_FFC_G, 2)) 2944e1051a39Sopenharmony_ci goto err; 2945e1051a39Sopenharmony_ci 2946e1051a39Sopenharmony_ci params = OSSL_PARAM_BLD_to_param(tmpl); 2947e1051a39Sopenharmony_ci if (params == NULL 2948e1051a39Sopenharmony_ci || EVP_PKEY_fromdata(pctx, &dhp, EVP_PKEY_KEY_PARAMETERS, params) != 1) 2949e1051a39Sopenharmony_ci goto err; 2950e1051a39Sopenharmony_ci 2951e1051a39Sopenharmony_cierr: 2952e1051a39Sopenharmony_ci OSSL_PARAM_free(params); 2953e1051a39Sopenharmony_ci OSSL_PARAM_BLD_free(tmpl); 2954e1051a39Sopenharmony_ci EVP_PKEY_CTX_free(pctx); 2955e1051a39Sopenharmony_ci BN_free(p); 2956e1051a39Sopenharmony_ci return dhp; 2957e1051a39Sopenharmony_ci} 2958e1051a39Sopenharmony_ci 2959e1051a39Sopenharmony_cistatic int ssl_security_cert_key(SSL *s, SSL_CTX *ctx, X509 *x, int op) 2960e1051a39Sopenharmony_ci{ 2961e1051a39Sopenharmony_ci int secbits = -1; 2962e1051a39Sopenharmony_ci EVP_PKEY *pkey = X509_get0_pubkey(x); 2963e1051a39Sopenharmony_ci if (pkey) { 2964e1051a39Sopenharmony_ci /* 2965e1051a39Sopenharmony_ci * If no parameters this will return -1 and fail using the default 2966e1051a39Sopenharmony_ci * security callback for any non-zero security level. This will 2967e1051a39Sopenharmony_ci * reject keys which omit parameters but this only affects DSA and 2968e1051a39Sopenharmony_ci * omission of parameters is never (?) done in practice. 2969e1051a39Sopenharmony_ci */ 2970e1051a39Sopenharmony_ci secbits = EVP_PKEY_get_security_bits(pkey); 2971e1051a39Sopenharmony_ci } 2972e1051a39Sopenharmony_ci if (s) 2973e1051a39Sopenharmony_ci return ssl_security(s, op, secbits, 0, x); 2974e1051a39Sopenharmony_ci else 2975e1051a39Sopenharmony_ci return ssl_ctx_security(ctx, op, secbits, 0, x); 2976e1051a39Sopenharmony_ci} 2977e1051a39Sopenharmony_ci 2978e1051a39Sopenharmony_cistatic int ssl_security_cert_sig(SSL *s, SSL_CTX *ctx, X509 *x, int op) 2979e1051a39Sopenharmony_ci{ 2980e1051a39Sopenharmony_ci /* Lookup signature algorithm digest */ 2981e1051a39Sopenharmony_ci int secbits, nid, pknid; 2982e1051a39Sopenharmony_ci /* Don't check signature if self signed */ 2983e1051a39Sopenharmony_ci if ((X509_get_extension_flags(x) & EXFLAG_SS) != 0) 2984e1051a39Sopenharmony_ci return 1; 2985e1051a39Sopenharmony_ci if (!X509_get_signature_info(x, &nid, &pknid, &secbits, NULL)) 2986e1051a39Sopenharmony_ci secbits = -1; 2987e1051a39Sopenharmony_ci /* If digest NID not defined use signature NID */ 2988e1051a39Sopenharmony_ci if (nid == NID_undef) 2989e1051a39Sopenharmony_ci nid = pknid; 2990e1051a39Sopenharmony_ci if (s) 2991e1051a39Sopenharmony_ci return ssl_security(s, op, secbits, nid, x); 2992e1051a39Sopenharmony_ci else 2993e1051a39Sopenharmony_ci return ssl_ctx_security(ctx, op, secbits, nid, x); 2994e1051a39Sopenharmony_ci} 2995e1051a39Sopenharmony_ci 2996e1051a39Sopenharmony_ciint ssl_security_cert(SSL *s, SSL_CTX *ctx, X509 *x, int vfy, int is_ee) 2997e1051a39Sopenharmony_ci{ 2998e1051a39Sopenharmony_ci if (vfy) 2999e1051a39Sopenharmony_ci vfy = SSL_SECOP_PEER; 3000e1051a39Sopenharmony_ci if (is_ee) { 3001e1051a39Sopenharmony_ci if (!ssl_security_cert_key(s, ctx, x, SSL_SECOP_EE_KEY | vfy)) 3002e1051a39Sopenharmony_ci return SSL_R_EE_KEY_TOO_SMALL; 3003e1051a39Sopenharmony_ci } else { 3004e1051a39Sopenharmony_ci if (!ssl_security_cert_key(s, ctx, x, SSL_SECOP_CA_KEY | vfy)) 3005e1051a39Sopenharmony_ci return SSL_R_CA_KEY_TOO_SMALL; 3006e1051a39Sopenharmony_ci } 3007e1051a39Sopenharmony_ci if (!ssl_security_cert_sig(s, ctx, x, SSL_SECOP_CA_MD | vfy)) 3008e1051a39Sopenharmony_ci return SSL_R_CA_MD_TOO_WEAK; 3009e1051a39Sopenharmony_ci return 1; 3010e1051a39Sopenharmony_ci} 3011e1051a39Sopenharmony_ci 3012e1051a39Sopenharmony_ci/* 3013e1051a39Sopenharmony_ci * Check security of a chain, if |sk| includes the end entity certificate then 3014e1051a39Sopenharmony_ci * |x| is NULL. If |vfy| is 1 then we are verifying a peer chain and not sending 3015e1051a39Sopenharmony_ci * one to the peer. Return values: 1 if ok otherwise error code to use 3016e1051a39Sopenharmony_ci */ 3017e1051a39Sopenharmony_ci 3018e1051a39Sopenharmony_ciint ssl_security_cert_chain(SSL *s, STACK_OF(X509) *sk, X509 *x, int vfy) 3019e1051a39Sopenharmony_ci{ 3020e1051a39Sopenharmony_ci int rv, start_idx, i; 3021e1051a39Sopenharmony_ci if (x == NULL) { 3022e1051a39Sopenharmony_ci x = sk_X509_value(sk, 0); 3023e1051a39Sopenharmony_ci if (x == NULL) 3024e1051a39Sopenharmony_ci return ERR_R_INTERNAL_ERROR; 3025e1051a39Sopenharmony_ci start_idx = 1; 3026e1051a39Sopenharmony_ci } else 3027e1051a39Sopenharmony_ci start_idx = 0; 3028e1051a39Sopenharmony_ci 3029e1051a39Sopenharmony_ci rv = ssl_security_cert(s, NULL, x, vfy, 1); 3030e1051a39Sopenharmony_ci if (rv != 1) 3031e1051a39Sopenharmony_ci return rv; 3032e1051a39Sopenharmony_ci 3033e1051a39Sopenharmony_ci for (i = start_idx; i < sk_X509_num(sk); i++) { 3034e1051a39Sopenharmony_ci x = sk_X509_value(sk, i); 3035e1051a39Sopenharmony_ci rv = ssl_security_cert(s, NULL, x, vfy, 0); 3036e1051a39Sopenharmony_ci if (rv != 1) 3037e1051a39Sopenharmony_ci return rv; 3038e1051a39Sopenharmony_ci } 3039e1051a39Sopenharmony_ci return 1; 3040e1051a39Sopenharmony_ci} 3041e1051a39Sopenharmony_ci 3042e1051a39Sopenharmony_ci/* 3043e1051a39Sopenharmony_ci * For TLS 1.2 servers check if we have a certificate which can be used 3044e1051a39Sopenharmony_ci * with the signature algorithm "lu" and return index of certificate. 3045e1051a39Sopenharmony_ci */ 3046e1051a39Sopenharmony_ci 3047e1051a39Sopenharmony_cistatic int tls12_get_cert_sigalg_idx(const SSL *s, const SIGALG_LOOKUP *lu) 3048e1051a39Sopenharmony_ci{ 3049e1051a39Sopenharmony_ci int sig_idx = lu->sig_idx; 3050e1051a39Sopenharmony_ci const SSL_CERT_LOOKUP *clu = ssl_cert_lookup_by_idx(sig_idx); 3051e1051a39Sopenharmony_ci 3052e1051a39Sopenharmony_ci /* If not recognised or not supported by cipher mask it is not suitable */ 3053e1051a39Sopenharmony_ci if (clu == NULL 3054e1051a39Sopenharmony_ci || (clu->amask & s->s3.tmp.new_cipher->algorithm_auth) == 0 3055e1051a39Sopenharmony_ci || (clu->nid == EVP_PKEY_RSA_PSS 3056e1051a39Sopenharmony_ci && (s->s3.tmp.new_cipher->algorithm_mkey & SSL_kRSA) != 0)) 3057e1051a39Sopenharmony_ci return -1; 3058e1051a39Sopenharmony_ci 3059e1051a39Sopenharmony_ci return s->s3.tmp.valid_flags[sig_idx] & CERT_PKEY_VALID ? sig_idx : -1; 3060e1051a39Sopenharmony_ci} 3061e1051a39Sopenharmony_ci 3062e1051a39Sopenharmony_ci/* 3063e1051a39Sopenharmony_ci * Checks the given cert against signature_algorithm_cert restrictions sent by 3064e1051a39Sopenharmony_ci * the peer (if any) as well as whether the hash from the sigalg is usable with 3065e1051a39Sopenharmony_ci * the key. 3066e1051a39Sopenharmony_ci * Returns true if the cert is usable and false otherwise. 3067e1051a39Sopenharmony_ci */ 3068e1051a39Sopenharmony_cistatic int check_cert_usable(SSL *s, const SIGALG_LOOKUP *sig, X509 *x, 3069e1051a39Sopenharmony_ci EVP_PKEY *pkey) 3070e1051a39Sopenharmony_ci{ 3071e1051a39Sopenharmony_ci const SIGALG_LOOKUP *lu; 3072e1051a39Sopenharmony_ci int mdnid, pknid, supported; 3073e1051a39Sopenharmony_ci size_t i; 3074e1051a39Sopenharmony_ci const char *mdname = NULL; 3075e1051a39Sopenharmony_ci 3076e1051a39Sopenharmony_ci /* 3077e1051a39Sopenharmony_ci * If the given EVP_PKEY cannot support signing with this digest, 3078e1051a39Sopenharmony_ci * the answer is simply 'no'. 3079e1051a39Sopenharmony_ci */ 3080e1051a39Sopenharmony_ci if (sig->hash != NID_undef) 3081e1051a39Sopenharmony_ci mdname = OBJ_nid2sn(sig->hash); 3082e1051a39Sopenharmony_ci supported = EVP_PKEY_digestsign_supports_digest(pkey, s->ctx->libctx, 3083e1051a39Sopenharmony_ci mdname, 3084e1051a39Sopenharmony_ci s->ctx->propq); 3085e1051a39Sopenharmony_ci if (supported <= 0) 3086e1051a39Sopenharmony_ci return 0; 3087e1051a39Sopenharmony_ci 3088e1051a39Sopenharmony_ci /* 3089e1051a39Sopenharmony_ci * The TLS 1.3 signature_algorithms_cert extension places restrictions 3090e1051a39Sopenharmony_ci * on the sigalg with which the certificate was signed (by its issuer). 3091e1051a39Sopenharmony_ci */ 3092e1051a39Sopenharmony_ci if (s->s3.tmp.peer_cert_sigalgs != NULL) { 3093e1051a39Sopenharmony_ci if (!X509_get_signature_info(x, &mdnid, &pknid, NULL, NULL)) 3094e1051a39Sopenharmony_ci return 0; 3095e1051a39Sopenharmony_ci for (i = 0; i < s->s3.tmp.peer_cert_sigalgslen; i++) { 3096e1051a39Sopenharmony_ci lu = tls1_lookup_sigalg(s, s->s3.tmp.peer_cert_sigalgs[i]); 3097e1051a39Sopenharmony_ci if (lu == NULL) 3098e1051a39Sopenharmony_ci continue; 3099e1051a39Sopenharmony_ci 3100e1051a39Sopenharmony_ci /* 3101e1051a39Sopenharmony_ci * This does not differentiate between the 3102e1051a39Sopenharmony_ci * rsa_pss_pss_* and rsa_pss_rsae_* schemes since we do not 3103e1051a39Sopenharmony_ci * have a chain here that lets us look at the key OID in the 3104e1051a39Sopenharmony_ci * signing certificate. 3105e1051a39Sopenharmony_ci */ 3106e1051a39Sopenharmony_ci if (mdnid == lu->hash && pknid == lu->sig) 3107e1051a39Sopenharmony_ci return 1; 3108e1051a39Sopenharmony_ci } 3109e1051a39Sopenharmony_ci return 0; 3110e1051a39Sopenharmony_ci } 3111e1051a39Sopenharmony_ci 3112e1051a39Sopenharmony_ci /* 3113e1051a39Sopenharmony_ci * Without signat_algorithms_cert, any certificate for which we have 3114e1051a39Sopenharmony_ci * a viable public key is permitted. 3115e1051a39Sopenharmony_ci */ 3116e1051a39Sopenharmony_ci return 1; 3117e1051a39Sopenharmony_ci} 3118e1051a39Sopenharmony_ci 3119e1051a39Sopenharmony_ci/* 3120e1051a39Sopenharmony_ci * Returns true if |s| has a usable certificate configured for use 3121e1051a39Sopenharmony_ci * with signature scheme |sig|. 3122e1051a39Sopenharmony_ci * "Usable" includes a check for presence as well as applying 3123e1051a39Sopenharmony_ci * the signature_algorithm_cert restrictions sent by the peer (if any). 3124e1051a39Sopenharmony_ci * Returns false if no usable certificate is found. 3125e1051a39Sopenharmony_ci */ 3126e1051a39Sopenharmony_cistatic int has_usable_cert(SSL *s, const SIGALG_LOOKUP *sig, int idx) 3127e1051a39Sopenharmony_ci{ 3128e1051a39Sopenharmony_ci /* TLS 1.2 callers can override sig->sig_idx, but not TLS 1.3 callers. */ 3129e1051a39Sopenharmony_ci if (idx == -1) 3130e1051a39Sopenharmony_ci idx = sig->sig_idx; 3131e1051a39Sopenharmony_ci if (!ssl_has_cert(s, idx)) 3132e1051a39Sopenharmony_ci return 0; 3133e1051a39Sopenharmony_ci 3134e1051a39Sopenharmony_ci return check_cert_usable(s, sig, s->cert->pkeys[idx].x509, 3135e1051a39Sopenharmony_ci s->cert->pkeys[idx].privatekey); 3136e1051a39Sopenharmony_ci} 3137e1051a39Sopenharmony_ci 3138e1051a39Sopenharmony_ci/* 3139e1051a39Sopenharmony_ci * Returns true if the supplied cert |x| and key |pkey| is usable with the 3140e1051a39Sopenharmony_ci * specified signature scheme |sig|, or false otherwise. 3141e1051a39Sopenharmony_ci */ 3142e1051a39Sopenharmony_cistatic int is_cert_usable(SSL *s, const SIGALG_LOOKUP *sig, X509 *x, 3143e1051a39Sopenharmony_ci EVP_PKEY *pkey) 3144e1051a39Sopenharmony_ci{ 3145e1051a39Sopenharmony_ci size_t idx; 3146e1051a39Sopenharmony_ci 3147e1051a39Sopenharmony_ci if (ssl_cert_lookup_by_pkey(pkey, &idx) == NULL) 3148e1051a39Sopenharmony_ci return 0; 3149e1051a39Sopenharmony_ci 3150e1051a39Sopenharmony_ci /* Check the key is consistent with the sig alg */ 3151e1051a39Sopenharmony_ci if ((int)idx != sig->sig_idx) 3152e1051a39Sopenharmony_ci return 0; 3153e1051a39Sopenharmony_ci 3154e1051a39Sopenharmony_ci return check_cert_usable(s, sig, x, pkey); 3155e1051a39Sopenharmony_ci} 3156e1051a39Sopenharmony_ci 3157e1051a39Sopenharmony_ci/* 3158e1051a39Sopenharmony_ci * Find a signature scheme that works with the supplied certificate |x| and key 3159e1051a39Sopenharmony_ci * |pkey|. |x| and |pkey| may be NULL in which case we additionally look at our 3160e1051a39Sopenharmony_ci * available certs/keys to find one that works. 3161e1051a39Sopenharmony_ci */ 3162e1051a39Sopenharmony_cistatic const SIGALG_LOOKUP *find_sig_alg(SSL *s, X509 *x, EVP_PKEY *pkey) 3163e1051a39Sopenharmony_ci{ 3164e1051a39Sopenharmony_ci const SIGALG_LOOKUP *lu = NULL; 3165e1051a39Sopenharmony_ci size_t i; 3166e1051a39Sopenharmony_ci int curve = -1; 3167e1051a39Sopenharmony_ci EVP_PKEY *tmppkey; 3168e1051a39Sopenharmony_ci 3169e1051a39Sopenharmony_ci /* Look for a shared sigalgs matching possible certificates */ 3170e1051a39Sopenharmony_ci for (i = 0; i < s->shared_sigalgslen; i++) { 3171e1051a39Sopenharmony_ci lu = s->shared_sigalgs[i]; 3172e1051a39Sopenharmony_ci 3173e1051a39Sopenharmony_ci /* Skip SHA1, SHA224, DSA and RSA if not PSS */ 3174e1051a39Sopenharmony_ci if (lu->hash == NID_sha1 3175e1051a39Sopenharmony_ci || lu->hash == NID_sha224 3176e1051a39Sopenharmony_ci || lu->sig == EVP_PKEY_DSA 3177e1051a39Sopenharmony_ci || lu->sig == EVP_PKEY_RSA) 3178e1051a39Sopenharmony_ci continue; 3179e1051a39Sopenharmony_ci /* Check that we have a cert, and signature_algorithms_cert */ 3180e1051a39Sopenharmony_ci if (!tls1_lookup_md(s->ctx, lu, NULL)) 3181e1051a39Sopenharmony_ci continue; 3182e1051a39Sopenharmony_ci if ((pkey == NULL && !has_usable_cert(s, lu, -1)) 3183e1051a39Sopenharmony_ci || (pkey != NULL && !is_cert_usable(s, lu, x, pkey))) 3184e1051a39Sopenharmony_ci continue; 3185e1051a39Sopenharmony_ci 3186e1051a39Sopenharmony_ci tmppkey = (pkey != NULL) ? pkey 3187e1051a39Sopenharmony_ci : s->cert->pkeys[lu->sig_idx].privatekey; 3188e1051a39Sopenharmony_ci 3189e1051a39Sopenharmony_ci if (lu->sig == EVP_PKEY_EC) { 3190e1051a39Sopenharmony_ci if (curve == -1) 3191e1051a39Sopenharmony_ci curve = ssl_get_EC_curve_nid(tmppkey); 3192e1051a39Sopenharmony_ci if (lu->curve != NID_undef && curve != lu->curve) 3193e1051a39Sopenharmony_ci continue; 3194e1051a39Sopenharmony_ci } else if (lu->sig == EVP_PKEY_RSA_PSS) { 3195e1051a39Sopenharmony_ci /* validate that key is large enough for the signature algorithm */ 3196e1051a39Sopenharmony_ci if (!rsa_pss_check_min_key_size(s->ctx, tmppkey, lu)) 3197e1051a39Sopenharmony_ci continue; 3198e1051a39Sopenharmony_ci } 3199e1051a39Sopenharmony_ci break; 3200e1051a39Sopenharmony_ci } 3201e1051a39Sopenharmony_ci 3202e1051a39Sopenharmony_ci if (i == s->shared_sigalgslen) 3203e1051a39Sopenharmony_ci return NULL; 3204e1051a39Sopenharmony_ci 3205e1051a39Sopenharmony_ci return lu; 3206e1051a39Sopenharmony_ci} 3207e1051a39Sopenharmony_ci 3208e1051a39Sopenharmony_ci/* 3209e1051a39Sopenharmony_ci * Choose an appropriate signature algorithm based on available certificates 3210e1051a39Sopenharmony_ci * Sets chosen certificate and signature algorithm. 3211e1051a39Sopenharmony_ci * 3212e1051a39Sopenharmony_ci * For servers if we fail to find a required certificate it is a fatal error, 3213e1051a39Sopenharmony_ci * an appropriate error code is set and a TLS alert is sent. 3214e1051a39Sopenharmony_ci * 3215e1051a39Sopenharmony_ci * For clients fatalerrs is set to 0. If a certificate is not suitable it is not 3216e1051a39Sopenharmony_ci * a fatal error: we will either try another certificate or not present one 3217e1051a39Sopenharmony_ci * to the server. In this case no error is set. 3218e1051a39Sopenharmony_ci */ 3219e1051a39Sopenharmony_ciint tls_choose_sigalg(SSL *s, int fatalerrs) 3220e1051a39Sopenharmony_ci{ 3221e1051a39Sopenharmony_ci const SIGALG_LOOKUP *lu = NULL; 3222e1051a39Sopenharmony_ci int sig_idx = -1; 3223e1051a39Sopenharmony_ci 3224e1051a39Sopenharmony_ci s->s3.tmp.cert = NULL; 3225e1051a39Sopenharmony_ci s->s3.tmp.sigalg = NULL; 3226e1051a39Sopenharmony_ci 3227e1051a39Sopenharmony_ci if (SSL_IS_TLS13(s)) { 3228e1051a39Sopenharmony_ci lu = find_sig_alg(s, NULL, NULL); 3229e1051a39Sopenharmony_ci if (lu == NULL) { 3230e1051a39Sopenharmony_ci if (!fatalerrs) 3231e1051a39Sopenharmony_ci return 1; 3232e1051a39Sopenharmony_ci SSLfatal(s, SSL_AD_HANDSHAKE_FAILURE, 3233e1051a39Sopenharmony_ci SSL_R_NO_SUITABLE_SIGNATURE_ALGORITHM); 3234e1051a39Sopenharmony_ci return 0; 3235e1051a39Sopenharmony_ci } 3236e1051a39Sopenharmony_ci } else { 3237e1051a39Sopenharmony_ci /* If ciphersuite doesn't require a cert nothing to do */ 3238e1051a39Sopenharmony_ci if (!(s->s3.tmp.new_cipher->algorithm_auth & SSL_aCERT)) 3239e1051a39Sopenharmony_ci return 1; 3240e1051a39Sopenharmony_ci if (!s->server && !ssl_has_cert(s, s->cert->key - s->cert->pkeys)) 3241e1051a39Sopenharmony_ci return 1; 3242e1051a39Sopenharmony_ci 3243e1051a39Sopenharmony_ci if (SSL_USE_SIGALGS(s)) { 3244e1051a39Sopenharmony_ci size_t i; 3245e1051a39Sopenharmony_ci if (s->s3.tmp.peer_sigalgs != NULL) { 3246e1051a39Sopenharmony_ci int curve = -1; 3247e1051a39Sopenharmony_ci 3248e1051a39Sopenharmony_ci /* For Suite B need to match signature algorithm to curve */ 3249e1051a39Sopenharmony_ci if (tls1_suiteb(s)) 3250e1051a39Sopenharmony_ci curve = ssl_get_EC_curve_nid(s->cert->pkeys[SSL_PKEY_ECC] 3251e1051a39Sopenharmony_ci .privatekey); 3252e1051a39Sopenharmony_ci 3253e1051a39Sopenharmony_ci /* 3254e1051a39Sopenharmony_ci * Find highest preference signature algorithm matching 3255e1051a39Sopenharmony_ci * cert type 3256e1051a39Sopenharmony_ci */ 3257e1051a39Sopenharmony_ci for (i = 0; i < s->shared_sigalgslen; i++) { 3258e1051a39Sopenharmony_ci lu = s->shared_sigalgs[i]; 3259e1051a39Sopenharmony_ci 3260e1051a39Sopenharmony_ci if (s->server) { 3261e1051a39Sopenharmony_ci if ((sig_idx = tls12_get_cert_sigalg_idx(s, lu)) == -1) 3262e1051a39Sopenharmony_ci continue; 3263e1051a39Sopenharmony_ci } else { 3264e1051a39Sopenharmony_ci int cc_idx = s->cert->key - s->cert->pkeys; 3265e1051a39Sopenharmony_ci 3266e1051a39Sopenharmony_ci sig_idx = lu->sig_idx; 3267e1051a39Sopenharmony_ci if (cc_idx != sig_idx) 3268e1051a39Sopenharmony_ci continue; 3269e1051a39Sopenharmony_ci } 3270e1051a39Sopenharmony_ci /* Check that we have a cert, and sig_algs_cert */ 3271e1051a39Sopenharmony_ci if (!has_usable_cert(s, lu, sig_idx)) 3272e1051a39Sopenharmony_ci continue; 3273e1051a39Sopenharmony_ci if (lu->sig == EVP_PKEY_RSA_PSS) { 3274e1051a39Sopenharmony_ci /* validate that key is large enough for the signature algorithm */ 3275e1051a39Sopenharmony_ci EVP_PKEY *pkey = s->cert->pkeys[sig_idx].privatekey; 3276e1051a39Sopenharmony_ci 3277e1051a39Sopenharmony_ci if (!rsa_pss_check_min_key_size(s->ctx, pkey, lu)) 3278e1051a39Sopenharmony_ci continue; 3279e1051a39Sopenharmony_ci } 3280e1051a39Sopenharmony_ci if (curve == -1 || lu->curve == curve) 3281e1051a39Sopenharmony_ci break; 3282e1051a39Sopenharmony_ci } 3283e1051a39Sopenharmony_ci#ifndef OPENSSL_NO_GOST 3284e1051a39Sopenharmony_ci /* 3285e1051a39Sopenharmony_ci * Some Windows-based implementations do not send GOST algorithms indication 3286e1051a39Sopenharmony_ci * in supported_algorithms extension, so when we have GOST-based ciphersuite, 3287e1051a39Sopenharmony_ci * we have to assume GOST support. 3288e1051a39Sopenharmony_ci */ 3289e1051a39Sopenharmony_ci if (i == s->shared_sigalgslen && s->s3.tmp.new_cipher->algorithm_auth & (SSL_aGOST01 | SSL_aGOST12)) { 3290e1051a39Sopenharmony_ci if ((lu = tls1_get_legacy_sigalg(s, -1)) == NULL) { 3291e1051a39Sopenharmony_ci if (!fatalerrs) 3292e1051a39Sopenharmony_ci return 1; 3293e1051a39Sopenharmony_ci SSLfatal(s, SSL_AD_HANDSHAKE_FAILURE, 3294e1051a39Sopenharmony_ci SSL_R_NO_SUITABLE_SIGNATURE_ALGORITHM); 3295e1051a39Sopenharmony_ci return 0; 3296e1051a39Sopenharmony_ci } else { 3297e1051a39Sopenharmony_ci i = 0; 3298e1051a39Sopenharmony_ci sig_idx = lu->sig_idx; 3299e1051a39Sopenharmony_ci } 3300e1051a39Sopenharmony_ci } 3301e1051a39Sopenharmony_ci#endif 3302e1051a39Sopenharmony_ci if (i == s->shared_sigalgslen) { 3303e1051a39Sopenharmony_ci if (!fatalerrs) 3304e1051a39Sopenharmony_ci return 1; 3305e1051a39Sopenharmony_ci SSLfatal(s, SSL_AD_HANDSHAKE_FAILURE, 3306e1051a39Sopenharmony_ci SSL_R_NO_SUITABLE_SIGNATURE_ALGORITHM); 3307e1051a39Sopenharmony_ci return 0; 3308e1051a39Sopenharmony_ci } 3309e1051a39Sopenharmony_ci } else { 3310e1051a39Sopenharmony_ci /* 3311e1051a39Sopenharmony_ci * If we have no sigalg use defaults 3312e1051a39Sopenharmony_ci */ 3313e1051a39Sopenharmony_ci const uint16_t *sent_sigs; 3314e1051a39Sopenharmony_ci size_t sent_sigslen; 3315e1051a39Sopenharmony_ci 3316e1051a39Sopenharmony_ci if ((lu = tls1_get_legacy_sigalg(s, -1)) == NULL) { 3317e1051a39Sopenharmony_ci if (!fatalerrs) 3318e1051a39Sopenharmony_ci return 1; 3319e1051a39Sopenharmony_ci SSLfatal(s, SSL_AD_HANDSHAKE_FAILURE, 3320e1051a39Sopenharmony_ci SSL_R_NO_SUITABLE_SIGNATURE_ALGORITHM); 3321e1051a39Sopenharmony_ci return 0; 3322e1051a39Sopenharmony_ci } 3323e1051a39Sopenharmony_ci 3324e1051a39Sopenharmony_ci /* Check signature matches a type we sent */ 3325e1051a39Sopenharmony_ci sent_sigslen = tls12_get_psigalgs(s, 1, &sent_sigs); 3326e1051a39Sopenharmony_ci for (i = 0; i < sent_sigslen; i++, sent_sigs++) { 3327e1051a39Sopenharmony_ci if (lu->sigalg == *sent_sigs 3328e1051a39Sopenharmony_ci && has_usable_cert(s, lu, lu->sig_idx)) 3329e1051a39Sopenharmony_ci break; 3330e1051a39Sopenharmony_ci } 3331e1051a39Sopenharmony_ci if (i == sent_sigslen) { 3332e1051a39Sopenharmony_ci if (!fatalerrs) 3333e1051a39Sopenharmony_ci return 1; 3334e1051a39Sopenharmony_ci SSLfatal(s, SSL_AD_HANDSHAKE_FAILURE, 3335e1051a39Sopenharmony_ci SSL_R_WRONG_SIGNATURE_TYPE); 3336e1051a39Sopenharmony_ci return 0; 3337e1051a39Sopenharmony_ci } 3338e1051a39Sopenharmony_ci } 3339e1051a39Sopenharmony_ci } else { 3340e1051a39Sopenharmony_ci if ((lu = tls1_get_legacy_sigalg(s, -1)) == NULL) { 3341e1051a39Sopenharmony_ci if (!fatalerrs) 3342e1051a39Sopenharmony_ci return 1; 3343e1051a39Sopenharmony_ci SSLfatal(s, SSL_AD_INTERNAL_ERROR, 3344e1051a39Sopenharmony_ci SSL_R_NO_SUITABLE_SIGNATURE_ALGORITHM); 3345e1051a39Sopenharmony_ci return 0; 3346e1051a39Sopenharmony_ci } 3347e1051a39Sopenharmony_ci } 3348e1051a39Sopenharmony_ci } 3349e1051a39Sopenharmony_ci if (sig_idx == -1) 3350e1051a39Sopenharmony_ci sig_idx = lu->sig_idx; 3351e1051a39Sopenharmony_ci s->s3.tmp.cert = &s->cert->pkeys[sig_idx]; 3352e1051a39Sopenharmony_ci s->cert->key = s->s3.tmp.cert; 3353e1051a39Sopenharmony_ci s->s3.tmp.sigalg = lu; 3354e1051a39Sopenharmony_ci return 1; 3355e1051a39Sopenharmony_ci} 3356e1051a39Sopenharmony_ci 3357e1051a39Sopenharmony_ciint SSL_CTX_set_tlsext_max_fragment_length(SSL_CTX *ctx, uint8_t mode) 3358e1051a39Sopenharmony_ci{ 3359e1051a39Sopenharmony_ci if (mode != TLSEXT_max_fragment_length_DISABLED 3360e1051a39Sopenharmony_ci && !IS_MAX_FRAGMENT_LENGTH_EXT_VALID(mode)) { 3361e1051a39Sopenharmony_ci ERR_raise(ERR_LIB_SSL, SSL_R_SSL3_EXT_INVALID_MAX_FRAGMENT_LENGTH); 3362e1051a39Sopenharmony_ci return 0; 3363e1051a39Sopenharmony_ci } 3364e1051a39Sopenharmony_ci 3365e1051a39Sopenharmony_ci ctx->ext.max_fragment_len_mode = mode; 3366e1051a39Sopenharmony_ci return 1; 3367e1051a39Sopenharmony_ci} 3368e1051a39Sopenharmony_ci 3369e1051a39Sopenharmony_ciint SSL_set_tlsext_max_fragment_length(SSL *ssl, uint8_t mode) 3370e1051a39Sopenharmony_ci{ 3371e1051a39Sopenharmony_ci if (mode != TLSEXT_max_fragment_length_DISABLED 3372e1051a39Sopenharmony_ci && !IS_MAX_FRAGMENT_LENGTH_EXT_VALID(mode)) { 3373e1051a39Sopenharmony_ci ERR_raise(ERR_LIB_SSL, SSL_R_SSL3_EXT_INVALID_MAX_FRAGMENT_LENGTH); 3374e1051a39Sopenharmony_ci return 0; 3375e1051a39Sopenharmony_ci } 3376e1051a39Sopenharmony_ci 3377e1051a39Sopenharmony_ci ssl->ext.max_fragment_len_mode = mode; 3378e1051a39Sopenharmony_ci return 1; 3379e1051a39Sopenharmony_ci} 3380e1051a39Sopenharmony_ci 3381e1051a39Sopenharmony_ciuint8_t SSL_SESSION_get_max_fragment_length(const SSL_SESSION *session) 3382e1051a39Sopenharmony_ci{ 3383e1051a39Sopenharmony_ci return session->ext.max_fragment_len_mode; 3384e1051a39Sopenharmony_ci} 3385e1051a39Sopenharmony_ci 3386e1051a39Sopenharmony_ci/* 3387e1051a39Sopenharmony_ci * Helper functions for HMAC access with legacy support included. 3388e1051a39Sopenharmony_ci */ 3389e1051a39Sopenharmony_ciSSL_HMAC *ssl_hmac_new(const SSL_CTX *ctx) 3390e1051a39Sopenharmony_ci{ 3391e1051a39Sopenharmony_ci SSL_HMAC *ret = OPENSSL_zalloc(sizeof(*ret)); 3392e1051a39Sopenharmony_ci EVP_MAC *mac = NULL; 3393e1051a39Sopenharmony_ci 3394e1051a39Sopenharmony_ci if (ret == NULL) 3395e1051a39Sopenharmony_ci return NULL; 3396e1051a39Sopenharmony_ci#ifndef OPENSSL_NO_DEPRECATED_3_0 3397e1051a39Sopenharmony_ci if (ctx->ext.ticket_key_evp_cb == NULL 3398e1051a39Sopenharmony_ci && ctx->ext.ticket_key_cb != NULL) { 3399e1051a39Sopenharmony_ci if (!ssl_hmac_old_new(ret)) 3400e1051a39Sopenharmony_ci goto err; 3401e1051a39Sopenharmony_ci return ret; 3402e1051a39Sopenharmony_ci } 3403e1051a39Sopenharmony_ci#endif 3404e1051a39Sopenharmony_ci mac = EVP_MAC_fetch(ctx->libctx, "HMAC", ctx->propq); 3405e1051a39Sopenharmony_ci if (mac == NULL || (ret->ctx = EVP_MAC_CTX_new(mac)) == NULL) 3406e1051a39Sopenharmony_ci goto err; 3407e1051a39Sopenharmony_ci EVP_MAC_free(mac); 3408e1051a39Sopenharmony_ci return ret; 3409e1051a39Sopenharmony_ci err: 3410e1051a39Sopenharmony_ci EVP_MAC_CTX_free(ret->ctx); 3411e1051a39Sopenharmony_ci EVP_MAC_free(mac); 3412e1051a39Sopenharmony_ci OPENSSL_free(ret); 3413e1051a39Sopenharmony_ci return NULL; 3414e1051a39Sopenharmony_ci} 3415e1051a39Sopenharmony_ci 3416e1051a39Sopenharmony_civoid ssl_hmac_free(SSL_HMAC *ctx) 3417e1051a39Sopenharmony_ci{ 3418e1051a39Sopenharmony_ci if (ctx != NULL) { 3419e1051a39Sopenharmony_ci EVP_MAC_CTX_free(ctx->ctx); 3420e1051a39Sopenharmony_ci#ifndef OPENSSL_NO_DEPRECATED_3_0 3421e1051a39Sopenharmony_ci ssl_hmac_old_free(ctx); 3422e1051a39Sopenharmony_ci#endif 3423e1051a39Sopenharmony_ci OPENSSL_free(ctx); 3424e1051a39Sopenharmony_ci } 3425e1051a39Sopenharmony_ci} 3426e1051a39Sopenharmony_ci 3427e1051a39Sopenharmony_ciEVP_MAC_CTX *ssl_hmac_get0_EVP_MAC_CTX(SSL_HMAC *ctx) 3428e1051a39Sopenharmony_ci{ 3429e1051a39Sopenharmony_ci return ctx->ctx; 3430e1051a39Sopenharmony_ci} 3431e1051a39Sopenharmony_ci 3432e1051a39Sopenharmony_ciint ssl_hmac_init(SSL_HMAC *ctx, void *key, size_t len, char *md) 3433e1051a39Sopenharmony_ci{ 3434e1051a39Sopenharmony_ci OSSL_PARAM params[2], *p = params; 3435e1051a39Sopenharmony_ci 3436e1051a39Sopenharmony_ci if (ctx->ctx != NULL) { 3437e1051a39Sopenharmony_ci *p++ = OSSL_PARAM_construct_utf8_string(OSSL_MAC_PARAM_DIGEST, md, 0); 3438e1051a39Sopenharmony_ci *p = OSSL_PARAM_construct_end(); 3439e1051a39Sopenharmony_ci if (EVP_MAC_init(ctx->ctx, key, len, params)) 3440e1051a39Sopenharmony_ci return 1; 3441e1051a39Sopenharmony_ci } 3442e1051a39Sopenharmony_ci#ifndef OPENSSL_NO_DEPRECATED_3_0 3443e1051a39Sopenharmony_ci if (ctx->old_ctx != NULL) 3444e1051a39Sopenharmony_ci return ssl_hmac_old_init(ctx, key, len, md); 3445e1051a39Sopenharmony_ci#endif 3446e1051a39Sopenharmony_ci return 0; 3447e1051a39Sopenharmony_ci} 3448e1051a39Sopenharmony_ci 3449e1051a39Sopenharmony_ciint ssl_hmac_update(SSL_HMAC *ctx, const unsigned char *data, size_t len) 3450e1051a39Sopenharmony_ci{ 3451e1051a39Sopenharmony_ci if (ctx->ctx != NULL) 3452e1051a39Sopenharmony_ci return EVP_MAC_update(ctx->ctx, data, len); 3453e1051a39Sopenharmony_ci#ifndef OPENSSL_NO_DEPRECATED_3_0 3454e1051a39Sopenharmony_ci if (ctx->old_ctx != NULL) 3455e1051a39Sopenharmony_ci return ssl_hmac_old_update(ctx, data, len); 3456e1051a39Sopenharmony_ci#endif 3457e1051a39Sopenharmony_ci return 0; 3458e1051a39Sopenharmony_ci} 3459e1051a39Sopenharmony_ci 3460e1051a39Sopenharmony_ciint ssl_hmac_final(SSL_HMAC *ctx, unsigned char *md, size_t *len, 3461e1051a39Sopenharmony_ci size_t max_size) 3462e1051a39Sopenharmony_ci{ 3463e1051a39Sopenharmony_ci if (ctx->ctx != NULL) 3464e1051a39Sopenharmony_ci return EVP_MAC_final(ctx->ctx, md, len, max_size); 3465e1051a39Sopenharmony_ci#ifndef OPENSSL_NO_DEPRECATED_3_0 3466e1051a39Sopenharmony_ci if (ctx->old_ctx != NULL) 3467e1051a39Sopenharmony_ci return ssl_hmac_old_final(ctx, md, len); 3468e1051a39Sopenharmony_ci#endif 3469e1051a39Sopenharmony_ci return 0; 3470e1051a39Sopenharmony_ci} 3471e1051a39Sopenharmony_ci 3472e1051a39Sopenharmony_cisize_t ssl_hmac_size(const SSL_HMAC *ctx) 3473e1051a39Sopenharmony_ci{ 3474e1051a39Sopenharmony_ci if (ctx->ctx != NULL) 3475e1051a39Sopenharmony_ci return EVP_MAC_CTX_get_mac_size(ctx->ctx); 3476e1051a39Sopenharmony_ci#ifndef OPENSSL_NO_DEPRECATED_3_0 3477e1051a39Sopenharmony_ci if (ctx->old_ctx != NULL) 3478e1051a39Sopenharmony_ci return ssl_hmac_old_size(ctx); 3479e1051a39Sopenharmony_ci#endif 3480e1051a39Sopenharmony_ci return 0; 3481e1051a39Sopenharmony_ci} 3482e1051a39Sopenharmony_ci 3483e1051a39Sopenharmony_ciint ssl_get_EC_curve_nid(const EVP_PKEY *pkey) 3484e1051a39Sopenharmony_ci{ 3485e1051a39Sopenharmony_ci char gname[OSSL_MAX_NAME_SIZE]; 3486e1051a39Sopenharmony_ci 3487e1051a39Sopenharmony_ci if (EVP_PKEY_get_group_name(pkey, gname, sizeof(gname), NULL) > 0) 3488e1051a39Sopenharmony_ci return OBJ_txt2nid(gname); 3489e1051a39Sopenharmony_ci 3490e1051a39Sopenharmony_ci return NID_undef; 3491e1051a39Sopenharmony_ci} 3492e1051a39Sopenharmony_ci 3493e1051a39Sopenharmony_ci__owur int tls13_set_encoded_pub_key(EVP_PKEY *pkey, 3494e1051a39Sopenharmony_ci const unsigned char *enckey, 3495e1051a39Sopenharmony_ci size_t enckeylen) 3496e1051a39Sopenharmony_ci{ 3497e1051a39Sopenharmony_ci if (EVP_PKEY_is_a(pkey, "DH")) { 3498e1051a39Sopenharmony_ci int bits = EVP_PKEY_get_bits(pkey); 3499e1051a39Sopenharmony_ci 3500e1051a39Sopenharmony_ci if (bits <= 0 || enckeylen != (size_t)bits / 8) 3501e1051a39Sopenharmony_ci /* the encoded key must be padded to the length of the p */ 3502e1051a39Sopenharmony_ci return 0; 3503e1051a39Sopenharmony_ci } else if (EVP_PKEY_is_a(pkey, "EC")) { 3504e1051a39Sopenharmony_ci if (enckeylen < 3 /* point format and at least 1 byte for x and y */ 3505e1051a39Sopenharmony_ci || enckey[0] != 0x04) 3506e1051a39Sopenharmony_ci return 0; 3507e1051a39Sopenharmony_ci } 3508e1051a39Sopenharmony_ci 3509e1051a39Sopenharmony_ci return EVP_PKEY_set1_encoded_public_key(pkey, enckey, enckeylen); 3510e1051a39Sopenharmony_ci} 3511