The data contained in this repository can be downloaded to your computer using one of several clients.
Please see the documentation of your version control software client for more information.

Please select the desired protocol below to get the URL.

This URL has Read-Only access.

Statistics
| Branch: | Revision:

main_repo / deps / openssl / openssl / ssl / d1_srvr.c @ aa3b4b4d

History | View | Annotate | Download (44.2 KB)

1
/* ssl/d1_srvr.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
#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>
124
#include <openssl/bn.h>
125
#ifndef OPENSSL_NO_DH
126
#include <openssl/dh.h>
127
#endif
128

    
129
static const SSL_METHOD *dtls1_get_server_method(int ver);
130
static int dtls1_send_hello_verify_request(SSL *s);
131

    
132
static const SSL_METHOD *dtls1_get_server_method(int ver)
133
        {
134
        if (ver == DTLS1_VERSION)
135
                return(DTLSv1_server_method());
136
        else
137
                return(NULL);
138
        }
139

    
140
IMPLEMENT_dtls1_meth_func(DTLSv1_server_method,
141
                        dtls1_accept,
142
                        ssl_undefined_function,
143
                        dtls1_get_server_method)
144

    
145
int dtls1_accept(SSL *s)
146
        {
147
        BUF_MEM *buf;
148
        unsigned long Time=(unsigned long)time(NULL);
149
        void (*cb)(const SSL *ssl,int type,int val)=NULL;
150
        unsigned long alg_k;
151
        int ret= -1;
152
        int new_state,state,skip=0;
153
        int listen;
154
#ifndef OPENSSL_NO_SCTP
155
        unsigned char sctpauthkey[64];
156
        char labelbuffer[sizeof(DTLS1_SCTP_AUTH_LABEL)];
157
#endif
158

    
159
        RAND_add(&Time,sizeof(Time),0);
160
        ERR_clear_error();
161
        clear_sys_error();
162

    
163
        if (s->info_callback != NULL)
164
                cb=s->info_callback;
165
        else if (s->ctx->info_callback != NULL)
166
                cb=s->ctx->info_callback;
167
        
168
        listen = s->d1->listen;
169

    
170
        /* init things to blank */
171
        s->in_handshake++;
172
        if (!SSL_in_init(s) || SSL_in_before(s)) SSL_clear(s);
173

    
174
        s->d1->listen = listen;
175
#ifndef OPENSSL_NO_SCTP
176
        /* Notify SCTP BIO socket to enter handshake
177
         * mode and prevent stream identifier other
178
         * than 0. Will be ignored if no SCTP is used.
179
         */
180
        BIO_ctrl(SSL_get_wbio(s), BIO_CTRL_DGRAM_SCTP_SET_IN_HANDSHAKE, s->in_handshake, NULL);
181
#endif
182

    
183
        if (s->cert == NULL)
184
                {
185
                SSLerr(SSL_F_DTLS1_ACCEPT,SSL_R_NO_CERTIFICATE_SET);
186
                return(-1);
187
                }
188

    
189
#ifndef OPENSSL_NO_HEARTBEATS
190
        /* If we're awaiting a HeartbeatResponse, pretend we
191
         * already got and don't await it anymore, because
192
         * Heartbeats don't make sense during handshakes anyway.
193
         */
194
        if (s->tlsext_hb_pending)
195
                {
196
                dtls1_stop_timer(s);
197
                s->tlsext_hb_pending = 0;
198
                s->tlsext_hb_seq++;
199
                }
200
#endif
201

    
202
        for (;;)
