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_clnt.c @ aa3b4b4d

History | View | Annotate | Download (44.4 KB)

1
/* ssl/d1_clnt.c */
2
/* 
3
 * DTLS implementation written by Nagendra Modadugu
4
 * (nagendra@cs.stanford.edu) for the OpenSSL project 2005.  
5
 */
6
/* ====================================================================
7
 * Copyright (c) 1999-2007 The OpenSSL Project.  All rights reserved.
8
 *
9
 * Redistribution and use in source and binary forms, with or without
10
 * modification, are permitted provided that the following conditions
11
 * are met:
12
 *
13
 * 1. Redistributions of source code must retain the above copyright
14
 *    notice, this list of conditions and the following disclaimer. 
15
 *
16
 * 2. Redistributions in binary form must reproduce the above copyright
17
 *    notice, this list of conditions and the following disclaimer in
18
 *    the documentation and/or other materials provided with the
19
 *    distribution.
20
 *
21
 * 3. All advertising materials mentioning features or use of this
22
 *    software must display the following acknowledgment:
23
 *    "This product includes software developed by the OpenSSL Project
24
 *    for use in the OpenSSL Toolkit. (http://www.OpenSSL.org/)"
25
 *
26
 * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to
27
 *    endorse or promote products derived from this software without
28
 *    prior written permission. For written permission, please contact
29
 *    openssl-core@OpenSSL.org.
30
 *
31
 * 5. Products derived from this software may not be called "OpenSSL"
32
 *    nor may "OpenSSL" appear in their names without prior written
33
 *    permission of the OpenSSL Project.
34
 *
35
 * 6. Redistributions of any form whatsoever must retain the following
36
 *    acknowledgment:
37
 *    "This product includes software developed by the OpenSSL Project
38
 *    for use in the OpenSSL Toolkit (http://www.OpenSSL.org/)"
39
 *
40
 * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY
41
 * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
42
 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
43
 * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE OpenSSL PROJECT OR
44
 * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
45
 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
46
 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
47
 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
48
 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
49
 * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
50
 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
51
 * OF THE POSSIBILITY OF SUCH DAMAGE.
52
 * ====================================================================
53
 *
54
 * This product includes cryptographic software written by Eric Young
55
 * (eay@cryptsoft.com).  This product includes software written by Tim
56
 * Hudson (tjh@cryptsoft.com).
57
 *
58
 */
59
/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
60
 * All rights reserved.
61
 *
62
 * This package is an SSL implementation written
63
 * by Eric Young (eay@cryptsoft.com).
64
 * The implementation was written so as to conform with Netscapes SSL.
65
 * 
66
 * This library is free for commercial and non-commercial use as long as
67
 * the following conditions are aheared to.  The following conditions
68
 * apply to all code found in this distribution, be it the RC4, RSA,
69
 * lhash, DES, etc., code; not just the SSL code.  The SSL documentation
70
 * included with this distribution is covered by the same copyright terms
71
 * except that the holder is Tim Hudson (tjh@cryptsoft.com).
72
 * 
73
 * Copyright remains Eric Young's, and as such any Copyright notices in
74
 * the code are not to be removed.
75
 * If this package is used in a product, Eric Young should be given attribution
76
 * as the author of the parts of the library used.
77
 * This can be in the form of a textual message at program startup or
78
 * in documentation (online or textual) provided with the package.
79
 * 
80
 * Redistribution and use in source and binary forms, with or without
81
 * modification, are permitted provided that the following conditions
82
 * are met:
83
 * 1. Redistributions of source code must retain the copyright
84
 *    notice, this list of conditions and the following disclaimer.
85
 * 2. Redistributions in binary form must reproduce the above copyright
86
 *    notice, this list of conditions and the following disclaimer in the
87
 *    documentation and/or other materials provided with the distribution.
88
 * 3. All advertising materials mentioning features or use of this software
89
 *    must display the following acknowledgement:
90
 *    "This product includes cryptographic software written by
91
 *     Eric Young (eay@cryptsoft.com)"
92
 *    The word 'cryptographic' can be left out if the rouines from the library
93
 *    being used are not cryptographic related :-).
94
 * 4. If you include any Windows specific code (or a derivative thereof) from 
95
 *    the apps directory (application code) you must include an acknowledgement:
96
 *    "This product includes software written by Tim Hudson (tjh@cryptsoft.com)"
97
 * 
98
 * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND
99
 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
100
 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
101
 * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
102
 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
103
 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
104
 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
105
 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
106
 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
107
 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
108
 * SUCH DAMAGE.
109
 * 
110
 * The licence and distribution terms for any publically available version or
111
 * derivative of this code cannot be changed.  i.e. this code cannot simply be
112
 * copied and put under another distribution licence
113
 * [including the GNU Public Licence.]
114
 */
115

    
116
#include <stdio.h>
117
#include "ssl_locl.h"
118
#ifndef OPENSSL_NO_KRB5
119
#include "kssl_lcl.h"
120
#endif
121
#include <openssl/buffer.h>
122
#include <openssl/rand.h>
123
#include <openssl/objects.h>
124
#include <openssl/evp.h>
125
#include <openssl/md5.h>
126
#include <openssl/bn.h>
127
#ifndef OPENSSL_NO_DH
128
#include <openssl/dh.h>
129
#endif
130

    
131
static const SSL_METHOD *dtls1_get_client_method(int ver);
132
static int dtls1_get_hello_verify(SSL *s);
133

    
134
static const SSL_METHOD *dtls1_get_client_method(int ver)
135
        {
136
        if (ver == DTLS1_VERSION || ver == DTLS1_BAD_VER)
137
                return(DTLSv1_client_method());
138
        else
139
                return(NULL);
140
        }
141

    
142
IMPLEMENT_dtls1_meth_func(DTLSv1_client_method,
143
                        ssl_undefined_function,
144
                        dtls1_connect,
145
                        dtls1_get_client_method)
