Home | History | Annotate | Line # | Download | only in helpers
      1 /*
      2  * Copyright 2016-2025 The OpenSSL Project Authors. All Rights Reserved.
      3  *
      4  * Licensed under the Apache License 2.0 (the "License").  You may not use
      5  * this file except in compliance with the License.  You can obtain a copy
      6  * in the file LICENSE in the source distribution or at
      7  * https://www.openssl.org/source/license.html
      8  */
      9 
     10 #include <string.h>
     11 
     12 #include <openssl/bio.h>
     13 #include <openssl/x509_vfy.h>
     14 #include <openssl/ssl.h>
     15 #include <openssl/core_names.h>
     16 
     17 #include "../../ssl/ssl_local.h"
     18 #include "internal/ssl_unwrap.h"
     19 #include "internal/sockets.h"
     20 #include "internal/nelem.h"
     21 #include "handshake.h"
     22 #include "../testutil.h"
     23 
     24 #if !defined(OPENSSL_NO_SCTP) && !defined(OPENSSL_NO_SOCK)
     25 #include <netinet/sctp.h>
     26 #endif
     27 
     28 HANDSHAKE_RESULT *HANDSHAKE_RESULT_new(void)
     29 {
     30     HANDSHAKE_RESULT *ret;
     31 
     32     TEST_ptr(ret = OPENSSL_zalloc(sizeof(*ret)));
     33     return ret;
     34 }
     35 
     36 void HANDSHAKE_RESULT_free(HANDSHAKE_RESULT *result)
     37 {
     38     if (result == NULL)
     39         return;
     40     OPENSSL_free(result->client_npn_negotiated);
     41     OPENSSL_free(result->server_npn_negotiated);
     42     OPENSSL_free(result->client_alpn_negotiated);
     43     OPENSSL_free(result->server_alpn_negotiated);
     44     OPENSSL_free(result->result_session_ticket_app_data);
     45     sk_X509_NAME_pop_free(result->server_ca_names, X509_NAME_free);
     46     sk_X509_NAME_pop_free(result->client_ca_names, X509_NAME_free);
     47     OPENSSL_free(result->cipher);
     48     OPENSSL_free(result);
     49 }
     50 
     51 /*
     52  * Since there appears to be no way to extract the sent/received alert
     53  * from the SSL object directly, we use the info callback and stash
     54  * the result in ex_data.
     55  */
     56 typedef struct handshake_ex_data_st {
     57     int alert_sent;
     58     int num_fatal_alerts_sent;
     59     int alert_received;
     60     int session_ticket_do_not_call;
     61     ssl_servername_t servername;
     62 } HANDSHAKE_EX_DATA;
     63 
     64 /* |ctx_data| itself is stack-allocated. */
     65 static void ctx_data_free_data(CTX_DATA *ctx_data)
     66 {
     67     OPENSSL_free(ctx_data->npn_protocols);
     68     ctx_data->npn_protocols = NULL;
     69     OPENSSL_free(ctx_data->alpn_protocols);
     70     ctx_data->alpn_protocols = NULL;
     71     OPENSSL_free(ctx_data->srp_user);
     72     ctx_data->srp_user = NULL;
     73     OPENSSL_free(ctx_data->srp_password);
     74     ctx_data->srp_password = NULL;
     75     OPENSSL_free(ctx_data->session_ticket_app_data);
     76     ctx_data->session_ticket_app_data = NULL;
     77 }
     78 
     79 static int ex_data_idx;
     80 
     81 static void info_cb(const SSL *s, int where, int ret)
     82 {
     83     if (where & SSL_CB_ALERT) {
     84         HANDSHAKE_EX_DATA *ex_data = (HANDSHAKE_EX_DATA *)(SSL_get_ex_data(s, ex_data_idx));
     85         if (where & SSL_CB_WRITE) {
     86             ex_data->alert_sent = ret;
     87             if (strcmp(SSL_alert_type_string(ret), "F") == 0
     88                 || strcmp(SSL_alert_desc_string(ret), "CN") == 0)
     89                 ex_data->num_fatal_alerts_sent++;
     90         } else {
     91             ex_data->alert_received = ret;
     92         }
     93     }
     94 }
     95 
     96 /* Select the appropriate server CTX.
     97  * Returns SSL_TLSEXT_ERR_OK if a match was found.
     98  * If |ignore| is 1, returns SSL_TLSEXT_ERR_NOACK on mismatch.
     99  * Otherwise, returns SSL_TLSEXT_ERR_ALERT_FATAL on mismatch.
    100  * An empty SNI extension also returns SSL_TSLEXT_ERR_NOACK.
    101  */
    102 static int select_server_ctx(SSL *s, void *arg, int ignore)
    103 {
    104     const char *servername = SSL_get_servername(s, TLSEXT_NAMETYPE_host_name);
    105     HANDSHAKE_EX_DATA *ex_data = (HANDSHAKE_EX_DATA *)(SSL_get_ex_data(s, ex_data_idx));
    106 
    107     if (servername == NULL) {
    108         ex_data->servername = SSL_TEST_SERVERNAME_SERVER1;
    109         return SSL_TLSEXT_ERR_NOACK;
    110     }
    111 
    112     if (strcmp(servername, "server2") == 0) {
    113         SSL_CTX *new_ctx = (SSL_CTX *)arg;
    114         SSL_set_SSL_CTX(s, new_ctx);
    115         /*
    116          * Copy over all the SSL_CTX options - reasonable behavior
    117          * allows testing of cases where the options between two
    118          * contexts differ/conflict
    119          */
    120         SSL_clear_options(s, 0xFFFFFFFFL);
    121         SSL_set_options(s, SSL_CTX_get_options(new_ctx));
    122 
    123         ex_data->servername = SSL_TEST_SERVERNAME_SERVER2;
    124         return SSL_TLSEXT_ERR_OK;
    125     } else if (strcmp(servername, "server1") == 0) {
    126         ex_data->servername = SSL_TEST_SERVERNAME_SERVER1;
    127         return SSL_TLSEXT_ERR_OK;
    128     } else if (ignore) {
    129         ex_data->servername = SSL_TEST_SERVERNAME_SERVER1;
    130         return SSL_TLSEXT_ERR_NOACK;
    131     } else {
    132         /* Don't set an explicit alert, to test library defaults. */
    133         return SSL_TLSEXT_ERR_ALERT_FATAL;
    134     }
    135 }
    136 
    137 static int client_hello_select_server_ctx(SSL *s, void *arg, int ignore)
    138 {
    139     const char *servername;
    140     const unsigned char *p;
    141     size_t len, remaining;
    142     HANDSHAKE_EX_DATA *ex_data = (HANDSHAKE_EX_DATA *)(SSL_get_ex_data(s, ex_data_idx));
    143 
    144     /*
    145      * The server_name extension was given too much extensibility when it
    146      * was written, so parsing the normal case is a bit complex.
    147      */
    148     if (!SSL_client_hello_get0_ext(s, TLSEXT_TYPE_server_name, &p,
    149             &remaining)
    150         || remaining <= 2)
    151         return 0;
    152     /* Extract the length of the supplied list of names. */
    153     len = (*(p++) << 8);
    154     len += *(p++);
    155     if (len + 2 != remaining)
    156         return 0;
    157     remaining = len;
    158     /*
    159      * The list in practice only has a single element, so we only consider
    160      * the first one.
    161      */
    162     if (remaining == 0 || *p++ != TLSEXT_NAMETYPE_host_name)
    163         return 0;
    164     remaining--;
    165     /* Now we can finally pull out the byte array with the actual hostname. */
    166     if (remaining <= 2)
    167         return 0;
    168     len = (*(p++) << 8);
    169     len += *(p++);
    170     if (len + 2 > remaining)
    171         return 0;
    172     remaining = len;
    173     servername = (const char *)p;
    174 
    175     if (len == strlen("server2") && HAS_PREFIX(servername, "server2")) {
    176         SSL_CTX *new_ctx = arg;
    177         SSL_set_SSL_CTX(s, new_ctx);
    178         /*
    179          * Copy over all the SSL_CTX options - reasonable behavior
    180          * allows testing of cases where the options between two
    181          * contexts differ/conflict
    182          */
    183         SSL_clear_options(s, 0xFFFFFFFFL);
    184         SSL_set_options(s, SSL_CTX_get_options(new_ctx));
    185 
    186         ex_data->servername = SSL_TEST_SERVERNAME_SERVER2;
    187         return 1;
    188     } else if (len == strlen("server1") && HAS_PREFIX(servername, "server1")) {
    189         ex_data->servername = SSL_TEST_SERVERNAME_SERVER1;
    190         return 1;
    191     } else if (ignore) {
    192         ex_data->servername = SSL_TEST_SERVERNAME_SERVER1;
    193         return 1;
    194     }
    195     return 0;
    196 }
    197 /*
    198  * (RFC 6066):
    199  *  If the server understood the ClientHello extension but
    200  *  does not recognize the server name, the server SHOULD take one of two
    201  *  actions: either abort the handshake by sending a fatal-level
    202  *  unrecognized_name(112) alert or continue the handshake.
    203  *
    204  * This behaviour is up to the application to configure; we test both
    205  * configurations to ensure the state machine propagates the result
    206  * correctly.
    207  */
    208 static int servername_ignore_cb(SSL *s, int *ad, void *arg)
    209 {
    210     return select_server_ctx(s, arg, 1);
    211 }
    212 
    213 static int servername_reject_cb(SSL *s, int *ad, void *arg)
    214 {
    215     return select_server_ctx(s, arg, 0);
    216 }
    217 
    218 static int client_hello_ignore_cb(SSL *s, int *al, void *arg)
    219 {
    220     if (!client_hello_select_server_ctx(s, arg, 1)) {
    221         *al = SSL_AD_UNRECOGNIZED_NAME;
    222         return SSL_CLIENT_HELLO_ERROR;
    223     }
    224     return SSL_CLIENT_HELLO_SUCCESS;
    225 }
    226 
    227 static int client_hello_reject_cb(SSL *s, int *al, void *arg)
    228 {
    229     if (!client_hello_select_server_ctx(s, arg, 0)) {
    230         *al = SSL_AD_UNRECOGNIZED_NAME;
    231         return SSL_CLIENT_HELLO_ERROR;
    232     }
    233     return SSL_CLIENT_HELLO_SUCCESS;
    234 }
    235 
    236 static int client_hello_nov12_cb(SSL *s, int *al, void *arg)
    237 {
    238     int ret;
    239     unsigned int v;
    240     const unsigned char *p;
    241 
    242     v = SSL_client_hello_get0_legacy_version(s);
    243     if (v > TLS1_2_VERSION || v < SSL3_VERSION) {
    244         *al = SSL_AD_PROTOCOL_VERSION;
    245         return SSL_CLIENT_HELLO_ERROR;
    246     }
    247     (void)SSL_client_hello_get0_session_id(s, &p);
    248     if (p == NULL || SSL_client_hello_get0_random(s, &p) == 0 || SSL_client_hello_get0_ciphers(s, &p) == 0 || SSL_client_hello_get0_compression_methods(s, &p) == 0) {
    249         *al = SSL_AD_INTERNAL_ERROR;
    250         return SSL_CLIENT_HELLO_ERROR;
    251     }
    252     ret = client_hello_select_server_ctx(s, arg, 0);
    253     SSL_set_max_proto_version(s, TLS1_1_VERSION);
    254     if (!ret) {
    255         *al = SSL_AD_UNRECOGNIZED_NAME;
    256         return SSL_CLIENT_HELLO_ERROR;
    257     }
    258     return SSL_CLIENT_HELLO_SUCCESS;
    259 }
    260 
    261 static unsigned char dummy_ocsp_resp_good_val = 0xff;
    262 static unsigned char dummy_ocsp_resp_bad_val = 0xfe;
    263 
    264 static int server_ocsp_cb(SSL *s, void *arg)
    265 {
    266     unsigned char *resp;
    267 
    268     resp = OPENSSL_malloc(1);
    269     if (resp == NULL)
    270         return SSL_TLSEXT_ERR_ALERT_FATAL;
    271     /*
    272      * For the purposes of testing we just send back a dummy OCSP response
    273      */
    274     *resp = *(unsigned char *)arg;
    275     if (!SSL_set_tlsext_status_ocsp_resp(s, resp, 1)) {
    276         OPENSSL_free(resp);
    277         return SSL_TLSEXT_ERR_ALERT_FATAL;
    278     }
    279 
    280     return SSL_TLSEXT_ERR_OK;
    281 }
    282 
    283 static int client_ocsp_cb(SSL *s, void *arg)
    284 {
    285     const unsigned char *resp;
    286     int len;
    287 
    288     len = SSL_get_tlsext_status_ocsp_resp(s, &resp);
    289     if (len != 1 || *resp != dummy_ocsp_resp_good_val)
    290         return 0;
    291 
    292     return 1;
    293 }
    294 
    295 static int verify_reject_cb(X509_STORE_CTX *ctx, void *arg)
    296 {
    297     X509_STORE_CTX_set_error(ctx, X509_V_ERR_APPLICATION_VERIFICATION);
    298     return 0;
    299 }
    300 
    301 static int n_retries = 0;
    302 static int verify_retry_cb(X509_STORE_CTX *ctx, void *arg)
    303 {
    304     int idx = SSL_get_ex_data_X509_STORE_CTX_idx();
    305     SSL *ssl;
    306 
    307     /* this should not happen but check anyway */
    308     if (idx < 0
    309         || (ssl = X509_STORE_CTX_get_ex_data(ctx, idx)) == NULL)
    310         return 0;
    311 
    312     if (--n_retries < 0)
    313         return 1;
    314 
    315     return SSL_set_retry_verify(ssl);
    316 }
    317 
    318 static int verify_accept_cb(X509_STORE_CTX *ctx, void *arg)
    319 {
    320     return 1;
    321 }
    322 
    323 static int broken_session_ticket_cb(SSL *s, unsigned char *key_name,
    324     unsigned char *iv, EVP_CIPHER_CTX *ctx,
    325     EVP_MAC_CTX *hctx, int enc)
    326 {
    327     return 0;
    328 }
    329 
    330 static int do_not_call_session_ticket_cb(SSL *s, unsigned char *key_name,
    331     unsigned char *iv,
    332     EVP_CIPHER_CTX *ctx,
    333     EVP_MAC_CTX *hctx, int enc)
    334 {
    335     HANDSHAKE_EX_DATA *ex_data = (HANDSHAKE_EX_DATA *)(SSL_get_ex_data(s, ex_data_idx));
    336     ex_data->session_ticket_do_not_call = 1;
    337     return 0;
    338 }
    339 
    340 /* Parse the comma-separated list into TLS format. */
    341 static int parse_protos(const char *protos, unsigned char **out, size_t *outlen)
    342 {
    343     size_t len, i, prefix;
    344 
    345     len = strlen(protos);
    346 
    347     if (len == 0) {
    348         *out = NULL;
    349         *outlen = 0;
    350         return 1;
    351     }
    352 
    353     /* Should never have reuse. */
    354     if (!TEST_ptr_null(*out)
    355         /* Test values are small, so we omit length limit checks. */
    356         || !TEST_ptr(*out = OPENSSL_malloc(len + 1)))
    357         return 0;
    358     *outlen = len + 1;
    359 
    360     /*
    361      * foo => '3', 'f', 'o', 'o'
    362      * foo,bar => '3', 'f', 'o', 'o', '3', 'b', 'a', 'r'
    363      */
    364     memcpy(*out + 1, protos, len);
    365 
    366     prefix = 0;
    367     i = prefix + 1;
    368     while (i <= len) {
    369         if ((*out)[i] == ',') {
    370             if (!TEST_int_gt(i - 1, prefix))
    371                 goto err;
    372             (*out)[prefix] = (unsigned char)(i - 1 - prefix);
    373             prefix = i;
    374         }
    375         i++;
    376     }
    377     if (!TEST_int_gt(len, prefix))
    378         goto err;
    379     (*out)[prefix] = (unsigned char)(len - prefix);
    380     return 1;
    381 
    382 err:
    383     OPENSSL_free(*out);
    384     *out = NULL;
    385     return 0;
    386 }
    387 
    388 #ifndef OPENSSL_NO_NEXTPROTONEG
    389 /*
    390  * The client SHOULD select the first protocol advertised by the server that it
    391  * also supports.  In the event that the client doesn't support any of server's
    392  * protocols, or the server doesn't advertise any, it SHOULD select the first
    393  * protocol that it supports.
    394  */
    395 static int client_npn_cb(SSL *s, unsigned char **out, unsigned char *outlen,
    396     const unsigned char *in, unsigned int inlen,
    397     void *arg)
    398 {
    399     CTX_DATA *ctx_data = (CTX_DATA *)(arg);
    400     int ret;
    401 
    402     ret = SSL_select_next_proto(out, outlen, in, inlen,
    403         ctx_data->npn_protocols,
    404         ctx_data->npn_protocols_len);
    405     /* Accept both OPENSSL_NPN_NEGOTIATED and OPENSSL_NPN_NO_OVERLAP. */
    406     return TEST_true(ret == OPENSSL_NPN_NEGOTIATED || ret == OPENSSL_NPN_NO_OVERLAP)
    407         ? SSL_TLSEXT_ERR_OK
    408         : SSL_TLSEXT_ERR_ALERT_FATAL;
    409 }
    410 
    411 static int server_npn_cb(SSL *s, const unsigned char **data,
    412     unsigned int *len, void *arg)
    413 {
    414     CTX_DATA *ctx_data = (CTX_DATA *)(arg);
    415     *data = ctx_data->npn_protocols;
    416     *len = ctx_data->npn_protocols_len;
    417     return SSL_TLSEXT_ERR_OK;
    418 }
    419 #endif
    420 
    421 /*
    422  * The server SHOULD select the most highly preferred protocol that it supports
    423  * and that is also advertised by the client.  In the event that the server
    424  * supports no protocols that the client advertises, then the server SHALL
    425  * respond with a fatal "no_application_protocol" alert.
    426  */
    427 static int server_alpn_cb(SSL *s, const unsigned char **out,
    428     unsigned char *outlen, const unsigned char *in,
    429     unsigned int inlen, void *arg)
    430 {
    431     CTX_DATA *ctx_data = (CTX_DATA *)(arg);
    432     int ret;
    433 
    434     /* SSL_select_next_proto isn't const-correct... */
    435     unsigned char *tmp_out;
    436 
    437     /*
    438      * The result points either to |in| or to |ctx_data->alpn_protocols|.
    439      * The callback is allowed to point to |in| or to a long-lived buffer,
    440      * so we can return directly without storing a copy.
    441      */
    442     ret = SSL_select_next_proto(&tmp_out, outlen,
    443         ctx_data->alpn_protocols,
    444         ctx_data->alpn_protocols_len, in, inlen);
    445 
    446     *out = tmp_out;
    447     /* Unlike NPN, we don't tolerate a mismatch. */
    448     return ret == OPENSSL_NPN_NEGOTIATED ? SSL_TLSEXT_ERR_OK
    449                                          : SSL_TLSEXT_ERR_ALERT_FATAL;
    450 }
    451 
    452 static int generate_session_ticket_cb(SSL *s, void *arg)
    453 {
    454     CTX_DATA *server_ctx_data = arg;
    455     SSL_SESSION *ss = SSL_get_session(s);
    456     char *app_data = server_ctx_data->session_ticket_app_data;
    457 
    458     if (ss == NULL || app_data == NULL)
    459         return 0;
    460 
    461     return SSL_SESSION_set1_ticket_appdata(ss, app_data, strlen(app_data));
    462 }
    463 
    464 static int decrypt_session_ticket_cb(SSL *s, SSL_SESSION *ss,
    465     const unsigned char *keyname,
    466     size_t keyname_len,
    467     SSL_TICKET_STATUS status,
    468     void *arg)
    469 {
    470     switch (status) {
    471     case SSL_TICKET_EMPTY:
    472     case SSL_TICKET_NO_DECRYPT:
    473         return SSL_TICKET_RETURN_IGNORE_RENEW;
    474     case SSL_TICKET_SUCCESS:
    475         return SSL_TICKET_RETURN_USE;
    476     case SSL_TICKET_SUCCESS_RENEW:
    477         return SSL_TICKET_RETURN_USE_RENEW;
    478     default:
    479         break;
    480     }
    481     return SSL_TICKET_RETURN_ABORT;
    482 }
    483 
    484 /*
    485  * Configure callbacks and other properties that can't be set directly
    486  * in the server/client CONF.
    487  */
    488 static int configure_handshake_ctx(SSL_CTX *server_ctx, SSL_CTX *server2_ctx,
    489     SSL_CTX *client_ctx,
    490     const SSL_TEST_CTX *test,
    491     const SSL_TEST_EXTRA_CONF *extra,
    492     CTX_DATA *server_ctx_data,
    493     CTX_DATA *server2_ctx_data,
    494     CTX_DATA *client_ctx_data)
    495 {
    496     unsigned char *ticket_keys;
    497     size_t ticket_key_len;
    498 
    499     if (!TEST_int_eq(SSL_CTX_set_max_send_fragment(server_ctx,
    500                          test->max_fragment_size),
    501             1))
    502         goto err;
    503     if (server2_ctx != NULL) {
    504         if (!TEST_int_eq(SSL_CTX_set_max_send_fragment(server2_ctx,
    505                              test->max_fragment_size),
    506                 1))
    507             goto err;
    508     }
    509     if (!TEST_int_eq(SSL_CTX_set_max_send_fragment(client_ctx,
    510                          test->max_fragment_size),
    511             1))
    512         goto err;
    513 
    514     switch (extra->client.verify_callback) {
    515     case SSL_TEST_VERIFY_ACCEPT_ALL:
    516         SSL_CTX_set_cert_verify_callback(client_ctx, &verify_accept_cb, NULL);
    517         break;
    518     case SSL_TEST_VERIFY_RETRY_ONCE:
    519         n_retries = 1;
    520         SSL_CTX_set_cert_verify_callback(client_ctx, &verify_retry_cb, NULL);
    521         break;
    522     case SSL_TEST_VERIFY_REJECT_ALL:
    523         SSL_CTX_set_cert_verify_callback(client_ctx, &verify_reject_cb, NULL);
    524         break;
    525     case SSL_TEST_VERIFY_NONE:
    526         break;
    527     }
    528 
    529     switch (extra->client.max_fragment_len_mode) {
    530     case TLSEXT_max_fragment_length_512:
    531     case TLSEXT_max_fragment_length_1024:
    532     case TLSEXT_max_fragment_length_2048:
    533     case TLSEXT_max_fragment_length_4096:
    534     case TLSEXT_max_fragment_length_DISABLED:
    535         SSL_CTX_set_tlsext_max_fragment_length(
    536             client_ctx, extra->client.max_fragment_len_mode);
    537         break;
    538     }
    539 
    540     /*
    541      * Link the two contexts for SNI purposes.
    542      * Also do ClientHello callbacks here, as setting both ClientHello and SNI
    543      * is bad.
    544      */
    545     switch (extra->server.servername_callback) {
    546     case SSL_TEST_SERVERNAME_IGNORE_MISMATCH:
    547         SSL_CTX_set_tlsext_servername_callback(server_ctx, servername_ignore_cb);
    548         SSL_CTX_set_tlsext_servername_arg(server_ctx, server2_ctx);
    549         break;
    550     case SSL_TEST_SERVERNAME_REJECT_MISMATCH:
    551         SSL_CTX_set_tlsext_servername_callback(server_ctx, servername_reject_cb);
    552         SSL_CTX_set_tlsext_servername_arg(server_ctx, server2_ctx);
    553         break;
    554     case SSL_TEST_SERVERNAME_CB_NONE:
    555         break;
    556     case SSL_TEST_SERVERNAME_CLIENT_HELLO_IGNORE_MISMATCH:
    557         SSL_CTX_set_client_hello_cb(server_ctx, client_hello_ignore_cb, server2_ctx);
    558         break;
    559     case SSL_TEST_SERVERNAME_CLIENT_HELLO_REJECT_MISMATCH:
    560         SSL_CTX_set_client_hello_cb(server_ctx, client_hello_reject_cb, server2_ctx);
    561         break;
    562     case SSL_TEST_SERVERNAME_CLIENT_HELLO_NO_V12:
    563         SSL_CTX_set_client_hello_cb(server_ctx, client_hello_nov12_cb, server2_ctx);
    564     }
    565 
    566     if (extra->server.cert_status != SSL_TEST_CERT_STATUS_NONE) {
    567         SSL_CTX_set_tlsext_status_type(client_ctx, TLSEXT_STATUSTYPE_ocsp);
    568         SSL_CTX_set_tlsext_status_cb(client_ctx, client_ocsp_cb);
    569         SSL_CTX_set_tlsext_status_arg(client_ctx, NULL);
    570         SSL_CTX_set_tlsext_status_cb(server_ctx, server_ocsp_cb);
    571         SSL_CTX_set_tlsext_status_arg(server_ctx,
    572             ((extra->server.cert_status == SSL_TEST_CERT_STATUS_GOOD_RESPONSE)
    573                     ? &dummy_ocsp_resp_good_val
    574                     : &dummy_ocsp_resp_bad_val));
    575     }
    576 
    577     /*
    578      * The initial_ctx/session_ctx always handles the encrypt/decrypt of the
    579      * session ticket. This ticket_key callback is assigned to the second
    580      * session (assigned via SNI), and should never be invoked
    581      */
    582     if (server2_ctx != NULL)
    583         SSL_CTX_set_tlsext_ticket_key_evp_cb(server2_ctx,
    584             do_not_call_session_ticket_cb);
    585 
    586     if (extra->server.broken_session_ticket) {
    587         SSL_CTX_set_tlsext_ticket_key_evp_cb(server_ctx,
    588             broken_session_ticket_cb);
    589     }
    590 #ifndef OPENSSL_NO_NEXTPROTONEG
    591     if (extra->server.npn_protocols != NULL) {
    592         if (!TEST_true(parse_protos(extra->server.npn_protocols,
    593                 &server_ctx_data->npn_protocols,
    594                 &server_ctx_data->npn_protocols_len)))
    595             goto err;
    596         SSL_CTX_set_npn_advertised_cb(server_ctx, server_npn_cb,
    597             server_ctx_data);
    598     }
    599     if (extra->server2.npn_protocols != NULL) {
    600         if (!TEST_true(parse_protos(extra->server2.npn_protocols,
    601                 &server2_ctx_data->npn_protocols,
    602                 &server2_ctx_data->npn_protocols_len))
    603             || !TEST_ptr(server2_ctx))
    604             goto err;
    605         SSL_CTX_set_npn_advertised_cb(server2_ctx, server_npn_cb,
    606             server2_ctx_data);
    607     }
    608     if (extra->client.npn_protocols != NULL) {
    609         if (!TEST_true(parse_protos(extra->client.npn_protocols,
    610                 &client_ctx_data->npn_protocols,
    611                 &client_ctx_data->npn_protocols_len)))
    612             goto err;
    613         SSL_CTX_set_next_proto_select_cb(client_ctx, client_npn_cb,
    614             client_ctx_data);
    615     }
    616 #endif
    617     if (extra->server.alpn_protocols != NULL) {
    618         if (!TEST_true(parse_protos(extra->server.alpn_protocols,
    619                 &server_ctx_data->alpn_protocols,
    620                 &server_ctx_data->alpn_protocols_len)))
    621             goto err;
    622         SSL_CTX_set_alpn_select_cb(server_ctx, server_alpn_cb, server_ctx_data);
    623     }
    624     if (extra->server2.alpn_protocols != NULL) {
    625         if (!TEST_ptr(server2_ctx)
    626             || !TEST_true(parse_protos(extra->server2.alpn_protocols,
    627                 &server2_ctx_data->alpn_protocols,
    628                 &server2_ctx_data->alpn_protocols_len)))
    629             goto err;
    630         SSL_CTX_set_alpn_select_cb(server2_ctx, server_alpn_cb,
    631             server2_ctx_data);
    632     }
    633     if (extra->client.alpn_protocols != NULL) {
    634         unsigned char *alpn_protos = NULL;
    635         size_t alpn_protos_len = 0;
    636 
    637         if (!TEST_true(parse_protos(extra->client.alpn_protocols,
    638                 &alpn_protos, &alpn_protos_len))
    639             /* Reversed return value convention... */
    640             || !TEST_int_eq(SSL_CTX_set_alpn_protos(client_ctx, alpn_protos,
    641                                 alpn_protos_len),
    642                 0))
    643             goto err;
    644         OPENSSL_free(alpn_protos);
    645     }
    646 
    647     if (extra->server.session_ticket_app_data != NULL) {
    648         server_ctx_data->session_ticket_app_data = OPENSSL_strdup(extra->server.session_ticket_app_data);
    649         if (!TEST_ptr(server_ctx_data->session_ticket_app_data))
    650             goto err;
    651         SSL_CTX_set_session_ticket_cb(server_ctx, generate_session_ticket_cb,
    652             decrypt_session_ticket_cb, server_ctx_data);
    653     }
    654     if (extra->server2.session_ticket_app_data != NULL) {
    655         if (!TEST_ptr(server2_ctx))
    656             goto err;
    657         server2_ctx_data->session_ticket_app_data = OPENSSL_strdup(extra->server2.session_ticket_app_data);
    658         if (!TEST_ptr(server2_ctx_data->session_ticket_app_data))
    659             goto err;
    660         SSL_CTX_set_session_ticket_cb(server2_ctx, NULL,
    661             decrypt_session_ticket_cb, server2_ctx_data);
    662     }
    663 
    664     /*
    665      * Use fixed session ticket keys so that we can decrypt a ticket created with
    666      * one CTX in another CTX. Don't address server2 for the moment.
    667      */
    668     ticket_key_len = SSL_CTX_set_tlsext_ticket_keys(server_ctx, NULL, 0);
    669     if (!TEST_ptr(ticket_keys = OPENSSL_zalloc(ticket_key_len))
    670         || !TEST_int_eq(SSL_CTX_set_tlsext_ticket_keys(server_ctx,
    671                             ticket_keys,
    672                             ticket_key_len),
    673             1)) {
    674         OPENSSL_free(ticket_keys);
    675         goto err;
    676     }
    677     OPENSSL_free(ticket_keys);
    678 
    679     /* The default log list includes EC keys, so CT can't work without EC. */
    680 #if !defined(OPENSSL_NO_CT) && !defined(OPENSSL_NO_EC)
    681     if (!TEST_true(SSL_CTX_set_default_ctlog_list_file(client_ctx)))
    682         goto err;
    683     switch (extra->client.ct_validation) {
    684     case SSL_TEST_CT_VALIDATION_PERMISSIVE:
    685         if (!TEST_true(SSL_CTX_enable_ct(client_ctx,
    686                 SSL_CT_VALIDATION_PERMISSIVE)))
    687             goto err;
    688         break;
    689     case SSL_TEST_CT_VALIDATION_STRICT:
    690         if (!TEST_true(SSL_CTX_enable_ct(client_ctx, SSL_CT_VALIDATION_STRICT)))
    691             goto err;
    692         break;
    693     case SSL_TEST_CT_VALIDATION_NONE:
    694         break;
    695     }
    696 #endif
    697 #ifndef OPENSSL_NO_SRP
    698     if (!configure_handshake_ctx_for_srp(server_ctx, server2_ctx, client_ctx,
    699             extra, server_ctx_data,
    700             server2_ctx_data, client_ctx_data))
    701         goto err;
    702 #endif /* !OPENSSL_NO_SRP */
    703 #ifndef OPENSSL_NO_COMP_ALG
    704     if (test->compress_certificates) {
    705         if (!TEST_true(SSL_CTX_compress_certs(server_ctx, 0)))
    706             goto err;
    707         if (server2_ctx != NULL && !TEST_true(SSL_CTX_compress_certs(server2_ctx, 0)))
    708             goto err;
    709     }
    710 #endif
    711     return 1;
    712 err:
    713     return 0;
    714 }
    715 
    716 /* Configure per-SSL callbacks and other properties. */
    717 static void configure_handshake_ssl(SSL *server, SSL *client,
    718     const SSL_TEST_EXTRA_CONF *extra)
    719 {
    720     if (extra->client.servername != SSL_TEST_SERVERNAME_NONE)
    721         SSL_set_tlsext_host_name(client,
    722             ssl_servername_name(extra->client.servername));
    723     if (extra->client.enable_pha)
    724         SSL_set_post_handshake_auth(client, 1);
    725 }
    726 
    727 /* The status for each connection phase. */
    728 typedef enum {
    729     PEER_SUCCESS,
    730     PEER_RETRY,
    731     PEER_ERROR,
    732     PEER_WAITING,
    733     PEER_TEST_FAILURE
    734 } peer_status_t;
    735 
    736 /* An SSL object and associated read-write buffers. */
    737 typedef struct peer_st {
    738     SSL *ssl;
    739     /* Buffer lengths are int to match the SSL read/write API. */
    740     unsigned char *write_buf;
    741     int write_buf_len;
    742     unsigned char *read_buf;
    743     int read_buf_len;
    744     int bytes_to_write;
    745     int bytes_to_read;
    746     peer_status_t status;
    747 } PEER;
    748 
    749 static int create_peer(PEER *peer, SSL_CTX *ctx)
    750 {
    751     static const int peer_buffer_size = 64 * 1024;
    752     SSL *ssl = NULL;
    753     unsigned char *read_buf = NULL, *write_buf = NULL;
    754 
    755     if (!TEST_ptr(ssl = SSL_new(ctx))
    756         || !TEST_ptr(write_buf = OPENSSL_zalloc(peer_buffer_size))
    757         || !TEST_ptr(read_buf = OPENSSL_zalloc(peer_buffer_size)))
    758         goto err;
    759 
    760     peer->ssl = ssl;
    761     peer->write_buf = write_buf;
    762     peer->read_buf = read_buf;
    763     peer->write_buf_len = peer->read_buf_len = peer_buffer_size;
    764     return 1;
    765 err:
    766     SSL_free(ssl);
    767     OPENSSL_free(write_buf);
    768     OPENSSL_free(read_buf);
    769     return 0;
    770 }
    771 
    772 static void peer_free_data(PEER *peer)
    773 {
    774     SSL_free(peer->ssl);
    775     OPENSSL_free(peer->write_buf);
    776     OPENSSL_free(peer->read_buf);
    777 }
    778 
    779 /*
    780  * Note that we could do the handshake transparently under an SSL_write,
    781  * but separating the steps is more helpful for debugging test failures.
    782  */
    783 static void do_handshake_step(PEER *peer)
    784 {
    785     if (!TEST_int_eq(peer->status, PEER_RETRY)) {
    786         peer->status = PEER_TEST_FAILURE;
    787     } else {
    788         int ret = SSL_do_handshake(peer->ssl);
    789 
    790         if (ret == 1) {
    791             peer->status = PEER_SUCCESS;
    792         } else if (ret == 0) {
    793             peer->status = PEER_ERROR;
    794         } else {
    795             int error = SSL_get_error(peer->ssl, ret);
    796 
    797             /* Memory bios should never block with SSL_ERROR_WANT_WRITE. */
    798             if (error != SSL_ERROR_WANT_READ
    799                 && error != SSL_ERROR_WANT_RETRY_VERIFY)
    800                 peer->status = PEER_ERROR;
    801         }
    802     }
    803 }
    804 
    805 /*-
    806  * Send/receive some application data. The read-write sequence is
    807  * Peer A: (R) W - first read will yield no data
    808  * Peer B:  R  W
    809  * ...
    810  * Peer A:  R  W
    811  * Peer B:  R  W
    812  * Peer A:  R
    813  */
    814 static void do_app_data_step(PEER *peer)
    815 {
    816     int ret = 1, write_bytes;
    817 
    818     if (!TEST_int_eq(peer->status, PEER_RETRY)) {
    819         peer->status = PEER_TEST_FAILURE;
    820         return;
    821     }
    822 
    823     /* We read everything available... */
    824     while (ret > 0 && peer->bytes_to_read) {
    825         ret = SSL_read(peer->ssl, peer->read_buf, peer->read_buf_len);
    826         if (ret > 0) {
    827             if (!TEST_int_le(ret, peer->bytes_to_read)) {
    828                 peer->status = PEER_TEST_FAILURE;
    829                 return;
    830             }
    831             peer->bytes_to_read -= ret;
    832         } else if (ret == 0) {
    833             peer->status = PEER_ERROR;
    834             return;
    835         } else {
    836             int error = SSL_get_error(peer->ssl, ret);
    837             if (error != SSL_ERROR_WANT_READ) {
    838                 peer->status = PEER_ERROR;
    839                 return;
    840             } /* Else continue with write. */
    841         }
    842     }
    843 
    844     /* ... but we only write one write-buffer-full of data. */
    845     write_bytes = peer->bytes_to_write < peer->write_buf_len ? peer->bytes_to_write : peer->write_buf_len;
    846     if (write_bytes) {
    847         ret = SSL_write(peer->ssl, peer->write_buf, write_bytes);
    848         if (ret > 0) {
    849             /* SSL_write will only succeed with a complete write. */
    850             if (!TEST_int_eq(ret, write_bytes)) {
    851                 peer->status = PEER_TEST_FAILURE;
    852                 return;
    853             }
    854             peer->bytes_to_write -= ret;
    855         } else {
    856             /*
    857              * We should perhaps check for SSL_ERROR_WANT_READ/WRITE here
    858              * but this doesn't yet occur with current app data sizes.
    859              */
    860             peer->status = PEER_ERROR;
    861             return;
    862         }
    863     }
    864 
    865     /*
    866      * We could simply finish when there was nothing to read, and we have
    867      * nothing left to write. But keeping track of the expected number of bytes
    868      * to read gives us somewhat better guarantees that all data sent is in fact
    869      * received.
    870      */
    871     if (peer->bytes_to_write == 0 && peer->bytes_to_read == 0) {
    872         peer->status = PEER_SUCCESS;
    873     }
    874 }
    875 
    876 static void do_reneg_setup_step(const SSL_TEST_CTX *test_ctx, PEER *peer)
    877 {
    878     int ret;
    879     char buf;
    880 
    881     if (peer->status == PEER_SUCCESS) {
    882         /*
    883          * We are a client that succeeded this step previously, but the server
    884          * wanted to retry. Probably there is a no_renegotiation warning alert
    885          * waiting for us. Attempt to continue the handshake.
    886          */
    887         peer->status = PEER_RETRY;
    888         do_handshake_step(peer);
    889         return;
    890     }
    891 
    892     if (!TEST_int_eq(peer->status, PEER_RETRY)
    893         || !TEST_true(test_ctx->handshake_mode
    894                 == SSL_TEST_HANDSHAKE_RENEG_SERVER
    895             || test_ctx->handshake_mode
    896                 == SSL_TEST_HANDSHAKE_RENEG_CLIENT
    897             || test_ctx->handshake_mode
    898                 == SSL_TEST_HANDSHAKE_KEY_UPDATE_SERVER
    899             || test_ctx->handshake_mode
    900                 == SSL_TEST_HANDSHAKE_KEY_UPDATE_CLIENT
    901             || test_ctx->handshake_mode
    902                 == SSL_TEST_HANDSHAKE_POST_HANDSHAKE_AUTH)) {
    903         peer->status = PEER_TEST_FAILURE;
    904         return;
    905     }
    906 
    907     /* Reset the count of the amount of app data we need to read/write */
    908     peer->bytes_to_write = peer->bytes_to_read = test_ctx->app_data_size;
    909 
    910     /* Check if we are the peer that is going to initiate */
    911     if ((test_ctx->handshake_mode == SSL_TEST_HANDSHAKE_RENEG_SERVER
    912             && SSL_is_server(peer->ssl))
    913         || (test_ctx->handshake_mode == SSL_TEST_HANDSHAKE_RENEG_CLIENT
    914             && !SSL_is_server(peer->ssl))) {
    915         /*
    916          * If we already asked for a renegotiation then fall through to the
    917          * SSL_read() below.
    918          */
    919         if (!SSL_renegotiate_pending(peer->ssl)) {
    920             /*
    921              * If we are the client we will always attempt to resume the
    922              * session. The server may or may not resume dependent on the
    923              * setting of SSL_OP_NO_SESSION_RESUMPTION_ON_RENEGOTIATION
    924              */
    925             if (SSL_is_server(peer->ssl)) {
    926                 ret = SSL_renegotiate(peer->ssl);
    927             } else {
    928                 int full_reneg = 0;
    929 
    930                 if (test_ctx->extra.client.no_extms_on_reneg) {
    931                     SSL_set_options(peer->ssl, SSL_OP_NO_EXTENDED_MASTER_SECRET);
    932                     full_reneg = 1;
    933                 }
    934                 if (test_ctx->extra.client.reneg_ciphers != NULL) {
    935                     if (!SSL_set_cipher_list(peer->ssl,
    936                             test_ctx->extra.client.reneg_ciphers)) {
    937                         peer->status = PEER_ERROR;
    938                         return;
    939                     }
    940                     full_reneg = 1;
    941                 }
    942                 if (full_reneg)
    943                     ret = SSL_renegotiate(peer->ssl);
    944                 else
    945                     ret = SSL_renegotiate_abbreviated(peer->ssl);
    946             }
    947             if (!ret) {
    948                 peer->status = PEER_ERROR;
    949                 return;
    950             }
    951             do_handshake_step(peer);
    952             /*
    953              * If status is PEER_RETRY it means we're waiting on the peer to
    954              * continue the handshake. As far as setting up the renegotiation is
    955              * concerned that is a success. The next step will continue the
    956              * handshake to its conclusion.
    957              *
    958              * If status is PEER_SUCCESS then we are the server and we have
    959              * successfully sent the HelloRequest. We need to continue to wait
    960              * until the handshake arrives from the client.
    961              */
    962             if (peer->status == PEER_RETRY)
    963                 peer->status = PEER_SUCCESS;
    964             else if (peer->status == PEER_SUCCESS)
    965                 peer->status = PEER_RETRY;
    966             return;
    967         }
    968     } else if (test_ctx->handshake_mode == SSL_TEST_HANDSHAKE_KEY_UPDATE_SERVER
    969         || test_ctx->handshake_mode
    970             == SSL_TEST_HANDSHAKE_KEY_UPDATE_CLIENT) {
    971         if (SSL_is_server(peer->ssl)
    972             != (test_ctx->handshake_mode
    973                 == SSL_TEST_HANDSHAKE_KEY_UPDATE_SERVER)) {
    974             peer->status = PEER_SUCCESS;
    975             return;
    976         }
    977 
    978         ret = SSL_key_update(peer->ssl, test_ctx->key_update_type);
    979         if (!ret) {
    980             peer->status = PEER_ERROR;
    981             return;
    982         }
    983         do_handshake_step(peer);
    984         /*
    985          * This is a one step handshake. We shouldn't get anything other than
    986          * PEER_SUCCESS
    987          */
    988         if (peer->status != PEER_SUCCESS)
    989             peer->status = PEER_ERROR;
    990         return;
    991     } else if (test_ctx->handshake_mode == SSL_TEST_HANDSHAKE_POST_HANDSHAKE_AUTH) {
    992         if (SSL_is_server(peer->ssl)) {
    993             SSL_CONNECTION *sc = SSL_CONNECTION_FROM_SSL_ONLY(peer->ssl);
    994 
    995             if (sc == NULL) {
    996                 peer->status = PEER_ERROR;
    997                 return;
    998             }
    999             /* Make the server believe it's received the extension */
   1000             if (test_ctx->extra.server.force_pha)
   1001                 sc->post_handshake_auth = SSL_PHA_EXT_RECEIVED;
   1002             ret = SSL_verify_client_post_handshake(peer->ssl);
   1003             if (!ret) {
   1004                 peer->status = PEER_ERROR;
   1005                 return;
   1006             }
   1007         }
   1008         do_handshake_step(peer);
   1009         /*
   1010          * This is a one step handshake. We shouldn't get anything other than
   1011          * PEER_SUCCESS
   1012          */
   1013         if (peer->status != PEER_SUCCESS)
   1014             peer->status = PEER_ERROR;
   1015         return;
   1016     }
   1017 
   1018     /*
   1019      * The SSL object is still expecting app data, even though it's going to
   1020      * get a handshake message. We try to read, and it should fail - after which
   1021      * we should be in a handshake
   1022      */
   1023     ret = SSL_read(peer->ssl, &buf, sizeof(buf));
   1024     if (ret >= 0) {
   1025         /*
   1026          * We're not actually expecting data - we're expecting a reneg to
   1027          * start
   1028          */
   1029         peer->status = PEER_ERROR;
   1030         return;
   1031     } else {
   1032         int error = SSL_get_error(peer->ssl, ret);
   1033         if (error != SSL_ERROR_WANT_READ) {
   1034             peer->status = PEER_ERROR;
   1035             return;
   1036         }
   1037         /* If we're not in init yet then we're not done with setup yet */
   1038         if (!SSL_in_init(peer->ssl))
   1039             return;
   1040     }
   1041 
   1042     peer->status = PEER_SUCCESS;
   1043 }
   1044 
   1045 /*
   1046  * RFC 5246 says:
   1047  *
   1048  * Note that as of TLS 1.1,
   1049  *     failure to properly close a connection no longer requires that a
   1050  *     session not be resumed.  This is a change from TLS 1.0 to conform
   1051  *     with widespread implementation practice.
   1052  *
   1053  * However,
   1054  * (a) OpenSSL requires that a connection be shutdown for all protocol versions.
   1055  * (b) We test lower versions, too.
   1056  * So we just implement shutdown. We do a full bidirectional shutdown so that we
   1057  * can compare sent and received close_notify alerts and get some test coverage
   1058  * for SSL_shutdown as a bonus.
   1059  */
   1060 static void do_shutdown_step(PEER *peer)
   1061 {
   1062     int ret;
   1063 
   1064     if (!TEST_int_eq(peer->status, PEER_RETRY)) {
   1065         peer->status = PEER_TEST_FAILURE;
   1066         return;
   1067     }
   1068     ret = SSL_shutdown(peer->ssl);
   1069 
   1070     if (ret == 1) {
   1071         peer->status = PEER_SUCCESS;
   1072     } else if (ret < 0) { /* On 0, we retry. */
   1073         int error = SSL_get_error(peer->ssl, ret);
   1074 
   1075         if (error != SSL_ERROR_WANT_READ && error != SSL_ERROR_WANT_WRITE)
   1076             peer->status = PEER_ERROR;
   1077     }
   1078 }
   1079 
   1080 typedef enum {
   1081     HANDSHAKE,
   1082     RENEG_APPLICATION_DATA,
   1083     RENEG_SETUP,
   1084     RENEG_HANDSHAKE,
   1085     APPLICATION_DATA,
   1086     SHUTDOWN,
   1087     CONNECTION_DONE
   1088 } connect_phase_t;
   1089 
   1090 static int renegotiate_op(const SSL_TEST_CTX *test_ctx)
   1091 {
   1092     switch (test_ctx->handshake_mode) {
   1093     case SSL_TEST_HANDSHAKE_RENEG_SERVER:
   1094     case SSL_TEST_HANDSHAKE_RENEG_CLIENT:
   1095         return 1;
   1096     default:
   1097         return 0;
   1098     }
   1099 }
   1100 static int post_handshake_op(const SSL_TEST_CTX *test_ctx)
   1101 {
   1102     switch (test_ctx->handshake_mode) {
   1103     case SSL_TEST_HANDSHAKE_KEY_UPDATE_CLIENT:
   1104     case SSL_TEST_HANDSHAKE_KEY_UPDATE_SERVER:
   1105     case SSL_TEST_HANDSHAKE_POST_HANDSHAKE_AUTH:
   1106         return 1;
   1107     default:
   1108         return 0;
   1109     }
   1110 }
   1111 
   1112 static connect_phase_t next_phase(const SSL_TEST_CTX *test_ctx,
   1113     connect_phase_t phase)
   1114 {
   1115     switch (phase) {
   1116     case HANDSHAKE:
   1117         if (renegotiate_op(test_ctx) || post_handshake_op(test_ctx))
   1118             return RENEG_APPLICATION_DATA;
   1119         return APPLICATION_DATA;
   1120     case RENEG_APPLICATION_DATA:
   1121         return RENEG_SETUP;
   1122     case RENEG_SETUP:
   1123         if (post_handshake_op(test_ctx))
   1124             return APPLICATION_DATA;
   1125         return RENEG_HANDSHAKE;
   1126     case RENEG_HANDSHAKE:
   1127         return APPLICATION_DATA;
   1128     case APPLICATION_DATA:
   1129         return SHUTDOWN;
   1130     case SHUTDOWN:
   1131         return CONNECTION_DONE;
   1132     case CONNECTION_DONE:
   1133         TEST_error("Trying to progress after connection done");
   1134         break;
   1135     }
   1136     return -1;
   1137 }
   1138 
   1139 static void do_connect_step(const SSL_TEST_CTX *test_ctx, PEER *peer,
   1140     connect_phase_t phase)
   1141 {
   1142     switch (phase) {
   1143     case HANDSHAKE:
   1144         do_handshake_step(peer);
   1145         break;
   1146     case RENEG_APPLICATION_DATA:
   1147         do_app_data_step(peer);
   1148         break;
   1149     case RENEG_SETUP:
   1150         do_reneg_setup_step(test_ctx, peer);
   1151         break;
   1152     case RENEG_HANDSHAKE:
   1153         do_handshake_step(peer);
   1154         break;
   1155     case APPLICATION_DATA:
   1156         do_app_data_step(peer);
   1157         break;
   1158     case SHUTDOWN:
   1159         do_shutdown_step(peer);
   1160         break;
   1161     case CONNECTION_DONE:
   1162         TEST_error("Action after connection done");
   1163         break;
   1164     }
   1165 }
   1166 
   1167 typedef enum {
   1168     /* Both parties succeeded. */
   1169     HANDSHAKE_SUCCESS,
   1170     /* Client errored. */
   1171     CLIENT_ERROR,
   1172     /* Server errored. */
   1173     SERVER_ERROR,
   1174     /* Peers are in inconsistent state. */
   1175     INTERNAL_ERROR,
   1176     /* One or both peers not done. */
   1177     HANDSHAKE_RETRY
   1178 } handshake_status_t;
   1179 
   1180 /*
   1181  * Determine the handshake outcome.
   1182  * last_status: the status of the peer to have acted last.
   1183  * previous_status: the status of the peer that didn't act last.
   1184  * client_spoke_last: 1 if the client went last.
   1185  */
   1186 static handshake_status_t handshake_status(peer_status_t last_status,
   1187     peer_status_t previous_status,
   1188     int client_spoke_last)
   1189 {
   1190     switch (last_status) {
   1191     case PEER_TEST_FAILURE:
   1192         return INTERNAL_ERROR;
   1193 
   1194     case PEER_WAITING:
   1195         /* Shouldn't ever happen */
   1196         return INTERNAL_ERROR;
   1197 
   1198     case PEER_SUCCESS:
   1199         switch (previous_status) {
   1200         case PEER_TEST_FAILURE:
   1201             return INTERNAL_ERROR;
   1202         case PEER_SUCCESS:
   1203             /* Both succeeded. */
   1204             return HANDSHAKE_SUCCESS;
   1205         case PEER_WAITING:
   1206         case PEER_RETRY:
   1207             /* Let the first peer finish. */
   1208             return HANDSHAKE_RETRY;
   1209         case PEER_ERROR:
   1210             /*
   1211              * Second peer succeeded despite the fact that the first peer
   1212              * already errored. This shouldn't happen.
   1213              */
   1214             return INTERNAL_ERROR;
   1215         }
   1216         break;
   1217 
   1218     case PEER_RETRY:
   1219         return HANDSHAKE_RETRY;
   1220 
   1221     case PEER_ERROR:
   1222         switch (previous_status) {
   1223         case PEER_TEST_FAILURE:
   1224             return INTERNAL_ERROR;
   1225         case PEER_WAITING:
   1226             /* The client failed immediately before sending the ClientHello */
   1227             return client_spoke_last ? CLIENT_ERROR : INTERNAL_ERROR;
   1228         case PEER_SUCCESS:
   1229             /* First peer succeeded but second peer errored. */
   1230             return client_spoke_last ? CLIENT_ERROR : SERVER_ERROR;
   1231         case PEER_RETRY:
   1232             /* We errored; let the peer finish. */
   1233             return HANDSHAKE_RETRY;
   1234         case PEER_ERROR:
   1235             /* Both peers errored. Return the one that errored first. */
   1236             return client_spoke_last ? SERVER_ERROR : CLIENT_ERROR;
   1237         }
   1238     }
   1239     /* Control should never reach here. */
   1240     return INTERNAL_ERROR;
   1241 }
   1242 
   1243 /* Convert unsigned char buf's that shouldn't contain any NUL-bytes to char. */
   1244 static char *dup_str(const unsigned char *in, size_t len)
   1245 {
   1246     char *ret = NULL;
   1247 
   1248     if (len == 0)
   1249         return NULL;
   1250 
   1251     /* Assert that the string does not contain NUL-bytes. */
   1252     if (TEST_size_t_eq(OPENSSL_strnlen((const char *)(in), len), len))
   1253         TEST_ptr(ret = OPENSSL_strndup((const char *)(in), len));
   1254     return ret;
   1255 }
   1256 
   1257 static int pkey_type(EVP_PKEY *pkey)
   1258 {
   1259     if (EVP_PKEY_is_a(pkey, "EC")) {
   1260         char name[80];
   1261         size_t name_len;
   1262 
   1263         if (!EVP_PKEY_get_group_name(pkey, name, sizeof(name), &name_len))
   1264             return NID_undef;
   1265         return OBJ_txt2nid(name);
   1266     }
   1267     return EVP_PKEY_get_id(pkey);
   1268 }
   1269 
   1270 static int peer_pkey_type(SSL *s)
   1271 {
   1272     X509 *x = SSL_get0_peer_certificate(s);
   1273 
   1274     if (x != NULL)
   1275         return pkey_type(X509_get0_pubkey(x));
   1276     return NID_undef;
   1277 }
   1278 
   1279 #if !defined(OPENSSL_NO_SCTP) && !defined(OPENSSL_NO_SOCK)
   1280 static int set_sock_as_sctp(int sock)
   1281 {
   1282     struct sctp_assocparams assocparams;
   1283     struct sctp_rtoinfo rto_info;
   1284     BIO *tmpbio;
   1285 
   1286     /*
   1287      * To allow tests to fail fast (within a second or so), reduce the
   1288      * retransmission timeouts and the number of retransmissions.
   1289      */
   1290     memset(&rto_info, 0, sizeof(struct sctp_rtoinfo));
   1291     rto_info.srto_initial = 100;
   1292     rto_info.srto_max = 200;
   1293     rto_info.srto_min = 50;
   1294     (void)setsockopt(sock, IPPROTO_SCTP, SCTP_RTOINFO,
   1295         (const void *)&rto_info, sizeof(struct sctp_rtoinfo));
   1296     memset(&assocparams, 0, sizeof(struct sctp_assocparams));
   1297     assocparams.sasoc_asocmaxrxt = 2;
   1298     (void)setsockopt(sock, IPPROTO_SCTP, SCTP_ASSOCINFO,
   1299         (const void *)&assocparams,
   1300         sizeof(struct sctp_assocparams));
   1301 
   1302     /*
   1303      * For SCTP we have to set various options on the socket prior to
   1304      * connecting. This is done automatically by BIO_new_dgram_sctp().
   1305      * We don't actually need the created BIO though so we free it again
   1306      * immediately.
   1307      */
   1308     tmpbio = BIO_new_dgram_sctp(sock, BIO_NOCLOSE);
   1309 
   1310     if (tmpbio == NULL)
   1311         return 0;
   1312     BIO_free(tmpbio);
   1313 
   1314     return 1;
   1315 }
   1316 
   1317 static int create_sctp_socks(int *ssock, int *csock)
   1318 {
   1319     BIO_ADDRINFO *res = NULL;
   1320     const BIO_ADDRINFO *ai = NULL;
   1321     int lsock = INVALID_SOCKET, asock = INVALID_SOCKET;
   1322     int consock = INVALID_SOCKET;
   1323     int ret = 0;
   1324     int family = 0;
   1325 
   1326     if (BIO_sock_init() != 1)
   1327         return 0;
   1328 
   1329     /*
   1330      * Port is 4463. It could be anything. It will fail if it's already being
   1331      * used for some other SCTP service. It seems unlikely though so we don't
   1332      * worry about it here.
   1333      */
   1334     if (!BIO_lookup_ex(NULL, "4463", BIO_LOOKUP_SERVER, family, SOCK_STREAM,
   1335             IPPROTO_SCTP, &res))
   1336         return 0;
   1337 
   1338     for (ai = res; ai != NULL; ai = BIO_ADDRINFO_next(ai)) {
   1339         family = BIO_ADDRINFO_family(ai);
   1340         lsock = BIO_socket(family, SOCK_STREAM, IPPROTO_SCTP, 0);
   1341         if (lsock == INVALID_SOCKET) {
   1342             /* Maybe the kernel doesn't support the socket family, even if
   1343              * BIO_lookup() added it in the returned result...
   1344              */
   1345             continue;
   1346         }
   1347 
   1348         if (!set_sock_as_sctp(lsock)
   1349             || !BIO_listen(lsock, BIO_ADDRINFO_address(ai),
   1350                 BIO_SOCK_REUSEADDR)) {
   1351             BIO_closesocket(lsock);
   1352             lsock = INVALID_SOCKET;
   1353             continue;
   1354         }
   1355 
   1356         /* Success, don't try any more addresses */
   1357         break;
   1358     }
   1359 
   1360     if (lsock == INVALID_SOCKET)
   1361         goto err;
   1362 
   1363     BIO_ADDRINFO_free(res);
   1364     res = NULL;
   1365 
   1366     if (!BIO_lookup_ex(NULL, "4463", BIO_LOOKUP_CLIENT, family, SOCK_STREAM,
   1367             IPPROTO_SCTP, &res))
   1368         goto err;
   1369 
   1370     consock = BIO_socket(family, SOCK_STREAM, IPPROTO_SCTP, 0);
   1371     if (consock == INVALID_SOCKET)
   1372         goto err;
   1373 
   1374     if (!set_sock_as_sctp(consock)
   1375         || !BIO_connect(consock, BIO_ADDRINFO_address(res), 0)
   1376         || !BIO_socket_nbio(consock, 1))
   1377         goto err;
   1378 
   1379     asock = BIO_accept_ex(lsock, NULL, BIO_SOCK_NONBLOCK);
   1380     if (asock == INVALID_SOCKET)
   1381         goto err;
   1382 
   1383     *csock = consock;
   1384     *ssock = asock;
   1385     consock = asock = INVALID_SOCKET;
   1386     ret = 1;
   1387 
   1388 err:
   1389     BIO_ADDRINFO_free(res);
   1390     if (consock != INVALID_SOCKET)
   1391         BIO_closesocket(consock);
   1392     if (lsock != INVALID_SOCKET)
   1393         BIO_closesocket(lsock);
   1394     if (asock != INVALID_SOCKET)
   1395         BIO_closesocket(asock);
   1396     return ret;
   1397 }
   1398 #endif
   1399 
   1400 /*
   1401  * Note that |extra| points to the correct client/server configuration
   1402  * within |test_ctx|. When configuring the handshake, general mode settings
   1403  * are taken from |test_ctx|, and client/server-specific settings should be
   1404  * taken from |extra|.
   1405  *
   1406  * The configuration code should never reach into |test_ctx->extra| or
   1407  * |test_ctx->resume_extra| directly.
   1408  *
   1409  * (We could refactor test mode settings into a substructure. This would result
   1410  * in cleaner argument passing but would complicate the test configuration
   1411  * parsing.)
   1412  */
   1413 static HANDSHAKE_RESULT *do_handshake_internal(
   1414     SSL_CTX *server_ctx, SSL_CTX *server2_ctx, SSL_CTX *client_ctx,
   1415     const SSL_TEST_CTX *test_ctx, const SSL_TEST_EXTRA_CONF *extra,
   1416     SSL_SESSION *session_in, SSL_SESSION *serv_sess_in,
   1417     SSL_SESSION **session_out, SSL_SESSION **serv_sess_out)
   1418 {
   1419     PEER server, client;
   1420     BIO *client_to_server = NULL, *server_to_client = NULL;
   1421     HANDSHAKE_EX_DATA server_ex_data, client_ex_data;
   1422     CTX_DATA client_ctx_data, server_ctx_data, server2_ctx_data;
   1423     HANDSHAKE_RESULT *ret = HANDSHAKE_RESULT_new();
   1424     int client_turn = 1, client_turn_count = 0, client_wait_count = 0;
   1425     connect_phase_t phase = HANDSHAKE;
   1426     handshake_status_t status = HANDSHAKE_RETRY;
   1427     const unsigned char *tick = NULL;
   1428     size_t tick_len = 0;
   1429     const unsigned char *sess_id = NULL;
   1430     unsigned int sess_id_len = 0;
   1431     SSL_SESSION *sess = NULL;
   1432     const unsigned char *proto = NULL;
   1433     /* API dictates unsigned int rather than size_t. */
   1434     unsigned int proto_len = 0;
   1435     EVP_PKEY *tmp_key;
   1436     const STACK_OF(X509_NAME) *names;
   1437     time_t start;
   1438     const char *cipher;
   1439 
   1440     if (ret == NULL)
   1441         return NULL;
   1442 
   1443     memset(&server_ctx_data, 0, sizeof(server_ctx_data));
   1444     memset(&server2_ctx_data, 0, sizeof(server2_ctx_data));
   1445     memset(&client_ctx_data, 0, sizeof(client_ctx_data));
   1446     memset(&server, 0, sizeof(server));
   1447     memset(&client, 0, sizeof(client));
   1448     memset(&server_ex_data, 0, sizeof(server_ex_data));
   1449     memset(&client_ex_data, 0, sizeof(client_ex_data));
   1450 
   1451     if (!configure_handshake_ctx(server_ctx, server2_ctx, client_ctx,
   1452             test_ctx, extra, &server_ctx_data,
   1453             &server2_ctx_data, &client_ctx_data)) {
   1454         TEST_note("configure_handshake_ctx");
   1455         HANDSHAKE_RESULT_free(ret);
   1456         return NULL;
   1457     }
   1458 
   1459 #if !defined(OPENSSL_NO_SCTP) && !defined(OPENSSL_NO_SOCK)
   1460     if (test_ctx->enable_client_sctp_label_bug)
   1461         SSL_CTX_set_mode(client_ctx, SSL_MODE_DTLS_SCTP_LABEL_LENGTH_BUG);
   1462     if (test_ctx->enable_server_sctp_label_bug)
   1463         SSL_CTX_set_mode(server_ctx, SSL_MODE_DTLS_SCTP_LABEL_LENGTH_BUG);
   1464 #endif
   1465 
   1466     /* Setup SSL and buffers; additional configuration happens below. */
   1467     if (!create_peer(&server, server_ctx)) {
   1468         TEST_note("creating server context");
   1469         goto err;
   1470     }
   1471     if (!create_peer(&client, client_ctx)) {
   1472         TEST_note("creating client context");
   1473         goto err;
   1474     }
   1475 
   1476     server.bytes_to_write = client.bytes_to_read = test_ctx->app_data_size;
   1477     client.bytes_to_write = server.bytes_to_read = test_ctx->app_data_size;
   1478 
   1479     configure_handshake_ssl(server.ssl, client.ssl, extra);
   1480     if (session_in != NULL) {
   1481         SSL_SESSION_get_id(serv_sess_in, &sess_id_len);
   1482         /* In case we're testing resumption without tickets. */
   1483         if ((sess_id_len > 0
   1484                 && !TEST_true(SSL_CTX_add_session(server_ctx,
   1485                     serv_sess_in)))
   1486             || !TEST_true(SSL_set_session(client.ssl, session_in)))
   1487             goto err;
   1488         sess_id_len = 0;
   1489     }
   1490 
   1491     ret->result = SSL_TEST_INTERNAL_ERROR;
   1492 
   1493     if (test_ctx->use_sctp) {
   1494 #if !defined(OPENSSL_NO_SCTP) && !defined(OPENSSL_NO_SOCK)
   1495         int csock, ssock;
   1496 
   1497         if (create_sctp_socks(&ssock, &csock)) {
   1498             client_to_server = BIO_new_dgram_sctp(csock, BIO_CLOSE);
   1499             server_to_client = BIO_new_dgram_sctp(ssock, BIO_CLOSE);
   1500         }
   1501 #endif
   1502     } else {
   1503         client_to_server = BIO_new(BIO_s_mem());
   1504         server_to_client = BIO_new(BIO_s_mem());
   1505     }
   1506 
   1507     if (!TEST_ptr(client_to_server)
   1508         || !TEST_ptr(server_to_client))
   1509         goto err;
   1510 
   1511     /* Non-blocking bio. */
   1512     BIO_set_nbio(client_to_server, 1);
   1513     BIO_set_nbio(server_to_client, 1);
   1514 
   1515     SSL_set_connect_state(client.ssl);
   1516     SSL_set_accept_state(server.ssl);
   1517 
   1518     /* The bios are now owned by the SSL object. */
   1519     if (test_ctx->use_sctp) {
   1520         SSL_set_bio(client.ssl, client_to_server, client_to_server);
   1521         SSL_set_bio(server.ssl, server_to_client, server_to_client);
   1522     } else {
   1523         SSL_set_bio(client.ssl, server_to_client, client_to_server);
   1524         if (!TEST_int_gt(BIO_up_ref(server_to_client), 0)
   1525             || !TEST_int_gt(BIO_up_ref(client_to_server), 0))
   1526             goto err;
   1527         SSL_set_bio(server.ssl, client_to_server, server_to_client);
   1528     }
   1529 
   1530     ex_data_idx = SSL_get_ex_new_index(0, "ex data", NULL, NULL, NULL);
   1531     if (!TEST_int_ge(ex_data_idx, 0)
   1532         || !TEST_int_eq(SSL_set_ex_data(server.ssl, ex_data_idx, &server_ex_data), 1)
   1533         || !TEST_int_eq(SSL_set_ex_data(client.ssl, ex_data_idx, &client_ex_data), 1))
   1534         goto err;
   1535 
   1536     SSL_set_info_callback(server.ssl, &info_cb);
   1537     SSL_set_info_callback(client.ssl, &info_cb);
   1538 
   1539     client.status = PEER_RETRY;
   1540     server.status = PEER_WAITING;
   1541 
   1542     start = time(NULL);
   1543 
   1544     /*
   1545      * Half-duplex handshake loop.
   1546      * Client and server speak to each other synchronously in the same process.
   1547      * We use non-blocking BIOs, so whenever one peer blocks for read, it
   1548      * returns PEER_RETRY to indicate that it's the other peer's turn to write.
   1549      * The handshake succeeds once both peers have succeeded. If one peer
   1550      * errors out, we also let the other peer retry (and presumably fail).
   1551      */
   1552     for (;;) {
   1553         if (client_turn) {
   1554             do_connect_step(test_ctx, &client, phase);
   1555             status = handshake_status(client.status, server.status,
   1556                 1 /* client went last */);
   1557             if (server.status == PEER_WAITING)
   1558                 server.status = PEER_RETRY;
   1559         } else {
   1560             do_connect_step(test_ctx, &server, phase);
   1561             status = handshake_status(server.status, client.status,
   1562                 0 /* server went last */);
   1563         }
   1564 
   1565         switch (status) {
   1566         case HANDSHAKE_SUCCESS:
   1567             client_turn_count = 0;
   1568             phase = next_phase(test_ctx, phase);
   1569             if (phase == CONNECTION_DONE) {
   1570                 ret->result = SSL_TEST_SUCCESS;
   1571                 goto err;
   1572             } else {
   1573                 client.status = server.status = PEER_RETRY;
   1574                 /*
   1575                  * For now, client starts each phase. Since each phase is
   1576                  * started separately, we can later control this more
   1577                  * precisely, for example, to test client-initiated and
   1578                  * server-initiated shutdown.
   1579                  */
   1580                 client_turn = 1;
   1581                 break;
   1582             }
   1583         case CLIENT_ERROR:
   1584             ret->result = SSL_TEST_CLIENT_FAIL;
   1585             goto err;
   1586         case SERVER_ERROR:
   1587             ret->result = SSL_TEST_SERVER_FAIL;
   1588             goto err;
   1589         case INTERNAL_ERROR:
   1590             ret->result = SSL_TEST_INTERNAL_ERROR;
   1591             goto err;
   1592         case HANDSHAKE_RETRY:
   1593             if (test_ctx->use_sctp) {
   1594                 if (time(NULL) - start > 3) {
   1595                     /*
   1596                      * We've waited for too long. Give up.
   1597                      */
   1598                     ret->result = SSL_TEST_INTERNAL_ERROR;
   1599                     goto err;
   1600                 }
   1601                 /*
   1602                  * With "real" sockets we only swap to processing the peer
   1603                  * if they are expecting to retry. Otherwise we just retry the
   1604                  * same endpoint again.
   1605                  */
   1606                 if ((client_turn && server.status == PEER_RETRY)
   1607                     || (!client_turn && client.status == PEER_RETRY))
   1608                     client_turn ^= 1;
   1609             } else {
   1610                 if (client_turn_count++ >= 2000) {
   1611                     /*
   1612                      * At this point, there's been so many PEER_RETRY in a row
   1613                      * that it's likely both sides are stuck waiting for a read.
   1614                      * It's time to give up.
   1615                      */
   1616                     ret->result = SSL_TEST_INTERNAL_ERROR;
   1617                     goto err;
   1618                 }
   1619                 if (client_turn && server.status == PEER_SUCCESS) {
   1620                     /*
   1621                      * The server may finish before the client because the
   1622                      * client spends some turns processing NewSessionTickets.
   1623                      */
   1624                     if (client_wait_count++ >= 2) {
   1625                         ret->result = SSL_TEST_INTERNAL_ERROR;
   1626                         goto err;
   1627                     }
   1628                 } else {
   1629                     /* Continue. */
   1630                     client_turn ^= 1;
   1631                 }
   1632             }
   1633             break;
   1634         }
   1635     }
   1636 err:
   1637     ret->server_alert_sent = server_ex_data.alert_sent;
   1638     ret->server_num_fatal_alerts_sent = server_ex_data.num_fatal_alerts_sent;
   1639     ret->server_alert_received = client_ex_data.alert_received;
   1640     ret->client_alert_sent = client_ex_data.alert_sent;
   1641     ret->client_num_fatal_alerts_sent = client_ex_data.num_fatal_alerts_sent;
   1642     ret->client_alert_received = server_ex_data.alert_received;
   1643     ret->server_protocol = SSL_version(server.ssl);
   1644     ret->client_protocol = SSL_version(client.ssl);
   1645     ret->servername = server_ex_data.servername;
   1646     if ((sess = SSL_get0_session(client.ssl)) != NULL) {
   1647         SSL_SESSION_get0_ticket(sess, &tick, &tick_len);
   1648         sess_id = SSL_SESSION_get_id(sess, &sess_id_len);
   1649     }
   1650     if (tick == NULL || tick_len == 0)
   1651         ret->session_ticket = SSL_TEST_SESSION_TICKET_NO;
   1652     else
   1653         ret->session_ticket = SSL_TEST_SESSION_TICKET_YES;
   1654     ret->compression = (SSL_get_current_compression(client.ssl) == NULL)
   1655         ? SSL_TEST_COMPRESSION_NO
   1656         : SSL_TEST_COMPRESSION_YES;
   1657     if (sess_id == NULL || sess_id_len == 0)
   1658         ret->session_id = SSL_TEST_SESSION_ID_NO;
   1659     else
   1660         ret->session_id = SSL_TEST_SESSION_ID_YES;
   1661     ret->session_ticket_do_not_call = server_ex_data.session_ticket_do_not_call;
   1662 
   1663     if (extra->client.verify_callback == SSL_TEST_VERIFY_RETRY_ONCE
   1664         && n_retries != -1)
   1665         ret->result = SSL_TEST_SERVER_FAIL;
   1666 
   1667 #ifndef OPENSSL_NO_NEXTPROTONEG
   1668     SSL_get0_next_proto_negotiated(client.ssl, &proto, &proto_len);
   1669     ret->client_npn_negotiated = dup_str(proto, proto_len);
   1670 
   1671     SSL_get0_next_proto_negotiated(server.ssl, &proto, &proto_len);
   1672     ret->server_npn_negotiated = dup_str(proto, proto_len);
   1673 #endif
   1674 
   1675     SSL_get0_alpn_selected(client.ssl, &proto, &proto_len);
   1676     ret->client_alpn_negotiated = dup_str(proto, proto_len);
   1677 
   1678     SSL_get0_alpn_selected(server.ssl, &proto, &proto_len);
   1679     ret->server_alpn_negotiated = dup_str(proto, proto_len);
   1680 
   1681     if ((sess = SSL_get0_session(server.ssl)) != NULL) {
   1682         SSL_SESSION_get0_ticket_appdata(sess, (void **)&tick, &tick_len);
   1683         ret->result_session_ticket_app_data = OPENSSL_strndup((const char *)tick, tick_len);
   1684     }
   1685 
   1686     ret->client_resumed = SSL_session_reused(client.ssl);
   1687     ret->server_resumed = SSL_session_reused(server.ssl);
   1688 
   1689     cipher = SSL_CIPHER_get_name(SSL_get_current_cipher(client.ssl));
   1690     ret->cipher = dup_str((const unsigned char *)cipher, strlen(cipher));
   1691 
   1692     if (session_out != NULL)
   1693         *session_out = SSL_get1_session(client.ssl);
   1694     if (serv_sess_out != NULL) {
   1695         SSL_SESSION *tmp = SSL_get_session(server.ssl);
   1696 
   1697         /*
   1698          * We create a fresh copy that is not in the server session ctx linked
   1699          * list.
   1700          */
   1701         if (tmp != NULL)
   1702             *serv_sess_out = SSL_SESSION_dup(tmp);
   1703     }
   1704 
   1705     if (SSL_get_peer_tmp_key(client.ssl, &tmp_key)) {
   1706         ret->tmp_key_type = pkey_type(tmp_key);
   1707         EVP_PKEY_free(tmp_key);
   1708     }
   1709 
   1710     SSL_get_peer_signature_nid(client.ssl, &ret->server_sign_hash);
   1711     SSL_get_peer_signature_nid(server.ssl, &ret->client_sign_hash);
   1712 
   1713     SSL_get_peer_signature_type_nid(client.ssl, &ret->server_sign_type);
   1714     SSL_get_peer_signature_type_nid(server.ssl, &ret->client_sign_type);
   1715 
   1716     names = SSL_get0_peer_CA_list(client.ssl);
   1717     if (names == NULL)
   1718         ret->client_ca_names = NULL;
   1719     else
   1720         ret->client_ca_names = SSL_dup_CA_list(names);
   1721 
   1722     names = SSL_get0_peer_CA_list(server.ssl);
   1723     if (names == NULL)
   1724         ret->server_ca_names = NULL;
   1725     else
   1726         ret->server_ca_names = SSL_dup_CA_list(names);
   1727 
   1728     ret->server_cert_type = peer_pkey_type(client.ssl);
   1729     ret->client_cert_type = peer_pkey_type(server.ssl);
   1730 
   1731     ctx_data_free_data(&server_ctx_data);
   1732     ctx_data_free_data(&server2_ctx_data);
   1733     ctx_data_free_data(&client_ctx_data);
   1734 
   1735     peer_free_data(&server);
   1736     peer_free_data(&client);
   1737     return ret;
   1738 }
   1739 
   1740 HANDSHAKE_RESULT *do_handshake(SSL_CTX *server_ctx, SSL_CTX *server2_ctx,
   1741     SSL_CTX *client_ctx, SSL_CTX *resume_server_ctx,
   1742     SSL_CTX *resume_client_ctx,
   1743     const SSL_TEST_CTX *test_ctx)
   1744 {
   1745     HANDSHAKE_RESULT *result;
   1746     SSL_SESSION *session = NULL, *serv_sess = NULL;
   1747 
   1748     result = do_handshake_internal(server_ctx, server2_ctx, client_ctx,
   1749         test_ctx, &test_ctx->extra,
   1750         NULL, NULL, &session, &serv_sess);
   1751     if (result == NULL
   1752         || test_ctx->handshake_mode != SSL_TEST_HANDSHAKE_RESUME
   1753         || result->result == SSL_TEST_INTERNAL_ERROR)
   1754         goto end;
   1755 
   1756     if (result->result != SSL_TEST_SUCCESS) {
   1757         result->result = SSL_TEST_FIRST_HANDSHAKE_FAILED;
   1758         goto end;
   1759     }
   1760 
   1761     HANDSHAKE_RESULT_free(result);
   1762     /* We don't support SNI on second handshake yet, so server2_ctx is NULL. */
   1763     result = do_handshake_internal(resume_server_ctx, NULL, resume_client_ctx,
   1764         test_ctx, &test_ctx->resume_extra,
   1765         session, serv_sess, NULL, NULL);
   1766 end:
   1767     SSL_SESSION_free(session);
   1768     SSL_SESSION_free(serv_sess);
   1769     return result;
   1770 }
   1771