203
                {
204
                state=s->state;
205

    
206
                switch (s->state)
207
                        {
208
                case SSL_ST_RENEGOTIATE:
209
                        s->renegotiate=1;
210
                        /* s->state=SSL_ST_ACCEPT; */
211

    
212
                case SSL_ST_BEFORE:
213
                case SSL_ST_ACCEPT:
214
                case SSL_ST_BEFORE|SSL_ST_ACCEPT:
215
                case SSL_ST_OK|SSL_ST_ACCEPT:
216

    
217
                        s->server=1;
218
                        if (cb != NULL) cb(s,SSL_CB_HANDSHAKE_START,1);
219

    
220
                        if ((s->version & 0xff00) != (DTLS1_VERSION & 0xff00))
221
                                {
222
                                SSLerr(SSL_F_DTLS1_ACCEPT, ERR_R_INTERNAL_ERROR);
223
                                return -1;
224
                                }
225
                        s->type=SSL_ST_ACCEPT;
226

    
227
                        if (s->init_buf == NULL)
228
                                {
229
                                if ((buf=BUF_MEM_new()) == NULL)
230
                                        {
231
                                        ret= -1;
232
                                        goto end;
233
                                        }
234
                                if (!BUF_MEM_grow(buf,SSL3_RT_MAX_PLAIN_LENGTH))
235
                                        {
236
                                        ret= -1;
237
                                        goto end;
238
                                        }
239
                                s->init_buf=buf;
240
                                }
241

    
242
                        if (!ssl3_setup_buffers(s))
243
                                {
244
                                ret= -1;
245
                                goto end;
246
                                }
247

    
248
                        s->init_num=0;
249

    
250
                        if (s->state != SSL_ST_RENEGOTIATE)
251
                                {
252
                                /* Ok, we now need to push on a buffering BIO so that
253
                                 * the output is sent in a way that TCP likes :-)
254
                                 * ...but not with SCTP :-)
255
                                 */
256
#ifndef OPENSSL_NO_SCTP
257
                                if (!BIO_dgram_is_sctp(SSL_get_wbio(s)))
258
#endif
259
                                        if (!ssl_init_wbio_buffer(s,1)) { ret= -1; goto end; }
260

    
261
                                ssl3_init_finished_mac(s);
262
                                s->state=SSL3_ST_SR_CLNT_HELLO_A;
263
                                s->ctx->stats.sess_accept++;
264
                                }
265
                        else
266
                                {
267
                                /* s->state == SSL_ST_RENEGOTIATE,
268
                                 * we will just send a HelloRequest */
269
                                s->ctx->stats.sess_accept_renegotiate++;
270
                                s->state=SSL3_ST_SW_HELLO_REQ_A;
271
                                }
272

    
273
                        break;
274

    
275
                case SSL3_ST_SW_HELLO_REQ_A:
276
                case SSL3_ST_SW_HELLO_REQ_B:
277

    
278
                        s->shutdown=0;
279
                        dtls1_clear_record_buffer(s);
280
                        dtls1_start_timer(s);
281
                        ret=dtls1_send_hello_request(s);
282
                        if (ret <= 0) goto end;
283
                        s->s3->tmp.next_state=SSL3_ST_SR_CLNT_HELLO_A;
284
                        s->state=SSL3_ST_SW_FLUSH;
285
                        s->init_num=0;
286

    
287
                        ssl3_init_finished_mac(s);
288
                        break;
289

    
290
                case SSL3_ST_SW_HELLO_REQ_C:
291
                        s->state=SSL_ST_OK;
292
                        break;
293

    
294
                case SSL3_ST_SR_CLNT_HELLO_A:
295
                case SSL3_ST_SR_CLNT_HELLO_B:
296
                case SSL3_ST_SR_CLNT_HELLO_C:
297

    
298
                        s->shutdown=0;
299
                        ret=ssl3_get_client_hello(s);
300
                        if (ret <= 0) goto end;
301
                        dtls1_stop_timer(s);
302

    
303
                        if (ret == 1 && (SSL_get_options(s) & SSL_OP_COOKIE_EXCHANGE))
304
                                s->state = DTLS1_ST_SW_HELLO_VERIFY_REQUEST_A;
305
                        else
306
                                s->state = SSL3_ST_SW_SRVR_HELLO_A;
307

    
308
                        s->init_num=0;
309

    
310
                        /* Reflect ClientHello sequence to remain stateless while listening */
311
                        if (listen)
312
                                {
313
                                memcpy(s->s3->write_sequence, s->s3->read_sequence, sizeof(s->s3->write_sequence));
314
                                }
315

    
316
                        /* If we're just listening, stop here */
317
                        if (listen && s->state == SSL3_ST_SW_SRVR_HELLO_A)
318
                                {
319
                                ret = 2;
320
                                s->d1->listen = 0;
321
                                /* Set expected sequence numbers
322
                                 * to continue the handshake.
323
                                 */
324
                                s->d1->handshake_read_seq = 2;
325
                                s->d1->handshake_write_seq = 1;
326
                                s->d1->next_handshake_write_seq = 1;
327
                                goto end;
328
                                }
329
                        
330
                        break;
331
                        
332
                case DTLS1_ST_SW_HELLO_VERIFY_REQUEST_A:
333
                case DTLS1_ST_SW_HELLO_VERIFY_REQUEST_B:
334

    
335
                        ret = dtls1_send_hello_verify_request(s);
336
                        if ( ret <= 0) goto end;
337
                        s->state=SSL3_ST_SW_FLUSH;
338
                        s->s3->tmp.next_state=SSL3_ST_SR_CLNT_HELLO_A;
339

    
340
                        /* HelloVerifyRequest resets Finished MAC */
341
                        if (s->version != DTLS1_BAD_VER)
342
                                ssl3_init_finished_mac(s);
343
                        break;
344
                        
345
#ifndef OPENSSL_NO_SCTP
346
                case DTLS1_SCTP_ST_SR_READ_SOCK:
347
                        
348
                        if (BIO_dgram_sctp_msg_waiting(SSL_get_rbio(s)))                
349
                                {
350
                                s->s3->in_read_app_data=2;
351
                                s->rwstate=SSL_READING;
352
                                BIO_clear_retry_flags(SSL_get_rbio(s));
353
                                BIO_set_retry_read(SSL_get_rbio(s));
354
                                ret = -1;
355
                                goto end;
356
                                }
357
                        
358
                        s->state=SSL3_ST_SR_FINISHED_A;
359
                        break;
360
                        
361
                case DTLS1_SCTP_ST_SW_WRITE_SOCK:
362
                        ret = BIO_dgram_sctp_wait_for_dry(SSL_get_wbio(s));
363
                        if (ret < 0) goto end;
364
                        
365
                        if (ret == 0)
366
                                {
367
                                if (s->d1->next_state != SSL_ST_OK)
368
                                        {
369
                                        s->s3->in_read_app_data=2;
370
                                        s->rwstate=SSL_READING;
371
                                        BIO_clear_retry_flags(SSL_get_rbio(s));
372
                                        BIO_set_retry_read(SSL_get_rbio(s));
373
                                        ret = -1;
374
                                        goto end;
375
                                        }
376
                                }
377

    
378
                        s->state=s->d1->next_state;
379
                        break;
380
#endif
381

    
382
                case SSL3_ST_SW_SRVR_HELLO_A:
383
                case SSL3_ST_SW_SRVR_HELLO_B:
384
                        s->renegotiate = 2;
385
                        dtls1_start_timer(s);
386
                        ret=dtls1_send_server_hello(s);
387
                        if (ret <= 0) goto end;
388

    
389
                        if (s->hit)
390
                                {
391
#ifndef OPENSSL_NO_SCTP
392
                                /* Add new shared key for SCTP-Auth,
393
                                 * will be ignored if no SCTP used.
394
                                 */
395
                                snprintf((char*) labelbuffer, sizeof(DTLS1_SCTP_AUTH_LABEL),
396
                                         DTLS1_SCTP_AUTH_LABEL);
397

    
398
                                SSL_export_keying_material(s, sctpauthkey,
399
                                                           sizeof(sctpauthkey), labelbuffer,
400
                                                           sizeof(labelbuffer), NULL, 0, 0);
401
                                
402
                                BIO_ctrl(SSL_get_wbio(s), BIO_CTRL_DGRAM_SCTP_ADD_AUTH_KEY,
403
                         sizeof(sctpauthkey), sctpauthkey);
404
#endif
405
#ifndef OPENSSL_NO_TLSEXT
406
                                if (s->tlsext_ticket_expected)
407
                                        s->state=SSL3_ST_SW_SESSION_TICKET_A;
408
                                else
409
                                        s->state=SSL3_ST_SW_CHANGE_A;
410
#else
411
                                s->state=SSL3_ST_SW_CHANGE_A;
412
#endif
413
                                }
414
                        else
415
                                s->state=SSL3_ST_SW_CERT_A;
416
                        s->init_num=0;
417
                        break;
418

    
419
                case SSL3_ST_SW_CERT_A:
420
                case SSL3_ST_SW_CERT_B:
421
                        /* Check if it is anon DH or normal PSK */
422
                        if (!(s->s3->tmp.new_cipher->algorithm_auth & SSL_aNULL)
423
                                && !(s->s3->tmp.new_cipher->algorithm_mkey & SSL_kPSK))
424
                                {
425
                                dtls1_start_timer(s);
426
                                ret=dtls1_send_server_certificate(s);
427
                                if (ret <= 0) goto end;
428
#ifndef OPENSSL_NO_TLSEXT
429
                                if (s->tlsext_status_expected)
430
                                        s->state=SSL3_ST_SW_CERT_STATUS_A;
431
                                else
432
                                        s->state=SSL3_ST_SW_KEY_EXCH_A;
433
                                }
434
                        else
435
                                {
436
                                skip = 1;
437
                                s->state=SSL3_ST_SW_KEY_EXCH_A;
438
                                }
439
#else
440
                                }
441
                        else
442
                                skip=1;
443

    
444
                        s->state=SSL3_ST_SW_KEY_EXCH_A;
445
#endif
446
                        s->init_num=0;
447
                        break;
448

    
449
                case SSL3_ST_SW_KEY_EXCH_A:
450
                case SSL3_ST_SW_KEY_EXCH_B:
451
                        alg_k = s->s3->tmp.new_cipher->algorithm_mkey;
452

    
453
                        /* clear this, it may get reset by
454
                         * send_server_key_exchange */
455
                        if ((s->options & SSL_OP_EPHEMERAL_RSA)
456
#ifndef OPENSSL_NO_KRB5
457
                                && !(alg_k & SSL_kKRB5)
458
#endif /* OPENSSL_NO_KRB5 */
459
                                )
460
                                /* option SSL_OP_EPHEMERAL_RSA sends temporary RSA key
461
                                 * even when forbidden by protocol specs
462
                                 * (handshake may fail as clients are not required to
463
                                 * be able to handle this) */
464
                                s->s3->tmp.use_rsa_tmp=1;
465
                        else
466
                                s->s3->tmp.use_rsa_tmp=0;
467

    
468
                        /* only send if a DH key exchange or
469
                         * RSA but we have a sign only certificate */
470
                        if (s->s3->tmp.use_rsa_tmp
471
                        /* PSK: send ServerKeyExchange if PSK identity
472
                         * hint if provided */
473
#ifndef OPENSSL_NO_PSK
474
                            || ((alg_k & SSL_kPSK) && s->ctx->psk_identity_hint)
475
#endif
476
                            || (alg_k & (SSL_kEDH|SSL_kDHr|SSL_kDHd))
477
                            || (alg_k & SSL_kEECDH)
478
                            || ((alg_k & SSL_kRSA)
479
                                && (s->cert->pkeys[SSL_PKEY_RSA_ENC].privatekey == NULL
480
                                    || (SSL_C_IS_EXPORT(s->s3->tmp.new_cipher)
481
                                        && EVP_PKEY_size(s->cert->pkeys[SSL_PKEY_RSA_ENC].privatekey)*8 > SSL_C_EXPORT_PKEYLENGTH(s->s3->tmp.new_cipher)
482
                                        )
483
                                    )
484
                                )
485
                            )
486
                                {
487
                                dtls1_start_timer(s);
488
                                ret=dtls1_send_server_key_exchange(s);
489
                                if (ret <= 0) goto end;
490
                                }
491
                        else
492
                                skip=1;
493

    
494
                        s->state=SSL3_ST_SW_CERT_REQ_A;
495
                        s->init_num=0;
496
                        break;
497

    
498
                case SSL3_ST_SW_CERT_REQ_A:
499
                case SSL3_ST_SW_CERT_REQ_B:
500
                        if (/* don't request cert unless asked for it: */
501
                                !(s->verify_mode & SSL_VERIFY_PEER) ||
502
                                /* if SSL_VERIFY_CLIENT_ONCE is set,
503
                                 * don't request cert during re-negotiation: */
504
                                ((s->session->peer != NULL) &&
505
                                 (s->verify_mode & SSL_VERIFY_CLIENT_ONCE)) ||
506
                                /* never request cert in anonymous ciphersuites
507
                                 * (see section "Certificate request" in SSL 3 drafts
508
                                 * and in RFC 2246): */
509
                                ((s->s3->tmp.new_cipher->algorithm_auth & SSL_aNULL) &&
510
                                 /* ... except when the application insists on verification
511
                                  * (against the specs, but s3_clnt.c accepts this for SSL 3) */
512
                                 !(s->verify_mode & SSL_VERIFY_FAIL_IF_NO_PEER_CERT)) ||
513
                                 /* never request cert in Kerberos ciphersuites */
514
                                (s->s3->tmp.new_cipher->algorithm_auth & SSL_aKRB5)
515
                                /* With normal PSK Certificates and
516
                                 * Certificate Requests are omitted */
517
                                || (s->s3->tmp.new_cipher->algorithm_mkey & SSL_kPSK))
518
                                {
519
                                /* no cert request */
520
                                skip=1;
521
                                s->s3->tmp.cert_request=0;
522
                                s->state=SSL3_ST_SW_SRVR_DONE_A;
523
#ifndef OPENSSL_NO_SCTP
524
                                if (BIO_dgram_is_sctp(SSL_get_wbio(s)))
525
                                        {
526
                                        s->d1->next_state = SSL3_ST_SW_SRVR_DONE_A;
527
                                        s->state = DTLS1_SCTP_ST_SW_WRITE_SOCK;
528
                                        }
529
#endif
530
                                }
531
                        else
532
                                {
533
                                s->s3->tmp.cert_request=1;
534
                                dtls1_start_timer(s);
535
                                ret=dtls1_send_certificate_request(s);
536
                                if (ret <= 0) goto end;
537
#ifndef NETSCAPE_HANG_BUG
538
                                s->state=SSL3_ST_SW_SRVR_DONE_A;
539
#ifndef OPENSSL_NO_SCTP
540
                                if (BIO_dgram_is_sctp(SSL_get_wbio(s)))
541
                                        {
542
                                        s->d1->next_state = SSL3_ST_SW_SRVR_DONE_A;
543
                                        s->state = DTLS1_SCTP_ST_SW_WRITE_SOCK;
544
                                        }
545
#endif
546
#else
547
                                s->state=SSL3_ST_SW_FLUSH;
548
                                s->s3->tmp.next_state=SSL3_ST_SR_CERT_A;
549
#ifndef OPENSSL_NO_SCTP
550
                                if (BIO_dgram_is_sctp(SSL_get_wbio(s)))
551
                                        {
552
                                        s->d1->next_state = s->s3->tmp.next_state;
553
                                        s->s3->tmp.next_state=DTLS1_SCTP_ST_SW_WRITE_SOCK;
554
                                        }
555
#endif
556
#endif
557
                                s->init_num=0;
558
                                }
559
                        break;
560

    
561
                case SSL3_ST_SW_SRVR_DONE_A:
562
                case SSL3_ST_SW_SRVR_DONE_B:
563
                        dtls1_start_timer(s);
564
                        ret=dtls1_send_server_done(s);
565
                        if (ret <= 0) goto end;
566
                        s->s3->tmp.next_state=SSL3_ST_SR_CERT_A;
567
                        s->state=SSL3_ST_SW_FLUSH;
568
                        s->init_num=0;
569
                        break;
570
                
571
                case SSL3_ST_SW_FLUSH:
572
                        s->rwstate=SSL_WRITING;
573
                        if (BIO_flush(s->wbio) <= 0)
574
                                {
575
                                /* If the write error was fatal, stop trying */
576
                                if (!BIO_should_retry(s->wbio))
577
                                        {
578
                                        s->rwstate=SSL_NOTHING;
579
                                        s->state=s->s3->tmp.next_state;
580
                                        }
581
                                
582
                                ret= -1;
583
                                goto end;
584
                                }
585
                        s->rwstate=SSL_NOTHING;
586
                        s->state=s->s3->tmp.next_state;
587
                        break;
588

    
589
                case SSL3_ST_SR_CERT_A:
590
                case SSL3_ST_SR_CERT_B:
591
                        /* Check for second client hello (MS SGC) */
592
                        ret = ssl3_check_client_hello(s);
593
                        if (ret <= 0)
594
                                goto end;
595
                        if (ret == 2)
596
                                {
597
                                dtls1_stop_timer(s);
598
                                s->state = SSL3_ST_SR_CLNT_HELLO_C;
599
                                }
600
                        else {
601
                                if (s->s3->tmp.cert_request)
602
                                        {
603
                                        ret=ssl3_get_client_certificate(s);
604
                                        if (ret <= 0) goto end;
605
                                        }
606
                                s->init_num=0;
607
                                s->state=SSL3_ST_SR_KEY_EXCH_A;
608
                        }
609
                        break;
610

    
611
                case SSL3_ST_SR_KEY_EXCH_A:
612
                case SSL3_ST_SR_KEY_EXCH_B:
613
                        ret=ssl3_get_client_key_exchange(s);
614
                        if (ret <= 0) goto end;
615
#ifndef OPENSSL_NO_SCTP
616
                        /* Add new shared key for SCTP-Auth,
617
                         * will be ignored if no SCTP used.
618
                         */
619
                        snprintf((char *) labelbuffer, sizeof(DTLS1_SCTP_AUTH_LABEL),
620
                                 DTLS1_SCTP_AUTH_LABEL);
621

    
622
                        SSL_export_keying_material(s, sctpauthkey,
623
                                                   sizeof(sctpauthkey), labelbuffer,
624
                                                   sizeof(labelbuffer), NULL, 0, 0);
625

    
626
                        BIO_ctrl(SSL_get_wbio(s), BIO_CTRL_DGRAM_SCTP_ADD_AUTH_KEY,
627
                                 sizeof(sctpauthkey), sctpauthkey);
628
#endif
629

    
630
                        s->state=SSL3_ST_SR_CERT_VRFY_A;
631
                        s->init_num=0;
632

    
633
                        if (ret == 2)
634
                                {
635
                                /* For the ECDH ciphersuites when
636
                                 * the client sends its ECDH pub key in
637
                                 * a certificate, the CertificateVerify
638
                                 * message is not sent.
639
                                 */
640
                                s->state=SSL3_ST_SR_FINISHED_A;
641
                                s->init_num = 0;
642
                                }
643
                        else
644
                                {
645
                                s->state=SSL3_ST_SR_CERT_VRFY_A;
646
                                s->init_num=0;
647

    
648
                                /* We need to get hashes here so if there is
649
                                 * a client cert, it can be verified */ 
650
                                s->method->ssl3_enc->cert_verify_mac(s,
651
                                        NID_md5,
652
                                        &(s->s3->tmp.cert_verify_md[0]));
653
                                s->method->ssl3_enc->cert_verify_mac(s,
654
                                        NID_sha1,
655
                                        &(s->s3->tmp.cert_verify_md[MD5_DIGEST_LENGTH]));
656
                                }
657
                        break;
658

    
659
                case SSL3_ST_SR_CERT_VRFY_A:
660
                case SSL3_ST_SR_CERT_VRFY_B:
661

    
662
                        s->d1->change_cipher_spec_ok = 1;
663
                        /* we should decide if we expected this one */
664
                        ret=ssl3_get_cert_verify(s);
665
                        if (ret <= 0) goto end;
666
#ifndef OPENSSL_NO_SCTP
667
                        if (BIO_dgram_is_sctp(SSL_get_wbio(s)) &&
668
                            state == SSL_ST_RENEGOTIATE)
669
                                s->state=DTLS1_SCTP_ST_SR_READ_SOCK;
670
                        else
671
#endif                        
672
                                s->state=SSL3_ST_SR_FINISHED_A;
673
                        s->init_num=0;
674
                        break;
675

    
676
                case SSL3_ST_SR_FINISHED_A:
677
                case SSL3_ST_SR_FINISHED_B:
678
                        s->d1->change_cipher_spec_ok = 1;
679
                        ret=ssl3_get_finished(s,SSL3_ST_SR_FINISHED_A,
680
                                SSL3_ST_SR_FINISHED_B);
681
                        if (ret <= 0) goto end;
682
                        dtls1_stop_timer(s);
683
                        if (s->hit)
684
                                s->state=SSL_ST_OK;
685
#ifndef OPENSSL_NO_TLSEXT
686
                        else if (s->tlsext_ticket_expected)
687
                                s->state=SSL3_ST_SW_SESSION_TICKET_A;
688
#endif
689
                        else
690
                                s->state=SSL3_ST_SW_CHANGE_A;
691
                        s->init_num=0;
692
                        break;
693

    
694
#ifndef OPENSSL_NO_TLSEXT
695
                case SSL3_ST_SW_SESSION_TICKET_A:
696
                case SSL3_ST_SW_SESSION_TICKET_B:
697
                        ret=dtls1_send_newsession_ticket(s);
698
                        if (ret <= 0) goto end;
699
                        s->state=SSL3_ST_SW_CHANGE_A;
700
                        s->init_num=0;
701
                        break;
702

    
703
                case SSL3_ST_SW_CERT_STATUS_A:
704
                case SSL3_ST_SW_CERT_STATUS_B:
705
                        ret=ssl3_send_cert_status(s);
706
                        if (ret <= 0) goto end;
707
                        s->state=SSL3_ST_SW_KEY_EXCH_A;
708
                        s->init_num=0;
709
                        break;
710

    
711
#endif
712

    
713
                case SSL3_ST_SW_CHANGE_A:
714
                case SSL3_ST_SW_CHANGE_B:
715

    
716
                        s->session->cipher=s->s3->tmp.new_cipher;
717
                        if (!s->method->ssl3_enc->setup_key_block(s))
718
                                { ret= -1; goto end; }
719

    
720
                        ret=dtls1_send_change_cipher_spec(s,
721
                                SSL3_ST_SW_CHANGE_A,SSL3_ST_SW_CHANGE_B);
722

    
723
                        if (ret <= 0) goto end;
724

    
725
#ifndef OPENSSL_NO_SCTP
726
                        if (!s->hit)
727
                                {
728
                                /* Change to new shared key of SCTP-Auth,
729
                                 * will be ignored if no SCTP used.
730
                                 */
731
                                BIO_ctrl(SSL_get_wbio(s), BIO_CTRL_DGRAM_SCTP_NEXT_AUTH_KEY, 0, NULL);
732
                                }
733
#endif
734

    
735
                        s->state=SSL3_ST_SW_FINISHED_A;
736
                        s->init_num=0;
737

    
738
                        if (!s->method->ssl3_enc->change_cipher_state(s,
739
                                SSL3_CHANGE_CIPHER_SERVER_WRITE))
740
                                {
741
                                ret= -1;
742
                                goto end;
743
                                }
744

    
745
                        dtls1_reset_seq_numbers(s, SSL3_CC_WRITE);
746
                        break;
747

    
748
                case SSL3_ST_SW_FINISHED_A:
749
                case SSL3_ST_SW_FINISHED_B:
750
                        ret=dtls1_send_finished(s,
751
                                SSL3_ST_SW_FINISHED_A,SSL3_ST_SW_FINISHED_B,
752
                                s->method->ssl3_enc->server_finished_label,
753
                                s->method->ssl3_enc->server_finished_label_len);
754
                        if (ret <= 0) goto end;
755
                        s->state=SSL3_ST_SW_FLUSH;
756
                        if (s->hit)
757
                                {
758
                                s->s3->tmp.next_state=SSL3_ST_SR_FINISHED_A;
759

    
760
#ifndef OPENSSL_NO_SCTP
761
                                /* Change to new shared key of SCTP-Auth,
762
                                 * will be ignored if no SCTP used.
763
                                 */
764
                                BIO_ctrl(SSL_get_wbio(s), BIO_CTRL_DGRAM_SCTP_NEXT_AUTH_KEY, 0, NULL);
765
#endif
766
                                }
767
                        else
768
                                {
769
                                s->s3->tmp.next_state=SSL_ST_OK;
770
#ifndef OPENSSL_NO_SCTP
771
                                if (BIO_dgram_is_sctp(SSL_get_wbio(s)))
772
                                        {
773
                                        s->d1->next_state = s->s3->tmp.next_state;
774
                                        s->s3->tmp.next_state=DTLS1_SCTP_ST_SW_WRITE_SOCK;
775
                                        }
776
#endif
777
                                }
778
                        s->init_num=0;
779
                        break;
780

    
781
                case SSL_ST_OK:
782
                        /* clean a few things up */
783
                        ssl3_cleanup_key_block(s);
784

    
785
#if 0
786
                        BUF_MEM_free(s->init_buf);
787
                        s->init_buf=NULL;
788
#endif
789

    
790
                        /* remove buffering on output */
791
                        ssl_free_wbio_buffer(s);
792

    
793
                        s->init_num=0;
794

    
795
                        if (s->renegotiate == 2) /* skipped if we just sent a HelloRequest */
796
                                {
797
                                s->renegotiate=0;
798
                                s->new_session=0;
799
                                
800
                                ssl_update_cache(s,SSL_SESS_CACHE_SERVER);
801
                                
802
                                s->ctx->stats.sess_accept_good++;
803
                                /* s->server=1; */
804
                                s->handshake_func=dtls1_accept;
805

    
806
                                if (cb != NULL) cb(s,SSL_CB_HANDSHAKE_DONE,1);
807
                                }
808
                        
809
                        ret = 1;
810

    
811
                        /* done handshaking, next message is client hello */
812
                        s->d1->handshake_read_seq = 0;
813
                        /* next message is server hello */
814
                        s->d1->handshake_write_seq = 0;
815
                        s->d1->next_handshake_write_seq = 0;
816
                        goto end;
817
                        /* break; */
818

    
819
                default:
820
                        SSLerr(SSL_F_DTLS1_ACCEPT,SSL_R_UNKNOWN_STATE);
821
                        ret= -1;
822
                        goto end;
823
                        /* break; */
824
                        }