146

    
147
int dtls1_connect(SSL *s)
148
        {
149
        BUF_MEM *buf=NULL;
150
        unsigned long Time=(unsigned long)time(NULL);
151
        void (*cb)(const SSL *ssl,int type,int val)=NULL;
152
        int ret= -1;
153
        int new_state,state,skip=0;
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
        s->in_handshake++;
169
        if (!SSL_in_init(s) || SSL_in_before(s)) SSL_clear(s); 
170

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

    
179
#ifndef OPENSSL_NO_HEARTBEATS
180
        /* If we're awaiting a HeartbeatResponse, pretend we
181
         * already got and don't await it anymore, because
182
         * Heartbeats don't make sense during handshakes anyway.
183
         */
184
        if (s->tlsext_hb_pending)
185
                {
186
                dtls1_stop_timer(s);
187
                s->tlsext_hb_pending = 0;
188
                s->tlsext_hb_seq++;
189
                }
190
#endif
191

    
192
        for (;;)
193
                {
194
                state=s->state;
195

    
196
                switch(s->state)
197
                        {
198
                case SSL_ST_RENEGOTIATE:
199
                        s->renegotiate=1;
200
                        s->state=SSL_ST_CONNECT;
201
                        s->ctx->stats.sess_connect_renegotiate++;
202
                        /* break */
203
                case SSL_ST_BEFORE:
204
                case SSL_ST_CONNECT:
205
                case SSL_ST_BEFORE|SSL_ST_CONNECT:
206
                case SSL_ST_OK|SSL_ST_CONNECT:
207

    
208
                        s->server=0;
209
                        if (cb != NULL) cb(s,SSL_CB_HANDSHAKE_START,1);
210

    
211
                        if ((s->version & 0xff00 ) != (DTLS1_VERSION & 0xff00) &&
212
                            (s->version & 0xff00 ) != (DTLS1_BAD_VER & 0xff00))
213
                                {
214
                                SSLerr(SSL_F_DTLS1_CONNECT, ERR_R_INTERNAL_ERROR);
215
                                ret = -1;
216
                                goto end;
217
                                }
218
                                
219
                        /* s->version=SSL3_VERSION; */
220
                        s->type=SSL_ST_CONNECT;
221

    
222
                        if (s->init_buf == NULL)
223
                                {
224
                                if ((buf=BUF_MEM_new()) == NULL)
225
                                        {
226
                                        ret= -1;
227
                                        goto end;
228
                                        }
229
                                if (!BUF_MEM_grow(buf,SSL3_RT_MAX_PLAIN_LENGTH))
230
                                        {
231
                                        ret= -1;
232
                                        goto end;
233
                                        }
234
                                s->init_buf=buf;
235
                                buf=NULL;
236
                                }
237

    
238
                        if (!ssl3_setup_buffers(s)) { ret= -1; goto end; }
239

    
240
                        /* setup buffing BIO */
241
                        if (!ssl_init_wbio_buffer(s,0)) { ret= -1; goto end; }
242

    
243
                        /* don't push the buffering BIO quite yet */
244

    
245
                        s->state=SSL3_ST_CW_CLNT_HELLO_A;
246
                        s->ctx->stats.sess_connect++;
247
                        s->init_num=0;
248
                        /* mark client_random uninitialized */
249
                        memset(s->s3->client_random,0,sizeof(s->s3->client_random));
250
                        s->d1->send_cookie = 0;
251
                        s->hit = 0;
252
                        break;
253

    
254
#ifndef OPENSSL_NO_SCTP
255
                case DTLS1_SCTP_ST_CR_READ_SOCK:
256

    
257
                        if (BIO_dgram_sctp_msg_waiting(SSL_get_rbio(s)))
258
                        {
259
                                s->s3->in_read_app_data=2;
260
                                s->rwstate=SSL_READING;
261
                                BIO_clear_retry_flags(SSL_get_rbio(s));
262
                                BIO_set_retry_read(SSL_get_rbio(s));
263
                                ret = -1;
264
                                goto end;
265
                        }
266

    
267
                        s->state=s->s3->tmp.next_state;
268
                        break;
269

    
270
                case DTLS1_SCTP_ST_CW_WRITE_SOCK:
271
                        /* read app data until dry event */
272

    
273
                        ret = BIO_dgram_sctp_wait_for_dry(SSL_get_wbio(s));
274
                        if (ret < 0) goto end;
275

    
276
                        if (ret == 0)
277
                        {
278
                                s->s3->in_read_app_data=2;
279
                                s->rwstate=SSL_READING;
280
                                BIO_clear_retry_flags(SSL_get_rbio(s));
281
                                BIO_set_retry_read(SSL_get_rbio(s));
282
                                ret = -1;
283
                                goto end;
284
                        }
285

    
286
                        s->state=s->d1->next_state;
287
                        break;
288
#endif
289

    
290
                case SSL3_ST_CW_CLNT_HELLO_A:
291
                case SSL3_ST_CW_CLNT_HELLO_B:
292

    
293
                        s->shutdown=0;
294

    
295
                        /* every DTLS ClientHello resets Finished MAC */
296
                        ssl3_init_finished_mac(s);
297

    
298
                        dtls1_start_timer(s);
299
                        ret=dtls1_client_hello(s);
300
                        if (ret <= 0) goto end;
301

    
302
                        if ( s->d1->send_cookie)
303
                                {
304
                                s->state=SSL3_ST_CW_FLUSH;
305
                                s->s3->tmp.next_state=SSL3_ST_CR_SRVR_HELLO_A;
306
                                }
307
                        else
308
                                s->state=SSL3_ST_CR_SRVR_HELLO_A;
309

    
310
                        s->init_num=0;
311

    
312
#ifndef OPENSSL_NO_SCTP
313
                        /* Disable buffering for SCTP */
314
                        if (!BIO_dgram_is_sctp(SSL_get_wbio(s)))
315
                                {
316
#endif
317
                                /* turn on buffering for the next lot of output */
318
                                if (s->bbio != s->wbio)
319
                                        s->wbio=BIO_push(s->bbio,s->wbio);
320
#ifndef OPENSSL_NO_SCTP
321
                                }
322
#endif
323

    
324
                        break;
325

    
326
                case SSL3_ST_CR_SRVR_HELLO_A:
327
                case SSL3_ST_CR_SRVR_HELLO_B:
328
                        ret=ssl3_get_server_hello(s);
329
                        if (ret <= 0) goto end;
330
                        else
331
                                {
332
                                if (s->hit)
333
                                        {
334
#ifndef OPENSSL_NO_SCTP
335
                                        /* Add new shared key for SCTP-Auth,
336
                                         * will be ignored if no SCTP used.
337
                                         */
338
                                        snprintf((char*) labelbuffer, sizeof(DTLS1_SCTP_AUTH_LABEL),
339
                                                 DTLS1_SCTP_AUTH_LABEL);
340

    
341
                                        SSL_export_keying_material(s, sctpauthkey,
342
                                                                   sizeof(sctpauthkey), labelbuffer,
343
                                                                   sizeof(labelbuffer), NULL, 0, 0);
344

    
345
                                        BIO_ctrl(SSL_get_wbio(s), BIO_CTRL_DGRAM_SCTP_ADD_AUTH_KEY,
346
                                                         sizeof(sctpauthkey), sctpauthkey);
347
#endif
348

    
349
                                        s->state=SSL3_ST_CR_FINISHED_A;
350
                                        }
351
                                else
352
                                        s->state=DTLS1_ST_CR_HELLO_VERIFY_REQUEST_A;
353
                                }
354
                        s->init_num=0;
355
                        break;
356

    
357
                case DTLS1_ST_CR_HELLO_VERIFY_REQUEST_A:
358
                case DTLS1_ST_CR_HELLO_VERIFY_REQUEST_B:
359

    
360
                        ret = dtls1_get_hello_verify(s);
361
                        if ( ret <= 0)
362
                                goto end;
363
                        dtls1_stop_timer(s);
364
                        if ( s->d1->send_cookie) /* start again, with a cookie */
365
                                s->state=SSL3_ST_CW_CLNT_HELLO_A;
366
                        else
367
                                s->state = SSL3_ST_CR_CERT_A;
368
                        s->init_num = 0;
369
                        break;
370

    
371
                case SSL3_ST_CR_CERT_A:
372
                case SSL3_ST_CR_CERT_B:
373
#ifndef OPENSSL_NO_TLSEXT
374
                        ret=ssl3_check_finished(s);
375
                        if (ret <= 0) goto end;
376
                        if (ret == 2)
377
                                {
378
                                s->hit = 1;
379
                                if (s->tlsext_ticket_expected)
380
                                        s->state=SSL3_ST_CR_SESSION_TICKET_A;
381
                                else
382
                                        s->state=SSL3_ST_CR_FINISHED_A;
383
                                s->init_num=0;
384
                                break;
385
                                }
386
#endif
387
                        /* Check if it is anon DH or PSK */
388
                        if (!(s->s3->tmp.new_cipher->algorithm_auth & SSL_aNULL) &&
389
                            !(s->s3->tmp.new_cipher->algorithm_mkey & SSL_kPSK))
390
                                {
391
                                ret=ssl3_get_server_certificate(s);
392
                                if (ret <= 0) goto end;
393
#ifndef OPENSSL_NO_TLSEXT
394
                                if (s->tlsext_status_expected)
395
                                        s->state=SSL3_ST_CR_CERT_STATUS_A;
396
                                else
397
                                        s->state=SSL3_ST_CR_KEY_EXCH_A;
398
                                }
399
                        else
400
                                {
401
                                skip = 1;
402
                                s->state=SSL3_ST_CR_KEY_EXCH_A;
403
                                }
404
#else
405
                                }
406
                        else
407
                                skip=1;
408

    
409
                        s->state=SSL3_ST_CR_KEY_EXCH_A;
410
#endif
411
                        s->init_num=0;
412
                        break;
413

    
414
                case SSL3_ST_CR_KEY_EXCH_A:
415
                case SSL3_ST_CR_KEY_EXCH_B:
416
                        ret=ssl3_get_key_exchange(s);
417
                        if (ret <= 0) goto end;
418
                        s->state=SSL3_ST_CR_CERT_REQ_A;
419
                        s->init_num=0;
420

    
421
                        /* at this point we check that we have the
422
                         * required stuff from the server */
423
                        if (!ssl3_check_cert_and_algorithm(s))
424
                                {
425
                                ret= -1;
426
                                goto end;
427
                                }
428
                        break;
429

    
430
                case SSL3_ST_CR_CERT_REQ_A:
431
                case SSL3_ST_CR_CERT_REQ_B:
432
                        ret=ssl3_get_certificate_request(s);
433
                        if (ret <= 0) goto end;
434
                        s->state=SSL3_ST_CR_SRVR_DONE_A;
435
                        s->init_num=0;
436
                        break;
437

    
438
                case SSL3_ST_CR_SRVR_DONE_A:
439
                case SSL3_ST_CR_SRVR_DONE_B:
440
                        ret=ssl3_get_server_done(s);
441
                        if (ret <= 0) goto end;
442
                        dtls1_stop_timer(s);
443
                        if (s->s3->tmp.cert_req)
444
                                s->s3->tmp.next_state=SSL3_ST_CW_CERT_A;
445
                        else
446
                                s->s3->tmp.next_state=SSL3_ST_CW_KEY_EXCH_A;
447
                        s->init_num=0;
448

    
449
#ifndef OPENSSL_NO_SCTP                        
450
                        if (BIO_dgram_is_sctp(SSL_get_wbio(s)) &&
451
                            state == SSL_ST_RENEGOTIATE)
452
                                s->state=DTLS1_SCTP_ST_CR_READ_SOCK;
453
                        else
454
#endif                        
455
                        s->state=s->s3->tmp.next_state;
456
                        break;
457

    
458
                case SSL3_ST_CW_CERT_A:
459
                case SSL3_ST_CW_CERT_B:
460
                case SSL3_ST_CW_CERT_C:
461
                case SSL3_ST_CW_CERT_D:
462
                        dtls1_start_timer(s);
463
                        ret=dtls1_send_client_certificate(s);
464
                        if (ret <= 0) goto end;
465
                        s->state=SSL3_ST_CW_KEY_EXCH_A;
466
                        s->init_num=0;
467
                        break;
468

    
469
                case SSL3_ST_CW_KEY_EXCH_A:
470
                case SSL3_ST_CW_KEY_EXCH_B:
471
                        dtls1_start_timer(s);
472
                        ret=dtls1_send_client_key_exchange(s);
473
                        if (ret <= 0) goto end;
474

    
475
#ifndef OPENSSL_NO_SCTP
476
                        /* Add new shared key for SCTP-Auth,
477
                         * will be ignored if no SCTP used.
478
                         */
479
                        snprintf((char*) labelbuffer, sizeof(DTLS1_SCTP_AUTH_LABEL),
480
                                 DTLS1_SCTP_AUTH_LABEL);
481

    
482
                        SSL_export_keying_material(s, sctpauthkey,
483
                                                   sizeof(sctpauthkey), labelbuffer,
484
                                                   sizeof(labelbuffer), NULL, 0, 0);
485

    
486
                        BIO_ctrl(SSL_get_wbio(s), BIO_CTRL_DGRAM_SCTP_ADD_AUTH_KEY,
487
                                         sizeof(sctpauthkey), sctpauthkey);
488
#endif
489

    
490
                        /* EAY EAY EAY need to check for DH fix cert
491
                         * sent back */
492
                        /* For TLS, cert_req is set to 2, so a cert chain
493
                         * of nothing is sent, but no verify packet is sent */
494
                        if (s->s3->tmp.cert_req == 1)
495
                                {
496
                                s->state=SSL3_ST_CW_CERT_VRFY_A;
497
                                }
498
                        else
499
                                {
500
#ifndef OPENSSL_NO_SCTP
501
                                if (BIO_dgram_is_sctp(SSL_get_wbio(s)))
502
                                        {
503
                                        s->d1->next_state=SSL3_ST_CW_CHANGE_A;
504
                                        s->state=DTLS1_SCTP_ST_CW_WRITE_SOCK;
505
                                        }
506
                                else
507
#endif
508
                                        s->state=SSL3_ST_CW_CHANGE_A;
509
                                s->s3->change_cipher_spec=0;
510
                                }
511

    
512
                        s->init_num=0;
513
                        break;
514

    
515
                case SSL3_ST_CW_CERT_VRFY_A:
516
                case SSL3_ST_CW_CERT_VRFY_B:
517
                        dtls1_start_timer(s);
518
                        ret=dtls1_send_client_verify(s);
519
                        if (ret <= 0) goto end;
520
#ifndef OPENSSL_NO_SCTP
521
                        if (BIO_dgram_is_sctp(SSL_get_wbio(s)))
522
                        {
523
                                s->d1->next_state=SSL3_ST_CW_CHANGE_A;
524
                                s->state=DTLS1_SCTP_ST_CW_WRITE_SOCK;
525
                        }
526
                        else
527
#endif
528
                                s->state=SSL3_ST_CW_CHANGE_A;
529
                        s->init_num=0;
530
                        s->s3->change_cipher_spec=0;
531
                        break;
532

    
533
                case SSL3_ST_CW_CHANGE_A:
534
                case SSL3_ST_CW_CHANGE_B:
535
                        if (!s->hit)
536
                                dtls1_start_timer(s);
537
                        ret=dtls1_send_change_cipher_spec(s,
538
                                SSL3_ST_CW_CHANGE_A,SSL3_ST_CW_CHANGE_B);
539
                        if (ret <= 0) goto end;
540

    
541
                        s->state=SSL3_ST_CW_FINISHED_A;
542
                        s->init_num=0;
543

    
544
                        s->session->cipher=s->s3->tmp.new_cipher;
545
#ifdef OPENSSL_NO_COMP
546
                        s->session->compress_meth=0;
547
#else
548
                        if (s->s3->tmp.new_compression == NULL)
549
                                s->session->compress_meth=0;
550
                        else
551
                                s->session->compress_meth=
552
                                        s->s3->tmp.new_compression->id;
553
#endif
554
                        if (!s->method->ssl3_enc->setup_key_block(s))
555
                                {
556
                                ret= -1;
557
                                goto end;
558
                                }
559

    
560
                        if (!s->method->ssl3_enc->change_cipher_state(s,
561
                                SSL3_CHANGE_CIPHER_CLIENT_WRITE))
562
                                {
563
                                ret= -1;
564
                                goto end;
565
                                }
566
                        
567
#ifndef OPENSSL_NO_SCTP
568
                                if (s->hit)
569
                                        {
570
                                        /* Change to new shared key of SCTP-Auth,
571
                                         * will be ignored if no SCTP used.
572
                                         */
573
                                        BIO_ctrl(SSL_get_wbio(s), BIO_CTRL_DGRAM_SCTP_NEXT_AUTH_KEY, 0, NULL);
574
                                        }
575
#endif
576

    
577
                        dtls1_reset_seq_numbers(s, SSL3_CC_WRITE);
578
                        break;
579

    
580
                case SSL3_ST_CW_FINISHED_A:
581
                case SSL3_ST_CW_FINISHED_B:
582
                        if (!s->hit)
583
                                dtls1_start_timer(s);
584
                        ret=dtls1_send_finished(s,
585
                                SSL3_ST_CW_FINISHED_A,SSL3_ST_CW_FINISHED_B,
586
                                s->method->ssl3_enc->client_finished_label,
587
                                s->method->ssl3_enc->client_finished_label_len);
588
                        if (ret <= 0) goto end;
589
                        s->state=SSL3_ST_CW_FLUSH;
590

    
591
                        /* clear flags */
592
                        s->s3->flags&= ~SSL3_FLAGS_POP_BUFFER;
593
                        if (s->hit)
594
                                {
595
                                s->s3->tmp.next_state=SSL_ST_OK;
596
#ifndef OPENSSL_NO_SCTP
597
                                if (BIO_dgram_is_sctp(SSL_get_wbio(s)))
598
                                        {
599
                                                s->d1->next_state = s->s3->tmp.next_state;
600
                                                s->s3->tmp.next_state=DTLS1_SCTP_ST_CW_WRITE_SOCK;
601
                                        }
602
#endif
603
                                if (s->s3->flags & SSL3_FLAGS_DELAY_CLIENT_FINISHED)
604
                                        {
605
                                        s->state=SSL_ST_OK;
606
#ifndef OPENSSL_NO_SCTP
607
                                        if (BIO_dgram_is_sctp(SSL_get_wbio(s)))
608
                                                {
609
                                                        s->d1->next_state = SSL_ST_OK;
610
                                                        s->state=DTLS1_SCTP_ST_CW_WRITE_SOCK;
611
                                                }
612
#endif
613
                                        s->s3->flags|=SSL3_FLAGS_POP_BUFFER;
614
                                        s->s3->delay_buf_pop_ret=0;
615
                                        }
616
                                }
617
                        else
618
                                {
619
#ifndef OPENSSL_NO_SCTP
620
                                /* Change to new shared key of SCTP-Auth,
621
                                 * will be ignored if no SCTP used.
622
                                 */
623
                                BIO_ctrl(SSL_get_wbio(s), BIO_CTRL_DGRAM_SCTP_NEXT_AUTH_KEY, 0, NULL);
624
#endif
625

    
626
#ifndef OPENSSL_NO_TLSEXT
627
                                /* Allow NewSessionTicket if ticket expected */
628
                                if (s->tlsext_ticket_expected)
629
                                        s->s3->tmp.next_state=SSL3_ST_CR_SESSION_TICKET_A;
630
                                else
631
#endif
632
                                
633
                                s->s3->tmp.next_state=SSL3_ST_CR_FINISHED_A;
634
                                }
635
                        s->init_num=0;
636
                        break;
637

    
638
#ifndef OPENSSL_NO_TLSEXT
639
                case SSL3_ST_CR_SESSION_TICKET_A:
640
                case SSL3_ST_CR_SESSION_TICKET_B:
641
                        ret=ssl3_get_new_session_ticket(s);
642
                        if (ret <= 0) goto end;
643
                        s->state=SSL3_ST_CR_FINISHED_A;
644
                        s->init_num=0;
645
                break;
646

    
647
                case SSL3_ST_CR_CERT_STATUS_A:
648
                case SSL3_ST_CR_CERT_STATUS_B:
649
                        ret=ssl3_get_cert_status(s);
650
                        if (ret <= 0) goto end;
651
                        s->state=SSL3_ST_CR_KEY_EXCH_A;
652
                        s->init_num=0;
653
                break;
654
#endif
655

    
656
                case SSL3_ST_CR_FINISHED_A:
657
                case SSL3_ST_CR_FINISHED_B:
658
                        s->d1->change_cipher_spec_ok = 1;
659
                        ret=ssl3_get_finished(s,SSL3_ST_CR_FINISHED_A,
660
                                SSL3_ST_CR_FINISHED_B);
661
                        if (ret <= 0) goto end;
662
                        dtls1_stop_timer(s);
663

    
664
                        if (s->hit)
665
                                s->state=SSL3_ST_CW_CHANGE_A;
666
                        else
667
                                s->state=SSL_ST_OK;
668

    
669
#ifndef OPENSSL_NO_SCTP
670
                        if (BIO_dgram_is_sctp(SSL_get_wbio(s)) &&
671
                                state == SSL_ST_RENEGOTIATE)
672
                                {
673
                                s->d1->next_state=s->state;
674
                                s->state=DTLS1_SCTP_ST_CW_WRITE_SOCK;
675
                                }
676
#endif
677

    
678
                        s->init_num=0;
679
                        break;
680

    
681
                case SSL3_ST_CW_FLUSH:
682
                        s->rwstate=SSL_WRITING;
683
                        if (BIO_flush(s->wbio) <= 0)
684
                                {
685
                                /* If the write error was fatal, stop trying */
686
                                if (!BIO_should_retry(s->wbio))
687
                                        {
688
                                        s->rwstate=SSL_NOTHING;
689
                                        s->state=s->s3->tmp.next_state;
690
                                        }
691
                                
692
                                ret= -1;
693
                                goto end;
694
                                }
695
                        s->rwstate=SSL_NOTHING;
696
                        s->state=s->s3->tmp.next_state;
697
                        break;
698

    
699
                case SSL_ST_OK:
700
                        /* clean a few things up */
701
                        ssl3_cleanup_key_block(s);
702

    
703
#if 0
704
                        if (s->init_buf != NULL)
705
                                {
706
                                BUF_MEM_free(s->init_buf);
707
                                s->init_buf=NULL;
708
                                }
709
#endif
710

    
711
                        /* If we are not 'joining' the last two packets,
712
                         * remove the buffering now */
713
                        if (!(s->s3->flags & SSL3_FLAGS_POP_BUFFER))
714
                                ssl_free_wbio_buffer(s);
715
                        /* else do it later in ssl3_write */
716

    
717
                        s->init_num=0;
718
                        s->renegotiate=0;
719
                        s->new_session=0;
720

    
721
                        ssl_update_cache(s,SSL_SESS_CACHE_CLIENT);
722
                        if (s->hit) s->ctx->stats.sess_hit++;
723

    
724
                        ret=1;
725
                        /* s->server=0; */
726
                        s->handshake_func=dtls1_connect;
727
                        s->ctx->stats.sess_connect_good++;
728

    
729
                        if (cb != NULL) cb(s,SSL_CB_HANDSHAKE_DONE,1);
730

    
731
                        /* done with handshaking */
732
                        s->d1->handshake_read_seq  = 0;
733
                        s->d1->next_handshake_write_seq = 0;
734
                        goto end;
735
                        /* break; */
736
                        
737
                default:
738
                        SSLerr(SSL_F_DTLS1_CONNECT,SSL_R_UNKNOWN_STATE);
739
                        ret= -1;
740
                        goto end;
741
                        /* break; */
742
                        }
743

    
744
                /* did we do anything */
745
                if (!s->s3->tmp.reuse_message && !skip)
746
                        {
747
                        if (s->debug)
748
                                {
749
                                if ((ret=BIO_flush(s->wbio)) <= 0)
750
                                        goto end;
751
                                }
752

    
753
                        if ((cb != NULL) && (s->state != state))
754
                                {
755
                                new_state=s->state;
756
                                s->state=state;
757
                                cb(s,SSL_CB_CONNECT_LOOP,1);
758
                                s->state=new_state;
759
                                }
760
                        }
761
                skip=0;
762
                }
