Set s->d1 to NULL after freeing it.
[openssl.git] / ssl / d1_clnt.c
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         {
136         if (ver == DTLS1_VERSION || ver == DTLS1_BAD_VER)
137                 return(DTLSv1_client_method());
138         else if (ver == DTLS1_2_VERSION)
139                 return(DTLSv1_2_client_method());
140         else
141                 return(NULL);
142         }
143
144 IMPLEMENT_dtls1_meth_func(DTLS1_VERSION,
145                         DTLSv1_client_method,
146                         ssl_undefined_function,
147                         dtls1_connect,
148                         dtls1_get_client_method,
149                         DTLSv1_enc_data)
150
151 IMPLEMENT_dtls1_meth_func(DTLS1_2_VERSION,
152                         DTLSv1_2_client_method,
153                         ssl_undefined_function,
154                         dtls1_connect,
155                         dtls1_get_client_method,
156                         DTLSv1_2_enc_data)
157
158 int dtls1_connect(SSL *s)
159         {
160         BUF_MEM *buf=NULL;
161         unsigned long Time=(unsigned long)time(NULL);
162         void (*cb)(const SSL *ssl,int type,int val)=NULL;
163         int ret= -1;
164         int new_state,state,skip=0;
165 #ifndef OPENSSL_NO_SCTP
166         unsigned char sctpauthkey[64];
167         char labelbuffer[sizeof(DTLS1_SCTP_AUTH_LABEL)];
168 #endif
169
170         RAND_add(&Time,sizeof(Time),0);
171         ERR_clear_error();
172         clear_sys_error();
173
174         if (s->info_callback != NULL)
175                 cb=s->info_callback;
176         else if (s->ctx->info_callback != NULL)
177                 cb=s->ctx->info_callback;
178         
179         s->in_handshake++;
180         if (!SSL_in_init(s) || SSL_in_before(s)) SSL_clear(s); 
181
182 #ifndef OPENSSL_NO_SCTP
183         /* Notify SCTP BIO socket to enter handshake
184          * mode and prevent stream identifier other
185          * than 0. Will be ignored if no SCTP is used.
186          */
187         BIO_ctrl(SSL_get_wbio(s), BIO_CTRL_DGRAM_SCTP_SET_IN_HANDSHAKE, s->in_handshake, NULL);
188 #endif
189
190 #ifndef OPENSSL_NO_HEARTBEATS
191         /* If we're awaiting a HeartbeatResponse, pretend we
192          * already got and don't await it anymore, because
193          * Heartbeats don't make sense during handshakes anyway.
194          */
195         if (s->tlsext_hb_pending)
196                 {
197                 dtls1_stop_timer(s);
198                 s->tlsext_hb_pending = 0;
199                 s->tlsext_hb_seq++;
200                 }
201 #endif
202
203         for (;;)
204                 {
205                 state=s->state;
206
207                 switch(s->state)
208                         {
209                 case SSL_ST_RENEGOTIATE:
210                         s->renegotiate=1;
211                         s->state=SSL_ST_CONNECT;
212                         s->ctx->stats.sess_connect_renegotiate++;
213                         /* break */
214                 case SSL_ST_BEFORE:
215                 case SSL_ST_CONNECT:
216                 case SSL_ST_BEFORE|SSL_ST_CONNECT:
217                 case SSL_ST_OK|SSL_ST_CONNECT:
218
219                         s->server=0;
220                         if (cb != NULL) cb(s,SSL_CB_HANDSHAKE_START,1);
221
222                         if ((s->version & 0xff00 ) != (DTLS1_VERSION & 0xff00) &&
223                             (s->version & 0xff00 ) != (DTLS1_BAD_VER & 0xff00))
224                                 {
225                                 SSLerr(SSL_F_DTLS1_CONNECT, ERR_R_INTERNAL_ERROR);
226                                 ret = -1;
227                                 goto end;
228                                 }
229                                 
230                         /* s->version=SSL3_VERSION; */
231                         s->type=SSL_ST_CONNECT;
232
233                         if (s->init_buf == NULL)
234                                 {
235                                 if ((buf=BUF_MEM_new()) == NULL)
236                                         {
237                                         ret= -1;
238                                         goto end;
239                                         }
240                                 if (!BUF_MEM_grow(buf,SSL3_RT_MAX_PLAIN_LENGTH))
241                                         {
242                                         ret= -1;
243                                         goto end;
244                                         }
245                                 s->init_buf=buf;
246                                 buf=NULL;
247                                 }
248
249                         if (!ssl3_setup_buffers(s)) { ret= -1; goto end; }
250
251                         /* setup buffing BIO */
252                         if (!ssl_init_wbio_buffer(s,0)) { ret= -1; goto end; }
253
254                         /* don't push the buffering BIO quite yet */
255
256                         s->state=SSL3_ST_CW_CLNT_HELLO_A;
257                         s->ctx->stats.sess_connect++;
258                         s->init_num=0;
259                         /* mark client_random uninitialized */
260                         memset(s->s3->client_random,0,sizeof(s->s3->client_random));
261                         s->d1->send_cookie = 0;
262                         s->hit = 0;
263                         break;
264
265 #ifndef OPENSSL_NO_SCTP
266                 case DTLS1_SCTP_ST_CR_READ_SOCK:
267
268                         if (BIO_dgram_sctp_msg_waiting(SSL_get_rbio(s)))
269                         {
270                                 s->s3->in_read_app_data=2;
271                                 s->rwstate=SSL_READING;
272                                 BIO_clear_retry_flags(SSL_get_rbio(s));
273                                 BIO_set_retry_read(SSL_get_rbio(s));
274                                 ret = -1;
275                                 goto end;
276                         }
277
278                         s->state=s->s3->tmp.next_state;
279                         break;
280
281                 case DTLS1_SCTP_ST_CW_WRITE_SOCK:
282                         /* read app data until dry event */
283
284                         ret = BIO_dgram_sctp_wait_for_dry(SSL_get_wbio(s));
285                         if (ret < 0) goto end;
286
287                         if (ret == 0)
288                         {
289                                 s->s3->in_read_app_data=2;
290                                 s->rwstate=SSL_READING;
291                                 BIO_clear_retry_flags(SSL_get_rbio(s));
292                                 BIO_set_retry_read(SSL_get_rbio(s));
293                                 ret = -1;
294                                 goto end;
295                         }
296
297                         s->state=s->d1->next_state;
298                         break;
299 #endif
300
301                 case SSL3_ST_CW_CLNT_HELLO_A:
302                 case SSL3_ST_CW_CLNT_HELLO_B:
303
304                         s->shutdown=0;
305
306                         /* every DTLS ClientHello resets Finished MAC */
307                         ssl3_init_finished_mac(s);
308
309                         dtls1_start_timer(s);
310                         ret=ssl3_client_hello(s);
311                         if (ret <= 0) goto end;
312
313                         if ( s->d1->send_cookie)
314                                 {
315                                 s->state=SSL3_ST_CW_FLUSH;
316                                 s->s3->tmp.next_state=SSL3_ST_CR_SRVR_HELLO_A;
317                                 }
318                         else
319                                 s->state=SSL3_ST_CR_SRVR_HELLO_A;
320
321                         s->init_num=0;
322
323 #ifndef OPENSSL_NO_SCTP
324                         /* Disable buffering for SCTP */
325                         if (!BIO_dgram_is_sctp(SSL_get_wbio(s)))
326                                 {
327 #endif
328                                 /* turn on buffering for the next lot of output */
329                                 if (s->bbio != s->wbio)
330                                         s->wbio=BIO_push(s->bbio,s->wbio);
331 #ifndef OPENSSL_NO_SCTP
332                                 }
333 #endif
334
335                         break;
336
337                 case SSL3_ST_CR_SRVR_HELLO_A:
338                 case SSL3_ST_CR_SRVR_HELLO_B:
339                         ret=ssl3_get_server_hello(s);
340                         if (ret <= 0) goto end;
341                         else
342                                 {
343                                 if (s->hit)
344                                         {
345 #ifndef OPENSSL_NO_SCTP
346                                         /* Add new shared key for SCTP-Auth,
347                                          * will be ignored if no SCTP used.
348                                          */
349                                         snprintf((char*) labelbuffer, sizeof(DTLS1_SCTP_AUTH_LABEL),
350                                                  DTLS1_SCTP_AUTH_LABEL);
351
352                                         SSL_export_keying_material(s, sctpauthkey,
353                                                                    sizeof(sctpauthkey), labelbuffer,
354                                                                    sizeof(labelbuffer), NULL, 0, 0);
355
356                                         BIO_ctrl(SSL_get_wbio(s), BIO_CTRL_DGRAM_SCTP_ADD_AUTH_KEY,
357                                                          sizeof(sctpauthkey), sctpauthkey);
358 #endif
359
360                                         s->state=SSL3_ST_CR_FINISHED_A;
361                                         }
362                                 else
363                                         s->state=DTLS1_ST_CR_HELLO_VERIFY_REQUEST_A;
364                                 }
365                         s->init_num=0;
366                         break;
367
368                 case DTLS1_ST_CR_HELLO_VERIFY_REQUEST_A:
369                 case DTLS1_ST_CR_HELLO_VERIFY_REQUEST_B:
370
371                         ret = dtls1_get_hello_verify(s);
372                         if ( ret <= 0)
373                                 goto end;
374                         dtls1_stop_timer(s);
375                         if ( s->d1->send_cookie) /* start again, with a cookie */
376                                 s->state=SSL3_ST_CW_CLNT_HELLO_A;
377                         else
378                                 s->state = SSL3_ST_CR_CERT_A;
379                         s->init_num = 0;
380                         break;
381
382                 case SSL3_ST_CR_CERT_A:
383                 case SSL3_ST_CR_CERT_B:
384 #ifndef OPENSSL_NO_TLSEXT
385                         ret=ssl3_check_finished(s);
386                         if (ret <= 0) goto end;
387                         if (ret == 2)
388                                 {
389                                 s->hit = 1;
390                                 if (s->tlsext_ticket_expected)
391                                         s->state=SSL3_ST_CR_SESSION_TICKET_A;
392                                 else
393                                         s->state=SSL3_ST_CR_FINISHED_A;
394                                 s->init_num=0;
395                                 break;
396                                 }
397 #endif
398                         /* Check if it is anon DH or PSK */
399                         if (!(s->s3->tmp.new_cipher->algorithm_auth & SSL_aNULL) &&
400                             !(s->s3->tmp.new_cipher->algorithm_mkey & SSL_kPSK))
401                                 {
402                                 ret=ssl3_get_server_certificate(s);
403                                 if (ret <= 0) goto end;
404 #ifndef OPENSSL_NO_TLSEXT
405                                 if (s->tlsext_status_expected)
406                                         s->state=SSL3_ST_CR_CERT_STATUS_A;
407                                 else
408                                         s->state=SSL3_ST_CR_KEY_EXCH_A;
409                                 }
410                         else
411                                 {
412                                 skip = 1;
413                                 s->state=SSL3_ST_CR_KEY_EXCH_A;
414                                 }
415 #else
416                                 }
417                         else
418                                 skip=1;
419
420                         s->state=SSL3_ST_CR_KEY_EXCH_A;
421 #endif
422                         s->init_num=0;
423                         break;
424
425                 case SSL3_ST_CR_KEY_EXCH_A:
426                 case SSL3_ST_CR_KEY_EXCH_B:
427                         ret=ssl3_get_key_exchange(s);
428                         if (ret <= 0) goto end;
429                         s->state=SSL3_ST_CR_CERT_REQ_A;
430                         s->init_num=0;
431
432                         /* at this point we check that we have the
433                          * required stuff from the server */
434                         if (!ssl3_check_cert_and_algorithm(s))
435                                 {
436                                 ret= -1;
437                                 goto end;
438                                 }
439                         break;
440
441                 case SSL3_ST_CR_CERT_REQ_A:
442                 case SSL3_ST_CR_CERT_REQ_B:
443                         ret=ssl3_get_certificate_request(s);
444                         if (ret <= 0) goto end;
445                         s->state=SSL3_ST_CR_SRVR_DONE_A;
446                         s->init_num=0;
447                         break;
448
449                 case SSL3_ST_CR_SRVR_DONE_A:
450                 case SSL3_ST_CR_SRVR_DONE_B:
451                         ret=ssl3_get_server_done(s);
452                         if (ret <= 0) goto end;
453                         dtls1_stop_timer(s);
454                         if (s->s3->tmp.cert_req)
455                                 s->s3->tmp.next_state=SSL3_ST_CW_CERT_A;
456                         else
457                                 s->s3->tmp.next_state=SSL3_ST_CW_KEY_EXCH_A;
458                         s->init_num=0;
459
460 #ifndef OPENSSL_NO_SCTP                 
461                         if (BIO_dgram_is_sctp(SSL_get_wbio(s)) &&
462                             state == SSL_ST_RENEGOTIATE)
463                                 s->state=DTLS1_SCTP_ST_CR_READ_SOCK;
464                         else
465 #endif                  
466                         s->state=s->s3->tmp.next_state;
467                         break;
468
469                 case SSL3_ST_CW_CERT_A:
470                 case SSL3_ST_CW_CERT_B:
471                 case SSL3_ST_CW_CERT_C:
472                 case SSL3_ST_CW_CERT_D:
473                         dtls1_start_timer(s);
474                         ret=ssl3_send_client_certificate(s);
475                         if (ret <= 0) goto end;
476                         s->state=SSL3_ST_CW_KEY_EXCH_A;
477                         s->init_num=0;
478                         break;
479
480                 case SSL3_ST_CW_KEY_EXCH_A:
481                 case SSL3_ST_CW_KEY_EXCH_B:
482                         dtls1_start_timer(s);
483                         ret=ssl3_send_client_key_exchange(s);
484                         if (ret <= 0) goto end;
485
486 #ifndef OPENSSL_NO_SCTP
487                         /* Add new shared key for SCTP-Auth,
488                          * will be ignored if no SCTP used.
489                          */
490                         snprintf((char*) labelbuffer, sizeof(DTLS1_SCTP_AUTH_LABEL),
491                                  DTLS1_SCTP_AUTH_LABEL);
492
493                         SSL_export_keying_material(s, sctpauthkey,
494                                                    sizeof(sctpauthkey), labelbuffer,
495                                                    sizeof(labelbuffer), NULL, 0, 0);
496
497                         BIO_ctrl(SSL_get_wbio(s), BIO_CTRL_DGRAM_SCTP_ADD_AUTH_KEY,
498                                          sizeof(sctpauthkey), sctpauthkey);
499 #endif
500
501                         /* EAY EAY EAY need to check for DH fix cert
502                          * sent back */
503                         /* For TLS, cert_req is set to 2, so a cert chain
504                          * of nothing is sent, but no verify packet is sent */
505                         if (s->s3->tmp.cert_req == 1)
506                                 {
507                                 s->state=SSL3_ST_CW_CERT_VRFY_A;
508                                 }
509                         else
510                                 {
511 #ifndef OPENSSL_NO_SCTP
512                                 if (BIO_dgram_is_sctp(SSL_get_wbio(s)))
513                                         {
514                                         s->d1->next_state=SSL3_ST_CW_CHANGE_A;
515                                         s->state=DTLS1_SCTP_ST_CW_WRITE_SOCK;
516                                         }
517                                 else
518 #endif
519                                         s->state=SSL3_ST_CW_CHANGE_A;
520                                 s->s3->change_cipher_spec=0;
521                                 }
522
523                         s->init_num=0;
524                         break;
525
526                 case SSL3_ST_CW_CERT_VRFY_A:
527                 case SSL3_ST_CW_CERT_VRFY_B:
528                         dtls1_start_timer(s);
529                         ret=ssl3_send_client_verify(s);
530                         if (ret <= 0) goto end;
531 #ifndef OPENSSL_NO_SCTP
532                         if (BIO_dgram_is_sctp(SSL_get_wbio(s)))
533                         {
534                                 s->d1->next_state=SSL3_ST_CW_CHANGE_A;
535                                 s->state=DTLS1_SCTP_ST_CW_WRITE_SOCK;
536                         }
537                         else
538 #endif
539                                 s->state=SSL3_ST_CW_CHANGE_A;
540                         s->init_num=0;
541                         s->s3->change_cipher_spec=0;
542                         break;
543
544                 case SSL3_ST_CW_CHANGE_A:
545                 case SSL3_ST_CW_CHANGE_B:
546                         if (!s->hit)
547                                 dtls1_start_timer(s);
548                         ret=dtls1_send_change_cipher_spec(s,
549                                 SSL3_ST_CW_CHANGE_A,SSL3_ST_CW_CHANGE_B);
550                         if (ret <= 0) goto end;
551
552 #ifndef OPENSSL_NO_SCTP
553                         /* Change to new shared key of SCTP-Auth,
554                          * will be ignored if no SCTP used.
555                          */
556                         BIO_ctrl(SSL_get_wbio(s), BIO_CTRL_DGRAM_SCTP_NEXT_AUTH_KEY, 0, NULL);
557 #endif
558
559                         s->state=SSL3_ST_CW_FINISHED_A;
560                         s->init_num=0;
561
562                         s->session->cipher=s->s3->tmp.new_cipher;
563 #ifdef OPENSSL_NO_COMP
564                         s->session->compress_meth=0;
565 #else
566                         if (s->s3->tmp.new_compression == NULL)
567                                 s->session->compress_meth=0;
568                         else
569                                 s->session->compress_meth=
570                                         s->s3->tmp.new_compression->id;
571 #endif
572                         if (!s->method->ssl3_enc->setup_key_block(s))
573                                 {
574                                 ret= -1;
575                                 goto end;
576                                 }
577
578                         if (!s->method->ssl3_enc->change_cipher_state(s,
579                                 SSL3_CHANGE_CIPHER_CLIENT_WRITE))
580                                 {
581                                 ret= -1;
582                                 goto end;
583                                 }
584                         
585                         dtls1_reset_seq_numbers(s, SSL3_CC_WRITE);
586                         break;
587
588                 case SSL3_ST_CW_FINISHED_A:
589                 case SSL3_ST_CW_FINISHED_B:
590                         if (!s->hit)
591                                 dtls1_start_timer(s);
592                         ret=ssl3_send_finished(s,
593                                 SSL3_ST_CW_FINISHED_A,SSL3_ST_CW_FINISHED_B,
594                                 s->method->ssl3_enc->client_finished_label,
595                                 s->method->ssl3_enc->client_finished_label_len);
596                         if (ret <= 0) goto end;
597                         s->state=SSL3_ST_CW_FLUSH;
598
599                         /* clear flags */
600                         s->s3->flags&= ~SSL3_FLAGS_POP_BUFFER;
601                         if (s->hit)
602                                 {
603                                 s->s3->tmp.next_state=SSL_ST_OK;
604 #ifndef OPENSSL_NO_SCTP
605                                 if (BIO_dgram_is_sctp(SSL_get_wbio(s)))
606                                         {
607                                                 s->d1->next_state = s->s3->tmp.next_state;
608                                                 s->s3->tmp.next_state=DTLS1_SCTP_ST_CW_WRITE_SOCK;
609                                         }
610 #endif
611                                 if (s->s3->flags & SSL3_FLAGS_DELAY_CLIENT_FINISHED)
612                                         {
613                                         s->state=SSL_ST_OK;
614 #ifndef OPENSSL_NO_SCTP
615                                         if (BIO_dgram_is_sctp(SSL_get_wbio(s)))
616                                                 {
617                                                         s->d1->next_state = SSL_ST_OK;
618                                                         s->state=DTLS1_SCTP_ST_CW_WRITE_SOCK;
619                                                 }
620 #endif
621                                         s->s3->flags|=SSL3_FLAGS_POP_BUFFER;
622                                         s->s3->delay_buf_pop_ret=0;
623                                         }
624                                 }
625                         else
626                                 {
627 #ifndef OPENSSL_NO_TLSEXT
628                                 /* Allow NewSessionTicket if ticket expected */
629                                 if (s->tlsext_ticket_expected)
630                                         s->s3->tmp.next_state=SSL3_ST_CR_SESSION_TICKET_A;
631                                 else
632 #endif
633                                 
634                                 s->s3->tmp.next_state=SSL3_ST_CR_FINISHED_A;
635                                 }
636                         s->init_num=0;
637                         break;
638
639 #ifndef OPENSSL_NO_TLSEXT
640                 case SSL3_ST_CR_SESSION_TICKET_A:
641                 case SSL3_ST_CR_SESSION_TICKET_B:
642                         ret=ssl3_get_new_session_ticket(s);
643                         if (ret <= 0) goto end;
644                         s->state=SSL3_ST_CR_FINISHED_A;
645                         s->init_num=0;
646                 break;
647
648                 case SSL3_ST_CR_CERT_STATUS_A:
649                 case SSL3_ST_CR_CERT_STATUS_B:
650                         ret=ssl3_get_cert_status(s);
651                         if (ret <= 0) goto end;
652                         s->state=SSL3_ST_CR_KEY_EXCH_A;
653                         s->init_num=0;
654                 break;
655 #endif
656
657                 case SSL3_ST_CR_FINISHED_A:
658                 case SSL3_ST_CR_FINISHED_B:
659                         s->d1->change_cipher_spec_ok = 1;
660                         ret=ssl3_get_finished(s,SSL3_ST_CR_FINISHED_A,
661                                 SSL3_ST_CR_FINISHED_B);
662                         if (ret <= 0) goto end;
663                         dtls1_stop_timer(s);
664
665                         if (s->hit)
666                                 s->state=SSL3_ST_CW_CHANGE_A;
667                         else
668                                 s->state=SSL_ST_OK;
669
670 #ifndef OPENSSL_NO_SCTP
671                         if (BIO_dgram_is_sctp(SSL_get_wbio(s)) &&
672                                 state == SSL_ST_RENEGOTIATE)
673                                 {
674                                 s->d1->next_state=s->state;
675                                 s->state=DTLS1_SCTP_ST_CW_WRITE_SOCK;
676                                 }
677 #endif
678
679                         s->init_num=0;
680                         break;
681
682                 case SSL3_ST_CW_FLUSH:
683                         s->rwstate=SSL_WRITING;
684                         if (BIO_flush(s->wbio) <= 0)
685                                 {
686                                 /* If the write error was fatal, stop trying */
687                                 if (!BIO_should_retry(s->wbio))
688                                         {
689                                         s->rwstate=SSL_NOTHING;
690                                         s->state=s->s3->tmp.next_state;
691                                         }
692                                 
693                                 ret= -1;
694                                 goto end;
695                                 }
696                         s->rwstate=SSL_NOTHING;
697                         s->state=s->s3->tmp.next_state;
698                         break;
699
700                 case SSL_ST_OK:
701                         /* clean a few things up */
702                         ssl3_cleanup_key_block(s);
703
704 #if 0
705                         if (s->init_buf != NULL)
706                                 {
707                                 BUF_MEM_free(s->init_buf);
708                                 s->init_buf=NULL;
709                                 }
710 #endif
711
712                         /* If we are not 'joining' the last two packets,
713                          * remove the buffering now */
714                         if (!(s->s3->flags & SSL3_FLAGS_POP_BUFFER))
715                                 ssl_free_wbio_buffer(s);
716                         /* else do it later in ssl3_write */
717
718                         s->init_num=0;
719                         s->renegotiate=0;
720                         s->new_session=0;
721
722                         ssl_update_cache(s,SSL_SESS_CACHE_CLIENT);
723                         if (s->hit) s->ctx->stats.sess_hit++;
724
725                         ret=1;
726                         /* s->server=0; */
727                         s->handshake_func=dtls1_connect;
728                         s->ctx->stats.sess_connect_good++;
729
730                         if (cb != NULL) cb(s,SSL_CB_HANDSHAKE_DONE,1);
731
732                         /* done with handshaking */
733                         s->d1->handshake_read_seq  = 0;
734                         s->d1->next_handshake_write_seq = 0;
735                         goto end;
736                         /* break; */
737                         
738                 default:
739                         SSLerr(SSL_F_DTLS1_CONNECT,SSL_R_UNKNOWN_STATE);
740                         ret= -1;
741                         goto end;
742                         /* break; */
743                         }
744
745                 /* did we do anything */
746                 if (!s->s3->tmp.reuse_message && !skip)
747                         {
748                         if (s->debug)
749                                 {
750                                 if ((ret=BIO_flush(s->wbio)) <= 0)
751                                         goto end;
752                                 }
753
754                         if ((cb != NULL) && (s->state != state))
755                                 {
756                                 new_state=s->state;
757                                 s->state=state;
758                                 cb(s,SSL_CB_CONNECT_LOOP,1);
759                                 s->state=new_state;
760                                 }
761                         }
762                 skip=0;
763                 }
764 end:
765         s->in_handshake--;
766         
767 #ifndef OPENSSL_NO_SCTP
768         /* Notify SCTP BIO socket to leave handshake
769          * mode and allow stream identifier other
770          * than 0. Will be ignored if no SCTP is used.
771          */
772         BIO_ctrl(SSL_get_wbio(s), BIO_CTRL_DGRAM_SCTP_SET_IN_HANDSHAKE, s->in_handshake, NULL);
773 #endif
774
775         if (buf != NULL)
776                 BUF_MEM_free(buf);
777         if (cb != NULL)
778                 cb(s,SSL_CB_CONNECT_EXIT,ret);
779         return(ret);
780         }
781
782 static int dtls1_get_hello_verify(SSL *s)
783         {
784         int n, al, ok = 0;
785         unsigned char *data;
786         unsigned int cookie_len;
787
788         n=s->method->ssl_get_message(s,
789                 DTLS1_ST_CR_HELLO_VERIFY_REQUEST_A,
790                 DTLS1_ST_CR_HELLO_VERIFY_REQUEST_B,
791                 -1,
792                 s->max_cert_list,
793                 &ok);
794
795         if (!ok) return((int)n);
796
797         if (s->s3->tmp.message_type != DTLS1_MT_HELLO_VERIFY_REQUEST)
798                 {
799                 s->d1->send_cookie = 0;
800                 s->s3->tmp.reuse_message=1;
801                 return(1);
802                 }
803
804         data = (unsigned char *)s->init_msg;
805
806         if ((data[0] != (s->version>>8)) || (data[1] != (s->version&0xff)))
807                 {
808                 SSLerr(SSL_F_DTLS1_GET_HELLO_VERIFY,SSL_R_WRONG_SSL_VERSION);
809                 s->version=(s->version&0xff00)|data[1];
810                 al = SSL_AD_PROTOCOL_VERSION;
811                 goto f_err;
812                 }
813         data+=2;
814
815         cookie_len = *(data++);
816         if ( cookie_len > sizeof(s->d1->cookie))
817                 {
818                 al=SSL_AD_ILLEGAL_PARAMETER;
819                 goto f_err;
820                 }
821
822         memcpy(s->d1->cookie, data, cookie_len);
823         s->d1->cookie_len = cookie_len;
824
825         s->d1->send_cookie = 1;
826         return 1;
827
828 f_err:
829         ssl3_send_alert(s, SSL3_AL_FATAL, al);
830         return -1;
831         }
832