825
                
826
                if (!s->s3->tmp.reuse_message && !skip)
827
                        {
828
                        if (s->debug)
829
                                {
830
                                if ((ret=BIO_flush(s->wbio)) <= 0)
831
                                        goto end;
832
                                }
833

    
834

    
835
                        if ((cb != NULL) && (s->state != state))
836
                                {
837
                                new_state=s->state;
838
                                s->state=state;
839
                                cb(s,SSL_CB_ACCEPT_LOOP,1);
840
                                s->state=new_state;
841
                                }
842
                        }
843
                skip=0;
844
                }
845
end:
846
        /* BIO_flush(s->wbio); */
847

    
848
        s->in_handshake--;
849
#ifndef OPENSSL_NO_SCTP
850
                /* Notify SCTP BIO socket to leave handshake
851
                 * mode and prevent stream identifier other
852
                 * than 0. Will be ignored if no SCTP is used.
853
                 */
854
                BIO_ctrl(SSL_get_wbio(s), BIO_CTRL_DGRAM_SCTP_SET_IN_HANDSHAKE, s->in_handshake, NULL);
855
#endif
856

    
857
        if (cb != NULL)
858
                cb(s,SSL_CB_ACCEPT_EXIT,ret);
859
        return(ret);
860
        }
861

    
862
int dtls1_send_hello_request(SSL *s)
863
        {
864
        unsigned char *p;
865

    
866
        if (s->state == SSL3_ST_SW_HELLO_REQ_A)
867
                {
868
                p=(unsigned char *)s->init_buf->data;
869
                p = dtls1_set_message_header(s, p, SSL3_MT_HELLO_REQUEST, 0, 0, 0);
870

    
871
                s->state=SSL3_ST_SW_HELLO_REQ_B;
872
                /* number of bytes to write */
873
                s->init_num=DTLS1_HM_HEADER_LENGTH;
874
                s->init_off=0;
875

    
876
                /* no need to buffer this message, since there are no retransmit 
877
                 * requests for it */
878
                }
879

    
880
        /* SSL3_ST_SW_HELLO_REQ_B */
881
        return(dtls1_do_write(s,SSL3_RT_HANDSHAKE));
882
        }