763
end:
764
        s->in_handshake--;
765
        
766
#ifndef OPENSSL_NO_SCTP
767
        /* Notify SCTP BIO socket to leave handshake
768
         * mode and allow stream identifier other
769
         * than 0. Will be ignored if no SCTP is used.
770
         */
771
        BIO_ctrl(SSL_get_wbio(s), BIO_CTRL_DGRAM_SCTP_SET_IN_HANDSHAKE, s->in_handshake, NULL);
772
#endif
773

    
774
        if (buf != NULL)
775
                BUF_MEM_free(buf);
776
        if (cb != NULL)
777
                cb(s,SSL_CB_CONNECT_EXIT,ret);
778
        return(ret);
779
        }
780

    
781
int dtls1_client_hello(SSL *s)
782
        {
783
        unsigned char *buf;
784
        unsigned char *p,*d;
785
        unsigned int i,j;
786
        unsigned long l;
787
        SSL_COMP *comp;
788

    
789
        buf=(unsigned char *)s->init_buf->data;
790
        if (s->state == SSL3_ST_CW_CLNT_HELLO_A)
791
                {
792
                SSL_SESSION *sess = s->session;
793
                if ((s->session == NULL) ||
794
                        (s->session->ssl_version != s->version) ||
795
#ifdef OPENSSL_NO_TLSEXT
796
                        !sess->session_id_length ||
797
#else
798
                        (!sess->session_id_length && !sess->tlsext_tick) ||
799
#endif
800
                        (s->session->not_resumable))
801
                        {
802
                        if (!ssl_get_new_session(s,0))
803
                                goto err;
804
                        }
805
                /* else use the pre-loaded session */
806

    
807
                p=s->s3->client_random;
808

    
809
                /* if client_random is initialized, reuse it, we are
810
                 * required to use same upon reply to HelloVerify */
811
                for (i=0;p[i]=='\0' && i<sizeof(s->s3->client_random);i++)
812
                        ;
813
                if (i==sizeof(s->s3->client_random))
814
                        ssl_fill_hello_random(s, 0, p,
815
                                              sizeof(s->s3->client_random));
816

    
817
                /* Do the message type and length last */
818
                d=p= &(buf[DTLS1_HM_HEADER_LENGTH]);
819

    
820
                *(p++)=s->version>>8;
821
                *(p++)=s->version&0xff;
822
                s->client_version=s->version;
823

    
824
                /* Random stuff */
825
                memcpy(p,s->s3->client_random,SSL3_RANDOM_SIZE);
826
                p+=SSL3_RANDOM_SIZE;
827

    
828
                /* Session ID */
829
                if (s->new_session)
830
                        i=0;
831
                else
832
                        i=s->session->session_id_length;
833
                *(p++)=i;
834
                if (i != 0)
835
                        {
836
                        if (i > sizeof s->session->session_id)
837
                                {
838
                                SSLerr(SSL_F_DTLS1_CLIENT_HELLO, ERR_R_INTERNAL_ERROR);
839
                                goto err;
840
                                }
841
                        memcpy(p,s->session->session_id,i);
842
                        p+=i;
843
                        }
844
                
845
                /* cookie stuff */
846
                if ( s->d1->cookie_len > sizeof(s->d1->cookie))
847
                        {
848
                        SSLerr(SSL_F_DTLS1_CLIENT_HELLO, ERR_R_INTERNAL_ERROR);
849
                        goto err;
850
                        }
851
                *(p++) = s->d1->cookie_len;
852
                memcpy(p, s->d1->cookie, s->d1->cookie_len);
853
                p += s->d1->cookie_len;
854

    
855
                /* Ciphers supported */
856
                i=ssl_cipher_list_to_bytes(s,SSL_get_ciphers(s),&(p[2]),0);
857
                if (i == 0)
858
                        {
859
                        SSLerr(SSL_F_DTLS1_CLIENT_HELLO,SSL_R_NO_CIPHERS_AVAILABLE);
860
                        goto err;
861
                        }
862
                s2n(i,p);
863
                p+=i;
864

    
865
                /* COMPRESSION */
866
                if (s->ctx->comp_methods == NULL)
867
                        j=0;
868
                else
869
                        j=sk_SSL_COMP_num(s->ctx->comp_methods);
870
                *(p++)=1+j;
871
                for (i=0; i<j; i++)
872
                        {
873
                        comp=sk_SSL_COMP_value(s->ctx->comp_methods,i);
874
                        *(p++)=comp->id;
875
                        }
876
                *(p++)=0; /* Add the NULL method */
877

    
878
#ifndef OPENSSL_NO_TLSEXT
879
                /* TLS extensions*/
880
                if (ssl_prepare_clienthello_tlsext(s) <= 0)
881
                        {
882
                        SSLerr(SSL_F_DTLS1_CLIENT_HELLO,SSL_R_CLIENTHELLO_TLSEXT);
883
                        goto err;
884
                        }
885
                if ((p = ssl_add_clienthello_tlsext(s, p, buf+SSL3_RT_MAX_PLAIN_LENGTH)) == NULL)
886
                        {
887
                        SSLerr(SSL_F_DTLS1_CLIENT_HELLO,ERR_R_INTERNAL_ERROR);
888
                        goto err;
889
                        }
890
#endif
891

    
892
                l=(p-d);
893
                d=buf;
894

    
895
                d = dtls1_set_message_header(s, d, SSL3_MT_CLIENT_HELLO, l, 0, l);
896

    
897
                s->state=SSL3_ST_CW_CLNT_HELLO_B;
898
                /* number of bytes to write */
899
                s->init_num=p-buf;
900
                s->init_off=0;
901

    
902
                /* buffer the message to handle re-xmits */
903
                dtls1_buffer_message(s, 0);
904
                }
905

    
906
        /* SSL3_ST_CW_CLNT_HELLO_B */
907
        return(dtls1_do_write(s,SSL3_RT_HANDSHAKE));
908
err:
909
        return(-1);
910
        }
