Coverage Report

Created: 2022-11-30 06:20

/src/openssl/ssl/d1_clnt.c
Line
Count
Source (jump to first uncovered line)
1
/* ssl/d1_clnt.c */
2
/*
3
 * DTLS implementation written by Nagendra Modadugu
4
 * (nagendra@cs.stanford.edu) for the OpenSSL project 2005.
5
 */
6
/* ====================================================================
7
 * Copyright (c) 1999-2007 The OpenSSL Project.  All rights reserved.
8
 *
9
 * Redistribution and use in source and binary forms, with or without
10
 * modification, are permitted provided that the following conditions
11
 * are met:
12
 *
13
 * 1. Redistributions of source code must retain the above copyright
14
 *    notice, this list of conditions and the following disclaimer.
15
 *
16
 * 2. Redistributions in binary form must reproduce the above copyright
17
 *    notice, this list of conditions and the following disclaimer in
18
 *    the documentation and/or other materials provided with the
19
 *    distribution.
20
 *
21
 * 3. All advertising materials mentioning features or use of this
22
 *    software must display the following acknowledgment:
23
 *    "This product includes software developed by the OpenSSL Project
24
 *    for use in the OpenSSL Toolkit. (http://www.OpenSSL.org/)"
25
 *
26
 * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to
27
 *    endorse or promote products derived from this software without
28
 *    prior written permission. For written permission, please contact
29
 *    openssl-core@OpenSSL.org.
30
 *
31
 * 5. Products derived from this software may not be called "OpenSSL"
32
 *    nor may "OpenSSL" appear in their names without prior written
33
 *    permission of the OpenSSL Project.
34
 *
35
 * 6. Redistributions of any form whatsoever must retain the following
36
 *    acknowledgment:
37
 *    "This product includes software developed by the OpenSSL Project
38
 *    for use in the OpenSSL Toolkit (http://www.OpenSSL.org/)"
39
 *
40
 * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY
41
 * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
42
 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
43
 * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE OpenSSL PROJECT OR
44
 * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
45
 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
46
 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
47
 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
48
 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
49
 * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
50
 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
51
 * OF THE POSSIBILITY OF SUCH DAMAGE.
52
 * ====================================================================
53
 *
54
 * This product includes cryptographic software written by Eric Young
55
 * (eay@cryptsoft.com).  This product includes software written by Tim
56
 * Hudson (tjh@cryptsoft.com).
57
 *
58
 */
59
/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
60
 * All rights reserved.
61
 *
62
 * This package is an SSL implementation written
63
 * by Eric Young (eay@cryptsoft.com).
64
 * The implementation was written so as to conform with Netscapes SSL.
65
 *
66
 * This library is free for commercial and non-commercial use as long as
67
 * the following conditions are aheared to.  The following conditions
68
 * apply to all code found in this distribution, be it the RC4, RSA,
69
 * lhash, DES, etc., code; not just the SSL code.  The SSL documentation
70
 * included with this distribution is covered by the same copyright terms
71
 * except that the holder is Tim Hudson (tjh@cryptsoft.com).
72
 *
73
 * Copyright remains Eric Young's, and as such any Copyright notices in
74
 * the code are not to be removed.
75
 * If this package is used in a product, Eric Young should be given attribution
76
 * as the author of the parts of the library used.
77
 * This can be in the form of a textual message at program startup or
78
 * in documentation (online or textual) provided with the package.
79
 *
80
 * Redistribution and use in source and binary forms, with or without
81
 * modification, are permitted provided that the following conditions
82
 * are met:
83
 * 1. Redistributions of source code must retain the copyright
84
 *    notice, this list of conditions and the following disclaimer.
85
 * 2. Redistributions in binary form must reproduce the above copyright
86
 *    notice, this list of conditions and the following disclaimer in the
87
 *    documentation and/or other materials provided with the distribution.
88
 * 3. All advertising materials mentioning features or use of this software
89
 *    must display the following acknowledgement:
90
 *    "This product includes cryptographic software written by
91
 *     Eric Young (eay@cryptsoft.com)"
92
 *    The word 'cryptographic' can be left out if the rouines from the library
93
 *    being used are not cryptographic related :-).
94
 * 4. If you include any Windows specific code (or a derivative thereof) from
95
 *    the apps directory (application code) you must include an acknowledgement:
96
 *    "This product includes software written by Tim Hudson (tjh@cryptsoft.com)"
97
 *
98
 * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND
99
 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
100
 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
101
 * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
102
 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
103
 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
104
 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
105
 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
106
 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
107
 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
108
 * SUCH DAMAGE.
109
 *
110
 * The licence and distribution terms for any publically available version or