883

    
884
int dtls1_send_hello_verify_request(SSL *s)
885
        {
886
        unsigned int msg_len;
887
        unsigned char *msg, *buf, *p;
888

    
889
        if (s->state == DTLS1_ST_SW_HELLO_VERIFY_REQUEST_A)
890
                {
891
                buf = (unsigned char *)s->init_buf->data;
892

    
893
                msg = p = &(buf[DTLS1_HM_HEADER_LENGTH]);
894
                *(p++) = s->version >> 8;
895
                *(p++) = s->version & 0xFF;
896

    
897
                if (s->ctx->app_gen_cookie_cb == NULL ||
898
                     s->ctx->app_gen_cookie_cb(s, s->d1->cookie,
899
                         &(s->d1->cookie_len)) == 0)
900
                        {
901
                        SSLerr(SSL_F_DTLS1_SEND_HELLO_VERIFY_REQUEST,ERR_R_INTERNAL_ERROR);
902
                        return 0;
903
                        }
904

    
905
                *(p++) = (unsigned char) s->d1->cookie_len;
906
                memcpy(p, s->d1->cookie, s->d1->cookie_len);
907
                p += s->d1->cookie_len;
908
                msg_len = p - msg;
909

    
910
                dtls1_set_message_header(s, buf,
911
                        DTLS1_MT_HELLO_VERIFY_REQUEST, msg_len, 0, msg_len);
912

    
913
                s->state=DTLS1_ST_SW_HELLO_VERIFY_REQUEST_B;
914
                /* number of bytes to write */
915
                s->init_num=p-buf;
916
                s->init_off=0;
917
                }
918

    
919
        /* s->state = DTLS1_ST_SW_HELLO_VERIFY_REQUEST_B */
920
        return(dtls1_do_write(s,SSL3_RT_HANDSHAKE));
921
        }