911

    
912
static int dtls1_get_hello_verify(SSL *s)
913
        {
914
        int n, al, ok = 0;
915
        unsigned char *data;
916
        unsigned int cookie_len;
917

    
918
        n=s->method->ssl_get_message(s,
919
                DTLS1_ST_CR_HELLO_VERIFY_REQUEST_A,
920
                DTLS1_ST_CR_HELLO_VERIFY_REQUEST_B,
921
                -1,
922
                s->max_cert_list,
923
                &ok);
924

    
925
        if (!ok) return((int)n);
926

    
927
        if (s->s3->tmp.message_type != DTLS1_MT_HELLO_VERIFY_REQUEST)
928
                {
929
                s->d1->send_cookie = 0;
930
                s->s3->tmp.reuse_message=1;
931
                return(1);
932
                }
933

    
934
        data = (unsigned char *)s->init_msg;
935

    
936
        if ((data[0] != (s->version>>8)) || (data[1] != (s->version&0xff)))
937
                {
938
                SSLerr(SSL_F_DTLS1_GET_HELLO_VERIFY,SSL_R_WRONG_SSL_VERSION);
939
                s->version=(s->version&0xff00)|data[1];
940
                al = SSL_AD_PROTOCOL_VERSION;
941
                goto f_err;
942
                }
943
        data+=2;
944

    
945
        cookie_len = *(data++);
946
        if ( cookie_len > sizeof(s->d1->cookie))
947
                {
948
                al=SSL_AD_ILLEGAL_PARAMETER;
949
                goto f_err;
950
                }
951

    
952
        memcpy(s->d1->cookie, data, cookie_len);
953
        s->d1->cookie_len = cookie_len;
954

    
955
        s->d1->send_cookie = 1;
956
        return 1;
957

    
958
f_err:
959
        ssl3_send_alert(s, SSL3_AL_FATAL, al);
960
        return -1;
961
        }
