]> git.ipfire.org Git - thirdparty/openssl.git/blame - ssl/d1_srvr.c
Make sure that cert is never NULL
[thirdparty/openssl.git] / ssl / d1_srvr.c
CommitLineData
36d16f8e 1/* ssl/d1_srvr.c */
0f113f3e 2/*
36d16f8e 3 * DTLS implementation written by Nagendra Modadugu
0f113f3e 4 * (nagendra@cs.stanford.edu) for the OpenSSL project 2005.
36d16f8e
BL
5 */
6/* ====================================================================
52b8dad8 7 * Copyright (c) 1999-2007 The OpenSSL Project. All rights reserved.
36d16f8e
BL
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
0f113f3e 14 * notice, this list of conditions and the following disclaimer.
36d16f8e
BL
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.
0f113f3e 65 *
36d16f8e
BL
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).
0f113f3e 72 *
36d16f8e
BL
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.
0f113f3e 79 *
36d16f8e
BL
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 :-).
0f113f3e 94 * 4. If you include any Windows specific code (or a derivative thereof) from
36d16f8e
BL
95 * the apps directory (application code) you must include an acknowledgement:
96 * "This product includes software written by Tim Hudson (tjh@cryptsoft.com)"
0f113f3e 97 *
36d16f8e
BL
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.
0f113f3e 109 *
36d16f8e
BL
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#include <openssl/buffer.h>
119#include <openssl/rand.h>
120#include <openssl/objects.h>
121#include <openssl/evp.h>
122#include <openssl/x509.h>
123#include <openssl/md5.h>
1e26a8ba 124#include <openssl/bn.h>
3eeaab4b 125#ifndef OPENSSL_NO_DH
0f113f3e 126# include <openssl/dh.h>
3eeaab4b 127#endif
36d16f8e 128
4ebb342f 129static const SSL_METHOD *dtls1_get_server_method(int ver);
36d16f8e
BL
130static int dtls1_send_hello_verify_request(SSL *s);
131
4ebb342f 132static const SSL_METHOD *dtls1_get_server_method(int ver)
0f113f3e
MC
133{
134 if (ver == DTLS1_VERSION)
135 return (DTLSv1_server_method());
136 else if (ver == DTLS1_2_VERSION)
137 return (DTLSv1_2_server_method());
138 else
139 return (NULL);
140}
36d16f8e 141
cfd298b7 142IMPLEMENT_dtls1_meth_func(DTLS1_VERSION,
0f113f3e
MC
143 DTLSv1_server_method,
144 dtls1_accept,
145 ssl_undefined_function,
146 dtls1_get_server_method, DTLSv1_enc_data)
147
148 IMPLEMENT_dtls1_meth_func(DTLS1_2_VERSION,
149 DTLSv1_2_server_method,
150 dtls1_accept,
151 ssl_undefined_function,
152 dtls1_get_server_method, DTLSv1_2_enc_data)
153
154 IMPLEMENT_dtls1_meth_func(DTLS_ANY_VERSION,
155 DTLS_server_method,
156 dtls1_accept,
157 ssl_undefined_function,
158 dtls1_get_server_method, DTLSv1_2_enc_data)
c6913eeb 159
36d16f8e 160int dtls1_accept(SSL *s)
0f113f3e
MC
161{
162 BUF_MEM *buf;
163 unsigned long Time = (unsigned long)time(NULL);
164 void (*cb) (const SSL *ssl, int type, int val) = NULL;
165 unsigned long alg_k;
166 int ret = -1;
167 int new_state, state, skip = 0;
168 int listen;
7e159e01 169#ifndef OPENSSL_NO_SCTP
0f113f3e
MC
170 unsigned char sctpauthkey[64];
171 char labelbuffer[sizeof(DTLS1_SCTP_AUTH_LABEL)];
7e159e01 172#endif
36d16f8e 173
0f113f3e
MC
174 RAND_add(&Time, sizeof(Time), 0);
175 ERR_clear_error();
176 clear_sys_error();
177
178 if (s->info_callback != NULL)
179 cb = s->info_callback;
180 else if (s->ctx->info_callback != NULL)
181 cb = s->ctx->info_callback;
36d16f8e 182
0f113f3e 183 listen = s->d1->listen;
36d16f8e 184
0f113f3e
MC
185 /* init things to blank */
186 s->in_handshake++;
69f68237
MC
187 if (!SSL_in_init(s) || SSL_in_before(s)) {
188 if(!SSL_clear(s))
189 return -1;
190 }
36d16f8e 191
0f113f3e 192 s->d1->listen = listen;
7e159e01 193#ifndef OPENSSL_NO_SCTP
0f113f3e
MC
194 /*
195 * Notify SCTP BIO socket to enter handshake mode and prevent stream
196 * identifier other than 0. Will be ignored if no SCTP is used.
197 */
198 BIO_ctrl(SSL_get_wbio(s), BIO_CTRL_DGRAM_SCTP_SET_IN_HANDSHAKE,
199 s->in_handshake, NULL);
7e159e01 200#endif
0445ab3a 201
4817504d 202#ifndef OPENSSL_NO_HEARTBEATS
0f113f3e
MC
203 /*
204 * If we're awaiting a HeartbeatResponse, pretend we already got and
205 * don't await it anymore, because Heartbeats don't make sense during
206 * handshakes anyway.
207 */
208 if (s->tlsext_hb_pending) {
209 dtls1_stop_timer(s);
210 s->tlsext_hb_pending = 0;
211 s->tlsext_hb_seq++;
212 }
4817504d
DSH
213#endif
214
0f113f3e
MC
215 for (;;) {
216 state = s->state;
217
218 switch (s->state) {
219 case SSL_ST_RENEGOTIATE:
220 s->renegotiate = 1;
221 /* s->state=SSL_ST_ACCEPT; */
222
223 case SSL_ST_BEFORE:
224 case SSL_ST_ACCEPT:
225 case SSL_ST_BEFORE | SSL_ST_ACCEPT:
226 case SSL_ST_OK | SSL_ST_ACCEPT:
227
228 s->server = 1;
229 if (cb != NULL)
230 cb(s, SSL_CB_HANDSHAKE_START, 1);
231
232 if ((s->version & 0xff00) != (DTLS1_VERSION & 0xff00)) {
233 SSLerr(SSL_F_DTLS1_ACCEPT, ERR_R_INTERNAL_ERROR);
234 return -1;
235 }
236 s->type = SSL_ST_ACCEPT;
237
238 if (s->init_buf == NULL) {
239 if ((buf = BUF_MEM_new()) == NULL) {
240 ret = -1;
241 goto end;
242 }
243 if (!BUF_MEM_grow(buf, SSL3_RT_MAX_PLAIN_LENGTH)) {
244 BUF_MEM_free(buf);
245 ret = -1;
246 goto end;
247 }
248 s->init_buf = buf;
249 }
250
251 if (!ssl3_setup_buffers(s)) {
252 ret = -1;
253 goto end;
254 }
255
256 s->init_num = 0;
257 s->d1->change_cipher_spec_ok = 0;
258 /*
259 * Should have been reset by ssl3_get_finished, too.
260 */
261 s->s3->change_cipher_spec = 0;
262
263 if (s->state != SSL_ST_RENEGOTIATE) {
264 /*
265 * Ok, we now need to push on a buffering BIO so that the
266 * output is sent in a way that TCP likes :-) ...but not with
267 * SCTP :-)
268 */
7e159e01 269#ifndef OPENSSL_NO_SCTP
0f113f3e 270 if (!BIO_dgram_is_sctp(SSL_get_wbio(s)))
7e159e01 271#endif
0f113f3e
MC
272 if (!ssl_init_wbio_buffer(s, 1)) {
273 ret = -1;
274 goto end;
275 }
276
277 ssl3_init_finished_mac(s);
278 s->state = SSL3_ST_SR_CLNT_HELLO_A;
279 s->ctx->stats.sess_accept++;
280 } else {
281 /*
282 * s->state == SSL_ST_RENEGOTIATE, we will just send a
283 * HelloRequest
284 */
285 s->ctx->stats.sess_accept_renegotiate++;
286 s->state = SSL3_ST_SW_HELLO_REQ_A;
287 }
288
289 break;
290
291 case SSL3_ST_SW_HELLO_REQ_A:
292 case SSL3_ST_SW_HELLO_REQ_B:
293
294 s->shutdown = 0;
295 dtls1_clear_record_buffer(s);
296 dtls1_start_timer(s);
297 ret = ssl3_send_hello_request(s);
298 if (ret <= 0)
299 goto end;
300 s->s3->tmp.next_state = SSL3_ST_SR_CLNT_HELLO_A;
301 s->state = SSL3_ST_SW_FLUSH;
302 s->init_num = 0;
303
304 ssl3_init_finished_mac(s);
305 break;
306
307 case SSL3_ST_SW_HELLO_REQ_C:
308 s->state = SSL_ST_OK;
309 break;
310
311 case SSL3_ST_SR_CLNT_HELLO_A:
312 case SSL3_ST_SR_CLNT_HELLO_B:
313 case SSL3_ST_SR_CLNT_HELLO_C:
314
315 s->shutdown = 0;
316 ret = ssl3_get_client_hello(s);
317 if (ret <= 0)
318 goto end;
319 dtls1_stop_timer(s);
320
321 if (ret == 1 && (SSL_get_options(s) & SSL_OP_COOKIE_EXCHANGE))
322 s->state = DTLS1_ST_SW_HELLO_VERIFY_REQUEST_A;
323 else
324 s->state = SSL3_ST_SW_SRVR_HELLO_A;
325
326 s->init_num = 0;
327
328 /*
329 * Reflect ClientHello sequence to remain stateless while
330 * listening
331 */
332 if (listen) {
333 memcpy(s->s3->write_sequence, s->s3->read_sequence,
334 sizeof(s->s3->write_sequence));
335 }
336
337 /* If we're just listening, stop here */
338 if (listen && s->state == SSL3_ST_SW_SRVR_HELLO_A) {
339 ret = 2;
340 s->d1->listen = 0;
341 /*
342 * Set expected sequence numbers to continue the handshake.
343 */
344 s->d1->handshake_read_seq = 2;
345 s->d1->handshake_write_seq = 1;
346 s->d1->next_handshake_write_seq = 1;
347 goto end;
348 }
349
350 break;
351
352 case DTLS1_ST_SW_HELLO_VERIFY_REQUEST_A:
353 case DTLS1_ST_SW_HELLO_VERIFY_REQUEST_B:
354
355 ret = dtls1_send_hello_verify_request(s);
356 if (ret <= 0)
357 goto end;
358 s->state = SSL3_ST_SW_FLUSH;
359 s->s3->tmp.next_state = SSL3_ST_SR_CLNT_HELLO_A;
360
361 /* HelloVerifyRequest resets Finished MAC */
362 if (s->version != DTLS1_BAD_VER)
363 ssl3_init_finished_mac(s);
364 break;
365
7e159e01 366#ifndef OPENSSL_NO_SCTP
0f113f3e
MC
367 case DTLS1_SCTP_ST_SR_READ_SOCK:
368
369 if (BIO_dgram_sctp_msg_waiting(SSL_get_rbio(s))) {
370 s->s3->in_read_app_data = 2;
371 s->rwstate = SSL_READING;
372 BIO_clear_retry_flags(SSL_get_rbio(s));
373 BIO_set_retry_read(SSL_get_rbio(s));
374 ret = -1;
375 goto end;
376 }
377
378 s->state = SSL3_ST_SR_FINISHED_A;
379 break;
380
381 case DTLS1_SCTP_ST_SW_WRITE_SOCK:
382 ret = BIO_dgram_sctp_wait_for_dry(SSL_get_wbio(s));
383 if (ret < 0)
384 goto end;
385
386 if (ret == 0) {
387 if (s->d1->next_state != SSL_ST_OK) {
388 s->s3->in_read_app_data = 2;
389 s->rwstate = SSL_READING;
390 BIO_clear_retry_flags(SSL_get_rbio(s));
391 BIO_set_retry_read(SSL_get_rbio(s));
392 ret = -1;
393 goto end;
394 }
395 }
396
397 s->state = s->d1->next_state;
398 break;
7e159e01
DSH
399#endif
400
0f113f3e
MC
401 case SSL3_ST_SW_SRVR_HELLO_A:
402 case SSL3_ST_SW_SRVR_HELLO_B:
403 s->renegotiate = 2;
404 dtls1_start_timer(s);
405 ret = ssl3_send_server_hello(s);
406 if (ret <= 0)
407 goto end;
36d16f8e 408
0f113f3e 409 if (s->hit) {
7e159e01 410#ifndef OPENSSL_NO_SCTP
0f113f3e
MC
411 /*
412 * Add new shared key for SCTP-Auth, will be ignored if no
413 * SCTP used.
414 */
415 snprintf((char *)labelbuffer, sizeof(DTLS1_SCTP_AUTH_LABEL),
416 DTLS1_SCTP_AUTH_LABEL);
417
418 SSL_export_keying_material(s, sctpauthkey,
419 sizeof(sctpauthkey), labelbuffer,
420 sizeof(labelbuffer), NULL, 0, 0);
421
422 BIO_ctrl(SSL_get_wbio(s), BIO_CTRL_DGRAM_SCTP_ADD_AUTH_KEY,
7e159e01
DSH
423 sizeof(sctpauthkey), sctpauthkey);
424#endif
425#ifndef OPENSSL_NO_TLSEXT
0f113f3e
MC
426 if (s->tlsext_ticket_expected)
427 s->state = SSL3_ST_SW_SESSION_TICKET_A;
428 else
429 s->state = SSL3_ST_SW_CHANGE_A;
8025e251 430#else
0f113f3e 431 s->state = SSL3_ST_SW_CHANGE_A;
8025e251 432#endif
0f113f3e
MC
433 } else
434 s->state = SSL3_ST_SW_CERT_A;
435 s->init_num = 0;
436 break;
437
438 case SSL3_ST_SW_CERT_A:
439 case SSL3_ST_SW_CERT_B:
440 /* Check if it is anon DH or normal PSK */
441 if (!(s->s3->tmp.new_cipher->algorithm_auth & SSL_aNULL)
442 && !(s->s3->tmp.new_cipher->algorithm_mkey & SSL_kPSK)) {
443 dtls1_start_timer(s);
444 ret = ssl3_send_server_certificate(s);
445 if (ret <= 0)
446 goto end;
8025e251 447#ifndef OPENSSL_NO_TLSEXT
0f113f3e
MC
448 if (s->tlsext_status_expected)
449 s->state = SSL3_ST_SW_CERT_STATUS_A;
450 else
451 s->state = SSL3_ST_SW_KEY_EXCH_A;
452 } else {
453 skip = 1;
454 s->state = SSL3_ST_SW_KEY_EXCH_A;
455 }
8025e251 456#else
0f113f3e
MC
457 } else
458 skip = 1;
8025e251 459
0f113f3e 460 s->state = SSL3_ST_SW_KEY_EXCH_A;
8025e251 461#endif
0f113f3e
MC
462 s->init_num = 0;
463 break;
464
465 case SSL3_ST_SW_KEY_EXCH_A:
466 case SSL3_ST_SW_KEY_EXCH_B:
467 alg_k = s->s3->tmp.new_cipher->algorithm_mkey;
468
469 /*
470 * clear this, it may get reset by
471 * send_server_key_exchange
472 */
473 s->s3->tmp.use_rsa_tmp = 0;
474
475 /*
476 * only send if a DH key exchange or RSA but we have a sign only
477 * certificate
478 */
479 if (0
480 /*
481 * PSK: send ServerKeyExchange if PSK identity hint if
482 * provided
483 */
6cf41fec 484#ifndef OPENSSL_NO_PSK
0f113f3e 485 || ((alg_k & SSL_kPSK) && s->ctx->psk_identity_hint)
6cf41fec 486#endif
0f113f3e
MC
487 || (alg_k & (SSL_kDHE | SSL_kDHr | SSL_kDHd))
488 || (alg_k & SSL_kECDHE)
489 || ((alg_k & SSL_kRSA)
490 && (s->cert->pkeys[SSL_PKEY_RSA_ENC].privatekey == NULL
491 || (SSL_C_IS_EXPORT(s->s3->tmp.new_cipher)
739a5eee 492 && EVP_PKEY_size(s->cert->pkeys
0f113f3e
MC
493 [SSL_PKEY_RSA_ENC].privatekey) *
494 8 > SSL_C_EXPORT_PKEYLENGTH(s->s3->tmp.new_cipher)
495 )
496 )
497 )
498 ) {
499 dtls1_start_timer(s);
500 ret = ssl3_send_server_key_exchange(s);
501 if (ret <= 0)
502 goto end;
503 } else
504 skip = 1;
505
506 s->state = SSL3_ST_SW_CERT_REQ_A;
507 s->init_num = 0;
508 break;
509
510 case SSL3_ST_SW_CERT_REQ_A:
511 case SSL3_ST_SW_CERT_REQ_B:
512 if ( /* don't request cert unless asked for it: */
513 !(s->verify_mode & SSL_VERIFY_PEER) ||
514 /*
515 * if SSL_VERIFY_CLIENT_ONCE is set, don't request cert
516 * during re-negotiation:
517 */
518 ((s->session->peer != NULL) &&
519 (s->verify_mode & SSL_VERIFY_CLIENT_ONCE)) ||
520 /*
521 * never request cert in anonymous ciphersuites (see
522 * section "Certificate request" in SSL 3 drafts and in
523 * RFC 2246):
524 */
525 ((s->s3->tmp.new_cipher->algorithm_auth & SSL_aNULL) &&
526 /*
527 * ... except when the application insists on
528 * verification (against the specs, but s3_clnt.c accepts
529 * this for SSL 3)
530 */
531 !(s->verify_mode & SSL_VERIFY_FAIL_IF_NO_PEER_CERT)) ||
532 /*
533 * never request cert in Kerberos ciphersuites
534 */
535 (s->s3->tmp.new_cipher->algorithm_auth & SSL_aKRB5)
536 /*
537 * With normal PSK Certificates and Certificate Requests
538 * are omitted
539 */
540 || (s->s3->tmp.new_cipher->algorithm_mkey & SSL_kPSK)) {
541 /* no cert request */
542 skip = 1;
543 s->s3->tmp.cert_request = 0;
544 s->state = SSL3_ST_SW_SRVR_DONE_A;
7e159e01 545#ifndef OPENSSL_NO_SCTP
0f113f3e
MC
546 if (BIO_dgram_is_sctp(SSL_get_wbio(s))) {
547 s->d1->next_state = SSL3_ST_SW_SRVR_DONE_A;
548 s->state = DTLS1_SCTP_ST_SW_WRITE_SOCK;
549 }
7e159e01 550#endif
0f113f3e
MC
551 } else {
552 s->s3->tmp.cert_request = 1;
553 dtls1_start_timer(s);
554 ret = ssl3_send_certificate_request(s);
555 if (ret <= 0)
556 goto end;
0f113f3e
MC
557 s->state = SSL3_ST_SW_SRVR_DONE_A;
558# ifndef OPENSSL_NO_SCTP
559 if (BIO_dgram_is_sctp(SSL_get_wbio(s))) {
560 s->d1->next_state = SSL3_ST_SW_SRVR_DONE_A;
561 s->state = DTLS1_SCTP_ST_SW_WRITE_SOCK;
562 }
563# endif
0f113f3e
MC
564 s->init_num = 0;
565 }
566 break;
567
568 case SSL3_ST_SW_SRVR_DONE_A:
569 case SSL3_ST_SW_SRVR_DONE_B:
570 dtls1_start_timer(s);
571 ret = ssl3_send_server_done(s);
572 if (ret <= 0)
573 goto end;
574 s->s3->tmp.next_state = SSL3_ST_SR_CERT_A;
575 s->state = SSL3_ST_SW_FLUSH;
576 s->init_num = 0;
577 break;
578
579 case SSL3_ST_SW_FLUSH:
580 s->rwstate = SSL_WRITING;
581 if (BIO_flush(s->wbio) <= 0) {
582 /*
583 * If the write error was fatal, stop trying
584 */
585 if (!BIO_should_retry(s->wbio)) {
586 s->rwstate = SSL_NOTHING;
587 s->state = s->s3->tmp.next_state;
588 }
589
590 ret = -1;
591 goto end;
592 }
593 s->rwstate = SSL_NOTHING;
594 s->state = s->s3->tmp.next_state;
595 break;
596
597 case SSL3_ST_SR_CERT_A:
598 case SSL3_ST_SR_CERT_B:
599 if (s->s3->tmp.cert_request) {
600 ret = ssl3_get_client_certificate(s);
601 if (ret <= 0)
602 goto end;
603 }
604 s->init_num = 0;
605 s->state = SSL3_ST_SR_KEY_EXCH_A;
606 break;
607
608 case SSL3_ST_SR_KEY_EXCH_A:
609 case SSL3_ST_SR_KEY_EXCH_B:
610 ret = ssl3_get_client_key_exchange(s);
611 if (ret <= 0)
612 goto end;
7e159e01 613#ifndef OPENSSL_NO_SCTP
0f113f3e
MC
614 /*
615 * Add new shared key for SCTP-Auth, will be ignored if no SCTP
616 * used.
617 */
618 snprintf((char *)labelbuffer, sizeof(DTLS1_SCTP_AUTH_LABEL),
619 DTLS1_SCTP_AUTH_LABEL);
620
621 SSL_export_keying_material(s, sctpauthkey,
622 sizeof(sctpauthkey), labelbuffer,
623 sizeof(labelbuffer), NULL, 0, 0);
624
625 BIO_ctrl(SSL_get_wbio(s), BIO_CTRL_DGRAM_SCTP_ADD_AUTH_KEY,
626 sizeof(sctpauthkey), sctpauthkey);
7e159e01
DSH
627#endif
628
0f113f3e
MC
629 s->state = SSL3_ST_SR_CERT_VRFY_A;
630 s->init_num = 0;
631
632 if (ret == 2) {
633 /*
634 * For the ECDH ciphersuites when the client sends its ECDH
635 * pub key in a certificate, the CertificateVerify message is
636 * not sent.
637 */
638 s->state = SSL3_ST_SR_FINISHED_A;
639 s->init_num = 0;
640 } else if (SSL_USE_SIGALGS(s)) {
641 s->state = SSL3_ST_SR_CERT_VRFY_A;
642 s->init_num = 0;
643 if (!s->session->peer)
644 break;
0f113f3e
MC
645 if (!s->s3->handshake_buffer) {
646 SSLerr(SSL_F_DTLS1_ACCEPT, ERR_R_INTERNAL_ERROR);
647 return -1;
648 }
0cfb0e75
DSH
649 /*
650 * For sigalgs freeze the handshake buffer. If we support
651 * extms we've done this already.
652 */
653 if (!(s->s3->flags & SSL_SESS_FLAG_EXTMS)) {
654 s->s3->flags |= TLS1_FLAGS_KEEP_HANDSHAKE;
655 if (!ssl3_digest_cached_records(s))
656 return -1;
657 }
0f113f3e
MC
658 } else {
659 s->state = SSL3_ST_SR_CERT_VRFY_A;
660 s->init_num = 0;
661
662 /*
663 * We need to get hashes here so if there is a client cert,
664 * it can be verified
665 */
666 s->method->ssl3_enc->cert_verify_mac(s,
667 NID_md5,
668 &(s->s3->
669 tmp.cert_verify_md
670 [0]));
671 s->method->ssl3_enc->cert_verify_mac(s, NID_sha1,
672 &(s->s3->
673 tmp.cert_verify_md
674 [MD5_DIGEST_LENGTH]));
675 }
676 break;
677
678 case SSL3_ST_SR_CERT_VRFY_A:
679 case SSL3_ST_SR_CERT_VRFY_B:
680 /*
681 * This *should* be the first time we enable CCS, but be
682 * extra careful about surrounding code changes. We need
683 * to set this here because we don't know if we're
684 * expecting a CertificateVerify or not.
685 */
686 if (!s->s3->change_cipher_spec)
687 s->d1->change_cipher_spec_ok = 1;
688 /* we should decide if we expected this one */
689 ret = ssl3_get_cert_verify(s);
690 if (ret <= 0)
691 goto end;
7e159e01 692#ifndef OPENSSL_NO_SCTP
0f113f3e
MC
693 if (BIO_dgram_is_sctp(SSL_get_wbio(s)) &&
694 state == SSL_ST_RENEGOTIATE)
695 s->state = DTLS1_SCTP_ST_SR_READ_SOCK;
696 else
697#endif
698 s->state = SSL3_ST_SR_FINISHED_A;
699 s->init_num = 0;
700 break;
701
702 case SSL3_ST_SR_FINISHED_A:
703 case SSL3_ST_SR_FINISHED_B:
704 /*
705 * Enable CCS for resumed handshakes.
706 * In a full handshake, we end up here through
707 * SSL3_ST_SR_CERT_VRFY_B, so change_cipher_spec_ok was
708 * already set. Receiving a CCS clears the flag, so make
709 * sure not to re-enable it to ban duplicates.
710 * s->s3->change_cipher_spec is set when a CCS is
711 * processed in d1_pkt.c, and remains set until
712 * the client's Finished message is read.
713 */
714 if (!s->s3->change_cipher_spec)
715 s->d1->change_cipher_spec_ok = 1;
716 ret = ssl3_get_finished(s, SSL3_ST_SR_FINISHED_A,
717 SSL3_ST_SR_FINISHED_B);
718 if (ret <= 0)
719 goto end;
720 dtls1_stop_timer(s);
721 if (s->hit)
722 s->state = SSL_ST_OK;
8025e251 723#ifndef OPENSSL_NO_TLSEXT
0f113f3e
MC
724 else if (s->tlsext_ticket_expected)
725 s->state = SSL3_ST_SW_SESSION_TICKET_A;
8025e251 726#endif
0f113f3e
MC
727 else
728 s->state = SSL3_ST_SW_CHANGE_A;
729 s->init_num = 0;
730 break;
36d16f8e 731
8025e251 732#ifndef OPENSSL_NO_TLSEXT
0f113f3e
MC
733 case SSL3_ST_SW_SESSION_TICKET_A:
734 case SSL3_ST_SW_SESSION_TICKET_B:
735 ret = ssl3_send_newsession_ticket(s);
736 if (ret <= 0)
737 goto end;
738 s->state = SSL3_ST_SW_CHANGE_A;
739 s->init_num = 0;
740 break;
741
742 case SSL3_ST_SW_CERT_STATUS_A:
743 case SSL3_ST_SW_CERT_STATUS_B:
744 ret = ssl3_send_cert_status(s);
745 if (ret <= 0)
746 goto end;
747 s->state = SSL3_ST_SW_KEY_EXCH_A;
748 s->init_num = 0;
749 break;
8025e251
DSH
750
751#endif
752
0f113f3e
MC
753 case SSL3_ST_SW_CHANGE_A:
754 case SSL3_ST_SW_CHANGE_B:
36d16f8e 755
0f113f3e
MC
756 s->session->cipher = s->s3->tmp.new_cipher;
757 if (!s->method->ssl3_enc->setup_key_block(s)) {
758 ret = -1;
759 goto end;
760 }
36d16f8e 761
0f113f3e
MC
762 ret = dtls1_send_change_cipher_spec(s,
763 SSL3_ST_SW_CHANGE_A,
764 SSL3_ST_SW_CHANGE_B);
36d16f8e 765
0f113f3e
MC
766 if (ret <= 0)
767 goto end;
7e159e01
DSH
768
769#ifndef OPENSSL_NO_SCTP
0f113f3e
MC
770 if (!s->hit) {
771 /*
772 * Change to new shared key of SCTP-Auth, will be ignored if
773 * no SCTP used.
774 */
775 BIO_ctrl(SSL_get_wbio(s), BIO_CTRL_DGRAM_SCTP_NEXT_AUTH_KEY,
776 0, NULL);
777 }
7e159e01
DSH
778#endif
779
0f113f3e
MC
780 s->state = SSL3_ST_SW_FINISHED_A;
781 s->init_num = 0;
782
783 if (!s->method->ssl3_enc->change_cipher_state(s,
784 SSL3_CHANGE_CIPHER_SERVER_WRITE))
785 {
786 ret = -1;
787 goto end;
788 }
789
790 dtls1_reset_seq_numbers(s, SSL3_CC_WRITE);
791 break;
792
793 case SSL3_ST_SW_FINISHED_A:
794 case SSL3_ST_SW_FINISHED_B:
795 ret = ssl3_send_finished(s,
796 SSL3_ST_SW_FINISHED_A,
797 SSL3_ST_SW_FINISHED_B,
798 s->method->
799 ssl3_enc->server_finished_label,
800 s->method->
801 ssl3_enc->server_finished_label_len);
802 if (ret <= 0)
803 goto end;
804 s->state = SSL3_ST_SW_FLUSH;
805 if (s->hit) {
806 s->s3->tmp.next_state = SSL3_ST_SR_FINISHED_A;
b9ef52b0
RS
807
808#ifndef OPENSSL_NO_SCTP
0f113f3e
MC
809 /*
810 * Change to new shared key of SCTP-Auth, will be ignored if
811 * no SCTP used.
812 */
813 BIO_ctrl(SSL_get_wbio(s), BIO_CTRL_DGRAM_SCTP_NEXT_AUTH_KEY,
814 0, NULL);
b9ef52b0 815#endif
0f113f3e
MC
816 } else {
817 s->s3->tmp.next_state = SSL_ST_OK;
7e159e01 818#ifndef OPENSSL_NO_SCTP
0f113f3e
MC
819 if (BIO_dgram_is_sctp(SSL_get_wbio(s))) {
820 s->d1->next_state = s->s3->tmp.next_state;
821 s->s3->tmp.next_state = DTLS1_SCTP_ST_SW_WRITE_SOCK;
822 }
7e159e01 823#endif
0f113f3e
MC
824 }
825 s->init_num = 0;
826 break;
36d16f8e 827
0f113f3e
MC
828 case SSL_ST_OK:
829 /* clean a few things up */
830 ssl3_cleanup_key_block(s);
36d16f8e 831
0f113f3e
MC
832 /* remove buffering on output */
833 ssl_free_wbio_buffer(s);
834
835 s->init_num = 0;
836
837 if (s->renegotiate == 2) { /* skipped if we just sent a
838 * HelloRequest */
839 s->renegotiate = 0;
840 s->new_session = 0;
841
842 ssl_update_cache(s, SSL_SESS_CACHE_SERVER);
843
844 s->ctx->stats.sess_accept_good++;
845 /* s->server=1; */
846 s->handshake_func = dtls1_accept;
847
848 if (cb != NULL)
849 cb(s, SSL_CB_HANDSHAKE_DONE, 1);
850 }
851
852 ret = 1;
853
854 /* done handshaking, next message is client hello */
855 s->d1->handshake_read_seq = 0;
856 /* next message is server hello */
857 s->d1->handshake_write_seq = 0;
858 s->d1->next_handshake_write_seq = 0;
859 goto end;
860 /* break; */
861
862 default:
863 SSLerr(SSL_F_DTLS1_ACCEPT, SSL_R_UNKNOWN_STATE);
864 ret = -1;
865 goto end;
866 /* break; */
867 }
868
869 if (!s->s3->tmp.reuse_message && !skip) {
870 if (s->debug) {
871 if ((ret = BIO_flush(s->wbio)) <= 0)
872 goto end;
873 }
874
875 if ((cb != NULL) && (s->state != state)) {
876 new_state = s->state;
877 s->state = state;
878 cb(s, SSL_CB_ACCEPT_LOOP, 1);
879 s->state = new_state;
880 }
881 }
882 skip = 0;
883 }
884 end:
885 /* BIO_flush(s->wbio); */
886
887 s->in_handshake--;
7e159e01 888#ifndef OPENSSL_NO_SCTP
0f113f3e
MC
889 /*
890 * Notify SCTP BIO socket to leave handshake mode and prevent stream
891 * identifier other than 0. Will be ignored if no SCTP is used.
892 */
893 BIO_ctrl(SSL_get_wbio(s), BIO_CTRL_DGRAM_SCTP_SET_IN_HANDSHAKE,
894 s->in_handshake, NULL);
7e159e01
DSH
895#endif
896
0f113f3e
MC
897 if (cb != NULL)
898 cb(s, SSL_CB_ACCEPT_EXIT, ret);
899 return (ret);
900}
36d16f8e 901
36d16f8e 902int dtls1_send_hello_verify_request(SSL *s)
0f113f3e
MC
903{
904 unsigned int msg_len;
905 unsigned char *msg, *buf, *p;
906
907 if (s->state == DTLS1_ST_SW_HELLO_VERIFY_REQUEST_A) {
908 buf = (unsigned char *)s->init_buf->data;
909
910 msg = p = &(buf[DTLS1_HM_HEADER_LENGTH]);
911 /* Always use DTLS 1.0 version: see RFC 6347 */
912 *(p++) = DTLS1_VERSION >> 8;
913 *(p++) = DTLS1_VERSION & 0xFF;
914
915 if (s->ctx->app_gen_cookie_cb == NULL ||
916 s->ctx->app_gen_cookie_cb(s, s->d1->cookie,
917 &(s->d1->cookie_len)) == 0) {
918 SSLerr(SSL_F_DTLS1_SEND_HELLO_VERIFY_REQUEST,
919 ERR_R_INTERNAL_ERROR);
920 return 0;
921 }
922
923 *(p++) = (unsigned char)s->d1->cookie_len;
924 memcpy(p, s->d1->cookie, s->d1->cookie_len);
925 p += s->d1->cookie_len;
926 msg_len = p - msg;
927
928 dtls1_set_message_header(s, buf,
929 DTLS1_MT_HELLO_VERIFY_REQUEST, msg_len, 0,
930 msg_len);
931
932 s->state = DTLS1_ST_SW_HELLO_VERIFY_REQUEST_B;
933 /* number of bytes to write */
934 s->init_num = p - buf;
935 s->init_off = 0;
936 }
937
938 /* s->state = DTLS1_ST_SW_HELLO_VERIFY_REQUEST_B */
939 return (dtls1_do_write(s, SSL3_RT_HANDSHAKE));
940}