922

    
923
int dtls1_send_server_hello(SSL *s)
924
        {
925
        unsigned char *buf;
926
        unsigned char *p,*d;
927
        int i;
928
        unsigned int sl;
929
        unsigned long l;
930

    
931
        if (s->state == SSL3_ST_SW_SRVR_HELLO_A)
932
                {
933
                buf=(unsigned char *)s->init_buf->data;
934
                p=s->s3->server_random;
935
                ssl_fill_hello_random(s, 1, p, SSL3_RANDOM_SIZE);
936
                /* Do the message type and length last */
937
                d=p= &(buf[DTLS1_HM_HEADER_LENGTH]);
938

    
939
                *(p++)=s->version>>8;
940
                *(p++)=s->version&0xff;
941

    
942
                /* Random stuff */
943
                memcpy(p,s->s3->server_random,SSL3_RANDOM_SIZE);
944
                p+=SSL3_RANDOM_SIZE;
945

    
946
                /* now in theory we have 3 options to sending back the
947
                 * session id.  If it is a re-use, we send back the
948
                 * old session-id, if it is a new session, we send
949
                 * back the new session-id or we send back a 0 length
950
                 * session-id if we want it to be single use.
951
                 * Currently I will not implement the '0' length session-id
952
                 * 12-Jan-98 - I'll now support the '0' length stuff.
953
                 */
954
                if (!(s->ctx->session_cache_mode & SSL_SESS_CACHE_SERVER))
955
                        s->session->session_id_length=0;
956

    
957
                sl=s->session->session_id_length;
958
                if (sl > sizeof s->session->session_id)
959
                        {
960
                        SSLerr(SSL_F_DTLS1_SEND_SERVER_HELLO, ERR_R_INTERNAL_ERROR);
961
                        return -1;
962
                        }
963
                *(p++)=sl;
964
                memcpy(p,s->session->session_id,sl);
965
                p+=sl;
966

    
967
                /* put the cipher */
968
                if (s->s3->tmp.new_cipher == NULL)
969
                        return -1;
970
                i=ssl3_put_cipher_by_char(s->s3->tmp.new_cipher,p);
971
                p+=i;
972

    
973
                /* put the compression method */
974
#ifdef OPENSSL_NO_COMP
975
                *(p++)=0;
976
#else
977
                if (s->s3->tmp.new_compression == NULL)
978
                        *(p++)=0;
979
                else
980
                        *(p++)=s->s3->tmp.new_compression->id;
981
#endif
982

    
983
#ifndef OPENSSL_NO_TLSEXT
984
                if (ssl_prepare_serverhello_tlsext(s) <= 0)
985
                        {
986
                        SSLerr(SSL_F_DTLS1_SEND_SERVER_HELLO,SSL_R_SERVERHELLO_TLSEXT);
987
                        return -1;
988
                        }
989
                if ((p = ssl_add_serverhello_tlsext(s, p, buf+SSL3_RT_MAX_PLAIN_LENGTH)) == NULL)
990
                        {
991
                        SSLerr(SSL_F_DTLS1_SEND_SERVER_HELLO,ERR_R_INTERNAL_ERROR);
992
                        return -1;
993
                        }
994
#endif
995

    
996
                /* do the header */
997
                l=(p-d);
998
                d=buf;
999

    
1000
                d = dtls1_set_message_header(s, d, SSL3_MT_SERVER_HELLO, l, 0, l);
1001

    
1002
                s->state=SSL3_ST_SW_SRVR_HELLO_B;
1003
                /* number of bytes to write */
1004
                s->init_num=p-buf;
1005
                s->init_off=0;
1006

    
1007
                /* buffer the message to handle re-xmits */
1008
                dtls1_buffer_message(s, 0);
1009
                }
1010

    
1011
        /* SSL3_ST_SW_SRVR_HELLO_B */
1012
        return(dtls1_do_write(s,SSL3_RT_HANDSHAKE));
1013
        }
1014

    
1015
int dtls1_send_server_done(SSL *s)
1016
        {
1017
        unsigned char *p;
1018

    
1019
        if (s->state == SSL3_ST_SW_SRVR_DONE_A)
1020
                {
1021
                p=(unsigned char *)s->init_buf->data;
1022

    
1023
                /* do the header */
1024
                p = dtls1_set_message_header(s, p, SSL3_MT_SERVER_DONE, 0, 0, 0);
1025

    
1026
                s->state=SSL3_ST_SW_SRVR_DONE_B;
1027
                /* number of bytes to write */
1028
                s->init_num=DTLS1_HM_HEADER_LENGTH;
1029
                s->init_off=0;
1030

    
1031
                /* buffer the message to handle re-xmits */
1032
                dtls1_buffer_message(s, 0);
1033
                }
1034

    
1035
        /* SSL3_ST_SW_SRVR_DONE_B */
1036
        return(dtls1_do_write(s,SSL3_RT_HANDSHAKE));
1037
        }
