Home | History | Annotate | Download | only in ssl
      1 /* Copyright (C) 1995-1998 Eric Young (eay (at) cryptsoft.com)
      2  * All rights reserved.
      3  *
      4  * This package is an SSL implementation written
      5  * by Eric Young (eay (at) cryptsoft.com).
      6  * The implementation was written so as to conform with Netscapes SSL.
      7  *
      8  * This library is free for commercial and non-commercial use as long as
      9  * the following conditions are aheared to.  The following conditions
     10  * apply to all code found in this distribution, be it the RC4, RSA,
     11  * lhash, DES, etc., code; not just the SSL code.  The SSL documentation
     12  * included with this distribution is covered by the same copyright terms
     13  * except that the holder is Tim Hudson (tjh (at) cryptsoft.com).
     14  *
     15  * Copyright remains Eric Young's, and as such any Copyright notices in
     16  * the code are not to be removed.
     17  * If this package is used in a product, Eric Young should be given attribution
     18  * as the author of the parts of the library used.
     19  * This can be in the form of a textual message at program startup or
     20  * in documentation (online or textual) provided with the package.
     21  *
     22  * Redistribution and use in source and binary forms, with or without
     23  * modification, are permitted provided that the following conditions
     24  * are met:
     25  * 1. Redistributions of source code must retain the copyright
     26  *    notice, this list of conditions and the following disclaimer.
     27  * 2. Redistributions in binary form must reproduce the above copyright
     28  *    notice, this list of conditions and the following disclaimer in the
     29  *    documentation and/or other materials provided with the distribution.
     30  * 3. All advertising materials mentioning features or use of this software
     31  *    must display the following acknowledgement:
     32  *    "This product includes cryptographic software written by
     33  *     Eric Young (eay (at) cryptsoft.com)"
     34  *    The word 'cryptographic' can be left out if the rouines from the library
     35  *    being used are not cryptographic related :-).
     36  * 4. If you include any Windows specific code (or a derivative thereof) from
     37  *    the apps directory (application code) you must include an acknowledgement:
     38  *    "This product includes software written by Tim Hudson (tjh (at) cryptsoft.com)"
     39  *
     40  * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND
     41  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
     42  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
     43  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
     44  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
     45  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
     46  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
     47  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
     48  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
     49  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
     50  * SUCH DAMAGE.
     51  *
     52  * The licence and distribution terms for any publically available version or
     53  * derivative of this code cannot be changed.  i.e. this code cannot simply be
     54  * copied and put under another distribution licence
     55  * [including the GNU Public Licence.]
     56  */
     57 /* ====================================================================
     58  * Copyright (c) 1998-2007 The OpenSSL Project.  All rights reserved.
     59  *
     60  * Redistribution and use in source and binary forms, with or without
     61  * modification, are permitted provided that the following conditions
     62  * are met:
     63  *
     64  * 1. Redistributions of source code must retain the above copyright
     65  *    notice, this list of conditions and the following disclaimer.
     66  *
     67  * 2. Redistributions in binary form must reproduce the above copyright
     68  *    notice, this list of conditions and the following disclaimer in
     69  *    the documentation and/or other materials provided with the
     70  *    distribution.
     71  *
     72  * 3. All advertising materials mentioning features or use of this
     73  *    software must display the following acknowledgment:
     74  *    "This product includes software developed by the OpenSSL Project
     75  *    for use in the OpenSSL Toolkit. (http://www.openssl.org/)"
     76  *
     77  * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to
     78  *    endorse or promote products derived from this software without
     79  *    prior written permission. For written permission, please contact
     80  *    openssl-core (at) openssl.org.
     81  *
     82  * 5. Products derived from this software may not be called "OpenSSL"
     83  *    nor may "OpenSSL" appear in their names without prior written
     84  *    permission of the OpenSSL Project.
     85  *
     86  * 6. Redistributions of any form whatsoever must retain the following
     87  *    acknowledgment:
     88  *    "This product includes software developed by the OpenSSL Project
     89  *    for use in the OpenSSL Toolkit (http://www.openssl.org/)"
     90  *
     91  * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY
     92  * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
     93  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
     94  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE OpenSSL PROJECT OR
     95  * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
     96  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
     97  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
     98  * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
     99  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
    100  * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
    101  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
    102  * OF THE POSSIBILITY OF SUCH DAMAGE.
    103  * ====================================================================
    104  *
    105  * This product includes cryptographic software written by Eric Young
    106  * (eay (at) cryptsoft.com).  This product includes software written by Tim
    107  * Hudson (tjh (at) cryptsoft.com).
    108  *
    109  */
    110 /* ====================================================================
    111  * Copyright 2002 Sun Microsystems, Inc. ALL RIGHTS RESERVED.
    112  *
    113  * Portions of the attached software ("Contribution") are developed by
    114  * SUN MICROSYSTEMS, INC., and are contributed to the OpenSSL project.
    115  *
    116  * The Contribution is licensed pursuant to the OpenSSL open source
    117  * license provided above.
    118  *
    119  * ECC cipher suite support in OpenSSL originally written by
    120  * Vipul Gupta and Sumit Gupta of Sun Microsystems Laboratories.
    121  *
    122  */
    123 /* ====================================================================
    124  * Copyright 2005 Nokia. All rights reserved.
    125  *
    126  * The portions of the attached software ("Contribution") is developed by
    127  * Nokia Corporation and is licensed pursuant to the OpenSSL open source
    128  * license.
    129  *
    130  * The Contribution, originally written by Mika Kousa and Pasi Eronen of
    131  * Nokia Corporation, consists of the "PSK" (Pre-Shared Key) ciphersuites
    132  * support (see RFC 4279) to OpenSSL.
    133  *
    134  * No patent licenses or other rights except those expressly stated in
    135  * the OpenSSL open source license shall be deemed granted or received
    136  * expressly, by implication, estoppel, or otherwise.
    137  *
    138  * No assurances are provided by Nokia that the Contribution does not
    139  * infringe the patent or other intellectual property rights of any third
    140  * party or that the license provides you with all the necessary rights
    141  * to make use of the Contribution.
    142  *
    143  * THE SOFTWARE IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND. IN
    144  * ADDITION TO THE DISCLAIMERS INCLUDED IN THE LICENSE, NOKIA
    145  * SPECIFICALLY DISCLAIMS ANY LIABILITY FOR CLAIMS BROUGHT BY YOU OR ANY
    146  * OTHER ENTITY BASED ON INFRINGEMENT OF INTELLECTUAL PROPERTY RIGHTS OR
    147  * OTHERWISE. */
    148 
    149 #include <assert.h>
    150 #include <stdio.h>
    151 #include <string.h>
    152 
    153 #include <openssl/buf.h>
    154 #include <openssl/dh.h>
    155 #include <openssl/err.h>
    156 #include <openssl/md5.h>
    157 #include <openssl/mem.h>
    158 #include <openssl/obj.h>
    159 
    160 #include "internal.h"
    161 
    162 
    163 const SSL3_ENC_METHOD SSLv3_enc_data = {
    164     ssl3_prf,
    165     tls1_setup_key_block,
    166     tls1_generate_master_secret,
    167     tls1_change_cipher_state,
    168     ssl3_final_finish_mac,
    169     ssl3_cert_verify_mac,
    170     SSL3_MD_CLIENT_FINISHED_CONST, 4,
    171     SSL3_MD_SERVER_FINISHED_CONST, 4,
    172     ssl3_alert_code,
    173     tls1_export_keying_material,
    174     0,
    175 };
    176 
    177 int ssl3_supports_cipher(const SSL_CIPHER *cipher) {
    178   return 1;
    179 }
    180 
    181 int ssl3_set_handshake_header(SSL *s, int htype, unsigned long len) {
    182   uint8_t *p = (uint8_t *)s->init_buf->data;
    183   *(p++) = htype;
    184   l2n3(len, p);
    185   s->init_num = (int)len + SSL3_HM_HEADER_LENGTH;
    186   s->init_off = 0;
    187 
    188   /* Add the message to the handshake hash. */
    189   return ssl3_finish_mac(s, (uint8_t *)s->init_buf->data, s->init_num);
    190 }
    191 
    192 int ssl3_handshake_write(SSL *s) { return ssl3_do_write(s, SSL3_RT_HANDSHAKE); }
    193 
    194 int ssl3_new(SSL *s) {
    195   SSL3_STATE *s3;
    196 
    197   s3 = OPENSSL_malloc(sizeof *s3);
    198   if (s3 == NULL) {
    199     goto err;
    200   }
    201   memset(s3, 0, sizeof *s3);
    202   memset(s3->rrec.seq_num, 0, sizeof(s3->rrec.seq_num));
    203 
    204   s->s3 = s3;
    205 
    206   /* Set the version to the highest supported version for TLS. This controls the
    207    * initial state of |s->enc_method| and what the API reports as the version
    208    * prior to negotiation.
    209    *
    210    * TODO(davidben): This is fragile and confusing. */
    211   s->version = TLS1_2_VERSION;
    212   return 1;
    213 err:
    214   return 0;
    215 }
    216 
    217 void ssl3_free(SSL *s) {
    218   if (s == NULL || s->s3 == NULL) {
    219     return;
    220   }
    221 
    222   BUF_MEM_free(s->s3->sniff_buffer);
    223   ssl3_cleanup_key_block(s);
    224   ssl3_release_read_buffer(s);
    225   ssl3_release_write_buffer(s);
    226   DH_free(s->s3->tmp.dh);
    227   EC_KEY_free(s->s3->tmp.ecdh);
    228 
    229   sk_X509_NAME_pop_free(s->s3->tmp.ca_names, X509_NAME_free);
    230   OPENSSL_free(s->s3->tmp.certificate_types);
    231   OPENSSL_free(s->s3->tmp.peer_ecpointformatlist);
    232   OPENSSL_free(s->s3->tmp.peer_ellipticcurvelist);
    233   OPENSSL_free(s->s3->tmp.peer_psk_identity_hint);
    234   BIO_free(s->s3->handshake_buffer);
    235   ssl3_free_digest_list(s);
    236   OPENSSL_free(s->s3->alpn_selected);
    237 
    238   OPENSSL_cleanse(s->s3, sizeof *s->s3);
    239   OPENSSL_free(s->s3);
    240   s->s3 = NULL;
    241 }
    242 
    243 static int ssl3_set_req_cert_type(CERT *c, const uint8_t *p, size_t len);
    244 
    245 int SSL_session_reused(const SSL *ssl) {
    246   return ssl->hit;
    247 }
    248 
    249 int SSL_total_renegotiations(const SSL *ssl) {
    250   return ssl->s3->total_renegotiations;
    251 }
    252 
    253 int SSL_num_renegotiations(const SSL *ssl) {
    254   return SSL_total_renegotiations(ssl);
    255 }
    256 
    257 int SSL_CTX_need_tmp_RSA(const SSL_CTX *ctx) {
    258   return 0;
    259 }
    260 
    261 int SSL_need_rsa(const SSL *ssl) {
    262   return 0;
    263 }
    264 
    265 int SSL_CTX_set_tmp_rsa(SSL_CTX *ctx, const RSA *rsa) {
    266   return 1;
    267 }
    268 
    269 int SSL_set_tmp_rsa(SSL *ssl, const RSA *rsa) {
    270   return 1;
    271 }
    272 
    273 int SSL_CTX_set_tmp_dh(SSL_CTX *ctx, const DH *dh) {
    274   DH_free(ctx->cert->dh_tmp);
    275   ctx->cert->dh_tmp = DHparams_dup(dh);
    276   if (ctx->cert->dh_tmp == NULL) {
    277     OPENSSL_PUT_ERROR(SSL, SSL_CTX_set_tmp_dh, ERR_R_DH_LIB);
    278     return 0;
    279   }
    280   return 1;
    281 }
    282 
    283 int SSL_set_tmp_dh(SSL *ssl, const DH *dh) {
    284   DH_free(ssl->cert->dh_tmp);
    285   ssl->cert->dh_tmp = DHparams_dup(dh);
    286   if (ssl->cert->dh_tmp == NULL) {
    287     OPENSSL_PUT_ERROR(SSL, SSL_set_tmp_dh, ERR_R_DH_LIB);
    288     return 0;
    289   }
    290   return 1;
    291 }
    292 
    293 int SSL_CTX_set_tmp_ecdh(SSL_CTX *ctx, const EC_KEY *ec_key) {
    294   if (ec_key == NULL || EC_KEY_get0_group(ec_key) == NULL) {
    295     OPENSSL_PUT_ERROR(SSL, SSL_CTX_set_tmp_ecdh, ERR_R_PASSED_NULL_PARAMETER);
    296     return 0;
    297   }
    298   ctx->cert->ecdh_nid = EC_GROUP_get_curve_name(EC_KEY_get0_group(ec_key));
    299   return 1;
    300 }
    301 
    302 int SSL_set_tmp_ecdh(SSL *ssl, const EC_KEY *ec_key) {
    303   if (ec_key == NULL || EC_KEY_get0_group(ec_key) == NULL) {
    304     OPENSSL_PUT_ERROR(SSL, SSL_set_tmp_ecdh, ERR_R_PASSED_NULL_PARAMETER);
    305     return 0;
    306   }
    307   ssl->cert->ecdh_nid = EC_GROUP_get_curve_name(EC_KEY_get0_group(ec_key));
    308   return 1;
    309 }
    310 
    311 int SSL_CTX_enable_tls_channel_id(SSL_CTX *ctx) {
    312   ctx->tlsext_channel_id_enabled = 1;
    313   return 1;
    314 }
    315 
    316 int SSL_enable_tls_channel_id(SSL *ssl) {
    317   ssl->tlsext_channel_id_enabled = 1;
    318   return 1;
    319 }
    320 
    321 int SSL_CTX_set1_tls_channel_id(SSL_CTX *ctx, EVP_PKEY *private_key) {
    322   ctx->tlsext_channel_id_enabled = 1;
    323   if (EVP_PKEY_id(private_key) != EVP_PKEY_EC ||
    324       EVP_PKEY_bits(private_key) != 256) {
    325     OPENSSL_PUT_ERROR(SSL, SSL_CTX_set1_tls_channel_id,
    326                       SSL_R_CHANNEL_ID_NOT_P256);
    327     return 0;
    328   }
    329   EVP_PKEY_free(ctx->tlsext_channel_id_private);
    330   ctx->tlsext_channel_id_private = EVP_PKEY_up_ref(private_key);
    331   return 1;
    332 }
    333 
    334 int SSL_set1_tls_channel_id(SSL *ssl, EVP_PKEY *private_key) {
    335   ssl->tlsext_channel_id_enabled = 1;
    336   if (EVP_PKEY_id(private_key) != EVP_PKEY_EC ||
    337       EVP_PKEY_bits(private_key) != 256) {
    338     OPENSSL_PUT_ERROR(SSL, SSL_set1_tls_channel_id, SSL_R_CHANNEL_ID_NOT_P256);
    339     return 0;
    340   }
    341   EVP_PKEY_free(ssl->tlsext_channel_id_private);
    342   ssl->tlsext_channel_id_private = EVP_PKEY_up_ref(private_key);
    343   return 1;
    344 }
    345 
    346 size_t SSL_get_tls_channel_id(SSL *ssl, uint8_t *out, size_t max_out) {
    347   if (!ssl->s3->tlsext_channel_id_valid) {
    348     return 0;
    349   }
    350   memcpy(out, ssl->s3->tlsext_channel_id, (max_out < 64) ? max_out : 64);
    351   return 64;
    352 }
    353 
    354 int SSL_set_tlsext_host_name(SSL *ssl, const char *name) {
    355   OPENSSL_free(ssl->tlsext_hostname);
    356   ssl->tlsext_hostname = NULL;
    357 
    358   if (name == NULL) {
    359     return 1;
    360   }
    361   if (strlen(name) > TLSEXT_MAXLEN_host_name) {
    362     OPENSSL_PUT_ERROR(SSL, SSL_set_tlsext_host_name,
    363                       SSL_R_SSL3_EXT_INVALID_SERVERNAME);
    364     return 0;
    365   }
    366   ssl->tlsext_hostname = BUF_strdup(name);
    367   if (ssl->tlsext_hostname == NULL) {
    368     OPENSSL_PUT_ERROR(SSL, SSL_set_tlsext_host_name, ERR_R_MALLOC_FAILURE);
    369     return 0;
    370   }
    371   return 1;
    372 }
    373 
    374 long ssl3_ctrl(SSL *s, int cmd, long larg, void *parg) {
    375   int ret = 0;
    376 
    377   switch (cmd) {
    378     case SSL_CTRL_CHAIN:
    379       if (larg) {
    380         return ssl_cert_set1_chain(s->cert, (STACK_OF(X509) *)parg);
    381       } else {
    382         return ssl_cert_set0_chain(s->cert, (STACK_OF(X509) *)parg);
    383       }
    384 
    385     case SSL_CTRL_CHAIN_CERT:
    386       if (larg) {
    387         return ssl_cert_add1_chain_cert(s->cert, (X509 *)parg);
    388       } else {
    389         return ssl_cert_add0_chain_cert(s->cert, (X509 *)parg);
    390       }
    391 
    392     case SSL_CTRL_GET_CHAIN_CERTS:
    393       *(STACK_OF(X509) **)parg = s->cert->key->chain;
    394       ret = 1;
    395       break;
    396 
    397     case SSL_CTRL_SELECT_CURRENT_CERT:
    398       return ssl_cert_select_current(s->cert, (X509 *)parg);
    399 
    400     case SSL_CTRL_GET_CURVES: {
    401       const uint16_t *clist = s->s3->tmp.peer_ellipticcurvelist;
    402       size_t clistlen = s->s3->tmp.peer_ellipticcurvelist_length;
    403       if (parg) {
    404         size_t i;
    405         int *cptr = parg;
    406         int nid;
    407         for (i = 0; i < clistlen; i++) {
    408           nid = tls1_ec_curve_id2nid(clist[i]);
    409           if (nid != NID_undef) {
    410             cptr[i] = nid;
    411           } else {
    412             cptr[i] = TLSEXT_nid_unknown | clist[i];
    413           }
    414         }
    415       }
    416       return (int)clistlen;
    417     }
    418 
    419     case SSL_CTRL_SET_CURVES:
    420       return tls1_set_curves(&s->tlsext_ellipticcurvelist,
    421                              &s->tlsext_ellipticcurvelist_length, parg, larg);
    422 
    423     case SSL_CTRL_SET_SIGALGS:
    424       return tls1_set_sigalgs(s->cert, parg, larg, 0);
    425 
    426     case SSL_CTRL_SET_CLIENT_SIGALGS:
    427       return tls1_set_sigalgs(s->cert, parg, larg, 1);
    428 
    429     case SSL_CTRL_GET_CLIENT_CERT_TYPES: {
    430       const uint8_t **pctype = parg;
    431       if (s->server || !s->s3->tmp.cert_req) {
    432         return 0;
    433       }
    434       if (pctype) {
    435         *pctype = s->s3->tmp.certificate_types;
    436       }
    437       return (int)s->s3->tmp.num_certificate_types;
    438     }
    439 
    440     case SSL_CTRL_SET_CLIENT_CERT_TYPES:
    441       if (!s->server) {
    442         return 0;
    443       }
    444       return ssl3_set_req_cert_type(s->cert, parg, larg);
    445 
    446     case SSL_CTRL_BUILD_CERT_CHAIN:
    447       return ssl_build_cert_chain(s->cert, s->ctx->cert_store, larg);
    448 
    449     case SSL_CTRL_SET_VERIFY_CERT_STORE:
    450       return ssl_cert_set_cert_store(s->cert, parg, 0, larg);
    451 
    452     case SSL_CTRL_SET_CHAIN_CERT_STORE:
    453       return ssl_cert_set_cert_store(s->cert, parg, 1, larg);
    454 
    455     case SSL_CTRL_GET_SERVER_TMP_KEY:
    456       if (s->server || !s->session || !s->session->sess_cert) {
    457         return 0;
    458       } else {
    459         SESS_CERT *sc;
    460         EVP_PKEY *ptmp;
    461         int rv = 0;
    462         sc = s->session->sess_cert;
    463         if (!sc->peer_dh_tmp && !sc->peer_ecdh_tmp) {
    464           return 0;
    465         }
    466         ptmp = EVP_PKEY_new();
    467         if (!ptmp) {
    468           return 0;
    469         }
    470         if (sc->peer_dh_tmp) {
    471           rv = EVP_PKEY_set1_DH(ptmp, sc->peer_dh_tmp);
    472         } else if (sc->peer_ecdh_tmp) {
    473           rv = EVP_PKEY_set1_EC_KEY(ptmp, sc->peer_ecdh_tmp);
    474         }
    475         if (rv) {
    476           *(EVP_PKEY **)parg = ptmp;
    477           return 1;
    478         }
    479         EVP_PKEY_free(ptmp);
    480         return 0;
    481       }
    482 
    483     case SSL_CTRL_GET_EC_POINT_FORMATS: {
    484       const uint8_t **pformat = parg;
    485       if (!s->s3->tmp.peer_ecpointformatlist) {
    486         return 0;
    487       }
    488       *pformat = s->s3->tmp.peer_ecpointformatlist;
    489       return (int)s->s3->tmp.peer_ecpointformatlist_length;
    490     }
    491 
    492     default:
    493       break;
    494   }
    495 
    496   return ret;
    497 }
    498 
    499 long ssl3_ctx_ctrl(SSL_CTX *ctx, int cmd, long larg, void *parg) {
    500   switch (cmd) {
    501     case SSL_CTRL_SET_TLSEXT_TICKET_KEYS:
    502     case SSL_CTRL_GET_TLSEXT_TICKET_KEYS: {
    503       uint8_t *keys = parg;
    504       if (!keys) {
    505         return 48;
    506       }
    507       if (larg != 48) {
    508         OPENSSL_PUT_ERROR(SSL, ssl3_ctx_ctrl, SSL_R_INVALID_TICKET_KEYS_LENGTH);
    509         return 0;
    510       }
    511       if (cmd == SSL_CTRL_SET_TLSEXT_TICKET_KEYS) {
    512         memcpy(ctx->tlsext_tick_key_name, keys, 16);
    513         memcpy(ctx->tlsext_tick_hmac_key, keys + 16, 16);
    514         memcpy(ctx->tlsext_tick_aes_key, keys + 32, 16);
    515       } else {
    516         memcpy(keys, ctx->tlsext_tick_key_name, 16);
    517         memcpy(keys + 16, ctx->tlsext_tick_hmac_key, 16);
    518         memcpy(keys + 32, ctx->tlsext_tick_aes_key, 16);
    519       }
    520       return 1;
    521     }
    522 
    523     case SSL_CTRL_SET_CURVES:
    524       return tls1_set_curves(&ctx->tlsext_ellipticcurvelist,
    525                              &ctx->tlsext_ellipticcurvelist_length, parg, larg);
    526 
    527     case SSL_CTRL_SET_SIGALGS:
    528       return tls1_set_sigalgs(ctx->cert, parg, larg, 0);
    529 
    530     case SSL_CTRL_SET_CLIENT_SIGALGS:
    531       return tls1_set_sigalgs(ctx->cert, parg, larg, 1);
    532 
    533     case SSL_CTRL_SET_CLIENT_CERT_TYPES:
    534       return ssl3_set_req_cert_type(ctx->cert, parg, larg);
    535 
    536     case SSL_CTRL_BUILD_CERT_CHAIN:
    537       return ssl_build_cert_chain(ctx->cert, ctx->cert_store, larg);
    538 
    539     case SSL_CTRL_SET_VERIFY_CERT_STORE:
    540       return ssl_cert_set_cert_store(ctx->cert, parg, 0, larg);
    541 
    542     case SSL_CTRL_SET_CHAIN_CERT_STORE:
    543       return ssl_cert_set_cert_store(ctx->cert, parg, 1, larg);
    544 
    545     case SSL_CTRL_EXTRA_CHAIN_CERT:
    546       if (ctx->extra_certs == NULL) {
    547         ctx->extra_certs = sk_X509_new_null();
    548         if (ctx->extra_certs == NULL) {
    549           return 0;
    550         }
    551       }
    552       sk_X509_push(ctx->extra_certs, (X509 *)parg);
    553       break;
    554 
    555     case SSL_CTRL_GET_EXTRA_CHAIN_CERTS:
    556       if (ctx->extra_certs == NULL && larg == 0) {
    557         *(STACK_OF(X509) **)parg = ctx->cert->key->chain;
    558       } else {
    559         *(STACK_OF(X509) **)parg = ctx->extra_certs;
    560       }
    561       break;
    562 
    563     case SSL_CTRL_CLEAR_EXTRA_CHAIN_CERTS:
    564       sk_X509_pop_free(ctx->extra_certs, X509_free);
    565       ctx->extra_certs = NULL;
    566       break;
    567 
    568     case SSL_CTRL_CHAIN:
    569       if (larg) {
    570         return ssl_cert_set1_chain(ctx->cert, (STACK_OF(X509) *)parg);
    571       } else {
    572         return ssl_cert_set0_chain(ctx->cert, (STACK_OF(X509) *)parg);
    573       }
    574 
    575     case SSL_CTRL_CHAIN_CERT:
    576       if (larg) {
    577         return ssl_cert_add1_chain_cert(ctx->cert, (X509 *)parg);
    578       } else {
    579         return ssl_cert_add0_chain_cert(ctx->cert, (X509 *)parg);
    580       }
    581 
    582     case SSL_CTRL_GET_CHAIN_CERTS:
    583       *(STACK_OF(X509) **)parg = ctx->cert->key->chain;
    584       break;
    585 
    586     case SSL_CTRL_SELECT_CURRENT_CERT:
    587       return ssl_cert_select_current(ctx->cert, (X509 *)parg);
    588 
    589     default:
    590       return 0;
    591   }
    592 
    593   return 1;
    594 }
    595 
    596 int SSL_CTX_set_tlsext_servername_callback(
    597     SSL_CTX *ctx, int (*callback)(SSL *ssl, int *out_alert, void *arg)) {
    598   ctx->tlsext_servername_callback = callback;
    599   return 1;
    600 }
    601 
    602 int SSL_CTX_set_tlsext_servername_arg(SSL_CTX *ctx, void *arg) {
    603   ctx->tlsext_servername_arg = arg;
    604   return 1;
    605 }
    606 
    607 int SSL_CTX_set_tlsext_ticket_key_cb(
    608     SSL_CTX *ctx, int (*callback)(SSL *ssl, uint8_t *key_name, uint8_t *iv,
    609                                   EVP_CIPHER_CTX *ctx, HMAC_CTX *hmac_ctx,
    610                                   int encrypt)) {
    611   ctx->tlsext_ticket_key_cb = callback;
    612   return 1;
    613 }
    614 
    615 struct ssl_cipher_preference_list_st *ssl_get_cipher_preferences(SSL *s) {
    616   if (s->cipher_list != NULL) {
    617     return s->cipher_list;
    618   }
    619 
    620   if (s->version >= TLS1_1_VERSION && s->ctx != NULL &&
    621       s->ctx->cipher_list_tls11 != NULL) {
    622     return s->ctx->cipher_list_tls11;
    623   }
    624 
    625   if (s->ctx != NULL && s->ctx->cipher_list != NULL) {
    626     return s->ctx->cipher_list;
    627   }
    628 
    629   return NULL;
    630 }
    631 
    632 const SSL_CIPHER *ssl3_choose_cipher(
    633     SSL *s, STACK_OF(SSL_CIPHER) *clnt,
    634     struct ssl_cipher_preference_list_st *server_pref) {
    635   const SSL_CIPHER *c, *ret = NULL;
    636   STACK_OF(SSL_CIPHER) *srvr = server_pref->ciphers, *prio, *allow;
    637   size_t i;
    638   int ok;
    639   size_t cipher_index;
    640   uint32_t alg_k, alg_a, mask_k, mask_a;
    641   /* in_group_flags will either be NULL, or will point to an array of bytes
    642    * which indicate equal-preference groups in the |prio| stack. See the
    643    * comment about |in_group_flags| in the |ssl_cipher_preference_list_st|
    644    * struct. */
    645   const uint8_t *in_group_flags;
    646   /* group_min contains the minimal index so far found in a group, or -1 if no
    647    * such value exists yet. */
    648   int group_min = -1;
    649 
    650   if (s->options & SSL_OP_CIPHER_SERVER_PREFERENCE) {
    651     prio = srvr;
    652     in_group_flags = server_pref->in_group_flags;
    653     allow = clnt;
    654   } else {
    655     prio = clnt;
    656     in_group_flags = NULL;
    657     allow = srvr;
    658   }
    659 
    660   ssl_get_compatible_server_ciphers(s, &mask_k, &mask_a);
    661 
    662   for (i = 0; i < sk_SSL_CIPHER_num(prio); i++) {
    663     c = sk_SSL_CIPHER_value(prio, i);
    664 
    665     ok = 1;
    666 
    667     /* Skip TLS v1.2 only ciphersuites if not supported */
    668     if ((c->algorithm_ssl & SSL_TLSV1_2) && !SSL_USE_TLS1_2_CIPHERS(s)) {
    669       ok = 0;
    670     }
    671 
    672     alg_k = c->algorithm_mkey;
    673     alg_a = c->algorithm_auth;
    674 
    675     ok = ok && (alg_k & mask_k) && (alg_a & mask_a);
    676 
    677     if (ok && sk_SSL_CIPHER_find(allow, &cipher_index, c)) {
    678       if (in_group_flags != NULL && in_group_flags[i] == 1) {
    679         /* This element of |prio| is in a group. Update the minimum index found
    680          * so far and continue looking. */
    681         if (group_min == -1 || (size_t)group_min > cipher_index) {
    682           group_min = cipher_index;
    683         }
    684       } else {
    685         if (group_min != -1 && (size_t)group_min < cipher_index) {
    686           cipher_index = group_min;
    687         }
    688         ret = sk_SSL_CIPHER_value(allow, cipher_index);
    689         break;
    690       }
    691     }
    692 
    693     if (in_group_flags != NULL && in_group_flags[i] == 0 && group_min != -1) {
    694       /* We are about to leave a group, but we found a match in it, so that's
    695        * our answer. */
    696       ret = sk_SSL_CIPHER_value(allow, group_min);
    697       break;
    698     }
    699   }
    700 
    701   return ret;
    702 }
    703 
    704 int ssl3_get_req_cert_type(SSL *s, uint8_t *p) {
    705   int ret = 0;
    706   const uint8_t *sig;
    707   size_t i, siglen;
    708   int have_rsa_sign = 0;
    709   int have_ecdsa_sign = 0;
    710 
    711   /* If we have custom certificate types set, use them */
    712   if (s->cert->client_certificate_types) {
    713     memcpy(p, s->cert->client_certificate_types,
    714            s->cert->num_client_certificate_types);
    715     return s->cert->num_client_certificate_types;
    716   }
    717 
    718   /* get configured sigalgs */
    719   siglen = tls12_get_psigalgs(s, &sig);
    720   for (i = 0; i < siglen; i += 2, sig += 2) {
    721     switch (sig[1]) {
    722       case TLSEXT_signature_rsa:
    723         have_rsa_sign = 1;
    724         break;
    725 
    726       case TLSEXT_signature_ecdsa:
    727         have_ecdsa_sign = 1;
    728         break;
    729     }
    730   }
    731 
    732   if (have_rsa_sign) {
    733     p[ret++] = SSL3_CT_RSA_SIGN;
    734   }
    735 
    736   /* ECDSA certs can be used with RSA cipher suites as well so we don't need to
    737    * check for SSL_kECDH or SSL_kECDHE. */
    738   if (s->version >= TLS1_VERSION && have_ecdsa_sign) {
    739       p[ret++] = TLS_CT_ECDSA_SIGN;
    740   }
    741 
    742   return ret;
    743 }
    744 
    745 static int ssl3_set_req_cert_type(CERT *c, const uint8_t *p, size_t len) {
    746   OPENSSL_free(c->client_certificate_types);
    747   c->client_certificate_types = NULL;
    748   c->num_client_certificate_types = 0;
    749 
    750   if (!p || !len) {
    751     return 1;
    752   }
    753 
    754   if (len > 0xff) {
    755     return 0;
    756   }
    757 
    758   c->client_certificate_types = BUF_memdup(p, len);
    759   if (!c->client_certificate_types) {
    760     return 0;
    761   }
    762 
    763   c->num_client_certificate_types = len;
    764   return 1;
    765 }
    766 
    767 /* If we are using default SHA1+MD5 algorithms switch to new SHA256 PRF and
    768  * handshake macs if required. */
    769 uint32_t ssl_get_algorithm2(SSL *s) {
    770   static const uint32_t kMask = SSL_HANDSHAKE_MAC_DEFAULT;
    771   uint32_t alg2 = s->s3->tmp.new_cipher->algorithm2;
    772   if (s->enc_method->enc_flags & SSL_ENC_FLAG_SHA256_PRF &&
    773       (alg2 & kMask) == kMask) {
    774     return SSL_HANDSHAKE_MAC_SHA256;
    775   }
    776   return alg2;
    777 }
    778