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