1038

    
1039
int dtls1_send_server_key_exchange(SSL *s)
1040
        {
1041
#ifndef OPENSSL_NO_RSA
1042
        unsigned char *q;
1043
        int j,num;
1044
        RSA *rsa;
1045
        unsigned char md_buf[MD5_DIGEST_LENGTH+SHA_DIGEST_LENGTH];
1046
        unsigned int u;
1047
#endif
1048
#ifndef OPENSSL_NO_DH
1049
        DH *dh=NULL,*dhp;
1050
#endif
1051
#ifndef OPENSSL_NO_ECDH
1052
        EC_KEY *ecdh=NULL, *ecdhp;
1053
        unsigned char *encodedPoint = NULL;
1054
        int encodedlen = 0;
1055
        int curve_id = 0;
1056
        BN_CTX *bn_ctx = NULL; 
1057
#endif
1058
        EVP_PKEY *pkey;
1059
        unsigned char *p,*d;
1060
        int al,i;
1061
        unsigned long type;
1062
        int n;
1063
        CERT *cert;
1064
        BIGNUM *r[4];
1065
        int nr[4],kn;
1066
        BUF_MEM *buf;
1067
        EVP_MD_CTX md_ctx;
1068

    
1069
        EVP_MD_CTX_init(&md_ctx);
1070
        if (s->state == SSL3_ST_SW_KEY_EXCH_A)
1071
                {
1072
                type=s->s3->tmp.new_cipher->algorithm_mkey;
1073
                cert=s->cert;
1074

    
1075
                buf=s->init_buf;
1076

    
1077
                r[0]=r[1]=r[2]=r[3]=NULL;
1078
                n=0;
1079
#ifndef OPENSSL_NO_RSA
1080
                if (type & SSL_kRSA)
1081
                        {
1082
                        rsa=cert->rsa_tmp;
1083
                        if ((rsa == NULL) && (s->cert->rsa_tmp_cb != NULL))
1084
                                {
1085
                                rsa=s->cert->rsa_tmp_cb(s,
1086
                                      SSL_C_IS_EXPORT(s->s3->tmp.new_cipher),
1087
                                      SSL_C_EXPORT_PKEYLENGTH(s->s3->tmp.new_cipher));
1088
                                if(rsa == NULL)
1089
                                {
1090
                                        al=SSL_AD_HANDSHAKE_FAILURE;
1091
                                        SSLerr(SSL_F_DTLS1_SEND_SERVER_KEY_EXCHANGE,SSL_R_ERROR_GENERATING_TMP_RSA_KEY);
1092
                                        goto f_err;
1093
                                }
1094
                                RSA_up_ref(rsa);
1095
                                cert->rsa_tmp=rsa;
1096
                                }
1097
                        if (rsa == NULL)
1098
                                {
1099
                                al=SSL_AD_HANDSHAKE_FAILURE;
1100
                                SSLerr(SSL_F_DTLS1_SEND_SERVER_KEY_EXCHANGE,SSL_R_MISSING_TMP_RSA_KEY);
1101
                                goto f_err;
1102
                                }
1103
                        r[0]=rsa->n;
1104
                        r[1]=rsa->e;
1105
                        s->s3->tmp.use_rsa_tmp=1;
1106
                        }
1107
                else
1108
#endif
1109
#ifndef OPENSSL_NO_DH
1110
                        if (type & SSL_kEDH)
1111
                        {
1112
                        dhp=cert->dh_tmp;
1113
                        if ((dhp == NULL) && (s->cert->dh_tmp_cb != NULL))
1114
                                dhp=s->cert->dh_tmp_cb(s,
1115
                                      SSL_C_IS_EXPORT(s->s3->tmp.new_cipher),
1116
                                      SSL_C_EXPORT_PKEYLENGTH(s->s3->tmp.new_cipher));
1117
                        if (dhp == NULL)
1118
                                {
1119
                                al=SSL_AD_HANDSHAKE_FAILURE;
1120
                                SSLerr(SSL_F_DTLS1_SEND_SERVER_KEY_EXCHANGE,SSL_R_MISSING_TMP_DH_KEY);
1121
                                goto f_err;
1122
                                }
1123

    
1124
                        if (s->s3->tmp.dh != NULL)
1125
                                {
1126
                                DH_free(dh);
1127
                                SSLerr(SSL_F_DTLS1_SEND_SERVER_KEY_EXCHANGE, ERR_R_INTERNAL_ERROR);
1128
                                goto err;
1129
                                }
1130

    
1131
                        if ((dh=DHparams_dup(dhp)) == NULL)
1132
                                {
1133
                                SSLerr(SSL_F_DTLS1_SEND_SERVER_KEY_EXCHANGE,ERR_R_DH_LIB);
1134
                                goto err;
1135
                                }
1136

    
1137
                        s->s3->tmp.dh=dh;
1138
                        if ((dhp->pub_key == NULL ||
1139
                             dhp->priv_key == NULL ||
1140
                             (s->options & SSL_OP_SINGLE_DH_USE)))
1141
                                {
1142
                                if(!DH_generate_key(dh))
1143
                                    {
1144
                                    SSLerr(SSL_F_DTLS1_SEND_SERVER_KEY_EXCHANGE,
1145
                                           ERR_R_DH_LIB);
1146
                                    goto err;
1147
                                    }
1148
                                }
1149
                        else
1150
                                {
1151
                                dh->pub_key=BN_dup(dhp->pub_key);
1152
                                dh->priv_key=BN_dup(dhp->priv_key);
1153
                                if ((dh->pub_key == NULL) ||
1154
                                        (dh->priv_key == NULL))
1155
                                        {
1156
                                        SSLerr(SSL_F_DTLS1_SEND_SERVER_KEY_EXCHANGE,ERR_R_DH_LIB);
1157
                                        goto err;
1158
                                        }
1159
                                }
1160
                        r[0]=dh->p;
1161
                        r[1]=dh->g;
1162
                        r[2]=dh->pub_key;
1163
                        }
1164
                else 
1165
#endif
1166
#ifndef OPENSSL_NO_ECDH
1167
                        if (type & SSL_kEECDH)
1168
                        {
1169
                        const EC_GROUP *group;
1170

    
1171
                        ecdhp=cert->ecdh_tmp;
1172
                        if ((ecdhp == NULL) && (s->cert->ecdh_tmp_cb != NULL))
1173
                                {
1174
                                ecdhp=s->cert->ecdh_tmp_cb(s,
1175
                                      SSL_C_IS_EXPORT(s->s3->tmp.new_cipher),
1176
                                      SSL_C_EXPORT_PKEYLENGTH(s->s3->tmp.new_cipher));
1177
                                }
1178
                        if (ecdhp == NULL)
1179
                                {
1180
                                al=SSL_AD_HANDSHAKE_FAILURE;
1181
                                SSLerr(SSL_F_DTLS1_SEND_SERVER_KEY_EXCHANGE,SSL_R_MISSING_TMP_ECDH_KEY);
1182
                                goto f_err;
1183
                                }
1184

    
1185
                        if (s->s3->tmp.ecdh != NULL)
1186
                                {
1187
                                EC_KEY_free(s->s3->tmp.ecdh); 
1188
                                SSLerr(SSL_F_DTLS1_SEND_SERVER_KEY_EXCHANGE, ERR_R_INTERNAL_ERROR);
1189
                                goto err;
1190
                                }
1191

    
1192
                        /* Duplicate the ECDH structure. */
1193
                        if (ecdhp == NULL)
1194
                                {
1195
                                SSLerr(SSL_F_DTLS1_SEND_SERVER_KEY_EXCHANGE,ERR_R_ECDH_LIB);
1196
                                goto err;
1197
                                }
1198
                        if ((ecdh = EC_KEY_dup(ecdhp)) == NULL)
1199
                                {
1200
                                SSLerr(SSL_F_DTLS1_SEND_SERVER_KEY_EXCHANGE,ERR_R_ECDH_LIB);
1201
                                goto err;
1202
                                }
1203

    
1204
                        s->s3->tmp.ecdh=ecdh;
1205
                        if ((EC_KEY_get0_public_key(ecdh) == NULL) ||
1206
                            (EC_KEY_get0_private_key(ecdh) == NULL) ||
1207
                            (s->options & SSL_OP_SINGLE_ECDH_USE))
1208
                                {
1209
                                if(!EC_KEY_generate_key(ecdh))
1210
                                    {
1211
                                    SSLerr(SSL_F_DTLS1_SEND_SERVER_KEY_EXCHANGE,ERR_R_ECDH_LIB);
1212
                                    goto err;
1213
                                    }
1214
                                }
1215

    
1216
                        if (((group = EC_KEY_get0_group(ecdh)) == NULL) ||
1217
                            (EC_KEY_get0_public_key(ecdh)  == NULL) ||
1218
                            (EC_KEY_get0_private_key(ecdh) == NULL))
1219
                                {
1220
                                SSLerr(SSL_F_DTLS1_SEND_SERVER_KEY_EXCHANGE,ERR_R_ECDH_LIB);
1221
                                goto err;
1222
                                }
1223

    
1224
                        if (SSL_C_IS_EXPORT(s->s3->tmp.new_cipher) &&
1225
                            (EC_GROUP_get_degree(group) > 163)) 
1226
                                {
1227
                                SSLerr(SSL_F_DTLS1_SEND_SERVER_KEY_EXCHANGE,SSL_R_ECGROUP_TOO_LARGE_FOR_CIPHER);
1228
                                goto err;
1229
                                }
1230

    
1231
                        /* XXX: For now, we only support ephemeral ECDH
1232
                         * keys over named (not generic) curves. For 
1233
                         * supported named curves, curve_id is non-zero.
1234
                         */
1235
                        if ((curve_id = 
1236
                            tls1_ec_nid2curve_id(EC_GROUP_get_curve_name(group)))
1237
                            == 0)
1238
                                {
1239
                                SSLerr(SSL_F_DTLS1_SEND_SERVER_KEY_EXCHANGE,SSL_R_UNSUPPORTED_ELLIPTIC_CURVE);
1240
                                goto err;
1241
                                }
1242

    
1243
                        /* Encode the public key.
1244
                         * First check the size of encoding and
1245
                         * allocate memory accordingly.
1246
                         */
1247
                        encodedlen = EC_POINT_point2oct(group, 
1248
                            EC_KEY_get0_public_key(ecdh),
1249
                            POINT_CONVERSION_UNCOMPRESSED, 
1250
                            NULL, 0, NULL);
1251

    
1252
                        encodedPoint = (unsigned char *) 
1253
                            OPENSSL_malloc(encodedlen*sizeof(unsigned char)); 
1254
                        bn_ctx = BN_CTX_new();
1255
                        if ((encodedPoint == NULL) || (bn_ctx == NULL))
1256
                                {
1257
                                SSLerr(SSL_F_DTLS1_SEND_SERVER_KEY_EXCHANGE,ERR_R_MALLOC_FAILURE);
1258
                                goto err;
1259
                                }
1260

    
1261

    
1262
                        encodedlen = EC_POINT_point2oct(group, 
1263
                            EC_KEY_get0_public_key(ecdh), 
1264
                            POINT_CONVERSION_UNCOMPRESSED, 
1265
                            encodedPoint, encodedlen, bn_ctx);
1266

    
1267
                        if (encodedlen == 0) 
1268
                                {
1269
                                SSLerr(SSL_F_DTLS1_SEND_SERVER_KEY_EXCHANGE,ERR_R_ECDH_LIB);
1270
                                goto err;
1271
                                }
1272

    
1273
                        BN_CTX_free(bn_ctx);  bn_ctx=NULL;
1274

    
1275
                        /* XXX: For now, we only support named (not 
1276
                         * generic) curves in ECDH ephemeral key exchanges.
1277
                         * In this situation, we need four additional bytes
1278
                         * to encode the entire ServerECDHParams
1279
                         * structure. 
1280
                         */
1281
                        n = 4 + encodedlen;
1282

    
1283
                        /* We'll generate the serverKeyExchange message
1284
                         * explicitly so we can set these to NULLs
1285
                         */
1286
                        r[0]=NULL;
1287
                        r[1]=NULL;
1288
                        r[2]=NULL;
1289
                        r[3]=NULL;
1290
                        }
1291
                else 
1292
#endif /* !OPENSSL_NO_ECDH */
1293
#ifndef OPENSSL_NO_PSK
1294
                        if (type & SSL_kPSK)
1295
                                {
1296
                                /* reserve size for record length and PSK identity hint*/
1297
                                n+=2+strlen(s->ctx->psk_identity_hint);
1298
                                }
1299
                        else
1300
#endif /* !OPENSSL_NO_PSK */
1301
                        {
1302
                        al=SSL_AD_HANDSHAKE_FAILURE;
1303
                        SSLerr(SSL_F_DTLS1_SEND_SERVER_KEY_EXCHANGE,SSL_R_UNKNOWN_KEY_EXCHANGE_TYPE);
1304
                        goto f_err;
1305
                        }
1306
                for (i=0; r[i] != NULL; i++)
1307
                        {
1308
                        nr[i]=BN_num_bytes(r[i]);
1309
                        n+=2+nr[i];
1310
                        }
1311

    
1312
                if (!(s->s3->tmp.new_cipher->algorithm_auth & SSL_aNULL)
1313
                        && !(s->s3->tmp.new_cipher->algorithm_mkey & SSL_kPSK))
1314
                        {
1315
                        if ((pkey=ssl_get_sign_pkey(s,s->s3->tmp.new_cipher, NULL))
1316
                                == NULL)
1317
                                {
1318
                                al=SSL_AD_DECODE_ERROR;
1319
                                goto f_err;
1320
                                }
1321
                        kn=EVP_PKEY_size(pkey);
1322
                        }
1323
                else
1324
                        {
1325
                        pkey=NULL;
1326
                        kn=0;
1327
                        }
1328

    
1329
                if (!BUF_MEM_grow_clean(buf,n+DTLS1_HM_HEADER_LENGTH+kn))
1330
                        {
1331
                        SSLerr(SSL_F_DTLS1_SEND_SERVER_KEY_EXCHANGE,ERR_LIB_BUF);
1332
                        goto err;
1333
                        }
1334
                d=(unsigned char *)s->init_buf->data;
1335
                p= &(d[DTLS1_HM_HEADER_LENGTH]);
1336

    
1337
                for (i=0; r[i] != NULL; i++)
1338
                        {
1339
                        s2n(nr[i],p);
1340
                        BN_bn2bin(r[i],p);
1341
                        p+=nr[i];
1342
                        }
1343

    
1344
#ifndef OPENSSL_NO_ECDH
1345
                if (type & SSL_kEECDH) 
1346
                        {
1347
                        /* XXX: For now, we only support named (not generic) curves.
1348
                         * In this situation, the serverKeyExchange message has:
1349
                         * [1 byte CurveType], [2 byte CurveName]
1350
                         * [1 byte length of encoded point], followed by
1351
                         * the actual encoded point itself
1352
                         */
1353
                        *p = NAMED_CURVE_TYPE;
1354
                        p += 1;
1355
                        *p = 0;
1356
                        p += 1;
1357
                        *p = curve_id;
1358
                        p += 1;
1359
                        *p = encodedlen;
1360
                        p += 1;
1361
                        memcpy((unsigned char*)p, 
1362
                            (unsigned char *)encodedPoint, 
1363
                            encodedlen);
1364
                        OPENSSL_free(encodedPoint);
1365
                        encodedPoint = NULL;
1366
                        p += encodedlen;
1367
                        }
1368
#endif
1369

    
1370
#ifndef OPENSSL_NO_PSK
1371
                if (type & SSL_kPSK)
1372
                        {
1373
                        /* copy PSK identity hint */
1374
                        s2n(strlen(s->ctx->psk_identity_hint), p); 
1375
                        strncpy((char *)p, s->ctx->psk_identity_hint, strlen(s->ctx->psk_identity_hint));
1376
                        p+=strlen(s->ctx->psk_identity_hint);
1377
                        }
1378
#endif
1379

    
1380
                /* not anonymous */
1381
                if (pkey != NULL)
1382
                        {
1383
                        /* n is the length of the params, they start at
1384
                         * &(d[DTLS1_HM_HEADER_LENGTH]) and p points to the space
1385
                         * at the end. */
1386
#ifndef OPENSSL_NO_RSA
1387
                        if (pkey->type == EVP_PKEY_RSA)
1388
                                {
1389
                                q=md_buf;
1390
                                j=0;
1391
                                for (num=2; num > 0; num--)
1392
                                        {
1393
                                        EVP_DigestInit_ex(&md_ctx,(num == 2)
1394
                                                ?s->ctx->md5:s->ctx->sha1, NULL);
1395
                                        EVP_DigestUpdate(&md_ctx,&(s->s3->client_random[0]),SSL3_RANDOM_SIZE);
1396
                                        EVP_DigestUpdate(&md_ctx,&(s->s3->server_random[0]),SSL3_RANDOM_SIZE);
1397
                                        EVP_DigestUpdate(&md_ctx,&(d[DTLS1_HM_HEADER_LENGTH]),n);
1398
                                        EVP_DigestFinal_ex(&md_ctx,q,
1399
                                                (unsigned int *)&i);
1400
                                        q+=i;
1401
                                        j+=i;
1402
                                        }
1403
                                if (RSA_sign(NID_md5_sha1, md_buf, j,
1404
                                        &(p[2]), &u, pkey->pkey.rsa) <= 0)
1405
                                        {
1406
                                        SSLerr(SSL_F_DTLS1_SEND_SERVER_KEY_EXCHANGE,ERR_LIB_RSA);
1407
                                        goto err;
1408
                                        }
1409
                                s2n(u,p);
1410
                                n+=u+2;
1411
                                }
1412
                        else
1413
#endif
1414
#if !defined(OPENSSL_NO_DSA)
1415
                                if (pkey->type == EVP_PKEY_DSA)
1416
                                {
1417
                                /* lets do DSS */
1418
                                EVP_SignInit_ex(&md_ctx,EVP_dss1(), NULL);
1419
                                EVP_SignUpdate(&md_ctx,&(s->s3->client_random[0]),SSL3_RANDOM_SIZE);
1420
                                EVP_SignUpdate(&md_ctx,&(s->s3->server_random[0]),SSL3_RANDOM_SIZE);
1421
                                EVP_SignUpdate(&md_ctx,&(d[DTLS1_HM_HEADER_LENGTH]),n);
1422
                                if (!EVP_SignFinal(&md_ctx,&(p[2]),
1423
                                        (unsigned int *)&i,pkey))
1424
                                        {
1425
                                        SSLerr(SSL_F_DTLS1_SEND_SERVER_KEY_EXCHANGE,ERR_LIB_DSA);
1426
                                        goto err;
1427
                                        }
1428
                                s2n(i,p);
1429
                                n+=i+2;
1430
                                }
1431
                        else
1432
#endif
1433
#if !defined(OPENSSL_NO_ECDSA)
1434
                                if (pkey->type == EVP_PKEY_EC)
1435
                                {
1436
                                /* let's do ECDSA */
1437
                                EVP_SignInit_ex(&md_ctx,EVP_ecdsa(), NULL);
1438
                                EVP_SignUpdate(&md_ctx,&(s->s3->client_random[0]),SSL3_RANDOM_SIZE);
1439
                                EVP_SignUpdate(&md_ctx,&(s->s3->server_random[0]),SSL3_RANDOM_SIZE);
1440
                                EVP_SignUpdate(&md_ctx,&(d[DTLS1_HM_HEADER_LENGTH]),n);
1441
                                if (!EVP_SignFinal(&md_ctx,&(p[2]),
1442
                                        (unsigned int *)&i,pkey))
1443
                                        {
1444
                                        SSLerr(SSL_F_DTLS1_SEND_SERVER_KEY_EXCHANGE,ERR_LIB_ECDSA);
1445
                                        goto err;
1446
                                        }
1447
                                s2n(i,p);
1448
                                n+=i+2;
1449
                                }
1450
                        else
1451
#endif
1452
                                {
1453
                                /* Is this error check actually needed? */
1454
                                al=SSL_AD_HANDSHAKE_FAILURE;
1455
                                SSLerr(SSL_F_DTLS1_SEND_SERVER_KEY_EXCHANGE,SSL_R_UNKNOWN_PKEY_TYPE);
1456
                                goto f_err;
1457
                                }
1458
                        }
1459

    
1460
                d = dtls1_set_message_header(s, d,
1461
                        SSL3_MT_SERVER_KEY_EXCHANGE, n, 0, n);
1462

    
1463
                /* we should now have things packed up, so lets send
1464
                 * it off */
1465
                s->init_num=n+DTLS1_HM_HEADER_LENGTH;
1466
                s->init_off=0;
1467

    
1468
                /* buffer the message to handle re-xmits */
1469
                dtls1_buffer_message(s, 0);
1470
                }
1471

    
1472
        s->state = SSL3_ST_SW_KEY_EXCH_B;
1473
        EVP_MD_CTX_cleanup(&md_ctx);
1474
        return(dtls1_do_write(s,SSL3_RT_HANDSHAKE));
1475
f_err:
1476
        ssl3_send_alert(s,SSL3_AL_FATAL,al);
1477
err:
1478
#ifndef OPENSSL_NO_ECDH
1479
        if (encodedPoint != NULL) OPENSSL_free(encodedPoint);
1480
        BN_CTX_free(bn_ctx);
1481
#endif
1482
        EVP_MD_CTX_cleanup(&md_ctx);
1483
        return(-1);
1484
        }