111
 * derivative of this code cannot be changed.  i.e. this code cannot simply be
112
 * copied and put under another distribution licence
113
 * [including the GNU Public Licence.]
114
 */
115
116
#include <stdio.h>
117
#include "ssl_locl.h"
118
#ifndef OPENSSL_NO_KRB5
119
# include "kssl_lcl.h"
120
#endif
121
#include <openssl/buffer.h>
122
#include <openssl/rand.h>
123
#include <openssl/objects.h>
124
#include <openssl/evp.h>
125
#include <openssl/md5.h>
126
#include <openssl/bn.h>
127
#ifndef OPENSSL_NO_DH
128
# include <openssl/dh.h>
129
#endif
130
131
static const SSL_METHOD *dtls1_get_client_method(int ver);
132
static int dtls1_get_hello_verify(SSL *s);
133
134
static const SSL_METHOD *dtls1_get_client_method(int ver)
135
0
{
136
0
    if (ver == DTLS_ANY_VERSION)
137
0
        return DTLS_client_method();
138
0
    else if (ver == DTLS1_VERSION || ver == DTLS1_BAD_VER)
139
0
        return DTLSv1_client_method();
140
0
    else if (ver == DTLS1_2_VERSION)
141
0
        return DTLSv1_2_client_method();
142
0
    else
143
0
        return NULL;
144
0
}
145
146
IMPLEMENT_dtls1_meth_func(DTLS1_VERSION,
147
                          DTLSv1_client_method,
148
                          ssl_undefined_function,
149
                          dtls1_connect,
150
                          dtls1_get_client_method, DTLSv1_enc_data)
151
152
IMPLEMENT_dtls1_meth_func(DTLS1_2_VERSION,
153
                          DTLSv1_2_client_method,
154
                          ssl_undefined_function,
155
                          dtls1_connect,
156
                          dtls1_get_client_method, DTLSv1_2_enc_data)
157
158
IMPLEMENT_dtls1_meth_func(DTLS_ANY_VERSION,
159
                          DTLS_client_method,
160
                          ssl_undefined_function,
161
                          dtls1_connect,
162
                          dtls1_get_client_method, DTLSv1_2_enc_data)