962

    
963
int dtls1_send_client_key_exchange(SSL *s)
964
        {
965
        unsigned char *p,*d;
966
        int n;
967
        unsigned long alg_k;
968
#ifndef OPENSSL_NO_RSA
969
        unsigned char *q;
970
        EVP_PKEY *pkey=NULL;
971
#endif
972
#ifndef OPENSSL_NO_KRB5
973
        KSSL_ERR kssl_err;
974
#endif /* OPENSSL_NO_KRB5 */
975
#ifndef OPENSSL_NO_ECDH
976
        EC_KEY *clnt_ecdh = NULL;
977
        const EC_POINT *srvr_ecpoint = NULL;
978
        EVP_PKEY *srvr_pub_pkey = NULL;
979
        unsigned char *encodedPoint = NULL;
980
        int encoded_pt_len = 0;
981
        BN_CTX * bn_ctx = NULL;
982
#endif
983

    
984
        if (s->state == SSL3_ST_CW_KEY_EXCH_A)
985
                {
986
                d=(unsigned char *)s->init_buf->data;
987
                p= &(d[DTLS1_HM_HEADER_LENGTH]);
988
                
989
                alg_k=s->s3->tmp.new_cipher->algorithm_mkey;
990

    
991
                /* Fool emacs indentation */
992
                if (0) {}
993
#ifndef OPENSSL_NO_RSA
994
                else if (alg_k & SSL_kRSA)
995
                        {
996
                        RSA *rsa;
997
                        unsigned char tmp_buf[SSL_MAX_MASTER_KEY_LENGTH];
998

    
999
                        if (s->session->sess_cert == NULL)
1000
                                {
1001
                                /* We should always have a server certificate with SSL_kRSA. */
1002
                                SSLerr(SSL_F_DTLS1_SEND_CLIENT_KEY_EXCHANGE,ERR_R_INTERNAL_ERROR);
1003
                                goto err;
1004
                                }
1005

    
1006
                        if (s->session->sess_cert->peer_rsa_tmp != NULL)
1007
                                rsa=s->session->sess_cert->peer_rsa_tmp;
1008
                        else
1009
                                {
1010
                                pkey=X509_get_pubkey(s->session->sess_cert->peer_pkeys[SSL_PKEY_RSA_ENC].x509);
1011
                                if ((pkey == NULL) ||
1012
                                        (pkey->type != EVP_PKEY_RSA) ||
1013
                                        (pkey->pkey.rsa == NULL))
1014
                                        {
1015
                                        SSLerr(SSL_F_DTLS1_SEND_CLIENT_KEY_EXCHANGE,ERR_R_INTERNAL_ERROR);
1016
                                        goto err;
1017
                                        }
1018
                                rsa=pkey->pkey.rsa;
1019
                                EVP_PKEY_free(pkey);
1020
                                }
1021
                                
1022
                        tmp_buf[0]=s->client_version>>8;
1023
                        tmp_buf[1]=s->client_version&0xff;
1024
                        if (RAND_bytes(&(tmp_buf[2]),sizeof tmp_buf-2) <= 0)
1025
                                        goto err;
1026

    
1027
                        s->session->master_key_length=sizeof tmp_buf;
1028

    
1029
                        q=p;
1030
                        /* Fix buf for TLS and [incidentally] DTLS */
1031
                        if (s->version > SSL3_VERSION)
1032
                                p+=2;
1033
                        n=RSA_public_encrypt(sizeof tmp_buf,
1034
                                tmp_buf,p,rsa,RSA_PKCS1_PADDING);
1035
#ifdef PKCS1_CHECK
1036
                        if (s->options & SSL_OP_PKCS1_CHECK_1) p[1]++;
1037
                        if (s->options & SSL_OP_PKCS1_CHECK_2) tmp_buf[0]=0x70;
1038
#endif
1039
                        if (n <= 0)
1040
                                {
1041
                                SSLerr(SSL_F_DTLS1_SEND_CLIENT_KEY_EXCHANGE,SSL_R_BAD_RSA_ENCRYPT);
1042
                                goto err;
1043
                                }
1044

    
1045
                        /* Fix buf for TLS and [incidentally] DTLS */
1046
                        if (s->version > SSL3_VERSION)
1047
                                {
1048
                                s2n(n,q);
1049
                                n+=2;
1050
                                }
1051

    
1052
                        s->session->master_key_length=
1053
                                s->method->ssl3_enc->generate_master_secret(s,
1054
                                        s->session->master_key,
1055
                                        tmp_buf,sizeof tmp_buf);
1056
                        OPENSSL_cleanse(tmp_buf,sizeof tmp_buf);
1057
                        }
1058
#endif
1059
#ifndef OPENSSL_NO_KRB5
1060
                else if (alg_k & SSL_kKRB5)
1061
                        {
1062
                        krb5_error_code        krb5rc;
1063
                        KSSL_CTX        *kssl_ctx = s->kssl_ctx;
1064
                        /*  krb5_data        krb5_ap_req;  */
1065
                        krb5_data        *enc_ticket;
1066
                        krb5_data        authenticator, *authp = NULL;
1067
                        EVP_CIPHER_CTX        ciph_ctx;
1068
                        const EVP_CIPHER *enc = NULL;
1069
                        unsigned char        iv[EVP_MAX_IV_LENGTH];
1070
                        unsigned char        tmp_buf[SSL_MAX_MASTER_KEY_LENGTH];
1071
                        unsigned char        epms[SSL_MAX_MASTER_KEY_LENGTH 
1072
                                                + EVP_MAX_IV_LENGTH];
1073
                        int                 padl, outl = sizeof(epms);
1074

    
1075
                        EVP_CIPHER_CTX_init(&ciph_ctx);
1076

    
1077
#ifdef KSSL_DEBUG
1078
                        printf("ssl3_send_client_key_exchange(%lx & %lx)\n",
1079
                                alg_k, SSL_kKRB5);
1080
#endif        /* KSSL_DEBUG */
1081

    
1082
                        authp = NULL;
1083
#ifdef KRB5SENDAUTH
1084
                        if (KRB5SENDAUTH)  authp = &authenticator;
1085
#endif        /* KRB5SENDAUTH */
1086

    
1087
                        krb5rc = kssl_cget_tkt(kssl_ctx, &enc_ticket, authp,
1088
                                &kssl_err);
1089
                        enc = kssl_map_enc(kssl_ctx->enctype);
1090
                        if (enc == NULL)
1091
                            goto err;
1092
#ifdef KSSL_DEBUG
1093
                        {
1094
                        printf("kssl_cget_tkt rtn %d\n", krb5rc);
1095
                        if (krb5rc && kssl_err.text)
1096
                          printf("kssl_cget_tkt kssl_err=%s\n", kssl_err.text);
1097
                        }
1098
#endif        /* KSSL_DEBUG */
1099

    
1100
                        if (krb5rc)
1101
                                {
1102
                                ssl3_send_alert(s,SSL3_AL_FATAL,
1103
                                                SSL_AD_HANDSHAKE_FAILURE);
1104
                                SSLerr(SSL_F_DTLS1_SEND_CLIENT_KEY_EXCHANGE,
1105
                                                kssl_err.reason);
1106
                                goto err;
1107
                                }
1108

    
1109
                        /*  20010406 VRS - Earlier versions used KRB5 AP_REQ
1110
                        **  in place of RFC 2712 KerberosWrapper, as in:
1111
                        **
1112
                        **  Send ticket (copy to *p, set n = length)
1113
                        **  n = krb5_ap_req.length;
1114
                        **  memcpy(p, krb5_ap_req.data, krb5_ap_req.length);
1115
                        **  if (krb5_ap_req.data)  
1116
                        **    kssl_krb5_free_data_contents(NULL,&krb5_ap_req);
1117
                        **
1118
                        **  Now using real RFC 2712 KerberosWrapper
1119
                        **  (Thanks to Simon Wilkinson <sxw@sxw.org.uk>)
1120
                        **  Note: 2712 "opaque" types are here replaced
1121
                        **  with a 2-byte length followed by the value.
1122
                        **  Example:
1123
                        **  KerberosWrapper= xx xx asn1ticket 0 0 xx xx encpms
1124
                        **  Where "xx xx" = length bytes.  Shown here with
1125
                        **  optional authenticator omitted.
1126
                        */
1127

    
1128
                        /*  KerberosWrapper.Ticket                */
1129
                        s2n(enc_ticket->length,p);
1130
                        memcpy(p, enc_ticket->data, enc_ticket->length);
1131
                        p+= enc_ticket->length;
1132
                        n = enc_ticket->length + 2;
1133

    
1134
                        /*  KerberosWrapper.Authenticator        */
1135
                        if (authp  &&  authp->length)  
1136
                                {
1137
                                s2n(authp->length,p);
1138
                                memcpy(p, authp->data, authp->length);
1139
                                p+= authp->length;
1140
                                n+= authp->length + 2;
1141
                                
1142
                                free(authp->data);
1143
                                authp->data = NULL;
1144
                                authp->length = 0;
1145
                                }
1146
                        else
1147
                                {
1148
                                s2n(0,p);/*  null authenticator length        */
1149
                                n+=2;
1150
                                }
1151
 
1152
                        if (RAND_bytes(tmp_buf,sizeof tmp_buf) <= 0)
1153
                            goto err;
1154

    
1155
                        /*  20010420 VRS.  Tried it this way; failed.
1156
                        **        EVP_EncryptInit_ex(&ciph_ctx,enc, NULL,NULL);
1157
                        **        EVP_CIPHER_CTX_set_key_length(&ciph_ctx,
1158
                        **                                kssl_ctx->length);
1159
                        **        EVP_EncryptInit_ex(&ciph_ctx,NULL, key,iv);
1160
                        */
1161

    
1162
                        memset(iv, 0, sizeof iv);  /* per RFC 1510 */
1163
                        EVP_EncryptInit_ex(&ciph_ctx,enc, NULL,
1164
                                kssl_ctx->key,iv);
1165
                        EVP_EncryptUpdate(&ciph_ctx,epms,&outl,tmp_buf,
1166
                                sizeof tmp_buf);
1167
                        EVP_EncryptFinal_ex(&ciph_ctx,&(epms[outl]),&padl);
1168
                        outl += padl;
1169
                        if (outl > (int)sizeof epms)
1170
                                {
1171
                                SSLerr(SSL_F_DTLS1_SEND_CLIENT_KEY_EXCHANGE, ERR_R_INTERNAL_ERROR);
1172
                                goto err;
1173
                                }
1174
                        EVP_CIPHER_CTX_cleanup(&ciph_ctx);
1175

    
1176
                        /*  KerberosWrapper.EncryptedPreMasterSecret        */
1177
                        s2n(outl,p);
1178
                        memcpy(p, epms, outl);
1179
                        p+=outl;
1180
                        n+=outl + 2;
1181

    
1182
                        s->session->master_key_length=
1183
                                s->method->ssl3_enc->generate_master_secret(s,
1184
                                        s->session->master_key,
1185
                                        tmp_buf, sizeof tmp_buf);
1186

    
1187
                        OPENSSL_cleanse(tmp_buf, sizeof tmp_buf);
1188
                        OPENSSL_cleanse(epms, outl);
1189
                        }
1190
#endif
1191
#ifndef OPENSSL_NO_DH
1192
                else if (alg_k & (SSL_kEDH|SSL_kDHr|SSL_kDHd))
1193
                        {
1194
                        DH *dh_srvr,*dh_clnt;
1195

    
1196
                        if (s->session->sess_cert == NULL)
1197
                                {
1198
                                ssl3_send_alert(s,SSL3_AL_FATAL,SSL_AD_UNEXPECTED_MESSAGE);
1199
                                SSLerr(SSL_F_DTLS1_SEND_CLIENT_KEY_EXCHANGE,SSL_R_UNEXPECTED_MESSAGE);
1200
                                goto err;
1201
                                }
1202

    
1203
                        if (s->session->sess_cert->peer_dh_tmp != NULL)
1204
                                dh_srvr=s->session->sess_cert->peer_dh_tmp;
1205
                        else
1206
                                {
1207
                                /* we get them from the cert */
1208
                                ssl3_send_alert(s,SSL3_AL_FATAL,SSL_AD_HANDSHAKE_FAILURE);
1209
                                SSLerr(SSL_F_DTLS1_SEND_CLIENT_KEY_EXCHANGE,SSL_R_UNABLE_TO_FIND_DH_PARAMETERS);
1210
                                goto err;
1211
                                }
1212
                        
1213
                        /* generate a new random key */
1214
                        if ((dh_clnt=DHparams_dup(dh_srvr)) == NULL)
1215
                                {
1216
                                SSLerr(SSL_F_DTLS1_SEND_CLIENT_KEY_EXCHANGE,ERR_R_DH_LIB);
1217
                                goto err;
1218
                                }
1219
                        if (!DH_generate_key(dh_clnt))
1220
                                {
1221
                                SSLerr(SSL_F_DTLS1_SEND_CLIENT_KEY_EXCHANGE,ERR_R_DH_LIB);
1222
                                goto err;
1223
                                }
1224

    
1225
                        /* use the 'p' output buffer for the DH key, but
1226
                         * make sure to clear it out afterwards */
1227

    
1228
                        n=DH_compute_key(p,dh_srvr->pub_key,dh_clnt);
1229

    
1230
                        if (n <= 0)
1231
                                {
1232
                                SSLerr(SSL_F_DTLS1_SEND_CLIENT_KEY_EXCHANGE,ERR_R_DH_LIB);
1233
                                goto err;
1234
                                }
1235

    
1236
                        /* generate master key from the result */
1237
                        s->session->master_key_length=
1238
                                s->method->ssl3_enc->generate_master_secret(s,
1239
                                        s->session->master_key,p,n);
1240
                        /* clean up */
1241
                        memset(p,0,n);
1242

    
1243
                        /* send off the data */
1244
                        n=BN_num_bytes(dh_clnt->pub_key);
1245
                        s2n(n,p);
1246
                        BN_bn2bin(dh_clnt->pub_key,p);
1247
                        n+=2;
1248

    
1249
                        DH_free(dh_clnt);
1250

    
1251
                        /* perhaps clean things up a bit EAY EAY EAY EAY*/
1252
                        }
1253
#endif
1254
#ifndef OPENSSL_NO_ECDH 
1255
                else if (alg_k & (SSL_kEECDH|SSL_kECDHr|SSL_kECDHe))
1256
                        {
1257
                        const EC_GROUP *srvr_group = NULL;
1258
                        EC_KEY *tkey;
1259
                        int ecdh_clnt_cert = 0;
1260
                        int field_size = 0;
1261

    
1262
                        if (s->session->sess_cert == NULL)
1263
                                {
1264
                                ssl3_send_alert(s,SSL3_AL_FATAL,SSL_AD_UNEXPECTED_MESSAGE);
1265
                                SSLerr(SSL_F_DTLS1_SEND_CLIENT_KEY_EXCHANGE,SSL_R_UNEXPECTED_MESSAGE);
1266
                                goto err;
1267
                                }
1268

    
1269
                        /* Did we send out the client's
1270
                         * ECDH share for use in premaster
1271
                         * computation as part of client certificate?
1272
                         * If so, set ecdh_clnt_cert to 1.
1273
                         */
1274
                        if ((alg_k & (SSL_kECDHr|SSL_kECDHe)) && (s->cert != NULL)) 
1275
                                {
1276
                                /* XXX: For now, we do not support client
1277
                                 * authentication using ECDH certificates.
1278
                                 * To add such support, one needs to add
1279
                                 * code that checks for appropriate 
1280
                                 * conditions and sets ecdh_clnt_cert to 1.
1281
                                 * For example, the cert have an ECC
1282
                                 * key on the same curve as the server's
1283
                                 * and the key should be authorized for
1284
                                 * key agreement.
1285
                                 *
1286
                                 * One also needs to add code in ssl3_connect
1287
                                 * to skip sending the certificate verify
1288
                                 * message.
1289
                                 *
1290
                                 * if ((s->cert->key->privatekey != NULL) &&
1291
                                 *     (s->cert->key->privatekey->type ==
1292
                                 *      EVP_PKEY_EC) && ...)
1293
                                 * ecdh_clnt_cert = 1;
1294
                                 */
1295
                                }
1296

    
1297
                        if (s->session->sess_cert->peer_ecdh_tmp != NULL)
1298
                                {
1299
                                tkey = s->session->sess_cert->peer_ecdh_tmp;
1300
                                }
1301
                        else
1302
                                {
1303
                                /* Get the Server Public Key from Cert */
1304
                                srvr_pub_pkey = X509_get_pubkey(s->session-> \
1305
                                    sess_cert->peer_pkeys[SSL_PKEY_ECC].x509);
1306
                                if ((srvr_pub_pkey == NULL) ||
1307
                                    (srvr_pub_pkey->type != EVP_PKEY_EC) ||
1308
                                    (srvr_pub_pkey->pkey.ec == NULL))
1309
                                        {
1310
                                        SSLerr(SSL_F_DTLS1_SEND_CLIENT_KEY_EXCHANGE,
1311
                                            ERR_R_INTERNAL_ERROR);
1312
                                        goto err;
1313
                                        }
1314

    
1315
                                tkey = srvr_pub_pkey->pkey.ec;
1316
                                }
1317

    
1318
                        srvr_group   = EC_KEY_get0_group(tkey);
1319
                        srvr_ecpoint = EC_KEY_get0_public_key(tkey);
1320

    
1321
                        if ((srvr_group == NULL) || (srvr_ecpoint == NULL))
1322
                                {
1323
                                SSLerr(SSL_F_DTLS1_SEND_CLIENT_KEY_EXCHANGE,
1324
                                    ERR_R_INTERNAL_ERROR);
1325
                                goto err;
1326
                                }
1327

    
1328
                        if ((clnt_ecdh=EC_KEY_new()) == NULL) 
1329
                                {
1330
                                SSLerr(SSL_F_DTLS1_SEND_CLIENT_KEY_EXCHANGE,ERR_R_MALLOC_FAILURE);
1331
                                goto err;
1332
                                }
1333

    
1334
                        if (!EC_KEY_set_group(clnt_ecdh, srvr_group))
1335
                                {
1336
                                SSLerr(SSL_F_DTLS1_SEND_CLIENT_KEY_EXCHANGE,ERR_R_EC_LIB);
1337
                                goto err;
1338
                                }
1339
                        if (ecdh_clnt_cert) 
1340
                                { 
1341
                                /* Reuse key info from our certificate
1342
                                 * We only need our private key to perform
1343
                                 * the ECDH computation.
1344
                                 */
1345
                                const BIGNUM *priv_key;
1346
                                tkey = s->cert->key->privatekey->pkey.ec;
1347
                                priv_key = EC_KEY_get0_private_key(tkey);
1348
                                if (priv_key == NULL)
1349
                                        {
1350
                                        SSLerr(SSL_F_DTLS1_SEND_CLIENT_KEY_EXCHANGE,ERR_R_MALLOC_FAILURE);
1351
                                        goto err;
1352
                                        }
1353
                                if (!EC_KEY_set_private_key(clnt_ecdh, priv_key))
1354
                                        {
1355
                                        SSLerr(SSL_F_DTLS1_SEND_CLIENT_KEY_EXCHANGE,ERR_R_EC_LIB);
1356
                                        goto err;
1357
                                        }
1358
                                }
1359
                        else 
1360
                                {
1361
                                /* Generate a new ECDH key pair */
1362
                                if (!(EC_KEY_generate_key(clnt_ecdh)))
1363
                                        {
1364
                                        SSLerr(SSL_F_DTLS1_SEND_CLIENT_KEY_EXCHANGE, ERR_R_ECDH_LIB);
1365
                                        goto err;
1366
                                        }
1367
                                }
1368

    
1369
                        /* use the 'p' output buffer for the ECDH key, but
1370
                         * make sure to clear it out afterwards
1371
                         */
1372

    
1373
                        field_size = EC_GROUP_get_degree(srvr_group);
1374
                        if (field_size <= 0)
1375
                                {
1376
                                SSLerr(SSL_F_DTLS1_SEND_CLIENT_KEY_EXCHANGE, 
1377
                                       ERR_R_ECDH_LIB);
1378
                                goto err;
1379
                                }
1380
                        n=ECDH_compute_key(p, (field_size+7)/8, srvr_ecpoint, clnt_ecdh, NULL);
1381
                        if (n <= 0)
1382
                                {
1383
                                SSLerr(SSL_F_DTLS1_SEND_CLIENT_KEY_EXCHANGE, 
1384
                                       ERR_R_ECDH_LIB);
1385
                                goto err;
1386
                                }
1387

    
1388
                        /* generate master key from the result */
1389
                        s->session->master_key_length = s->method->ssl3_enc \
1390
                            -> generate_master_secret(s, 
1391
                                s->session->master_key,
1392
                                p, n);
1393

    
1394
                        memset(p, 0, n); /* clean up */
1395

    
1396
                        if (ecdh_clnt_cert) 
1397
                                {
1398
                                /* Send empty client key exch message */
1399
                                n = 0;
1400
                                }
1401
                        else 
1402
                                {
1403
                                /* First check the size of encoding and
1404
                                 * allocate memory accordingly.
1405
                                 */
1406
                                encoded_pt_len = 
1407
                                    EC_POINT_point2oct(srvr_group, 
1408
                                        EC_KEY_get0_public_key(clnt_ecdh), 
1409
                                        POINT_CONVERSION_UNCOMPRESSED, 
1410
                                        NULL, 0, NULL);
1411

    
1412
                                encodedPoint = (unsigned char *) 
1413
                                    OPENSSL_malloc(encoded_pt_len * 
1414
                                        sizeof(unsigned char)); 
1415
                                bn_ctx = BN_CTX_new();
1416
                                if ((encodedPoint == NULL) || 
1417
                                    (bn_ctx == NULL)) 
1418
                                        {
1419
                                        SSLerr(SSL_F_DTLS1_SEND_CLIENT_KEY_EXCHANGE,ERR_R_MALLOC_FAILURE);
1420
                                        goto err;
1421
                                        }
1422

    
1423
                                /* Encode the public key */
1424
                                n = EC_POINT_point2oct(srvr_group, 
1425
                                    EC_KEY_get0_public_key(clnt_ecdh), 
1426
                                    POINT_CONVERSION_UNCOMPRESSED, 
1427
                                    encodedPoint, encoded_pt_len, bn_ctx);
1428

    
1429
                                *p = n; /* length of encoded point */
1430
                                /* Encoded point will be copied here */
1431
                                p += 1; 
1432
                                /* copy the point */
1433
                                memcpy((unsigned char *)p, encodedPoint, n);
1434
                                /* increment n to account for length field */
1435
                                n += 1; 
1436
                                }
1437

    
1438
                        /* Free allocated memory */
1439
                        BN_CTX_free(bn_ctx);
1440
                        if (encodedPoint != NULL) OPENSSL_free(encodedPoint);
1441
                        if (clnt_ecdh != NULL) 
1442
                                 EC_KEY_free(clnt_ecdh);
1443
                        EVP_PKEY_free(srvr_pub_pkey);
1444
                        }
1445
#endif /* !OPENSSL_NO_ECDH */
1446

    
1447
#ifndef OPENSSL_NO_PSK
1448
                else if (alg_k & SSL_kPSK)
1449
                        {
1450
                        char identity[PSK_MAX_IDENTITY_LEN];
1451
                        unsigned char *t = NULL;
1452
                        unsigned char psk_or_pre_ms[PSK_MAX_PSK_LEN*2+4];
1453
                        unsigned int pre_ms_len = 0, psk_len = 0;
1454
                        int psk_err = 1;
1455

    
1456
                        n = 0;
1457
                        if (s->psk_client_callback == NULL)
1458
                                {
1459
                                SSLerr(SSL_F_DTLS1_SEND_CLIENT_KEY_EXCHANGE,
1460
                                        SSL_R_PSK_NO_CLIENT_CB);
1461
                                goto err;
1462
                                }
1463

    
1464
                        psk_len = s->psk_client_callback(s, s->ctx->psk_identity_hint,
1465
                                identity, PSK_MAX_IDENTITY_LEN,
1466
                                psk_or_pre_ms, sizeof(psk_or_pre_ms));
1467
                        if (psk_len > PSK_MAX_PSK_LEN)
1468
                                {
1469
                                SSLerr(SSL_F_DTLS1_SEND_CLIENT_KEY_EXCHANGE,
1470
                                        ERR_R_INTERNAL_ERROR);
1471
                                goto psk_err;
1472
                                }
1473
                        else if (psk_len == 0)
1474
                                {
1475
                                SSLerr(SSL_F_DTLS1_SEND_CLIENT_KEY_EXCHANGE,
1476
                                        SSL_R_PSK_IDENTITY_NOT_FOUND);
1477
                                goto psk_err;
1478
                                }
1479

    
1480
                        /* create PSK pre_master_secret */
1481
                        pre_ms_len = 2+psk_len+2+psk_len;
1482
                        t = psk_or_pre_ms;
1483
                        memmove(psk_or_pre_ms+psk_len+4, psk_or_pre_ms, psk_len);
1484
                        s2n(psk_len, t);
1485
                        memset(t, 0, psk_len);
1486
                        t+=psk_len;
1487
                        s2n(psk_len, t);
1488

    
1489
                        if (s->session->psk_identity_hint != NULL)
1490
                                OPENSSL_free(s->session->psk_identity_hint);
1491
                        s->session->psk_identity_hint = BUF_strdup(s->ctx->psk_identity_hint);
1492
                        if (s->ctx->psk_identity_hint != NULL &&
1493
                                s->session->psk_identity_hint == NULL)
1494
                                {
1495
                                SSLerr(SSL_F_DTLS1_SEND_CLIENT_KEY_EXCHANGE,
1496
                                        ERR_R_MALLOC_FAILURE);
1497
                                goto psk_err;
1498
                                }
1499

    
1500
                        if (s->session->psk_identity != NULL)
1501
                                OPENSSL_free(s->session->psk_identity);
1502
                        s->session->psk_identity = BUF_strdup(identity);
1503
                        if (s->session->psk_identity == NULL)
1504
                                {
1505
                                SSLerr(SSL_F_DTLS1_SEND_CLIENT_KEY_EXCHANGE,
1506
                                        ERR_R_MALLOC_FAILURE);
1507
                                goto psk_err;
1508
                                }
1509

    
1510
                        s->session->master_key_length =
1511
                                s->method->ssl3_enc->generate_master_secret(s,
1512
                                        s->session->master_key,
1513
                                        psk_or_pre_ms, pre_ms_len); 
1514
                        n = strlen(identity);
1515
                        s2n(n, p);
1516
                        memcpy(p, identity, n);
1517
                        n+=2;
1518
                        psk_err = 0;
1519
                psk_err:
1520
                        OPENSSL_cleanse(identity, PSK_MAX_IDENTITY_LEN);
1521
                        OPENSSL_cleanse(psk_or_pre_ms, sizeof(psk_or_pre_ms));
1522
                        if (psk_err != 0)
1523
                                {
1524
                                ssl3_send_alert(s, SSL3_AL_FATAL, SSL_AD_HANDSHAKE_FAILURE);
1525
                                goto err;
1526
                                }
1527
                        }
1528
#endif
1529
                else
1530
                        {
1531
                        ssl3_send_alert(s,SSL3_AL_FATAL,SSL_AD_HANDSHAKE_FAILURE);
1532
                        SSLerr(SSL_F_DTLS1_SEND_CLIENT_KEY_EXCHANGE,ERR_R_INTERNAL_ERROR);
1533
                        goto err;
1534
                        }
1535
                
1536
                d = dtls1_set_message_header(s, d,
1537
                SSL3_MT_CLIENT_KEY_EXCHANGE, n, 0, n);
1538
                /*
1539
                 *(d++)=SSL3_MT_CLIENT_KEY_EXCHANGE;
1540
                 l2n3(n,d);
1541
                 l2n(s->d1->handshake_write_seq,d);
1542
                 s->d1->handshake_write_seq++;
1543
                */
1544
                
1545
                s->state=SSL3_ST_CW_KEY_EXCH_B;
1546
                /* number of bytes to write */
1547
                s->init_num=n+DTLS1_HM_HEADER_LENGTH;
1548
                s->init_off=0;
1549

    
1550
                /* buffer the message to handle re-xmits */
1551
                dtls1_buffer_message(s, 0);
1552
                }
1553
        
1554
        /* SSL3_ST_CW_KEY_EXCH_B */
1555
        return(dtls1_do_write(s,SSL3_RT_HANDSHAKE));
1556
err:
1557
#ifndef OPENSSL_NO_ECDH
1558
        BN_CTX_free(bn_ctx);
1559
        if (encodedPoint != NULL) OPENSSL_free(encodedPoint);
1560
        if (clnt_ecdh != NULL) 
1561
                EC_KEY_free(clnt_ecdh);
1562
        EVP_PKEY_free(srvr_pub_pkey);
1563
#endif
1564
        return(-1);
1565
        }