1485

    
1486
int dtls1_send_certificate_request(SSL *s)
1487
        {
1488
        unsigned char *p,*d;
1489
        int i,j,nl,off,n;
1490
        STACK_OF(X509_NAME) *sk=NULL;
1491
        X509_NAME *name;
1492
        BUF_MEM *buf;
1493
        unsigned int msg_len;
1494

    
1495
        if (s->state == SSL3_ST_SW_CERT_REQ_A)
1496
                {
1497
                buf=s->init_buf;
1498

    
1499
                d=p=(unsigned char *)&(buf->data[DTLS1_HM_HEADER_LENGTH]);
1500

    
1501
                /* get the list of acceptable cert types */
1502
                p++;
1503
                n=ssl3_get_req_cert_type(s,p);
1504
                d[0]=n;
1505
                p+=n;
1506
                n++;
1507

    
1508
                off=n;
1509
                p+=2;
1510
                n+=2;
1511

    
1512
                sk=SSL_get_client_CA_list(s);
1513
                nl=0;
1514
                if (sk != NULL)
1515
                        {
1516
                        for (i=0; i<sk_X509_NAME_num(sk); i++)
1517
                                {
1518
                                name=sk_X509_NAME_value(sk,i);
1519
                                j=i2d_X509_NAME(name,NULL);
1520
                                if (!BUF_MEM_grow_clean(buf,DTLS1_HM_HEADER_LENGTH+n+j+2))
1521
                                        {
1522
                                        SSLerr(SSL_F_DTLS1_SEND_CERTIFICATE_REQUEST,ERR_R_BUF_LIB);
1523
                                        goto err;
1524
                                        }
1525
                                p=(unsigned char *)&(buf->data[DTLS1_HM_HEADER_LENGTH+n]);
1526
                                if (!(s->options & SSL_OP_NETSCAPE_CA_DN_BUG))
1527
                                        {
1528
                                        s2n(j,p);
1529
                                        i2d_X509_NAME(name,&p);
1530
                                        n+=2+j;
1531
                                        nl+=2+j;
1532
                                        }
1533
                                else
1534
                                        {
1535
                                        d=p;
1536
                                        i2d_X509_NAME(name,&p);
1537
                                        j-=2; s2n(j,d); j+=2;
1538
                                        n+=j;
1539
                                        nl+=j;
1540
                                        }
1541
                                }
1542
                        }
1543
                /* else no CA names */
1544
                p=(unsigned char *)&(buf->data[DTLS1_HM_HEADER_LENGTH+off]);
1545
                s2n(nl,p);
1546

    
1547
                d=(unsigned char *)buf->data;
1548
                *(d++)=SSL3_MT_CERTIFICATE_REQUEST;
1549
                l2n3(n,d);
1550
                s2n(s->d1->handshake_write_seq,d);
1551
                s->d1->handshake_write_seq++;
1552

    
1553
                /* we should now have things packed up, so lets send
1554
                 * it off */
1555

    
1556
                s->init_num=n+DTLS1_HM_HEADER_LENGTH;
1557
                s->init_off=0;
1558
#ifdef NETSCAPE_HANG_BUG
1559
/* XXX: what to do about this? */
1560
                p=(unsigned char *)s->init_buf->data + s->init_num;
1561

    
1562
                /* do the header */
1563
                *(p++)=SSL3_MT_SERVER_DONE;
1564
                *(p++)=0;
1565
                *(p++)=0;
1566
                *(p++)=0;
1567
                s->init_num += 4;
1568
#endif
1569

    
1570
                /* XDTLS:  set message header ? */
1571
                msg_len = s->init_num - DTLS1_HM_HEADER_LENGTH;
1572
                dtls1_set_message_header(s, (void *)s->init_buf->data,
1573
                        SSL3_MT_CERTIFICATE_REQUEST, msg_len, 0, msg_len);
1574

    
1575
                /* buffer the message to handle re-xmits */
1576
                dtls1_buffer_message(s, 0);
1577

    
1578
                s->state = SSL3_ST_SW_CERT_REQ_B;
1579
                }
1580

    
1581
        /* SSL3_ST_SW_CERT_REQ_B */
1582
        return(dtls1_do_write(s,SSL3_RT_HANDSHAKE));
1583
err:
1584
        return(-1);
1585
        }
