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