163
164
int dtls1_connect(SSL *s)
165
0
{
166
0
    BUF_MEM *buf = NULL;
167
0
    unsigned long Time = (unsigned long)time(NULL);
168
0
    void (*cb) (const SSL *ssl, int type, int val) = NULL;
169
0
    int ret = -1;
170
0
    int new_state, state, skip = 0;
171
#ifndef OPENSSL_NO_SCTP
172
    unsigned char sctpauthkey[64];
173
    char labelbuffer[sizeof(DTLS1_SCTP_AUTH_LABEL)];
174
#endif
175
176
0
    RAND_add(&Time, sizeof(Time), 0);
177
0
    ERR_clear_error();
178
0
    clear_sys_error();
179
180
0
    if (s->info_callback != NULL)
181
0
        cb = s->info_callback;
182
0
    else if (s->ctx->info_callback != NULL)
183
0
        cb = s->ctx->info_callback;
184
185
0
    s->in_handshake++;
186
0
    if (!SSL_in_init(s) || SSL_in_before(s))
187
0
        SSL_clear(s);
188
189
#ifndef OPENSSL_NO_SCTP
190
    /*
191
     * Notify SCTP BIO socket to enter handshake mode and prevent stream
192
     * identifier other than 0. Will be ignored if no SCTP is used.
193
     */
194
    BIO_ctrl(SSL_get_wbio(s), BIO_CTRL_DGRAM_SCTP_SET_IN_HANDSHAKE,
195
             s->in_handshake, NULL);
196
#endif
197
198
0
#ifndef OPENSSL_NO_HEARTBEATS
199
    /*
200
     * If we're awaiting a HeartbeatResponse, pretend we already got and
201
     * don't await it anymore, because Heartbeats don't make sense during
202
     * handshakes anyway.
203
     */
204
0
    if (s->tlsext_hb_pending) {
205
0
        dtls1_stop_timer(s);
206
0
        s->tlsext_hb_pending = 0;
207
0
        s->tlsext_hb_seq++;
208
0
    }
209
0
#endif
210
211
0
    for (;;) {
212
0
        state = s->state;
213
214
0
        switch (s->state) {
215
0
        case SSL_ST_RENEGOTIATE:
216
0
            s->renegotiate = 1;
217
0
            s->state = SSL_ST_CONNECT;
218
0
            s->ctx->stats.sess_connect_renegotiate++;
219
            /* break */
220
0
        case SSL_ST_BEFORE:
221
0
        case SSL_ST_CONNECT:
222
0
        case SSL_ST_BEFORE | SSL_ST_CONNECT:
223
0
        case SSL_ST_OK | SSL_ST_CONNECT:
224
225
0
            s->server = 0;
226
0
            if (cb != NULL)
227
0
                cb(s, SSL_CB_HANDSHAKE_START, 1);
228
229
0
            if ((s->version & 0xff00) != (DTLS1_VERSION & 0xff00) &&
230
0
                (s->version & 0xff00) != (DTLS1_BAD_VER & 0xff00)) {
231
0
                SSLerr(SSL_F_DTLS1_CONNECT, ERR_R_INTERNAL_ERROR);
232
0
                ret = -1;
233
0
                s->state = SSL_ST_ERR;
234
0
                goto end;
235
0
            }
236
237
            /* s->version=SSL3_VERSION; */
238
0
            s->type = SSL_ST_CONNECT;
239
240
0
            if (s->init_buf == NULL) {
241
0
                if ((buf = BUF_MEM_new()) == NULL) {
242
0
                    ret = -1;
243
0
                    s->state = SSL_ST_ERR;
244
0
                    goto end;
245
0
                }
246
0
                if (!BUF_MEM_grow(buf, SSL3_RT_MAX_PLAIN_LENGTH)) {
247
0
                    ret = -1;
248
0
                    s->state = SSL_ST_ERR;
249
0
                    goto end;
250
0
                }
251
0
                s->init_buf = buf;
252
0
                buf = NULL;
253
0
            }
254
255
0
            if (!ssl3_setup_buffers(s)) {
256
0
                ret = -1;
257
0
                s->state = SSL_ST_ERR;
258
0
                goto end;
259
0
            }
260
261
            /* setup buffing BIO */
262
0
            if (!ssl_init_wbio_buffer(s, 0)) {
263
0
                ret = -1;
264
0
                s->state = SSL_ST_ERR;
265
0
                goto end;
266
0
            }
267
268
            /* don't push the buffering BIO quite yet */
269
270
0
            s->state = SSL3_ST_CW_CLNT_HELLO_A;
271
0
            s->ctx->stats.sess_connect++;
272
0
            s->init_num = 0;
273
            /* mark client_random uninitialized */
274
0
            memset(s->s3->client_random, 0, sizeof(s->s3->client_random));
275
0
            s->d1->send_cookie = 0;
276
0
            s->hit = 0;
277
0
            s->d1->change_cipher_spec_ok = 0;
278
            /*
279
             * Should have been reset by ssl3_get_finished, too.
280
             */
281
0
            s->s3->change_cipher_spec = 0;
282
0
            break;
283
284
#ifndef OPENSSL_NO_SCTP
285
        case DTLS1_SCTP_ST_CR_READ_SOCK:
286
287
            if (BIO_dgram_sctp_msg_waiting(SSL_get_rbio(s))) {
288
                s->s3->in_read_app_data = 2;
289
                s->rwstate = SSL_READING;
290
                BIO_clear_retry_flags(SSL_get_rbio(s));
291
                BIO_set_retry_read(SSL_get_rbio(s));
292
                ret = -1;
293
                goto end;
294
            }
295
296
            s->state = s->s3->tmp.next_state;
297
            break;
298
299
        case DTLS1_SCTP_ST_CW_WRITE_SOCK:
300
            /* read app data until dry event */
301
302
            ret = BIO_dgram_sctp_wait_for_dry(SSL_get_wbio(s));
303
            if (ret < 0)
304
                goto end;
305
306
            if (ret == 0) {
307
                s->s3->in_read_app_data = 2;
308
                s->rwstate = SSL_READING;
309
                BIO_clear_retry_flags(SSL_get_rbio(s));
310
                BIO_set_retry_read(SSL_get_rbio(s));
311
                ret = -1;
312
                goto end;
313
            }
314
315
            s->state = s->d1->next_state;
316
            break;
317
#endif
318
319
0
        case SSL3_ST_CW_CLNT_HELLO_A:
320
0
            s->shutdown = 0;
321
322
            /* every DTLS ClientHello resets Finished MAC */
323
0
            if (!ssl3_init_finished_mac(s)) {
324
0
                ret = -1;
325
0
                s->state = SSL_ST_ERR;
326
0
                goto end;
327
0
            }
328
329
            /* fall thru */
330
0
        case SSL3_ST_CW_CLNT_HELLO_B:
331
0
            dtls1_start_timer(s);
332
0
            ret = ssl3_client_hello(s);
333
0
            if (ret <= 0)
334
0
                goto end;
335
336
0
            if (s->d1->send_cookie) {
337
0
                s->state = SSL3_ST_CW_FLUSH;
338
0
                s->s3->tmp.next_state = SSL3_ST_CR_SRVR_HELLO_A;
339
0
            } else
340
0
                s->state = SSL3_ST_CR_SRVR_HELLO_A;
341
342
0
            s->init_num = 0;
343
344
#ifndef OPENSSL_NO_SCTP
345
            /* Disable buffering for SCTP */
346
            if (!BIO_dgram_is_sctp(SSL_get_wbio(s))) {
347
#endif
348
                /*
349
                 * turn on buffering for the next lot of output
350
                 */
351
0
                if (s->bbio != s->wbio)
352
0
                    s->wbio = BIO_push(s->bbio, s->wbio);
353
#ifndef OPENSSL_NO_SCTP
354
            }
355
#endif
356
357
0
            break;
358
359
0
        case SSL3_ST_CR_SRVR_HELLO_A:
360
0
        case SSL3_ST_CR_SRVR_HELLO_B:
361
0
            ret = ssl3_get_server_hello(s);
362
0
            if (ret <= 0)
363
0
                goto end;
364
0
            else {
365
0
                if (s->hit) {
366
#ifndef OPENSSL_NO_SCTP
367
                    /*
368
                     * Add new shared key for SCTP-Auth, will be ignored if
369
                     * no SCTP used.
370
                     */
371
                    snprintf((char *)labelbuffer,
372
                             sizeof(DTLS1_SCTP_AUTH_LABEL),
373
                             DTLS1_SCTP_AUTH_LABEL);
374
375
                    if (SSL_export_keying_material(s, sctpauthkey,
376
                                               sizeof(sctpauthkey),
377
                                               labelbuffer,
378
                                               sizeof(labelbuffer), NULL, 0,
379
                                               0) <= 0) {
380
                        ret = -1;
381
                        s->state = SSL_ST_ERR;
382
                        goto end;
383
                    }
384
385
                    BIO_ctrl(SSL_get_wbio(s),
386
                             BIO_CTRL_DGRAM_SCTP_ADD_AUTH_KEY,
387
                             sizeof(sctpauthkey), sctpauthkey);
388
#endif
389
390
0
                    s->state = SSL3_ST_CR_FINISHED_A;
391
0
                    if (s->tlsext_ticket_expected) {
392
                        /* receive renewed session ticket */
393
0
                        s->state = SSL3_ST_CR_SESSION_TICKET_A;
394
0
                    }
395
0
                } else
396
0
                    s->state = DTLS1_ST_CR_HELLO_VERIFY_REQUEST_A;
397
0
            }
398
0
            s->init_num = 0;
399
0
            break;
400
401
0
        case DTLS1_ST_CR_HELLO_VERIFY_REQUEST_A:
402
0
        case DTLS1_ST_CR_HELLO_VERIFY_REQUEST_B:
403
404
0
            ret = dtls1_get_hello_verify(s);
405
0
            if (ret <= 0)
406
0
                goto end;
407
0
            dtls1_stop_timer(s);
408
0
            if (s->d1->send_cookie) /* start again, with a cookie */
409
0
                s->state = SSL3_ST_CW_CLNT_HELLO_A;
410
0
            else
411
0
                s->state = SSL3_ST_CR_CERT_A;
412
0
            s->init_num = 0;
413
0
            break;
414
415
0
        case SSL3_ST_CR_CERT_A:
416
0
        case SSL3_ST_CR_CERT_B:
417
            /* Check if it is anon DH or PSK */
418
0
            if (!(s->s3->tmp.new_cipher->algorithm_auth & SSL_aNULL) &&
419
0
                !(s->s3->tmp.new_cipher->algorithm_mkey & SSL_kPSK)) {
420
0
                ret = ssl3_get_server_certificate(s);
421
0
                if (ret <= 0)
422
0
                    goto end;
423
0
#ifndef OPENSSL_NO_TLSEXT
424
0
                if (s->tlsext_status_expected)
425
0
                    s->state = SSL3_ST_CR_CERT_STATUS_A;
426
0
                else
427
0
                    s->state = SSL3_ST_CR_KEY_EXCH_A;
428
0
            } else {
429
0
                skip = 1;
430
0
                s->state = SSL3_ST_CR_KEY_EXCH_A;
431
0
            }
432
#else
433
            } else
434
                skip = 1;
435
436
            s->state = SSL3_ST_CR_KEY_EXCH_A;
437
#endif
438
0
            s->init_num = 0;
439
0
            break;
440
441
0
        case SSL3_ST_CR_KEY_EXCH_A:
442
0
        case SSL3_ST_CR_KEY_EXCH_B:
443
0
            ret = ssl3_get_key_exchange(s);
444
0
            if (ret <= 0)
445
0
                goto end;
446
0
            s->state = SSL3_ST_CR_CERT_REQ_A;
447
0
            s->init_num = 0;
448
449
            /*
450
             * at this point we check that we have the required stuff from
451
             * the server
452
             */
453
0
            if (!ssl3_check_cert_and_algorithm(s)) {
454
0
                ret = -1;
455
0
                s->state = SSL_ST_ERR;
456
0
                goto end;
457
0
            }
458
0
            break;
459
460
0
        case SSL3_ST_CR_CERT_REQ_A:
461
0
        case SSL3_ST_CR_CERT_REQ_B:
462
0
            ret = ssl3_get_certificate_request(s);
463
0
            if (ret <= 0)
464
0
                goto end;
465
0
            s->state = SSL3_ST_CR_SRVR_DONE_A;
466
0
            s->init_num = 0;
467
0
            break;
468
469
0
        case SSL3_ST_CR_SRVR_DONE_A:
470
0
        case SSL3_ST_CR_SRVR_DONE_B:
471
0
            ret = ssl3_get_server_done(s);
472
0
            if (ret <= 0)
473
0
                goto end;
474
0
            dtls1_stop_timer(s);
475
0
            if (s->s3->tmp.cert_req)
476
0
                s->s3->tmp.next_state = SSL3_ST_CW_CERT_A;
477
0
            else
478
0
                s->s3->tmp.next_state = SSL3_ST_CW_KEY_EXCH_A;
479
0
            s->init_num = 0;
480
481
#ifndef OPENSSL_NO_SCTP
482
            if (BIO_dgram_is_sctp(SSL_get_wbio(s)) &&
483
                state == SSL_ST_RENEGOTIATE)
484
                s->state = DTLS1_SCTP_ST_CR_READ_SOCK;
485
            else
486
#endif
487
0
                s->state = s->s3->tmp.next_state;
488
0
            break;
489
490
0
        case SSL3_ST_CW_CERT_A:
491
0
        case SSL3_ST_CW_CERT_B:
492
0
        case SSL3_ST_CW_CERT_C:
493
0
        case SSL3_ST_CW_CERT_D:
494
0
            dtls1_start_timer(s);
495
0
            ret = ssl3_send_client_certificate(s);
496
0
            if (ret <= 0)
497
0
                goto end;
498
0
            s->state = SSL3_ST_CW_KEY_EXCH_A;
499
0
            s->init_num = 0;
500
0
            break;
501
502
0
        case SSL3_ST_CW_KEY_EXCH_A:
503
0
        case SSL3_ST_CW_KEY_EXCH_B:
504
0
            dtls1_start_timer(s);
505
0
            ret = ssl3_send_client_key_exchange(s);
506
0
            if (ret <= 0)
507
0
                goto end;
508
509
#ifndef OPENSSL_NO_SCTP
510
            /*
511
             * Add new shared key for SCTP-Auth, will be ignored if no SCTP
512
             * used.
513
             */
514
            snprintf((char *)labelbuffer, sizeof(DTLS1_SCTP_AUTH_LABEL),
515
                     DTLS1_SCTP_AUTH_LABEL);
516
517
            if (SSL_export_keying_material(s, sctpauthkey,
518
                                       sizeof(sctpauthkey), labelbuffer,
519
                                       sizeof(labelbuffer), NULL, 0, 0) <= 0) {
520
                ret = -1;
521
                s->state = SSL_ST_ERR;
522
                goto end;
523
            }
524
525
            BIO_ctrl(SSL_get_wbio(s), BIO_CTRL_DGRAM_SCTP_ADD_AUTH_KEY,
526
                     sizeof(sctpauthkey), sctpauthkey);
527
#endif
528
529
            /*
530
             * EAY EAY EAY need to check for DH fix cert sent back
531
             */
532
            /*
533
             * For TLS, cert_req is set to 2, so a cert chain of nothing is
534
             * sent, but no verify packet is sent
535
             */
536
0
            if (s->s3->tmp.cert_req == 1) {
537
0
                s->state = SSL3_ST_CW_CERT_VRFY_A;
538
0
            } else {
539
#ifndef OPENSSL_NO_SCTP
540
                if (BIO_dgram_is_sctp(SSL_get_wbio(s))) {
541
                    s->d1->next_state = SSL3_ST_CW_CHANGE_A;
542
                    s->state = DTLS1_SCTP_ST_CW_WRITE_SOCK;
543
                } else
544
#endif
545
0
                    s->state = SSL3_ST_CW_CHANGE_A;
546
0
            }
547
548
0
            s->init_num = 0;
549
0
            break;
550
551
0
        case SSL3_ST_CW_CERT_VRFY_A:
552
0
        case SSL3_ST_CW_CERT_VRFY_B:
553
0
            dtls1_start_timer(s);
554
0
            ret = ssl3_send_client_verify(s);
555
0
            if (ret <= 0)
556
0
                goto end;
557
#ifndef OPENSSL_NO_SCTP
558
            if (BIO_dgram_is_sctp(SSL_get_wbio(s))) {
559
                s->d1->next_state = SSL3_ST_CW_CHANGE_A;
560
                s->state = DTLS1_SCTP_ST_CW_WRITE_SOCK;
561
            } else
562
#endif
563
0
                s->state = SSL3_ST_CW_CHANGE_A;
564
0
            s->init_num = 0;
565
0
            break;
566
567
0
        case SSL3_ST_CW_CHANGE_A:
568
0
        case SSL3_ST_CW_CHANGE_B:
569
0
            if (!s->hit)
570
0
                dtls1_start_timer(s);
571
0
            ret = dtls1_send_change_cipher_spec(s,
572
0
                                                SSL3_ST_CW_CHANGE_A,
573
0
                                                SSL3_ST_CW_CHANGE_B);
574
0
            if (ret <= 0)
575
0
                goto end;
576
577
0
            s->state = SSL3_ST_CW_FINISHED_A;
578
0
            s->init_num = 0;
579
580
0
            s->session->cipher = s->s3->tmp.new_cipher;
581
#ifdef OPENSSL_NO_COMP
582
            s->session->compress_meth = 0;
583
#else
584
0
            if (s->s3->tmp.new_compression == NULL)
585
0
                s->session->compress_meth = 0;
586
0
            else
587
0
                s->session->compress_meth = s->s3->tmp.new_compression->id;
588
0
#endif
589
0
            if (!s->method->ssl3_enc->setup_key_block(s)) {
590
0
                ret = -1;
591
0
                s->state = SSL_ST_ERR;
592
0
                goto end;
593
0
            }
594
595
0
            if (!s->method->ssl3_enc->change_cipher_state(s,
596
0
                                                          SSL3_CHANGE_CIPHER_CLIENT_WRITE))
597
0
            {
598
0
                ret = -1;
599
0
                s->state = SSL_ST_ERR;
600
0
                goto end;
601
0
            }
602
#ifndef OPENSSL_NO_SCTP
603
            if (s->hit) {
604
                /*
605
                 * Change to new shared key of SCTP-Auth, will be ignored if
606
                 * no SCTP used.
607
                 */
608
                BIO_ctrl(SSL_get_wbio(s), BIO_CTRL_DGRAM_SCTP_NEXT_AUTH_KEY,
609
                         0, NULL);
610
            }
611
#endif
612
613
0
            dtls1_reset_seq_numbers(s, SSL3_CC_WRITE);
614
0
            break;
615
616
0
        case SSL3_ST_CW_FINISHED_A:
617
0
        case SSL3_ST_CW_FINISHED_B:
618
0
            if (!s->hit)
619
0
                dtls1_start_timer(s);
620
0
            ret = ssl3_send_finished(s,
621
0
                                     SSL3_ST_CW_FINISHED_A,
622
0
                                     SSL3_ST_CW_FINISHED_B,
623
0
                                     s->method->
624
0
                                     ssl3_enc->client_finished_label,
625
0
                                     s->method->
626
0
                                     ssl3_enc->client_finished_label_len);
627
0
            if (ret <= 0)
628
0
                goto end;
629
0
            s->state = SSL3_ST_CW_FLUSH;
630
631
            /* clear flags */
632
0
            s->s3->flags &= ~SSL3_FLAGS_POP_BUFFER;
633
0
            if (s->hit) {
634
0
                s->s3->tmp.next_state = SSL_ST_OK;
635
#ifndef OPENSSL_NO_SCTP
636
                if (BIO_dgram_is_sctp(SSL_get_wbio(s))) {
637
                    s->d1->next_state = s->s3->tmp.next_state;
638
                    s->s3->tmp.next_state = DTLS1_SCTP_ST_CW_WRITE_SOCK;
639
                }
640
#endif
641
0
                if (s->s3->flags & SSL3_FLAGS_DELAY_CLIENT_FINISHED) {
642
0
                    s->state = SSL_ST_OK;
643
#ifndef OPENSSL_NO_SCTP
644
                    if (BIO_dgram_is_sctp(SSL_get_wbio(s))) {
645
                        s->d1->next_state = SSL_ST_OK;
646
                        s->state = DTLS1_SCTP_ST_CW_WRITE_SOCK;
647
                    }
648
#endif
649
0
                    s->s3->flags |= SSL3_FLAGS_POP_BUFFER;
650
0
                    s->s3->delay_buf_pop_ret = 0;
651
0
                }
652
0
            } else {
653
#ifndef OPENSSL_NO_SCTP
654
                /*
655
                 * Change to new shared key of SCTP-Auth, will be ignored if
656
                 * no SCTP used.
657
                 */
658
                BIO_ctrl(SSL_get_wbio(s), BIO_CTRL_DGRAM_SCTP_NEXT_AUTH_KEY,
659
                         0, NULL);
660
#endif
661
662
0
#ifndef OPENSSL_NO_TLSEXT
663
                /*
664
                 * Allow NewSessionTicket if ticket expected
665
                 */
666
0
                if (s->tlsext_ticket_expected)
667
0
                    s->s3->tmp.next_state = SSL3_ST_CR_SESSION_TICKET_A;
668
0
                else
669
0
#endif
670
671
0
                    s->s3->tmp.next_state = SSL3_ST_CR_FINISHED_A;
672
0
            }
673
0
            s->init_num = 0;
674
0
            break;
675
676
0
#ifndef OPENSSL_NO_TLSEXT
677
0
        case SSL3_ST_CR_SESSION_TICKET_A:
678
0
        case SSL3_ST_CR_SESSION_TICKET_B:
679
0
            ret = ssl3_get_new_session_ticket(s);
680
0
            if (ret <= 0)
681
0
                goto end;
682
0
            s->state = SSL3_ST_CR_FINISHED_A;
683
0
            s->init_num = 0;
684
0
            break;
685
686
0
        case SSL3_ST_CR_CERT_STATUS_A:
687
0
        case SSL3_ST_CR_CERT_STATUS_B:
688
0
            ret = ssl3_get_cert_status(s);
689
0
            if (ret <= 0)
690
0
                goto end;
691
0
            s->state = SSL3_ST_CR_KEY_EXCH_A;
692
0
            s->init_num = 0;
693
0
            break;
694
0
#endif
695
696
0
        case SSL3_ST_CR_FINISHED_A:
697
0
        case SSL3_ST_CR_FINISHED_B:
698
0
            s->d1->change_cipher_spec_ok = 1;
699
0
            ret = ssl3_get_finished(s, SSL3_ST_CR_FINISHED_A,
700
0
                                    SSL3_ST_CR_FINISHED_B);
701
0
            if (ret <= 0)
702
0
                goto end;
703
0
            dtls1_stop_timer(s);
704
705
0
            if (s->hit)
706
0
                s->state = SSL3_ST_CW_CHANGE_A;
707
0
            else
708
0
                s->state = SSL_ST_OK;
709
710
#ifndef OPENSSL_NO_SCTP
711
            if (BIO_dgram_is_sctp(SSL_get_wbio(s)) &&
712
                state == SSL_ST_RENEGOTIATE) {
713
                s->d1->next_state = s->state;
714
                s->state = DTLS1_SCTP_ST_CW_WRITE_SOCK;
715
            }
716
#endif
717
718
0
            s->init_num = 0;
719
0
            break;
720
721
0
        case SSL3_ST_CW_FLUSH:
722
0
            s->rwstate = SSL_WRITING;
723
0
            if (BIO_flush(s->wbio) <= 0) {
724
                /*
725
                 * If the write error was fatal, stop trying
726
                 */
727
0
                if (!BIO_should_retry(s->wbio)) {
728
0
                    s->rwstate = SSL_NOTHING;
729
0
                    s->state = s->s3->tmp.next_state;
730
0
                }
731
732
0
                ret = -1;
733
0
                goto end;
734
0
            }
735
0
            s->rwstate = SSL_NOTHING;
736
0
            s->state = s->s3->tmp.next_state;
737
0
            break;
738
739
0
        case SSL_ST_OK:
740
            /* clean a few things up */
741
0
            ssl3_cleanup_key_block(s);
742
743
#if 0
744
            if (s->init_buf != NULL) {
745
                BUF_MEM_free(s->init_buf);
746
                s->init_buf = NULL;
747
            }
748
#endif
749
750
            /*
751
             * If we are not 'joining' the last two packets, remove the
752
             * buffering now
753
             */
754
0
            if (!(s->s3->flags & SSL3_FLAGS_POP_BUFFER))
755
0
                ssl_free_wbio_buffer(s);
756
            /* else do it later in ssl3_write */
757
758
0
            s->init_num = 0;
759
0
            s->renegotiate = 0;
760
0
            s->new_session = 0;
761
762
0
            ssl_update_cache(s, SSL_SESS_CACHE_CLIENT);
763
0
            if (s->hit)
764
0
                s->ctx->stats.sess_hit++;
765
766
0
            ret = 1;
767
            /* s->server=0; */
768
0
            s->handshake_func = dtls1_connect;
769
0
            s->ctx->stats.sess_connect_good++;
770
771
0
            if (cb != NULL)
772
0
                cb(s, SSL_CB_HANDSHAKE_DONE, 1);
773
774
            /* done with handshaking */
775
0
            s->d1->handshake_read_seq = 0;
776
0
            s->d1->next_handshake_write_seq = 0;
777
0
            dtls1_clear_received_buffer(s);
778
0
            goto end;
779
            /* break; */
780
781
0
        case SSL_ST_ERR:
782
0
        default:
783
0
            SSLerr(SSL_F_DTLS1_CONNECT, SSL_R_UNKNOWN_STATE);
784
0
            ret = -1;
785
0
            goto end;
786
            /* break; */
787
0
        }
788
789
        /* did we do anything */
790
0
        if (!s->s3->tmp.reuse_message && !skip) {
791
0
            if (s->debug) {
792
0
                if ((ret = BIO_flush(s->wbio)) <= 0)
793
0
                    goto end;
794
0
            }
795
796
0
            if ((cb != NULL) && (s->state != state)) {
797
0
                new_state = s->state;
798
0
                s->state = state;
799
0
                cb(s, SSL_CB_CONNECT_LOOP, 1);
800
0
                s->state = new_state;
801
0
            }
802
0
        }
803
0
        skip = 0;
804
0
    }
