blob: 0379cc58c5dfcdcceb0f1118342888d82738c423 [file] [log] [blame]
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00001/* ssl/s3_srvr.c */
Ralf S. Engelschall58964a41998-12-21 10:56:39 +00002/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00003 * 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#define REUSE_CIPHER_BUG
60
61#include <stdio.h>
Bodo Möllerec577821999-04-23 22:13:45 +000062#include <openssl/buffer.h>
63#include <openssl/rand.h>
64#include <openssl/objects.h>
65#include <openssl/evp.h>
66#include <openssl/x509.h>
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +000067#include "ssl_locl.h"
68
Dr. Stephen Henson9b3086f1999-01-31 17:30:18 +000069static SSL_METHOD *ssl3_get_server_method(int ver);
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +000070static int ssl3_get_client_hello(SSL *s);
71static int ssl3_send_server_hello(SSL *s);
72static int ssl3_send_server_key_exchange(SSL *s);
73static int ssl3_send_certificate_request(SSL *s);
74static int ssl3_send_server_done(SSL *s);
75static int ssl3_get_cert_verify(SSL *s);
76static int ssl3_get_client_key_exchange(SSL *s);
77static int ssl3_get_client_certificate(SSL *s);
78static int ssl3_send_hello_request(SSL *s);
79
Ulf Möller6b691a51999-04-19 21:31:43 +000080static SSL_METHOD *ssl3_get_server_method(int ver)
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +000081 {
Ralf S. Engelschall58964a41998-12-21 10:56:39 +000082 if (ver == SSL3_VERSION)
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +000083 return(SSLv3_server_method());
84 else
85 return(NULL);
86 }
87
Ulf Möller6b691a51999-04-19 21:31:43 +000088SSL_METHOD *SSLv3_server_method(void)
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +000089 {
90 static int init=1;
91 static SSL_METHOD SSLv3_server_data;
92
93 if (init)
94 {
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +000095 memcpy((char *)&SSLv3_server_data,(char *)sslv3_base_method(),
96 sizeof(SSL_METHOD));
97 SSLv3_server_data.ssl_accept=ssl3_accept;
98 SSLv3_server_data.get_ssl_method=ssl3_get_server_method;
Bodo Möller5cc146f1999-04-22 13:37:46 +000099 init=0;
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +0000100 }
101 return(&SSLv3_server_data);
102 }
103
Ulf Möller6b691a51999-04-19 21:31:43 +0000104int ssl3_accept(SSL *s)
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +0000105 {
106 BUF_MEM *buf;
107 unsigned long l,Time=time(NULL);
108 void (*cb)()=NULL;
109 long num1;
110 int ret= -1;
111 CERT *ct;
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +0000112 int new_state,state,skip=0;
113
Ben Lauriebf5dcd11999-02-09 23:01:08 +0000114 RAND_seed(&Time,sizeof(Time));
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +0000115 ERR_clear_error();
Ralf S. Engelschall58964a41998-12-21 10:56:39 +0000116 clear_sys_error();
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +0000117
118 if (s->info_callback != NULL)
119 cb=s->info_callback;
120 else if (s->ctx->info_callback != NULL)
121 cb=s->ctx->info_callback;
122
123 /* init things to blank */
124 if (!SSL_in_init(s) || SSL_in_before(s)) SSL_clear(s);
125 s->in_handshake++;
126
127#ifdef undef
128 /* FIX THIS EAY EAY EAY */
129 /* we don't actually need a cert, we just need a cert or a DH_tmp */
130 if (((s->session == NULL) || (s->session->cert == NULL)) &&
131 (s->cert == NULL))
132 {
133 SSLerr(SSL_F_SSL3_ACCEPT,SSL_R_NO_CERTIFICATE_SET);
134 ret= -1;
135 goto end;
136 }
137#endif
138
139 for (;;)
140 {
141 state=s->state;
142
143 switch (s->state)
144 {
145 case SSL_ST_RENEGOTIATE:
146 s->new_session=1;
147 /* s->state=SSL_ST_ACCEPT; */
148
149 case SSL_ST_BEFORE:
150 case SSL_ST_ACCEPT:
151 case SSL_ST_BEFORE|SSL_ST_ACCEPT:
152 case SSL_ST_OK|SSL_ST_ACCEPT:
153
Mark J. Cox413c4f41999-02-16 09:22:21 +0000154 s->server=1;
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +0000155 if (cb != NULL) cb(s,SSL_CB_HANDSHAKE_START,1);
156
Ralf S. Engelschall58964a41998-12-21 10:56:39 +0000157 if ((s->version>>8) != 3)
158 abort();
159 /* s->version=SSL3_VERSION; */
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +0000160 s->type=SSL_ST_ACCEPT;
161
162 if (s->init_buf == NULL)
163 {
164 if ((buf=BUF_MEM_new()) == NULL)
165 {
166 ret= -1;
167 goto end;
168 }
169 if (!BUF_MEM_grow(buf,SSL3_RT_MAX_PLAIN_LENGTH))
170 {
171 ret= -1;
172 goto end;
173 }
174 s->init_buf=buf;
175 }
176
177 if (!ssl3_setup_buffers(s))
178 {
179 ret= -1;
180 goto end;
181 }
182
183 /* Ok, we now need to push on a buffering BIO so that
184 * the output is sent in a way that TCP likes :-)
185 */
Ralf S. Engelschall58964a41998-12-21 10:56:39 +0000186 if (!ssl_init_wbio_buffer(s,1)) { ret= -1; goto end; }
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +0000187
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +0000188 s->init_num=0;
189
190 if (s->state != SSL_ST_RENEGOTIATE)
191 {
192 s->state=SSL3_ST_SR_CLNT_HELLO_A;
193 ssl3_init_finished_mac(s);
Mark J. Cox413c4f41999-02-16 09:22:21 +0000194 s->ctx->stats.sess_accept++;
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +0000195 }
196 else
197 {
Mark J. Cox413c4f41999-02-16 09:22:21 +0000198 s->ctx->stats.sess_accept_renegotiate++;
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +0000199 s->state=SSL3_ST_SW_HELLO_REQ_A;
200 }
201 break;
202
203 case SSL3_ST_SW_HELLO_REQ_A:
204 case SSL3_ST_SW_HELLO_REQ_B:
205
206 s->shutdown=0;
207 ret=ssl3_send_hello_request(s);
208 if (ret <= 0) goto end;
209 s->s3->tmp.next_state=SSL3_ST_SW_HELLO_REQ_C;
210 s->state=SSL3_ST_SW_FLUSH;
211 s->init_num=0;
212
213 ssl3_init_finished_mac(s);
214 break;
215
216 case SSL3_ST_SW_HELLO_REQ_C:
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +0000217 s->state=SSL_ST_OK;
218 ret=1;
219 goto end;
Ralf S. Engelschall58964a41998-12-21 10:56:39 +0000220 /* break; */
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +0000221
222 case SSL3_ST_SR_CLNT_HELLO_A:
223 case SSL3_ST_SR_CLNT_HELLO_B:
224 case SSL3_ST_SR_CLNT_HELLO_C:
225
226 s->shutdown=0;
227 ret=ssl3_get_client_hello(s);
228 if (ret <= 0) goto end;
229 s->state=SSL3_ST_SW_SRVR_HELLO_A;
230 s->init_num=0;
231 break;
232
233 case SSL3_ST_SW_SRVR_HELLO_A:
234 case SSL3_ST_SW_SRVR_HELLO_B:
235 ret=ssl3_send_server_hello(s);
236 if (ret <= 0) goto end;
237
238 if (s->hit)
239 s->state=SSL3_ST_SW_CHANGE_A;
240 else
241 s->state=SSL3_ST_SW_CERT_A;
242 s->init_num=0;
243 break;
244
245 case SSL3_ST_SW_CERT_A:
246 case SSL3_ST_SW_CERT_B:
247 /* Check if it is anon DH */
248 if (!(s->s3->tmp.new_cipher->algorithms & SSL_aNULL))
249 {
250 ret=ssl3_send_server_certificate(s);
251 if (ret <= 0) goto end;
252 }
253 else
254 skip=1;
255 s->state=SSL3_ST_SW_KEY_EXCH_A;
256 s->init_num=0;
257 break;
258
259 case SSL3_ST_SW_KEY_EXCH_A:
260 case SSL3_ST_SW_KEY_EXCH_B:
261 l=s->s3->tmp.new_cipher->algorithms;
262 if (s->session->cert == NULL)
263 {
264 if (s->cert != NULL)
265 {
266 CRYPTO_add(&s->cert->references,1,CRYPTO_LOCK_SSL_CERT);
267 s->session->cert=s->cert;
268 }
269 else
270 {
271 CRYPTO_add(&s->ctx->default_cert->references,1,CRYPTO_LOCK_SSL_CERT);
272 s->session->cert=s->ctx->default_cert;
273 }
274 }
275 ct=s->session->cert;
276
277 /* clear this, it may get reset by
278 * send_server_key_exchange */
Ralf S. Engelschall58964a41998-12-21 10:56:39 +0000279 if (s->options & SSL_OP_EPHEMERAL_RSA)
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +0000280 s->s3->tmp.use_rsa_tmp=1;
281 else
282 s->s3->tmp.use_rsa_tmp=0;
283
284 /* only send if a DH key exchange, fortezza or
285 * RSA but we have a sign only certificate */
Ben Laurie06ab81f1999-02-21 20:03:24 +0000286 if (s->s3->tmp.use_rsa_tmp
287 || (l & (SSL_DH|SSL_kFZA))
288 || ((l & SSL_kRSA)
289 && (ct->pkeys[SSL_PKEY_RSA_ENC].privatekey == NULL
290 || (SSL_IS_EXPORT(l)
291 && EVP_PKEY_size(ct->pkeys[SSL_PKEY_RSA_ENC].privatekey)*8 > SSL_EXPORT_PKEYLENGTH(l)
292 )
293 )
294 )
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +0000295 )
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +0000296 {
297 ret=ssl3_send_server_key_exchange(s);
298 if (ret <= 0) goto end;
299 }
300 else
301 skip=1;
302
303 s->state=SSL3_ST_SW_CERT_REQ_A;
304 s->init_num=0;
305 break;
306
307 case SSL3_ST_SW_CERT_REQ_A:
308 case SSL3_ST_SW_CERT_REQ_B:
309 if (!(s->verify_mode & SSL_VERIFY_PEER) ||
310 ((s->session->peer != NULL) &&
311 (s->verify_mode & SSL_VERIFY_CLIENT_ONCE)))
312 {
313 /* no cert request */
314 skip=1;
Ralf S. Engelschall58964a41998-12-21 10:56:39 +0000315 s->s3->tmp.cert_request=0;
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +0000316 s->state=SSL3_ST_SW_SRVR_DONE_A;
317 }
318 else
319 {
Ralf S. Engelschall58964a41998-12-21 10:56:39 +0000320 s->s3->tmp.cert_request=1;
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +0000321 ret=ssl3_send_certificate_request(s);
322 if (ret <= 0) goto end;
323 s->state=SSL3_ST_SW_SRVR_DONE_A;
324 s->init_num=0;
325 }
326 break;
327
328 case SSL3_ST_SW_SRVR_DONE_A:
329 case SSL3_ST_SW_SRVR_DONE_B:
330 ret=ssl3_send_server_done(s);
331 if (ret <= 0) goto end;
332 s->s3->tmp.next_state=SSL3_ST_SR_CERT_A;
333 s->state=SSL3_ST_SW_FLUSH;
334 s->init_num=0;
335 break;
336
337 case SSL3_ST_SW_FLUSH:
338 /* number of bytes to be flushed */
339 num1=BIO_ctrl(s->wbio,BIO_CTRL_INFO,0,NULL);
340 if (num1 > 0)
341 {
342 s->rwstate=SSL_WRITING;
343 num1=BIO_flush(s->wbio);
344 if (num1 <= 0) { ret= -1; goto end; }
345 s->rwstate=SSL_NOTHING;
346 }
347
348 s->state=s->s3->tmp.next_state;
349 break;
350
351 case SSL3_ST_SR_CERT_A:
352 case SSL3_ST_SR_CERT_B:
353 /* could be sent for a DH cert, even if we
354 * have not asked for it :-) */
355 ret=ssl3_get_client_certificate(s);
356 if (ret <= 0) goto end;
357 s->init_num=0;
358 s->state=SSL3_ST_SR_KEY_EXCH_A;
359 break;
360
361 case SSL3_ST_SR_KEY_EXCH_A:
362 case SSL3_ST_SR_KEY_EXCH_B:
363 ret=ssl3_get_client_key_exchange(s);
364 if (ret <= 0) goto end;
365 s->state=SSL3_ST_SR_CERT_VRFY_A;
366 s->init_num=0;
367
368 /* We need to get hashes here so if there is
369 * a client cert, it can be verified */
Ralf S. Engelschall58964a41998-12-21 10:56:39 +0000370 s->method->ssl3_enc->cert_verify_mac(s,
371 &(s->s3->finish_dgst1),
372 &(s->s3->tmp.finish_md[0]));
373 s->method->ssl3_enc->cert_verify_mac(s,
374 &(s->s3->finish_dgst2),
375 &(s->s3->tmp.finish_md[MD5_DIGEST_LENGTH]));
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +0000376
377 break;
378
379 case SSL3_ST_SR_CERT_VRFY_A:
380 case SSL3_ST_SR_CERT_VRFY_B:
381
382 /* we should decide if we expected this one */
383 ret=ssl3_get_cert_verify(s);
384 if (ret <= 0) goto end;
385
386 s->state=SSL3_ST_SR_FINISHED_A;
387 s->init_num=0;
388 break;
389
390 case SSL3_ST_SR_FINISHED_A:
391 case SSL3_ST_SR_FINISHED_B:
392 ret=ssl3_get_finished(s,SSL3_ST_SR_FINISHED_A,
Ralf S. Engelschall58964a41998-12-21 10:56:39 +0000393 SSL3_ST_SR_FINISHED_B);
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +0000394 if (ret <= 0) goto end;
395 if (s->hit)
396 s->state=SSL_ST_OK;
397 else
398 s->state=SSL3_ST_SW_CHANGE_A;
399 s->init_num=0;
400 break;
401
402 case SSL3_ST_SW_CHANGE_A:
403 case SSL3_ST_SW_CHANGE_B:
404
405 s->session->cipher=s->s3->tmp.new_cipher;
Ralf S. Engelschall58964a41998-12-21 10:56:39 +0000406 if (!s->method->ssl3_enc->setup_key_block(s))
407 { ret= -1; goto end; }
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +0000408
409 ret=ssl3_send_change_cipher_spec(s,
410 SSL3_ST_SW_CHANGE_A,SSL3_ST_SW_CHANGE_B);
411
412 if (ret <= 0) goto end;
413 s->state=SSL3_ST_SW_FINISHED_A;
414 s->init_num=0;
415
Ralf S. Engelschall58964a41998-12-21 10:56:39 +0000416 if (!s->method->ssl3_enc->change_cipher_state(s,
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +0000417 SSL3_CHANGE_CIPHER_SERVER_WRITE))
418 {
419 ret= -1;
420 goto end;
421 }
422
423 break;
424
425 case SSL3_ST_SW_FINISHED_A:
426 case SSL3_ST_SW_FINISHED_B:
427 ret=ssl3_send_finished(s,
428 SSL3_ST_SW_FINISHED_A,SSL3_ST_SW_FINISHED_B,
Ralf S. Engelschall58964a41998-12-21 10:56:39 +0000429 s->method->ssl3_enc->server_finished,
430 s->method->ssl3_enc->server_finished_len);
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +0000431 if (ret <= 0) goto end;
432 s->state=SSL3_ST_SW_FLUSH;
433 if (s->hit)
434 s->s3->tmp.next_state=SSL3_ST_SR_FINISHED_A;
435 else
436 s->s3->tmp.next_state=SSL_ST_OK;
437 s->init_num=0;
438 break;
439
440 case SSL_ST_OK:
441 /* clean a few things up */
442 ssl3_cleanup_key_block(s);
443
444 BUF_MEM_free(s->init_buf);
445 s->init_buf=NULL;
446
447 /* remove buffering on output */
Mark J. Cox413c4f41999-02-16 09:22:21 +0000448 ssl_free_wbio_buffer(s);
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +0000449
450 s->new_session=0;
451 s->init_num=0;
452
453 ssl_update_cache(s,SSL_SESS_CACHE_SERVER);
454
Mark J. Cox413c4f41999-02-16 09:22:21 +0000455 s->ctx->stats.sess_accept_good++;
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +0000456 /* s->server=1; */
457 s->handshake_func=ssl3_accept;
458 ret=1;
459
460 if (cb != NULL) cb(s,SSL_CB_HANDSHAKE_DONE,1);
461
462 goto end;
Ralf S. Engelschall58964a41998-12-21 10:56:39 +0000463 /* break; */
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +0000464
465 default:
466 SSLerr(SSL_F_SSL3_ACCEPT,SSL_R_UNKNOWN_STATE);
467 ret= -1;
468 goto end;
Ralf S. Engelschall58964a41998-12-21 10:56:39 +0000469 /* break; */
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +0000470 }
471
472 if (!s->s3->tmp.reuse_message && !skip)
473 {
Ralf S. Engelschall58964a41998-12-21 10:56:39 +0000474 if (s->debug)
475 {
476 if ((ret=BIO_flush(s->wbio)) <= 0)
477 goto end;
478 }
479
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +0000480
481 if ((cb != NULL) && (s->state != state))
482 {
483 new_state=s->state;
484 s->state=state;
485 cb(s,SSL_CB_ACCEPT_LOOP,1);
486 s->state=new_state;
487 }
488 }
489 skip=0;
490 }
491end:
492 /* BIO_flush(s->wbio); */
493
494 if (cb != NULL)
495 cb(s,SSL_CB_ACCEPT_EXIT,ret);
496 s->in_handshake--;
497 return(ret);
498 }
499
Ulf Möller6b691a51999-04-19 21:31:43 +0000500static int ssl3_send_hello_request(SSL *s)
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +0000501 {
502 unsigned char *p;
503
504 if (s->state == SSL3_ST_SW_HELLO_REQ_A)
505 {
506 p=(unsigned char *)s->init_buf->data;
507 *(p++)=SSL3_MT_CLIENT_REQUEST;
508 *(p++)=0;
509 *(p++)=0;
510 *(p++)=0;
511
512 s->state=SSL3_ST_SW_HELLO_REQ_B;
513 /* number of bytes to write */
514 s->init_num=4;
515 s->init_off=0;
516 }
517
518 /* SSL3_ST_SW_HELLO_REQ_B */
519 return(ssl3_do_write(s,SSL3_RT_HANDSHAKE));
520 }
521
Ulf Möller6b691a51999-04-19 21:31:43 +0000522static int ssl3_get_client_hello(SSL *s)
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +0000523 {
524 int i,j,ok,al,ret= -1;
525 long n;
526 unsigned long id;
Mark J. Cox413c4f41999-02-16 09:22:21 +0000527 unsigned char *p,*d,*q;
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +0000528 SSL_CIPHER *c;
Mark J. Cox413c4f41999-02-16 09:22:21 +0000529 SSL_COMP *comp=NULL;
Ben Laurief73e07c1999-04-12 17:23:57 +0000530 STACK_OF(SSL_CIPHER) *ciphers=NULL;
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +0000531
Ralf S. Engelschall58964a41998-12-21 10:56:39 +0000532 /* We do this so that we will respond with our native type.
533 * If we are TLSv1 and we get SSLv3, we will respond with TLSv1,
534 * This down switching should be handled by a different method.
535 * If we are SSLv3, we will respond with SSLv3, even if prompted with
536 * TLSv1.
537 */
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +0000538 if (s->state == SSL3_ST_SR_CLNT_HELLO_A)
539 {
540 s->first_packet=1;
541 s->state=SSL3_ST_SR_CLNT_HELLO_B;
542 }
543 n=ssl3_get_message(s,
544 SSL3_ST_SR_CLNT_HELLO_B,
545 SSL3_ST_SR_CLNT_HELLO_C,
546 SSL3_MT_CLIENT_HELLO,
547 SSL3_RT_MAX_PLAIN_LENGTH,
548 &ok);
549
550 if (!ok) return((int)n);
551 d=p=(unsigned char *)s->init_buf->data;
552
Ralf S. Engelschall58964a41998-12-21 10:56:39 +0000553 /* The version number has already been checked in ssl3_get_message.
554 * I a native TLSv1/SSLv3 method, the match must be correct except
555 * perhaps for the first message */
Mark J. Cox413c4f41999-02-16 09:22:21 +0000556/* s->client_version=(((int)p[0])<<8)|(int)p[1]; */
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +0000557 p+=2;
558
559 /* load the client random */
560 memcpy(s->s3->client_random,p,SSL3_RANDOM_SIZE);
561 p+=SSL3_RANDOM_SIZE;
562
563 /* get the session-id */
564 j= *(p++);
565
566 s->hit=0;
567 if (j == 0)
568 {
569 if (!ssl_get_new_session(s,1))
570 goto err;
571 }
572 else
573 {
Ralf S. Engelschall58964a41998-12-21 10:56:39 +0000574 i=ssl_get_prev_session(s,p,j);
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +0000575 if (i == 1)
576 { /* previous session */
577 s->hit=1;
578 }
579 else
580 {
581 if (!ssl_get_new_session(s,1))
582 goto err;
583 }
584 }
585
586 p+=j;
587 n2s(p,i);
588 if ((i == 0) && (j != 0))
589 {
590 /* we need a cipher if we are not resuming a session */
Ralf S. Engelschall58964a41998-12-21 10:56:39 +0000591 al=SSL_AD_ILLEGAL_PARAMETER;
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +0000592 SSLerr(SSL_F_SSL3_GET_CLIENT_HELLO,SSL_R_NO_CIPHERS_SPECIFIED);
593 goto f_err;
594 }
595 if ((i+p) > (d+n))
596 {
597 /* not enough data */
Ralf S. Engelschall58964a41998-12-21 10:56:39 +0000598 al=SSL_AD_DECODE_ERROR;
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +0000599 SSLerr(SSL_F_SSL3_GET_CLIENT_HELLO,SSL_R_LENGTH_MISMATCH);
600 goto f_err;
601 }
602 if ((i > 0) && (ssl_bytes_to_cipher_list(s,p,i,&(ciphers))
603 == NULL))
604 {
605 goto err;
606 }
607 p+=i;
608
609 /* If it is a hit, check that the cipher is in the list */
610 if ((s->hit) && (i > 0))
611 {
612 j=0;
613 id=s->session->cipher->id;
614
Mark J. Cox413c4f41999-02-16 09:22:21 +0000615#ifdef CIPHER_DEBUG
616 printf("client sent %d ciphers\n",sk_num(ciphers));
617#endif
Ben Laurief73e07c1999-04-12 17:23:57 +0000618 for (i=0; i<sk_SSL_CIPHER_num(ciphers); i++)
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +0000619 {
Ben Laurief73e07c1999-04-12 17:23:57 +0000620 c=sk_SSL_CIPHER_value(ciphers,i);
Mark J. Cox413c4f41999-02-16 09:22:21 +0000621#ifdef CIPHER_DEBUG
622 printf("client [%2d of %2d]:%s\n",
623 i,sk_num(ciphers),SSL_CIPHER_get_name(c));
624#endif
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +0000625 if (c->id == id)
626 {
627 j=1;
628 break;
629 }
630 }
631 if (j == 0)
632 {
Ben Laurief73e07c1999-04-12 17:23:57 +0000633 if ((s->options & SSL_OP_NETSCAPE_REUSE_CIPHER_CHANGE_BUG) && (sk_SSL_CIPHER_num(ciphers) == 1))
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +0000634 {
635 /* Very bad for multi-threading.... */
Ben Laurief73e07c1999-04-12 17:23:57 +0000636 s->session->cipher=sk_SSL_CIPHER_value(ciphers,
637 0);
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +0000638 }
639 else
640 {
641 /* we need to have the cipher in the cipher
642 * list if we are asked to reuse it */
Ralf S. Engelschall58964a41998-12-21 10:56:39 +0000643 al=SSL_AD_ILLEGAL_PARAMETER;
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +0000644 SSLerr(SSL_F_SSL3_GET_CLIENT_HELLO,SSL_R_REQUIRED_CIPHER_MISSING);
645 goto f_err;
646 }
647 }
648 }
649
650 /* compression */
651 i= *(p++);
Mark J. Cox413c4f41999-02-16 09:22:21 +0000652 q=p;
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +0000653 for (j=0; j<i; j++)
Mark J. Cox413c4f41999-02-16 09:22:21 +0000654 {
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +0000655 if (p[j] == 0) break;
Mark J. Cox413c4f41999-02-16 09:22:21 +0000656 }
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +0000657
658 p+=i;
659 if (j >= i)
660 {
661 /* no compress */
Ralf S. Engelschall58964a41998-12-21 10:56:39 +0000662 al=SSL_AD_DECODE_ERROR;
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +0000663 SSLerr(SSL_F_SSL3_GET_CLIENT_HELLO,SSL_R_NO_COMPRESSION_SPECIFIED);
664 goto f_err;
665 }
666
Mark J. Cox413c4f41999-02-16 09:22:21 +0000667 /* Worst case, we will use the NULL compression, but if we have other
668 * options, we will now look for them. We have i-1 compression
669 * algorithms from the client, starting at q. */
670 s->s3->tmp.new_compression=NULL;
671 if (s->ctx->comp_methods != NULL)
672 { /* See if we have a match */
673 int m,nn,o,v,done=0;
674
Ben Laurief73e07c1999-04-12 17:23:57 +0000675 nn=sk_SSL_COMP_num(s->ctx->comp_methods);
Mark J. Cox413c4f41999-02-16 09:22:21 +0000676 for (m=0; m<nn; m++)
677 {
Ben Laurief73e07c1999-04-12 17:23:57 +0000678 comp=sk_SSL_COMP_value(s->ctx->comp_methods,m);
Mark J. Cox413c4f41999-02-16 09:22:21 +0000679 v=comp->id;
680 for (o=0; o<i; o++)
681 {
682 if (v == q[o])
683 {
684 done=1;
685 break;
686 }
687 }
688 if (done) break;
689 }
690 if (done)
691 s->s3->tmp.new_compression=comp;
692 else
693 comp=NULL;
694 }
695
Ralf S. Engelschall58964a41998-12-21 10:56:39 +0000696 /* TLS does not mind if there is extra stuff */
697 if (s->version == SSL3_VERSION)
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +0000698 {
Ralf S. Engelschall58964a41998-12-21 10:56:39 +0000699 if (p > (d+n))
700 {
701 /* wrong number of bytes,
702 * there could be more to follow */
703 al=SSL_AD_DECODE_ERROR;
704 SSLerr(SSL_F_SSL3_GET_CLIENT_HELLO,SSL_R_LENGTH_MISMATCH);
705 goto f_err;
706 }
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +0000707 }
708
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +0000709 /* Given s->session->ciphers and ssl_get_ciphers_by_id(s), we must
710 * pick a cipher */
711
712 if (!s->hit)
713 {
Mark J. Cox413c4f41999-02-16 09:22:21 +0000714 s->session->compress_meth=(comp == NULL)?0:comp->id;
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +0000715 if (s->session->ciphers != NULL)
Ben Laurief73e07c1999-04-12 17:23:57 +0000716 sk_SSL_CIPHER_free(s->session->ciphers);
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +0000717 s->session->ciphers=ciphers;
718 if (ciphers == NULL)
719 {
Ralf S. Engelschall58964a41998-12-21 10:56:39 +0000720 al=SSL_AD_ILLEGAL_PARAMETER;
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +0000721 SSLerr(SSL_F_SSL3_GET_CLIENT_HELLO,SSL_R_NO_CIPHERS_PASSED);
722 goto f_err;
723 }
724 ciphers=NULL;
725 c=ssl3_choose_cipher(s,s->session->ciphers,
Ben Laurief73e07c1999-04-12 17:23:57 +0000726 ssl_get_ciphers_by_id(s));
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +0000727
728 if (c == NULL)
729 {
Ralf S. Engelschall58964a41998-12-21 10:56:39 +0000730 al=SSL_AD_HANDSHAKE_FAILURE;
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +0000731 SSLerr(SSL_F_SSL3_GET_CLIENT_HELLO,SSL_R_NO_SHARED_CIPHER);
732 goto f_err;
733 }
734 s->s3->tmp.new_cipher=c;
735 }
736 else
737 {
738 /* Session-id reuse */
739#ifdef REUSE_CIPHER_BUG
Ben Laurief73e07c1999-04-12 17:23:57 +0000740 STACK_OF(SSL_CIPHER) *sk;
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +0000741 SSL_CIPHER *nc=NULL;
742 SSL_CIPHER *ec=NULL;
743
Ralf S. Engelschall58964a41998-12-21 10:56:39 +0000744 if (s->options & SSL_OP_NETSCAPE_DEMO_CIPHER_CHANGE_BUG)
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +0000745 {
746 sk=s->session->ciphers;
Ben Laurief73e07c1999-04-12 17:23:57 +0000747 for (i=0; i<sk_SSL_CIPHER_num(sk); i++)
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +0000748 {
Ben Laurief73e07c1999-04-12 17:23:57 +0000749 c=sk_SSL_CIPHER_value(sk,i);
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +0000750 if (c->algorithms & SSL_eNULL)
751 nc=c;
Ben Laurie06ab81f1999-02-21 20:03:24 +0000752 if (SSL_C_IS_EXPORT(c))
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +0000753 ec=c;
754 }
755 if (nc != NULL)
756 s->s3->tmp.new_cipher=nc;
757 else if (ec != NULL)
758 s->s3->tmp.new_cipher=ec;
759 else
760 s->s3->tmp.new_cipher=s->session->cipher;
761 }
762 else
763#endif
764 s->s3->tmp.new_cipher=s->session->cipher;
765 }
766
767 /* we now have the following setup.
768 * client_random
769 * cipher_list - our prefered list of ciphers
770 * ciphers - the clients prefered list of ciphers
771 * compression - basically ignored right now
772 * ssl version is set - sslv3
773 * s->session - The ssl session has been setup.
774 * s->hit - sesson reuse flag
775 * s->tmp.new_cipher - the new cipher to use.
776 */
777
778 ret=1;
779 if (0)
780 {
781f_err:
782 ssl3_send_alert(s,SSL3_AL_FATAL,al);
783 }
784err:
Ben Laurief73e07c1999-04-12 17:23:57 +0000785 if (ciphers != NULL) sk_SSL_CIPHER_free(ciphers);
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +0000786 return(ret);
787 }
788
Ulf Möller6b691a51999-04-19 21:31:43 +0000789static int ssl3_send_server_hello(SSL *s)
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +0000790 {
791 unsigned char *buf;
792 unsigned char *p,*d;
793 int i,sl;
794 unsigned long l,Time;
795
796 if (s->state == SSL3_ST_SW_SRVR_HELLO_A)
797 {
798 buf=(unsigned char *)s->init_buf->data;
799 p=s->s3->server_random;
800 Time=time(NULL); /* Time */
801 l2n(Time,p);
802 RAND_bytes(p,SSL3_RANDOM_SIZE-sizeof(Time));
803 /* Do the message type and length last */
804 d=p= &(buf[4]);
805
Ralf S. Engelschall58964a41998-12-21 10:56:39 +0000806 *(p++)=s->version>>8;
807 *(p++)=s->version&0xff;
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +0000808
809 /* Random stuff */
810 memcpy(p,s->s3->server_random,SSL3_RANDOM_SIZE);
811 p+=SSL3_RANDOM_SIZE;
812
813 /* now in theory we have 3 options to sending back the
814 * session id. If it is a re-use, we send back the
815 * old session-id, if it is a new session, we send
816 * back the new session-id or we send back a 0 length
817 * session-id if we want it to be single use.
818 * Currently I will not implement the '0' length session-id
Ralf S. Engelschall58964a41998-12-21 10:56:39 +0000819 * 12-Jan-98 - I'll now support the '0' length stuff.
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +0000820 */
Ralf S. Engelschall58964a41998-12-21 10:56:39 +0000821 if (!(s->ctx->session_cache_mode & SSL_SESS_CACHE_SERVER))
822 s->session->session_id_length=0;
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +0000823
824 sl=s->session->session_id_length;
825 *(p++)=sl;
826 memcpy(p,s->session->session_id,sl);
827 p+=sl;
828
829 /* put the cipher */
830 i=ssl3_put_cipher_by_char(s->s3->tmp.new_cipher,p);
831 p+=i;
832
833 /* put the compression method */
Mark J. Cox413c4f41999-02-16 09:22:21 +0000834 if (s->s3->tmp.new_compression == NULL)
835 *(p++)=0;
836 else
837 *(p++)=s->s3->tmp.new_compression->id;
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +0000838
839 /* do the header */
840 l=(p-d);
841 d=buf;
842 *(d++)=SSL3_MT_SERVER_HELLO;
843 l2n3(l,d);
844
845 s->state=SSL3_ST_CW_CLNT_HELLO_B;
846 /* number of bytes to write */
847 s->init_num=p-buf;
848 s->init_off=0;
849 }
850
851 /* SSL3_ST_CW_CLNT_HELLO_B */
852 return(ssl3_do_write(s,SSL3_RT_HANDSHAKE));
853 }
854
Ulf Möller6b691a51999-04-19 21:31:43 +0000855static int ssl3_send_server_done(SSL *s)
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +0000856 {
857 unsigned char *p;
858
859 if (s->state == SSL3_ST_SW_SRVR_DONE_A)
860 {
861 p=(unsigned char *)s->init_buf->data;
862
863 /* do the header */
864 *(p++)=SSL3_MT_SERVER_DONE;
865 *(p++)=0;
866 *(p++)=0;
867 *(p++)=0;
868
869 s->state=SSL3_ST_SW_SRVR_DONE_B;
870 /* number of bytes to write */
871 s->init_num=4;
872 s->init_off=0;
873 }
874
875 /* SSL3_ST_CW_CLNT_HELLO_B */
876 return(ssl3_do_write(s,SSL3_RT_HANDSHAKE));
877 }
878
Ulf Möller6b691a51999-04-19 21:31:43 +0000879static int ssl3_send_server_key_exchange(SSL *s)
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +0000880 {
881#ifndef NO_RSA
882 unsigned char *q;
883 int j,num;
884 RSA *rsa;
885 unsigned char md_buf[MD5_DIGEST_LENGTH+SHA_DIGEST_LENGTH];
886#endif
887#ifndef NO_DH
888 DH *dh,*dhp;
889#endif
890 EVP_PKEY *pkey;
891 unsigned char *p,*d;
892 int al,i;
893 unsigned long type;
894 int n;
895 CERT *cert;
896 BIGNUM *r[4];
897 int nr[4],kn;
898 BUF_MEM *buf;
899 EVP_MD_CTX md_ctx;
900
901 if (s->state == SSL3_ST_SW_KEY_EXCH_A)
902 {
903 type=s->s3->tmp.new_cipher->algorithms & SSL_MKEY_MASK;
904 cert=s->session->cert;
905
906 buf=s->init_buf;
907
908 r[0]=r[1]=r[2]=r[3]=NULL;
909 n=0;
910#ifndef NO_RSA
911 if (type & SSL_kRSA)
912 {
913 rsa=cert->rsa_tmp;
914 if ((rsa == NULL) && (s->ctx->default_cert->rsa_tmp_cb != NULL))
915 {
916 rsa=s->ctx->default_cert->rsa_tmp_cb(s,
Ben Laurief415fa31999-03-06 14:09:36 +0000917 SSL_C_IS_EXPORT(s->s3->tmp.new_cipher),
Ben Laurie60e31c31999-02-21 21:58:59 +0000918 SSL_C_EXPORT_PKEYLENGTH(s->s3->tmp.new_cipher));
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +0000919 CRYPTO_add(&rsa->references,1,CRYPTO_LOCK_RSA);
920 cert->rsa_tmp=rsa;
921 }
922 if (rsa == NULL)
923 {
Ralf S. Engelschall58964a41998-12-21 10:56:39 +0000924 al=SSL_AD_HANDSHAKE_FAILURE;
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +0000925 SSLerr(SSL_F_SSL3_SEND_SERVER_KEY_EXCHANGE,SSL_R_MISSING_TMP_RSA_KEY);
926 goto f_err;
927 }
928 r[0]=rsa->n;
929 r[1]=rsa->e;
930 s->s3->tmp.use_rsa_tmp=1;
931 }
932 else
933#endif
934#ifndef NO_DH
935 if (type & SSL_kEDH)
936 {
937 dhp=cert->dh_tmp;
938 if ((dhp == NULL) && (cert->dh_tmp_cb != NULL))
939 dhp=cert->dh_tmp_cb(s,
Ben Laurie60e31c31999-02-21 21:58:59 +0000940 !SSL_C_IS_EXPORT(s->s3->tmp.new_cipher),
941 SSL_C_EXPORT_PKEYLENGTH(s->s3->tmp.new_cipher));
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +0000942 if (dhp == NULL)
943 {
Ralf S. Engelschall58964a41998-12-21 10:56:39 +0000944 al=SSL_AD_HANDSHAKE_FAILURE;
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +0000945 SSLerr(SSL_F_SSL3_SEND_SERVER_KEY_EXCHANGE,SSL_R_MISSING_TMP_DH_KEY);
946 goto f_err;
947 }
948 if ((dh=DHparams_dup(dhp)) == NULL)
949 {
950 SSLerr(SSL_F_SSL3_SEND_SERVER_KEY_EXCHANGE,ERR_R_DH_LIB);
951 goto err;
952 }
953
954 s->s3->tmp.dh=dh;
Ben Laurie6fa89f91999-01-07 00:37:01 +0000955 if ((dhp->pub_key == NULL ||
956 dhp->priv_key == NULL ||
957 (s->options & SSL_OP_SINGLE_DH_USE)))
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +0000958 {
Ben Laurie6fa89f91999-01-07 00:37:01 +0000959 if(!DH_generate_key(dh))
960 {
961 SSLerr(SSL_F_SSL3_SEND_SERVER_KEY_EXCHANGE,
962 ERR_R_DH_LIB);
963 goto err;
964 }
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +0000965 }
966 else
967 {
968 dh->pub_key=BN_dup(dhp->pub_key);
969 dh->priv_key=BN_dup(dhp->priv_key);
970 if ((dh->pub_key == NULL) ||
971 (dh->priv_key == NULL))
972 {
973 SSLerr(SSL_F_SSL3_SEND_SERVER_KEY_EXCHANGE,ERR_R_DH_LIB);
974 goto err;
975 }
976 }
977 r[0]=dh->p;
978 r[1]=dh->g;
979 r[2]=dh->pub_key;
980 }
981 else
982#endif
983 {
Ralf S. Engelschall58964a41998-12-21 10:56:39 +0000984 al=SSL_AD_HANDSHAKE_FAILURE;
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +0000985 SSLerr(SSL_F_SSL3_SEND_SERVER_KEY_EXCHANGE,SSL_R_UNKNOWN_KEY_EXCHANGE_TYPE);
986 goto f_err;
987 }
988 for (i=0; r[i] != NULL; i++)
989 {
990 nr[i]=BN_num_bytes(r[i]);
991 n+=2+nr[i];
992 }
993
994 if (!(s->s3->tmp.new_cipher->algorithms & SSL_aNULL))
995 {
996 if ((pkey=ssl_get_sign_pkey(s,s->s3->tmp.new_cipher))
997 == NULL)
998 {
Ralf S. Engelschall58964a41998-12-21 10:56:39 +0000999 al=SSL_AD_DECODE_ERROR;
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00001000 goto f_err;
1001 }
1002 kn=EVP_PKEY_size(pkey);
1003 }
1004 else
1005 {
1006 pkey=NULL;
1007 kn=0;
1008 }
1009
1010 if (!BUF_MEM_grow(buf,n+4+kn))
1011 {
1012 SSLerr(SSL_F_SSL3_SEND_SERVER_KEY_EXCHANGE,ERR_LIB_BUF);
1013 goto err;
1014 }
1015 d=(unsigned char *)s->init_buf->data;
1016 p= &(d[4]);
1017
1018 for (i=0; r[i] != NULL; i++)
1019 {
1020 s2n(nr[i],p);
1021 BN_bn2bin(r[i],p);
1022 p+=nr[i];
1023 }
1024
1025 /* not anonymous */
1026 if (pkey != NULL)
1027 {
1028 /* n is the length of the params, they start at &(d[4])
1029 * and p points to the space at the end. */
1030#ifndef NO_RSA
1031 if (pkey->type == EVP_PKEY_RSA)
1032 {
1033 q=md_buf;
1034 j=0;
1035 for (num=2; num > 0; num--)
1036 {
Ralf S. Engelschall58964a41998-12-21 10:56:39 +00001037 EVP_DigestInit(&md_ctx,(num == 2)
1038 ?s->ctx->md5:s->ctx->sha1);
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00001039 EVP_DigestUpdate(&md_ctx,&(s->s3->client_random[0]),SSL3_RANDOM_SIZE);
1040 EVP_DigestUpdate(&md_ctx,&(s->s3->server_random[0]),SSL3_RANDOM_SIZE);
1041 EVP_DigestUpdate(&md_ctx,&(d[4]),n);
1042 EVP_DigestFinal(&md_ctx,q,
1043 (unsigned int *)&i);
1044 q+=i;
1045 j+=i;
1046 }
1047 i=RSA_private_encrypt(j,md_buf,&(p[2]),
1048 pkey->pkey.rsa,RSA_PKCS1_PADDING);
1049 if (i <= 0)
1050 {
1051 SSLerr(SSL_F_SSL3_SEND_SERVER_KEY_EXCHANGE,ERR_LIB_RSA);
1052 goto err;
1053 }
1054 s2n(i,p);
1055 n+=i+2;
1056 }
1057 else
1058#endif
1059#if !defined(NO_DSA)
1060 if (pkey->type == EVP_PKEY_DSA)
1061 {
1062 /* lets do DSS */
1063 EVP_SignInit(&md_ctx,EVP_dss1());
1064 EVP_SignUpdate(&md_ctx,&(s->s3->client_random[0]),SSL3_RANDOM_SIZE);
1065 EVP_SignUpdate(&md_ctx,&(s->s3->server_random[0]),SSL3_RANDOM_SIZE);
1066 EVP_SignUpdate(&md_ctx,&(d[4]),n);
1067 if (!EVP_SignFinal(&md_ctx,&(p[2]),
1068 (unsigned int *)&i,pkey))
1069 {
1070 SSLerr(SSL_F_SSL3_SEND_SERVER_KEY_EXCHANGE,ERR_LIB_DSA);
1071 goto err;
1072 }
1073 s2n(i,p);
1074 n+=i+2;
1075 }
1076 else
1077#endif
1078 {
1079 /* Is this error check actually needed? */
Ralf S. Engelschall58964a41998-12-21 10:56:39 +00001080 al=SSL_AD_HANDSHAKE_FAILURE;
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00001081 SSLerr(SSL_F_SSL3_SEND_SERVER_KEY_EXCHANGE,SSL_R_UNKNOWN_PKEY_TYPE);
1082 goto f_err;
1083 }
1084 }
1085
1086 *(d++)=SSL3_MT_SERVER_KEY_EXCHANGE;
1087 l2n3(n,d);
1088
1089 /* we should now have things packed up, so lets send
1090 * it off */
1091 s->init_num=n+4;
1092 s->init_off=0;
1093 }
1094
1095 /* SSL3_ST_SW_KEY_EXCH_B */
1096 return(ssl3_do_write(s,SSL3_RT_HANDSHAKE));
1097f_err:
1098 ssl3_send_alert(s,SSL3_AL_FATAL,al);
1099err:
1100 return(-1);
1101 }
1102
Ulf Möller6b691a51999-04-19 21:31:43 +00001103static int ssl3_send_certificate_request(SSL *s)
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00001104 {
1105 unsigned char *p,*d;
1106 int i,j,nl,off,n;
Ben Laurief73e07c1999-04-12 17:23:57 +00001107 STACK_OF(X509_NAME) *sk=NULL;
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00001108 X509_NAME *name;
1109 BUF_MEM *buf;
1110
1111 if (s->state == SSL3_ST_SW_CERT_REQ_A)
1112 {
1113 buf=s->init_buf;
1114
1115 d=p=(unsigned char *)&(buf->data[4]);
1116
1117 /* get the list of acceptable cert types */
1118 p++;
1119 n=ssl3_get_req_cert_type(s,p);
1120 d[0]=n;
1121 p+=n;
1122 n++;
1123
1124 off=n;
1125 p+=2;
1126 n+=2;
1127
1128 sk=SSL_get_client_CA_list(s);
1129 nl=0;
1130 if (sk != NULL)
1131 {
Ben Laurief73e07c1999-04-12 17:23:57 +00001132 for (i=0; i<sk_X509_NAME_num(sk); i++)
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00001133 {
Ben Laurief73e07c1999-04-12 17:23:57 +00001134 name=sk_X509_NAME_value(sk,i);
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00001135 j=i2d_X509_NAME(name,NULL);
1136 if (!BUF_MEM_grow(buf,4+n+j+2))
1137 {
1138 SSLerr(SSL_F_SSL3_SEND_CERTIFICATE_REQUEST,ERR_R_BUF_LIB);
1139 goto err;
1140 }
1141 p=(unsigned char *)&(buf->data[4+n]);
Ralf S. Engelschall58964a41998-12-21 10:56:39 +00001142 if (!(s->options & SSL_OP_NETSCAPE_CA_DN_BUG))
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00001143 {
1144 s2n(j,p);
1145 i2d_X509_NAME(name,&p);
1146 n+=2+j;
1147 nl+=2+j;
1148 }
1149 else
1150 {
1151 d=p;
1152 i2d_X509_NAME(name,&p);
1153 j-=2; s2n(j,d); j+=2;
1154 n+=j;
1155 nl+=j;
1156 }
1157 }
1158 }
1159 /* else no CA names */
1160 p=(unsigned char *)&(buf->data[4+off]);
1161 s2n(nl,p);
1162
1163 d=(unsigned char *)buf->data;
1164 *(d++)=SSL3_MT_CERTIFICATE_REQUEST;
1165 l2n3(n,d);
1166
1167 /* we should now have things packed up, so lets send
1168 * it off */
1169
1170 s->init_num=n+4;
1171 s->init_off=0;
1172 }
1173
1174 /* SSL3_ST_SW_CERT_REQ_B */
1175 return(ssl3_do_write(s,SSL3_RT_HANDSHAKE));
1176err:
1177 return(-1);
1178 }
1179
Ulf Möller6b691a51999-04-19 21:31:43 +00001180static int ssl3_get_client_key_exchange(SSL *s)
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00001181 {
1182 int i,al,ok;
1183 long n;
1184 unsigned long l;
1185 unsigned char *p;
Ulf Möller79df9d61999-04-27 03:19:12 +00001186#ifndef NO_RSA
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00001187 RSA *rsa=NULL;
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00001188 EVP_PKEY *pkey=NULL;
Ulf Möller79df9d61999-04-27 03:19:12 +00001189#endif
Ralf S. Engelschall58964a41998-12-21 10:56:39 +00001190#ifndef NO_DH
1191 BIGNUM *pub=NULL;
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00001192 DH *dh_srvr;
Ralf S. Engelschall58964a41998-12-21 10:56:39 +00001193#endif
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00001194
1195 n=ssl3_get_message(s,
1196 SSL3_ST_SR_KEY_EXCH_A,
1197 SSL3_ST_SR_KEY_EXCH_B,
1198 SSL3_MT_CLIENT_KEY_EXCHANGE,
1199 400, /* ???? */
1200 &ok);
1201
1202 if (!ok) return((int)n);
1203 p=(unsigned char *)s->init_buf->data;
1204
1205 l=s->s3->tmp.new_cipher->algorithms;
1206
1207#ifndef NO_RSA
1208 if (l & SSL_kRSA)
1209 {
1210 /* FIX THIS UP EAY EAY EAY EAY */
1211 if (s->s3->tmp.use_rsa_tmp)
1212 {
1213 if ((s->session->cert != NULL) &&
1214 (s->session->cert->rsa_tmp != NULL))
1215 rsa=s->session->cert->rsa_tmp;
1216 else if ((s->ctx->default_cert != NULL) &&
1217 (s->ctx->default_cert->rsa_tmp != NULL))
1218 rsa=s->ctx->default_cert->rsa_tmp;
1219 /* Don't do a callback because rsa_tmp should
1220 * be sent already */
1221 if (rsa == NULL)
1222 {
Ralf S. Engelschall58964a41998-12-21 10:56:39 +00001223 al=SSL_AD_HANDSHAKE_FAILURE;
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00001224 SSLerr(SSL_F_SSL3_GET_CLIENT_KEY_EXCHANGE,SSL_R_MISSING_TMP_RSA_PKEY);
1225 goto f_err;
1226
1227 }
1228 }
1229 else
1230 {
1231 pkey=s->cert->pkeys[SSL_PKEY_RSA_ENC].privatekey;
1232 if ( (pkey == NULL) ||
1233 (pkey->type != EVP_PKEY_RSA) ||
1234 (pkey->pkey.rsa == NULL))
1235 {
Ralf S. Engelschall58964a41998-12-21 10:56:39 +00001236 al=SSL_AD_HANDSHAKE_FAILURE;
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00001237 SSLerr(SSL_F_SSL3_GET_CLIENT_KEY_EXCHANGE,SSL_R_MISSING_RSA_CERTIFICATE);
1238 goto f_err;
1239 }
1240 rsa=pkey->pkey.rsa;
1241 }
1242
Ralf S. Engelschall58964a41998-12-21 10:56:39 +00001243 /* TLS */
1244 if (s->version > SSL3_VERSION)
1245 {
1246 n2s(p,i);
1247 if (n != i+2)
1248 {
1249 if (!(s->options & SSL_OP_TLS_D5_BUG))
1250 {
1251 SSLerr(SSL_F_SSL3_GET_CLIENT_KEY_EXCHANGE,SSL_R_TLS_RSA_ENCRYPTED_VALUE_LENGTH_IS_WRONG);
1252 goto err;
1253 }
1254 else
1255 p-=2;
1256 }
1257 else
1258 n=i;
1259 }
1260
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00001261 i=RSA_private_decrypt((int)n,p,p,rsa,RSA_PKCS1_PADDING);
Ralf S. Engelschall58964a41998-12-21 10:56:39 +00001262
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00001263#if 1
Ralf S. Engelschalldfeab061998-12-21 11:00:56 +00001264 /* If a bad decrypt, use a random master key */
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00001265 if ((i != SSL_MAX_MASTER_KEY_LENGTH) ||
Mark J. Cox413c4f41999-02-16 09:22:21 +00001266 ((p[0] != (s->client_version>>8)) ||
1267 (p[1] != (s->client_version & 0xff))))
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00001268 {
Mark J. Cox413c4f41999-02-16 09:22:21 +00001269 int bad=1;
1270
1271 if ((i == SSL_MAX_MASTER_KEY_LENGTH) &&
1272 (p[0] == (s->version>>8)) &&
1273 (p[1] == 0))
1274 {
1275 if (s->options & SSL_OP_TLS_ROLLBACK_BUG)
1276 bad=0;
1277 }
1278 if (bad)
1279 {
1280 p[0]=(s->version>>8);
1281 p[1]=(s->version & 0xff);
1282 RAND_bytes(&(p[2]),SSL_MAX_MASTER_KEY_LENGTH-2);
1283 i=SSL_MAX_MASTER_KEY_LENGTH;
1284 }
1285 /* else, an SSLeay bug, ssl only server, tls client */
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00001286 }
1287#else
1288 if (i != SSL_MAX_MASTER_KEY_LENGTH)
1289 {
1290 al=SSL_AD_DECODE_ERROR;
1291 SSLerr(SSL_F_SSL3_GET_CLIENT_KEY_EXCHANGE,SSL_R_BAD_RSA_DECRYPT);
1292 goto f_err;
1293 }
1294
1295 if ((p[0] != (s->version>>8)) || (p[1] != (s->version & 0xff)))
1296 {
1297 al=SSL_AD_DECODE_ERROR;
1298 SSLerr(SSL_F_SSL3_GET_CLIENT_KEY_EXCHANGE,SSL_R_BAD_PROTOCOL_VERSION_NUMBER);
1299 goto f_err;
1300 }
1301#endif
1302
1303 s->session->master_key_length=
Ralf S. Engelschall58964a41998-12-21 10:56:39 +00001304 s->method->ssl3_enc->generate_master_secret(s,
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00001305 s->session->master_key,
1306 p,i);
1307 memset(p,0,i);
1308 }
1309 else
1310#endif
1311#ifndef NO_DH
1312 if (l & (SSL_kEDH|SSL_kDHr|SSL_kDHd))
1313 {
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00001314 n2s(p,i);
1315 if (n != i+2)
1316 {
Ralf S. Engelschall58964a41998-12-21 10:56:39 +00001317 if (!(s->options & SSL_OP_SSLEAY_080_CLIENT_DH_BUG))
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00001318 {
1319 SSLerr(SSL_F_SSL3_GET_CLIENT_KEY_EXCHANGE,SSL_R_DH_PUBLIC_VALUE_LENGTH_IS_WRONG);
1320 goto err;
1321 }
1322 else
1323 {
1324 p-=2;
1325 i=(int)n;
1326 }
1327 }
1328
1329 if (n == 0L) /* the parameters are in the cert */
1330 {
Ralf S. Engelschall58964a41998-12-21 10:56:39 +00001331 al=SSL_AD_HANDSHAKE_FAILURE;
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00001332 SSLerr(SSL_F_SSL3_GET_CLIENT_KEY_EXCHANGE,SSL_R_UNABLE_TO_DECODE_DH_CERTS);
1333 goto f_err;
1334 }
1335 else
1336 {
1337 if (s->s3->tmp.dh == NULL)
1338 {
Ralf S. Engelschall58964a41998-12-21 10:56:39 +00001339 al=SSL_AD_HANDSHAKE_FAILURE;
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00001340 SSLerr(SSL_F_SSL3_GET_CLIENT_KEY_EXCHANGE,SSL_R_MISSING_TMP_DH_KEY);
1341 goto f_err;
1342 }
1343 else
1344 dh_srvr=s->s3->tmp.dh;
1345 }
1346
1347 pub=BN_bin2bn(p,i,NULL);
1348 if (pub == NULL)
1349 {
1350 SSLerr(SSL_F_SSL3_GET_CLIENT_KEY_EXCHANGE,SSL_R_BN_LIB);
1351 goto err;
1352 }
Ralf S. Engelschall58964a41998-12-21 10:56:39 +00001353
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00001354 i=DH_compute_key(p,pub,dh_srvr);
1355
1356 if (i <= 0)
1357 {
1358 SSLerr(SSL_F_SSL3_GET_CLIENT_KEY_EXCHANGE,ERR_R_DH_LIB);
1359 goto err;
1360 }
1361
1362 DH_free(s->s3->tmp.dh);
1363 s->s3->tmp.dh=NULL;
1364
1365 BN_clear_free(pub);
1366 pub=NULL;
1367 s->session->master_key_length=
Ralf S. Engelschall58964a41998-12-21 10:56:39 +00001368 s->method->ssl3_enc->generate_master_secret(s,
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00001369 s->session->master_key,p,i);
1370 }
1371 else
1372#endif
1373 {
Ralf S. Engelschall58964a41998-12-21 10:56:39 +00001374 al=SSL_AD_HANDSHAKE_FAILURE;
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00001375 SSLerr(SSL_F_SSL3_GET_CLIENT_KEY_EXCHANGE,SSL_R_UNKNOWN_CIPHER_TYPE);
1376 goto f_err;
1377 }
1378
1379 return(1);
1380f_err:
1381 ssl3_send_alert(s,SSL3_AL_FATAL,al);
Ralf S. Engelschall58964a41998-12-21 10:56:39 +00001382#if !defined(NO_DH) || !defined(NO_RSA)
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00001383err:
Ralf S. Engelschall58964a41998-12-21 10:56:39 +00001384#endif
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00001385 return(-1);
1386 }
1387
Ulf Möller6b691a51999-04-19 21:31:43 +00001388static int ssl3_get_cert_verify(SSL *s)
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00001389 {
1390 EVP_PKEY *pkey=NULL;
1391 unsigned char *p;
1392 int al,ok,ret=0;
1393 long n;
1394 int type=0,i,j;
1395 X509 *peer;
1396
1397 n=ssl3_get_message(s,
1398 SSL3_ST_SR_CERT_VRFY_A,
1399 SSL3_ST_SR_CERT_VRFY_B,
1400 -1,
1401 512, /* 512? */
1402 &ok);
1403
1404 if (!ok) return((int)n);
1405
1406 if (s->session->peer != NULL)
1407 {
1408 peer=s->session->peer;
1409 pkey=X509_get_pubkey(peer);
1410 type=X509_certificate_type(peer,pkey);
1411 }
1412 else
1413 {
1414 peer=NULL;
1415 pkey=NULL;
1416 }
1417
1418 if (s->s3->tmp.message_type != SSL3_MT_CERTIFICATE_VERIFY)
1419 {
1420 s->s3->tmp.reuse_message=1;
1421 if ((peer != NULL) && (type | EVP_PKT_SIGN))
1422 {
Ralf S. Engelschall58964a41998-12-21 10:56:39 +00001423 al=SSL_AD_UNEXPECTED_MESSAGE;
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00001424 SSLerr(SSL_F_SSL3_GET_CERT_VERIFY,SSL_R_MISSING_VERIFY_MESSAGE);
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00001425 goto f_err;
1426 }
1427 ret=1;
1428 goto end;
1429 }
1430
1431 if (peer == NULL)
1432 {
1433 SSLerr(SSL_F_SSL3_GET_CERT_VERIFY,SSL_R_NO_CLIENT_CERT_RECEIVED);
Ralf S. Engelschall58964a41998-12-21 10:56:39 +00001434 al=SSL_AD_UNEXPECTED_MESSAGE;
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00001435 goto f_err;
1436 }
1437
1438 if (!(type & EVP_PKT_SIGN))
1439 {
1440 SSLerr(SSL_F_SSL3_GET_CERT_VERIFY,SSL_R_SIGNATURE_FOR_NON_SIGNING_CERTIFICATE);
Ralf S. Engelschall58964a41998-12-21 10:56:39 +00001441 al=SSL_AD_ILLEGAL_PARAMETER;
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00001442 goto f_err;
1443 }
1444
1445 if (s->s3->change_cipher_spec)
1446 {
1447 SSLerr(SSL_F_SSL3_GET_CERT_VERIFY,SSL_R_CCS_RECEIVED_EARLY);
Ralf S. Engelschall58964a41998-12-21 10:56:39 +00001448 al=SSL_AD_UNEXPECTED_MESSAGE;
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00001449 goto f_err;
1450 }
1451
1452 /* we now have a signature that we need to verify */
1453 p=(unsigned char *)s->init_buf->data;
1454 n2s(p,i);
1455 n-=2;
1456 if (i > n)
1457 {
1458 SSLerr(SSL_F_SSL3_GET_CERT_VERIFY,SSL_R_LENGTH_MISMATCH);
Ralf S. Engelschall58964a41998-12-21 10:56:39 +00001459 al=SSL_AD_DECODE_ERROR;
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00001460 goto f_err;
1461 }
1462
1463 j=EVP_PKEY_size(pkey);
1464 if ((i > j) || (n > j) || (n <= 0))
1465 {
1466 SSLerr(SSL_F_SSL3_GET_CERT_VERIFY,SSL_R_WRONG_SIGNATURE_SIZE);
Ralf S. Engelschall58964a41998-12-21 10:56:39 +00001467 al=SSL_AD_DECODE_ERROR;
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00001468 goto f_err;
1469 }
1470
1471#ifndef NO_RSA
1472 if (pkey->type == EVP_PKEY_RSA)
1473 {
1474 i=RSA_public_decrypt(i,p,p,pkey->pkey.rsa,RSA_PKCS1_PADDING);
1475 if (i < 0)
1476 {
Ralf S. Engelschall58964a41998-12-21 10:56:39 +00001477 al=SSL_AD_DECRYPT_ERROR;
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00001478 SSLerr(SSL_F_SSL3_GET_CERT_VERIFY,SSL_R_BAD_RSA_DECRYPT);
1479 goto f_err;
1480 }
1481 if ((i != (MD5_DIGEST_LENGTH+SHA_DIGEST_LENGTH)) ||
Ralf S. Engelschall58964a41998-12-21 10:56:39 +00001482 memcmp(&(s->s3->tmp.finish_md[0]),p,
1483 MD5_DIGEST_LENGTH+SHA_DIGEST_LENGTH))
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00001484 {
Ralf S. Engelschall58964a41998-12-21 10:56:39 +00001485 al=SSL_AD_DECRYPT_ERROR;
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00001486 SSLerr(SSL_F_SSL3_GET_CERT_VERIFY,SSL_R_BAD_RSA_SIGNATURE);
1487 goto f_err;
1488 }
1489 }
1490 else
1491#endif
1492#ifndef NO_DSA
1493 if (pkey->type == EVP_PKEY_DSA)
1494 {
Ralf S. Engelschall58964a41998-12-21 10:56:39 +00001495 j=DSA_verify(pkey->save_type,
1496 &(s->s3->tmp.finish_md[MD5_DIGEST_LENGTH]),
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00001497 SHA_DIGEST_LENGTH,p,i,pkey->pkey.dsa);
1498 if (j <= 0)
1499 {
1500 /* bad signature */
Ralf S. Engelschall58964a41998-12-21 10:56:39 +00001501 al=SSL_AD_DECRYPT_ERROR;
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00001502 SSLerr(SSL_F_SSL3_GET_CERT_VERIFY,SSL_R_BAD_DSA_SIGNATURE);
1503 goto f_err;
1504 }
1505 }
1506 else
1507#endif
1508 {
1509 SSLerr(SSL_F_SSL3_GET_CERT_VERIFY,SSL_R_INTERNAL_ERROR);
Ralf S. Engelschall58964a41998-12-21 10:56:39 +00001510 al=SSL_AD_UNSUPPORTED_CERTIFICATE;
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00001511 goto f_err;
1512 }
1513
1514
1515 ret=1;
1516 if (0)
1517 {
1518f_err:
1519 ssl3_send_alert(s,SSL3_AL_FATAL,al);
1520 }
1521end:
Dr. Stephen Hensona8236c81999-02-15 21:05:21 +00001522 EVP_PKEY_free(pkey);
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00001523 return(ret);
1524 }
1525
Ulf Möller6b691a51999-04-19 21:31:43 +00001526static int ssl3_get_client_certificate(SSL *s)
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00001527 {
1528 int i,ok,al,ret= -1;
1529 X509 *x=NULL;
1530 unsigned long l,nc,llen,n;
1531 unsigned char *p,*d,*q;
Ben Laurief73e07c1999-04-12 17:23:57 +00001532 STACK_OF(X509) *sk=NULL;
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00001533
1534 n=ssl3_get_message(s,
1535 SSL3_ST_SR_CERT_A,
1536 SSL3_ST_SR_CERT_B,
1537 -1,
1538#if defined(MSDOS) && !defined(WIN32)
1539 1024*30, /* 30k max cert list :-) */
1540#else
1541 1024*100, /* 100k max cert list :-) */
1542#endif
1543 &ok);
1544
1545 if (!ok) return((int)n);
1546
1547 if (s->s3->tmp.message_type == SSL3_MT_CLIENT_KEY_EXCHANGE)
1548 {
1549 if ( (s->verify_mode & SSL_VERIFY_PEER) &&
1550 (s->verify_mode & SSL_VERIFY_FAIL_IF_NO_PEER_CERT))
1551 {
1552 SSLerr(SSL_F_SSL3_GET_CLIENT_CERTIFICATE,SSL_R_PEER_DID_NOT_RETURN_A_CERTIFICATE);
Ralf S. Engelschall58964a41998-12-21 10:56:39 +00001553 al=SSL_AD_HANDSHAKE_FAILURE;
1554 goto f_err;
1555 }
1556 /* If tls asked for a client cert we must return a 0 list */
1557 if ((s->version > SSL3_VERSION) && s->s3->tmp.cert_request)
1558 {
1559 SSLerr(SSL_F_SSL3_GET_CLIENT_CERTIFICATE,SSL_R_TLS_PEER_DID_NOT_RESPOND_WITH_CERTIFICATE_LIST);
1560 al=SSL_AD_UNEXPECTED_MESSAGE;
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00001561 goto f_err;
1562 }
1563 s->s3->tmp.reuse_message=1;
1564 return(1);
1565 }
1566
1567 if (s->s3->tmp.message_type != SSL3_MT_CERTIFICATE)
1568 {
Ralf S. Engelschall58964a41998-12-21 10:56:39 +00001569 al=SSL_AD_UNEXPECTED_MESSAGE;
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00001570 SSLerr(SSL_F_SSL3_GET_CLIENT_CERTIFICATE,SSL_R_WRONG_MESSAGE_TYPE);
1571 goto f_err;
1572 }
1573 d=p=(unsigned char *)s->init_buf->data;
1574
Ben Laurief73e07c1999-04-12 17:23:57 +00001575 if ((sk=sk_X509_new_null()) == NULL)
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00001576 {
1577 SSLerr(SSL_F_SSL3_GET_CLIENT_CERTIFICATE,ERR_R_MALLOC_FAILURE);
1578 goto err;
1579 }
1580
1581 n2l3(p,llen);
1582 if (llen+3 != n)
1583 {
Ralf S. Engelschall58964a41998-12-21 10:56:39 +00001584 al=SSL_AD_DECODE_ERROR;
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00001585 SSLerr(SSL_F_SSL3_GET_CLIENT_CERTIFICATE,SSL_R_LENGTH_MISMATCH);
1586 goto f_err;
1587 }
1588 for (nc=0; nc<llen; )
1589 {
1590 n2l3(p,l);
1591 if ((l+nc+3) > llen)
1592 {
Ralf S. Engelschall58964a41998-12-21 10:56:39 +00001593 al=SSL_AD_DECODE_ERROR;
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00001594 SSLerr(SSL_F_SSL3_GET_CLIENT_CERTIFICATE,SSL_R_CERT_LENGTH_MISMATCH);
1595 goto f_err;
1596 }
1597
1598 q=p;
1599 x=d2i_X509(NULL,&p,l);
1600 if (x == NULL)
1601 {
1602 SSLerr(SSL_F_SSL3_GET_CLIENT_CERTIFICATE,ERR_R_ASN1_LIB);
1603 goto err;
1604 }
1605 if (p != (q+l))
1606 {
Ralf S. Engelschall58964a41998-12-21 10:56:39 +00001607 al=SSL_AD_DECODE_ERROR;
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00001608 SSLerr(SSL_F_SSL3_GET_CLIENT_CERTIFICATE,SSL_R_CERT_LENGTH_MISMATCH);
1609 goto f_err;
1610 }
Ben Laurief73e07c1999-04-12 17:23:57 +00001611 if (!sk_X509_push(sk,x))
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00001612 {
1613 SSLerr(SSL_F_SSL3_GET_CLIENT_CERTIFICATE,ERR_R_MALLOC_FAILURE);
1614 goto err;
1615 }
1616 x=NULL;
1617 nc+=l+3;
1618 }
1619
Ben Laurief73e07c1999-04-12 17:23:57 +00001620 if (sk_X509_num(sk) <= 0)
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00001621 {
Ralf S. Engelschall58964a41998-12-21 10:56:39 +00001622 /* TLS does not mind 0 certs returned */
1623 if (s->version == SSL3_VERSION)
1624 {
1625 al=SSL_AD_HANDSHAKE_FAILURE;
1626 SSLerr(SSL_F_SSL3_GET_CLIENT_CERTIFICATE,SSL_R_NO_CERTIFICATES_RETURNED);
1627 goto f_err;
1628 }
1629 /* Fail for TLS only if we required a certificate */
1630 else if ((s->verify_mode & SSL_VERIFY_PEER) &&
1631 (s->verify_mode & SSL_VERIFY_FAIL_IF_NO_PEER_CERT))
1632 {
1633 SSLerr(SSL_F_SSL3_GET_CLIENT_CERTIFICATE,SSL_R_PEER_DID_NOT_RETURN_A_CERTIFICATE);
1634 al=SSL_AD_HANDSHAKE_FAILURE;
1635 goto f_err;
1636 }
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00001637 }
Ralf S. Engelschall58964a41998-12-21 10:56:39 +00001638 else
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00001639 {
Ralf S. Engelschall58964a41998-12-21 10:56:39 +00001640 i=ssl_verify_cert_chain(s,sk);
1641 if (!i)
1642 {
1643 al=ssl_verify_alarm_type(s->verify_result);
1644 SSLerr(SSL_F_SSL3_GET_CLIENT_CERTIFICATE,SSL_R_NO_CERTIFICATE_RETURNED);
1645 goto f_err;
1646 }
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00001647 }
1648
1649 /* This should not be needed */
1650 if (s->session->peer != NULL)
1651 X509_free(s->session->peer);
Ben Laurief73e07c1999-04-12 17:23:57 +00001652 s->session->peer=sk_X509_shift(sk);
Ben Laurieb4cadc61999-03-22 12:22:14 +00001653 s->session->cert->cert_chain=sk;
1654 sk=NULL;
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00001655
1656 ret=1;
1657 if (0)
1658 {
1659f_err:
1660 ssl3_send_alert(s,SSL3_AL_FATAL,al);
1661 }
1662err:
1663 if (x != NULL) X509_free(x);
Ben Laurief73e07c1999-04-12 17:23:57 +00001664 if (sk != NULL) sk_X509_pop_free(sk,X509_free);
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00001665 return(ret);
1666 }
1667
Ulf Möller6b691a51999-04-19 21:31:43 +00001668int ssl3_send_server_certificate(SSL *s)
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00001669 {
1670 unsigned long l;
1671 X509 *x;
1672
1673 if (s->state == SSL3_ST_SW_CERT_A)
1674 {
1675 x=ssl_get_server_send_cert(s);
1676 if (x == NULL)
1677 {
1678 SSLerr(SSL_F_SSL3_SEND_SERVER_CERTIFICATE,SSL_R_INTERNAL_ERROR);
1679 return(0);
1680 }
1681
1682 l=ssl3_output_cert_chain(s,x);
1683 s->state=SSL3_ST_SW_CERT_B;
1684 s->init_num=(int)l;
1685 s->init_off=0;
1686 }
1687
1688 /* SSL3_ST_SW_CERT_B */
1689 return(ssl3_do_write(s,SSL3_RT_HANDSHAKE));
1690 }