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