1 /* ssl/s3_clnt.c */
2 /* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
3 * All rights reserved.
4 *
5 * This package is an SSL implementation written
6 * by Eric Young (eay@cryptsoft.com).
7 * The implementation was written so as to conform with Netscapes SSL.
8 *
9 * This library is free for commercial and non-commercial use as long as
10 * the following conditions are aheared to. The following conditions
11 * apply to all code found in this distribution, be it the RC4, RSA,
12 * lhash, DES, etc., code; not just the SSL code. The SSL documentation
13 * included with this distribution is covered by the same copyright terms
14 * except that the holder is Tim Hudson (tjh@cryptsoft.com).
15 *
16 * Copyright remains Eric Young's, and as such any Copyright notices in
17 * the code are not to be removed.
18 * If this package is used in a product, Eric Young should be given attribution
19 * as the author of the parts of the library used.
20 * This can be in the form of a textual message at program startup or
21 * in documentation (online or textual) provided with the package.
22 *
23 * Redistribution and use in source and binary forms, with or without
24 * modification, are permitted provided that the following conditions
25 * are met:
26 * 1. Redistributions of source code must retain the copyright
27 * notice, this list of conditions and the following disclaimer.
28 * 2. Redistributions in binary form must reproduce the above copyright
29 * notice, this list of conditions and the following disclaimer in the
30 * documentation and/or other materials provided with the distribution.
31 * 3. All advertising materials mentioning features or use of this software
32 * must display the following acknowledgement:
33 * "This product includes cryptographic software written by
34 * Eric Young (eay@cryptsoft.com)"
35 * The word 'cryptographic' can be left out if the rouines from the library
36 * being used are not cryptographic related :-).
37 * 4. If you include any Windows specific code (or a derivative thereof) from
38 * the apps directory (application code) you must include an acknowledgement:
39 * "This product includes software written by Tim Hudson (tjh@cryptsoft.com)"
40 *
41 * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND
42 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
43 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
44 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
45 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
46 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
47 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
48 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
49 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
50 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
51 * SUCH DAMAGE.
52 *
53 * The licence and distribution terms for any publically available version or
54 * derivative of this code cannot be changed. i.e. this code cannot simply be
55 * copied and put under another distribution licence
56 * [including the GNU Public Licence.]
57 */
58 /* ====================================================================
59 * Copyright (c) 1998-2007 The OpenSSL Project. All rights reserved.
60 *
61 * Redistribution and use in source and binary forms, with or without
62 * modification, are permitted provided that the following conditions
63 * are met:
64 *
65 * 1. Redistributions of source code must retain the above copyright
66 * notice, this list of conditions and the following disclaimer.
67 *
68 * 2. Redistributions in binary form must reproduce the above copyright
69 * notice, this list of conditions and the following disclaimer in
70 * the documentation and/or other materials provided with the
71 * distribution.
72 *
73 * 3. All advertising materials mentioning features or use of this
74 * software must display the following acknowledgment:
75 * "This product includes software developed by the OpenSSL Project
76 * for use in the OpenSSL Toolkit. (http://www.openssl.org/)"
77 *
78 * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to
79 * endorse or promote products derived from this software without
80 * prior written permission. For written permission, please contact
81 * openssl-core@openssl.org.
82 *
83 * 5. Products derived from this software may not be called "OpenSSL"
84 * nor may "OpenSSL" appear in their names without prior written
85 * permission of the OpenSSL Project.
86 *
87 * 6. Redistributions of any form whatsoever must retain the following
88 * acknowledgment:
89 * "This product includes software developed by the OpenSSL Project
90 * for use in the OpenSSL Toolkit (http://www.openssl.org/)"
91 *
92 * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY
93 * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
94 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
95 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OpenSSL PROJECT OR
96 * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
97 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
98 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
99 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
100 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
101 * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
102 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
103 * OF THE POSSIBILITY OF SUCH DAMAGE.
104 * ====================================================================
105 *
106 * This product includes cryptographic software written by Eric Young
107 * (eay@cryptsoft.com). This product includes software written by Tim
108 * Hudson (tjh@cryptsoft.com).
109 *
110 */
111 /* ====================================================================
112 * Copyright 2002 Sun Microsystems, Inc. ALL RIGHTS RESERVED.
113 *
114 * Portions of the attached software ("Contribution") are developed by
115 * SUN MICROSYSTEMS, INC., and are contributed to the OpenSSL project.
116 *
117 * The Contribution is licensed pursuant to the OpenSSL open source
118 * license provided above.
119 *
120 * ECC cipher suite support in OpenSSL originally written by
121 * Vipul Gupta and Sumit Gupta of Sun Microsystems Laboratories.
122 *
123 */
124 /* ====================================================================
125 * Copyright 2005 Nokia. All rights reserved.
126 *
127 * The portions of the attached software ("Contribution") is developed by
128 * Nokia Corporation and is licensed pursuant to the OpenSSL open source
129 * license.
130 *
131 * The Contribution, originally written by Mika Kousa and Pasi Eronen of
132 * Nokia Corporation, consists of the "PSK" (Pre-Shared Key) ciphersuites
133 * support (see RFC 4279) to OpenSSL.
134 *
135 * No patent licenses or other rights except those expressly stated in
136 * the OpenSSL open source license shall be deemed granted or received
137 * expressly, by implication, estoppel, or otherwise.
138 *
139 * No assurances are provided by Nokia that the Contribution does not
140 * infringe the patent or other intellectual property rights of any third
141 * party or that the license provides you with all the necessary rights
142 * to make use of the Contribution.
143 *
144 * THE SOFTWARE IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND. IN
145 * ADDITION TO THE DISCLAIMERS INCLUDED IN THE LICENSE, NOKIA
146 * SPECIFICALLY DISCLAIMS ANY LIABILITY FOR CLAIMS BROUGHT BY YOU OR ANY
147 * OTHER ENTITY BASED ON INFRINGEMENT OF INTELLECTUAL PROPERTY RIGHTS OR
148 * OTHERWISE.
149 */
150
151 #include <stdio.h>
152 #include "ssl_locl.h"
153 #include "kssl_lcl.h"
154 #include <openssl/buffer.h>
155 #include <openssl/rand.h>
156 #include <openssl/objects.h>
157 #include <openssl/evp.h>
158 #include <openssl/md5.h>
159 #ifdef OPENSSL_FIPS
160 #include <openssl/fips.h>
161 #endif
162 #ifndef OPENSSL_NO_DH
163 #include <openssl/dh.h>
164 #endif
165 #include <openssl/bn.h>
166 #ifndef OPENSSL_NO_ENGINE
167 #include <openssl/engine.h>
168 #endif
169
170 static const SSL_METHOD *ssl3_get_client_method(int ver);
171 static int ca_dn_cmp(const X509_NAME * const *a,const X509_NAME * const *b);
172
ssl3_get_client_method(int ver)173 static const SSL_METHOD *ssl3_get_client_method(int ver)
174 {
175 if (ver == SSL3_VERSION)
176 return(SSLv3_client_method());
177 else
178 return(NULL);
179 }
180
IMPLEMENT_ssl3_meth_func(SSLv3_client_method,ssl_undefined_function,ssl3_connect,ssl3_get_client_method)181 IMPLEMENT_ssl3_meth_func(SSLv3_client_method,
182 ssl_undefined_function,
183 ssl3_connect,
184 ssl3_get_client_method)
185
186 int ssl3_connect(SSL *s)
187 {
188 BUF_MEM *buf=NULL;
189 unsigned long Time=(unsigned long)time(NULL);
190 void (*cb)(const SSL *ssl,int type,int val)=NULL;
191 int ret= -1;
192 int new_state,state,skip=0;
193
194 RAND_add(&Time,sizeof(Time),0);
195 ERR_clear_error();
196 clear_sys_error();
197
198 if (s->info_callback != NULL)
199 cb=s->info_callback;
200 else if (s->ctx->info_callback != NULL)
201 cb=s->ctx->info_callback;
202
203 s->in_handshake++;
204 if (!SSL_in_init(s) || SSL_in_before(s)) SSL_clear(s);
205
206 #ifndef OPENSSL_NO_HEARTBEATS
207 /* If we're awaiting a HeartbeatResponse, pretend we
208 * already got and don't await it anymore, because
209 * Heartbeats don't make sense during handshakes anyway.
210 */
211 if (s->tlsext_hb_pending)
212 {
213 s->tlsext_hb_pending = 0;
214 s->tlsext_hb_seq++;
215 }
216 #endif
217
218 if (SSL_get_mode(s) & SSL_MODE_HANDSHAKE_CUTTHROUGH)
219 {
220 /* Send app data along with CCS/Finished */
221 s->s3->flags |= SSL3_FLAGS_DELAY_CLIENT_FINISHED;
222 }
223
224 for (;;)
225 {
226 state=s->state;
227
228 switch(s->state)
229 {
230 case SSL_ST_RENEGOTIATE:
231 s->renegotiate=1;
232 s->state=SSL_ST_CONNECT;
233 s->ctx->stats.sess_connect_renegotiate++;
234 /* break */
235 case SSL_ST_BEFORE:
236 case SSL_ST_CONNECT:
237 case SSL_ST_BEFORE|SSL_ST_CONNECT:
238 case SSL_ST_OK|SSL_ST_CONNECT:
239
240 s->server=0;
241 if (cb != NULL) cb(s,SSL_CB_HANDSHAKE_START,1);
242
243 if ((s->version & 0xff00 ) != 0x0300)
244 {
245 SSLerr(SSL_F_SSL3_CONNECT, ERR_R_INTERNAL_ERROR);
246 ret = -1;
247 goto end;
248 }
249
250 /* s->version=SSL3_VERSION; */
251 s->type=SSL_ST_CONNECT;
252
253 if (s->init_buf == NULL)
254 {
255 if ((buf=BUF_MEM_new()) == NULL)
256 {
257 ret= -1;
258 goto end;
259 }
260 if (!BUF_MEM_grow(buf,SSL3_RT_MAX_PLAIN_LENGTH))
261 {
262 ret= -1;
263 goto end;
264 }
265 s->init_buf=buf;
266 buf=NULL;
267 }
268
269 if (!ssl3_setup_buffers(s)) { ret= -1; goto end; }
270
271 /* setup buffing BIO */
272 if (!ssl_init_wbio_buffer(s,0)) { ret= -1; goto end; }
273
274 /* don't push the buffering BIO quite yet */
275
276 ssl3_init_finished_mac(s);
277
278 s->state=SSL3_ST_CW_CLNT_HELLO_A;
279 s->ctx->stats.sess_connect++;
280 s->init_num=0;
281 break;
282
283 case SSL3_ST_CW_CLNT_HELLO_A:
284 case SSL3_ST_CW_CLNT_HELLO_B:
285
286 s->shutdown=0;
287 ret=ssl3_client_hello(s);
288 if (ret <= 0) goto end;
289 s->state=SSL3_ST_CR_SRVR_HELLO_A;
290 s->init_num=0;
291
292 /* turn on buffering for the next lot of output */
293 if (s->bbio != s->wbio)
294 s->wbio=BIO_push(s->bbio,s->wbio);
295
296 break;
297
298 case SSL3_ST_CR_SRVR_HELLO_A:
299 case SSL3_ST_CR_SRVR_HELLO_B:
300 ret=ssl3_get_server_hello(s);
301 if (ret <= 0) goto end;
302
303 if (s->hit)
304 {
305 s->state=SSL3_ST_CR_FINISHED_A;
306 #ifndef OPENSSL_NO_TLSEXT
307 if (s->tlsext_ticket_expected)
308 {
309 /* receive renewed session ticket */
310 s->state=SSL3_ST_CR_SESSION_TICKET_A;
311 }
312 #endif
313 }
314 else
315 s->state=SSL3_ST_CR_CERT_A;
316 s->init_num=0;
317 break;
318
319 case SSL3_ST_CR_CERT_A:
320 case SSL3_ST_CR_CERT_B:
321 #ifndef OPENSSL_NO_TLSEXT
322 ret=ssl3_check_finished(s);
323 if (ret <= 0) goto end;
324 if (ret == 2)
325 {
326 s->hit = 1;
327 if (s->tlsext_ticket_expected)
328 s->state=SSL3_ST_CR_SESSION_TICKET_A;
329 else
330 s->state=SSL3_ST_CR_FINISHED_A;
331 s->init_num=0;
332 break;
333 }
334 #endif
335 /* Check if it is anon DH/ECDH, SRP auth */
336 /* or non-RSA PSK */
337 if (!(s->s3->tmp.new_cipher->algorithm_auth & (SSL_aNULL|SSL_aSRP)) &&
338 !((s->s3->tmp.new_cipher->algorithm_auth & SSL_aPSK) &&
339 !(s->s3->tmp.new_cipher->algorithm_mkey & SSL_kRSA)))
340 {
341 ret=ssl3_get_server_certificate(s);
342 if (ret <= 0) goto end;
343 #ifndef OPENSSL_NO_TLSEXT
344 if (s->tlsext_status_expected)
345 s->state=SSL3_ST_CR_CERT_STATUS_A;
346 else
347 s->state=SSL3_ST_CR_KEY_EXCH_A;
348 }
349 else
350 {
351 skip = 1;
352 s->state=SSL3_ST_CR_KEY_EXCH_A;
353 }
354 #else
355 }
356 else
357 skip=1;
358
359 s->state=SSL3_ST_CR_KEY_EXCH_A;
360 #endif
361 s->init_num=0;
362 break;
363
364 case SSL3_ST_CR_KEY_EXCH_A:
365 case SSL3_ST_CR_KEY_EXCH_B:
366 ret=ssl3_get_key_exchange(s);
367 if (ret <= 0) goto end;
368 s->state=SSL3_ST_CR_CERT_REQ_A;
369 s->init_num=0;
370
371 /* at this point we check that we have the
372 * required stuff from the server */
373 if (!ssl3_check_cert_and_algorithm(s))
374 {
375 ret= -1;
376 goto end;
377 }
378 break;
379
380 case SSL3_ST_CR_CERT_REQ_A:
381 case SSL3_ST_CR_CERT_REQ_B:
382 ret=ssl3_get_certificate_request(s);
383 if (ret <= 0) goto end;
384 s->state=SSL3_ST_CR_SRVR_DONE_A;
385 s->init_num=0;
386 break;
387
388 case SSL3_ST_CR_SRVR_DONE_A:
389 case SSL3_ST_CR_SRVR_DONE_B:
390 ret=ssl3_get_server_done(s);
391 if (ret <= 0) goto end;
392 #ifndef OPENSSL_NO_SRP
393 if (s->s3->tmp.new_cipher->algorithm_mkey & SSL_kSRP)
394 {
395 if ((ret = SRP_Calc_A_param(s))<=0)
396 {
397 SSLerr(SSL_F_SSL3_CONNECT,SSL_R_SRP_A_CALC);
398 ssl3_send_alert(s,SSL3_AL_FATAL,SSL_AD_INTERNAL_ERROR);
399 goto end;
400 }
401 }
402 #endif
403 if (s->s3->tmp.cert_req)
404 s->state=SSL3_ST_CW_CERT_A;
405 else
406 s->state=SSL3_ST_CW_KEY_EXCH_A;
407 s->init_num=0;
408
409 break;
410
411 case SSL3_ST_CW_CERT_A:
412 case SSL3_ST_CW_CERT_B:
413 case SSL3_ST_CW_CERT_C:
414 case SSL3_ST_CW_CERT_D:
415 ret=ssl3_send_client_certificate(s);
416 if (ret <= 0) goto end;
417 s->state=SSL3_ST_CW_KEY_EXCH_A;
418 s->init_num=0;
419 break;
420
421 case SSL3_ST_CW_KEY_EXCH_A:
422 case SSL3_ST_CW_KEY_EXCH_B:
423 ret=ssl3_send_client_key_exchange(s);
424 if (ret <= 0) goto end;
425 /* EAY EAY EAY need to check for DH fix cert
426 * sent back */
427 /* For TLS, cert_req is set to 2, so a cert chain
428 * of nothing is sent, but no verify packet is sent */
429 /* XXX: For now, we do not support client
430 * authentication in ECDH cipher suites with
431 * ECDH (rather than ECDSA) certificates.
432 * We need to skip the certificate verify
433 * message when client's ECDH public key is sent
434 * inside the client certificate.
435 */
436 if (s->s3->tmp.cert_req == 1)
437 {
438 s->state=SSL3_ST_CW_CERT_VRFY_A;
439 }
440 else
441 {
442 s->state=SSL3_ST_CW_CHANGE_A;
443 s->s3->change_cipher_spec=0;
444 }
445 if (s->s3->flags & TLS1_FLAGS_SKIP_CERT_VERIFY)
446 {
447 s->state=SSL3_ST_CW_CHANGE_A;
448 s->s3->change_cipher_spec=0;
449 }
450
451 s->init_num=0;
452 break;
453
454 case SSL3_ST_CW_CERT_VRFY_A:
455 case SSL3_ST_CW_CERT_VRFY_B:
456 ret=ssl3_send_client_verify(s);
457 if (ret <= 0) goto end;
458 s->state=SSL3_ST_CW_CHANGE_A;
459 s->init_num=0;
460 s->s3->change_cipher_spec=0;
461 break;
462
463 case SSL3_ST_CW_CHANGE_A:
464 case SSL3_ST_CW_CHANGE_B:
465 ret=ssl3_send_change_cipher_spec(s,
466 SSL3_ST_CW_CHANGE_A,SSL3_ST_CW_CHANGE_B);
467 if (ret <= 0) goto end;
468
469 s->state=SSL3_ST_CW_FINISHED_A;
470 #if !defined(OPENSSL_NO_TLSEXT)
471 if (s->s3->tlsext_channel_id_valid)
472 s->state=SSL3_ST_CW_CHANNEL_ID_A;
473 # if !defined(OPENSSL_NO_NEXTPROTONEG)
474 if (s->s3->next_proto_neg_seen)
475 s->state=SSL3_ST_CW_NEXT_PROTO_A;
476 # endif
477 #endif
478 s->init_num=0;
479
480 s->session->cipher=s->s3->tmp.new_cipher;
481 #ifdef OPENSSL_NO_COMP
482 s->session->compress_meth=0;
483 #else
484 if (s->s3->tmp.new_compression == NULL)
485 s->session->compress_meth=0;
486 else
487 s->session->compress_meth=
488 s->s3->tmp.new_compression->id;
489 #endif
490 if (!s->method->ssl3_enc->setup_key_block(s))
491 {
492 ret= -1;
493 goto end;
494 }
495
496 if (!s->method->ssl3_enc->change_cipher_state(s,
497 SSL3_CHANGE_CIPHER_CLIENT_WRITE))
498 {
499 ret= -1;
500 goto end;
501 }
502
503 break;
504
505 #if !defined(OPENSSL_NO_TLSEXT) && !defined(OPENSSL_NO_NEXTPROTONEG)
506 case SSL3_ST_CW_NEXT_PROTO_A:
507 case SSL3_ST_CW_NEXT_PROTO_B:
508 ret=ssl3_send_next_proto(s);
509 if (ret <= 0) goto end;
510 if (s->s3->tlsext_channel_id_valid)
511 s->state=SSL3_ST_CW_CHANNEL_ID_A;
512 else
513 s->state=SSL3_ST_CW_FINISHED_A;
514 break;
515 #endif
516
517 #if !defined(OPENSSL_NO_TLSEXT)
518 case SSL3_ST_CW_CHANNEL_ID_A:
519 case SSL3_ST_CW_CHANNEL_ID_B:
520 ret=ssl3_send_channel_id(s);
521 if (ret <= 0) goto end;
522 s->state=SSL3_ST_CW_FINISHED_A;
523 break;
524 #endif
525
526 case SSL3_ST_CW_FINISHED_A:
527 case SSL3_ST_CW_FINISHED_B:
528 ret=ssl3_send_finished(s,
529 SSL3_ST_CW_FINISHED_A,SSL3_ST_CW_FINISHED_B,
530 s->method->ssl3_enc->client_finished_label,
531 s->method->ssl3_enc->client_finished_label_len);
532 if (ret <= 0) goto end;
533 s->s3->flags |= SSL3_FLAGS_CCS_OK;
534 s->state=SSL3_ST_CW_FLUSH;
535
536 /* clear flags */
537 s->s3->flags&= ~SSL3_FLAGS_POP_BUFFER;
538 if (s->hit)
539 {
540 s->s3->tmp.next_state=SSL_ST_OK;
541 if (s->s3->flags & SSL3_FLAGS_DELAY_CLIENT_FINISHED)
542 {
543 s->state=SSL_ST_OK;
544 s->s3->flags|=SSL3_FLAGS_POP_BUFFER;
545 s->s3->delay_buf_pop_ret=0;
546 }
547 }
548 else
549 {
550 /* This is a non-resumption handshake. If it
551 * involves ChannelID, then record the
552 * handshake hashes at this point in the
553 * session so that any resumption of this
554 * session with ChannelID can sign those
555 * hashes. */
556 if (s->s3->tlsext_channel_id_new)
557 {
558 ret = tls1_record_handshake_hashes_for_channel_id(s);
559 if (ret <= 0)
560 goto end;
561 }
562 if ((SSL_get_mode(s) & SSL_MODE_HANDSHAKE_CUTTHROUGH)
563 && ssl3_can_cutthrough(s)
564 && s->s3->previous_server_finished_len == 0 /* no cutthrough on renegotiation (would complicate the state machine) */
565 )
566 {
567 if (s->s3->flags & SSL3_FLAGS_DELAY_CLIENT_FINISHED)
568 {
569 s->state=SSL3_ST_CUTTHROUGH_COMPLETE;
570 s->s3->flags|=SSL3_FLAGS_POP_BUFFER;
571 s->s3->delay_buf_pop_ret=0;
572 }
573 else
574 {
575 s->s3->tmp.next_state=SSL3_ST_CUTTHROUGH_COMPLETE;
576 }
577 }
578 else
579 {
580 #ifndef OPENSSL_NO_TLSEXT
581 /* Allow NewSessionTicket if ticket expected */
582 if (s->tlsext_ticket_expected)
583 s->s3->tmp.next_state=SSL3_ST_CR_SESSION_TICKET_A;
584 else
585 #endif
586 s->s3->tmp.next_state=SSL3_ST_CR_FINISHED_A;
587 }
588 }
589 s->init_num=0;
590 break;
591
592 #ifndef OPENSSL_NO_TLSEXT
593 case SSL3_ST_CR_SESSION_TICKET_A:
594 case SSL3_ST_CR_SESSION_TICKET_B:
595 ret=ssl3_get_new_session_ticket(s);
596 if (ret <= 0) goto end;
597 s->state=SSL3_ST_CR_FINISHED_A;
598 s->init_num=0;
599 break;
600
601 case SSL3_ST_CR_CERT_STATUS_A:
602 case SSL3_ST_CR_CERT_STATUS_B:
603 ret=ssl3_get_cert_status(s);
604 if (ret <= 0) goto end;
605 s->state=SSL3_ST_CR_KEY_EXCH_A;
606 s->init_num=0;
607 break;
608 #endif
609
610 case SSL3_ST_CR_FINISHED_A:
611 case SSL3_ST_CR_FINISHED_B:
612
613 s->s3->flags |= SSL3_FLAGS_CCS_OK;
614 ret=ssl3_get_finished(s,SSL3_ST_CR_FINISHED_A,
615 SSL3_ST_CR_FINISHED_B);
616 if (ret <= 0) goto end;
617
618 if (s->hit)
619 s->state=SSL3_ST_CW_CHANGE_A;
620 else
621 s->state=SSL_ST_OK;
622 s->init_num=0;
623 break;
624
625 case SSL3_ST_CW_FLUSH:
626 s->rwstate=SSL_WRITING;
627 if (BIO_flush(s->wbio) <= 0)
628 {
629 ret= -1;
630 goto end;
631 }
632 s->rwstate=SSL_NOTHING;
633 s->state=s->s3->tmp.next_state;
634 break;
635
636 case SSL3_ST_CUTTHROUGH_COMPLETE:
637 #ifndef OPENSSL_NO_TLSEXT
638 /* Allow NewSessionTicket if ticket expected */
639 if (s->tlsext_ticket_expected)
640 s->state=SSL3_ST_CR_SESSION_TICKET_A;
641 else
642 #endif
643 s->state=SSL3_ST_CR_FINISHED_A;
644
645 /* SSL_write() will take care of flushing buffered data if
646 * DELAY_CLIENT_FINISHED is set.
647 */
648 if (!(s->s3->flags & SSL3_FLAGS_DELAY_CLIENT_FINISHED))
649 ssl_free_wbio_buffer(s);
650 ret = 1;
651 goto end;
652 /* break; */
653
654 case SSL_ST_OK:
655 /* clean a few things up */
656 ssl3_cleanup_key_block(s);
657
658 if (s->init_buf != NULL)
659 {
660 BUF_MEM_free(s->init_buf);
661 s->init_buf=NULL;
662 }
663
664 /* If we are not 'joining' the last two packets,
665 * remove the buffering now */
666 if (!(s->s3->flags & SSL3_FLAGS_POP_BUFFER))
667 ssl_free_wbio_buffer(s);
668 /* else do it later in ssl3_write */
669
670 s->init_num=0;
671 s->renegotiate=0;
672 s->new_session=0;
673
674 ssl_update_cache(s,SSL_SESS_CACHE_CLIENT);
675 if (s->hit) s->ctx->stats.sess_hit++;
676
677 ret=1;
678 /* s->server=0; */
679 s->handshake_func=ssl3_connect;
680 s->ctx->stats.sess_connect_good++;
681
682 if (cb != NULL) cb(s,SSL_CB_HANDSHAKE_DONE,1);
683
684 goto end;
685 /* break; */
686
687 default:
688 SSLerr(SSL_F_SSL3_CONNECT,SSL_R_UNKNOWN_STATE);
689 ret= -1;
690 goto end;
691 /* break; */
692 }
693
694 /* did we do anything */
695 if (!s->s3->tmp.reuse_message && !skip)
696 {
697 if (s->debug)
698 {
699 if ((ret=BIO_flush(s->wbio)) <= 0)
700 goto end;
701 }
702
703 if ((cb != NULL) && (s->state != state))
704 {
705 new_state=s->state;
706 s->state=state;
707 cb(s,SSL_CB_CONNECT_LOOP,1);
708 s->state=new_state;
709 }
710 }
711 skip=0;
712 }
713 end:
714 s->in_handshake--;
715 if (buf != NULL)
716 BUF_MEM_free(buf);
717 if (cb != NULL)
718 cb(s,SSL_CB_CONNECT_EXIT,ret);
719 return(ret);
720 }
721
722
ssl3_client_hello(SSL * s)723 int ssl3_client_hello(SSL *s)
724 {
725 unsigned char *buf;
726 unsigned char *p,*d;
727 int i;
728 unsigned long l;
729 #ifndef OPENSSL_NO_COMP
730 int j;
731 SSL_COMP *comp;
732 #endif
733
734 buf=(unsigned char *)s->init_buf->data;
735 if (s->state == SSL3_ST_CW_CLNT_HELLO_A)
736 {
737 SSL_SESSION *sess = s->session;
738 if ((sess == NULL) ||
739 (sess->ssl_version != s->version) ||
740 #ifdef OPENSSL_NO_TLSEXT
741 !sess->session_id_length ||
742 #else
743 (!sess->session_id_length && !sess->tlsext_tick) ||
744 #endif
745 (sess->not_resumable))
746 {
747 if (!s->session_creation_enabled)
748 {
749 ssl3_send_alert(s,SSL3_AL_FATAL,SSL_AD_HANDSHAKE_FAILURE);
750 SSLerr(SSL_F_SSL3_CLIENT_HELLO,SSL_R_SESSION_MAY_NOT_BE_CREATED);
751 goto err;
752 }
753 if (!ssl_get_new_session(s,0))
754 goto err;
755 }
756 /* else use the pre-loaded session */
757
758 p=s->s3->client_random;
759
760 if (ssl_fill_hello_random(s, 0, p, SSL3_RANDOM_SIZE) <= 0)
761 goto err;
762
763 /* Do the message type and length last */
764 d=p= &(buf[4]);
765
766 /* version indicates the negotiated version: for example from
767 * an SSLv2/v3 compatible client hello). The client_version
768 * field is the maximum version we permit and it is also
769 * used in RSA encrypted premaster secrets. Some servers can
770 * choke if we initially report a higher version then
771 * renegotiate to a lower one in the premaster secret. This
772 * didn't happen with TLS 1.0 as most servers supported it
773 * but it can with TLS 1.1 or later if the server only supports
774 * 1.0.
775 *
776 * Possible scenario with previous logic:
777 * 1. Client hello indicates TLS 1.2
778 * 2. Server hello says TLS 1.0
779 * 3. RSA encrypted premaster secret uses 1.2.
780 * 4. Handhaked proceeds using TLS 1.0.
781 * 5. Server sends hello request to renegotiate.
782 * 6. Client hello indicates TLS v1.0 as we now
783 * know that is maximum server supports.
784 * 7. Server chokes on RSA encrypted premaster secret
785 * containing version 1.0.
786 *
787 * For interoperability it should be OK to always use the
788 * maximum version we support in client hello and then rely
789 * on the checking of version to ensure the servers isn't
790 * being inconsistent: for example initially negotiating with
791 * TLS 1.0 and renegotiating with TLS 1.2. We do this by using
792 * client_version in client hello and not resetting it to
793 * the negotiated version.
794 */
795 #if 0
796 *(p++)=s->version>>8;
797 *(p++)=s->version&0xff;
798 s->client_version=s->version;
799 #else
800 *(p++)=s->client_version>>8;
801 *(p++)=s->client_version&0xff;
802 #endif
803
804 /* Random stuff */
805 memcpy(p,s->s3->client_random,SSL3_RANDOM_SIZE);
806 p+=SSL3_RANDOM_SIZE;
807
808 /* Session ID */
809 if (s->new_session)
810 i=0;
811 else
812 i=s->session->session_id_length;
813 *(p++)=i;
814 if (i != 0)
815 {
816 if (i > (int)sizeof(s->session->session_id))
817 {
818 SSLerr(SSL_F_SSL3_CLIENT_HELLO, ERR_R_INTERNAL_ERROR);
819 goto err;
820 }
821 memcpy(p,s->session->session_id,i);
822 p+=i;
823 }
824
825 /* Ciphers supported */
826 i=ssl_cipher_list_to_bytes(s,SSL_get_ciphers(s),&(p[2]),0);
827 if (i == 0)
828 {
829 SSLerr(SSL_F_SSL3_CLIENT_HELLO,SSL_R_NO_CIPHERS_AVAILABLE);
830 goto err;
831 }
832 #ifdef OPENSSL_MAX_TLS1_2_CIPHER_LENGTH
833 /* Some servers hang if client hello > 256 bytes
834 * as hack workaround chop number of supported ciphers
835 * to keep it well below this if we use TLS v1.2
836 */
837 if (TLS1_get_version(s) >= TLS1_2_VERSION
838 && i > OPENSSL_MAX_TLS1_2_CIPHER_LENGTH)
839 i = OPENSSL_MAX_TLS1_2_CIPHER_LENGTH & ~1;
840 #endif
841 s2n(i,p);
842 p+=i;
843
844 /* COMPRESSION */
845 #ifdef OPENSSL_NO_COMP
846 *(p++)=1;
847 #else
848
849 if ((s->options & SSL_OP_NO_COMPRESSION)
850 || !s->ctx->comp_methods)
851 j=0;
852 else
853 j=sk_SSL_COMP_num(s->ctx->comp_methods);
854 *(p++)=1+j;
855 for (i=0; i<j; i++)
856 {
857 comp=sk_SSL_COMP_value(s->ctx->comp_methods,i);
858 *(p++)=comp->id;
859 }
860 #endif
861 *(p++)=0; /* Add the NULL method */
862
863 #ifndef OPENSSL_NO_TLSEXT
864 /* TLS extensions*/
865 if (ssl_prepare_clienthello_tlsext(s) <= 0)
866 {
867 SSLerr(SSL_F_SSL3_CLIENT_HELLO,SSL_R_CLIENTHELLO_TLSEXT);
868 goto err;
869 }
870 if ((p = ssl_add_clienthello_tlsext(s, p, buf+SSL3_RT_MAX_PLAIN_LENGTH)) == NULL)
871 {
872 SSLerr(SSL_F_SSL3_CLIENT_HELLO,ERR_R_INTERNAL_ERROR);
873 goto err;
874 }
875 #endif
876
877 l=(p-d);
878 d=buf;
879 *(d++)=SSL3_MT_CLIENT_HELLO;
880 l2n3(l,d);
881
882 s->state=SSL3_ST_CW_CLNT_HELLO_B;
883 /* number of bytes to write */
884 s->init_num=p-buf;
885 s->init_off=0;
886 }
887
888 /* SSL3_ST_CW_CLNT_HELLO_B */
889 return(ssl3_do_write(s,SSL3_RT_HANDSHAKE));
890 err:
891 return(-1);
892 }
893
ssl3_get_server_hello(SSL * s)894 int ssl3_get_server_hello(SSL *s)
895 {
896 STACK_OF(SSL_CIPHER) *sk;
897 const SSL_CIPHER *c;
898 unsigned char *p,*d;
899 int i,al,ok;
900 unsigned int j;
901 long n;
902 #ifndef OPENSSL_NO_COMP
903 SSL_COMP *comp;
904 #endif
905
906 n=s->method->ssl_get_message(s,
907 SSL3_ST_CR_SRVR_HELLO_A,
908 SSL3_ST_CR_SRVR_HELLO_B,
909 -1,
910 20000, /* ?? */
911 &ok);
912
913 if (!ok) return((int)n);
914
915 if ( SSL_version(s) == DTLS1_VERSION || SSL_version(s) == DTLS1_BAD_VER)
916 {
917 if ( s->s3->tmp.message_type == DTLS1_MT_HELLO_VERIFY_REQUEST)
918 {
919 if ( s->d1->send_cookie == 0)
920 {
921 s->s3->tmp.reuse_message = 1;
922 return 1;
923 }
924 else /* already sent a cookie */
925 {
926 al=SSL_AD_UNEXPECTED_MESSAGE;
927 SSLerr(SSL_F_SSL3_GET_SERVER_HELLO,SSL_R_BAD_MESSAGE_TYPE);
928 goto f_err;
929 }
930 }
931 }
932
933 if ( s->s3->tmp.message_type != SSL3_MT_SERVER_HELLO)
934 {
935 al=SSL_AD_UNEXPECTED_MESSAGE;
936 SSLerr(SSL_F_SSL3_GET_SERVER_HELLO,SSL_R_BAD_MESSAGE_TYPE);
937 goto f_err;
938 }
939
940 d=p=(unsigned char *)s->init_msg;
941
942 if ((p[0] != (s->version>>8)) || (p[1] != (s->version&0xff)))
943 {
944 SSLerr(SSL_F_SSL3_GET_SERVER_HELLO,SSL_R_WRONG_SSL_VERSION);
945 s->version=(s->version&0xff00)|p[1];
946 al=SSL_AD_PROTOCOL_VERSION;
947 goto f_err;
948 }
949 p+=2;
950
951 /* load the server hello data */
952 /* load the server random */
953 memcpy(s->s3->server_random,p,SSL3_RANDOM_SIZE);
954 p+=SSL3_RANDOM_SIZE;
955
956 /* get the session-id */
957 j= *(p++);
958
959 if ((j > sizeof s->session->session_id) || (j > SSL3_SESSION_ID_SIZE))
960 {
961 al=SSL_AD_ILLEGAL_PARAMETER;
962 SSLerr(SSL_F_SSL3_GET_SERVER_HELLO,SSL_R_SSL3_SESSION_ID_TOO_LONG);
963 goto f_err;
964 }
965
966 #ifndef OPENSSL_NO_TLSEXT
967 /* check if we want to resume the session based on external pre-shared secret */
968 if (s->version >= TLS1_VERSION && s->tls_session_secret_cb)
969 {
970 SSL_CIPHER *pref_cipher=NULL;
971 s->session->master_key_length=sizeof(s->session->master_key);
972 if (s->tls_session_secret_cb(s, s->session->master_key,
973 &s->session->master_key_length,
974 NULL, &pref_cipher,
975 s->tls_session_secret_cb_arg))
976 {
977 s->session->cipher = pref_cipher ?
978 pref_cipher : ssl_get_cipher_by_char(s, p+j);
979 s->s3->flags |= SSL3_FLAGS_CCS_OK;
980 }
981 }
982 #endif /* OPENSSL_NO_TLSEXT */
983
984 if (j != 0 && j == s->session->session_id_length
985 && memcmp(p,s->session->session_id,j) == 0)
986 {
987 if(s->sid_ctx_length != s->session->sid_ctx_length
988 || memcmp(s->session->sid_ctx,s->sid_ctx,s->sid_ctx_length))
989 {
990 /* actually a client application bug */
991 al=SSL_AD_ILLEGAL_PARAMETER;
992 SSLerr(SSL_F_SSL3_GET_SERVER_HELLO,SSL_R_ATTEMPT_TO_REUSE_SESSION_IN_DIFFERENT_CONTEXT);
993 goto f_err;
994 }
995 s->s3->flags |= SSL3_FLAGS_CCS_OK;
996 s->hit=1;
997 }
998 else /* a miss or crap from the other end */
999 {
1000 /* If we were trying for session-id reuse, make a new
1001 * SSL_SESSION so we don't stuff up other people */
1002 s->hit=0;
1003 if (s->session->session_id_length > 0)
1004 {
1005 if (!s->session_creation_enabled)
1006 {
1007 ssl3_send_alert(s,SSL3_AL_FATAL,SSL_AD_HANDSHAKE_FAILURE);
1008 SSLerr(SSL_F_SSL3_GET_SERVER_HELLO,SSL_R_SESSION_MAY_NOT_BE_CREATED);
1009 goto err;
1010 }
1011 if (!ssl_get_new_session(s,0))
1012 {
1013 al=SSL_AD_INTERNAL_ERROR;
1014 goto f_err;
1015 }
1016 }
1017 s->session->session_id_length=j;
1018 memcpy(s->session->session_id,p,j); /* j could be 0 */
1019 }
1020 p+=j;
1021 c=ssl_get_cipher_by_char(s,p);
1022 if (c == NULL)
1023 {
1024 /* unknown cipher */
1025 al=SSL_AD_ILLEGAL_PARAMETER;
1026 SSLerr(SSL_F_SSL3_GET_SERVER_HELLO,SSL_R_UNKNOWN_CIPHER_RETURNED);
1027 goto f_err;
1028 }
1029 /* TLS v1.2 only ciphersuites require v1.2 or later */
1030 if ((c->algorithm_ssl & SSL_TLSV1_2) &&
1031 (TLS1_get_version(s) < TLS1_2_VERSION))
1032 {
1033 al=SSL_AD_ILLEGAL_PARAMETER;
1034 SSLerr(SSL_F_SSL3_GET_SERVER_HELLO,SSL_R_WRONG_CIPHER_RETURNED);
1035 goto f_err;
1036 }
1037 #ifndef OPENSSL_NO_SRP
1038 if (((c->algorithm_mkey & SSL_kSRP) || (c->algorithm_auth & SSL_aSRP)) &&
1039 !(s->srp_ctx.srp_Mask & SSL_kSRP))
1040 {
1041 al=SSL_AD_ILLEGAL_PARAMETER;
1042 SSLerr(SSL_F_SSL3_GET_SERVER_HELLO,SSL_R_WRONG_CIPHER_RETURNED);
1043 goto f_err;
1044 }
1045 #endif /* OPENSSL_NO_SRP */
1046 p+=ssl_put_cipher_by_char(s,NULL,NULL);
1047
1048 sk=ssl_get_ciphers_by_id(s);
1049 i=sk_SSL_CIPHER_find(sk,c);
1050 if (i < 0)
1051 {
1052 /* we did not say we would use this cipher */
1053 al=SSL_AD_ILLEGAL_PARAMETER;
1054 SSLerr(SSL_F_SSL3_GET_SERVER_HELLO,SSL_R_WRONG_CIPHER_RETURNED);
1055 goto f_err;
1056 }
1057
1058 /* Depending on the session caching (internal/external), the cipher
1059 and/or cipher_id values may not be set. Make sure that
1060 cipher_id is set and use it for comparison. */
1061 if (s->session->cipher)
1062 s->session->cipher_id = s->session->cipher->id;
1063 if (s->hit && (s->session->cipher_id != c->id))
1064 {
1065 /* Workaround is now obsolete */
1066 #if 0
1067 if (!(s->options &
1068 SSL_OP_NETSCAPE_REUSE_CIPHER_CHANGE_BUG))
1069 #endif
1070 {
1071 al=SSL_AD_ILLEGAL_PARAMETER;
1072 SSLerr(SSL_F_SSL3_GET_SERVER_HELLO,SSL_R_OLD_SESSION_CIPHER_NOT_RETURNED);
1073 goto f_err;
1074 }
1075 }
1076 s->s3->tmp.new_cipher=c;
1077 /* Don't digest cached records if TLS v1.2: we may need them for
1078 * client authentication.
1079 */
1080 if (TLS1_get_version(s) < TLS1_2_VERSION && !ssl3_digest_cached_records(s))
1081 {
1082 al = SSL_AD_INTERNAL_ERROR;
1083 goto f_err;
1084 }
1085 /* lets get the compression algorithm */
1086 /* COMPRESSION */
1087 #ifdef OPENSSL_NO_COMP
1088 if (*(p++) != 0)
1089 {
1090 al=SSL_AD_ILLEGAL_PARAMETER;
1091 SSLerr(SSL_F_SSL3_GET_SERVER_HELLO,SSL_R_UNSUPPORTED_COMPRESSION_ALGORITHM);
1092 goto f_err;
1093 }
1094 /* If compression is disabled we'd better not try to resume a session
1095 * using compression.
1096 */
1097 if (s->session->compress_meth != 0)
1098 {
1099 al=SSL_AD_INTERNAL_ERROR;
1100 SSLerr(SSL_F_SSL3_GET_SERVER_HELLO,SSL_R_INCONSISTENT_COMPRESSION);
1101 goto f_err;
1102 }
1103 #else
1104 j= *(p++);
1105 if (s->hit && j != s->session->compress_meth)
1106 {
1107 al=SSL_AD_ILLEGAL_PARAMETER;
1108 SSLerr(SSL_F_SSL3_GET_SERVER_HELLO,SSL_R_OLD_SESSION_COMPRESSION_ALGORITHM_NOT_RETURNED);
1109 goto f_err;
1110 }
1111 if (j == 0)
1112 comp=NULL;
1113 else if (s->options & SSL_OP_NO_COMPRESSION)
1114 {
1115 al=SSL_AD_ILLEGAL_PARAMETER;
1116 SSLerr(SSL_F_SSL3_GET_SERVER_HELLO,SSL_R_COMPRESSION_DISABLED);
1117 goto f_err;
1118 }
1119 else
1120 comp=ssl3_comp_find(s->ctx->comp_methods,j);
1121
1122 if ((j != 0) && (comp == NULL))
1123 {
1124 al=SSL_AD_ILLEGAL_PARAMETER;
1125 SSLerr(SSL_F_SSL3_GET_SERVER_HELLO,SSL_R_UNSUPPORTED_COMPRESSION_ALGORITHM);
1126 goto f_err;
1127 }
1128 else
1129 {
1130 s->s3->tmp.new_compression=comp;
1131 }
1132 #endif
1133
1134 #ifndef OPENSSL_NO_TLSEXT
1135 /* TLS extensions*/
1136 if (s->version >= SSL3_VERSION)
1137 {
1138 if (!ssl_parse_serverhello_tlsext(s,&p,d,n, &al))
1139 {
1140 /* 'al' set by ssl_parse_serverhello_tlsext */
1141 SSLerr(SSL_F_SSL3_GET_SERVER_HELLO,SSL_R_PARSE_TLSEXT);
1142 goto f_err;
1143 }
1144 if (ssl_check_serverhello_tlsext(s) <= 0)
1145 {
1146 SSLerr(SSL_F_SSL3_GET_SERVER_HELLO,SSL_R_SERVERHELLO_TLSEXT);
1147 goto err;
1148 }
1149 }
1150 #endif
1151
1152 if (p != (d+n))
1153 {
1154 /* wrong packet length */
1155 al=SSL_AD_DECODE_ERROR;
1156 SSLerr(SSL_F_SSL3_GET_SERVER_HELLO,SSL_R_BAD_PACKET_LENGTH);
1157 goto f_err;
1158 }
1159
1160 return(1);
1161 f_err:
1162 ssl3_send_alert(s,SSL3_AL_FATAL,al);
1163 err:
1164 return(-1);
1165 }
1166
ssl3_get_server_certificate(SSL * s)1167 int ssl3_get_server_certificate(SSL *s)
1168 {
1169 int al,i,ok,ret= -1;
1170 unsigned long n,nc,llen,l;
1171 X509 *x=NULL;
1172 const unsigned char *q,*p;
1173 unsigned char *d;
1174 STACK_OF(X509) *sk=NULL;
1175 SESS_CERT *sc;
1176 EVP_PKEY *pkey=NULL;
1177 int need_cert = 1; /* VRS: 0=> will allow null cert if auth == KRB5 */
1178
1179 n=s->method->ssl_get_message(s,
1180 SSL3_ST_CR_CERT_A,
1181 SSL3_ST_CR_CERT_B,
1182 -1,
1183 s->max_cert_list,
1184 &ok);
1185
1186 if (!ok) return((int)n);
1187
1188 if ((s->s3->tmp.message_type == SSL3_MT_SERVER_KEY_EXCHANGE) ||
1189 ((s->s3->tmp.new_cipher->algorithm_auth & SSL_aKRB5) &&
1190 (s->s3->tmp.message_type == SSL3_MT_SERVER_DONE)))
1191 {
1192 s->s3->tmp.reuse_message=1;
1193 return(1);
1194 }
1195
1196 if (s->s3->tmp.message_type != SSL3_MT_CERTIFICATE)
1197 {
1198 al=SSL_AD_UNEXPECTED_MESSAGE;
1199 SSLerr(SSL_F_SSL3_GET_SERVER_CERTIFICATE,SSL_R_BAD_MESSAGE_TYPE);
1200 goto f_err;
1201 }
1202 p=d=(unsigned char *)s->init_msg;
1203
1204 if ((sk=sk_X509_new_null()) == NULL)
1205 {
1206 SSLerr(SSL_F_SSL3_GET_SERVER_CERTIFICATE,ERR_R_MALLOC_FAILURE);
1207 goto err;
1208 }
1209
1210 n2l3(p,llen);
1211 if (llen+3 != n)
1212 {
1213 al=SSL_AD_DECODE_ERROR;
1214 SSLerr(SSL_F_SSL3_GET_SERVER_CERTIFICATE,SSL_R_LENGTH_MISMATCH);
1215 goto f_err;
1216 }
1217 for (nc=0; nc<llen; )
1218 {
1219 n2l3(p,l);
1220 if ((l+nc+3) > llen)
1221 {
1222 al=SSL_AD_DECODE_ERROR;
1223 SSLerr(SSL_F_SSL3_GET_SERVER_CERTIFICATE,SSL_R_CERT_LENGTH_MISMATCH);
1224 goto f_err;
1225 }
1226
1227 q=p;
1228 x=d2i_X509(NULL,&q,l);
1229 if (x == NULL)
1230 {
1231 al=SSL_AD_BAD_CERTIFICATE;
1232 SSLerr(SSL_F_SSL3_GET_SERVER_CERTIFICATE,ERR_R_ASN1_LIB);
1233 goto f_err;
1234 }
1235 if (q != (p+l))
1236 {
1237 al=SSL_AD_DECODE_ERROR;
1238 SSLerr(SSL_F_SSL3_GET_SERVER_CERTIFICATE,SSL_R_CERT_LENGTH_MISMATCH);
1239 goto f_err;
1240 }
1241 if (!sk_X509_push(sk,x))
1242 {
1243 SSLerr(SSL_F_SSL3_GET_SERVER_CERTIFICATE,ERR_R_MALLOC_FAILURE);
1244 goto err;
1245 }
1246 x=NULL;
1247 nc+=l+3;
1248 p=q;
1249 }
1250
1251 i=ssl_verify_cert_chain(s,sk);
1252 if ((s->verify_mode != SSL_VERIFY_NONE) && (i <= 0)
1253 #ifndef OPENSSL_NO_KRB5
1254 && !((s->s3->tmp.new_cipher->algorithm_mkey & SSL_kKRB5) &&
1255 (s->s3->tmp.new_cipher->algorithm_auth & SSL_aKRB5))
1256 #endif /* OPENSSL_NO_KRB5 */
1257 )
1258 {
1259 al=ssl_verify_alarm_type(s->verify_result);
1260 SSLerr(SSL_F_SSL3_GET_SERVER_CERTIFICATE,SSL_R_CERTIFICATE_VERIFY_FAILED);
1261 goto f_err;
1262 }
1263 ERR_clear_error(); /* but we keep s->verify_result */
1264
1265 sc=ssl_sess_cert_new();
1266 if (sc == NULL) goto err;
1267
1268 if (s->session->sess_cert) ssl_sess_cert_free(s->session->sess_cert);
1269 s->session->sess_cert=sc;
1270
1271 sc->cert_chain=sk;
1272 /* Inconsistency alert: cert_chain does include the peer's
1273 * certificate, which we don't include in s3_srvr.c */
1274 x=sk_X509_value(sk,0);
1275 sk=NULL;
1276 /* VRS 19990621: possible memory leak; sk=null ==> !sk_pop_free() @end*/
1277
1278 pkey=X509_get_pubkey(x);
1279
1280 /* VRS: allow null cert if auth == KRB5 */
1281 need_cert = ((s->s3->tmp.new_cipher->algorithm_mkey & SSL_kKRB5) &&
1282 (s->s3->tmp.new_cipher->algorithm_auth & SSL_aKRB5))
1283 ? 0 : 1;
1284
1285 #ifdef KSSL_DEBUG
1286 printf("pkey,x = %p, %p\n", pkey,x);
1287 printf("ssl_cert_type(x,pkey) = %d\n", ssl_cert_type(x,pkey));
1288 printf("cipher, alg, nc = %s, %lx, %lx, %d\n", s->s3->tmp.new_cipher->name,
1289 s->s3->tmp.new_cipher->algorithm_mkey, s->s3->tmp.new_cipher->algorithm_auth, need_cert);
1290 #endif /* KSSL_DEBUG */
1291
1292 if (need_cert && ((pkey == NULL) || EVP_PKEY_missing_parameters(pkey)))
1293 {
1294 x=NULL;
1295 al=SSL3_AL_FATAL;
1296 SSLerr(SSL_F_SSL3_GET_SERVER_CERTIFICATE,
1297 SSL_R_UNABLE_TO_FIND_PUBLIC_KEY_PARAMETERS);
1298 goto f_err;
1299 }
1300
1301 i=ssl_cert_type(x,pkey);
1302 if (need_cert && i < 0)
1303 {
1304 x=NULL;
1305 al=SSL3_AL_FATAL;
1306 SSLerr(SSL_F_SSL3_GET_SERVER_CERTIFICATE,
1307 SSL_R_UNKNOWN_CERTIFICATE_TYPE);
1308 goto f_err;
1309 }
1310
1311 if (need_cert)
1312 {
1313 sc->peer_cert_type=i;
1314 CRYPTO_add(&x->references,1,CRYPTO_LOCK_X509);
1315 /* Why would the following ever happen?
1316 * We just created sc a couple of lines ago. */
1317 if (sc->peer_pkeys[i].x509 != NULL)
1318 X509_free(sc->peer_pkeys[i].x509);
1319 sc->peer_pkeys[i].x509=x;
1320 sc->peer_key= &(sc->peer_pkeys[i]);
1321
1322 if (s->session->peer != NULL)
1323 X509_free(s->session->peer);
1324 CRYPTO_add(&x->references,1,CRYPTO_LOCK_X509);
1325 s->session->peer=x;
1326 }
1327 else
1328 {
1329 sc->peer_cert_type=i;
1330 sc->peer_key= NULL;
1331
1332 if (s->session->peer != NULL)
1333 X509_free(s->session->peer);
1334 s->session->peer=NULL;
1335 }
1336 s->session->verify_result = s->verify_result;
1337
1338 x=NULL;
1339 ret=1;
1340
1341 if (0)
1342 {
1343 f_err:
1344 ssl3_send_alert(s,SSL3_AL_FATAL,al);
1345 }
1346 err:
1347 EVP_PKEY_free(pkey);
1348 X509_free(x);
1349 sk_X509_pop_free(sk,X509_free);
1350 return(ret);
1351 }
1352
ssl3_get_key_exchange(SSL * s)1353 int ssl3_get_key_exchange(SSL *s)
1354 {
1355 #ifndef OPENSSL_NO_RSA
1356 unsigned char *q,md_buf[EVP_MAX_MD_SIZE*2];
1357 #endif
1358 EVP_MD_CTX md_ctx;
1359 unsigned char *param,*p;
1360 int al,j,ok;
1361 long i,param_len,n,alg_k,alg_a;
1362 EVP_PKEY *pkey=NULL;
1363 const EVP_MD *md = NULL;
1364 #ifndef OPENSSL_NO_RSA
1365 RSA *rsa=NULL;
1366 #endif
1367 #ifndef OPENSSL_NO_DH
1368 DH *dh=NULL;
1369 #endif
1370 #ifndef OPENSSL_NO_ECDH
1371 EC_KEY *ecdh = NULL;
1372 BN_CTX *bn_ctx = NULL;
1373 EC_POINT *srvr_ecpoint = NULL;
1374 int curve_nid = 0;
1375 int encoded_pt_len = 0;
1376 #endif
1377
1378 /* use same message size as in ssl3_get_certificate_request()
1379 * as ServerKeyExchange message may be skipped */
1380 n=s->method->ssl_get_message(s,
1381 SSL3_ST_CR_KEY_EXCH_A,
1382 SSL3_ST_CR_KEY_EXCH_B,
1383 -1,
1384 s->max_cert_list,
1385 &ok);
1386 if (!ok) return((int)n);
1387
1388 if (s->s3->tmp.message_type != SSL3_MT_SERVER_KEY_EXCHANGE)
1389 {
1390 #ifndef OPENSSL_NO_PSK
1391 /* In plain PSK ciphersuite, ServerKeyExchange can be
1392 omitted if no identity hint is sent. Set
1393 session->sess_cert anyway to avoid problems
1394 later.*/
1395 if (s->s3->tmp.new_cipher->algorithm_auth & SSL_aPSK)
1396 {
1397 s->session->sess_cert=ssl_sess_cert_new();
1398 if (s->session->psk_identity_hint)
1399 {
1400 OPENSSL_free(s->session->psk_identity_hint);
1401 s->session->psk_identity_hint = NULL;
1402 }
1403 }
1404 #endif
1405 s->s3->tmp.reuse_message=1;
1406 return(1);
1407 }
1408
1409 param=p=(unsigned char *)s->init_msg;
1410 if (s->session->sess_cert != NULL)
1411 {
1412 #ifndef OPENSSL_NO_RSA
1413 if (s->session->sess_cert->peer_rsa_tmp != NULL)
1414 {
1415 RSA_free(s->session->sess_cert->peer_rsa_tmp);
1416 s->session->sess_cert->peer_rsa_tmp=NULL;
1417 }
1418 #endif
1419 #ifndef OPENSSL_NO_DH
1420 if (s->session->sess_cert->peer_dh_tmp)
1421 {
1422 DH_free(s->session->sess_cert->peer_dh_tmp);
1423 s->session->sess_cert->peer_dh_tmp=NULL;
1424 }
1425 #endif
1426 #ifndef OPENSSL_NO_ECDH
1427 if (s->session->sess_cert->peer_ecdh_tmp)
1428 {
1429 EC_KEY_free(s->session->sess_cert->peer_ecdh_tmp);
1430 s->session->sess_cert->peer_ecdh_tmp=NULL;
1431 }
1432 #endif
1433 }
1434 else
1435 {
1436 s->session->sess_cert=ssl_sess_cert_new();
1437 }
1438
1439 /* Total length of the parameters including the length prefix */
1440 param_len=0;
1441
1442 alg_k=s->s3->tmp.new_cipher->algorithm_mkey;
1443 alg_a=s->s3->tmp.new_cipher->algorithm_auth;
1444 EVP_MD_CTX_init(&md_ctx);
1445
1446 al=SSL_AD_DECODE_ERROR;
1447
1448 #ifndef OPENSSL_NO_PSK
1449 if (alg_a & SSL_aPSK)
1450 {
1451 char tmp_id_hint[PSK_MAX_IDENTITY_LEN+1];
1452
1453 param_len = 2;
1454 if (param_len > n)
1455 {
1456 SSLerr(SSL_F_SSL3_GET_KEY_EXCHANGE,
1457 SSL_R_LENGTH_TOO_SHORT);
1458 goto f_err;
1459 }
1460 n2s(p,i);
1461
1462 if (s->session->psk_identity_hint)
1463 {
1464 OPENSSL_free(s->session->psk_identity_hint);
1465 s->session->psk_identity_hint = NULL;
1466 }
1467 if (i != 0)
1468 {
1469 /* Store PSK identity hint for later use, hint is used
1470 * in ssl3_send_client_key_exchange. Assume that the
1471 * maximum length of a PSK identity hint can be as
1472 * long as the maximum length of a PSK identity. */
1473 if (i > PSK_MAX_IDENTITY_LEN)
1474 {
1475 al=SSL_AD_HANDSHAKE_FAILURE;
1476 SSLerr(SSL_F_SSL3_GET_KEY_EXCHANGE,
1477 SSL_R_DATA_LENGTH_TOO_LONG);
1478 goto f_err;
1479 }
1480 if (i > n - param_len)
1481 {
1482 SSLerr(SSL_F_SSL3_GET_KEY_EXCHANGE,
1483 SSL_R_BAD_PSK_IDENTITY_HINT_LENGTH);
1484 goto f_err;
1485 }
1486 param_len += i;
1487
1488 /* If received PSK identity hint contains NULL
1489 * characters, the hint is truncated from the first
1490 * NULL. p may not be ending with NULL, so create a
1491 * NULL-terminated string. */
1492 memcpy(tmp_id_hint, p, i);
1493 memset(tmp_id_hint+i, 0, PSK_MAX_IDENTITY_LEN+1-i);
1494 s->session->psk_identity_hint = BUF_strdup(tmp_id_hint);
1495 if (s->session->psk_identity_hint == NULL)
1496 {
1497 al=SSL_AD_HANDSHAKE_FAILURE;
1498 SSLerr(SSL_F_SSL3_GET_KEY_EXCHANGE, ERR_R_MALLOC_FAILURE);
1499 goto f_err;
1500 }
1501 }
1502 p+=i;
1503 n-=param_len;
1504 }
1505 #endif /* !OPENSSL_NO_PSK */
1506
1507 if (0) {}
1508 #ifndef OPENSSL_NO_SRP
1509 else if (alg_k & SSL_kSRP)
1510 {
1511 param_len = 2;
1512 if (param_len > n)
1513 {
1514 SSLerr(SSL_F_SSL3_GET_KEY_EXCHANGE,
1515 SSL_R_LENGTH_TOO_SHORT);
1516 goto f_err;
1517 }
1518 n2s(p,i);
1519
1520 if (i > n - param_len)
1521 {
1522 SSLerr(SSL_F_SSL3_GET_KEY_EXCHANGE,SSL_R_BAD_SRP_N_LENGTH);
1523 goto f_err;
1524 }
1525 param_len += i;
1526
1527 if (!(s->srp_ctx.N=BN_bin2bn(p,i,NULL)))
1528 {
1529 SSLerr(SSL_F_SSL3_GET_KEY_EXCHANGE,ERR_R_BN_LIB);
1530 goto err;
1531 }
1532 p+=i;
1533
1534
1535 if (2 > n - param_len)
1536 {
1537 SSLerr(SSL_F_SSL3_GET_KEY_EXCHANGE,
1538 SSL_R_LENGTH_TOO_SHORT);
1539 goto f_err;
1540 }
1541 param_len += 2;
1542
1543 n2s(p,i);
1544
1545 if (i > n - param_len)
1546 {
1547 SSLerr(SSL_F_SSL3_GET_KEY_EXCHANGE,SSL_R_BAD_SRP_G_LENGTH);
1548 goto f_err;
1549 }
1550 param_len += i;
1551
1552 if (!(s->srp_ctx.g=BN_bin2bn(p,i,NULL)))
1553 {
1554 SSLerr(SSL_F_SSL3_GET_KEY_EXCHANGE,ERR_R_BN_LIB);
1555 goto err;
1556 }
1557 p+=i;
1558
1559
1560 if (1 > n - param_len)
1561 {
1562 SSLerr(SSL_F_SSL3_GET_KEY_EXCHANGE,
1563 SSL_R_LENGTH_TOO_SHORT);
1564 goto f_err;
1565 }
1566 param_len += 1;
1567
1568 i = (unsigned int)(p[0]);
1569 p++;
1570
1571 if (i > n - param_len)
1572 {
1573 SSLerr(SSL_F_SSL3_GET_KEY_EXCHANGE,SSL_R_BAD_SRP_S_LENGTH);
1574 goto f_err;
1575 }
1576 param_len += i;
1577
1578 if (!(s->srp_ctx.s=BN_bin2bn(p,i,NULL)))
1579 {
1580 SSLerr(SSL_F_SSL3_GET_KEY_EXCHANGE,ERR_R_BN_LIB);
1581 goto err;
1582 }
1583 p+=i;
1584
1585 if (2 > n - param_len)
1586 {
1587 SSLerr(SSL_F_SSL3_GET_KEY_EXCHANGE,
1588 SSL_R_LENGTH_TOO_SHORT);
1589 goto f_err;
1590 }
1591 param_len += 2;
1592
1593 n2s(p,i);
1594
1595 if (i > n - param_len)
1596 {
1597 SSLerr(SSL_F_SSL3_GET_KEY_EXCHANGE,SSL_R_BAD_SRP_B_LENGTH);
1598 goto f_err;
1599 }
1600 param_len += i;
1601
1602 if (!(s->srp_ctx.B=BN_bin2bn(p,i,NULL)))
1603 {
1604 SSLerr(SSL_F_SSL3_GET_KEY_EXCHANGE,ERR_R_BN_LIB);
1605 goto err;
1606 }
1607 p+=i;
1608 n-=param_len;
1609
1610 if (!srp_verify_server_param(s, &al))
1611 {
1612 SSLerr(SSL_F_SSL3_GET_KEY_EXCHANGE,SSL_R_BAD_SRP_PARAMETERS);
1613 goto f_err;
1614 }
1615
1616 /* We must check if there is a certificate */
1617 #ifndef OPENSSL_NO_RSA
1618 if (alg_a & SSL_aRSA)
1619 pkey=X509_get_pubkey(s->session->sess_cert->peer_pkeys[SSL_PKEY_RSA_ENC].x509);
1620 #else
1621 if (0)
1622 ;
1623 #endif
1624 #ifndef OPENSSL_NO_DSA
1625 else if (alg_a & SSL_aDSS)
1626 pkey=X509_get_pubkey(s->session->sess_cert->peer_pkeys[SSL_PKEY_DSA_SIGN].x509);
1627 #endif
1628 }
1629 #endif /* !OPENSSL_NO_SRP */
1630 #ifndef OPENSSL_NO_RSA
1631 else if (alg_k & SSL_kRSA)
1632 {
1633 if ((rsa=RSA_new()) == NULL)
1634 {
1635 SSLerr(SSL_F_SSL3_GET_KEY_EXCHANGE,ERR_R_MALLOC_FAILURE);
1636 goto err;
1637 }
1638
1639 param_len = 2;
1640 if (param_len > n)
1641 {
1642 SSLerr(SSL_F_SSL3_GET_KEY_EXCHANGE,
1643 SSL_R_LENGTH_TOO_SHORT);
1644 goto f_err;
1645 }
1646 n2s(p,i);
1647
1648 if (i > n - param_len)
1649 {
1650 SSLerr(SSL_F_SSL3_GET_KEY_EXCHANGE,SSL_R_BAD_RSA_MODULUS_LENGTH);
1651 goto f_err;
1652 }
1653 param_len += i;
1654
1655 if (!(rsa->n=BN_bin2bn(p,i,rsa->n)))
1656 {
1657 SSLerr(SSL_F_SSL3_GET_KEY_EXCHANGE,ERR_R_BN_LIB);
1658 goto err;
1659 }
1660 p+=i;
1661
1662 if (2 > n - param_len)
1663 {
1664 SSLerr(SSL_F_SSL3_GET_KEY_EXCHANGE,
1665 SSL_R_LENGTH_TOO_SHORT);
1666 goto f_err;
1667 }
1668 param_len += 2;
1669
1670 n2s(p,i);
1671
1672 if (i > n - param_len)
1673 {
1674 SSLerr(SSL_F_SSL3_GET_KEY_EXCHANGE,SSL_R_BAD_RSA_E_LENGTH);
1675 goto f_err;
1676 }
1677 param_len += i;
1678
1679 if (!(rsa->e=BN_bin2bn(p,i,rsa->e)))
1680 {
1681 SSLerr(SSL_F_SSL3_GET_KEY_EXCHANGE,ERR_R_BN_LIB);
1682 goto err;
1683 }
1684 p+=i;
1685 n-=param_len;
1686
1687 /* this should be because we are using an export cipher */
1688 if (alg_a & SSL_aRSA)
1689 pkey=X509_get_pubkey(s->session->sess_cert->peer_pkeys[SSL_PKEY_RSA_ENC].x509);
1690 else
1691 {
1692 SSLerr(SSL_F_SSL3_GET_KEY_EXCHANGE,ERR_R_INTERNAL_ERROR);
1693 goto err;
1694 }
1695 s->session->sess_cert->peer_rsa_tmp=rsa;
1696 rsa=NULL;
1697 }
1698 #endif
1699 #ifndef OPENSSL_NO_DH
1700 else if (alg_k & SSL_kEDH)
1701 {
1702 if ((dh=DH_new()) == NULL)
1703 {
1704 SSLerr(SSL_F_SSL3_GET_KEY_EXCHANGE,ERR_R_DH_LIB);
1705 goto err;
1706 }
1707
1708 param_len = 2;
1709 if (param_len > n)
1710 {
1711 SSLerr(SSL_F_SSL3_GET_KEY_EXCHANGE,
1712 SSL_R_LENGTH_TOO_SHORT);
1713 goto f_err;
1714 }
1715 n2s(p,i);
1716
1717 if (i > n - param_len)
1718 {
1719 SSLerr(SSL_F_SSL3_GET_KEY_EXCHANGE,SSL_R_BAD_DH_P_LENGTH);
1720 goto f_err;
1721 }
1722 param_len += i;
1723
1724 if (!(dh->p=BN_bin2bn(p,i,NULL)))
1725 {
1726 SSLerr(SSL_F_SSL3_GET_KEY_EXCHANGE,ERR_R_BN_LIB);
1727 goto err;
1728 }
1729 p+=i;
1730
1731 if (2 > n - param_len)
1732 {
1733 SSLerr(SSL_F_SSL3_GET_KEY_EXCHANGE,
1734 SSL_R_LENGTH_TOO_SHORT);
1735 goto f_err;
1736 }
1737 param_len += 2;
1738
1739 n2s(p,i);
1740
1741 if (i > n - param_len)
1742 {
1743 SSLerr(SSL_F_SSL3_GET_KEY_EXCHANGE,SSL_R_BAD_DH_G_LENGTH);
1744 goto f_err;
1745 }
1746 param_len += i;
1747
1748 if (!(dh->g=BN_bin2bn(p,i,NULL)))
1749 {
1750 SSLerr(SSL_F_SSL3_GET_KEY_EXCHANGE,ERR_R_BN_LIB);
1751 goto err;
1752 }
1753 p+=i;
1754
1755 if (2 > n - param_len)
1756 {
1757 SSLerr(SSL_F_SSL3_GET_KEY_EXCHANGE,
1758 SSL_R_LENGTH_TOO_SHORT);
1759 goto f_err;
1760 }
1761 param_len += 2;
1762
1763 n2s(p,i);
1764
1765 if (i > n - param_len)
1766 {
1767 SSLerr(SSL_F_SSL3_GET_KEY_EXCHANGE,SSL_R_BAD_DH_PUB_KEY_LENGTH);
1768 goto f_err;
1769 }
1770 param_len += i;
1771
1772 if (!(dh->pub_key=BN_bin2bn(p,i,NULL)))
1773 {
1774 SSLerr(SSL_F_SSL3_GET_KEY_EXCHANGE,ERR_R_BN_LIB);
1775 goto err;
1776 }
1777 p+=i;
1778 n-=param_len;
1779
1780 #ifndef OPENSSL_NO_RSA
1781 if (alg_a & SSL_aRSA)
1782 pkey=X509_get_pubkey(s->session->sess_cert->peer_pkeys[SSL_PKEY_RSA_ENC].x509);
1783 #else
1784 if (0)
1785 ;
1786 #endif
1787 #ifndef OPENSSL_NO_DSA
1788 else if (alg_a & SSL_aDSS)
1789 pkey=X509_get_pubkey(s->session->sess_cert->peer_pkeys[SSL_PKEY_DSA_SIGN].x509);
1790 #endif
1791 /* else anonymous DH, so no certificate or pkey. */
1792
1793 s->session->sess_cert->peer_dh_tmp=dh;
1794 dh=NULL;
1795 }
1796 else if ((alg_k & SSL_kDHr) || (alg_k & SSL_kDHd))
1797 {
1798 al=SSL_AD_ILLEGAL_PARAMETER;
1799 SSLerr(SSL_F_SSL3_GET_KEY_EXCHANGE,SSL_R_TRIED_TO_USE_UNSUPPORTED_CIPHER);
1800 goto f_err;
1801 }
1802 #endif /* !OPENSSL_NO_DH */
1803
1804 #ifndef OPENSSL_NO_ECDH
1805 else if (alg_k & SSL_kEECDH)
1806 {
1807 EC_GROUP *ngroup;
1808 const EC_GROUP *group;
1809
1810 if ((ecdh=EC_KEY_new()) == NULL)
1811 {
1812 SSLerr(SSL_F_SSL3_GET_KEY_EXCHANGE,ERR_R_MALLOC_FAILURE);
1813 goto err;
1814 }
1815
1816 /* Extract elliptic curve parameters and the
1817 * server's ephemeral ECDH public key.
1818 * Keep accumulating lengths of various components in
1819 * param_len and make sure it never exceeds n.
1820 */
1821
1822 /* XXX: For now we only support named (not generic) curves
1823 * and the ECParameters in this case is just three bytes. We
1824 * also need one byte for the length of the encoded point
1825 */
1826 param_len=4;
1827 if (param_len > n)
1828 {
1829 SSLerr(SSL_F_SSL3_GET_KEY_EXCHANGE,
1830 SSL_R_LENGTH_TOO_SHORT);
1831 goto f_err;
1832 }
1833
1834 if ((*p != NAMED_CURVE_TYPE) ||
1835 ((curve_nid = tls1_ec_curve_id2nid(*(p + 2))) == 0))
1836 {
1837 al=SSL_AD_INTERNAL_ERROR;
1838 SSLerr(SSL_F_SSL3_GET_KEY_EXCHANGE,SSL_R_UNABLE_TO_FIND_ECDH_PARAMETERS);
1839 goto f_err;
1840 }
1841
1842 ngroup = EC_GROUP_new_by_curve_name(curve_nid);
1843 if (ngroup == NULL)
1844 {
1845 SSLerr(SSL_F_SSL3_GET_KEY_EXCHANGE,ERR_R_EC_LIB);
1846 goto err;
1847 }
1848 if (EC_KEY_set_group(ecdh, ngroup) == 0)
1849 {
1850 SSLerr(SSL_F_SSL3_GET_KEY_EXCHANGE,ERR_R_EC_LIB);
1851 goto err;
1852 }
1853 EC_GROUP_free(ngroup);
1854
1855 group = EC_KEY_get0_group(ecdh);
1856
1857 if (SSL_C_IS_EXPORT(s->s3->tmp.new_cipher) &&
1858 (EC_GROUP_get_degree(group) > 163))
1859 {
1860 al=SSL_AD_EXPORT_RESTRICTION;
1861 SSLerr(SSL_F_SSL3_GET_KEY_EXCHANGE,SSL_R_ECGROUP_TOO_LARGE_FOR_CIPHER);
1862 goto f_err;
1863 }
1864
1865 p+=3;
1866
1867 /* Next, get the encoded ECPoint */
1868 if (((srvr_ecpoint = EC_POINT_new(group)) == NULL) ||
1869 ((bn_ctx = BN_CTX_new()) == NULL))
1870 {
1871 SSLerr(SSL_F_SSL3_GET_KEY_EXCHANGE,ERR_R_MALLOC_FAILURE);
1872 goto err;
1873 }
1874
1875 encoded_pt_len = *p; /* length of encoded point */
1876 p+=1;
1877
1878 if ((encoded_pt_len > n - param_len) ||
1879 (EC_POINT_oct2point(group, srvr_ecpoint,
1880 p, encoded_pt_len, bn_ctx) == 0))
1881 {
1882 SSLerr(SSL_F_SSL3_GET_KEY_EXCHANGE,SSL_R_BAD_ECPOINT);
1883 goto f_err;
1884 }
1885 param_len += encoded_pt_len;
1886
1887 n-=param_len;
1888 p+=encoded_pt_len;
1889
1890 /* The ECC/TLS specification does not mention
1891 * the use of DSA to sign ECParameters in the server
1892 * key exchange message. We do support RSA and ECDSA.
1893 */
1894 if (0) ;
1895 #ifndef OPENSSL_NO_RSA
1896 else if (alg_a & SSL_aRSA)
1897 pkey=X509_get_pubkey(s->session->sess_cert->peer_pkeys[SSL_PKEY_RSA_ENC].x509);
1898 #endif
1899 #ifndef OPENSSL_NO_ECDSA
1900 else if (alg_a & SSL_aECDSA)
1901 pkey=X509_get_pubkey(s->session->sess_cert->peer_pkeys[SSL_PKEY_ECC].x509);
1902 #endif
1903 /* else anonymous ECDH, so no certificate or pkey. */
1904 EC_KEY_set_public_key(ecdh, srvr_ecpoint);
1905 s->session->sess_cert->peer_ecdh_tmp=ecdh;
1906 ecdh=NULL;
1907 BN_CTX_free(bn_ctx);
1908 bn_ctx = NULL;
1909 EC_POINT_free(srvr_ecpoint);
1910 srvr_ecpoint = NULL;
1911 }
1912 #endif /* !OPENSSL_NO_ECDH */
1913
1914 else if (!(alg_k & SSL_kPSK))
1915 {
1916 al=SSL_AD_UNEXPECTED_MESSAGE;
1917 SSLerr(SSL_F_SSL3_GET_KEY_EXCHANGE,SSL_R_UNEXPECTED_MESSAGE);
1918 goto f_err;
1919 }
1920
1921 /* p points to the next byte, there are 'n' bytes left */
1922
1923 /* if it was signed, check the signature */
1924 if (pkey != NULL)
1925 {
1926 if (TLS1_get_version(s) >= TLS1_2_VERSION)
1927 {
1928 int sigalg;
1929 if (2 > n)
1930 {
1931 SSLerr(SSL_F_SSL3_GET_KEY_EXCHANGE,
1932 SSL_R_LENGTH_TOO_SHORT);
1933 goto f_err;
1934 }
1935
1936 sigalg = tls12_get_sigid(pkey);
1937 /* Should never happen */
1938 if (sigalg == -1)
1939 {
1940 SSLerr(SSL_F_SSL3_GET_KEY_EXCHANGE,ERR_R_INTERNAL_ERROR);
1941 goto err;
1942 }
1943 /* Check key type is consistent with signature */
1944 if (sigalg != (int)p[1])
1945 {
1946 SSLerr(SSL_F_SSL3_GET_KEY_EXCHANGE,SSL_R_WRONG_SIGNATURE_TYPE);
1947 al=SSL_AD_DECODE_ERROR;
1948 goto f_err;
1949 }
1950 md = tls12_get_hash(p[0]);
1951 if (md == NULL)
1952 {
1953 SSLerr(SSL_F_SSL3_GET_KEY_EXCHANGE,SSL_R_UNKNOWN_DIGEST);
1954 goto f_err;
1955 }
1956 #ifdef SSL_DEBUG
1957 fprintf(stderr, "USING TLSv1.2 HASH %s\n", EVP_MD_name(md));
1958 #endif
1959 p += 2;
1960 n -= 2;
1961 }
1962 else
1963 md = EVP_sha1();
1964
1965 if (2 > n)
1966 {
1967 SSLerr(SSL_F_SSL3_GET_KEY_EXCHANGE,
1968 SSL_R_LENGTH_TOO_SHORT);
1969 goto f_err;
1970 }
1971 n2s(p,i);
1972 n-=2;
1973 j=EVP_PKEY_size(pkey);
1974
1975 /* Check signature length. If n is 0 then signature is empty */
1976 if ((i != n) || (n > j) || (n <= 0))
1977 {
1978 /* wrong packet length */
1979 SSLerr(SSL_F_SSL3_GET_KEY_EXCHANGE,SSL_R_WRONG_SIGNATURE_LENGTH);
1980 goto f_err;
1981 }
1982
1983 #ifndef OPENSSL_NO_RSA
1984 if (pkey->type == EVP_PKEY_RSA && TLS1_get_version(s) < TLS1_2_VERSION)
1985 {
1986 int num;
1987 unsigned int size;
1988
1989 j=0;
1990 q=md_buf;
1991 for (num=2; num > 0; num--)
1992 {
1993 EVP_MD_CTX_set_flags(&md_ctx,
1994 EVP_MD_CTX_FLAG_NON_FIPS_ALLOW);
1995 EVP_DigestInit_ex(&md_ctx,(num == 2)
1996 ?s->ctx->md5:s->ctx->sha1, NULL);
1997 EVP_DigestUpdate(&md_ctx,&(s->s3->client_random[0]),SSL3_RANDOM_SIZE);
1998 EVP_DigestUpdate(&md_ctx,&(s->s3->server_random[0]),SSL3_RANDOM_SIZE);
1999 EVP_DigestUpdate(&md_ctx,param,param_len);
2000 EVP_DigestFinal_ex(&md_ctx,q,&size);
2001 q+=size;
2002 j+=size;
2003 }
2004 i=RSA_verify(NID_md5_sha1, md_buf, j, p, n,
2005 pkey->pkey.rsa);
2006 if (i < 0)
2007 {
2008 al=SSL_AD_DECRYPT_ERROR;
2009 SSLerr(SSL_F_SSL3_GET_KEY_EXCHANGE,SSL_R_BAD_RSA_DECRYPT);
2010 goto f_err;
2011 }
2012 if (i == 0)
2013 {
2014 /* bad signature */
2015 al=SSL_AD_DECRYPT_ERROR;
2016 SSLerr(SSL_F_SSL3_GET_KEY_EXCHANGE,SSL_R_BAD_SIGNATURE);
2017 goto f_err;
2018 }
2019 }
2020 else
2021 #endif
2022 {
2023 EVP_VerifyInit_ex(&md_ctx, md, NULL);
2024 EVP_VerifyUpdate(&md_ctx,&(s->s3->client_random[0]),SSL3_RANDOM_SIZE);
2025 EVP_VerifyUpdate(&md_ctx,&(s->s3->server_random[0]),SSL3_RANDOM_SIZE);
2026 EVP_VerifyUpdate(&md_ctx,param,param_len);
2027 if (EVP_VerifyFinal(&md_ctx,p,(int)n,pkey) <= 0)
2028 {
2029 /* bad signature */
2030 al=SSL_AD_DECRYPT_ERROR;
2031 SSLerr(SSL_F_SSL3_GET_KEY_EXCHANGE,SSL_R_BAD_SIGNATURE);
2032 goto f_err;
2033 }
2034 }
2035 }
2036 else
2037 {
2038 if (!(alg_a & (SSL_aNULL|SSL_aSRP)) &&
2039 /* Among PSK ciphers only RSA_PSK needs a public key */
2040 !((alg_a & SSL_aPSK) && !(alg_k & SSL_kRSA)))
2041 {
2042 SSLerr(SSL_F_SSL3_GET_KEY_EXCHANGE,ERR_R_INTERNAL_ERROR);
2043 goto err;
2044 }
2045 /* still data left over */
2046 if (n != 0)
2047 {
2048 SSLerr(SSL_F_SSL3_GET_KEY_EXCHANGE,SSL_R_EXTRA_DATA_IN_MESSAGE);
2049 goto f_err;
2050 }
2051 }
2052 EVP_PKEY_free(pkey);
2053 EVP_MD_CTX_cleanup(&md_ctx);
2054 return(1);
2055 f_err:
2056 ssl3_send_alert(s,SSL3_AL_FATAL,al);
2057 err:
2058 EVP_PKEY_free(pkey);
2059 #ifndef OPENSSL_NO_RSA
2060 if (rsa != NULL)
2061 RSA_free(rsa);
2062 #endif
2063 #ifndef OPENSSL_NO_DH
2064 if (dh != NULL)
2065 DH_free(dh);
2066 #endif
2067 #ifndef OPENSSL_NO_ECDH
2068 BN_CTX_free(bn_ctx);
2069 EC_POINT_free(srvr_ecpoint);
2070 if (ecdh != NULL)
2071 EC_KEY_free(ecdh);
2072 #endif
2073 EVP_MD_CTX_cleanup(&md_ctx);
2074 return(-1);
2075 }
2076
ssl3_get_certificate_request(SSL * s)2077 int ssl3_get_certificate_request(SSL *s)
2078 {
2079 int ok,ret=0;
2080 unsigned long n,nc,l;
2081 unsigned int llen, ctype_num,i;
2082 X509_NAME *xn=NULL;
2083 const unsigned char *p,*q;
2084 unsigned char *d;
2085 STACK_OF(X509_NAME) *ca_sk=NULL;
2086
2087 n=s->method->ssl_get_message(s,
2088 SSL3_ST_CR_CERT_REQ_A,
2089 SSL3_ST_CR_CERT_REQ_B,
2090 -1,
2091 s->max_cert_list,
2092 &ok);
2093
2094 if (!ok) return((int)n);
2095
2096 s->s3->tmp.cert_req=0;
2097
2098 if (s->s3->tmp.message_type == SSL3_MT_SERVER_DONE)
2099 {
2100 s->s3->tmp.reuse_message=1;
2101 /* If we get here we don't need any cached handshake records
2102 * as we wont be doing client auth.
2103 */
2104 if (s->s3->handshake_buffer)
2105 {
2106 if (!ssl3_digest_cached_records(s))
2107 goto err;
2108 }
2109 return(1);
2110 }
2111
2112 if (s->s3->tmp.message_type != SSL3_MT_CERTIFICATE_REQUEST)
2113 {
2114 ssl3_send_alert(s,SSL3_AL_FATAL,SSL_AD_UNEXPECTED_MESSAGE);
2115 SSLerr(SSL_F_SSL3_GET_CERTIFICATE_REQUEST,SSL_R_WRONG_MESSAGE_TYPE);
2116 goto err;
2117 }
2118
2119 /* TLS does not like anon-DH with client cert */
2120 if (s->version > SSL3_VERSION)
2121 {
2122 if (s->s3->tmp.new_cipher->algorithm_auth & SSL_aNULL)
2123 {
2124 ssl3_send_alert(s,SSL3_AL_FATAL,SSL_AD_UNEXPECTED_MESSAGE);
2125 SSLerr(SSL_F_SSL3_GET_CERTIFICATE_REQUEST,SSL_R_TLS_CLIENT_CERT_REQ_WITH_ANON_CIPHER);
2126 goto err;
2127 }
2128 }
2129
2130 p=d=(unsigned char *)s->init_msg;
2131
2132 if ((ca_sk=sk_X509_NAME_new(ca_dn_cmp)) == NULL)
2133 {
2134 SSLerr(SSL_F_SSL3_GET_CERTIFICATE_REQUEST,ERR_R_MALLOC_FAILURE);
2135 goto err;
2136 }
2137
2138 /* get the certificate types */
2139 ctype_num= *(p++);
2140 if (ctype_num > SSL3_CT_NUMBER)
2141 ctype_num=SSL3_CT_NUMBER;
2142 for (i=0; i<ctype_num; i++)
2143 s->s3->tmp.ctype[i]= p[i];
2144 p+=ctype_num;
2145 if (TLS1_get_version(s) >= TLS1_2_VERSION)
2146 {
2147 n2s(p, llen);
2148 /* Check we have enough room for signature algorithms and
2149 * following length value.
2150 */
2151 if ((unsigned long)(p - d + llen + 2) > n)
2152 {
2153 ssl3_send_alert(s,SSL3_AL_FATAL,SSL_AD_DECODE_ERROR);
2154 SSLerr(SSL_F_SSL3_GET_CERTIFICATE_REQUEST,SSL_R_DATA_LENGTH_TOO_LONG);
2155 goto err;
2156 }
2157 if (llen & 1)
2158 {
2159 ssl3_send_alert(s,SSL3_AL_FATAL,SSL_AD_DECODE_ERROR);
2160 SSLerr(SSL_F_SSL3_GET_CERTIFICATE_REQUEST,SSL_R_SIGNATURE_ALGORITHMS_ERROR);
2161 goto err;
2162 }
2163 tls1_process_sigalgs(s, p, llen);
2164 p += llen;
2165 }
2166
2167 /* get the CA RDNs */
2168 n2s(p,llen);
2169 #if 0
2170 {
2171 FILE *out;
2172 out=fopen("/tmp/vsign.der","w");
2173 fwrite(p,1,llen,out);
2174 fclose(out);
2175 }
2176 #endif
2177
2178 if ((unsigned long)(p - d + llen) != n)
2179 {
2180 ssl3_send_alert(s,SSL3_AL_FATAL,SSL_AD_DECODE_ERROR);
2181 SSLerr(SSL_F_SSL3_GET_CERTIFICATE_REQUEST,SSL_R_LENGTH_MISMATCH);
2182 goto err;
2183 }
2184
2185 for (nc=0; nc<llen; )
2186 {
2187 n2s(p,l);
2188 if ((l+nc+2) > llen)
2189 {
2190 if ((s->options & SSL_OP_NETSCAPE_CA_DN_BUG))
2191 goto cont; /* netscape bugs */
2192 ssl3_send_alert(s,SSL3_AL_FATAL,SSL_AD_DECODE_ERROR);
2193 SSLerr(SSL_F_SSL3_GET_CERTIFICATE_REQUEST,SSL_R_CA_DN_TOO_LONG);
2194 goto err;
2195 }
2196
2197 q=p;
2198
2199 if ((xn=d2i_X509_NAME(NULL,&q,l)) == NULL)
2200 {
2201 /* If netscape tolerance is on, ignore errors */
2202 if (s->options & SSL_OP_NETSCAPE_CA_DN_BUG)
2203 goto cont;
2204 else
2205 {
2206 ssl3_send_alert(s,SSL3_AL_FATAL,SSL_AD_DECODE_ERROR);
2207 SSLerr(SSL_F_SSL3_GET_CERTIFICATE_REQUEST,ERR_R_ASN1_LIB);
2208 goto err;
2209 }
2210 }
2211
2212 if (q != (p+l))
2213 {
2214 ssl3_send_alert(s,SSL3_AL_FATAL,SSL_AD_DECODE_ERROR);
2215 SSLerr(SSL_F_SSL3_GET_CERTIFICATE_REQUEST,SSL_R_CA_DN_LENGTH_MISMATCH);
2216 goto err;
2217 }
2218 if (!sk_X509_NAME_push(ca_sk,xn))
2219 {
2220 SSLerr(SSL_F_SSL3_GET_CERTIFICATE_REQUEST,ERR_R_MALLOC_FAILURE);
2221 goto err;
2222 }
2223
2224 p+=l;
2225 nc+=l+2;
2226 }
2227
2228 if (0)
2229 {
2230 cont:
2231 ERR_clear_error();
2232 }
2233
2234 /* we should setup a certificate to return.... */
2235 s->s3->tmp.cert_req=1;
2236 s->s3->tmp.ctype_num=ctype_num;
2237 if (s->s3->tmp.ca_names != NULL)
2238 sk_X509_NAME_pop_free(s->s3->tmp.ca_names,X509_NAME_free);
2239 s->s3->tmp.ca_names=ca_sk;
2240 ca_sk=NULL;
2241
2242 ret=1;
2243 err:
2244 if (ca_sk != NULL) sk_X509_NAME_pop_free(ca_sk,X509_NAME_free);
2245 return(ret);
2246 }
2247
ca_dn_cmp(const X509_NAME * const * a,const X509_NAME * const * b)2248 static int ca_dn_cmp(const X509_NAME * const *a, const X509_NAME * const *b)
2249 {
2250 return(X509_NAME_cmp(*a,*b));
2251 }
2252 #ifndef OPENSSL_NO_TLSEXT
ssl3_get_new_session_ticket(SSL * s)2253 int ssl3_get_new_session_ticket(SSL *s)
2254 {
2255 int ok,al,ret=0, ticklen;
2256 long n;
2257 const unsigned char *p;
2258 unsigned char *d;
2259
2260 n=s->method->ssl_get_message(s,
2261 SSL3_ST_CR_SESSION_TICKET_A,
2262 SSL3_ST_CR_SESSION_TICKET_B,
2263 -1,
2264 16384,
2265 &ok);
2266
2267 if (!ok)
2268 return((int)n);
2269
2270 if (s->s3->tmp.message_type == SSL3_MT_FINISHED)
2271 {
2272 s->s3->tmp.reuse_message=1;
2273 return(1);
2274 }
2275 if (s->s3->tmp.message_type != SSL3_MT_NEWSESSION_TICKET)
2276 {
2277 al=SSL_AD_UNEXPECTED_MESSAGE;
2278 SSLerr(SSL_F_SSL3_GET_NEW_SESSION_TICKET,SSL_R_BAD_MESSAGE_TYPE);
2279 goto f_err;
2280 }
2281 if (n < 6)
2282 {
2283 /* need at least ticket_lifetime_hint + ticket length */
2284 al = SSL_AD_DECODE_ERROR;
2285 SSLerr(SSL_F_SSL3_GET_NEW_SESSION_TICKET,SSL_R_LENGTH_MISMATCH);
2286 goto f_err;
2287 }
2288
2289 p=d=(unsigned char *)s->init_msg;
2290 n2l(p, s->session->tlsext_tick_lifetime_hint);
2291 n2s(p, ticklen);
2292 /* ticket_lifetime_hint + ticket_length + ticket */
2293 if (ticklen + 6 != n)
2294 {
2295 al = SSL_AD_DECODE_ERROR;
2296 SSLerr(SSL_F_SSL3_GET_NEW_SESSION_TICKET,SSL_R_LENGTH_MISMATCH);
2297 goto f_err;
2298 }
2299 if (s->session->tlsext_tick)
2300 {
2301 OPENSSL_free(s->session->tlsext_tick);
2302 s->session->tlsext_ticklen = 0;
2303 }
2304 s->session->tlsext_tick = OPENSSL_malloc(ticklen);
2305 if (!s->session->tlsext_tick)
2306 {
2307 SSLerr(SSL_F_SSL3_GET_NEW_SESSION_TICKET,ERR_R_MALLOC_FAILURE);
2308 goto err;
2309 }
2310 memcpy(s->session->tlsext_tick, p, ticklen);
2311 s->session->tlsext_ticklen = ticklen;
2312 /* There are two ways to detect a resumed ticket sesion.
2313 * One is to set an appropriate session ID and then the server
2314 * must return a match in ServerHello. This allows the normal
2315 * client session ID matching to work and we know much
2316 * earlier that the ticket has been accepted.
2317 *
2318 * The other way is to set zero length session ID when the
2319 * ticket is presented and rely on the handshake to determine
2320 * session resumption.
2321 *
2322 * We choose the former approach because this fits in with
2323 * assumptions elsewhere in OpenSSL. The session ID is set
2324 * to the SHA256 (or SHA1 is SHA256 is disabled) hash of the
2325 * ticket.
2326 */
2327 EVP_Digest(p, ticklen,
2328 s->session->session_id, &s->session->session_id_length,
2329 #ifndef OPENSSL_NO_SHA256
2330 EVP_sha256(), NULL);
2331 #else
2332 EVP_sha1(), NULL);
2333 #endif
2334 ret=1;
2335 return(ret);
2336 f_err:
2337 ssl3_send_alert(s,SSL3_AL_FATAL,al);
2338 err:
2339 return(-1);
2340 }
2341
ssl3_get_cert_status(SSL * s)2342 int ssl3_get_cert_status(SSL *s)
2343 {
2344 int ok, al;
2345 unsigned long resplen,n;
2346 const unsigned char *p;
2347
2348 n=s->method->ssl_get_message(s,
2349 SSL3_ST_CR_CERT_STATUS_A,
2350 SSL3_ST_CR_CERT_STATUS_B,
2351 SSL3_MT_CERTIFICATE_STATUS,
2352 16384,
2353 &ok);
2354
2355 if (!ok) return((int)n);
2356 if (n < 4)
2357 {
2358 /* need at least status type + length */
2359 al = SSL_AD_DECODE_ERROR;
2360 SSLerr(SSL_F_SSL3_GET_CERT_STATUS,SSL_R_LENGTH_MISMATCH);
2361 goto f_err;
2362 }
2363 p = (unsigned char *)s->init_msg;
2364 if (*p++ != TLSEXT_STATUSTYPE_ocsp)
2365 {
2366 al = SSL_AD_DECODE_ERROR;
2367 SSLerr(SSL_F_SSL3_GET_CERT_STATUS,SSL_R_UNSUPPORTED_STATUS_TYPE);
2368 goto f_err;
2369 }
2370 n2l3(p, resplen);
2371 if (resplen + 4 != n)
2372 {
2373 al = SSL_AD_DECODE_ERROR;
2374 SSLerr(SSL_F_SSL3_GET_CERT_STATUS,SSL_R_LENGTH_MISMATCH);
2375 goto f_err;
2376 }
2377 if (s->tlsext_ocsp_resp)
2378 OPENSSL_free(s->tlsext_ocsp_resp);
2379 s->tlsext_ocsp_resp = BUF_memdup(p, resplen);
2380 if (!s->tlsext_ocsp_resp)
2381 {
2382 al = SSL_AD_INTERNAL_ERROR;
2383 SSLerr(SSL_F_SSL3_GET_CERT_STATUS,ERR_R_MALLOC_FAILURE);
2384 goto f_err;
2385 }
2386 s->tlsext_ocsp_resplen = resplen;
2387 if (s->ctx->tlsext_status_cb)
2388 {
2389 int ret;
2390 ret = s->ctx->tlsext_status_cb(s, s->ctx->tlsext_status_arg);
2391 if (ret == 0)
2392 {
2393 al = SSL_AD_BAD_CERTIFICATE_STATUS_RESPONSE;
2394 SSLerr(SSL_F_SSL3_GET_CERT_STATUS,SSL_R_INVALID_STATUS_RESPONSE);
2395 goto f_err;
2396 }
2397 if (ret < 0)
2398 {
2399 al = SSL_AD_INTERNAL_ERROR;
2400 SSLerr(SSL_F_SSL3_GET_CERT_STATUS,ERR_R_MALLOC_FAILURE);
2401 goto f_err;
2402 }
2403 }
2404 return 1;
2405 f_err:
2406 ssl3_send_alert(s,SSL3_AL_FATAL,al);
2407 return(-1);
2408 }
2409 #endif
2410
ssl3_get_server_done(SSL * s)2411 int ssl3_get_server_done(SSL *s)
2412 {
2413 int ok,ret=0;
2414 long n;
2415
2416 n=s->method->ssl_get_message(s,
2417 SSL3_ST_CR_SRVR_DONE_A,
2418 SSL3_ST_CR_SRVR_DONE_B,
2419 SSL3_MT_SERVER_DONE,
2420 30, /* should be very small, like 0 :-) */
2421 &ok);
2422
2423 if (!ok) return((int)n);
2424 if (n > 0)
2425 {
2426 /* should contain no data */
2427 ssl3_send_alert(s,SSL3_AL_FATAL,SSL_AD_DECODE_ERROR);
2428 SSLerr(SSL_F_SSL3_GET_SERVER_DONE,SSL_R_LENGTH_MISMATCH);
2429 return -1;
2430 }
2431 ret=1;
2432 return(ret);
2433 }
2434
2435
ssl3_send_client_key_exchange(SSL * s)2436 int ssl3_send_client_key_exchange(SSL *s)
2437 {
2438 unsigned char *p,*d;
2439 int n = 0;
2440 unsigned long alg_k;
2441 unsigned long alg_a;
2442 #ifndef OPENSSL_NO_RSA
2443 unsigned char *q;
2444 EVP_PKEY *pkey=NULL;
2445 #endif
2446 #ifndef OPENSSL_NO_KRB5
2447 KSSL_ERR kssl_err;
2448 #endif /* OPENSSL_NO_KRB5 */
2449 #ifndef OPENSSL_NO_ECDH
2450 EC_KEY *clnt_ecdh = NULL;
2451 const EC_POINT *srvr_ecpoint = NULL;
2452 EVP_PKEY *srvr_pub_pkey = NULL;
2453 unsigned char *encodedPoint = NULL;
2454 int encoded_pt_len = 0;
2455 BN_CTX * bn_ctx = NULL;
2456 #ifndef OPENSSL_NO_PSK
2457 unsigned int psk_len = 0;
2458 unsigned char psk[PSK_MAX_PSK_LEN];
2459 #endif /* OPENSSL_NO_PSK */
2460 #endif /* OPENSSL_NO_ECDH */
2461
2462 if (s->state == SSL3_ST_CW_KEY_EXCH_A)
2463 {
2464 d=(unsigned char *)s->init_buf->data;
2465 p= &(d[4]);
2466
2467 alg_k=s->s3->tmp.new_cipher->algorithm_mkey;
2468 alg_a=s->s3->tmp.new_cipher->algorithm_auth;
2469
2470 #ifndef OPENSSL_NO_PSK
2471 if (alg_a & SSL_aPSK)
2472 {
2473 /* The callback needs PSK_MAX_IDENTITY_LEN + 1 bytes
2474 * to return a \0-terminated identity. The last byte
2475 * is for us for simulating strnlen. */
2476 char identity[PSK_MAX_IDENTITY_LEN + 2];
2477 size_t identity_len;
2478 unsigned char *t = NULL;
2479 unsigned char pre_ms[PSK_MAX_PSK_LEN*2+4];
2480 unsigned int pre_ms_len = 0;
2481 int psk_err = 1;
2482
2483 n = 0;
2484 if (s->psk_client_callback == NULL)
2485 {
2486 SSLerr(SSL_F_SSL3_SEND_CLIENT_KEY_EXCHANGE,
2487 SSL_R_PSK_NO_CLIENT_CB);
2488 goto err;
2489 }
2490
2491 memset(identity, 0, sizeof(identity));
2492 psk_len = s->psk_client_callback(s, s->session->psk_identity_hint,
2493 identity, sizeof(identity) - 1, psk, sizeof(psk));
2494 if (psk_len > PSK_MAX_PSK_LEN)
2495 {
2496 SSLerr(SSL_F_SSL3_SEND_CLIENT_KEY_EXCHANGE,
2497 ERR_R_INTERNAL_ERROR);
2498 goto psk_err;
2499 }
2500 else if (psk_len == 0)
2501 {
2502 SSLerr(SSL_F_SSL3_SEND_CLIENT_KEY_EXCHANGE,
2503 SSL_R_PSK_IDENTITY_NOT_FOUND);
2504 goto psk_err;
2505 }
2506 identity[PSK_MAX_IDENTITY_LEN + 1] = '\0';
2507 identity_len = strlen(identity);
2508 if (identity_len > PSK_MAX_IDENTITY_LEN)
2509 {
2510 SSLerr(SSL_F_SSL3_SEND_CLIENT_KEY_EXCHANGE,
2511 ERR_R_INTERNAL_ERROR);
2512 goto psk_err;
2513 }
2514 if (!(alg_k & SSL_kEECDH))
2515 {
2516 /* Create the shared secret now if we're not using ECDHE-PSK.*/
2517 pre_ms_len = 2+psk_len+2+psk_len;
2518 t = pre_ms;
2519 s2n(psk_len, t);
2520 memset(t, 0, psk_len);
2521 t+=psk_len;
2522 s2n(psk_len, t);
2523 memcpy(t, psk, psk_len);
2524
2525 s->session->master_key_length =
2526 s->method->ssl3_enc->generate_master_secret(s,
2527 s->session->master_key,
2528 pre_ms, pre_ms_len);
2529 s2n(identity_len, p);
2530 memcpy(p, identity, identity_len);
2531 n = 2 + identity_len;
2532 }
2533
2534 if (s->session->psk_identity != NULL)
2535 OPENSSL_free(s->session->psk_identity);
2536 s->session->psk_identity = BUF_strdup(identity);
2537 if (s->session->psk_identity == NULL)
2538 {
2539 SSLerr(SSL_F_SSL3_SEND_CLIENT_KEY_EXCHANGE,
2540 ERR_R_MALLOC_FAILURE);
2541 goto psk_err;
2542 }
2543 psk_err = 0;
2544 psk_err:
2545 OPENSSL_cleanse(identity, sizeof(identity));
2546 OPENSSL_cleanse(pre_ms, sizeof(pre_ms));
2547 if (psk_err != 0)
2548 {
2549 ssl3_send_alert(s, SSL3_AL_FATAL, SSL_AD_HANDSHAKE_FAILURE);
2550 goto err;
2551 }
2552 }
2553 #endif
2554 /* Fool emacs indentation */
2555 if (0) {}
2556 #ifndef OPENSSL_NO_RSA
2557 else if (alg_k & SSL_kRSA)
2558 {
2559 RSA *rsa;
2560 unsigned char tmp_buf[SSL_MAX_MASTER_KEY_LENGTH];
2561
2562 if (s->session->sess_cert == NULL)
2563 {
2564 /* We should always have a server certificate with SSL_kRSA. */
2565 SSLerr(SSL_F_SSL3_SEND_CLIENT_KEY_EXCHANGE,ERR_R_INTERNAL_ERROR);
2566 goto err;
2567 }
2568
2569 if (s->session->sess_cert->peer_rsa_tmp != NULL)
2570 rsa=s->session->sess_cert->peer_rsa_tmp;
2571 else
2572 {
2573 pkey=X509_get_pubkey(s->session->sess_cert->peer_pkeys[SSL_PKEY_RSA_ENC].x509);
2574 if ((pkey == NULL) ||
2575 (pkey->type != EVP_PKEY_RSA) ||
2576 (pkey->pkey.rsa == NULL))
2577 {
2578 SSLerr(SSL_F_SSL3_SEND_CLIENT_KEY_EXCHANGE,ERR_R_INTERNAL_ERROR);
2579 goto err;
2580 }
2581 rsa=pkey->pkey.rsa;
2582 EVP_PKEY_free(pkey);
2583 }
2584
2585 tmp_buf[0]=s->client_version>>8;
2586 tmp_buf[1]=s->client_version&0xff;
2587 if (RAND_bytes(&(tmp_buf[2]),sizeof tmp_buf-2) <= 0)
2588 goto err;
2589
2590 s->session->master_key_length=sizeof tmp_buf;
2591
2592 q=p;
2593 /* Fix buf for TLS and beyond */
2594 if (s->version > SSL3_VERSION)
2595 p+=2;
2596 n=RSA_public_encrypt(sizeof tmp_buf,
2597 tmp_buf,p,rsa,RSA_PKCS1_PADDING);
2598 #ifdef PKCS1_CHECK
2599 if (s->options & SSL_OP_PKCS1_CHECK_1) p[1]++;
2600 if (s->options & SSL_OP_PKCS1_CHECK_2) tmp_buf[0]=0x70;
2601 #endif
2602 if (n <= 0)
2603 {
2604 SSLerr(SSL_F_SSL3_SEND_CLIENT_KEY_EXCHANGE,SSL_R_BAD_RSA_ENCRYPT);
2605 goto err;
2606 }
2607
2608 /* Fix buf for TLS and beyond */
2609 if (s->version > SSL3_VERSION)
2610 {
2611 s2n(n,q);
2612 n+=2;
2613 }
2614
2615 s->session->master_key_length=
2616 s->method->ssl3_enc->generate_master_secret(s,
2617 s->session->master_key,
2618 tmp_buf,sizeof tmp_buf);
2619 OPENSSL_cleanse(tmp_buf,sizeof tmp_buf);
2620 }
2621 #endif
2622 #ifndef OPENSSL_NO_KRB5
2623 else if (alg_k & SSL_kKRB5)
2624 {
2625 krb5_error_code krb5rc;
2626 KSSL_CTX *kssl_ctx = s->kssl_ctx;
2627 /* krb5_data krb5_ap_req; */
2628 krb5_data *enc_ticket;
2629 krb5_data authenticator, *authp = NULL;
2630 EVP_CIPHER_CTX ciph_ctx;
2631 const EVP_CIPHER *enc = NULL;
2632 unsigned char iv[EVP_MAX_IV_LENGTH];
2633 unsigned char tmp_buf[SSL_MAX_MASTER_KEY_LENGTH];
2634 unsigned char epms[SSL_MAX_MASTER_KEY_LENGTH
2635 + EVP_MAX_IV_LENGTH];
2636 int padl, outl = sizeof(epms);
2637
2638 EVP_CIPHER_CTX_init(&ciph_ctx);
2639
2640 #ifdef KSSL_DEBUG
2641 printf("ssl3_send_client_key_exchange(%lx & %lx)\n",
2642 alg_k, SSL_kKRB5);
2643 #endif /* KSSL_DEBUG */
2644
2645 authp = NULL;
2646 #ifdef KRB5SENDAUTH
2647 if (KRB5SENDAUTH) authp = &authenticator;
2648 #endif /* KRB5SENDAUTH */
2649
2650 krb5rc = kssl_cget_tkt(kssl_ctx, &enc_ticket, authp,
2651 &kssl_err);
2652 enc = kssl_map_enc(kssl_ctx->enctype);
2653 if (enc == NULL)
2654 goto err;
2655 #ifdef KSSL_DEBUG
2656 {
2657 printf("kssl_cget_tkt rtn %d\n", krb5rc);
2658 if (krb5rc && kssl_err.text)
2659 printf("kssl_cget_tkt kssl_err=%s\n", kssl_err.text);
2660 }
2661 #endif /* KSSL_DEBUG */
2662
2663 if (krb5rc)
2664 {
2665 ssl3_send_alert(s,SSL3_AL_FATAL,
2666 SSL_AD_HANDSHAKE_FAILURE);
2667 SSLerr(SSL_F_SSL3_SEND_CLIENT_KEY_EXCHANGE,
2668 kssl_err.reason);
2669 goto err;
2670 }
2671
2672 /* 20010406 VRS - Earlier versions used KRB5 AP_REQ
2673 ** in place of RFC 2712 KerberosWrapper, as in:
2674 **
2675 ** Send ticket (copy to *p, set n = length)
2676 ** n = krb5_ap_req.length;
2677 ** memcpy(p, krb5_ap_req.data, krb5_ap_req.length);
2678 ** if (krb5_ap_req.data)
2679 ** kssl_krb5_free_data_contents(NULL,&krb5_ap_req);
2680 **
2681 ** Now using real RFC 2712 KerberosWrapper
2682 ** (Thanks to Simon Wilkinson <sxw@sxw.org.uk>)
2683 ** Note: 2712 "opaque" types are here replaced
2684 ** with a 2-byte length followed by the value.
2685 ** Example:
2686 ** KerberosWrapper= xx xx asn1ticket 0 0 xx xx encpms
2687 ** Where "xx xx" = length bytes. Shown here with
2688 ** optional authenticator omitted.
2689 */
2690
2691 /* KerberosWrapper.Ticket */
2692 s2n(enc_ticket->length,p);
2693 memcpy(p, enc_ticket->data, enc_ticket->length);
2694 p+= enc_ticket->length;
2695 n = enc_ticket->length + 2;
2696
2697 /* KerberosWrapper.Authenticator */
2698 if (authp && authp->length)
2699 {
2700 s2n(authp->length,p);
2701 memcpy(p, authp->data, authp->length);
2702 p+= authp->length;
2703 n+= authp->length + 2;
2704
2705 free(authp->data);
2706 authp->data = NULL;
2707 authp->length = 0;
2708 }
2709 else
2710 {
2711 s2n(0,p);/* null authenticator length */
2712 n+=2;
2713 }
2714
2715 tmp_buf[0]=s->client_version>>8;
2716 tmp_buf[1]=s->client_version&0xff;
2717 if (RAND_bytes(&(tmp_buf[2]),sizeof tmp_buf-2) <= 0)
2718 goto err;
2719
2720 /* 20010420 VRS. Tried it this way; failed.
2721 ** EVP_EncryptInit_ex(&ciph_ctx,enc, NULL,NULL);
2722 ** EVP_CIPHER_CTX_set_key_length(&ciph_ctx,
2723 ** kssl_ctx->length);
2724 ** EVP_EncryptInit_ex(&ciph_ctx,NULL, key,iv);
2725 */
2726
2727 memset(iv, 0, sizeof iv); /* per RFC 1510 */
2728 EVP_EncryptInit_ex(&ciph_ctx,enc, NULL,
2729 kssl_ctx->key,iv);
2730 EVP_EncryptUpdate(&ciph_ctx,epms,&outl,tmp_buf,
2731 sizeof tmp_buf);
2732 EVP_EncryptFinal_ex(&ciph_ctx,&(epms[outl]),&padl);
2733 outl += padl;
2734 if (outl > (int)sizeof epms)
2735 {
2736 SSLerr(SSL_F_SSL3_SEND_CLIENT_KEY_EXCHANGE, ERR_R_INTERNAL_ERROR);
2737 goto err;
2738 }
2739 EVP_CIPHER_CTX_cleanup(&ciph_ctx);
2740
2741 /* KerberosWrapper.EncryptedPreMasterSecret */
2742 s2n(outl,p);
2743 memcpy(p, epms, outl);
2744 p+=outl;
2745 n+=outl + 2;
2746
2747 s->session->master_key_length=
2748 s->method->ssl3_enc->generate_master_secret(s,
2749 s->session->master_key,
2750 tmp_buf, sizeof tmp_buf);
2751
2752 OPENSSL_cleanse(tmp_buf, sizeof tmp_buf);
2753 OPENSSL_cleanse(epms, outl);
2754 }
2755 #endif
2756 #ifndef OPENSSL_NO_DH
2757 else if (alg_k & (SSL_kEDH|SSL_kDHr|SSL_kDHd))
2758 {
2759 DH *dh_srvr,*dh_clnt;
2760
2761 if (s->session->sess_cert == NULL)
2762 {
2763 ssl3_send_alert(s,SSL3_AL_FATAL,SSL_AD_UNEXPECTED_MESSAGE);
2764 SSLerr(SSL_F_SSL3_SEND_CLIENT_KEY_EXCHANGE,SSL_R_UNEXPECTED_MESSAGE);
2765 goto err;
2766 }
2767
2768 if (s->session->sess_cert->peer_dh_tmp != NULL)
2769 dh_srvr=s->session->sess_cert->peer_dh_tmp;
2770 else
2771 {
2772 /* we get them from the cert */
2773 ssl3_send_alert(s,SSL3_AL_FATAL,SSL_AD_HANDSHAKE_FAILURE);
2774 SSLerr(SSL_F_SSL3_SEND_CLIENT_KEY_EXCHANGE,SSL_R_UNABLE_TO_FIND_DH_PARAMETERS);
2775 goto err;
2776 }
2777
2778 /* generate a new random key */
2779 if ((dh_clnt=DHparams_dup(dh_srvr)) == NULL)
2780 {
2781 SSLerr(SSL_F_SSL3_SEND_CLIENT_KEY_EXCHANGE,ERR_R_DH_LIB);
2782 goto err;
2783 }
2784 if (!DH_generate_key(dh_clnt))
2785 {
2786 SSLerr(SSL_F_SSL3_SEND_CLIENT_KEY_EXCHANGE,ERR_R_DH_LIB);
2787 DH_free(dh_clnt);
2788 goto err;
2789 }
2790
2791 /* use the 'p' output buffer for the DH key, but
2792 * make sure to clear it out afterwards */
2793
2794 n=DH_compute_key(p,dh_srvr->pub_key,dh_clnt);
2795
2796 if (n <= 0)
2797 {
2798 SSLerr(SSL_F_SSL3_SEND_CLIENT_KEY_EXCHANGE,ERR_R_DH_LIB);
2799 DH_free(dh_clnt);
2800 goto err;
2801 }
2802
2803 /* generate master key from the result */
2804 s->session->master_key_length=
2805 s->method->ssl3_enc->generate_master_secret(s,
2806 s->session->master_key,p,n);
2807 /* clean up */
2808 memset(p,0,n);
2809
2810 /* send off the data */
2811 n=BN_num_bytes(dh_clnt->pub_key);
2812 s2n(n,p);
2813 BN_bn2bin(dh_clnt->pub_key,p);
2814 n+=2;
2815
2816 DH_free(dh_clnt);
2817
2818 /* perhaps clean things up a bit EAY EAY EAY EAY*/
2819 }
2820 #endif
2821 #ifndef OPENSSL_NO_ECDH
2822 else if (alg_k & (SSL_kEECDH|SSL_kECDHr|SSL_kECDHe))
2823 {
2824 const EC_GROUP *srvr_group = NULL;
2825 EC_KEY *tkey;
2826 int ecdh_clnt_cert = 0;
2827 int field_size = 0;
2828 #ifndef OPENSSL_NO_PSK
2829 unsigned char *pre_ms;
2830 unsigned char *t;
2831 unsigned int pre_ms_len;
2832 unsigned int i;
2833 #endif
2834
2835 if (s->session->sess_cert == NULL)
2836 {
2837 ssl3_send_alert(s,SSL3_AL_FATAL,SSL_AD_UNEXPECTED_MESSAGE);
2838 SSLerr(SSL_F_SSL3_SEND_CLIENT_KEY_EXCHANGE,SSL_R_UNEXPECTED_MESSAGE);
2839 goto err;
2840 }
2841
2842 /* Did we send out the client's
2843 * ECDH share for use in premaster
2844 * computation as part of client certificate?
2845 * If so, set ecdh_clnt_cert to 1.
2846 */
2847 if ((alg_k & (SSL_kECDHr|SSL_kECDHe)) && (s->cert != NULL))
2848 {
2849 /* XXX: For now, we do not support client
2850 * authentication using ECDH certificates.
2851 * To add such support, one needs to add
2852 * code that checks for appropriate
2853 * conditions and sets ecdh_clnt_cert to 1.
2854 * For example, the cert have an ECC
2855 * key on the same curve as the server's
2856 * and the key should be authorized for
2857 * key agreement.
2858 *
2859 * One also needs to add code in ssl3_connect
2860 * to skip sending the certificate verify
2861 * message.
2862 *
2863 * if ((s->cert->key->privatekey != NULL) &&
2864 * (s->cert->key->privatekey->type ==
2865 * EVP_PKEY_EC) && ...)
2866 * ecdh_clnt_cert = 1;
2867 */
2868 }
2869
2870 if (s->session->sess_cert->peer_ecdh_tmp != NULL)
2871 {
2872 tkey = s->session->sess_cert->peer_ecdh_tmp;
2873 }
2874 else
2875 {
2876 /* Get the Server Public Key from Cert */
2877 srvr_pub_pkey = X509_get_pubkey(s->session-> \
2878 sess_cert->peer_pkeys[SSL_PKEY_ECC].x509);
2879 if ((srvr_pub_pkey == NULL) ||
2880 (srvr_pub_pkey->type != EVP_PKEY_EC) ||
2881 (srvr_pub_pkey->pkey.ec == NULL))
2882 {
2883 SSLerr(SSL_F_SSL3_SEND_CLIENT_KEY_EXCHANGE,
2884 ERR_R_INTERNAL_ERROR);
2885 goto err;
2886 }
2887
2888 tkey = srvr_pub_pkey->pkey.ec;
2889 }
2890
2891 srvr_group = EC_KEY_get0_group(tkey);
2892 srvr_ecpoint = EC_KEY_get0_public_key(tkey);
2893
2894 if ((srvr_group == NULL) || (srvr_ecpoint == NULL))
2895 {
2896 SSLerr(SSL_F_SSL3_SEND_CLIENT_KEY_EXCHANGE,
2897 ERR_R_INTERNAL_ERROR);
2898 goto err;
2899 }
2900
2901 if ((clnt_ecdh=EC_KEY_new()) == NULL)
2902 {
2903 SSLerr(SSL_F_SSL3_SEND_CLIENT_KEY_EXCHANGE,ERR_R_MALLOC_FAILURE);
2904 goto err;
2905 }
2906
2907 if (!EC_KEY_set_group(clnt_ecdh, srvr_group))
2908 {
2909 SSLerr(SSL_F_SSL3_SEND_CLIENT_KEY_EXCHANGE,ERR_R_EC_LIB);
2910 goto err;
2911 }
2912 if (ecdh_clnt_cert)
2913 {
2914 /* Reuse key info from our certificate
2915 * We only need our private key to perform
2916 * the ECDH computation.
2917 */
2918 const BIGNUM *priv_key;
2919 tkey = s->cert->key->privatekey->pkey.ec;
2920 priv_key = EC_KEY_get0_private_key(tkey);
2921 if (priv_key == NULL)
2922 {
2923 SSLerr(SSL_F_SSL3_SEND_CLIENT_KEY_EXCHANGE,ERR_R_MALLOC_FAILURE);
2924 goto err;
2925 }
2926 if (!EC_KEY_set_private_key(clnt_ecdh, priv_key))
2927 {
2928 SSLerr(SSL_F_SSL3_SEND_CLIENT_KEY_EXCHANGE,ERR_R_EC_LIB);
2929 goto err;
2930 }
2931 }
2932 else
2933 {
2934 /* Generate a new ECDH key pair */
2935 if (!(EC_KEY_generate_key(clnt_ecdh)))
2936 {
2937 SSLerr(SSL_F_SSL3_SEND_CLIENT_KEY_EXCHANGE, ERR_R_ECDH_LIB);
2938 goto err;
2939 }
2940 }
2941
2942 /* use the 'p' output buffer for the ECDH key, but
2943 * make sure to clear it out afterwards
2944 */
2945
2946 field_size = EC_GROUP_get_degree(srvr_group);
2947 if (field_size <= 0)
2948 {
2949 SSLerr(SSL_F_SSL3_SEND_CLIENT_KEY_EXCHANGE,
2950 ERR_R_ECDH_LIB);
2951 goto err;
2952 }
2953 n=ECDH_compute_key(p, (field_size+7)/8, srvr_ecpoint, clnt_ecdh, NULL);
2954 if (n <= 0)
2955 {
2956 SSLerr(SSL_F_SSL3_SEND_CLIENT_KEY_EXCHANGE,
2957 ERR_R_ECDH_LIB);
2958 goto err;
2959 }
2960
2961 #ifndef OPENSSL_NO_PSK
2962 /* ECDHE PSK ciphersuites from RFC 5489 */
2963 if ((alg_a & SSL_aPSK) && psk_len != 0)
2964 {
2965 pre_ms_len = 2+n+2+psk_len;
2966 pre_ms = OPENSSL_malloc(pre_ms_len);
2967 if (pre_ms == NULL)
2968 {
2969 SSLerr(SSL_F_SSL3_SEND_CLIENT_KEY_EXCHANGE,
2970 ERR_R_MALLOC_FAILURE);
2971 goto err;
2972 }
2973 memset(pre_ms, 0, pre_ms_len);
2974 t = pre_ms;
2975 s2n(n, t);
2976 memcpy(t, p, n);
2977 t += n;
2978 s2n(psk_len, t);
2979 memcpy(t, psk, psk_len);
2980 s->session->master_key_length = s->method->ssl3_enc \
2981 -> generate_master_secret(s,
2982 s->session->master_key, pre_ms, pre_ms_len);
2983 OPENSSL_cleanse(pre_ms, pre_ms_len);
2984 OPENSSL_free(pre_ms);
2985 }
2986 #endif /* OPENSSL_NO_PSK */
2987 if (!(alg_a & SSL_aPSK))
2988 {
2989 /* generate master key from the result */
2990 s->session->master_key_length = s->method->ssl3_enc \
2991 -> generate_master_secret(s,
2992 s->session->master_key, p, n);
2993 }
2994 memset(p, 0, n); /* clean up */
2995 if (ecdh_clnt_cert)
2996 {
2997 /* Send empty client key exch message */
2998 n = 0;
2999 }
3000 else
3001 {
3002 /* First check the size of encoding and
3003 * allocate memory accordingly.
3004 */
3005 encoded_pt_len =
3006 EC_POINT_point2oct(srvr_group,
3007 EC_KEY_get0_public_key(clnt_ecdh),
3008 POINT_CONVERSION_UNCOMPRESSED,
3009 NULL, 0, NULL);
3010
3011 encodedPoint = (unsigned char *)
3012 OPENSSL_malloc(encoded_pt_len *
3013 sizeof(unsigned char));
3014 bn_ctx = BN_CTX_new();
3015 if ((encodedPoint == NULL) ||
3016 (bn_ctx == NULL))
3017 {
3018 SSLerr(SSL_F_SSL3_SEND_CLIENT_KEY_EXCHANGE,ERR_R_MALLOC_FAILURE);
3019 goto err;
3020 }
3021
3022 /* Encode the public key */
3023 encoded_pt_len = EC_POINT_point2oct(srvr_group,
3024 EC_KEY_get0_public_key(clnt_ecdh),
3025 POINT_CONVERSION_UNCOMPRESSED,
3026 encodedPoint, encoded_pt_len, bn_ctx);
3027
3028 n = 0;
3029 #ifndef OPENSSL_NO_PSK
3030 if ((alg_a & SSL_aPSK) && psk_len != 0)
3031 {
3032 i = strlen(s->session->psk_identity);
3033 s2n(i, p);
3034 memcpy(p, s->session->psk_identity, i);
3035 p += i;
3036 n = i + 2;
3037 }
3038 #endif
3039
3040 *p = encoded_pt_len; /* length of encoded point */
3041 /* Encoded point will be copied here */
3042 p += 1;
3043 n += 1;
3044 /* copy the point */
3045 memcpy((unsigned char *)p, encodedPoint, encoded_pt_len);
3046 /* increment n to account for length field */
3047 n += encoded_pt_len;
3048 }
3049
3050 /* Free allocated memory */
3051 BN_CTX_free(bn_ctx);
3052 if (encodedPoint != NULL) OPENSSL_free(encodedPoint);
3053 if (clnt_ecdh != NULL)
3054 EC_KEY_free(clnt_ecdh);
3055 EVP_PKEY_free(srvr_pub_pkey);
3056 }
3057 #endif /* !OPENSSL_NO_ECDH */
3058 else if (alg_k & SSL_kGOST)
3059 {
3060 /* GOST key exchange message creation */
3061 EVP_PKEY_CTX *pkey_ctx;
3062 X509 *peer_cert;
3063 size_t msglen;
3064 unsigned int md_len;
3065 int keytype;
3066 unsigned char premaster_secret[32],shared_ukm[32], tmp[256];
3067 EVP_MD_CTX *ukm_hash;
3068 EVP_PKEY *pub_key;
3069
3070 /* Get server sertificate PKEY and create ctx from it */
3071 peer_cert=s->session->sess_cert->peer_pkeys[(keytype=SSL_PKEY_GOST01)].x509;
3072 if (!peer_cert)
3073 peer_cert=s->session->sess_cert->peer_pkeys[(keytype=SSL_PKEY_GOST94)].x509;
3074 if (!peer_cert) {
3075 SSLerr(SSL_F_SSL3_SEND_CLIENT_KEY_EXCHANGE,SSL_R_NO_GOST_CERTIFICATE_SENT_BY_PEER);
3076 goto err;
3077 }
3078
3079 pkey_ctx=EVP_PKEY_CTX_new(pub_key=X509_get_pubkey(peer_cert),NULL);
3080 /* If we have send a certificate, and certificate key
3081
3082 * parameters match those of server certificate, use
3083 * certificate key for key exchange
3084 */
3085
3086 /* Otherwise, generate ephemeral key pair */
3087
3088 EVP_PKEY_encrypt_init(pkey_ctx);
3089 /* Generate session key */
3090 RAND_bytes(premaster_secret,32);
3091 /* If we have client certificate, use its secret as peer key */
3092 if (s->s3->tmp.cert_req && s->cert->key->privatekey) {
3093 if (EVP_PKEY_derive_set_peer(pkey_ctx,s->cert->key->privatekey) <=0) {
3094 /* If there was an error - just ignore it. Ephemeral key
3095 * would be used
3096 */
3097 ERR_clear_error();
3098 }
3099 }
3100 /* Compute shared IV and store it in algorithm-specific
3101 * context data */
3102 ukm_hash = EVP_MD_CTX_create();
3103 EVP_DigestInit(ukm_hash,EVP_get_digestbynid(NID_id_GostR3411_94));
3104 EVP_DigestUpdate(ukm_hash,s->s3->client_random,SSL3_RANDOM_SIZE);
3105 EVP_DigestUpdate(ukm_hash,s->s3->server_random,SSL3_RANDOM_SIZE);
3106 EVP_DigestFinal_ex(ukm_hash, shared_ukm, &md_len);
3107 EVP_MD_CTX_destroy(ukm_hash);
3108 if (EVP_PKEY_CTX_ctrl(pkey_ctx,-1,EVP_PKEY_OP_ENCRYPT,EVP_PKEY_CTRL_SET_IV,
3109 8,shared_ukm)<0) {
3110 SSLerr(SSL_F_SSL3_SEND_CLIENT_KEY_EXCHANGE,
3111 SSL_R_LIBRARY_BUG);
3112 goto err;
3113 }
3114 /* Make GOST keytransport blob message */
3115 /*Encapsulate it into sequence */
3116 *(p++)=V_ASN1_SEQUENCE | V_ASN1_CONSTRUCTED;
3117 msglen=255;
3118 if (EVP_PKEY_encrypt(pkey_ctx,tmp,&msglen,premaster_secret,32)<0) {
3119 SSLerr(SSL_F_SSL3_SEND_CLIENT_KEY_EXCHANGE,
3120 SSL_R_LIBRARY_BUG);
3121 goto err;
3122 }
3123 if (msglen >= 0x80)
3124 {
3125 *(p++)=0x81;
3126 *(p++)= msglen & 0xff;
3127 n=msglen+3;
3128 }
3129 else
3130 {
3131 *(p++)= msglen & 0xff;
3132 n=msglen+2;
3133 }
3134 memcpy(p, tmp, msglen);
3135 /* Check if pubkey from client certificate was used */
3136 if (EVP_PKEY_CTX_ctrl(pkey_ctx, -1, -1, EVP_PKEY_CTRL_PEER_KEY, 2, NULL) > 0)
3137 {
3138 /* Set flag "skip certificate verify" */
3139 s->s3->flags |= TLS1_FLAGS_SKIP_CERT_VERIFY;
3140 }
3141 EVP_PKEY_CTX_free(pkey_ctx);
3142 s->session->master_key_length=
3143 s->method->ssl3_enc->generate_master_secret(s,
3144 s->session->master_key,premaster_secret,32);
3145 EVP_PKEY_free(pub_key);
3146
3147 }
3148 #ifndef OPENSSL_NO_SRP
3149 else if (alg_k & SSL_kSRP)
3150 {
3151 if (s->srp_ctx.A != NULL)
3152 {
3153 /* send off the data */
3154 n=BN_num_bytes(s->srp_ctx.A);
3155 s2n(n,p);
3156 BN_bn2bin(s->srp_ctx.A,p);
3157 n+=2;
3158 }
3159 else
3160 {
3161 SSLerr(SSL_F_SSL3_SEND_CLIENT_KEY_EXCHANGE,ERR_R_INTERNAL_ERROR);
3162 goto err;
3163 }
3164 if (s->session->srp_username != NULL)
3165 OPENSSL_free(s->session->srp_username);
3166 s->session->srp_username = BUF_strdup(s->srp_ctx.login);
3167 if (s->session->srp_username == NULL)
3168 {
3169 SSLerr(SSL_F_SSL3_SEND_CLIENT_KEY_EXCHANGE,
3170 ERR_R_MALLOC_FAILURE);
3171 goto err;
3172 }
3173
3174 if ((s->session->master_key_length = SRP_generate_client_master_secret(s,s->session->master_key))<0)
3175 {
3176 SSLerr(SSL_F_SSL3_SEND_CLIENT_KEY_EXCHANGE,ERR_R_INTERNAL_ERROR);
3177 goto err;
3178 }
3179 }
3180 #endif
3181 else if (!(alg_k & SSL_kPSK) || ((alg_k & SSL_kPSK) && !(alg_a & SSL_aPSK)))
3182 {
3183 ssl3_send_alert(s, SSL3_AL_FATAL,
3184 SSL_AD_HANDSHAKE_FAILURE);
3185 SSLerr(SSL_F_SSL3_SEND_CLIENT_KEY_EXCHANGE,
3186 ERR_R_INTERNAL_ERROR);
3187 goto err;
3188 }
3189
3190 *(d++)=SSL3_MT_CLIENT_KEY_EXCHANGE;
3191 l2n3(n,d);
3192
3193 s->state=SSL3_ST_CW_KEY_EXCH_B;
3194 /* number of bytes to write */
3195 s->init_num=n+4;
3196 s->init_off=0;
3197 }
3198
3199 /* SSL3_ST_CW_KEY_EXCH_B */
3200 return(ssl3_do_write(s,SSL3_RT_HANDSHAKE));
3201 err:
3202 #ifndef OPENSSL_NO_ECDH
3203 BN_CTX_free(bn_ctx);
3204 if (encodedPoint != NULL) OPENSSL_free(encodedPoint);
3205 if (clnt_ecdh != NULL)
3206 EC_KEY_free(clnt_ecdh);
3207 EVP_PKEY_free(srvr_pub_pkey);
3208 #endif
3209 return(-1);
3210 }
3211
ssl3_send_client_verify(SSL * s)3212 int ssl3_send_client_verify(SSL *s)
3213 {
3214 unsigned char *p,*d;
3215 unsigned char data[MD5_DIGEST_LENGTH+SHA_DIGEST_LENGTH];
3216 EVP_PKEY *pkey;
3217 EVP_PKEY_CTX *pctx=NULL;
3218 EVP_MD_CTX mctx;
3219 unsigned u=0;
3220 unsigned long n;
3221 int j;
3222
3223 EVP_MD_CTX_init(&mctx);
3224
3225 if (s->state == SSL3_ST_CW_CERT_VRFY_A)
3226 {
3227 d=(unsigned char *)s->init_buf->data;
3228 p= &(d[4]);
3229 pkey=s->cert->key->privatekey;
3230 /* Create context from key and test if sha1 is allowed as digest */
3231 pctx = EVP_PKEY_CTX_new(pkey,NULL);
3232 EVP_PKEY_sign_init(pctx);
3233 if (EVP_PKEY_CTX_set_signature_md(pctx, EVP_sha1())>0)
3234 {
3235 if (TLS1_get_version(s) < TLS1_2_VERSION)
3236 s->method->ssl3_enc->cert_verify_mac(s,
3237 NID_sha1,
3238 &(data[MD5_DIGEST_LENGTH]));
3239 }
3240 else
3241 {
3242 ERR_clear_error();
3243 }
3244 /* For TLS v1.2 send signature algorithm and signature
3245 * using agreed digest and cached handshake records.
3246 */
3247 if (TLS1_get_version(s) >= TLS1_2_VERSION)
3248 {
3249 long hdatalen = 0;
3250 void *hdata;
3251 const EVP_MD *md;
3252 switch (ssl_cert_type(NULL, pkey))
3253 {
3254 case SSL_PKEY_RSA_ENC:
3255 md = s->s3->digest_rsa;
3256 break;
3257 case SSL_PKEY_DSA_SIGN:
3258 md = s->s3->digest_dsa;
3259 break;
3260 case SSL_PKEY_ECC:
3261 md = s->s3->digest_ecdsa;
3262 break;
3263 default:
3264 md = NULL;
3265 }
3266 if (!md)
3267 /* Unlike with the SignatureAlgorithm extension (sent by clients),
3268 * there are no default algorithms for the CertificateRequest message
3269 * (sent by servers). However, now that we've sent a certificate
3270 * for which we don't really know what hash to use for signing, the
3271 * best we can do is try a default algorithm. */
3272 md = EVP_sha1();
3273 hdatalen = BIO_get_mem_data(s->s3->handshake_buffer,
3274 &hdata);
3275 if (hdatalen <= 0 || !tls12_get_sigandhash(p, pkey, md))
3276 {
3277 SSLerr(SSL_F_SSL3_SEND_CLIENT_VERIFY,
3278 ERR_R_INTERNAL_ERROR);
3279 goto err;
3280 }
3281 p += 2;
3282 #ifdef SSL_DEBUG
3283 fprintf(stderr, "Using TLS 1.2 with client alg %s\n",
3284 EVP_MD_name(md));
3285 #endif
3286 if (!EVP_SignInit_ex(&mctx, md, NULL)
3287 || !EVP_SignUpdate(&mctx, hdata, hdatalen)
3288 || !EVP_SignFinal(&mctx, p + 2, &u, pkey))
3289 {
3290 SSLerr(SSL_F_SSL3_SEND_CLIENT_VERIFY,
3291 ERR_R_EVP_LIB);
3292 goto err;
3293 }
3294 s2n(u,p);
3295 n = u + 4;
3296 if (!ssl3_digest_cached_records(s))
3297 goto err;
3298 }
3299 else
3300 #ifndef OPENSSL_NO_RSA
3301 if (pkey->type == EVP_PKEY_RSA)
3302 {
3303 s->method->ssl3_enc->cert_verify_mac(s,
3304 NID_md5,
3305 &(data[0]));
3306 if (RSA_sign(NID_md5_sha1, data,
3307 MD5_DIGEST_LENGTH+SHA_DIGEST_LENGTH,
3308 &(p[2]), &u, pkey->pkey.rsa) <= 0 )
3309 {
3310 SSLerr(SSL_F_SSL3_SEND_CLIENT_VERIFY,ERR_R_RSA_LIB);
3311 goto err;
3312 }
3313 s2n(u,p);
3314 n=u+2;
3315 }
3316 else
3317 #endif
3318 #ifndef OPENSSL_NO_DSA
3319 if (pkey->type == EVP_PKEY_DSA)
3320 {
3321 if (!DSA_sign(pkey->save_type,
3322 &(data[MD5_DIGEST_LENGTH]),
3323 SHA_DIGEST_LENGTH,&(p[2]),
3324 (unsigned int *)&j,pkey->pkey.dsa))
3325 {
3326 SSLerr(SSL_F_SSL3_SEND_CLIENT_VERIFY,ERR_R_DSA_LIB);
3327 goto err;
3328 }
3329 s2n(j,p);
3330 n=j+2;
3331 }
3332 else
3333 #endif
3334 #ifndef OPENSSL_NO_ECDSA
3335 if (pkey->type == EVP_PKEY_EC)
3336 {
3337 if (!ECDSA_sign(pkey->save_type,
3338 &(data[MD5_DIGEST_LENGTH]),
3339 SHA_DIGEST_LENGTH,&(p[2]),
3340 (unsigned int *)&j,pkey->pkey.ec))
3341 {
3342 SSLerr(SSL_F_SSL3_SEND_CLIENT_VERIFY,
3343 ERR_R_ECDSA_LIB);
3344 goto err;
3345 }
3346 s2n(j,p);
3347 n=j+2;
3348 }
3349 else
3350 #endif
3351 if (pkey->type == NID_id_GostR3410_94 || pkey->type == NID_id_GostR3410_2001)
3352 {
3353 unsigned char signbuf[64];
3354 int i;
3355 size_t sigsize=64;
3356 s->method->ssl3_enc->cert_verify_mac(s,
3357 NID_id_GostR3411_94,
3358 data);
3359 if (EVP_PKEY_sign(pctx, signbuf, &sigsize, data, 32) <= 0) {
3360 SSLerr(SSL_F_SSL3_SEND_CLIENT_VERIFY,
3361 ERR_R_INTERNAL_ERROR);
3362 goto err;
3363 }
3364 for (i=63,j=0; i>=0; j++, i--) {
3365 p[2+j]=signbuf[i];
3366 }
3367 s2n(j,p);
3368 n=j+2;
3369 }
3370 else
3371 {
3372 SSLerr(SSL_F_SSL3_SEND_CLIENT_VERIFY,ERR_R_INTERNAL_ERROR);
3373 goto err;
3374 }
3375 *(d++)=SSL3_MT_CERTIFICATE_VERIFY;
3376 l2n3(n,d);
3377
3378 s->state=SSL3_ST_CW_CERT_VRFY_B;
3379 s->init_num=(int)n+4;
3380 s->init_off=0;
3381 }
3382 EVP_MD_CTX_cleanup(&mctx);
3383 EVP_PKEY_CTX_free(pctx);
3384 return(ssl3_do_write(s,SSL3_RT_HANDSHAKE));
3385 err:
3386 EVP_MD_CTX_cleanup(&mctx);
3387 EVP_PKEY_CTX_free(pctx);
3388 return(-1);
3389 }
3390
ssl3_send_client_certificate(SSL * s)3391 int ssl3_send_client_certificate(SSL *s)
3392 {
3393 X509 *x509=NULL;
3394 EVP_PKEY *pkey=NULL;
3395 int i;
3396 unsigned long l;
3397
3398 if (s->state == SSL3_ST_CW_CERT_A)
3399 {
3400 if ((s->cert == NULL) ||
3401 (s->cert->key->x509 == NULL) ||
3402 (s->cert->key->privatekey == NULL))
3403 s->state=SSL3_ST_CW_CERT_B;
3404 else
3405 s->state=SSL3_ST_CW_CERT_C;
3406 }
3407
3408 /* We need to get a client cert */
3409 if (s->state == SSL3_ST_CW_CERT_B)
3410 {
3411 /* If we get an error, we need to
3412 * ssl->rwstate=SSL_X509_LOOKUP; return(-1);
3413 * We then get retied later */
3414 i=0;
3415 i = ssl_do_client_cert_cb(s, &x509, &pkey);
3416 if (i < 0)
3417 {
3418 s->rwstate=SSL_X509_LOOKUP;
3419 return(-1);
3420 }
3421 s->rwstate=SSL_NOTHING;
3422 if ((i == 1) && (pkey != NULL) && (x509 != NULL))
3423 {
3424 s->state=SSL3_ST_CW_CERT_B;
3425 if ( !SSL_use_certificate(s,x509) ||
3426 !SSL_use_PrivateKey(s,pkey))
3427 i=0;
3428 }
3429 else if (i == 1)
3430 {
3431 i=0;
3432 SSLerr(SSL_F_SSL3_SEND_CLIENT_CERTIFICATE,SSL_R_BAD_DATA_RETURNED_BY_CALLBACK);
3433 }
3434
3435 if (x509 != NULL) X509_free(x509);
3436 if (pkey != NULL) EVP_PKEY_free(pkey);
3437 if (i == 0)
3438 {
3439 if (s->version == SSL3_VERSION)
3440 {
3441 s->s3->tmp.cert_req=0;
3442 ssl3_send_alert(s,SSL3_AL_WARNING,SSL_AD_NO_CERTIFICATE);
3443 return(1);
3444 }
3445 else
3446 {
3447 s->s3->tmp.cert_req=2;
3448 }
3449 }
3450
3451 /* Ok, we have a cert */
3452 s->state=SSL3_ST_CW_CERT_C;
3453 }
3454
3455 if (s->state == SSL3_ST_CW_CERT_C)
3456 {
3457 s->state=SSL3_ST_CW_CERT_D;
3458 l=ssl3_output_cert_chain(s,
3459 (s->s3->tmp.cert_req == 2)?NULL:s->cert->key->x509);
3460 s->init_num=(int)l;
3461 s->init_off=0;
3462 }
3463 /* SSL3_ST_CW_CERT_D */
3464 return(ssl3_do_write(s,SSL3_RT_HANDSHAKE));
3465 }
3466
3467 #define has_bits(i,m) (((i)&(m)) == (m))
3468
ssl3_check_cert_and_algorithm(SSL * s)3469 int ssl3_check_cert_and_algorithm(SSL *s)
3470 {
3471 int i,idx;
3472 long alg_k,alg_a;
3473 EVP_PKEY *pkey=NULL;
3474 SESS_CERT *sc;
3475 #ifndef OPENSSL_NO_RSA
3476 RSA *rsa;
3477 #endif
3478 #ifndef OPENSSL_NO_DH
3479 DH *dh;
3480 #endif
3481
3482 alg_k=s->s3->tmp.new_cipher->algorithm_mkey;
3483 alg_a=s->s3->tmp.new_cipher->algorithm_auth;
3484
3485 /* we don't have a certificate */
3486 if ((alg_a & (SSL_aDH|SSL_aNULL|SSL_aKRB5)) || (alg_k & SSL_kPSK))
3487 return(1);
3488
3489 sc=s->session->sess_cert;
3490 if (sc == NULL)
3491 {
3492 SSLerr(SSL_F_SSL3_CHECK_CERT_AND_ALGORITHM,ERR_R_INTERNAL_ERROR);
3493 goto err;
3494 }
3495
3496 #ifndef OPENSSL_NO_RSA
3497 rsa=s->session->sess_cert->peer_rsa_tmp;
3498 #endif
3499 #ifndef OPENSSL_NO_DH
3500 dh=s->session->sess_cert->peer_dh_tmp;
3501 #endif
3502
3503 /* This is the passed certificate */
3504
3505 idx=sc->peer_cert_type;
3506 #ifndef OPENSSL_NO_ECDH
3507 if (idx == SSL_PKEY_ECC)
3508 {
3509 if (ssl_check_srvr_ecc_cert_and_alg(sc->peer_pkeys[idx].x509,
3510 s) == 0)
3511 { /* check failed */
3512 SSLerr(SSL_F_SSL3_CHECK_CERT_AND_ALGORITHM,SSL_R_BAD_ECC_CERT);
3513 goto f_err;
3514 }
3515 else
3516 {
3517 return 1;
3518 }
3519 }
3520 #endif
3521 pkey=X509_get_pubkey(sc->peer_pkeys[idx].x509);
3522 i=X509_certificate_type(sc->peer_pkeys[idx].x509,pkey);
3523 EVP_PKEY_free(pkey);
3524
3525
3526 /* Check that we have a certificate if we require one */
3527 if ((alg_a & SSL_aRSA) && !has_bits(i,EVP_PK_RSA|EVP_PKT_SIGN))
3528 {
3529 SSLerr(SSL_F_SSL3_CHECK_CERT_AND_ALGORITHM,SSL_R_MISSING_RSA_SIGNING_CERT);
3530 goto f_err;
3531 }
3532 #ifndef OPENSSL_NO_DSA
3533 else if ((alg_a & SSL_aDSS) && !has_bits(i,EVP_PK_DSA|EVP_PKT_SIGN))
3534 {
3535 SSLerr(SSL_F_SSL3_CHECK_CERT_AND_ALGORITHM,SSL_R_MISSING_DSA_SIGNING_CERT);
3536 goto f_err;
3537 }
3538 #endif
3539 #ifndef OPENSSL_NO_RSA
3540 if ((alg_k & SSL_kRSA) &&
3541 !(has_bits(i,EVP_PK_RSA|EVP_PKT_ENC) || (rsa != NULL)))
3542 {
3543 SSLerr(SSL_F_SSL3_CHECK_CERT_AND_ALGORITHM,SSL_R_MISSING_RSA_ENCRYPTING_CERT);
3544 goto f_err;
3545 }
3546 #endif
3547 #ifndef OPENSSL_NO_DH
3548 if ((alg_k & SSL_kEDH) &&
3549 !(has_bits(i,EVP_PK_DH|EVP_PKT_EXCH) || (dh != NULL)))
3550 {
3551 SSLerr(SSL_F_SSL3_CHECK_CERT_AND_ALGORITHM,SSL_R_MISSING_DH_KEY);
3552 goto f_err;
3553 }
3554 else if ((alg_k & SSL_kDHr) && !has_bits(i,EVP_PK_DH|EVP_PKS_RSA))
3555 {
3556 SSLerr(SSL_F_SSL3_CHECK_CERT_AND_ALGORITHM,SSL_R_MISSING_DH_RSA_CERT);
3557 goto f_err;
3558 }
3559 #ifndef OPENSSL_NO_DSA
3560 else if ((alg_k & SSL_kDHd) && !has_bits(i,EVP_PK_DH|EVP_PKS_DSA))
3561 {
3562 SSLerr(SSL_F_SSL3_CHECK_CERT_AND_ALGORITHM,SSL_R_MISSING_DH_DSA_CERT);
3563 goto f_err;
3564 }
3565 #endif
3566 #endif
3567
3568 if (SSL_C_IS_EXPORT(s->s3->tmp.new_cipher) && !has_bits(i,EVP_PKT_EXP))
3569 {
3570 #ifndef OPENSSL_NO_RSA
3571 if (alg_k & SSL_kRSA)
3572 {
3573 if (rsa == NULL
3574 || RSA_size(rsa)*8 > SSL_C_EXPORT_PKEYLENGTH(s->s3->tmp.new_cipher))
3575 {
3576 SSLerr(SSL_F_SSL3_CHECK_CERT_AND_ALGORITHM,SSL_R_MISSING_EXPORT_TMP_RSA_KEY);
3577 goto f_err;
3578 }
3579 }
3580 else
3581 #endif
3582 #ifndef OPENSSL_NO_DH
3583 if (alg_k & (SSL_kEDH|SSL_kDHr|SSL_kDHd))
3584 {
3585 if (dh == NULL
3586 || DH_size(dh)*8 > SSL_C_EXPORT_PKEYLENGTH(s->s3->tmp.new_cipher))
3587 {
3588 SSLerr(SSL_F_SSL3_CHECK_CERT_AND_ALGORITHM,SSL_R_MISSING_EXPORT_TMP_DH_KEY);
3589 goto f_err;
3590 }
3591 }
3592 else
3593 #endif
3594 {
3595 SSLerr(SSL_F_SSL3_CHECK_CERT_AND_ALGORITHM,SSL_R_UNKNOWN_KEY_EXCHANGE_TYPE);
3596 goto f_err;
3597 }
3598 }
3599 return(1);
3600 f_err:
3601 ssl3_send_alert(s,SSL3_AL_FATAL,SSL_AD_HANDSHAKE_FAILURE);
3602 err:
3603 return(0);
3604 }
3605
3606 #if !defined(OPENSSL_NO_TLSEXT)
3607 # if !defined(OPENSSL_NO_NEXTPROTONEG)
ssl3_send_next_proto(SSL * s)3608 int ssl3_send_next_proto(SSL *s)
3609 {
3610 unsigned int len, padding_len;
3611 unsigned char *d;
3612
3613 if (s->state == SSL3_ST_CW_NEXT_PROTO_A)
3614 {
3615 len = s->next_proto_negotiated_len;
3616 padding_len = 32 - ((len + 2) % 32);
3617 d = (unsigned char *)s->init_buf->data;
3618 d[4] = len;
3619 memcpy(d + 5, s->next_proto_negotiated, len);
3620 d[5 + len] = padding_len;
3621 memset(d + 6 + len, 0, padding_len);
3622 *(d++)=SSL3_MT_NEXT_PROTO;
3623 l2n3(2 + len + padding_len, d);
3624 s->state = SSL3_ST_CW_NEXT_PROTO_B;
3625 s->init_num = 4 + 2 + len + padding_len;
3626 s->init_off = 0;
3627 }
3628
3629 return ssl3_do_write(s, SSL3_RT_HANDSHAKE);
3630 }
3631 # endif /* !OPENSSL_NO_NEXTPROTONEG */
3632
ssl3_send_channel_id(SSL * s)3633 int ssl3_send_channel_id(SSL *s)
3634 {
3635 unsigned char *d;
3636 int ret = -1, public_key_len;
3637 EVP_MD_CTX md_ctx;
3638 size_t sig_len;
3639 ECDSA_SIG *sig = NULL;
3640 unsigned char *public_key = NULL, *derp, *der_sig = NULL;
3641
3642 if (s->state != SSL3_ST_CW_CHANNEL_ID_A)
3643 return ssl3_do_write(s, SSL3_RT_HANDSHAKE);
3644
3645 if (!s->tlsext_channel_id_private && s->ctx->channel_id_cb)
3646 {
3647 EVP_PKEY *key = NULL;
3648 s->ctx->channel_id_cb(s, &key);
3649 if (key != NULL)
3650 {
3651 s->tlsext_channel_id_private = key;
3652 }
3653 }
3654 if (!s->tlsext_channel_id_private)
3655 {
3656 s->rwstate=SSL_CHANNEL_ID_LOOKUP;
3657 return (-1);
3658 }
3659 s->rwstate=SSL_NOTHING;
3660
3661 d = (unsigned char *)s->init_buf->data;
3662 *(d++)=SSL3_MT_ENCRYPTED_EXTENSIONS;
3663 l2n3(2 + 2 + TLSEXT_CHANNEL_ID_SIZE, d);
3664 if (s->s3->tlsext_channel_id_new)
3665 s2n(TLSEXT_TYPE_channel_id_new, d);
3666 else
3667 s2n(TLSEXT_TYPE_channel_id, d);
3668 s2n(TLSEXT_CHANNEL_ID_SIZE, d);
3669
3670 EVP_MD_CTX_init(&md_ctx);
3671
3672 public_key_len = i2d_PublicKey(s->tlsext_channel_id_private, NULL);
3673 if (public_key_len <= 0)
3674 {
3675 SSLerr(SSL_F_SSL3_SEND_CHANNEL_ID,SSL_R_CANNOT_SERIALIZE_PUBLIC_KEY);
3676 goto err;
3677 }
3678 /* i2d_PublicKey will produce an ANSI X9.62 public key which, for a
3679 * P-256 key, is 0x04 (meaning uncompressed) followed by the x and y
3680 * field elements as 32-byte, big-endian numbers. */
3681 if (public_key_len != 65)
3682 {
3683 SSLerr(SSL_F_SSL3_SEND_CHANNEL_ID,SSL_R_CHANNEL_ID_NOT_P256);
3684 goto err;
3685 }
3686 public_key = OPENSSL_malloc(public_key_len);
3687 if (!public_key)
3688 {
3689 SSLerr(SSL_F_SSL3_SEND_CHANNEL_ID,ERR_R_MALLOC_FAILURE);
3690 goto err;
3691 }
3692
3693 derp = public_key;
3694 i2d_PublicKey(s->tlsext_channel_id_private, &derp);
3695
3696 if (EVP_DigestSignInit(&md_ctx, NULL, EVP_sha256(), NULL,
3697 s->tlsext_channel_id_private) != 1)
3698 {
3699 SSLerr(SSL_F_SSL3_SEND_CHANNEL_ID,SSL_R_EVP_DIGESTSIGNINIT_FAILED);
3700 goto err;
3701 }
3702
3703 if (!tls1_channel_id_hash(&md_ctx, s))
3704 goto err;
3705
3706 if (!EVP_DigestSignFinal(&md_ctx, NULL, &sig_len))
3707 {
3708 SSLerr(SSL_F_SSL3_SEND_CHANNEL_ID,SSL_R_EVP_DIGESTSIGNFINAL_FAILED);
3709 goto err;
3710 }
3711
3712 der_sig = OPENSSL_malloc(sig_len);
3713 if (!der_sig)
3714 {
3715 SSLerr(SSL_F_SSL3_SEND_CHANNEL_ID,ERR_R_MALLOC_FAILURE);
3716 goto err;
3717 }
3718
3719 if (!EVP_DigestSignFinal(&md_ctx, der_sig, &sig_len))
3720 {
3721 SSLerr(SSL_F_SSL3_SEND_CHANNEL_ID,SSL_R_EVP_DIGESTSIGNFINAL_FAILED);
3722 goto err;
3723 }
3724
3725 derp = der_sig;
3726 sig = d2i_ECDSA_SIG(NULL, (const unsigned char**) &derp, sig_len);
3727 if (sig == NULL)
3728 {
3729 SSLerr(SSL_F_SSL3_SEND_CHANNEL_ID,SSL_R_D2I_ECDSA_SIG);
3730 goto err;
3731 }
3732
3733 /* The first byte of public_key will be 0x4, denoting an uncompressed key. */
3734 memcpy(d, public_key + 1, 64);
3735 d += 64;
3736 memset(d, 0, 2 * 32);
3737 BN_bn2bin(sig->r, d + 32 - BN_num_bytes(sig->r));
3738 d += 32;
3739 BN_bn2bin(sig->s, d + 32 - BN_num_bytes(sig->s));
3740 d += 32;
3741
3742 s->state = SSL3_ST_CW_CHANNEL_ID_B;
3743 s->init_num = 4 + 2 + 2 + TLSEXT_CHANNEL_ID_SIZE;
3744 s->init_off = 0;
3745
3746 ret = ssl3_do_write(s, SSL3_RT_HANDSHAKE);
3747
3748 err:
3749 EVP_MD_CTX_cleanup(&md_ctx);
3750 if (public_key)
3751 OPENSSL_free(public_key);
3752 if (der_sig)
3753 OPENSSL_free(der_sig);
3754 if (sig)
3755 ECDSA_SIG_free(sig);
3756
3757 return ret;
3758 }
3759 #endif /* !OPENSSL_NO_TLSEXT */
3760
3761 /* Check to see if handshake is full or resumed. Usually this is just a
3762 * case of checking to see if a cache hit has occurred. In the case of
3763 * session tickets we have to check the next message to be sure.
3764 */
3765
3766 #ifndef OPENSSL_NO_TLSEXT
ssl3_check_finished(SSL * s)3767 int ssl3_check_finished(SSL *s)
3768 {
3769 int ok;
3770 long n;
3771 /* If we have no ticket it cannot be a resumed session. */
3772 if (!s->session->tlsext_tick)
3773 return 1;
3774 /* this function is called when we really expect a Certificate
3775 * message, so permit appropriate message length */
3776 n=s->method->ssl_get_message(s,
3777 SSL3_ST_CR_CERT_A,
3778 SSL3_ST_CR_CERT_B,
3779 -1,
3780 s->max_cert_list,
3781 &ok);
3782 if (!ok) return((int)n);
3783 s->s3->tmp.reuse_message = 1;
3784 if ((s->s3->tmp.message_type == SSL3_MT_FINISHED)
3785 || (s->s3->tmp.message_type == SSL3_MT_NEWSESSION_TICKET))
3786 return 2;
3787
3788 return 1;
3789 }
3790 #endif
3791
ssl_do_client_cert_cb(SSL * s,X509 ** px509,EVP_PKEY ** ppkey)3792 int ssl_do_client_cert_cb(SSL *s, X509 **px509, EVP_PKEY **ppkey)
3793 {
3794 int i = 0;
3795 #ifndef OPENSSL_NO_ENGINE
3796 if (s->ctx->client_cert_engine)
3797 {
3798 i = ENGINE_load_ssl_client_cert(s->ctx->client_cert_engine, s,
3799 SSL_get_client_CA_list(s),
3800 px509, ppkey, NULL, NULL, NULL);
3801 if (i != 0)
3802 return i;
3803 }
3804 #endif
3805 if (s->ctx->client_cert_cb)
3806 i = s->ctx->client_cert_cb(s,px509,ppkey);
3807 return i;
3808 }
3809