3 * DTLS implementation written by Nagendra Modadugu
4 * (nagendra@cs.stanford.edu) for the OpenSSL project 2005.
6 /* ====================================================================
7 * Copyright (c) 1999-2007 The OpenSSL Project. All rights reserved.
9 * Redistribution and use in source and binary forms, with or without
10 * modification, are permitted provided that the following conditions
13 * 1. Redistributions of source code must retain the above copyright
14 * notice, this list of conditions and the following disclaimer.
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
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/)"
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.
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.
35 * 6. Redistributions of any form whatsoever must retain the following
37 * "This product includes software developed by the OpenSSL Project
38 * for use in the OpenSSL Toolkit (http://www.OpenSSL.org/)"
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 * ====================================================================
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).
59 /* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
60 * All rights reserved.
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.
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).
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.
80 * Redistribution and use in source and binary forms, with or without
81 * modification, are permitted provided that the following conditions
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)"
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
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.]
117 #include "ssl_locl.h"
118 #ifndef OPENSSL_NO_KRB5
119 #include "kssl_lcl.h"
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>
131 static const SSL_METHOD
*dtls1_get_client_method(int ver
);
132 static int dtls1_get_hello_verify(SSL
*s
);
134 static const SSL_METHOD
*dtls1_get_client_method(int ver
)
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());
144 IMPLEMENT_dtls1_meth_func(DTLS1_VERSION
,
145 DTLSv1_client_method
,
146 ssl_undefined_function
,
148 dtls1_get_client_method
,
151 IMPLEMENT_dtls1_meth_func(DTLS1_2_VERSION
,
152 DTLSv1_2_client_method
,
153 ssl_undefined_function
,
155 dtls1_get_client_method
,
158 IMPLEMENT_dtls1_meth_func(DTLS_ANY_VERSION
,
160 ssl_undefined_function
,
162 dtls1_get_client_method
,
165 int dtls1_connect(SSL
*s
)
168 unsigned long Time
=(unsigned long)time(NULL
);
169 void (*cb
)(const SSL
*ssl
,int type
,int val
)=NULL
;
171 int new_state
,state
,skip
=0;
172 #ifndef OPENSSL_NO_SCTP
173 unsigned char sctpauthkey
[64];
174 char labelbuffer
[sizeof(DTLS1_SCTP_AUTH_LABEL
)];
177 RAND_add(&Time
,sizeof(Time
),0);
181 if (s
->info_callback
!= NULL
)
183 else if (s
->ctx
->info_callback
!= NULL
)
184 cb
=s
->ctx
->info_callback
;
187 if (!SSL_in_init(s
) || SSL_in_before(s
)) SSL_clear(s
);
189 #ifndef OPENSSL_NO_SCTP
190 /* Notify SCTP BIO socket to enter handshake
191 * mode and prevent stream identifier other
192 * than 0. Will be ignored if no SCTP is used.
194 BIO_ctrl(SSL_get_wbio(s
), BIO_CTRL_DGRAM_SCTP_SET_IN_HANDSHAKE
, s
->in_handshake
, NULL
);
197 #ifndef OPENSSL_NO_HEARTBEATS
198 /* If we're awaiting a HeartbeatResponse, pretend we
199 * already got and don't await it anymore, because
200 * Heartbeats don't make sense during handshakes anyway.
202 if (s
->tlsext_hb_pending
)
205 s
->tlsext_hb_pending
= 0;
216 case SSL_ST_RENEGOTIATE
:
218 s
->state
=SSL_ST_CONNECT
;
219 s
->ctx
->stats
.sess_connect_renegotiate
++;
223 case SSL_ST_BEFORE
|SSL_ST_CONNECT
:
224 case SSL_ST_OK
|SSL_ST_CONNECT
:
227 if (cb
!= NULL
) cb(s
,SSL_CB_HANDSHAKE_START
,1);
229 if ((s
->version
& 0xff00 ) != (DTLS1_VERSION
& 0xff00) &&
230 (s
->version
& 0xff00 ) != (DTLS1_BAD_VER
& 0xff00))
232 SSLerr(SSL_F_DTLS1_CONNECT
, ERR_R_INTERNAL_ERROR
);
237 /* s->version=SSL3_VERSION; */
238 s
->type
=SSL_ST_CONNECT
;
240 if (s
->init_buf
== NULL
)
242 if ((buf
=BUF_MEM_new()) == NULL
)
247 if (!BUF_MEM_grow(buf
,SSL3_RT_MAX_PLAIN_LENGTH
))
256 if (!ssl3_setup_buffers(s
)) { ret
= -1; goto end
; }
258 /* setup buffing BIO */
259 if (!ssl_init_wbio_buffer(s
,0)) { ret
= -1; goto end
; }
261 /* don't push the buffering BIO quite yet */
263 s
->state
=SSL3_ST_CW_CLNT_HELLO_A
;
264 s
->ctx
->stats
.sess_connect
++;
266 /* mark client_random uninitialized */
267 memset(s
->s3
->client_random
,0,sizeof(s
->s3
->client_random
));
268 s
->d1
->send_cookie
= 0;
270 s
->d1
->change_cipher_spec_ok
= 0;
271 /* Should have been reset by ssl3_get_finished, too. */
272 s
->s3
->change_cipher_spec
= 0;
275 #ifndef OPENSSL_NO_SCTP
276 case DTLS1_SCTP_ST_CR_READ_SOCK
:
278 if (BIO_dgram_sctp_msg_waiting(SSL_get_rbio(s
)))
280 s
->s3
->in_read_app_data
=2;
281 s
->rwstate
=SSL_READING
;
282 BIO_clear_retry_flags(SSL_get_rbio(s
));
283 BIO_set_retry_read(SSL_get_rbio(s
));
288 s
->state
=s
->s3
->tmp
.next_state
;
291 case DTLS1_SCTP_ST_CW_WRITE_SOCK
:
292 /* read app data until dry event */
294 ret
= BIO_dgram_sctp_wait_for_dry(SSL_get_wbio(s
));
295 if (ret
< 0) goto end
;
299 s
->s3
->in_read_app_data
=2;
300 s
->rwstate
=SSL_READING
;
301 BIO_clear_retry_flags(SSL_get_rbio(s
));
302 BIO_set_retry_read(SSL_get_rbio(s
));
307 s
->state
=s
->d1
->next_state
;
311 case SSL3_ST_CW_CLNT_HELLO_A
:
312 case SSL3_ST_CW_CLNT_HELLO_B
:
316 /* every DTLS ClientHello resets Finished MAC */
317 ssl3_init_finished_mac(s
);
319 dtls1_start_timer(s
);
320 ret
=ssl3_client_hello(s
);
321 if (ret
<= 0) goto end
;
323 if ( s
->d1
->send_cookie
)
325 s
->state
=SSL3_ST_CW_FLUSH
;
326 s
->s3
->tmp
.next_state
=SSL3_ST_CR_SRVR_HELLO_A
;
329 s
->state
=SSL3_ST_CR_SRVR_HELLO_A
;
333 #ifndef OPENSSL_NO_SCTP
334 /* Disable buffering for SCTP */
335 if (!BIO_dgram_is_sctp(SSL_get_wbio(s
)))
338 /* turn on buffering for the next lot of output */
339 if (s
->bbio
!= s
->wbio
)
340 s
->wbio
=BIO_push(s
->bbio
,s
->wbio
);
341 #ifndef OPENSSL_NO_SCTP
347 case SSL3_ST_CR_SRVR_HELLO_A
:
348 case SSL3_ST_CR_SRVR_HELLO_B
:
349 ret
=ssl3_get_server_hello(s
);
350 if (ret
<= 0) goto end
;
355 #ifndef OPENSSL_NO_SCTP
356 /* Add new shared key for SCTP-Auth,
357 * will be ignored if no SCTP used.
359 snprintf((char*) labelbuffer
, sizeof(DTLS1_SCTP_AUTH_LABEL
),
360 DTLS1_SCTP_AUTH_LABEL
);
362 SSL_export_keying_material(s
, sctpauthkey
,
363 sizeof(sctpauthkey
), labelbuffer
,
364 sizeof(labelbuffer
), NULL
, 0, 0);
366 BIO_ctrl(SSL_get_wbio(s
), BIO_CTRL_DGRAM_SCTP_ADD_AUTH_KEY
,
367 sizeof(sctpauthkey
), sctpauthkey
);
370 s
->state
=SSL3_ST_CR_FINISHED_A
;
373 s
->state
=DTLS1_ST_CR_HELLO_VERIFY_REQUEST_A
;
378 case DTLS1_ST_CR_HELLO_VERIFY_REQUEST_A
:
379 case DTLS1_ST_CR_HELLO_VERIFY_REQUEST_B
:
381 ret
= dtls1_get_hello_verify(s
);
385 if ( s
->d1
->send_cookie
) /* start again, with a cookie */
386 s
->state
=SSL3_ST_CW_CLNT_HELLO_A
;
388 s
->state
= SSL3_ST_CR_CERT_A
;
392 case SSL3_ST_CR_CERT_A
:
393 case SSL3_ST_CR_CERT_B
:
394 /* Check if it is anon DH or PSK */
395 if (!(s
->s3
->tmp
.new_cipher
->algorithm_auth
& SSL_aNULL
) &&
396 !(s
->s3
->tmp
.new_cipher
->algorithm_mkey
& SSL_kPSK
))
398 ret
=ssl3_get_server_certificate(s
);
399 if (ret
<= 0) goto end
;
400 #ifndef OPENSSL_NO_TLSEXT
401 if (s
->tlsext_status_expected
)
402 s
->state
=SSL3_ST_CR_CERT_STATUS_A
;
404 s
->state
=SSL3_ST_CR_KEY_EXCH_A
;
409 s
->state
=SSL3_ST_CR_KEY_EXCH_A
;
416 s
->state
=SSL3_ST_CR_KEY_EXCH_A
;
421 case SSL3_ST_CR_KEY_EXCH_A
:
422 case SSL3_ST_CR_KEY_EXCH_B
:
423 ret
=ssl3_get_key_exchange(s
);
424 if (ret
<= 0) goto end
;
425 s
->state
=SSL3_ST_CR_CERT_REQ_A
;
428 /* at this point we check that we have the
429 * required stuff from the server */
430 if (!ssl3_check_cert_and_algorithm(s
))
437 case SSL3_ST_CR_CERT_REQ_A
:
438 case SSL3_ST_CR_CERT_REQ_B
:
439 ret
=ssl3_get_certificate_request(s
);
440 if (ret
<= 0) goto end
;
441 s
->state
=SSL3_ST_CR_SRVR_DONE_A
;
445 case SSL3_ST_CR_SRVR_DONE_A
:
446 case SSL3_ST_CR_SRVR_DONE_B
:
447 ret
=ssl3_get_server_done(s
);
448 if (ret
<= 0) goto end
;
450 if (s
->s3
->tmp
.cert_req
)
451 s
->s3
->tmp
.next_state
=SSL3_ST_CW_CERT_A
;
453 s
->s3
->tmp
.next_state
=SSL3_ST_CW_KEY_EXCH_A
;
456 #ifndef OPENSSL_NO_SCTP
457 if (BIO_dgram_is_sctp(SSL_get_wbio(s
)) &&
458 state
== SSL_ST_RENEGOTIATE
)
459 s
->state
=DTLS1_SCTP_ST_CR_READ_SOCK
;
462 s
->state
=s
->s3
->tmp
.next_state
;
465 case SSL3_ST_CW_CERT_A
:
466 case SSL3_ST_CW_CERT_B
:
467 case SSL3_ST_CW_CERT_C
:
468 case SSL3_ST_CW_CERT_D
:
469 dtls1_start_timer(s
);
470 ret
=ssl3_send_client_certificate(s
);
471 if (ret
<= 0) goto end
;
472 s
->state
=SSL3_ST_CW_KEY_EXCH_A
;
476 case SSL3_ST_CW_KEY_EXCH_A
:
477 case SSL3_ST_CW_KEY_EXCH_B
:
478 dtls1_start_timer(s
);
479 ret
=ssl3_send_client_key_exchange(s
);
480 if (ret
<= 0) goto end
;
482 #ifndef OPENSSL_NO_SCTP
483 /* Add new shared key for SCTP-Auth,
484 * will be ignored if no SCTP used.
486 snprintf((char*) labelbuffer
, sizeof(DTLS1_SCTP_AUTH_LABEL
),
487 DTLS1_SCTP_AUTH_LABEL
);
489 SSL_export_keying_material(s
, sctpauthkey
,
490 sizeof(sctpauthkey
), labelbuffer
,
491 sizeof(labelbuffer
), NULL
, 0, 0);
493 BIO_ctrl(SSL_get_wbio(s
), BIO_CTRL_DGRAM_SCTP_ADD_AUTH_KEY
,
494 sizeof(sctpauthkey
), sctpauthkey
);
497 /* EAY EAY EAY need to check for DH fix cert
499 /* For TLS, cert_req is set to 2, so a cert chain
500 * of nothing is sent, but no verify packet is sent */
501 if (s
->s3
->tmp
.cert_req
== 1)
503 s
->state
=SSL3_ST_CW_CERT_VRFY_A
;
507 #ifndef OPENSSL_NO_SCTP
508 if (BIO_dgram_is_sctp(SSL_get_wbio(s
)))
510 s
->d1
->next_state
=SSL3_ST_CW_CHANGE_A
;
511 s
->state
=DTLS1_SCTP_ST_CW_WRITE_SOCK
;
515 s
->state
=SSL3_ST_CW_CHANGE_A
;
521 case SSL3_ST_CW_CERT_VRFY_A
:
522 case SSL3_ST_CW_CERT_VRFY_B
:
523 dtls1_start_timer(s
);
524 ret
=ssl3_send_client_verify(s
);
525 if (ret
<= 0) goto end
;
526 #ifndef OPENSSL_NO_SCTP
527 if (BIO_dgram_is_sctp(SSL_get_wbio(s
)))
529 s
->d1
->next_state
=SSL3_ST_CW_CHANGE_A
;
530 s
->state
=DTLS1_SCTP_ST_CW_WRITE_SOCK
;
534 s
->state
=SSL3_ST_CW_CHANGE_A
;
538 case SSL3_ST_CW_CHANGE_A
:
539 case SSL3_ST_CW_CHANGE_B
:
541 dtls1_start_timer(s
);
542 ret
=dtls1_send_change_cipher_spec(s
,
543 SSL3_ST_CW_CHANGE_A
,SSL3_ST_CW_CHANGE_B
);
544 if (ret
<= 0) goto end
;
546 s
->state
=SSL3_ST_CW_FINISHED_A
;
549 s
->session
->cipher
=s
->s3
->tmp
.new_cipher
;
550 #ifdef OPENSSL_NO_COMP
551 s
->session
->compress_meth
=0;
553 if (s
->s3
->tmp
.new_compression
== NULL
)
554 s
->session
->compress_meth
=0;
556 s
->session
->compress_meth
=
557 s
->s3
->tmp
.new_compression
->id
;
559 if (!s
->method
->ssl3_enc
->setup_key_block(s
))
565 if (!s
->method
->ssl3_enc
->change_cipher_state(s
,
566 SSL3_CHANGE_CIPHER_CLIENT_WRITE
))
572 #ifndef OPENSSL_NO_SCTP
575 /* Change to new shared key of SCTP-Auth,
576 * will be ignored if no SCTP used.
578 BIO_ctrl(SSL_get_wbio(s
), BIO_CTRL_DGRAM_SCTP_NEXT_AUTH_KEY
, 0, NULL
);
582 dtls1_reset_seq_numbers(s
, SSL3_CC_WRITE
);
585 case SSL3_ST_CW_FINISHED_A
:
586 case SSL3_ST_CW_FINISHED_B
:
588 dtls1_start_timer(s
);
589 ret
=ssl3_send_finished(s
,
590 SSL3_ST_CW_FINISHED_A
,SSL3_ST_CW_FINISHED_B
,
591 s
->method
->ssl3_enc
->client_finished_label
,
592 s
->method
->ssl3_enc
->client_finished_label_len
);
593 if (ret
<= 0) goto end
;
594 s
->state
=SSL3_ST_CW_FLUSH
;
597 s
->s3
->flags
&= ~SSL3_FLAGS_POP_BUFFER
;
600 s
->s3
->tmp
.next_state
=SSL_ST_OK
;
601 #ifndef OPENSSL_NO_SCTP
602 if (BIO_dgram_is_sctp(SSL_get_wbio(s
)))
604 s
->d1
->next_state
= s
->s3
->tmp
.next_state
;
605 s
->s3
->tmp
.next_state
=DTLS1_SCTP_ST_CW_WRITE_SOCK
;
608 if (s
->s3
->flags
& SSL3_FLAGS_DELAY_CLIENT_FINISHED
)
611 #ifndef OPENSSL_NO_SCTP
612 if (BIO_dgram_is_sctp(SSL_get_wbio(s
)))
614 s
->d1
->next_state
= SSL_ST_OK
;
615 s
->state
=DTLS1_SCTP_ST_CW_WRITE_SOCK
;
618 s
->s3
->flags
|=SSL3_FLAGS_POP_BUFFER
;
619 s
->s3
->delay_buf_pop_ret
=0;
624 #ifndef OPENSSL_NO_SCTP
625 /* Change to new shared key of SCTP-Auth,
626 * will be ignored if no SCTP used.
628 BIO_ctrl(SSL_get_wbio(s
), BIO_CTRL_DGRAM_SCTP_NEXT_AUTH_KEY
, 0, NULL
);
631 #ifndef OPENSSL_NO_TLSEXT
632 /* Allow NewSessionTicket if ticket expected */
633 if (s
->tlsext_ticket_expected
)
634 s
->s3
->tmp
.next_state
=SSL3_ST_CR_SESSION_TICKET_A
;
638 s
->s3
->tmp
.next_state
=SSL3_ST_CR_FINISHED_A
;
643 #ifndef OPENSSL_NO_TLSEXT
644 case SSL3_ST_CR_SESSION_TICKET_A
:
645 case SSL3_ST_CR_SESSION_TICKET_B
:
646 ret
=ssl3_get_new_session_ticket(s
);
647 if (ret
<= 0) goto end
;
648 s
->state
=SSL3_ST_CR_FINISHED_A
;
652 case SSL3_ST_CR_CERT_STATUS_A
:
653 case SSL3_ST_CR_CERT_STATUS_B
:
654 ret
=ssl3_get_cert_status(s
);
655 if (ret
<= 0) goto end
;
656 s
->state
=SSL3_ST_CR_KEY_EXCH_A
;
661 case SSL3_ST_CR_FINISHED_A
:
662 case SSL3_ST_CR_FINISHED_B
:
663 s
->d1
->change_cipher_spec_ok
= 1;
664 ret
=ssl3_get_finished(s
,SSL3_ST_CR_FINISHED_A
,
665 SSL3_ST_CR_FINISHED_B
);
666 if (ret
<= 0) goto end
;
670 s
->state
=SSL3_ST_CW_CHANGE_A
;
674 #ifndef OPENSSL_NO_SCTP
675 if (BIO_dgram_is_sctp(SSL_get_wbio(s
)) &&
676 state
== SSL_ST_RENEGOTIATE
)
678 s
->d1
->next_state
=s
->state
;
679 s
->state
=DTLS1_SCTP_ST_CW_WRITE_SOCK
;
686 case SSL3_ST_CW_FLUSH
:
687 s
->rwstate
=SSL_WRITING
;
688 if (BIO_flush(s
->wbio
) <= 0)
690 /* If the write error was fatal, stop trying */
691 if (!BIO_should_retry(s
->wbio
))
693 s
->rwstate
=SSL_NOTHING
;
694 s
->state
=s
->s3
->tmp
.next_state
;
700 s
->rwstate
=SSL_NOTHING
;
701 s
->state
=s
->s3
->tmp
.next_state
;
705 /* clean a few things up */
706 ssl3_cleanup_key_block(s
);
709 if (s
->init_buf
!= NULL
)
711 BUF_MEM_free(s
->init_buf
);
716 /* If we are not 'joining' the last two packets,
717 * remove the buffering now */
718 if (!(s
->s3
->flags
& SSL3_FLAGS_POP_BUFFER
))
719 ssl_free_wbio_buffer(s
);
720 /* else do it later in ssl3_write */
726 ssl_update_cache(s
,SSL_SESS_CACHE_CLIENT
);
727 if (s
->hit
) s
->ctx
->stats
.sess_hit
++;
731 s
->handshake_func
=dtls1_connect
;
732 s
->ctx
->stats
.sess_connect_good
++;
734 if (cb
!= NULL
) cb(s
,SSL_CB_HANDSHAKE_DONE
,1);
736 /* done with handshaking */
737 s
->d1
->handshake_read_seq
= 0;
738 s
->d1
->next_handshake_write_seq
= 0;
743 SSLerr(SSL_F_DTLS1_CONNECT
,SSL_R_UNKNOWN_STATE
);
749 /* did we do anything */
750 if (!s
->s3
->tmp
.reuse_message
&& !skip
)
754 if ((ret
=BIO_flush(s
->wbio
)) <= 0)
758 if ((cb
!= NULL
) && (s
->state
!= state
))
762 cb(s
,SSL_CB_CONNECT_LOOP
,1);
771 #ifndef OPENSSL_NO_SCTP
772 /* Notify SCTP BIO socket to leave handshake
773 * mode and allow stream identifier other
774 * than 0. Will be ignored if no SCTP is used.
776 BIO_ctrl(SSL_get_wbio(s
), BIO_CTRL_DGRAM_SCTP_SET_IN_HANDSHAKE
, s
->in_handshake
, NULL
);
782 cb(s
,SSL_CB_CONNECT_EXIT
,ret
);
786 static int dtls1_get_hello_verify(SSL
*s
)
790 unsigned int cookie_len
;
793 n
=s
->method
->ssl_get_message(s
,
794 DTLS1_ST_CR_HELLO_VERIFY_REQUEST_A
,
795 DTLS1_ST_CR_HELLO_VERIFY_REQUEST_B
,
801 if (!ok
) return((int)n
);
803 if (s
->s3
->tmp
.message_type
!= DTLS1_MT_HELLO_VERIFY_REQUEST
)
805 s
->d1
->send_cookie
= 0;
806 s
->s3
->tmp
.reuse_message
=1;
810 data
= (unsigned char *)s
->init_msg
;
812 if (s
->method
->version
!= DTLS_ANY_VERSION
&&
813 ((data
[0] != (s
->version
>>8)) || (data
[1] != (s
->version
&0xff))))
815 SSLerr(SSL_F_DTLS1_GET_HELLO_VERIFY
,SSL_R_WRONG_SSL_VERSION
);
816 s
->version
=(s
->version
&0xff00)|data
[1];
817 al
= SSL_AD_PROTOCOL_VERSION
;
823 cookie_len
= *(data
++);
824 if ( cookie_len
> sizeof(s
->d1
->cookie
))
826 al
=SSL_AD_ILLEGAL_PARAMETER
;
830 memcpy(s
->d1
->cookie
, data
, cookie_len
);
831 s
->d1
->cookie_len
= cookie_len
;
833 s
->d1
->send_cookie
= 1;
837 ssl3_send_alert(s
, SSL3_AL_FATAL
, al
);