Home | History | Annotate | Line # | Download | only in ssl
ssl_cert.c revision 1.1
      1 /*
      2  * Copyright 1995-2025 The OpenSSL Project Authors. All Rights Reserved.
      3  * Copyright (c) 2002, Oracle and/or its affiliates. All rights reserved
      4  *
      5  * Licensed under the Apache License 2.0 (the "License").  You may not use
      6  * this file except in compliance with the License.  You can obtain a copy
      7  * in the file LICENSE in the source distribution or at
      8  * https://www.openssl.org/source/license.html
      9  */
     10 
     11 #include "internal/e_os.h"
     12 
     13 #include <stdio.h>
     14 #include <sys/types.h>
     15 
     16 #include "internal/nelem.h"
     17 #include "internal/o_dir.h"
     18 #include <openssl/bio.h>
     19 #include <openssl/pem.h>
     20 #include <openssl/store.h>
     21 #include <openssl/x509v3.h>
     22 #include <openssl/dh.h>
     23 #include <openssl/bn.h>
     24 #include <openssl/crypto.h>
     25 #include "internal/refcount.h"
     26 #include "ssl_local.h"
     27 #include "ssl_cert_table.h"
     28 #include "internal/thread_once.h"
     29 #include "internal/ssl_unwrap.h"
     30 #ifndef OPENSSL_NO_POSIX_IO
     31 # include <sys/stat.h>
     32 # ifdef _WIN32
     33 #  define stat _stat
     34 # endif
     35 # ifndef S_ISDIR
     36 #  define S_ISDIR(a) (((a) & S_IFMT) == S_IFDIR)
     37 # endif
     38 #endif
     39 
     40 
     41 static int ssl_security_default_callback(const SSL *s, const SSL_CTX *ctx,
     42                                          int op, int bits, int nid, void *other,
     43                                          void *ex);
     44 
     45 static CRYPTO_ONCE ssl_x509_store_ctx_once = CRYPTO_ONCE_STATIC_INIT;
     46 static volatile int ssl_x509_store_ctx_idx = -1;
     47 
     48 DEFINE_RUN_ONCE_STATIC(ssl_x509_store_ctx_init)
     49 {
     50     ssl_x509_store_ctx_idx = X509_STORE_CTX_get_ex_new_index(0,
     51                                                              "SSL for verify callback",
     52                                                              NULL, NULL, NULL);
     53     return ssl_x509_store_ctx_idx >= 0;
     54 }
     55 
     56 int SSL_get_ex_data_X509_STORE_CTX_idx(void)
     57 {
     58 
     59     if (!RUN_ONCE(&ssl_x509_store_ctx_once, ssl_x509_store_ctx_init))
     60         return -1;
     61     return ssl_x509_store_ctx_idx;
     62 }
     63 
     64 CERT *ssl_cert_new(size_t ssl_pkey_num)
     65 {
     66     CERT *ret = NULL;
     67 
     68     /* Should never happen */
     69     if (!ossl_assert(ssl_pkey_num >= SSL_PKEY_NUM))
     70         return NULL;
     71 
     72     ret = OPENSSL_zalloc(sizeof(*ret));
     73     if (ret == NULL)
     74         return NULL;
     75 
     76     ret->ssl_pkey_num = ssl_pkey_num;
     77     ret->pkeys = OPENSSL_zalloc(ret->ssl_pkey_num * sizeof(CERT_PKEY));
     78     if (ret->pkeys == NULL) {
     79         OPENSSL_free(ret);
     80         return NULL;
     81     }
     82 
     83     ret->key = &(ret->pkeys[SSL_PKEY_RSA]);
     84     ret->sec_cb = ssl_security_default_callback;
     85     ret->sec_level = OPENSSL_TLS_SECURITY_LEVEL;
     86     ret->sec_ex = NULL;
     87     if (!CRYPTO_NEW_REF(&ret->references, 1)) {
     88         OPENSSL_free(ret->pkeys);
     89         OPENSSL_free(ret);
     90         return NULL;
     91     }
     92 
     93     return ret;
     94 }
     95 
     96 CERT *ssl_cert_dup(CERT *cert)
     97 {
     98     CERT *ret = OPENSSL_zalloc(sizeof(*ret));
     99     size_t i;
    100 #ifndef OPENSSL_NO_COMP_ALG
    101     int j;
    102 #endif
    103 
    104     if (ret == NULL)
    105         return NULL;
    106 
    107     ret->ssl_pkey_num = cert->ssl_pkey_num;
    108     ret->pkeys = OPENSSL_zalloc(ret->ssl_pkey_num * sizeof(CERT_PKEY));
    109     if (ret->pkeys == NULL) {
    110         OPENSSL_free(ret);
    111         return NULL;
    112     }
    113 
    114     ret->key = &ret->pkeys[cert->key - cert->pkeys];
    115     if (!CRYPTO_NEW_REF(&ret->references, 1)) {
    116         OPENSSL_free(ret->pkeys);
    117         OPENSSL_free(ret);
    118         return NULL;
    119     }
    120 
    121     if (cert->dh_tmp != NULL) {
    122         if (!EVP_PKEY_up_ref(cert->dh_tmp))
    123             goto err;
    124         ret->dh_tmp = cert->dh_tmp;
    125     }
    126 
    127     ret->dh_tmp_cb = cert->dh_tmp_cb;
    128     ret->dh_tmp_auto = cert->dh_tmp_auto;
    129 
    130     for (i = 0; i < ret->ssl_pkey_num; i++) {
    131         CERT_PKEY *cpk = cert->pkeys + i;
    132         CERT_PKEY *rpk = ret->pkeys + i;
    133 
    134         if (cpk->x509 != NULL) {
    135             if (!X509_up_ref(cpk->x509))
    136                 goto err;
    137             rpk->x509 = cpk->x509;
    138         }
    139 
    140         if (cpk->privatekey != NULL) {
    141             if (!EVP_PKEY_up_ref(cpk->privatekey))
    142                 goto err;
    143             rpk->privatekey = cpk->privatekey;
    144         }
    145 
    146         if (cpk->chain) {
    147             rpk->chain = X509_chain_up_ref(cpk->chain);
    148             if (!rpk->chain) {
    149                 ERR_raise(ERR_LIB_SSL, ERR_R_X509_LIB);
    150                 goto err;
    151             }
    152         }
    153         if (cpk->serverinfo != NULL) {
    154             /* Just copy everything. */
    155             rpk->serverinfo = OPENSSL_memdup(cpk->serverinfo, cpk->serverinfo_length);
    156             if (rpk->serverinfo == NULL)
    157                 goto err;
    158             rpk->serverinfo_length = cpk->serverinfo_length;
    159         }
    160 #ifndef OPENSSL_NO_COMP_ALG
    161         for (j = TLSEXT_comp_cert_none; j < TLSEXT_comp_cert_limit; j++) {
    162             if (cpk->comp_cert[j] != NULL) {
    163                 if (!OSSL_COMP_CERT_up_ref(cpk->comp_cert[j]))
    164                     goto err;
    165                 rpk->comp_cert[j] = cpk->comp_cert[j];
    166             }
    167         }
    168 #endif
    169     }
    170 
    171     /* Configured sigalgs copied across */
    172     if (cert->conf_sigalgs) {
    173         ret->conf_sigalgs = OPENSSL_malloc(cert->conf_sigalgslen
    174                                            * sizeof(*cert->conf_sigalgs));
    175         if (ret->conf_sigalgs == NULL)
    176             goto err;
    177         memcpy(ret->conf_sigalgs, cert->conf_sigalgs,
    178                cert->conf_sigalgslen * sizeof(*cert->conf_sigalgs));
    179         ret->conf_sigalgslen = cert->conf_sigalgslen;
    180     } else
    181         ret->conf_sigalgs = NULL;
    182 
    183     if (cert->client_sigalgs) {
    184         ret->client_sigalgs = OPENSSL_malloc(cert->client_sigalgslen
    185                                              * sizeof(*cert->client_sigalgs));
    186         if (ret->client_sigalgs == NULL)
    187             goto err;
    188         memcpy(ret->client_sigalgs, cert->client_sigalgs,
    189                cert->client_sigalgslen * sizeof(*cert->client_sigalgs));
    190         ret->client_sigalgslen = cert->client_sigalgslen;
    191     } else
    192         ret->client_sigalgs = NULL;
    193     /* Copy any custom client certificate types */
    194     if (cert->ctype) {
    195         ret->ctype = OPENSSL_memdup(cert->ctype, cert->ctype_len);
    196         if (ret->ctype == NULL)
    197             goto err;
    198         ret->ctype_len = cert->ctype_len;
    199     }
    200 
    201     ret->cert_flags = cert->cert_flags;
    202 
    203     ret->cert_cb = cert->cert_cb;
    204     ret->cert_cb_arg = cert->cert_cb_arg;
    205 
    206     if (cert->verify_store) {
    207         if (!X509_STORE_up_ref(cert->verify_store))
    208             goto err;
    209         ret->verify_store = cert->verify_store;
    210     }
    211 
    212     if (cert->chain_store) {
    213         if (!X509_STORE_up_ref(cert->chain_store))
    214             goto err;
    215         ret->chain_store = cert->chain_store;
    216     }
    217 
    218     ret->sec_cb = cert->sec_cb;
    219     ret->sec_level = cert->sec_level;
    220     ret->sec_ex = cert->sec_ex;
    221 
    222     if (!custom_exts_copy(&ret->custext, &cert->custext))
    223         goto err;
    224 #ifndef OPENSSL_NO_PSK
    225     if (cert->psk_identity_hint) {
    226         ret->psk_identity_hint = OPENSSL_strdup(cert->psk_identity_hint);
    227         if (ret->psk_identity_hint == NULL)
    228             goto err;
    229     }
    230 #endif
    231     return ret;
    232 
    233  err:
    234     ssl_cert_free(ret);
    235 
    236     return NULL;
    237 }
    238 
    239 /* Free up and clear all certificates and chains */
    240 
    241 void ssl_cert_clear_certs(CERT *c)
    242 {
    243     size_t i;
    244 #ifndef OPENSSL_NO_COMP_ALG
    245     int j;
    246 #endif
    247 
    248     if (c == NULL)
    249         return;
    250     for (i = 0; i < c->ssl_pkey_num; i++) {
    251         CERT_PKEY *cpk = c->pkeys + i;
    252         X509_free(cpk->x509);
    253         cpk->x509 = NULL;
    254         EVP_PKEY_free(cpk->privatekey);
    255         cpk->privatekey = NULL;
    256         OSSL_STACK_OF_X509_free(cpk->chain);
    257         cpk->chain = NULL;
    258         OPENSSL_free(cpk->serverinfo);
    259         cpk->serverinfo = NULL;
    260         cpk->serverinfo_length = 0;
    261 #ifndef OPENSSL_NO_COMP_ALG
    262         for (j = 0; j < TLSEXT_comp_cert_limit; j++) {
    263             OSSL_COMP_CERT_free(cpk->comp_cert[j]);
    264             cpk->comp_cert[j] = NULL;
    265             cpk->cert_comp_used = 0;
    266         }
    267 #endif
    268     }
    269 }
    270 
    271 void ssl_cert_free(CERT *c)
    272 {
    273     int i;
    274 
    275     if (c == NULL)
    276         return;
    277     CRYPTO_DOWN_REF(&c->references, &i);
    278     REF_PRINT_COUNT("CERT", i, c);
    279     if (i > 0)
    280         return;
    281     REF_ASSERT_ISNT(i < 0);
    282 
    283     EVP_PKEY_free(c->dh_tmp);
    284 
    285     ssl_cert_clear_certs(c);
    286     OPENSSL_free(c->conf_sigalgs);
    287     OPENSSL_free(c->client_sigalgs);
    288     OPENSSL_free(c->ctype);
    289     X509_STORE_free(c->verify_store);
    290     X509_STORE_free(c->chain_store);
    291     custom_exts_free(&c->custext);
    292 #ifndef OPENSSL_NO_PSK
    293     OPENSSL_free(c->psk_identity_hint);
    294 #endif
    295     OPENSSL_free(c->pkeys);
    296     CRYPTO_FREE_REF(&c->references);
    297     OPENSSL_free(c);
    298 }
    299 
    300 int ssl_cert_set0_chain(SSL_CONNECTION *s, SSL_CTX *ctx, STACK_OF(X509) *chain)
    301 {
    302     int i, r;
    303     CERT_PKEY *cpk = s != NULL ? s->cert->key : ctx->cert->key;
    304 
    305     if (!cpk)
    306         return 0;
    307     for (i = 0; i < sk_X509_num(chain); i++) {
    308         X509 *x = sk_X509_value(chain, i);
    309 
    310         r = ssl_security_cert(s, ctx, x, 0, 0);
    311         if (r != 1) {
    312             ERR_raise(ERR_LIB_SSL, r);
    313             return 0;
    314         }
    315     }
    316     OSSL_STACK_OF_X509_free(cpk->chain);
    317     cpk->chain = chain;
    318     return 1;
    319 }
    320 
    321 int ssl_cert_set1_chain(SSL_CONNECTION *s, SSL_CTX *ctx, STACK_OF(X509) *chain)
    322 {
    323     STACK_OF(X509) *dchain;
    324 
    325     if (!chain)
    326         return ssl_cert_set0_chain(s, ctx, NULL);
    327     dchain = X509_chain_up_ref(chain);
    328     if (!dchain)
    329         return 0;
    330     if (!ssl_cert_set0_chain(s, ctx, dchain)) {
    331         OSSL_STACK_OF_X509_free(dchain);
    332         return 0;
    333     }
    334     return 1;
    335 }
    336 
    337 int ssl_cert_add0_chain_cert(SSL_CONNECTION *s, SSL_CTX *ctx, X509 *x)
    338 {
    339     int r;
    340     CERT_PKEY *cpk = s ? s->cert->key : ctx->cert->key;
    341 
    342     if (!cpk)
    343         return 0;
    344     r = ssl_security_cert(s, ctx, x, 0, 0);
    345     if (r != 1) {
    346         ERR_raise(ERR_LIB_SSL, r);
    347         return 0;
    348     }
    349     if (!cpk->chain)
    350         cpk->chain = sk_X509_new_null();
    351     if (!cpk->chain || !sk_X509_push(cpk->chain, x))
    352         return 0;
    353     return 1;
    354 }
    355 
    356 int ssl_cert_add1_chain_cert(SSL_CONNECTION *s, SSL_CTX *ctx, X509 *x)
    357 {
    358     if (!X509_up_ref(x))
    359         return 0;
    360     if (!ssl_cert_add0_chain_cert(s, ctx, x)) {
    361         X509_free(x);
    362         return 0;
    363     }
    364     return 1;
    365 }
    366 
    367 int ssl_cert_select_current(CERT *c, X509 *x)
    368 {
    369     size_t i;
    370 
    371     if (x == NULL)
    372         return 0;
    373     for (i = 0; i < c->ssl_pkey_num; i++) {
    374         CERT_PKEY *cpk = c->pkeys + i;
    375         if (cpk->x509 == x && cpk->privatekey) {
    376             c->key = cpk;
    377             return 1;
    378         }
    379     }
    380 
    381     for (i = 0; i < c->ssl_pkey_num; i++) {
    382         CERT_PKEY *cpk = c->pkeys + i;
    383         if (cpk->privatekey && cpk->x509 && !X509_cmp(cpk->x509, x)) {
    384             c->key = cpk;
    385             return 1;
    386         }
    387     }
    388     return 0;
    389 }
    390 
    391 int ssl_cert_set_current(CERT *c, long op)
    392 {
    393     size_t i, idx;
    394 
    395     if (!c)
    396         return 0;
    397     if (op == SSL_CERT_SET_FIRST)
    398         idx = 0;
    399     else if (op == SSL_CERT_SET_NEXT) {
    400         idx = (size_t)(c->key - c->pkeys + 1);
    401         if (idx >= c->ssl_pkey_num)
    402             return 0;
    403     } else
    404         return 0;
    405     for (i = idx; i < c->ssl_pkey_num; i++) {
    406         CERT_PKEY *cpk = c->pkeys + i;
    407         if (cpk->x509 && cpk->privatekey) {
    408             c->key = cpk;
    409             return 1;
    410         }
    411     }
    412     return 0;
    413 }
    414 
    415 void ssl_cert_set_cert_cb(CERT *c, int (*cb) (SSL *ssl, void *arg), void *arg)
    416 {
    417     c->cert_cb = cb;
    418     c->cert_cb_arg = arg;
    419 }
    420 
    421 /*
    422  * Verify a certificate chain/raw public key
    423  * Return codes:
    424  *  1: Verify success
    425  *  0: Verify failure or error
    426  * -1: Retry required
    427  */
    428 static int ssl_verify_internal(SSL_CONNECTION *s, STACK_OF(X509) *sk, EVP_PKEY *rpk)
    429 {
    430     X509 *x;
    431     int i = 0;
    432     X509_STORE *verify_store;
    433     X509_STORE_CTX *ctx = NULL;
    434     X509_VERIFY_PARAM *param;
    435     SSL_CTX *sctx;
    436 
    437     /* Something must be passed in */
    438     if ((sk == NULL || sk_X509_num(sk) == 0) && rpk == NULL)
    439         return 0;
    440 
    441     /* Only one can be set */
    442     if (sk != NULL && rpk != NULL)
    443         return 0;
    444 
    445     sctx = SSL_CONNECTION_GET_CTX(s);
    446     if (s->cert->verify_store)
    447         verify_store = s->cert->verify_store;
    448     else
    449         verify_store = sctx->cert_store;
    450 
    451     ctx = X509_STORE_CTX_new_ex(sctx->libctx, sctx->propq);
    452     if (ctx == NULL) {
    453         ERR_raise(ERR_LIB_SSL, ERR_R_X509_LIB);
    454         return 0;
    455     }
    456 
    457     if (sk != NULL) {
    458         x = sk_X509_value(sk, 0);
    459         if (!X509_STORE_CTX_init(ctx, verify_store, x, sk)) {
    460             ERR_raise(ERR_LIB_SSL, ERR_R_X509_LIB);
    461             goto end;
    462         }
    463     } else {
    464         if (!X509_STORE_CTX_init_rpk(ctx, verify_store, rpk)) {
    465             ERR_raise(ERR_LIB_SSL, ERR_R_X509_LIB);
    466             goto end;
    467         }
    468     }
    469     param = X509_STORE_CTX_get0_param(ctx);
    470     /*
    471      * XXX: Separate @AUTHSECLEVEL and @TLSSECLEVEL would be useful at some
    472      * point, for now a single @SECLEVEL sets the same policy for TLS crypto
    473      * and PKI authentication.
    474      */
    475     X509_VERIFY_PARAM_set_auth_level(param,
    476         SSL_get_security_level(SSL_CONNECTION_GET_SSL(s)));
    477 
    478     /* Set suite B flags if needed */
    479     X509_STORE_CTX_set_flags(ctx, tls1_suiteb(s));
    480     if (!X509_STORE_CTX_set_ex_data(ctx,
    481             SSL_get_ex_data_X509_STORE_CTX_idx(),
    482             SSL_CONNECTION_GET_USER_SSL(s)))
    483         goto end;
    484 
    485     /* Verify via DANE if enabled */
    486     if (DANETLS_ENABLED(&s->dane))
    487         X509_STORE_CTX_set0_dane(ctx, &s->dane);
    488 
    489     /*
    490      * We need to inherit the verify parameters. These can be determined by
    491      * the context: if its a server it will verify SSL client certificates or
    492      * vice versa.
    493      */
    494 
    495     X509_STORE_CTX_set_default(ctx, s->server ? "ssl_client" : "ssl_server");
    496     /*
    497      * Anything non-default in "s->param" should overwrite anything in the ctx.
    498      */
    499     X509_VERIFY_PARAM_set1(param, s->param);
    500 
    501     if (s->verify_callback)
    502         X509_STORE_CTX_set_verify_cb(ctx, s->verify_callback);
    503 
    504     if (sctx->app_verify_callback != NULL) {
    505         i = sctx->app_verify_callback(ctx, sctx->app_verify_arg);
    506     } else {
    507         i = X509_verify_cert(ctx);
    508         /* We treat an error in the same way as a failure to verify */
    509         if (i < 0)
    510             i = 0;
    511     }
    512 
    513     s->verify_result = X509_STORE_CTX_get_error(ctx);
    514     OSSL_STACK_OF_X509_free(s->verified_chain);
    515     s->verified_chain = NULL;
    516 
    517     if (sk != NULL && X509_STORE_CTX_get0_chain(ctx) != NULL) {
    518         s->verified_chain = X509_STORE_CTX_get1_chain(ctx);
    519         if (s->verified_chain == NULL) {
    520             ERR_raise(ERR_LIB_SSL, ERR_R_X509_LIB);
    521             i = 0;
    522         }
    523     }
    524 
    525     /* Move peername from the store context params to the SSL handle's */
    526     X509_VERIFY_PARAM_move_peername(s->param, param);
    527 
    528  end:
    529     X509_STORE_CTX_free(ctx);
    530     return i;
    531 }
    532 
    533 /*
    534  * Verify a raw public key
    535  * Return codes:
    536  *  1: Verify success
    537  *  0: Verify failure or error
    538  * -1: Retry required
    539  */
    540 int ssl_verify_rpk(SSL_CONNECTION *s, EVP_PKEY *rpk)
    541 {
    542     return ssl_verify_internal(s, NULL, rpk);
    543 }
    544 
    545 /*
    546  * Verify a certificate chain
    547  * Return codes:
    548  *  1: Verify success
    549  *  0: Verify failure or error
    550  * -1: Retry required
    551  */
    552 int ssl_verify_cert_chain(SSL_CONNECTION *s, STACK_OF(X509) *sk)
    553 {
    554     return ssl_verify_internal(s, sk, NULL);
    555 }
    556 
    557 static void set0_CA_list(STACK_OF(X509_NAME) **ca_list,
    558                         STACK_OF(X509_NAME) *name_list)
    559 {
    560     sk_X509_NAME_pop_free(*ca_list, X509_NAME_free);
    561     *ca_list = name_list;
    562 }
    563 
    564 STACK_OF(X509_NAME) *SSL_dup_CA_list(const STACK_OF(X509_NAME) *sk)
    565 {
    566     int i;
    567     const int num = sk_X509_NAME_num(sk);
    568     STACK_OF(X509_NAME) *ret;
    569     X509_NAME *name;
    570 
    571     ret = sk_X509_NAME_new_reserve(NULL, num);
    572     if (ret == NULL) {
    573         ERR_raise(ERR_LIB_SSL, ERR_R_CRYPTO_LIB);
    574         return NULL;
    575     }
    576     for (i = 0; i < num; i++) {
    577         name = X509_NAME_dup(sk_X509_NAME_value(sk, i));
    578         if (name == NULL) {
    579             ERR_raise(ERR_LIB_SSL, ERR_R_X509_LIB);
    580             sk_X509_NAME_pop_free(ret, X509_NAME_free);
    581             return NULL;
    582         }
    583         sk_X509_NAME_push(ret, name);   /* Cannot fail after reserve call */
    584     }
    585     return ret;
    586 }
    587 
    588 void SSL_set0_CA_list(SSL *s, STACK_OF(X509_NAME) *name_list)
    589 {
    590     SSL_CONNECTION *sc = SSL_CONNECTION_FROM_SSL(s);
    591 
    592     if (sc == NULL)
    593         return;
    594 
    595     set0_CA_list(&sc->ca_names, name_list);
    596 }
    597 
    598 void SSL_CTX_set0_CA_list(SSL_CTX *ctx, STACK_OF(X509_NAME) *name_list)
    599 {
    600     set0_CA_list(&ctx->ca_names, name_list);
    601 }
    602 
    603 const STACK_OF(X509_NAME) *SSL_CTX_get0_CA_list(const SSL_CTX *ctx)
    604 {
    605     return ctx->ca_names;
    606 }
    607 
    608 const STACK_OF(X509_NAME) *SSL_get0_CA_list(const SSL *s)
    609 {
    610     const SSL_CONNECTION *sc = SSL_CONNECTION_FROM_CONST_SSL(s);
    611 
    612     if (sc == NULL)
    613         return NULL;
    614 
    615     return sc->ca_names != NULL ? sc->ca_names : s->ctx->ca_names;
    616 }
    617 
    618 void SSL_CTX_set_client_CA_list(SSL_CTX *ctx, STACK_OF(X509_NAME) *name_list)
    619 {
    620     set0_CA_list(&ctx->client_ca_names, name_list);
    621 }
    622 
    623 STACK_OF(X509_NAME) *SSL_CTX_get_client_CA_list(const SSL_CTX *ctx)
    624 {
    625     return ctx->client_ca_names;
    626 }
    627 
    628 void SSL_set_client_CA_list(SSL *s, STACK_OF(X509_NAME) *name_list)
    629 {
    630     SSL_CONNECTION *sc = SSL_CONNECTION_FROM_SSL(s);
    631 
    632     if (sc == NULL)
    633         return;
    634 
    635     set0_CA_list(&sc->client_ca_names, name_list);
    636 }
    637 
    638 const STACK_OF(X509_NAME) *SSL_get0_peer_CA_list(const SSL *s)
    639 {
    640     const SSL_CONNECTION *sc = SSL_CONNECTION_FROM_CONST_SSL(s);
    641 
    642     if (sc == NULL)
    643         return NULL;
    644 
    645     return sc->s3.tmp.peer_ca_names;
    646 }
    647 
    648 STACK_OF(X509_NAME) *SSL_get_client_CA_list(const SSL *s)
    649 {
    650     const SSL_CONNECTION *sc = SSL_CONNECTION_FROM_CONST_SSL(s);
    651 
    652     if (sc == NULL)
    653         return NULL;
    654 
    655     if (!sc->server)
    656         return sc->s3.tmp.peer_ca_names;
    657     return sc->client_ca_names != NULL ? sc->client_ca_names
    658                                        : s->ctx->client_ca_names;
    659 }
    660 
    661 static int add_ca_name(STACK_OF(X509_NAME) **sk, const X509 *x)
    662 {
    663     X509_NAME *name;
    664 
    665     if (x == NULL)
    666         return 0;
    667     if (*sk == NULL && ((*sk = sk_X509_NAME_new_null()) == NULL))
    668         return 0;
    669 
    670     if ((name = X509_NAME_dup(X509_get_subject_name(x))) == NULL)
    671         return 0;
    672 
    673     if (!sk_X509_NAME_push(*sk, name)) {
    674         X509_NAME_free(name);
    675         return 0;
    676     }
    677     return 1;
    678 }
    679 
    680 int SSL_add1_to_CA_list(SSL *ssl, const X509 *x)
    681 {
    682     SSL_CONNECTION *sc = SSL_CONNECTION_FROM_SSL(ssl);
    683 
    684     if (sc == NULL)
    685         return 0;
    686 
    687     return add_ca_name(&sc->ca_names, x);
    688 }
    689 
    690 int SSL_CTX_add1_to_CA_list(SSL_CTX *ctx, const X509 *x)
    691 {
    692     return add_ca_name(&ctx->ca_names, x);
    693 }
    694 
    695 /*
    696  * The following two are older names are to be replaced with
    697  * SSL(_CTX)_add1_to_CA_list
    698  */
    699 int SSL_add_client_CA(SSL *ssl, X509 *x)
    700 {
    701     SSL_CONNECTION *sc = SSL_CONNECTION_FROM_SSL(ssl);
    702 
    703     if (sc == NULL)
    704         return 0;
    705 
    706     return add_ca_name(&sc->client_ca_names, x);
    707 }
    708 
    709 int SSL_CTX_add_client_CA(SSL_CTX *ctx, X509 *x)
    710 {
    711     return add_ca_name(&ctx->client_ca_names, x);
    712 }
    713 
    714 static int xname_cmp(const X509_NAME *a, const X509_NAME *b)
    715 {
    716     unsigned char *abuf = NULL, *bbuf = NULL;
    717     int alen, blen, ret;
    718 
    719     /* X509_NAME_cmp() itself casts away constness in this way, so
    720      * assume it's safe:
    721      */
    722     alen = i2d_X509_NAME((X509_NAME *)a, &abuf);
    723     blen = i2d_X509_NAME((X509_NAME *)b, &bbuf);
    724 
    725     if (alen < 0 || blen < 0)
    726         ret = -2;
    727     else if (alen != blen)
    728         ret = alen - blen;
    729     else /* alen == blen */
    730         ret = memcmp(abuf, bbuf, alen);
    731 
    732     OPENSSL_free(abuf);
    733     OPENSSL_free(bbuf);
    734 
    735     return ret;
    736 }
    737 
    738 static int xname_sk_cmp(const X509_NAME *const *a, const X509_NAME *const *b)
    739 {
    740     return xname_cmp(*a, *b);
    741 }
    742 
    743 static unsigned long xname_hash(const X509_NAME *a)
    744 {
    745     /* This returns 0 also if SHA1 is not available */
    746     return X509_NAME_hash_ex((X509_NAME *)a, NULL, NULL, NULL);
    747 }
    748 
    749 STACK_OF(X509_NAME) *SSL_load_client_CA_file_ex(const char *file,
    750                                                 OSSL_LIB_CTX *libctx,
    751                                                 const char *propq)
    752 {
    753     BIO *in = BIO_new(BIO_s_file());
    754     X509 *x = NULL;
    755     X509_NAME *xn = NULL;
    756     STACK_OF(X509_NAME) *ret = NULL;
    757     LHASH_OF(X509_NAME) *name_hash = lh_X509_NAME_new(xname_hash, xname_cmp);
    758     OSSL_LIB_CTX *prev_libctx = NULL;
    759 
    760     if (file == NULL) {
    761         ERR_raise(ERR_LIB_SSL, ERR_R_PASSED_NULL_PARAMETER);
    762         goto err;
    763     }
    764     if (name_hash == NULL) {
    765         ERR_raise(ERR_LIB_SSL, ERR_R_CRYPTO_LIB);
    766         goto err;
    767     }
    768     if (in == NULL) {
    769         ERR_raise(ERR_LIB_SSL, ERR_R_BIO_LIB);
    770         goto err;
    771     }
    772 
    773     x = X509_new_ex(libctx, propq);
    774     if (x == NULL) {
    775         ERR_raise(ERR_LIB_SSL, ERR_R_X509_LIB);
    776         goto err;
    777     }
    778     if (BIO_read_filename(in, file) <= 0)
    779         goto err;
    780 
    781     /* Internally lh_X509_NAME_retrieve() needs the libctx to retrieve SHA1 */
    782     prev_libctx = OSSL_LIB_CTX_set0_default(libctx);
    783     for (;;) {
    784         if (PEM_read_bio_X509(in, &x, NULL, NULL) == NULL)
    785             break;
    786         if (ret == NULL) {
    787             ret = sk_X509_NAME_new_null();
    788             if (ret == NULL) {
    789                 ERR_raise(ERR_LIB_SSL, ERR_R_CRYPTO_LIB);
    790                 goto err;
    791             }
    792         }
    793         if ((xn = X509_get_subject_name(x)) == NULL)
    794             goto err;
    795         /* check for duplicates */
    796         xn = X509_NAME_dup(xn);
    797         if (xn == NULL)
    798             goto err;
    799         if (lh_X509_NAME_retrieve(name_hash, xn) != NULL) {
    800             /* Duplicate. */
    801             X509_NAME_free(xn);
    802             xn = NULL;
    803         } else {
    804             lh_X509_NAME_insert(name_hash, xn);
    805             if (!sk_X509_NAME_push(ret, xn))
    806                 goto err;
    807         }
    808     }
    809     goto done;
    810 
    811  err:
    812     X509_NAME_free(xn);
    813     sk_X509_NAME_pop_free(ret, X509_NAME_free);
    814     ret = NULL;
    815  done:
    816     /* restore the old libctx */
    817     OSSL_LIB_CTX_set0_default(prev_libctx);
    818     BIO_free(in);
    819     X509_free(x);
    820     lh_X509_NAME_free(name_hash);
    821     if (ret != NULL)
    822         ERR_clear_error();
    823     return ret;
    824 }
    825 
    826 STACK_OF(X509_NAME) *SSL_load_client_CA_file(const char *file)
    827 {
    828     return SSL_load_client_CA_file_ex(file, NULL, NULL);
    829 }
    830 
    831 static int add_file_cert_subjects_to_stack(STACK_OF(X509_NAME) *stack,
    832                                            const char *file,
    833                                            LHASH_OF(X509_NAME) *name_hash)
    834 {
    835     BIO *in;
    836     X509 *x = NULL;
    837     X509_NAME *xn = NULL;
    838     int ret = 1;
    839 
    840     in = BIO_new(BIO_s_file());
    841 
    842     if (in == NULL) {
    843         ERR_raise(ERR_LIB_SSL, ERR_R_BIO_LIB);
    844         goto err;
    845     }
    846 
    847     if (BIO_read_filename(in, file) <= 0)
    848         goto err;
    849 
    850     for (;;) {
    851         if (PEM_read_bio_X509(in, &x, NULL, NULL) == NULL)
    852             break;
    853         if ((xn = X509_get_subject_name(x)) == NULL)
    854             goto err;
    855         xn = X509_NAME_dup(xn);
    856         if (xn == NULL)
    857             goto err;
    858         if (lh_X509_NAME_retrieve(name_hash, xn) != NULL) {
    859             /* Duplicate. */
    860             X509_NAME_free(xn);
    861         } else if (!sk_X509_NAME_push(stack, xn)) {
    862             X509_NAME_free(xn);
    863             goto err;
    864         } else {
    865             /* Successful insert, add to hash table */
    866             lh_X509_NAME_insert(name_hash, xn);
    867         }
    868     }
    869 
    870     ERR_clear_error();
    871     goto done;
    872 
    873  err:
    874     ret = 0;
    875  done:
    876     BIO_free(in);
    877     X509_free(x);
    878     return ret;
    879 }
    880 
    881 int SSL_add_file_cert_subjects_to_stack(STACK_OF(X509_NAME) *stack,
    882                                         const char *file)
    883 {
    884     X509_NAME *xn = NULL;
    885     int ret = 1;
    886     int idx = 0;
    887     int num = 0;
    888     LHASH_OF(X509_NAME) *name_hash = lh_X509_NAME_new(xname_hash, xname_cmp);
    889 
    890     if (file == NULL) {
    891         ERR_raise(ERR_LIB_SSL, ERR_R_PASSED_NULL_PARAMETER);
    892         goto err;
    893     }
    894 
    895     if (name_hash == NULL) {
    896         ERR_raise(ERR_LIB_SSL, ERR_R_CRYPTO_LIB);
    897         goto err;
    898     }
    899 
    900     /*
    901      * Pre-populate the lhash with the existing entries of the stack, since
    902      * using the LHASH_OF is much faster for duplicate checking. That's because
    903      * xname_cmp converts the X509_NAMEs to DER involving a memory allocation
    904      * for every single invocation of the comparison function.
    905      */
    906     num = sk_X509_NAME_num(stack);
    907     for (idx = 0; idx < num; idx++) {
    908         xn = sk_X509_NAME_value(stack, idx);
    909         lh_X509_NAME_insert(name_hash, xn);
    910     }
    911 
    912     ret = add_file_cert_subjects_to_stack(stack, file, name_hash);
    913     goto done;
    914 
    915  err:
    916     ret = 0;
    917  done:
    918     lh_X509_NAME_free(name_hash);
    919     return ret;
    920 }
    921 
    922 int SSL_add_dir_cert_subjects_to_stack(STACK_OF(X509_NAME) *stack,
    923                                        const char *dir)
    924 {
    925     OPENSSL_DIR_CTX *d = NULL;
    926     const char *filename;
    927     int ret = 0;
    928     X509_NAME *xn = NULL;
    929     int idx = 0;
    930     int num = 0;
    931     LHASH_OF(X509_NAME) *name_hash = lh_X509_NAME_new(xname_hash, xname_cmp);
    932 
    933     if (name_hash == NULL) {
    934         ERR_raise(ERR_LIB_SSL, ERR_R_CRYPTO_LIB);
    935         goto err;
    936     }
    937 
    938     /*
    939      * Pre-populate the lhash with the existing entries of the stack, since
    940      * using the LHASH_OF is much faster for duplicate checking. That's because
    941      * xname_cmp converts the X509_NAMEs to DER involving a memory allocation
    942      * for every single invocation of the comparison function.
    943      */
    944     num = sk_X509_NAME_num(stack);
    945     for (idx = 0; idx < num; idx++) {
    946         xn = sk_X509_NAME_value(stack, idx);
    947         lh_X509_NAME_insert(name_hash, xn);
    948     }
    949 
    950     while ((filename = OPENSSL_DIR_read(&d, dir))) {
    951         char buf[1024];
    952         int r;
    953 #ifndef OPENSSL_NO_POSIX_IO
    954         struct stat st;
    955 
    956 #else
    957         /* Cannot use stat so just skip current and parent directories */
    958         if (strcmp(filename, ".") == 0 || strcmp(filename, "..") == 0)
    959             continue;
    960 #endif
    961         if (strlen(dir) + strlen(filename) + 2 > sizeof(buf)) {
    962             ERR_raise(ERR_LIB_SSL, SSL_R_PATH_TOO_LONG);
    963             goto err;
    964         }
    965 #ifdef OPENSSL_SYS_VMS
    966         r = BIO_snprintf(buf, sizeof(buf), "%s%s", dir, filename);
    967 #else
    968         r = BIO_snprintf(buf, sizeof(buf), "%s/%s", dir, filename);
    969 #endif
    970 #ifndef OPENSSL_NO_POSIX_IO
    971         /* Skip subdirectories */
    972         if (!stat(buf, &st) && S_ISDIR(st.st_mode))
    973             continue;
    974 #endif
    975         if (r <= 0 || r >= (int)sizeof(buf))
    976             goto err;
    977         if (!add_file_cert_subjects_to_stack(stack, buf, name_hash))
    978             goto err;
    979     }
    980 
    981     if (errno) {
    982         ERR_raise_data(ERR_LIB_SYS, get_last_sys_error(),
    983                        "calling OPENSSL_dir_read(%s)", dir);
    984         ERR_raise(ERR_LIB_SSL, ERR_R_SYS_LIB);
    985         goto err;
    986     }
    987 
    988     ret = 1;
    989 
    990  err:
    991     if (d)
    992         OPENSSL_DIR_end(&d);
    993     lh_X509_NAME_free(name_hash);
    994 
    995     return ret;
    996 }
    997 
    998 static int add_uris_recursive(STACK_OF(X509_NAME) *stack,
    999                               const char *uri, int depth)
   1000 {
   1001     int ok = 1;
   1002     OSSL_STORE_CTX *ctx = NULL;
   1003     X509 *x = NULL;
   1004     X509_NAME *xn = NULL;
   1005     OSSL_STORE_INFO *info = NULL;
   1006 
   1007     if ((ctx = OSSL_STORE_open(uri, NULL, NULL, NULL, NULL)) == NULL)
   1008         goto err;
   1009 
   1010     while (!OSSL_STORE_eof(ctx) && !OSSL_STORE_error(ctx)) {
   1011         int infotype;
   1012 
   1013         if ((info = OSSL_STORE_load(ctx)) == NULL)
   1014             continue;
   1015         infotype = OSSL_STORE_INFO_get_type(info);
   1016 
   1017         if (infotype == OSSL_STORE_INFO_NAME) {
   1018             /*
   1019              * This is an entry in the "directory" represented by the current
   1020              * uri.  if |depth| allows, dive into it.
   1021              */
   1022             if (depth > 0)
   1023                 ok = add_uris_recursive(stack, OSSL_STORE_INFO_get0_NAME(info),
   1024                                         depth - 1);
   1025         } else if (infotype == OSSL_STORE_INFO_CERT) {
   1026             if ((x = OSSL_STORE_INFO_get0_CERT(info)) == NULL
   1027                 || (xn = X509_get_subject_name(x)) == NULL
   1028                 || (xn = X509_NAME_dup(xn)) == NULL)
   1029                 goto err;
   1030             if (sk_X509_NAME_find(stack, xn) >= 0) {
   1031                 /* Duplicate. */
   1032                 X509_NAME_free(xn);
   1033             } else if (!sk_X509_NAME_push(stack, xn)) {
   1034                 X509_NAME_free(xn);
   1035                 goto err;
   1036             }
   1037         }
   1038 
   1039         OSSL_STORE_INFO_free(info);
   1040         info = NULL;
   1041     }
   1042 
   1043     ERR_clear_error();
   1044     goto done;
   1045 
   1046  err:
   1047     ok = 0;
   1048     OSSL_STORE_INFO_free(info);
   1049  done:
   1050     OSSL_STORE_close(ctx);
   1051 
   1052     return ok;
   1053 }
   1054 
   1055 int SSL_add_store_cert_subjects_to_stack(STACK_OF(X509_NAME) *stack,
   1056                                          const char *store)
   1057 {
   1058     int (*oldcmp) (const X509_NAME *const *a, const X509_NAME *const *b)
   1059         = sk_X509_NAME_set_cmp_func(stack, xname_sk_cmp);
   1060     int ret = add_uris_recursive(stack, store, 1);
   1061 
   1062     (void)sk_X509_NAME_set_cmp_func(stack, oldcmp);
   1063     return ret;
   1064 }
   1065 
   1066 /* Build a certificate chain for current certificate */
   1067 int ssl_build_cert_chain(SSL_CONNECTION *s, SSL_CTX *ctx, int flags)
   1068 {
   1069     CERT *c = s != NULL ? s->cert : ctx->cert;
   1070     CERT_PKEY *cpk = c->key;
   1071     X509_STORE *chain_store = NULL;
   1072     X509_STORE_CTX *xs_ctx = NULL;
   1073     STACK_OF(X509) *chain = NULL, *untrusted = NULL;
   1074     X509 *x;
   1075     SSL_CTX *real_ctx = (s == NULL) ? ctx : SSL_CONNECTION_GET_CTX(s);
   1076     int i, rv = 0;
   1077 
   1078     if (cpk->x509 == NULL) {
   1079         ERR_raise(ERR_LIB_SSL, SSL_R_NO_CERTIFICATE_SET);
   1080         goto err;
   1081     }
   1082     /* Rearranging and check the chain: add everything to a store */
   1083     if (flags & SSL_BUILD_CHAIN_FLAG_CHECK) {
   1084         chain_store = X509_STORE_new();
   1085         if (chain_store == NULL)
   1086             goto err;
   1087         for (i = 0; i < sk_X509_num(cpk->chain); i++) {
   1088             x = sk_X509_value(cpk->chain, i);
   1089             if (!X509_STORE_add_cert(chain_store, x))
   1090                 goto err;
   1091         }
   1092         /* Add EE cert too: it might be self signed */
   1093         if (!X509_STORE_add_cert(chain_store, cpk->x509))
   1094             goto err;
   1095     } else {
   1096         if (c->chain_store != NULL)
   1097             chain_store = c->chain_store;
   1098         else
   1099             chain_store = real_ctx->cert_store;
   1100 
   1101         if (flags & SSL_BUILD_CHAIN_FLAG_UNTRUSTED)
   1102             untrusted = cpk->chain;
   1103     }
   1104 
   1105     xs_ctx = X509_STORE_CTX_new_ex(real_ctx->libctx, real_ctx->propq);
   1106     if (xs_ctx == NULL) {
   1107         ERR_raise(ERR_LIB_SSL, ERR_R_X509_LIB);
   1108         goto err;
   1109     }
   1110     if (!X509_STORE_CTX_init(xs_ctx, chain_store, cpk->x509, untrusted)) {
   1111         ERR_raise(ERR_LIB_SSL, ERR_R_X509_LIB);
   1112         goto err;
   1113     }
   1114     /* Set suite B flags if needed */
   1115     X509_STORE_CTX_set_flags(xs_ctx,
   1116                              c->cert_flags & SSL_CERT_FLAG_SUITEB_128_LOS);
   1117 
   1118     i = X509_verify_cert(xs_ctx);
   1119     if (i <= 0 && flags & SSL_BUILD_CHAIN_FLAG_IGNORE_ERROR) {
   1120         if (flags & SSL_BUILD_CHAIN_FLAG_CLEAR_ERROR)
   1121             ERR_clear_error();
   1122         i = 1;
   1123         rv = 2;
   1124     }
   1125     if (i > 0)
   1126         chain = X509_STORE_CTX_get1_chain(xs_ctx);
   1127     if (i <= 0) {
   1128         i = X509_STORE_CTX_get_error(xs_ctx);
   1129         ERR_raise_data(ERR_LIB_SSL, SSL_R_CERTIFICATE_VERIFY_FAILED,
   1130                        "Verify error:%s", X509_verify_cert_error_string(i));
   1131 
   1132         goto err;
   1133     }
   1134     /* Remove EE certificate from chain */
   1135     x = sk_X509_shift(chain);
   1136     X509_free(x);
   1137     if (flags & SSL_BUILD_CHAIN_FLAG_NO_ROOT) {
   1138         if (sk_X509_num(chain) > 0) {
   1139             /* See if last cert is self signed */
   1140             x = sk_X509_value(chain, sk_X509_num(chain) - 1);
   1141             if (X509_get_extension_flags(x) & EXFLAG_SS) {
   1142                 x = sk_X509_pop(chain);
   1143                 X509_free(x);
   1144             }
   1145         }
   1146     }
   1147     /*
   1148      * Check security level of all CA certificates: EE will have been checked
   1149      * already.
   1150      */
   1151     for (i = 0; i < sk_X509_num(chain); i++) {
   1152         x = sk_X509_value(chain, i);
   1153         rv = ssl_security_cert(s, ctx, x, 0, 0);
   1154         if (rv != 1) {
   1155             ERR_raise(ERR_LIB_SSL, rv);
   1156             OSSL_STACK_OF_X509_free(chain);
   1157             rv = 0;
   1158             goto err;
   1159         }
   1160     }
   1161     OSSL_STACK_OF_X509_free(cpk->chain);
   1162     cpk->chain = chain;
   1163     if (rv == 0)
   1164         rv = 1;
   1165  err:
   1166     if (flags & SSL_BUILD_CHAIN_FLAG_CHECK)
   1167         X509_STORE_free(chain_store);
   1168     X509_STORE_CTX_free(xs_ctx);
   1169 
   1170     return rv;
   1171 }
   1172 
   1173 int ssl_cert_set_cert_store(CERT *c, X509_STORE *store, int chain, int ref)
   1174 {
   1175     X509_STORE **pstore;
   1176 
   1177     if (ref && store && !X509_STORE_up_ref(store))
   1178         return 0;
   1179 
   1180     if (chain)
   1181         pstore = &c->chain_store;
   1182     else
   1183         pstore = &c->verify_store;
   1184     X509_STORE_free(*pstore);
   1185     *pstore = store;
   1186 
   1187     return 1;
   1188 }
   1189 
   1190 int ssl_cert_get_cert_store(CERT *c, X509_STORE **pstore, int chain)
   1191 {
   1192     *pstore = (chain ? c->chain_store : c->verify_store);
   1193     return 1;
   1194 }
   1195 
   1196 int ssl_get_security_level_bits(const SSL *s, const SSL_CTX *ctx, int *levelp)
   1197 {
   1198     int level;
   1199     /*
   1200      * note that there's a corresponding minbits_table
   1201      * in crypto/x509/x509_vfy.c that's used for checking the security level
   1202      * of RSA and DSA keys
   1203      */
   1204     static const int minbits_table[5 + 1] = { 0, 80, 112, 128, 192, 256 };
   1205 
   1206     if (ctx != NULL)
   1207         level = SSL_CTX_get_security_level(ctx);
   1208     else
   1209         level = SSL_get_security_level(s);
   1210 
   1211     if (level > 5)
   1212         level = 5;
   1213     else if (level < 0)
   1214         level = 0;
   1215 
   1216     if (levelp != NULL)
   1217         *levelp = level;
   1218 
   1219     return minbits_table[level];
   1220 }
   1221 
   1222 static int ssl_security_default_callback(const SSL *s, const SSL_CTX *ctx,
   1223                                          int op, int bits, int nid, void *other,
   1224                                          void *ex)
   1225 {
   1226     int level, minbits, pfs_mask;
   1227     const SSL_CONNECTION *sc;
   1228 
   1229     minbits = ssl_get_security_level_bits(s, ctx, &level);
   1230 
   1231     if (level == 0) {
   1232         /*
   1233          * No EDH keys weaker than 1024-bits even at level 0, otherwise,
   1234          * anything goes.
   1235          */
   1236         if (op == SSL_SECOP_TMP_DH && bits < 80)
   1237             return 0;
   1238         return 1;
   1239     }
   1240     switch (op) {
   1241     case SSL_SECOP_CIPHER_SUPPORTED:
   1242     case SSL_SECOP_CIPHER_SHARED:
   1243     case SSL_SECOP_CIPHER_CHECK:
   1244         {
   1245             const SSL_CIPHER *c = other;
   1246             /* No ciphers below security level */
   1247             if (bits < minbits)
   1248                 return 0;
   1249             /* No unauthenticated ciphersuites */
   1250             if (c->algorithm_auth & SSL_aNULL)
   1251                 return 0;
   1252             /* No MD5 mac ciphersuites */
   1253             if (c->algorithm_mac & SSL_MD5)
   1254                 return 0;
   1255             /* SHA1 HMAC is 160 bits of security */
   1256             if (minbits > 160 && c->algorithm_mac & SSL_SHA1)
   1257                 return 0;
   1258             /* Level 3: forward secure ciphersuites only */
   1259             pfs_mask = SSL_kDHE | SSL_kECDHE | SSL_kDHEPSK | SSL_kECDHEPSK;
   1260             if (level >= 3 && c->min_tls != TLS1_3_VERSION &&
   1261                                !(c->algorithm_mkey & pfs_mask))
   1262                 return 0;
   1263             break;
   1264         }
   1265     case SSL_SECOP_VERSION:
   1266         if ((sc = SSL_CONNECTION_FROM_CONST_SSL(s)) == NULL)
   1267             return 0;
   1268         if (!SSL_CONNECTION_IS_DTLS(sc)) {
   1269             /* SSLv3, TLS v1.0 and TLS v1.1 only allowed at level 0 */
   1270             if (nid <= TLS1_1_VERSION && level > 0)
   1271                 return 0;
   1272         } else {
   1273             /* DTLS v1.0 only allowed at level 0 */
   1274             if (DTLS_VERSION_LT(nid, DTLS1_2_VERSION) && level > 0)
   1275                 return 0;
   1276         }
   1277         break;
   1278 
   1279     case SSL_SECOP_COMPRESSION:
   1280         if (level >= 2)
   1281             return 0;
   1282         break;
   1283     case SSL_SECOP_TICKET:
   1284         if (level >= 3)
   1285             return 0;
   1286         break;
   1287     default:
   1288         if (bits < minbits)
   1289             return 0;
   1290     }
   1291     return 1;
   1292 }
   1293 
   1294 int ssl_security(const SSL_CONNECTION *s, int op, int bits, int nid, void *other)
   1295 {
   1296     return s->cert->sec_cb(SSL_CONNECTION_GET_USER_SSL(s), NULL, op, bits, nid,
   1297                            other, s->cert->sec_ex);
   1298 }
   1299 
   1300 int ssl_ctx_security(const SSL_CTX *ctx, int op, int bits, int nid, void *other)
   1301 {
   1302     return ctx->cert->sec_cb(NULL, ctx, op, bits, nid, other,
   1303                              ctx->cert->sec_ex);
   1304 }
   1305 
   1306 int ssl_cert_lookup_by_nid(int nid, size_t *pidx, SSL_CTX *ctx)
   1307 {
   1308     size_t i;
   1309 
   1310     for (i = 0; i < OSSL_NELEM(ssl_cert_info); i++) {
   1311         if (ssl_cert_info[i].nid == nid) {
   1312             *pidx = i;
   1313             return 1;
   1314         }
   1315     }
   1316     for (i = 0; i < ctx->sigalg_list_len; i++) {
   1317         if (ctx->ssl_cert_info[i].nid == nid) {
   1318             *pidx = SSL_PKEY_NUM + i;
   1319             return 1;
   1320         }
   1321     }
   1322     return 0;
   1323 }
   1324 
   1325 const SSL_CERT_LOOKUP *ssl_cert_lookup_by_pkey(const EVP_PKEY *pk, size_t *pidx, SSL_CTX *ctx)
   1326 {
   1327     size_t i;
   1328 
   1329     /* check classic pk types */
   1330     for (i = 0; i < OSSL_NELEM(ssl_cert_info); i++) {
   1331         const SSL_CERT_LOOKUP *tmp_lu = &ssl_cert_info[i];
   1332 
   1333         if (EVP_PKEY_is_a(pk, OBJ_nid2sn(tmp_lu->nid))
   1334             || EVP_PKEY_is_a(pk, OBJ_nid2ln(tmp_lu->nid))) {
   1335             if (pidx != NULL)
   1336                 *pidx = i;
   1337             return tmp_lu;
   1338         }
   1339     }
   1340     /* check provider-loaded pk types */
   1341     for (i = 0; i < ctx->sigalg_list_len; i++) {
   1342         SSL_CERT_LOOKUP *tmp_lu = &(ctx->ssl_cert_info[i]);
   1343 
   1344         if (EVP_PKEY_is_a(pk, OBJ_nid2sn(tmp_lu->nid))
   1345             || EVP_PKEY_is_a(pk, OBJ_nid2ln(tmp_lu->nid))) {
   1346             if (pidx != NULL)
   1347                 *pidx = SSL_PKEY_NUM + i;
   1348             return &ctx->ssl_cert_info[i];
   1349         }
   1350     }
   1351 
   1352     return NULL;
   1353 }
   1354 
   1355 const SSL_CERT_LOOKUP *ssl_cert_lookup_by_idx(size_t idx, SSL_CTX *ctx)
   1356 {
   1357     if (idx >= (OSSL_NELEM(ssl_cert_info) + ctx->sigalg_list_len))
   1358         return NULL;
   1359     else if (idx >= (OSSL_NELEM(ssl_cert_info)))
   1360         return &(ctx->ssl_cert_info[idx - SSL_PKEY_NUM]);
   1361     return &ssl_cert_info[idx];
   1362 }
   1363