1586

    
1587
int dtls1_send_server_certificate(SSL *s)
1588
        {
1589
        unsigned long l;
1590
        X509 *x;
1591

    
1592
        if (s->state == SSL3_ST_SW_CERT_A)
1593
                {
1594
                x=ssl_get_server_send_cert(s);
1595
                if (x == NULL)
1596
                        {
1597
                        /* VRS: allow null cert if auth == KRB5 */
1598
                        if ((s->s3->tmp.new_cipher->algorithm_mkey != SSL_kKRB5) ||
1599
                            (s->s3->tmp.new_cipher->algorithm_auth != SSL_aKRB5))
1600
                                {
1601
                                SSLerr(SSL_F_DTLS1_SEND_SERVER_CERTIFICATE,ERR_R_INTERNAL_ERROR);
1602
                                return(0);
1603
                                }
1604
                        }
1605

    
1606
                l=dtls1_output_cert_chain(s,x);
1607
                s->state=SSL3_ST_SW_CERT_B;
1608
                s->init_num=(int)l;
1609
                s->init_off=0;
1610

    
1611
                /* buffer the message to handle re-xmits */
1612
                dtls1_buffer_message(s, 0);
1613
                }
1614

    
1615
        /* SSL3_ST_SW_CERT_B */
1616
        return(dtls1_do_write(s,SSL3_RT_HANDSHAKE));
1617
        }
1618

    
1619
#ifndef OPENSSL_NO_TLSEXT
1620
int dtls1_send_newsession_ticket(SSL *s)
1621
        {
1622
        if (s->state == SSL3_ST_SW_SESSION_TICKET_A)
1623
                {
1624
                unsigned char *p, *senc, *macstart;
1625
                int len, slen;
1626
                unsigned int hlen, msg_len;
1627
                EVP_CIPHER_CTX ctx;
1628
                HMAC_CTX hctx;
1629
                SSL_CTX *tctx = s->initial_ctx;
1630
                unsigned char iv[EVP_MAX_IV_LENGTH];
1631
                unsigned char key_name[16];
1632

    
1633
                /* get session encoding length */
1634
                slen = i2d_SSL_SESSION(s->session, NULL);
1635
                /* Some length values are 16 bits, so forget it if session is
1636
                  * too long
1637
                  */
1638
                if (slen > 0xFF00)
1639
                        return -1;
1640
                /* Grow buffer if need be: the length calculation is as
1641
                  * follows 12 (DTLS handshake message header) +
1642
                  * 4 (ticket lifetime hint) + 2 (ticket length) +
1643
                  * 16 (key name) + max_iv_len (iv length) +
1644
                  * session_length + max_enc_block_size (max encrypted session
1645
                  * length) + max_md_size (HMAC).
1646
                  */
1647
                if (!BUF_MEM_grow(s->init_buf,
1648
                        DTLS1_HM_HEADER_LENGTH + 22 + EVP_MAX_IV_LENGTH +
1649
                        EVP_MAX_BLOCK_LENGTH + EVP_MAX_MD_SIZE + slen))
1650
                        return -1;
1651
                senc = OPENSSL_malloc(slen);
1652
                if (!senc)
1653
                        return -1;
1654
                p = senc;
1655
                i2d_SSL_SESSION(s->session, &p);
1656

    
1657
                p=(unsigned char *)&(s->init_buf->data[DTLS1_HM_HEADER_LENGTH]);
1658
                EVP_CIPHER_CTX_init(&ctx);
1659
                HMAC_CTX_init(&hctx);
1660
                /* Initialize HMAC and cipher contexts. If callback present
1661
                 * it does all the work otherwise use generated values
1662
                 * from parent ctx.
1663
                 */
1664
                if (tctx->tlsext_ticket_key_cb)
1665
                        {
1666
                        if (tctx->tlsext_ticket_key_cb(s, key_name, iv, &ctx,
1667
                                                         &hctx, 1) < 0)
1668
                                {
1669
                                OPENSSL_free(senc);
1670
                                return -1;
1671
                                }
1672
                        }
1673
                else
1674
                        {
1675
                        RAND_pseudo_bytes(iv, 16);
1676
                        EVP_EncryptInit_ex(&ctx, EVP_aes_128_cbc(), NULL,
1677
                                        tctx->tlsext_tick_aes_key, iv);
1678
                        HMAC_Init_ex(&hctx, tctx->tlsext_tick_hmac_key, 16,
1679
                                        tlsext_tick_md(), NULL);
1680
                        memcpy(key_name, tctx->tlsext_tick_key_name, 16);
1681
                        }
1682
                l2n(s->session->tlsext_tick_lifetime_hint, p);
1683
                /* Skip ticket length for now */
1684
                p += 2;
1685
                /* Output key name */
1686
                macstart = p;
1687
                memcpy(p, key_name, 16);
1688
                p += 16;
1689
                /* output IV */
1690
                memcpy(p, iv, EVP_CIPHER_CTX_iv_length(&ctx));
1691
                p += EVP_CIPHER_CTX_iv_length(&ctx);
1692
                /* Encrypt session data */
1693
                EVP_EncryptUpdate(&ctx, p, &len, senc, slen);
1694
                p += len;
1695
                EVP_EncryptFinal(&ctx, p, &len);
1696
                p += len;
1697
                EVP_CIPHER_CTX_cleanup(&ctx);
1698

    
1699
                HMAC_Update(&hctx, macstart, p - macstart);
1700
                HMAC_Final(&hctx, p, &hlen);
1701
                HMAC_CTX_cleanup(&hctx);
1702

    
1703
                p += hlen;
1704
                /* Now write out lengths: p points to end of data written */
1705
                /* Total length */
1706
                len = p - (unsigned char *)(s->init_buf->data);
1707
                /* Ticket length */
1708
                p=(unsigned char *)&(s->init_buf->data[DTLS1_HM_HEADER_LENGTH]) + 4;
1709
                s2n(len - DTLS1_HM_HEADER_LENGTH - 6, p);
1710

    
1711
                /* number of bytes to write */
1712
                s->init_num= len;
1713
                s->state=SSL3_ST_SW_SESSION_TICKET_B;
1714
                s->init_off=0;
1715
                OPENSSL_free(senc);
1716

    
1717
                /* XDTLS:  set message header ? */
1718
                msg_len = s->init_num - DTLS1_HM_HEADER_LENGTH;
1719
                dtls1_set_message_header(s, (void *)s->init_buf->data,
1720
                        SSL3_MT_NEWSESSION_TICKET, msg_len, 0, msg_len);
1721

    
1722
                /* buffer the message to handle re-xmits */
1723
                dtls1_buffer_message(s, 0);
1724
                }
1725

    
1726
        /* SSL3_ST_SW_SESSION_TICKET_B */
1727
        return(dtls1_do_write(s,SSL3_RT_HANDSHAKE));
1728
        }
1729
#endif