805
0
 end:
806
0
    s->in_handshake--;
807
808
#ifndef OPENSSL_NO_SCTP
809
    /*
810
     * Notify SCTP BIO socket to leave handshake mode and allow stream
811
     * identifier other than 0. Will be ignored if no SCTP is used.
812
     */
813
    BIO_ctrl(SSL_get_wbio(s), BIO_CTRL_DGRAM_SCTP_SET_IN_HANDSHAKE,
814
             s->in_handshake, NULL);
815
#endif
816
817
0
    if (buf != NULL)
818
0
        BUF_MEM_free(buf);
819
0
    if (cb != NULL)
820
0
        cb(s, SSL_CB_CONNECT_EXIT, ret);
821
0
    return (ret);
822
0
}
823
824
static int dtls1_get_hello_verify(SSL *s)
825
0
{
826
0
    int n, al, ok = 0;
827
0
    unsigned char *data;
828
0
    unsigned int cookie_len;
829
830
0
    s->first_packet = 1;
831
0
    n = s->method->ssl_get_message(s,
832
0
                                   DTLS1_ST_CR_HELLO_VERIFY_REQUEST_A,
833
0
                                   DTLS1_ST_CR_HELLO_VERIFY_REQUEST_B,
834
0
                                   -1, s->max_cert_list, &ok);
835
0
    s->first_packet = 0;
836
837
0
    if (!ok)
838
0
        return ((int)n);
839
840
0
    if (s->s3->tmp.message_type != DTLS1_MT_HELLO_VERIFY_REQUEST) {
841
0
        s->d1->send_cookie = 0;
842
0
        s->s3->tmp.reuse_message = 1;
843
0
        return (1);
844
0
    }
845
846
0
    data = (unsigned char *)s->init_msg;
847
#if 0
848
    if (s->method->version != DTLS_ANY_VERSION &&
849
        ((data[0] != (s->version >> 8)) || (data[1] != (s->version & 0xff))))
850
    {
851
        SSLerr(SSL_F_DTLS1_GET_HELLO_VERIFY, SSL_R_WRONG_SSL_VERSION);
852
        s->version = (s->version & 0xff00) | data[1];
853
        al = SSL_AD_PROTOCOL_VERSION;
854
        goto f_err;
855
    }
856
#endif
857
0
    data += 2;
858
859
0
    cookie_len = *(data++);
860
0
    if (cookie_len > sizeof(s->d1->cookie)) {
861
0
        al = SSL_AD_ILLEGAL_PARAMETER;
862
0
        goto f_err;
863
0
    }
864
865
0
    memcpy(s->d1->cookie, data, cookie_len);
866
0
    s->d1->cookie_len = cookie_len;
867
868
0
    s->d1->send_cookie = 1;
869
0
    return 1;
870
871
0
 f_err:
872
0
    ssl3_send_alert(s, SSL3_AL_FATAL, al);
873
0
    s->state = SSL_ST_ERR;
874
0
    return -1;
875
0
}