ssl_lib.c revision 1.2
1/*! \file ssl/ssl_lib.c 2 * \brief Version independent SSL functions. 3 */ 4/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) 5 * All rights reserved. 6 * 7 * This package is an SSL implementation written 8 * by Eric Young (eay@cryptsoft.com). 9 * The implementation was written so as to conform with Netscapes SSL. 10 * 11 * This library is free for commercial and non-commercial use as long as 12 * the following conditions are aheared to. The following conditions 13 * apply to all code found in this distribution, be it the RC4, RSA, 14 * lhash, DES, etc., code; not just the SSL code. The SSL documentation 15 * included with this distribution is covered by the same copyright terms 16 * except that the holder is Tim Hudson (tjh@cryptsoft.com). 17 * 18 * Copyright remains Eric Young's, and as such any Copyright notices in 19 * the code are not to be removed. 20 * If this package is used in a product, Eric Young should be given attribution 21 * as the author of the parts of the library used. 22 * This can be in the form of a textual message at program startup or 23 * in documentation (online or textual) provided with the package. 24 * 25 * Redistribution and use in source and binary forms, with or without 26 * modification, are permitted provided that the following conditions 27 * are met: 28 * 1. Redistributions of source code must retain the copyright 29 * notice, this list of conditions and the following disclaimer. 30 * 2. Redistributions in binary form must reproduce the above copyright 31 * notice, this list of conditions and the following disclaimer in the 32 * documentation and/or other materials provided with the distribution. 33 * 3. All advertising materials mentioning features or use of this software 34 * must display the following acknowledgement: 35 * "This product includes cryptographic software written by 36 * Eric Young (eay@cryptsoft.com)" 37 * The word 'cryptographic' can be left out if the rouines from the library 38 * being used are not cryptographic related :-). 39 * 4. If you include any Windows specific code (or a derivative thereof) from 40 * the apps directory (application code) you must include an acknowledgement: 41 * "This product includes software written by Tim Hudson (tjh@cryptsoft.com)" 42 * 43 * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND 44 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 45 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 46 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 47 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 48 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 49 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 50 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 51 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 52 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 53 * SUCH DAMAGE. 54 * 55 * The licence and distribution terms for any publically available version or 56 * derivative of this code cannot be changed. i.e. this code cannot simply be 57 * copied and put under another distribution licence 58 * [including the GNU Public Licence.] 59 */ 60 61#include <stdio.h> 62#include <openssl/objects.h> 63#include <openssl/lhash.h> 64#include "ssl_locl.h" 65 66char *SSL_version_str=OPENSSL_VERSION_TEXT; 67 68static STACK *ssl_meth=NULL; 69static STACK *ssl_ctx_meth=NULL; 70static int ssl_meth_num=0; 71static int ssl_ctx_meth_num=0; 72 73OPENSSL_GLOBAL SSL3_ENC_METHOD ssl3_undef_enc_method={ 74 ssl_undefined_function, 75 ssl_undefined_function, 76 ssl_undefined_function, 77 ssl_undefined_function, 78 ssl_undefined_function, 79 ssl_undefined_function, 80 }; 81 82int SSL_clear(SSL *s) 83 { 84 int state; 85 86 if (s->method == NULL) 87 { 88 SSLerr(SSL_F_SSL_CLEAR,SSL_R_NO_METHOD_SPECIFIED); 89 return(0); 90 } 91 92 s->error=0; 93 s->hit=0; 94 s->shutdown=0; 95 96#if 0 97 /* This is set if we are doing dynamic renegotiation so keep 98 * the old cipher. It is sort of a SSL_clear_lite :-) */ 99 if (s->new_session) return(1); 100#endif 101 102 state=s->state; /* Keep to check if we throw away the session-id */ 103 s->type=0; 104 105 s->state=SSL_ST_BEFORE|((s->server)?SSL_ST_ACCEPT:SSL_ST_CONNECT); 106 107 s->version=s->method->version; 108 s->client_version=s->version; 109 s->rwstate=SSL_NOTHING; 110 s->rstate=SSL_ST_READ_HEADER; 111 s->read_ahead=s->ctx->read_ahead; 112 113 if (s->init_buf != NULL) 114 { 115 BUF_MEM_free(s->init_buf); 116 s->init_buf=NULL; 117 } 118 119 ssl_clear_cipher_ctx(s); 120 121 if (ssl_clear_bad_session(s)) 122 { 123 SSL_SESSION_free(s->session); 124 s->session=NULL; 125 } 126 127 s->first_packet=0; 128 129#if 1 130 /* Check to see if we were changed into a different method, if 131 * so, revert back if we are not doing session-id reuse. */ 132 if ((s->session == NULL) && (s->method != s->ctx->method)) 133 { 134 s->method->ssl_free(s); 135 s->method=s->ctx->method; 136 if (!s->method->ssl_new(s)) 137 return(0); 138 } 139 else 140#endif 141 s->method->ssl_clear(s); 142 return(1); 143 } 144 145/** Used to change an SSL_CTXs default SSL method type */ 146int SSL_CTX_set_ssl_version(SSL_CTX *ctx,SSL_METHOD *meth) 147 { 148 STACK_OF(SSL_CIPHER) *sk; 149 150 ctx->method=meth; 151 152 sk=ssl_create_cipher_list(ctx->method,&(ctx->cipher_list), 153 &(ctx->cipher_list_by_id),SSL_DEFAULT_CIPHER_LIST); 154 if ((sk == NULL) || (sk_SSL_CIPHER_num(sk) <= 0)) 155 { 156 SSLerr(SSL_F_SSL_CTX_SET_SSL_VERSION,SSL_R_SSL_LIBRARY_HAS_NO_CIPHERS); 157 return(0); 158 } 159 return(1); 160 } 161 162SSL *SSL_new(SSL_CTX *ctx) 163 { 164 SSL *s; 165 166 if (ctx == NULL) 167 { 168 SSLerr(SSL_F_SSL_NEW,SSL_R_NULL_SSL_CTX); 169 return(NULL); 170 } 171 if (ctx->method == NULL) 172 { 173 SSLerr(SSL_F_SSL_NEW,SSL_R_SSL_CTX_HAS_NO_DEFAULT_SSL_VERSION); 174 return(NULL); 175 } 176 177 s=(SSL *)Malloc(sizeof(SSL)); 178 if (s == NULL) goto err; 179 memset(s,0,sizeof(SSL)); 180 181 if (ctx->cert != NULL) 182 { 183 /* Earlier library versions used to copy the pointer to 184 * the CERT, not its contents; only when setting new 185 * parameters for the per-SSL copy, ssl_cert_new would be 186 * called (and the direct reference to the per-SSL_CTX 187 * settings would be lost, but those still were indirectly 188 * accessed for various purposes, and for that reason they 189 * used to be known as s->ctx->default_cert). 190 * Now we don't look at the SSL_CTX's CERT after having 191 * duplicated it once. */ 192 193 s->cert = ssl_cert_dup(ctx->cert); 194 if (s->cert == NULL) 195 goto err; 196 } 197 else 198 s->cert=NULL; /* Cannot really happen (see SSL_CTX_new) */ 199 s->sid_ctx_length=ctx->sid_ctx_length; 200 memcpy(&s->sid_ctx,&ctx->sid_ctx,sizeof(s->sid_ctx)); 201 s->verify_mode=ctx->verify_mode; 202 s->verify_depth=ctx->verify_depth; 203 s->verify_callback=ctx->default_verify_callback; 204 CRYPTO_add(&ctx->references,1,CRYPTO_LOCK_SSL_CTX); 205 s->ctx=ctx; 206 207 s->verify_result=X509_V_OK; 208 209 s->method=ctx->method; 210 211 if (!s->method->ssl_new(s)) 212 goto err; 213 214 s->quiet_shutdown=ctx->quiet_shutdown; 215 s->references=1; 216 s->server=(ctx->method->ssl_accept == ssl_undefined_function)?0:1; 217 s->options=ctx->options; 218 s->mode=ctx->mode; 219 SSL_clear(s); 220 221 CRYPTO_new_ex_data(ssl_meth,(char *)s,&s->ex_data); 222 223 return(s); 224err: 225 if (s != NULL) 226 { 227 if (s->cert != NULL) 228 ssl_cert_free(s->cert); 229 if (s->ctx != NULL) 230 SSL_CTX_free(s->ctx); /* decrement reference count */ 231 Free(s); 232 } 233 SSLerr(SSL_F_SSL_NEW,ERR_R_MALLOC_FAILURE); 234 return(NULL); 235 } 236 237int SSL_CTX_set_session_id_context(SSL_CTX *ctx,const unsigned char *sid_ctx, 238 unsigned int sid_ctx_len) 239 { 240 if(sid_ctx_len > SSL_MAX_SID_CTX_LENGTH) 241 { 242 SSLerr(SSL_F_SSL_CTX_SET_SESSION_ID_CONTEXT,SSL_R_SSL_SESSION_ID_CONTEXT_TOO_LONG); 243 return 0; 244 } 245 ctx->sid_ctx_length=sid_ctx_len; 246 memcpy(ctx->sid_ctx,sid_ctx,sid_ctx_len); 247 248 return 1; 249 } 250 251int SSL_set_session_id_context(SSL *ssl,const unsigned char *sid_ctx, 252 unsigned int sid_ctx_len) 253 { 254 if(sid_ctx_len > SSL_MAX_SID_CTX_LENGTH) 255 { 256 SSLerr(SSL_F_SSL_SET_SESSION_ID_CONTEXT,SSL_R_SSL_SESSION_ID_CONTEXT_TOO_LONG); 257 return 0; 258 } 259 ssl->sid_ctx_length=sid_ctx_len; 260 memcpy(ssl->sid_ctx,sid_ctx,sid_ctx_len); 261 262 return 1; 263 } 264 265void SSL_free(SSL *s) 266 { 267 int i; 268 269 if(s == NULL) 270 return; 271 272 i=CRYPTO_add(&s->references,-1,CRYPTO_LOCK_SSL); 273#ifdef REF_PRINT 274 REF_PRINT("SSL",s); 275#endif 276 if (i > 0) return; 277#ifdef REF_CHECK 278 if (i < 0) 279 { 280 fprintf(stderr,"SSL_free, bad reference count\n"); 281 abort(); /* ok */ 282 } 283#endif 284 285 CRYPTO_free_ex_data(ssl_meth,(char *)s,&s->ex_data); 286 287 if (s->bbio != NULL) 288 { 289 /* If the buffering BIO is in place, pop it off */ 290 if (s->bbio == s->wbio) 291 { 292 s->wbio=BIO_pop(s->wbio); 293 } 294 BIO_free(s->bbio); 295 s->bbio=NULL; 296 } 297 if (s->rbio != NULL) 298 BIO_free_all(s->rbio); 299 if ((s->wbio != NULL) && (s->wbio != s->rbio)) 300 BIO_free_all(s->wbio); 301 302 if (s->init_buf != NULL) BUF_MEM_free(s->init_buf); 303 304 /* add extra stuff */ 305 if (s->cipher_list != NULL) sk_SSL_CIPHER_free(s->cipher_list); 306 if (s->cipher_list_by_id != NULL) sk_SSL_CIPHER_free(s->cipher_list_by_id); 307 308 /* Make the next call work :-) */ 309 if (s->session != NULL) 310 { 311 ssl_clear_bad_session(s); 312 SSL_SESSION_free(s->session); 313 } 314 315 ssl_clear_cipher_ctx(s); 316 317 if (s->cert != NULL) ssl_cert_free(s->cert); 318 /* Free up if allocated */ 319 320 if (s->ctx) SSL_CTX_free(s->ctx); 321 322 if (s->client_CA != NULL) 323 sk_X509_NAME_pop_free(s->client_CA,X509_NAME_free); 324 325 if (s->method != NULL) s->method->ssl_free(s); 326 327 Free((char *)s); 328 } 329 330void SSL_set_bio(SSL *s,BIO *rbio,BIO *wbio) 331 { 332 /* If the output buffering BIO is still in place, remove it 333 */ 334 if (s->bbio != NULL) 335 { 336 if (s->wbio == s->bbio) 337 { 338 s->wbio=s->wbio->next_bio; 339 s->bbio->next_bio=NULL; 340 } 341 } 342 if ((s->rbio != NULL) && (s->rbio != rbio)) 343 BIO_free_all(s->rbio); 344 if ((s->wbio != NULL) && (s->wbio != wbio) && (s->rbio != s->wbio)) 345 BIO_free_all(s->wbio); 346 s->rbio=rbio; 347 s->wbio=wbio; 348 } 349 350BIO *SSL_get_rbio(SSL *s) 351 { return(s->rbio); } 352 353BIO *SSL_get_wbio(SSL *s) 354 { return(s->wbio); } 355 356int SSL_get_fd(SSL *s) 357 { 358 int ret= -1; 359 BIO *b,*r; 360 361 b=SSL_get_rbio(s); 362 r=BIO_find_type(b,BIO_TYPE_DESCRIPTOR); 363 if (r != NULL) 364 BIO_get_fd(r,&ret); 365 return(ret); 366 } 367 368#ifndef NO_SOCK 369int SSL_set_fd(SSL *s,int fd) 370 { 371 int ret=0; 372 BIO *bio=NULL; 373 374 bio=BIO_new(BIO_s_socket()); 375 376 if (bio == NULL) 377 { 378 SSLerr(SSL_F_SSL_SET_FD,ERR_R_BUF_LIB); 379 goto err; 380 } 381 BIO_set_fd(bio,fd,BIO_NOCLOSE); 382 SSL_set_bio(s,bio,bio); 383 ret=1; 384err: 385 return(ret); 386 } 387 388int SSL_set_wfd(SSL *s,int fd) 389 { 390 int ret=0; 391 BIO *bio=NULL; 392 393 if ((s->rbio == NULL) || (BIO_method_type(s->rbio) != BIO_TYPE_SOCKET) 394 || ((int)BIO_get_fd(s->rbio,NULL) != fd)) 395 { 396 bio=BIO_new(BIO_s_socket()); 397 398 if (bio == NULL) 399 { SSLerr(SSL_F_SSL_SET_WFD,ERR_R_BUF_LIB); goto err; } 400 BIO_set_fd(bio,fd,BIO_NOCLOSE); 401 SSL_set_bio(s,SSL_get_rbio(s),bio); 402 } 403 else 404 SSL_set_bio(s,SSL_get_rbio(s),SSL_get_rbio(s)); 405 ret=1; 406err: 407 return(ret); 408 } 409 410int SSL_set_rfd(SSL *s,int fd) 411 { 412 int ret=0; 413 BIO *bio=NULL; 414 415 if ((s->wbio == NULL) || (BIO_method_type(s->wbio) != BIO_TYPE_SOCKET) 416 || ((int)BIO_get_fd(s->wbio,NULL) != fd)) 417 { 418 bio=BIO_new(BIO_s_socket()); 419 420 if (bio == NULL) 421 { 422 SSLerr(SSL_F_SSL_SET_RFD,ERR_R_BUF_LIB); 423 goto err; 424 } 425 BIO_set_fd(bio,fd,BIO_NOCLOSE); 426 SSL_set_bio(s,bio,SSL_get_wbio(s)); 427 } 428 else 429 SSL_set_bio(s,SSL_get_wbio(s),SSL_get_wbio(s)); 430 ret=1; 431err: 432 return(ret); 433 } 434#endif 435 436int SSL_get_verify_mode(SSL *s) 437 { 438 return(s->verify_mode); 439 } 440 441int SSL_get_verify_depth(SSL *s) 442 { 443 return(s->verify_depth); 444 } 445 446int (*SSL_get_verify_callback(SSL *s))(int,X509_STORE_CTX *) 447 { 448 return(s->verify_callback); 449 } 450 451int SSL_CTX_get_verify_mode(SSL_CTX *ctx) 452 { 453 return(ctx->verify_mode); 454 } 455 456int SSL_CTX_get_verify_depth(SSL_CTX *ctx) 457 { 458 return(ctx->verify_depth); 459 } 460 461int (*SSL_CTX_get_verify_callback(SSL_CTX *ctx))(int,X509_STORE_CTX *) 462 { 463 return(ctx->default_verify_callback); 464 } 465 466void SSL_set_verify(SSL *s,int mode, 467 int (*callback)(int ok,X509_STORE_CTX *ctx)) 468 { 469 s->verify_mode=mode; 470 if (callback != NULL) 471 s->verify_callback=callback; 472 } 473 474void SSL_set_verify_depth(SSL *s,int depth) 475 { 476 s->verify_depth=depth; 477 } 478 479void SSL_set_read_ahead(SSL *s,int yes) 480 { 481 s->read_ahead=yes; 482 } 483 484int SSL_get_read_ahead(SSL *s) 485 { 486 return(s->read_ahead); 487 } 488 489int SSL_pending(SSL *s) 490 { 491 return(s->method->ssl_pending(s)); 492 } 493 494X509 *SSL_get_peer_certificate(SSL *s) 495 { 496 X509 *r; 497 498 if ((s == NULL) || (s->session == NULL)) 499 r=NULL; 500 else 501 r=s->session->peer; 502 503 if (r == NULL) return(r); 504 505 CRYPTO_add(&r->references,1,CRYPTO_LOCK_X509); 506 507 return(r); 508 } 509 510STACK_OF(X509) *SSL_get_peer_cert_chain(SSL *s) 511 { 512 STACK_OF(X509) *r; 513 514 if ((s == NULL) || (s->session == NULL) || (s->session->sess_cert == NULL)) 515 r=NULL; 516 else 517 r=s->session->sess_cert->cert_chain; 518 519 return(r); 520 } 521 522/* Now in theory, since the calling process own 't' it should be safe to 523 * modify. We need to be able to read f without being hassled */ 524void SSL_copy_session_id(SSL *t,SSL *f) 525 { 526 CERT *tmp; 527 528 /* Do we need to to SSL locking? */ 529 SSL_set_session(t,SSL_get_session(f)); 530 531 /* what if we are setup as SSLv2 but want to talk SSLv3 or 532 * vice-versa */ 533 if (t->method != f->method) 534 { 535 t->method->ssl_free(t); /* cleanup current */ 536 t->method=f->method; /* change method */ 537 t->method->ssl_new(t); /* setup new */ 538 } 539 540 tmp=t->cert; 541 if (f->cert != NULL) 542 { 543 CRYPTO_add(&f->cert->references,1,CRYPTO_LOCK_SSL_CERT); 544 t->cert=f->cert; 545 } 546 else 547 t->cert=NULL; 548 if (tmp != NULL) ssl_cert_free(tmp); 549 SSL_set_session_id_context(t,f->sid_ctx,f->sid_ctx_length); 550 } 551 552/* Fix this so it checks all the valid key/cert options */ 553int SSL_CTX_check_private_key(SSL_CTX *ctx) 554 { 555 if ( (ctx == NULL) || 556 (ctx->cert == NULL) || 557 (ctx->cert->key->x509 == NULL)) 558 { 559 SSLerr(SSL_F_SSL_CTX_CHECK_PRIVATE_KEY,SSL_R_NO_CERTIFICATE_ASSIGNED); 560 return(0); 561 } 562 if (ctx->cert->key->privatekey == NULL) 563 { 564 SSLerr(SSL_F_SSL_CTX_CHECK_PRIVATE_KEY,SSL_R_NO_PRIVATE_KEY_ASSIGNED); 565 return(0); 566 } 567 return(X509_check_private_key(ctx->cert->key->x509, ctx->cert->key->privatekey)); 568 } 569 570/* Fix this function so that it takes an optional type parameter */ 571int SSL_check_private_key(SSL *ssl) 572 { 573 if (ssl == NULL) 574 { 575 SSLerr(SSL_F_SSL_CHECK_PRIVATE_KEY,ERR_R_PASSED_NULL_PARAMETER); 576 return(0); 577 } 578 if (ssl->cert == NULL) 579 { 580 SSLerr(SSL_F_SSL_CHECK_PRIVATE_KEY,SSL_R_NO_CERTIFICATE_ASSIGNED); 581 return 0; 582 } 583 if (ssl->cert->key->x509 == NULL) 584 { 585 SSLerr(SSL_F_SSL_CHECK_PRIVATE_KEY,SSL_R_NO_CERTIFICATE_ASSIGNED); 586 return(0); 587 } 588 if (ssl->cert->key->privatekey == NULL) 589 { 590 SSLerr(SSL_F_SSL_CHECK_PRIVATE_KEY,SSL_R_NO_PRIVATE_KEY_ASSIGNED); 591 return(0); 592 } 593 return(X509_check_private_key(ssl->cert->key->x509, 594 ssl->cert->key->privatekey)); 595 } 596 597int SSL_accept(SSL *s) 598 { 599 if (s->handshake_func == 0) 600 /* Not properly initialized yet */ 601 SSL_set_accept_state(s); 602 603 return(s->method->ssl_accept(s)); 604 } 605 606int SSL_connect(SSL *s) 607 { 608 if (s->handshake_func == 0) 609 /* Not properly initialized yet */ 610 SSL_set_connect_state(s); 611 612 return(s->method->ssl_connect(s)); 613 } 614 615long SSL_get_default_timeout(SSL *s) 616 { 617 return(s->method->get_timeout()); 618 } 619 620int SSL_read(SSL *s,char *buf,int num) 621 { 622 if (s->handshake_func == 0) 623 { 624 SSLerr(SSL_F_SSL_READ, SSL_R_UNINITIALIZED); 625 return -1; 626 } 627 628 if (s->shutdown & SSL_RECEIVED_SHUTDOWN) 629 { 630 s->rwstate=SSL_NOTHING; 631 return(0); 632 } 633 return(s->method->ssl_read(s,buf,num)); 634 } 635 636int SSL_peek(SSL *s,char *buf,int num) 637 { 638 if (s->shutdown & SSL_RECEIVED_SHUTDOWN) 639 { 640 return(0); 641 } 642 return(s->method->ssl_peek(s,buf,num)); 643 } 644 645int SSL_write(SSL *s,const char *buf,int num) 646 { 647 if (s->handshake_func == 0) 648 { 649 SSLerr(SSL_F_SSL_WRITE, SSL_R_UNINITIALIZED); 650 return -1; 651 } 652 653 if (s->shutdown & SSL_SENT_SHUTDOWN) 654 { 655 s->rwstate=SSL_NOTHING; 656 SSLerr(SSL_F_SSL_WRITE,SSL_R_PROTOCOL_IS_SHUTDOWN); 657 return(-1); 658 } 659 return(s->method->ssl_write(s,buf,num)); 660 } 661 662int SSL_shutdown(SSL *s) 663 { 664 /* Note that this function behaves differently from what one might 665 * expect. Return values are 0 for no success (yet), 666 * 1 for success; but calling it once is usually not enough, 667 * even if blocking I/O is used (see ssl3_shutdown). 668 */ 669 670 if (s->handshake_func == 0) 671 { 672 SSLerr(SSL_F_SSL_SHUTDOWN, SSL_R_UNINITIALIZED); 673 return -1; 674 } 675 676 if ((s != NULL) && !SSL_in_init(s)) 677 return(s->method->ssl_shutdown(s)); 678 else 679 return(1); 680 } 681 682int SSL_renegotiate(SSL *s) 683 { 684 s->new_session=1; 685 return(s->method->ssl_renegotiate(s)); 686 } 687 688long SSL_ctrl(SSL *s,int cmd,long larg,char *parg) 689 { 690 long l; 691 692 switch (cmd) 693 { 694 case SSL_CTRL_GET_READ_AHEAD: 695 return(s->read_ahead); 696 case SSL_CTRL_SET_READ_AHEAD: 697 l=s->read_ahead; 698 s->read_ahead=larg; 699 return(l); 700 case SSL_CTRL_OPTIONS: 701 return(s->options|=larg); 702 case SSL_CTRL_MODE: 703 return(s->mode|=larg); 704 default: 705 return(s->method->ssl_ctrl(s,cmd,larg,parg)); 706 } 707 } 708 709long SSL_CTX_ctrl(SSL_CTX *ctx,int cmd,long larg,char *parg) 710 { 711 long l; 712 713 switch (cmd) 714 { 715 case SSL_CTRL_GET_READ_AHEAD: 716 return(ctx->read_ahead); 717 case SSL_CTRL_SET_READ_AHEAD: 718 l=ctx->read_ahead; 719 ctx->read_ahead=larg; 720 return(l); 721 722 case SSL_CTRL_SET_SESS_CACHE_SIZE: 723 l=ctx->session_cache_size; 724 ctx->session_cache_size=larg; 725 return(l); 726 case SSL_CTRL_GET_SESS_CACHE_SIZE: 727 return(ctx->session_cache_size); 728 case SSL_CTRL_SET_SESS_CACHE_MODE: 729 l=ctx->session_cache_mode; 730 ctx->session_cache_mode=larg; 731 return(l); 732 case SSL_CTRL_GET_SESS_CACHE_MODE: 733 return(ctx->session_cache_mode); 734 735 case SSL_CTRL_SESS_NUMBER: 736 return(ctx->sessions->num_items); 737 case SSL_CTRL_SESS_CONNECT: 738 return(ctx->stats.sess_connect); 739 case SSL_CTRL_SESS_CONNECT_GOOD: 740 return(ctx->stats.sess_connect_good); 741 case SSL_CTRL_SESS_CONNECT_RENEGOTIATE: 742 return(ctx->stats.sess_connect_renegotiate); 743 case SSL_CTRL_SESS_ACCEPT: 744 return(ctx->stats.sess_accept); 745 case SSL_CTRL_SESS_ACCEPT_GOOD: 746 return(ctx->stats.sess_accept_good); 747 case SSL_CTRL_SESS_ACCEPT_RENEGOTIATE: 748 return(ctx->stats.sess_accept_renegotiate); 749 case SSL_CTRL_SESS_HIT: 750 return(ctx->stats.sess_hit); 751 case SSL_CTRL_SESS_CB_HIT: 752 return(ctx->stats.sess_cb_hit); 753 case SSL_CTRL_SESS_MISSES: 754 return(ctx->stats.sess_miss); 755 case SSL_CTRL_SESS_TIMEOUTS: 756 return(ctx->stats.sess_timeout); 757 case SSL_CTRL_SESS_CACHE_FULL: 758 return(ctx->stats.sess_cache_full); 759 case SSL_CTRL_OPTIONS: 760 return(ctx->options|=larg); 761 case SSL_CTRL_MODE: 762 return(ctx->mode|=larg); 763 default: 764 return(ctx->method->ssl_ctx_ctrl(ctx,cmd,larg,parg)); 765 } 766 } 767 768int ssl_cipher_id_cmp(SSL_CIPHER *a,SSL_CIPHER *b) 769 { 770 long l; 771 772 l=a->id-b->id; 773 if (l == 0L) 774 return(0); 775 else 776 return((l > 0)?1:-1); 777 } 778 779int ssl_cipher_ptr_id_cmp(SSL_CIPHER **ap,SSL_CIPHER **bp) 780 { 781 long l; 782 783 l=(*ap)->id-(*bp)->id; 784 if (l == 0L) 785 return(0); 786 else 787 return((l > 0)?1:-1); 788 } 789 790/** return a STACK of the ciphers available for the SSL and in order of 791 * preference */ 792STACK_OF(SSL_CIPHER) *SSL_get_ciphers(SSL *s) 793 { 794 if ((s != NULL) && (s->cipher_list != NULL)) 795 { 796 return(s->cipher_list); 797 } 798 else if ((s->ctx != NULL) && 799 (s->ctx->cipher_list != NULL)) 800 { 801 return(s->ctx->cipher_list); 802 } 803 return(NULL); 804 } 805 806/** return a STACK of the ciphers available for the SSL and in order of 807 * algorithm id */ 808STACK_OF(SSL_CIPHER) *ssl_get_ciphers_by_id(SSL *s) 809 { 810 if ((s != NULL) && (s->cipher_list_by_id != NULL)) 811 { 812 return(s->cipher_list_by_id); 813 } 814 else if ((s != NULL) && (s->ctx != NULL) && 815 (s->ctx->cipher_list_by_id != NULL)) 816 { 817 return(s->ctx->cipher_list_by_id); 818 } 819 return(NULL); 820 } 821 822/** The old interface to get the same thing as SSL_get_ciphers() */ 823const char *SSL_get_cipher_list(SSL *s,int n) 824 { 825 SSL_CIPHER *c; 826 STACK_OF(SSL_CIPHER) *sk; 827 828 if (s == NULL) return(NULL); 829 sk=SSL_get_ciphers(s); 830 if ((sk == NULL) || (sk_SSL_CIPHER_num(sk) <= n)) 831 return(NULL); 832 c=sk_SSL_CIPHER_value(sk,n); 833 if (c == NULL) return(NULL); 834 return(c->name); 835 } 836 837/** specify the ciphers to be used by defaut by the SSL_CTX */ 838int SSL_CTX_set_cipher_list(SSL_CTX *ctx,char *str) 839 { 840 STACK_OF(SSL_CIPHER) *sk; 841 842 sk=ssl_create_cipher_list(ctx->method,&ctx->cipher_list, 843 &ctx->cipher_list_by_id,str); 844/* XXXX */ 845 return((sk == NULL)?0:1); 846 } 847 848/** specify the ciphers to be used by the SSL */ 849int SSL_set_cipher_list(SSL *s,char *str) 850 { 851 STACK_OF(SSL_CIPHER) *sk; 852 853 sk=ssl_create_cipher_list(s->ctx->method,&s->cipher_list, 854 &s->cipher_list_by_id,str); 855/* XXXX */ 856 return((sk == NULL)?0:1); 857 } 858 859/* works well for SSLv2, not so good for SSLv3 */ 860char *SSL_get_shared_ciphers(SSL *s,char *buf,int len) 861 { 862 char *p; 863 const char *cp; 864 STACK_OF(SSL_CIPHER) *sk; 865 SSL_CIPHER *c; 866 int i; 867 868 if ((s->session == NULL) || (s->session->ciphers == NULL) || 869 (len < 2)) 870 return(NULL); 871 872 p=buf; 873 sk=s->session->ciphers; 874 for (i=0; i<sk_SSL_CIPHER_num(sk); i++) 875 { 876 /* Decrement for either the ':' or a '\0' */ 877 len--; 878 c=sk_SSL_CIPHER_value(sk,i); 879 for (cp=c->name; *cp; ) 880 { 881 if (len-- == 0) 882 { 883 *p='\0'; 884 return(buf); 885 } 886 else 887 *(p++)= *(cp++); 888 } 889 *(p++)=':'; 890 } 891 p[-1]='\0'; 892 return(buf); 893 } 894 895int ssl_cipher_list_to_bytes(SSL *s,STACK_OF(SSL_CIPHER) *sk,unsigned char *p) 896 { 897 int i,j=0; 898 SSL_CIPHER *c; 899 unsigned char *q; 900 901 if (sk == NULL) return(0); 902 q=p; 903 904 for (i=0; i<sk_SSL_CIPHER_num(sk); i++) 905 { 906 c=sk_SSL_CIPHER_value(sk,i); 907 j=ssl_put_cipher_by_char(s,c,p); 908 p+=j; 909 } 910 return(p-q); 911 } 912 913STACK_OF(SSL_CIPHER) *ssl_bytes_to_cipher_list(SSL *s,unsigned char *p,int num, 914 STACK_OF(SSL_CIPHER) **skp) 915 { 916 SSL_CIPHER *c; 917 STACK_OF(SSL_CIPHER) *sk; 918 int i,n; 919 920 n=ssl_put_cipher_by_char(s,NULL,NULL); 921 if ((num%n) != 0) 922 { 923 SSLerr(SSL_F_SSL_BYTES_TO_CIPHER_LIST,SSL_R_ERROR_IN_RECEIVED_CIPHER_LIST); 924 return(NULL); 925 } 926 if ((skp == NULL) || (*skp == NULL)) 927 sk=sk_SSL_CIPHER_new(NULL); /* change perhaps later */ 928 else 929 { 930 sk= *skp; 931 sk_SSL_CIPHER_zero(sk); 932 } 933 934 for (i=0; i<num; i+=n) 935 { 936 c=ssl_get_cipher_by_char(s,p); 937 p+=n; 938 if (c != NULL) 939 { 940 if (!sk_SSL_CIPHER_push(sk,c)) 941 { 942 SSLerr(SSL_F_SSL_BYTES_TO_CIPHER_LIST,ERR_R_MALLOC_FAILURE); 943 goto err; 944 } 945 } 946 } 947 948 if (skp != NULL) 949 *skp=sk; 950 return(sk); 951err: 952 if ((skp == NULL) || (*skp == NULL)) 953 sk_SSL_CIPHER_free(sk); 954 return(NULL); 955 } 956 957unsigned long SSL_SESSION_hash(SSL_SESSION *a) 958 { 959 unsigned long l; 960 961 l=(unsigned long) 962 ((unsigned int) a->session_id[0] )| 963 ((unsigned int) a->session_id[1]<< 8L)| 964 ((unsigned long)a->session_id[2]<<16L)| 965 ((unsigned long)a->session_id[3]<<24L); 966 return(l); 967 } 968 969int SSL_SESSION_cmp(SSL_SESSION *a,SSL_SESSION *b) 970 { 971 if (a->ssl_version != b->ssl_version) 972 return(1); 973 if (a->session_id_length != b->session_id_length) 974 return(1); 975 return(memcmp(a->session_id,b->session_id,a->session_id_length)); 976 } 977 978SSL_CTX *SSL_CTX_new(SSL_METHOD *meth) 979 { 980 SSL_CTX *ret=NULL; 981 982 if (meth == NULL) 983 { 984 SSLerr(SSL_F_SSL_CTX_NEW,SSL_R_NULL_SSL_METHOD_PASSED); 985 return(NULL); 986 } 987 988 if (SSL_get_ex_data_X509_STORE_CTX_idx() < 0) 989 { 990 SSLerr(SSL_F_SSL_CTX_NEW,SSL_R_X509_VERIFICATION_SETUP_PROBLEMS); 991 goto err; 992 } 993 ret=(SSL_CTX *)Malloc(sizeof(SSL_CTX)); 994 if (ret == NULL) 995 goto err; 996 997 memset(ret,0,sizeof(SSL_CTX)); 998 999 ret->method=meth; 1000 1001 ret->cert_store=NULL; 1002 ret->session_cache_mode=SSL_SESS_CACHE_SERVER; 1003 ret->session_cache_size=SSL_SESSION_CACHE_MAX_SIZE_DEFAULT; 1004 ret->session_cache_head=NULL; 1005 ret->session_cache_tail=NULL; 1006 1007 /* We take the system default */ 1008 ret->session_timeout=meth->get_timeout(); 1009 1010 ret->new_session_cb=NULL; 1011 ret->remove_session_cb=NULL; 1012 ret->get_session_cb=NULL; 1013 1014 memset((char *)&ret->stats,0,sizeof(ret->stats)); 1015 1016 ret->references=1; 1017 ret->quiet_shutdown=0; 1018 1019/* ret->cipher=NULL;*/ 1020/* ret->s2->challenge=NULL; 1021 ret->master_key=NULL; 1022 ret->key_arg=NULL; 1023 ret->s2->conn_id=NULL; */ 1024 1025 ret->info_callback=NULL; 1026 1027 ret->app_verify_callback=NULL; 1028 ret->app_verify_arg=NULL; 1029 1030 ret->read_ahead=0; 1031 ret->verify_mode=SSL_VERIFY_NONE; 1032 ret->verify_depth=-1; /* Don't impose a limit (but x509_lu.c does) */ 1033 ret->default_verify_callback=NULL; 1034 if ((ret->cert=ssl_cert_new()) == NULL) 1035 goto err; 1036 1037 ret->default_passwd_callback=NULL; 1038 ret->default_passwd_callback_userdata=NULL; 1039 ret->client_cert_cb=NULL; 1040 1041 ret->sessions=lh_new(SSL_SESSION_hash,SSL_SESSION_cmp); 1042 if (ret->sessions == NULL) goto err; 1043 ret->cert_store=X509_STORE_new(); 1044 if (ret->cert_store == NULL) goto err; 1045 1046 ssl_create_cipher_list(ret->method, 1047 &ret->cipher_list,&ret->cipher_list_by_id, 1048 SSL_DEFAULT_CIPHER_LIST); 1049 if (ret->cipher_list == NULL 1050 || sk_SSL_CIPHER_num(ret->cipher_list) <= 0) 1051 { 1052 SSLerr(SSL_F_SSL_CTX_NEW,SSL_R_LIBRARY_HAS_NO_CIPHERS); 1053 goto err2; 1054 } 1055 1056 if ((ret->rsa_md5=EVP_get_digestbyname("ssl2-md5")) == NULL) 1057 { 1058 SSLerr(SSL_F_SSL_CTX_NEW,SSL_R_UNABLE_TO_LOAD_SSL2_MD5_ROUTINES); 1059 goto err2; 1060 } 1061 if ((ret->md5=EVP_get_digestbyname("ssl3-md5")) == NULL) 1062 { 1063 SSLerr(SSL_F_SSL_CTX_NEW,SSL_R_UNABLE_TO_LOAD_SSL3_MD5_ROUTINES); 1064 goto err2; 1065 } 1066 if ((ret->sha1=EVP_get_digestbyname("ssl3-sha1")) == NULL) 1067 { 1068 SSLerr(SSL_F_SSL_CTX_NEW,SSL_R_UNABLE_TO_LOAD_SSL3_SHA1_ROUTINES); 1069 goto err2; 1070 } 1071 1072 if ((ret->client_CA=sk_X509_NAME_new_null()) == NULL) 1073 goto err; 1074 1075 CRYPTO_new_ex_data(ssl_ctx_meth,(char *)ret,&ret->ex_data); 1076 1077 ret->extra_certs=NULL; 1078 ret->comp_methods=SSL_COMP_get_compression_methods(); 1079 1080 return(ret); 1081err: 1082 SSLerr(SSL_F_SSL_CTX_NEW,ERR_R_MALLOC_FAILURE); 1083err2: 1084 if (ret != NULL) SSL_CTX_free(ret); 1085 return(NULL); 1086 } 1087 1088static void SSL_COMP_free(SSL_COMP *comp) 1089 { Free(comp); } 1090 1091void SSL_CTX_free(SSL_CTX *a) 1092 { 1093 int i; 1094 1095 if (a == NULL) return; 1096 1097 i=CRYPTO_add(&a->references,-1,CRYPTO_LOCK_SSL_CTX); 1098#ifdef REF_PRINT 1099 REF_PRINT("SSL_CTX",a); 1100#endif 1101 if (i > 0) return; 1102#ifdef REF_CHECK 1103 if (i < 0) 1104 { 1105 fprintf(stderr,"SSL_CTX_free, bad reference count\n"); 1106 abort(); /* ok */ 1107 } 1108#endif 1109 CRYPTO_free_ex_data(ssl_ctx_meth,(char *)a,&a->ex_data); 1110 1111 if (a->sessions != NULL) 1112 { 1113 SSL_CTX_flush_sessions(a,0); 1114 lh_free(a->sessions); 1115 } 1116 if (a->cert_store != NULL) 1117 X509_STORE_free(a->cert_store); 1118 if (a->cipher_list != NULL) 1119 sk_SSL_CIPHER_free(a->cipher_list); 1120 if (a->cipher_list_by_id != NULL) 1121 sk_SSL_CIPHER_free(a->cipher_list_by_id); 1122 if (a->cert != NULL) 1123 ssl_cert_free(a->cert); 1124 if (a->client_CA != NULL) 1125 sk_X509_NAME_pop_free(a->client_CA,X509_NAME_free); 1126 if (a->extra_certs != NULL) 1127 sk_X509_pop_free(a->extra_certs,X509_free); 1128 if (a->comp_methods != NULL) 1129 sk_SSL_COMP_pop_free(a->comp_methods,SSL_COMP_free); 1130 Free((char *)a); 1131 } 1132 1133void SSL_CTX_set_default_passwd_cb(SSL_CTX *ctx, pem_password_cb *cb) 1134 { 1135 ctx->default_passwd_callback=cb; 1136 } 1137 1138void SSL_CTX_set_default_passwd_cb_userdata(SSL_CTX *ctx,void *u) 1139 { 1140 ctx->default_passwd_callback_userdata=u; 1141 } 1142 1143void SSL_CTX_set_cert_verify_callback(SSL_CTX *ctx,int (*cb)(),char *arg) 1144 { 1145 /* now 1146 * int (*cb)(X509_STORE_CTX *), 1147 * but should be 1148 * int (*cb)(X509_STORE_CTX *, void *arg) 1149 */ 1150 ctx->app_verify_callback=cb; 1151 ctx->app_verify_arg=arg; /* never used */ 1152 } 1153 1154void SSL_CTX_set_verify(SSL_CTX *ctx,int mode,int (*cb)(int, X509_STORE_CTX *)) 1155 { 1156 ctx->verify_mode=mode; 1157 ctx->default_verify_callback=cb; 1158 /* This needs cleaning up EAY EAY EAY */ 1159 X509_STORE_set_verify_cb_func(ctx->cert_store,cb); 1160 } 1161 1162void SSL_CTX_set_verify_depth(SSL_CTX *ctx,int depth) 1163 { 1164 ctx->verify_depth=depth; 1165 } 1166 1167void ssl_set_cert_masks(CERT *c, SSL_CIPHER *cipher) 1168 { 1169 CERT_PKEY *cpk; 1170 int rsa_enc,rsa_tmp,rsa_sign,dh_tmp,dh_rsa,dh_dsa,dsa_sign; 1171 int rsa_enc_export,dh_rsa_export,dh_dsa_export; 1172 int rsa_tmp_export,dh_tmp_export,kl; 1173 unsigned long mask,emask; 1174 1175 if (c == NULL) return; 1176 1177 kl=SSL_C_EXPORT_PKEYLENGTH(cipher); 1178 1179#ifndef NO_RSA 1180 rsa_tmp=(c->rsa_tmp != NULL || c->rsa_tmp_cb != NULL); 1181 rsa_tmp_export=(c->rsa_tmp_cb != NULL || 1182 (rsa_tmp && RSA_size(c->rsa_tmp)*8 <= kl)); 1183#else 1184 rsa_tmp=rsa_tmp_export=0; 1185#endif 1186#ifndef NO_DH 1187 dh_tmp=(c->dh_tmp != NULL || c->dh_tmp_cb != NULL); 1188 dh_tmp_export=(c->dh_tmp_cb != NULL || 1189 (dh_tmp && DH_size(c->dh_tmp)*8 <= kl)); 1190#else 1191 dh_tmp=dh_tmp_export=0; 1192#endif 1193 1194 cpk= &(c->pkeys[SSL_PKEY_RSA_ENC]); 1195 rsa_enc= (cpk->x509 != NULL && cpk->privatekey != NULL); 1196 rsa_enc_export=(rsa_enc && EVP_PKEY_size(cpk->privatekey)*8 <= kl); 1197 cpk= &(c->pkeys[SSL_PKEY_RSA_SIGN]); 1198 rsa_sign=(cpk->x509 != NULL && cpk->privatekey != NULL); 1199 cpk= &(c->pkeys[SSL_PKEY_DSA_SIGN]); 1200 dsa_sign=(cpk->x509 != NULL && cpk->privatekey != NULL); 1201 cpk= &(c->pkeys[SSL_PKEY_DH_RSA]); 1202 dh_rsa= (cpk->x509 != NULL && cpk->privatekey != NULL); 1203 dh_rsa_export=(dh_rsa && EVP_PKEY_size(cpk->privatekey)*8 <= kl); 1204 cpk= &(c->pkeys[SSL_PKEY_DH_DSA]); 1205/* FIX THIS EAY EAY EAY */ 1206 dh_dsa= (cpk->x509 != NULL && cpk->privatekey != NULL); 1207 dh_dsa_export=(dh_dsa && EVP_PKEY_size(cpk->privatekey)*8 <= kl); 1208 1209 mask=0; 1210 emask=0; 1211 1212#ifdef CIPHER_DEBUG 1213 printf("rt=%d rte=%d dht=%d re=%d ree=%d rs=%d ds=%d dhr=%d dhd=%d\n", 1214 rsa_tmp,rsa_tmp_export,dh_tmp, 1215 rsa_enc,rsa_enc_export,rsa_sign,dsa_sign,dh_rsa,dh_dsa); 1216#endif 1217 1218 if (rsa_enc || (rsa_tmp && rsa_sign)) 1219 mask|=SSL_kRSA; 1220 if (rsa_enc_export || (rsa_tmp_export && (rsa_sign || rsa_enc))) 1221 emask|=SSL_kRSA; 1222 1223#if 0 1224 /* The match needs to be both kEDH and aRSA or aDSA, so don't worry */ 1225 if ( (dh_tmp || dh_rsa || dh_dsa) && 1226 (rsa_enc || rsa_sign || dsa_sign)) 1227 mask|=SSL_kEDH; 1228 if ((dh_tmp_export || dh_rsa_export || dh_dsa_export) && 1229 (rsa_enc || rsa_sign || dsa_sign)) 1230 emask|=SSL_kEDH; 1231#endif 1232 1233 if (dh_tmp_export) 1234 emask|=SSL_kEDH; 1235 1236 if (dh_tmp) 1237 mask|=SSL_kEDH; 1238 1239 if (dh_rsa) mask|=SSL_kDHr; 1240 if (dh_rsa_export) emask|=SSL_kDHr; 1241 1242 if (dh_dsa) mask|=SSL_kDHd; 1243 if (dh_dsa_export) emask|=SSL_kDHd; 1244 1245 if (rsa_enc || rsa_sign) 1246 { 1247 mask|=SSL_aRSA; 1248 emask|=SSL_aRSA; 1249 } 1250 1251 if (dsa_sign) 1252 { 1253 mask|=SSL_aDSS; 1254 emask|=SSL_aDSS; 1255 } 1256 1257#ifdef SSL_ALLOW_ADH 1258 mask|=SSL_aNULL; 1259 emask|=SSL_aNULL; 1260#endif 1261 1262 c->mask=mask; 1263 c->export_mask=emask; 1264 c->valid=1; 1265 } 1266 1267/* THIS NEEDS CLEANING UP */ 1268X509 *ssl_get_server_send_cert(SSL *s) 1269 { 1270 unsigned long alg,mask,kalg; 1271 CERT *c; 1272 int i,is_export; 1273 1274 c=s->cert; 1275 ssl_set_cert_masks(c, s->s3->tmp.new_cipher); 1276 alg=s->s3->tmp.new_cipher->algorithms; 1277 is_export=SSL_IS_EXPORT(alg); 1278 mask=is_export?c->export_mask:c->mask; 1279 kalg=alg&(SSL_MKEY_MASK|SSL_AUTH_MASK); 1280 1281 if (kalg & SSL_kDHr) 1282 i=SSL_PKEY_DH_RSA; 1283 else if (kalg & SSL_kDHd) 1284 i=SSL_PKEY_DH_DSA; 1285 else if (kalg & SSL_aDSS) 1286 i=SSL_PKEY_DSA_SIGN; 1287 else if (kalg & SSL_aRSA) 1288 { 1289 if (c->pkeys[SSL_PKEY_RSA_ENC].x509 == NULL) 1290 i=SSL_PKEY_RSA_SIGN; 1291 else 1292 i=SSL_PKEY_RSA_ENC; 1293 } 1294 else /* if (kalg & SSL_aNULL) */ 1295 { 1296 SSLerr(SSL_F_SSL_GET_SERVER_SEND_CERT,SSL_R_INTERNAL_ERROR); 1297 return(NULL); 1298 } 1299 if (c->pkeys[i].x509 == NULL) return(NULL); 1300 return(c->pkeys[i].x509); 1301 } 1302 1303EVP_PKEY *ssl_get_sign_pkey(SSL *s,SSL_CIPHER *cipher) 1304 { 1305 unsigned long alg; 1306 CERT *c; 1307 1308 alg=cipher->algorithms; 1309 c=s->cert; 1310 1311 if ((alg & SSL_aDSS) && 1312 (c->pkeys[SSL_PKEY_DSA_SIGN].privatekey != NULL)) 1313 return(c->pkeys[SSL_PKEY_DSA_SIGN].privatekey); 1314 else if (alg & SSL_aRSA) 1315 { 1316 if (c->pkeys[SSL_PKEY_RSA_SIGN].privatekey != NULL) 1317 return(c->pkeys[SSL_PKEY_RSA_SIGN].privatekey); 1318 else if (c->pkeys[SSL_PKEY_RSA_ENC].privatekey != NULL) 1319 return(c->pkeys[SSL_PKEY_RSA_ENC].privatekey); 1320 else 1321 return(NULL); 1322 } 1323 else /* if (alg & SSL_aNULL) */ 1324 { 1325 SSLerr(SSL_F_SSL_GET_SIGN_PKEY,SSL_R_INTERNAL_ERROR); 1326 return(NULL); 1327 } 1328 } 1329 1330void ssl_update_cache(SSL *s,int mode) 1331 { 1332 int i; 1333 1334 /* If the session_id_length is 0, we are not supposed to cache it, 1335 * and it would be rather hard to do anyway :-) */ 1336 if (s->session->session_id_length == 0) return; 1337 1338 if ((s->ctx->session_cache_mode & mode) 1339 && (!s->hit) 1340 && SSL_CTX_add_session(s->ctx,s->session) 1341 && (s->ctx->new_session_cb != NULL)) 1342 { 1343 CRYPTO_add(&s->session->references,1,CRYPTO_LOCK_SSL_SESSION); 1344 if (!s->ctx->new_session_cb(s,s->session)) 1345 SSL_SESSION_free(s->session); 1346 } 1347 1348 /* auto flush every 255 connections */ 1349 i=s->ctx->session_cache_mode; 1350 if ((!(i & SSL_SESS_CACHE_NO_AUTO_CLEAR)) && 1351 ((i & mode) == mode)) 1352 { 1353 if ( (((mode & SSL_SESS_CACHE_CLIENT) 1354 ?s->ctx->stats.sess_connect_good 1355 :s->ctx->stats.sess_accept_good) & 0xff) == 0xff) 1356 { 1357 SSL_CTX_flush_sessions(s->ctx,time(NULL)); 1358 } 1359 } 1360 } 1361 1362SSL_METHOD *SSL_get_ssl_method(SSL *s) 1363 { 1364 return(s->method); 1365 } 1366 1367int SSL_set_ssl_method(SSL *s,SSL_METHOD *meth) 1368 { 1369 int conn= -1; 1370 int ret=1; 1371 1372 if (s->method != meth) 1373 { 1374 if (s->handshake_func != NULL) 1375 conn=(s->handshake_func == s->method->ssl_connect); 1376 1377 if (s->method->version == meth->version) 1378 s->method=meth; 1379 else 1380 { 1381 s->method->ssl_free(s); 1382 s->method=meth; 1383 ret=s->method->ssl_new(s); 1384 } 1385 1386 if (conn == 1) 1387 s->handshake_func=meth->ssl_connect; 1388 else if (conn == 0) 1389 s->handshake_func=meth->ssl_accept; 1390 } 1391 return(ret); 1392 } 1393 1394int SSL_get_error(SSL *s,int i) 1395 { 1396 int reason; 1397 unsigned long l; 1398 BIO *bio; 1399 1400 if (i > 0) return(SSL_ERROR_NONE); 1401 1402 /* Make things return SSL_ERROR_SYSCALL when doing SSL_do_handshake 1403 * etc, where we do encode the error */ 1404 if ((l=ERR_peek_error()) != 0) 1405 { 1406 if (ERR_GET_LIB(l) == ERR_LIB_SYS) 1407 return(SSL_ERROR_SYSCALL); 1408 else 1409 return(SSL_ERROR_SSL); 1410 } 1411 1412 if ((i < 0) && SSL_want_read(s)) 1413 { 1414 bio=SSL_get_rbio(s); 1415 if (BIO_should_read(bio)) 1416 return(SSL_ERROR_WANT_READ); 1417 else if (BIO_should_write(bio)) 1418 /* This one doesn't make too much sense ... We never try 1419 * to write to the rbio, and an application program where 1420 * rbio and wbio are separate couldn't even know what it 1421 * should wait for. 1422 * However if we ever set s->rwstate incorrectly 1423 * (so that we have SSL_want_read(s) instead of 1424 * SSL_want_write(s)) and rbio and wbio *are* the same, 1425 * this test works around that bug; so it might be safer 1426 * to keep it. */ 1427 return(SSL_ERROR_WANT_WRITE); 1428 else if (BIO_should_io_special(bio)) 1429 { 1430 reason=BIO_get_retry_reason(bio); 1431 if (reason == BIO_RR_CONNECT) 1432 return(SSL_ERROR_WANT_CONNECT); 1433 else 1434 return(SSL_ERROR_SYSCALL); /* unknown */ 1435 } 1436 } 1437 1438 if ((i < 0) && SSL_want_write(s)) 1439 { 1440 bio=SSL_get_wbio(s); 1441 if (BIO_should_write(bio)) 1442 return(SSL_ERROR_WANT_WRITE); 1443 else if (BIO_should_read(bio)) 1444 /* See above (SSL_want_read(s) with BIO_should_write(bio)) */ 1445 return(SSL_ERROR_WANT_READ); 1446 else if (BIO_should_io_special(bio)) 1447 { 1448 reason=BIO_get_retry_reason(bio); 1449 if (reason == BIO_RR_CONNECT) 1450 return(SSL_ERROR_WANT_CONNECT); 1451 else 1452 return(SSL_ERROR_SYSCALL); 1453 } 1454 } 1455 if ((i < 0) && SSL_want_x509_lookup(s)) 1456 { 1457 return(SSL_ERROR_WANT_X509_LOOKUP); 1458 } 1459 1460 if (i == 0) 1461 { 1462 if (s->version == SSL2_VERSION) 1463 { 1464 /* assume it is the socket being closed */ 1465 return(SSL_ERROR_ZERO_RETURN); 1466 } 1467 else 1468 { 1469 if ((s->shutdown & SSL_RECEIVED_SHUTDOWN) && 1470 (s->s3->warn_alert == SSL_AD_CLOSE_NOTIFY)) 1471 return(SSL_ERROR_ZERO_RETURN); 1472 } 1473 } 1474 return(SSL_ERROR_SYSCALL); 1475 } 1476 1477int SSL_do_handshake(SSL *s) 1478 { 1479 int ret=1; 1480 1481 if (s->handshake_func == NULL) 1482 { 1483 SSLerr(SSL_F_SSL_DO_HANDSHAKE,SSL_R_CONNECTION_TYPE_NOT_SET); 1484 return(-1); 1485 } 1486 1487 s->method->ssl_renegotiate_check(s); 1488 1489 if (SSL_in_init(s) || SSL_in_before(s)) 1490 { 1491 ret=s->handshake_func(s); 1492 } 1493 return(ret); 1494 } 1495 1496/* For the next 2 functions, SSL_clear() sets shutdown and so 1497 * one of these calls will reset it */ 1498void SSL_set_accept_state(SSL *s) 1499 { 1500 s->server=1; 1501 s->shutdown=0; 1502 s->state=SSL_ST_ACCEPT|SSL_ST_BEFORE; 1503 s->handshake_func=s->method->ssl_accept; 1504 /* clear the current cipher */ 1505 ssl_clear_cipher_ctx(s); 1506 } 1507 1508void SSL_set_connect_state(SSL *s) 1509 { 1510 s->server=0; 1511 s->shutdown=0; 1512 s->state=SSL_ST_CONNECT|SSL_ST_BEFORE; 1513 s->handshake_func=s->method->ssl_connect; 1514 /* clear the current cipher */ 1515 ssl_clear_cipher_ctx(s); 1516 } 1517 1518int ssl_undefined_function(SSL *s) 1519 { 1520 SSLerr(SSL_F_SSL_UNDEFINED_FUNCTION,ERR_R_SHOULD_NOT_HAVE_BEEN_CALLED); 1521 return(0); 1522 } 1523 1524SSL_METHOD *ssl_bad_method(int ver) 1525 { 1526 SSLerr(SSL_F_SSL_BAD_METHOD,ERR_R_SHOULD_NOT_HAVE_BEEN_CALLED); 1527 return(NULL); 1528 } 1529 1530char *SSL_get_version(SSL *s) 1531 { 1532 if (s->version == TLS1_VERSION) 1533 return("TLSv1"); 1534 else if (s->version == SSL3_VERSION) 1535 return("SSLv3"); 1536 else if (s->version == SSL2_VERSION) 1537 return("SSLv2"); 1538 else 1539 return("unknown"); 1540 } 1541 1542SSL *SSL_dup(SSL *s) 1543 { 1544 STACK_OF(X509_NAME) *sk; 1545 X509_NAME *xn; 1546 SSL *ret; 1547 int i; 1548 1549 if ((ret=SSL_new(SSL_get_SSL_CTX(s))) == NULL) 1550 return(NULL); 1551 1552 if (s->session != NULL) 1553 { 1554 /* This copies session-id, SSL_METHOD, sid_ctx, and 'cert' */ 1555 SSL_copy_session_id(ret,s); 1556 } 1557 else 1558 { 1559 /* No session has been established yet, so we have to expect 1560 * that s->cert or ret->cert will be changed later -- 1561 * they should not both point to the same object, 1562 * and thus we can't use SSL_copy_session_id. */ 1563 1564 ret->method = s->method; 1565 ret->method->ssl_new(ret); 1566 1567 if (s->cert != NULL) 1568 { 1569 ret->cert = ssl_cert_dup(s->cert); 1570 if (ret->cert == NULL) 1571 goto err; 1572 } 1573 1574 SSL_set_session_id_context(ret, 1575 s->sid_ctx, s->sid_ctx_length); 1576 } 1577 1578 SSL_set_read_ahead(ret,SSL_get_read_ahead(s)); 1579 SSL_set_verify(ret,SSL_get_verify_mode(s), 1580 SSL_get_verify_callback(s)); 1581 SSL_set_verify_depth(ret,SSL_get_verify_depth(s)); 1582 1583 SSL_set_info_callback(ret,SSL_get_info_callback(s)); 1584 1585 ret->debug=s->debug; 1586 ret->options=s->options; 1587 1588 /* copy app data, a little dangerous perhaps */ 1589 if (!CRYPTO_dup_ex_data(ssl_meth,&ret->ex_data,&s->ex_data)) 1590 goto err; 1591 1592 /* setup rbio, and wbio */ 1593 if (s->rbio != NULL) 1594 { 1595 if (!BIO_dup_state(s->rbio,(char *)&ret->rbio)) 1596 goto err; 1597 } 1598 if (s->wbio != NULL) 1599 { 1600 if (s->wbio != s->rbio) 1601 { 1602 if (!BIO_dup_state(s->wbio,(char *)&ret->wbio)) 1603 goto err; 1604 } 1605 else 1606 ret->wbio=ret->rbio; 1607 } 1608 1609 /* dup the cipher_list and cipher_list_by_id stacks */ 1610 if (s->cipher_list != NULL) 1611 { 1612 if ((ret->cipher_list=sk_SSL_CIPHER_dup(s->cipher_list)) == NULL) 1613 goto err; 1614 } 1615 if (s->cipher_list_by_id != NULL) 1616 if ((ret->cipher_list_by_id=sk_SSL_CIPHER_dup(s->cipher_list_by_id)) 1617 == NULL) 1618 goto err; 1619 1620 /* Dup the client_CA list */ 1621 if (s->client_CA != NULL) 1622 { 1623 if ((sk=sk_X509_NAME_dup(s->client_CA)) == NULL) goto err; 1624 ret->client_CA=sk; 1625 for (i=0; i<sk_X509_NAME_num(sk); i++) 1626 { 1627 xn=sk_X509_NAME_value(sk,i); 1628 if (sk_X509_NAME_set(sk,i,X509_NAME_dup(xn)) == NULL) 1629 { 1630 X509_NAME_free(xn); 1631 goto err; 1632 } 1633 } 1634 } 1635 1636 ret->shutdown=s->shutdown; 1637 ret->state=s->state; 1638 ret->handshake_func=s->handshake_func; 1639 ret->server=s->server; 1640 1641 if (0) 1642 { 1643err: 1644 if (ret != NULL) SSL_free(ret); 1645 ret=NULL; 1646 } 1647 return(ret); 1648 } 1649 1650void ssl_clear_cipher_ctx(SSL *s) 1651 { 1652 if (s->enc_read_ctx != NULL) 1653 { 1654 EVP_CIPHER_CTX_cleanup(s->enc_read_ctx); 1655 Free(s->enc_read_ctx); 1656 s->enc_read_ctx=NULL; 1657 } 1658 if (s->enc_write_ctx != NULL) 1659 { 1660 EVP_CIPHER_CTX_cleanup(s->enc_write_ctx); 1661 Free(s->enc_write_ctx); 1662 s->enc_write_ctx=NULL; 1663 } 1664 if (s->expand != NULL) 1665 { 1666 COMP_CTX_free(s->expand); 1667 s->expand=NULL; 1668 } 1669 if (s->compress != NULL) 1670 { 1671 COMP_CTX_free(s->compress); 1672 s->compress=NULL; 1673 } 1674 } 1675 1676/* Fix this function so that it takes an optional type parameter */ 1677X509 *SSL_get_certificate(SSL *s) 1678 { 1679 if (s->cert != NULL) 1680 return(s->cert->key->x509); 1681 else 1682 return(NULL); 1683 } 1684 1685/* Fix this function so that it takes an optional type parameter */ 1686EVP_PKEY *SSL_get_privatekey(SSL *s) 1687 { 1688 if (s->cert != NULL) 1689 return(s->cert->key->privatekey); 1690 else 1691 return(NULL); 1692 } 1693 1694SSL_CIPHER *SSL_get_current_cipher(SSL *s) 1695 { 1696 if ((s->session != NULL) && (s->session->cipher != NULL)) 1697 return(s->session->cipher); 1698 return(NULL); 1699 } 1700 1701int ssl_init_wbio_buffer(SSL *s,int push) 1702 { 1703 BIO *bbio; 1704 1705 if (s->bbio == NULL) 1706 { 1707 bbio=BIO_new(BIO_f_buffer()); 1708 if (bbio == NULL) return(0); 1709 s->bbio=bbio; 1710 } 1711 else 1712 { 1713 bbio=s->bbio; 1714 if (s->bbio == s->wbio) 1715 s->wbio=BIO_pop(s->wbio); 1716 } 1717 (void)BIO_reset(bbio); 1718/* if (!BIO_set_write_buffer_size(bbio,16*1024)) */ 1719 if (!BIO_set_read_buffer_size(bbio,1)) 1720 { 1721 SSLerr(SSL_F_SSL_INIT_WBIO_BUFFER,ERR_R_BUF_LIB); 1722 return(0); 1723 } 1724 if (push) 1725 { 1726 if (s->wbio != bbio) 1727 s->wbio=BIO_push(bbio,s->wbio); 1728 } 1729 else 1730 { 1731 if (s->wbio == bbio) 1732 s->wbio=BIO_pop(bbio); 1733 } 1734 return(1); 1735 } 1736 1737void ssl_free_wbio_buffer(SSL *s) 1738 { 1739 BIO *under; 1740 1741 if (s->bbio == NULL) return; 1742 1743 if (s->bbio == s->wbio) 1744 { 1745 /* remove buffering */ 1746 under=BIO_pop(s->wbio); 1747 if (under != NULL) 1748 s->wbio=under; 1749 else 1750 abort(); /* ok */ 1751 } 1752 BIO_free(s->bbio); 1753 s->bbio=NULL; 1754 } 1755 1756void SSL_CTX_set_quiet_shutdown(SSL_CTX *ctx,int mode) 1757 { 1758 ctx->quiet_shutdown=mode; 1759 } 1760 1761int SSL_CTX_get_quiet_shutdown(SSL_CTX *ctx) 1762 { 1763 return(ctx->quiet_shutdown); 1764 } 1765 1766void SSL_set_quiet_shutdown(SSL *s,int mode) 1767 { 1768 s->quiet_shutdown=mode; 1769 } 1770 1771int SSL_get_quiet_shutdown(SSL *s) 1772 { 1773 return(s->quiet_shutdown); 1774 } 1775 1776void SSL_set_shutdown(SSL *s,int mode) 1777 { 1778 s->shutdown=mode; 1779 } 1780 1781int SSL_get_shutdown(SSL *s) 1782 { 1783 return(s->shutdown); 1784 } 1785 1786int SSL_version(SSL *s) 1787 { 1788 return(s->version); 1789 } 1790 1791SSL_CTX *SSL_get_SSL_CTX(SSL *ssl) 1792 { 1793 return(ssl->ctx); 1794 } 1795 1796#ifndef NO_STDIO 1797int SSL_CTX_set_default_verify_paths(SSL_CTX *ctx) 1798 { 1799 return(X509_STORE_set_default_paths(ctx->cert_store)); 1800 } 1801 1802int SSL_CTX_load_verify_locations(SSL_CTX *ctx, const char *CAfile, 1803 const char *CApath) 1804 { 1805 return(X509_STORE_load_locations(ctx->cert_store,CAfile,CApath)); 1806 } 1807#endif 1808 1809void SSL_set_info_callback(SSL *ssl,void (*cb)()) 1810 { 1811 ssl->info_callback=cb; 1812 } 1813 1814void (*SSL_get_info_callback(SSL *ssl))(void) 1815 { 1816 return((void (*)())ssl->info_callback); 1817 } 1818 1819int SSL_state(SSL *ssl) 1820 { 1821 return(ssl->state); 1822 } 1823 1824void SSL_set_verify_result(SSL *ssl,long arg) 1825 { 1826 ssl->verify_result=arg; 1827 } 1828 1829long SSL_get_verify_result(SSL *ssl) 1830 { 1831 return(ssl->verify_result); 1832 } 1833 1834int SSL_get_ex_new_index(long argl,char *argp,int (*new_func)(), 1835 int (*dup_func)(),void (*free_func)()) 1836 { 1837 ssl_meth_num++; 1838 return(CRYPTO_get_ex_new_index(ssl_meth_num-1, 1839 &ssl_meth,argl,argp,new_func,dup_func,free_func)); 1840 } 1841 1842int SSL_set_ex_data(SSL *s,int idx,void *arg) 1843 { 1844 return(CRYPTO_set_ex_data(&s->ex_data,idx,arg)); 1845 } 1846 1847void *SSL_get_ex_data(SSL *s,int idx) 1848 { 1849 return(CRYPTO_get_ex_data(&s->ex_data,idx)); 1850 } 1851 1852int SSL_CTX_get_ex_new_index(long argl,char *argp,int (*new_func)(), 1853 int (*dup_func)(),void (*free_func)()) 1854 { 1855 ssl_ctx_meth_num++; 1856 return(CRYPTO_get_ex_new_index(ssl_ctx_meth_num-1, 1857 &ssl_ctx_meth,argl,argp,new_func,dup_func,free_func)); 1858 } 1859 1860int SSL_CTX_set_ex_data(SSL_CTX *s,int idx,void *arg) 1861 { 1862 return(CRYPTO_set_ex_data(&s->ex_data,idx,arg)); 1863 } 1864 1865void *SSL_CTX_get_ex_data(SSL_CTX *s,int idx) 1866 { 1867 return(CRYPTO_get_ex_data(&s->ex_data,idx)); 1868 } 1869 1870int ssl_ok(SSL *s) 1871 { 1872 return(1); 1873 } 1874 1875X509_STORE *SSL_CTX_get_cert_store(SSL_CTX *ctx) 1876 { 1877 return(ctx->cert_store); 1878 } 1879 1880void SSL_CTX_set_cert_store(SSL_CTX *ctx,X509_STORE *store) 1881 { 1882 if (ctx->cert_store != NULL) 1883 X509_STORE_free(ctx->cert_store); 1884 ctx->cert_store=store; 1885 } 1886 1887int SSL_want(SSL *s) 1888 { 1889 return(s->rwstate); 1890 } 1891 1892/*! 1893 * \brief Set the callback for generating temporary RSA keys. 1894 * \param ctx the SSL context. 1895 * \param cb the callback 1896 */ 1897 1898#ifndef NO_RSA 1899void SSL_CTX_set_tmp_rsa_callback(SSL_CTX *ctx,RSA *(*cb)(SSL *ssl, 1900 int is_export, 1901 int keylength)) 1902 { SSL_CTX_ctrl(ctx,SSL_CTRL_SET_TMP_RSA_CB,0,(char *)cb); } 1903#endif 1904 1905#ifndef NO_RSA 1906void SSL_set_tmp_rsa_callback(SSL *ssl,RSA *(*cb)(SSL *ssl,int is_export, 1907 int keylength)) 1908 { SSL_ctrl(ssl,SSL_CTRL_SET_TMP_RSA_CB,0,(char *)cb); } 1909#endif 1910 1911#ifdef DOXYGEN 1912/*! 1913 * \brief The RSA temporary key callback function. 1914 * \param ssl the SSL session. 1915 * \param is_export \c TRUE if the temp RSA key is for an export ciphersuite. 1916 * \param keylength if \c is_export is \c TRUE, then \c keylength is the size 1917 * of the required key in bits. 1918 * \return the temporary RSA key. 1919 * \sa SSL_CTX_set_tmp_rsa_callback, SSL_set_tmp_rsa_callback 1920 */ 1921 1922RSA *cb(SSL *ssl,int is_export,int keylength) 1923 {} 1924#endif 1925 1926/*! 1927 * \brief Set the callback for generating temporary DH keys. 1928 * \param ctx the SSL context. 1929 * \param dh the callback 1930 */ 1931 1932#ifndef NO_DH 1933void SSL_CTX_set_tmp_dh_callback(SSL_CTX *ctx,DH *(*dh)(SSL *ssl,int is_export, 1934 int keylength)) 1935 { SSL_CTX_ctrl(ctx,SSL_CTRL_SET_TMP_DH_CB,0,(char *)dh); } 1936 1937void SSL_set_tmp_dh_callback(SSL *ssl,DH *(*dh)(SSL *ssl,int is_export, 1938 int keylength)) 1939 { SSL_ctrl(ssl,SSL_CTRL_SET_TMP_DH_CB,0,(char *)dh); } 1940#endif 1941 1942#if defined(_WINDLL) && defined(WIN16) 1943#include "../crypto/bio/bss_file.c" 1944#endif 1945 1946IMPLEMENT_STACK_OF(SSL_CIPHER) 1947IMPLEMENT_STACK_OF(SSL_COMP) 1948