1566

    
1567
int dtls1_send_client_verify(SSL *s)
1568
        {
1569
        unsigned char *p,*d;
1570
        unsigned char data[MD5_DIGEST_LENGTH+SHA_DIGEST_LENGTH];
1571
        EVP_PKEY *pkey;
1572
#ifndef OPENSSL_NO_RSA
1573
        unsigned u=0;
1574
#endif
1575
        unsigned long n;
1576
#if !defined(OPENSSL_NO_DSA) || !defined(OPENSSL_NO_ECDSA)
1577
        int j;
1578
#endif
1579

    
1580
        if (s->state == SSL3_ST_CW_CERT_VRFY_A)
1581
                {
1582
                d=(unsigned char *)s->init_buf->data;
1583
                p= &(d[DTLS1_HM_HEADER_LENGTH]);
1584
                pkey=s->cert->key->privatekey;
1585

    
1586
                s->method->ssl3_enc->cert_verify_mac(s,
1587
                NID_sha1,
1588
                        &(data[MD5_DIGEST_LENGTH]));
1589

    
1590
#ifndef OPENSSL_NO_RSA
1591
                if (pkey->type == EVP_PKEY_RSA)
1592
                        {
1593
                        s->method->ssl3_enc->cert_verify_mac(s,
1594
                                NID_md5,
1595
                                &(data[0]));
1596
                        if (RSA_sign(NID_md5_sha1, data,
1597
                                         MD5_DIGEST_LENGTH+SHA_DIGEST_LENGTH,
1598
                                        &(p[2]), &u, pkey->pkey.rsa) <= 0 )
1599
                                {
1600
                                SSLerr(SSL_F_DTLS1_SEND_CLIENT_VERIFY,ERR_R_RSA_LIB);
1601
                                goto err;
1602
                                }
1603
                        s2n(u,p);
1604
                        n=u+2;
1605
                        }
1606
                else
1607
#endif
1608
#ifndef OPENSSL_NO_DSA
1609
                        if (pkey->type == EVP_PKEY_DSA)
1610
                        {
1611
                        if (!DSA_sign(pkey->save_type,
1612
                                &(data[MD5_DIGEST_LENGTH]),
1613
                                SHA_DIGEST_LENGTH,&(p[2]),
1614
                                (unsigned int *)&j,pkey->pkey.dsa))
1615
                                {
1616
                                SSLerr(SSL_F_DTLS1_SEND_CLIENT_VERIFY,ERR_R_DSA_LIB);
1617
                                goto err;
1618
                                }
1619
                        s2n(j,p);
1620
                        n=j+2;
1621
                        }
1622
                else
1623
#endif
1624
#ifndef OPENSSL_NO_ECDSA
1625
                        if (pkey->type == EVP_PKEY_EC)
1626
                        {
1627
                        if (!ECDSA_sign(pkey->save_type,
1628
                                &(data[MD5_DIGEST_LENGTH]),
1629
                                SHA_DIGEST_LENGTH,&(p[2]),
1630
                                (unsigned int *)&j,pkey->pkey.ec))
1631
                                {
1632
                                SSLerr(SSL_F_DTLS1_SEND_CLIENT_VERIFY,
1633
                                    ERR_R_ECDSA_LIB);
1634
                                goto err;
1635
                                }
1636
                        s2n(j,p);
1637
                        n=j+2;
1638
                        }
1639
                else
1640
#endif
1641
                        {
1642
                        SSLerr(SSL_F_DTLS1_SEND_CLIENT_VERIFY,ERR_R_INTERNAL_ERROR);
1643
                        goto err;
1644
                        }
1645

    
1646
                d = dtls1_set_message_header(s, d,
1647
                        SSL3_MT_CERTIFICATE_VERIFY, n, 0, n) ;
1648

    
1649
                s->init_num=(int)n+DTLS1_HM_HEADER_LENGTH;
1650
                s->init_off=0;
1651

    
1652
                /* buffer the message to handle re-xmits */
1653
                dtls1_buffer_message(s, 0);
1654

    
1655
                s->state = SSL3_ST_CW_CERT_VRFY_B;
1656
                }
1657

    
1658
        /* s->state = SSL3_ST_CW_CERT_VRFY_B */
1659
        return(dtls1_do_write(s,SSL3_RT_HANDSHAKE));
1660
err:
1661
        return(-1);
1662
        }
1663

    
1664
int dtls1_send_client_certificate(SSL *s)
1665
        {
1666
        X509 *x509=NULL;
1667
        EVP_PKEY *pkey=NULL;
1668
        int i;
1669
        unsigned long l;
1670

    
1671
        if (s->state ==        SSL3_ST_CW_CERT_A)
1672
                {
1673
                if ((s->cert == NULL) ||
1674
                        (s->cert->key->x509 == NULL) ||
1675
                        (s->cert->key->privatekey == NULL))
1676
                        s->state=SSL3_ST_CW_CERT_B;
1677
                else
1678
                        s->state=SSL3_ST_CW_CERT_C;
1679
                }
1680

    
1681
        /* We need to get a client cert */
1682
        if (s->state == SSL3_ST_CW_CERT_B)
1683
                {
1684
                /* If we get an error, we need to
1685
                 * ssl->rwstate=SSL_X509_LOOKUP; return(-1);
1686
                 * We then get retied later */
1687
                i=0;
1688
                i = ssl_do_client_cert_cb(s, &x509, &pkey);
1689
                if (i < 0)
1690
                        {
1691
                        s->rwstate=SSL_X509_LOOKUP;
1692
                        return(-1);
1693
                        }
1694
                s->rwstate=SSL_NOTHING;
1695
                if ((i == 1) && (pkey != NULL) && (x509 != NULL))
1696
                        {
1697
                        s->state=SSL3_ST_CW_CERT_B;
1698
                        if (        !SSL_use_certificate(s,x509) ||
1699
                                !SSL_use_PrivateKey(s,pkey))
1700
                                i=0;
1701
                        }
1702
                else if (i == 1)
1703
                        {
1704
                        i=0;
1705
                        SSLerr(SSL_F_DTLS1_SEND_CLIENT_CERTIFICATE,SSL_R_BAD_DATA_RETURNED_BY_CALLBACK);
1706
                        }
1707

    
1708
                if (x509 != NULL) X509_free(x509);
1709
                if (pkey != NULL) EVP_PKEY_free(pkey);
1710
                if (i == 0)
1711
                        {
1712
                        if (s->version == SSL3_VERSION)
1713
                                {
1714
                                s->s3->tmp.cert_req=0;
1715
                                ssl3_send_alert(s,SSL3_AL_WARNING,SSL_AD_NO_CERTIFICATE);
1716
                                return(1);
1717
                                }
1718
                        else
1719
                                {
1720
                                s->s3->tmp.cert_req=2;
1721
                                }
1722
                        }
1723

    
1724
                /* Ok, we have a cert */
1725
                s->state=SSL3_ST_CW_CERT_C;
1726
                }
1727

    
1728
        if (s->state == SSL3_ST_CW_CERT_C)
1729
                {
1730
                s->state=SSL3_ST_CW_CERT_D;
1731
                l=dtls1_output_cert_chain(s,
1732
                        (s->s3->tmp.cert_req == 2)?NULL:s->cert->key->x509);
1733
                s->init_num=(int)l;
1734
                s->init_off=0;
1735

    
1736
                /* set header called by dtls1_output_cert_chain() */
1737

    
1738
                /* buffer the message to handle re-xmits */
1739
                dtls1_buffer_message(s, 0);
1740
                }
1741
        /* SSL3_ST_CW_CERT_D */
1742
        return(dtls1_do_write(s,SSL3_RT_HANDSHAKE));
1743
        }