1 /* ssl/ssl_sess.c */ 2 /* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) 3 * All rights reserved. 4 * 5 * This package is an SSL implementation written 6 * by Eric Young (eay@cryptsoft.com). 7 * The implementation was written so as to conform with Netscapes SSL. 8 * 9 * This library is free for commercial and non-commercial use as long as 10 * the following conditions are aheared to. The following conditions 11 * apply to all code found in this distribution, be it the RC4, RSA, 12 * lhash, DES, etc., code; not just the SSL code. The SSL documentation 13 * included with this distribution is covered by the same copyright terms 14 * except that the holder is Tim Hudson (tjh@cryptsoft.com). 15 * 16 * Copyright remains Eric Young's, and as such any Copyright notices in 17 * the code are not to be removed. 18 * If this package is used in a product, Eric Young should be given attribution 19 * as the author of the parts of the library used. 20 * This can be in the form of a textual message at program startup or 21 * in documentation (online or textual) provided with the package. 22 * 23 * Redistribution and use in source and binary forms, with or without 24 * modification, are permitted provided that the following conditions 25 * are met: 26 * 1. Redistributions of source code must retain the copyright 27 * notice, this list of conditions and the following disclaimer. 28 * 2. Redistributions in binary form must reproduce the above copyright 29 * notice, this list of conditions and the following disclaimer in the 30 * documentation and/or other materials provided with the distribution. 31 * 3. All advertising materials mentioning features or use of this software 32 * must display the following acknowledgement: 33 * "This product includes cryptographic software written by 34 * Eric Young (eay@cryptsoft.com)" 35 * The word 'cryptographic' can be left out if the rouines from the library 36 * being used are not cryptographic related :-). 37 * 4. If you include any Windows specific code (or a derivative thereof) from 38 * the apps directory (application code) you must include an acknowledgement: 39 * "This product includes software written by Tim Hudson (tjh@cryptsoft.com)" 40 * 41 * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND 42 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 43 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 44 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 45 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 46 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 47 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 48 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 49 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 50 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 51 * SUCH DAMAGE. 52 * 53 * The licence and distribution terms for any publically available version or 54 * derivative of this code cannot be changed. i.e. this code cannot simply be 55 * copied and put under another distribution licence 56 * [including the GNU Public Licence.] 57 */ 58 /* ==================================================================== 59 * Copyright (c) 1998-2006 The OpenSSL Project. All rights reserved. 60 * 61 * Redistribution and use in source and binary forms, with or without 62 * modification, are permitted provided that the following conditions 63 * are met: 64 * 65 * 1. Redistributions of source code must retain the above copyright 66 * notice, this list of conditions and the following disclaimer. 67 * 68 * 2. Redistributions in binary form must reproduce the above copyright 69 * notice, this list of conditions and the following disclaimer in 70 * the documentation and/or other materials provided with the 71 * distribution. 72 * 73 * 3. All advertising materials mentioning features or use of this 74 * software must display the following acknowledgment: 75 * "This product includes software developed by the OpenSSL Project 76 * for use in the OpenSSL Toolkit. (http://www.openssl.org/)" 77 * 78 * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to 79 * endorse or promote products derived from this software without 80 * prior written permission. For written permission, please contact 81 * openssl-core@openssl.org. 82 * 83 * 5. Products derived from this software may not be called "OpenSSL" 84 * nor may "OpenSSL" appear in their names without prior written 85 * permission of the OpenSSL Project. 86 * 87 * 6. Redistributions of any form whatsoever must retain the following 88 * acknowledgment: 89 * "This product includes software developed by the OpenSSL Project 90 * for use in the OpenSSL Toolkit (http://www.openssl.org/)" 91 * 92 * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY 93 * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 94 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 95 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OpenSSL PROJECT OR 96 * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 97 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 98 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; 99 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 100 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, 101 * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 102 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED 103 * OF THE POSSIBILITY OF SUCH DAMAGE. 104 * ==================================================================== 105 * 106 * This product includes cryptographic software written by Eric Young 107 * (eay@cryptsoft.com). This product includes software written by Tim 108 * Hudson (tjh@cryptsoft.com). 109 * 110 */ 111 /* ==================================================================== 112 * Copyright 2005 Nokia. All rights reserved. 113 * 114 * The portions of the attached software ("Contribution") is developed by 115 * Nokia Corporation and is licensed pursuant to the OpenSSL open source 116 * license. 117 * 118 * The Contribution, originally written by Mika Kousa and Pasi Eronen of 119 * Nokia Corporation, consists of the "PSK" (Pre-Shared Key) ciphersuites 120 * support (see RFC 4279) to OpenSSL. 121 * 122 * No patent licenses or other rights except those expressly stated in 123 * the OpenSSL open source license shall be deemed granted or received 124 * expressly, by implication, estoppel, or otherwise. 125 * 126 * No assurances are provided by Nokia that the Contribution does not 127 * infringe the patent or other intellectual property rights of any third 128 * party or that the license provides you with all the necessary rights 129 * to make use of the Contribution. 130 * 131 * THE SOFTWARE IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND. IN 132 * ADDITION TO THE DISCLAIMERS INCLUDED IN THE LICENSE, NOKIA 133 * SPECIFICALLY DISCLAIMS ANY LIABILITY FOR CLAIMS BROUGHT BY YOU OR ANY 134 * OTHER ENTITY BASED ON INFRINGEMENT OF INTELLECTUAL PROPERTY RIGHTS OR 135 * OTHERWISE. 136 */ 137 138 #include <stdio.h> 139 #include <openssl/lhash.h> 140 #include <openssl/rand.h> 141 #ifndef OPENSSL_NO_ENGINE 142 # include <openssl/engine.h> 143 #endif 144 #include "ssl_locl.h" 145 146 static void SSL_SESSION_list_remove(SSL_CTX *ctx, SSL_SESSION *s); 147 static void SSL_SESSION_list_add(SSL_CTX *ctx, SSL_SESSION *s); 148 static int remove_session_lock(SSL_CTX *ctx, SSL_SESSION *c, int lck); 149 150 SSL_SESSION *SSL_get_session(const SSL *ssl) 151 /* aka SSL_get0_session; gets 0 objects, just returns a copy of the pointer */ 152 { 153 return (ssl->session); 154 } 155 156 SSL_SESSION *SSL_get1_session(SSL *ssl) 157 /* variant of SSL_get_session: caller really gets something */ 158 { 159 SSL_SESSION *sess; 160 /* 161 * Need to lock this all up rather than just use CRYPTO_add so that 162 * somebody doesn't free ssl->session between when we check it's non-null 163 * and when we up the reference count. 164 */ 165 CRYPTO_w_lock(CRYPTO_LOCK_SSL_SESSION); 166 sess = ssl->session; 167 if (sess) 168 sess->references++; 169 CRYPTO_w_unlock(CRYPTO_LOCK_SSL_SESSION); 170 return (sess); 171 } 172 173 int SSL_SESSION_get_ex_new_index(long argl, void *argp, 174 CRYPTO_EX_new *new_func, 175 CRYPTO_EX_dup *dup_func, 176 CRYPTO_EX_free *free_func) 177 { 178 return CRYPTO_get_ex_new_index(CRYPTO_EX_INDEX_SSL_SESSION, argl, argp, 179 new_func, dup_func, free_func); 180 } 181 182 int SSL_SESSION_set_ex_data(SSL_SESSION *s, int idx, void *arg) 183 { 184 return (CRYPTO_set_ex_data(&s->ex_data, idx, arg)); 185 } 186 187 void *SSL_SESSION_get_ex_data(const SSL_SESSION *s, int idx) 188 { 189 return (CRYPTO_get_ex_data(&s->ex_data, idx)); 190 } 191 192 SSL_SESSION *SSL_SESSION_new(void) 193 { 194 SSL_SESSION *ss; 195 196 ss = (SSL_SESSION *)OPENSSL_malloc(sizeof(SSL_SESSION)); 197 if (ss == NULL) { 198 SSLerr(SSL_F_SSL_SESSION_NEW, ERR_R_MALLOC_FAILURE); 199 return (0); 200 } 201 memset(ss, 0, sizeof(SSL_SESSION)); 202 203 ss->verify_result = 1; /* avoid 0 (= X509_V_OK) just in case */ 204 ss->references = 1; 205 ss->timeout = 60 * 5 + 4; /* 5 minute timeout by default */ 206 ss->time = (unsigned long)time(NULL); 207 ss->prev = NULL; 208 ss->next = NULL; 209 ss->compress_meth = 0; 210 #ifndef OPENSSL_NO_TLSEXT 211 ss->tlsext_hostname = NULL; 212 # ifndef OPENSSL_NO_EC 213 ss->tlsext_ecpointformatlist_length = 0; 214 ss->tlsext_ecpointformatlist = NULL; 215 ss->tlsext_ellipticcurvelist_length = 0; 216 ss->tlsext_ellipticcurvelist = NULL; 217 # endif 218 #endif 219 CRYPTO_new_ex_data(CRYPTO_EX_INDEX_SSL_SESSION, ss, &ss->ex_data); 220 #ifndef OPENSSL_NO_PSK 221 ss->psk_identity_hint = NULL; 222 ss->psk_identity = NULL; 223 #endif 224 #ifndef OPENSSL_NO_SRP 225 ss->srp_username = NULL; 226 #endif 227 return (ss); 228 } 229 230 const unsigned char *SSL_SESSION_get_id(const SSL_SESSION *s, 231 unsigned int *len) 232 { 233 if (len) 234 *len = s->session_id_length; 235 return s->session_id; 236 } 237 238 unsigned int SSL_SESSION_get_compress_id(const SSL_SESSION *s) 239 { 240 return s->compress_meth; 241 } 242 243 /* 244 * Even with SSLv2, we have 16 bytes (128 bits) of session ID space. 245 * SSLv3/TLSv1 has 32 bytes (256 bits). As such, filling the ID with random 246 * gunk repeatedly until we have no conflict is going to complete in one 247 * iteration pretty much "most" of the time (btw: understatement). So, if it 248 * takes us 10 iterations and we still can't avoid a conflict - well that's a 249 * reasonable point to call it quits. Either the RAND code is broken or 250 * someone is trying to open roughly very close to 2^128 (or 2^256) SSL 251 * sessions to our server. How you might store that many sessions is perhaps 252 * a more interesting question ... 253 */ 254 255 #define MAX_SESS_ID_ATTEMPTS 10 256 static int def_generate_session_id(const SSL *ssl, unsigned char *id, 257 unsigned int *id_len) 258 { 259 unsigned int retry = 0; 260 do 261 if (RAND_pseudo_bytes(id, *id_len) <= 0) 262 return 0; 263 while (SSL_has_matching_session_id(ssl, id, *id_len) && 264 (++retry < MAX_SESS_ID_ATTEMPTS)) ; 265 if (retry < MAX_SESS_ID_ATTEMPTS) 266 return 1; 267 /* else - woops a session_id match */ 268 /* 269 * XXX We should also check the external cache -- but the probability of 270 * a collision is negligible, and we could not prevent the concurrent 271 * creation of sessions with identical IDs since we currently don't have 272 * means to atomically check whether a session ID already exists and make 273 * a reservation for it if it does not (this problem applies to the 274 * internal cache as well). 275 */ 276 return 0; 277 } 278 279 int ssl_get_new_session(SSL *s, int session) 280 { 281 /* This gets used by clients and servers. */ 282 283 unsigned int tmp; 284 SSL_SESSION *ss = NULL; 285 GEN_SESSION_CB cb = def_generate_session_id; 286 287 if ((ss = SSL_SESSION_new()) == NULL) 288 return (0); 289 290 /* If the context has a default timeout, use it */ 291 if (s->session_ctx->session_timeout == 0) 292 ss->timeout = SSL_get_default_timeout(s); 293 else 294 ss->timeout = s->session_ctx->session_timeout; 295 296 if (s->session != NULL) { 297 SSL_SESSION_free(s->session); 298 s->session = NULL; 299 } 300 301 if (session) { 302 if (s->version == SSL2_VERSION) { 303 ss->ssl_version = SSL2_VERSION; 304 ss->session_id_length = SSL2_SSL_SESSION_ID_LENGTH; 305 } else if (s->version == SSL3_VERSION) { 306 ss->ssl_version = SSL3_VERSION; 307 ss->session_id_length = SSL3_SSL_SESSION_ID_LENGTH; 308 } else if (s->version == TLS1_VERSION) { 309 ss->ssl_version = TLS1_VERSION; 310 ss->session_id_length = SSL3_SSL_SESSION_ID_LENGTH; 311 } else if (s->version == TLS1_1_VERSION) { 312 ss->ssl_version = TLS1_1_VERSION; 313 ss->session_id_length = SSL3_SSL_SESSION_ID_LENGTH; 314 } else if (s->version == TLS1_2_VERSION) { 315 ss->ssl_version = TLS1_2_VERSION; 316 ss->session_id_length = SSL3_SSL_SESSION_ID_LENGTH; 317 } else if (s->version == DTLS1_BAD_VER) { 318 ss->ssl_version = DTLS1_BAD_VER; 319 ss->session_id_length = SSL3_SSL_SESSION_ID_LENGTH; 320 } else if (s->version == DTLS1_VERSION) { 321 ss->ssl_version = DTLS1_VERSION; 322 ss->session_id_length = SSL3_SSL_SESSION_ID_LENGTH; 323 } else { 324 SSLerr(SSL_F_SSL_GET_NEW_SESSION, SSL_R_UNSUPPORTED_SSL_VERSION); 325 SSL_SESSION_free(ss); 326 return (0); 327 } 328 #ifndef OPENSSL_NO_TLSEXT 329 /*- 330 * If RFC5077 ticket, use empty session ID (as server). 331 * Note that: 332 * (a) ssl_get_prev_session() does lookahead into the 333 * ClientHello extensions to find the session ticket. 334 * When ssl_get_prev_session() fails, s3_srvr.c calls 335 * ssl_get_new_session() in ssl3_get_client_hello(). 336 * At that point, it has not yet parsed the extensions, 337 * however, because of the lookahead, it already knows 338 * whether a ticket is expected or not. 339 * 340 * (b) s3_clnt.c calls ssl_get_new_session() before parsing 341 * ServerHello extensions, and before recording the session 342 * ID received from the server, so this block is a noop. 343 */ 344 if (s->tlsext_ticket_expected) { 345 ss->session_id_length = 0; 346 goto sess_id_done; 347 } 348 #endif 349 /* Choose which callback will set the session ID */ 350 CRYPTO_r_lock(CRYPTO_LOCK_SSL_CTX); 351 if (s->generate_session_id) 352 cb = s->generate_session_id; 353 else if (s->session_ctx->generate_session_id) 354 cb = s->session_ctx->generate_session_id; 355 CRYPTO_r_unlock(CRYPTO_LOCK_SSL_CTX); 356 /* Choose a session ID */ 357 tmp = ss->session_id_length; 358 if (!cb(s, ss->session_id, &tmp)) { 359 /* The callback failed */ 360 SSLerr(SSL_F_SSL_GET_NEW_SESSION, 361 SSL_R_SSL_SESSION_ID_CALLBACK_FAILED); 362 SSL_SESSION_free(ss); 363 return (0); 364 } 365 /* 366 * Don't allow the callback to set the session length to zero. nor 367 * set it higher than it was. 368 */ 369 if (!tmp || (tmp > ss->session_id_length)) { 370 /* The callback set an illegal length */ 371 SSLerr(SSL_F_SSL_GET_NEW_SESSION, 372 SSL_R_SSL_SESSION_ID_HAS_BAD_LENGTH); 373 SSL_SESSION_free(ss); 374 return (0); 375 } 376 /* If the session length was shrunk and we're SSLv2, pad it */ 377 if ((tmp < ss->session_id_length) && (s->version == SSL2_VERSION)) 378 memset(ss->session_id + tmp, 0, ss->session_id_length - tmp); 379 else 380 ss->session_id_length = tmp; 381 /* Finally, check for a conflict */ 382 if (SSL_has_matching_session_id(s, ss->session_id, 383 ss->session_id_length)) { 384 SSLerr(SSL_F_SSL_GET_NEW_SESSION, SSL_R_SSL_SESSION_ID_CONFLICT); 385 SSL_SESSION_free(ss); 386 return (0); 387 } 388 #ifndef OPENSSL_NO_TLSEXT 389 sess_id_done: 390 if (s->tlsext_hostname) { 391 ss->tlsext_hostname = BUF_strdup(s->tlsext_hostname); 392 if (ss->tlsext_hostname == NULL) { 393 SSLerr(SSL_F_SSL_GET_NEW_SESSION, ERR_R_INTERNAL_ERROR); 394 SSL_SESSION_free(ss); 395 return 0; 396 } 397 } 398 # ifndef OPENSSL_NO_EC 399 if (s->tlsext_ecpointformatlist) { 400 if (ss->tlsext_ecpointformatlist != NULL) 401 OPENSSL_free(ss->tlsext_ecpointformatlist); 402 if ((ss->tlsext_ecpointformatlist = 403 OPENSSL_malloc(s->tlsext_ecpointformatlist_length)) == 404 NULL) { 405 SSLerr(SSL_F_SSL_GET_NEW_SESSION, ERR_R_MALLOC_FAILURE); 406 SSL_SESSION_free(ss); 407 return 0; 408 } 409 ss->tlsext_ecpointformatlist_length = 410 s->tlsext_ecpointformatlist_length; 411 memcpy(ss->tlsext_ecpointformatlist, s->tlsext_ecpointformatlist, 412 s->tlsext_ecpointformatlist_length); 413 } 414 if (s->tlsext_ellipticcurvelist) { 415 if (ss->tlsext_ellipticcurvelist != NULL) 416 OPENSSL_free(ss->tlsext_ellipticcurvelist); 417 if ((ss->tlsext_ellipticcurvelist = 418 OPENSSL_malloc(s->tlsext_ellipticcurvelist_length)) == 419 NULL) { 420 SSLerr(SSL_F_SSL_GET_NEW_SESSION, ERR_R_MALLOC_FAILURE); 421 SSL_SESSION_free(ss); 422 return 0; 423 } 424 ss->tlsext_ellipticcurvelist_length = 425 s->tlsext_ellipticcurvelist_length; 426 memcpy(ss->tlsext_ellipticcurvelist, s->tlsext_ellipticcurvelist, 427 s->tlsext_ellipticcurvelist_length); 428 } 429 # endif 430 #endif 431 } else { 432 ss->session_id_length = 0; 433 } 434 435 if (s->sid_ctx_length > sizeof ss->sid_ctx) { 436 SSLerr(SSL_F_SSL_GET_NEW_SESSION, ERR_R_INTERNAL_ERROR); 437 SSL_SESSION_free(ss); 438 return 0; 439 } 440 memcpy(ss->sid_ctx, s->sid_ctx, s->sid_ctx_length); 441 ss->sid_ctx_length = s->sid_ctx_length; 442 s->session = ss; 443 ss->ssl_version = s->version; 444 ss->verify_result = X509_V_OK; 445 446 return (1); 447 } 448 449 /*- 450 * ssl_get_prev attempts to find an SSL_SESSION to be used to resume this 451 * connection. It is only called by servers. 452 * 453 * session_id: points at the session ID in the ClientHello. This code will 454 * read past the end of this in order to parse out the session ticket 455 * extension, if any. 456 * len: the length of the session ID. 457 * limit: a pointer to the first byte after the ClientHello. 458 * 459 * Returns: 460 * -1: error 461 * 0: a session may have been found. 462 * 463 * Side effects: 464 * - If a session is found then s->session is pointed at it (after freeing an 465 * existing session if need be) and s->verify_result is set from the session. 466 * - Both for new and resumed sessions, s->tlsext_ticket_expected is set to 1 467 * if the server should issue a new session ticket (to 0 otherwise). 468 */ 469 int ssl_get_prev_session(SSL *s, unsigned char *session_id, int len, 470 const unsigned char *limit) 471 { 472 /* This is used only by servers. */ 473 474 SSL_SESSION *ret = NULL; 475 int fatal = 0; 476 int try_session_cache = 1; 477 #ifndef OPENSSL_NO_TLSEXT 478 int r; 479 #endif 480 481 if (len > SSL_MAX_SSL_SESSION_ID_LENGTH) 482 goto err; 483 484 if (len == 0) 485 try_session_cache = 0; 486 487 #ifndef OPENSSL_NO_TLSEXT 488 /* sets s->tlsext_ticket_expected */ 489 r = tls1_process_ticket(s, session_id, len, limit, &ret); 490 switch (r) { 491 case -1: /* Error during processing */ 492 fatal = 1; 493 goto err; 494 case 0: /* No ticket found */ 495 case 1: /* Zero length ticket found */ 496 break; /* Ok to carry on processing session id. */ 497 case 2: /* Ticket found but not decrypted. */ 498 case 3: /* Ticket decrypted, *ret has been set. */ 499 try_session_cache = 0; 500 break; 501 default: 502 abort(); 503 } 504 #endif 505 506 if (try_session_cache && 507 ret == NULL && 508 !(s->session_ctx->session_cache_mode & 509 SSL_SESS_CACHE_NO_INTERNAL_LOOKUP)) { 510 SSL_SESSION data; 511 data.ssl_version = s->version; 512 data.session_id_length = len; 513 if (len == 0) 514 return 0; 515 memcpy(data.session_id, session_id, len); 516 CRYPTO_r_lock(CRYPTO_LOCK_SSL_CTX); 517 ret = lh_SSL_SESSION_retrieve(s->session_ctx->sessions, &data); 518 if (ret != NULL) { 519 /* don't allow other threads to steal it: */ 520 CRYPTO_add(&ret->references, 1, CRYPTO_LOCK_SSL_SESSION); 521 } 522 CRYPTO_r_unlock(CRYPTO_LOCK_SSL_CTX); 523 if (ret == NULL) 524 s->session_ctx->stats.sess_miss++; 525 } 526 527 if (try_session_cache && 528 ret == NULL && s->session_ctx->get_session_cb != NULL) { 529 int copy = 1; 530 531 if ((ret = s->session_ctx->get_session_cb(s, session_id, len, ©))) { 532 s->session_ctx->stats.sess_cb_hit++; 533 534 /* 535 * Increment reference count now if the session callback asks us 536 * to do so (note that if the session structures returned by the 537 * callback are shared between threads, it must handle the 538 * reference count itself [i.e. copy == 0], or things won't be 539 * thread-safe). 540 */ 541 if (copy) 542 CRYPTO_add(&ret->references, 1, CRYPTO_LOCK_SSL_SESSION); 543 544 /* 545 * Add the externally cached session to the internal cache as 546 * well if and only if we are supposed to. 547 */ 548 if (! 549 (s->session_ctx->session_cache_mode & 550 SSL_SESS_CACHE_NO_INTERNAL_STORE)) 551 /* 552 * The following should not return 1, otherwise, things are 553 * very strange 554 */ 555 SSL_CTX_add_session(s->session_ctx, ret); 556 } 557 } 558 559 if (ret == NULL) 560 goto err; 561 562 /* Now ret is non-NULL and we own one of its reference counts. */ 563 564 if (ret->sid_ctx_length != s->sid_ctx_length 565 || memcmp(ret->sid_ctx, s->sid_ctx, ret->sid_ctx_length)) { 566 /* 567 * We have the session requested by the client, but we don't want to 568 * use it in this context. 569 */ 570 goto err; /* treat like cache miss */ 571 } 572 573 if ((s->verify_mode & SSL_VERIFY_PEER) && s->sid_ctx_length == 0) { 574 /* 575 * We can't be sure if this session is being used out of context, 576 * which is especially important for SSL_VERIFY_PEER. The application 577 * should have used SSL[_CTX]_set_session_id_context. For this error 578 * case, we generate an error instead of treating the event like a 579 * cache miss (otherwise it would be easy for applications to 580 * effectively disable the session cache by accident without anyone 581 * noticing). 582 */ 583 584 SSLerr(SSL_F_SSL_GET_PREV_SESSION, 585 SSL_R_SESSION_ID_CONTEXT_UNINITIALIZED); 586 fatal = 1; 587 goto err; 588 } 589 590 if (ret->cipher == NULL) { 591 unsigned char buf[5], *p; 592 unsigned long l; 593 594 p = buf; 595 l = ret->cipher_id; 596 l2n(l, p); 597 if ((ret->ssl_version >> 8) >= SSL3_VERSION_MAJOR) 598 ret->cipher = ssl_get_cipher_by_char(s, &(buf[2])); 599 else 600 ret->cipher = ssl_get_cipher_by_char(s, &(buf[1])); 601 if (ret->cipher == NULL) 602 goto err; 603 } 604 605 if (ret->timeout < (long)(time(NULL) - ret->time)) { /* timeout */ 606 s->session_ctx->stats.sess_timeout++; 607 if (try_session_cache) { 608 /* session was from the cache, so remove it */ 609 SSL_CTX_remove_session(s->session_ctx, ret); 610 } 611 goto err; 612 } 613 614 s->session_ctx->stats.sess_hit++; 615 616 if (s->session != NULL) 617 SSL_SESSION_free(s->session); 618 s->session = ret; 619 s->verify_result = s->session->verify_result; 620 return 1; 621 622 err: 623 if (ret != NULL) { 624 SSL_SESSION_free(ret); 625 #ifndef OPENSSL_NO_TLSEXT 626 if (!try_session_cache) { 627 /* 628 * The session was from a ticket, so we should issue a ticket for 629 * the new session 630 */ 631 s->tlsext_ticket_expected = 1; 632 } 633 #endif 634 } 635 if (fatal) 636 return -1; 637 else 638 return 0; 639 } 640 641 int SSL_CTX_add_session(SSL_CTX *ctx, SSL_SESSION *c) 642 { 643 int ret = 0; 644 SSL_SESSION *s; 645 646 /* 647 * add just 1 reference count for the SSL_CTX's session cache even though 648 * it has two ways of access: each session is in a doubly linked list and 649 * an lhash 650 */ 651 CRYPTO_add(&c->references, 1, CRYPTO_LOCK_SSL_SESSION); 652 /* 653 * if session c is in already in cache, we take back the increment later 654 */ 655 656 CRYPTO_w_lock(CRYPTO_LOCK_SSL_CTX); 657 s = lh_SSL_SESSION_insert(ctx->sessions, c); 658 659 /* 660 * s != NULL iff we already had a session with the given PID. In this 661 * case, s == c should hold (then we did not really modify 662 * ctx->sessions), or we're in trouble. 663 */ 664 if (s != NULL && s != c) { 665 /* We *are* in trouble ... */ 666 SSL_SESSION_list_remove(ctx, s); 667 SSL_SESSION_free(s); 668 /* 669 * ... so pretend the other session did not exist in cache (we cannot 670 * handle two SSL_SESSION structures with identical session ID in the 671 * same cache, which could happen e.g. when two threads concurrently 672 * obtain the same session from an external cache) 673 */ 674 s = NULL; 675 } 676 677 /* Put at the head of the queue unless it is already in the cache */ 678 if (s == NULL) 679 SSL_SESSION_list_add(ctx, c); 680 681 if (s != NULL) { 682 /* 683 * existing cache entry -- decrement previously incremented reference 684 * count because it already takes into account the cache 685 */ 686 687 SSL_SESSION_free(s); /* s == c */ 688 ret = 0; 689 } else { 690 /* 691 * new cache entry -- remove old ones if cache has become too large 692 */ 693 694 ret = 1; 695 696 if (SSL_CTX_sess_get_cache_size(ctx) > 0) { 697 while (SSL_CTX_sess_number(ctx) > 698 SSL_CTX_sess_get_cache_size(ctx)) { 699 if (!remove_session_lock(ctx, ctx->session_cache_tail, 0)) 700 break; 701 else 702 ctx->stats.sess_cache_full++; 703 } 704 } 705 } 706 CRYPTO_w_unlock(CRYPTO_LOCK_SSL_CTX); 707 return (ret); 708 } 709 710 int SSL_CTX_remove_session(SSL_CTX *ctx, SSL_SESSION *c) 711 { 712 return remove_session_lock(ctx, c, 1); 713 } 714 715 static int remove_session_lock(SSL_CTX *ctx, SSL_SESSION *c, int lck) 716 { 717 SSL_SESSION *r; 718 int ret = 0; 719 720 if ((c != NULL) && (c->session_id_length != 0)) { 721 if (lck) 722 CRYPTO_w_lock(CRYPTO_LOCK_SSL_CTX); 723 if ((r = lh_SSL_SESSION_retrieve(ctx->sessions, c)) == c) { 724 ret = 1; 725 r = lh_SSL_SESSION_delete(ctx->sessions, c); 726 SSL_SESSION_list_remove(ctx, c); 727 } 728 729 if (lck) 730 CRYPTO_w_unlock(CRYPTO_LOCK_SSL_CTX); 731 732 if (ret) { 733 r->not_resumable = 1; 734 if (ctx->remove_session_cb != NULL) 735 ctx->remove_session_cb(ctx, r); 736 SSL_SESSION_free(r); 737 } 738 } else 739 ret = 0; 740 return (ret); 741 } 742 743 void SSL_SESSION_free(SSL_SESSION *ss) 744 { 745 int i; 746 747 if (ss == NULL) 748 return; 749 750 i = CRYPTO_add(&ss->references, -1, CRYPTO_LOCK_SSL_SESSION); 751 #ifdef REF_PRINT 752 REF_PRINT("SSL_SESSION", ss); 753 #endif 754 if (i > 0) 755 return; 756 #ifdef REF_CHECK 757 if (i < 0) { 758 fprintf(stderr, "SSL_SESSION_free, bad reference count\n"); 759 abort(); /* ok */ 760 } 761 #endif 762 763 CRYPTO_free_ex_data(CRYPTO_EX_INDEX_SSL_SESSION, ss, &ss->ex_data); 764 765 OPENSSL_cleanse(ss->key_arg, sizeof ss->key_arg); 766 OPENSSL_cleanse(ss->master_key, sizeof ss->master_key); 767 OPENSSL_cleanse(ss->session_id, sizeof ss->session_id); 768 if (ss->sess_cert != NULL) 769 ssl_sess_cert_free(ss->sess_cert); 770 if (ss->peer != NULL) 771 X509_free(ss->peer); 772 if (ss->ciphers != NULL) 773 sk_SSL_CIPHER_free(ss->ciphers); 774 #ifndef OPENSSL_NO_TLSEXT 775 if (ss->tlsext_hostname != NULL) 776 OPENSSL_free(ss->tlsext_hostname); 777 if (ss->tlsext_tick != NULL) 778 OPENSSL_free(ss->tlsext_tick); 779 # ifndef OPENSSL_NO_EC 780 ss->tlsext_ecpointformatlist_length = 0; 781 if (ss->tlsext_ecpointformatlist != NULL) 782 OPENSSL_free(ss->tlsext_ecpointformatlist); 783 ss->tlsext_ellipticcurvelist_length = 0; 784 if (ss->tlsext_ellipticcurvelist != NULL) 785 OPENSSL_free(ss->tlsext_ellipticcurvelist); 786 # endif /* OPENSSL_NO_EC */ 787 #endif 788 #ifndef OPENSSL_NO_PSK 789 if (ss->psk_identity_hint != NULL) 790 OPENSSL_free(ss->psk_identity_hint); 791 if (ss->psk_identity != NULL) 792 OPENSSL_free(ss->psk_identity); 793 #endif 794 #ifndef OPENSSL_NO_SRP 795 if (ss->srp_username != NULL) 796 OPENSSL_free(ss->srp_username); 797 #endif 798 OPENSSL_cleanse(ss, sizeof(*ss)); 799 OPENSSL_free(ss); 800 } 801 802 int SSL_set_session(SSL *s, SSL_SESSION *session) 803 { 804 int ret = 0; 805 const SSL_METHOD *meth; 806 807 if (session != NULL) { 808 meth = s->ctx->method->get_ssl_method(session->ssl_version); 809 if (meth == NULL) 810 meth = s->method->get_ssl_method(session->ssl_version); 811 if (meth == NULL) { 812 SSLerr(SSL_F_SSL_SET_SESSION, SSL_R_UNABLE_TO_FIND_SSL_METHOD); 813 return (0); 814 } 815 816 if (meth != s->method) { 817 if (!SSL_set_ssl_method(s, meth)) 818 return (0); 819 } 820 #ifndef OPENSSL_NO_KRB5 821 if (s->kssl_ctx && !s->kssl_ctx->client_princ && 822 session->krb5_client_princ_len > 0) { 823 s->kssl_ctx->client_princ = 824 (char *)OPENSSL_malloc(session->krb5_client_princ_len + 1); 825 memcpy(s->kssl_ctx->client_princ, session->krb5_client_princ, 826 session->krb5_client_princ_len); 827 s->kssl_ctx->client_princ[session->krb5_client_princ_len] = '\0'; 828 } 829 #endif /* OPENSSL_NO_KRB5 */ 830 831 /* CRYPTO_w_lock(CRYPTO_LOCK_SSL); */ 832 CRYPTO_add(&session->references, 1, CRYPTO_LOCK_SSL_SESSION); 833 if (s->session != NULL) 834 SSL_SESSION_free(s->session); 835 s->session = session; 836 s->verify_result = s->session->verify_result; 837 /* CRYPTO_w_unlock(CRYPTO_LOCK_SSL); */ 838 ret = 1; 839 } else { 840 if (s->session != NULL) { 841 SSL_SESSION_free(s->session); 842 s->session = NULL; 843 } 844 845 meth = s->ctx->method; 846 if (meth != s->method) { 847 if (!SSL_set_ssl_method(s, meth)) 848 return (0); 849 } 850 ret = 1; 851 } 852 return (ret); 853 } 854 855 long SSL_SESSION_set_timeout(SSL_SESSION *s, long t) 856 { 857 if (s == NULL) 858 return (0); 859 s->timeout = t; 860 return (1); 861 } 862 863 long SSL_SESSION_get_timeout(const SSL_SESSION *s) 864 { 865 if (s == NULL) 866 return (0); 867 return (s->timeout); 868 } 869 870 long SSL_SESSION_get_time(const SSL_SESSION *s) 871 { 872 if (s == NULL) 873 return (0); 874 return (s->time); 875 } 876 877 long SSL_SESSION_set_time(SSL_SESSION *s, long t) 878 { 879 if (s == NULL) 880 return (0); 881 s->time = t; 882 return (t); 883 } 884 885 X509 *SSL_SESSION_get0_peer(SSL_SESSION *s) 886 { 887 return s->peer; 888 } 889 890 int SSL_SESSION_set1_id_context(SSL_SESSION *s, const unsigned char *sid_ctx, 891 unsigned int sid_ctx_len) 892 { 893 if (sid_ctx_len > SSL_MAX_SID_CTX_LENGTH) { 894 SSLerr(SSL_F_SSL_SESSION_SET1_ID_CONTEXT, 895 SSL_R_SSL_SESSION_ID_CONTEXT_TOO_LONG); 896 return 0; 897 } 898 s->sid_ctx_length = sid_ctx_len; 899 memcpy(s->sid_ctx, sid_ctx, sid_ctx_len); 900 901 return 1; 902 } 903 904 long SSL_CTX_set_timeout(SSL_CTX *s, long t) 905 { 906 long l; 907 if (s == NULL) 908 return (0); 909 l = s->session_timeout; 910 s->session_timeout = t; 911 return (l); 912 } 913 914 long SSL_CTX_get_timeout(const SSL_CTX *s) 915 { 916 if (s == NULL) 917 return (0); 918 return (s->session_timeout); 919 } 920 921 #ifndef OPENSSL_NO_TLSEXT 922 int SSL_set_session_secret_cb(SSL *s, 923 int (*tls_session_secret_cb) (SSL *s, 924 void *secret, 925 int *secret_len, 926 STACK_OF(SSL_CIPHER) 927 *peer_ciphers, 928 SSL_CIPHER 929 **cipher, 930 void *arg), 931 void *arg) 932 { 933 if (s == NULL) 934 return (0); 935 s->tls_session_secret_cb = tls_session_secret_cb; 936 s->tls_session_secret_cb_arg = arg; 937 return (1); 938 } 939 940 int SSL_set_session_ticket_ext_cb(SSL *s, tls_session_ticket_ext_cb_fn cb, 941 void *arg) 942 { 943 if (s == NULL) 944 return (0); 945 s->tls_session_ticket_ext_cb = cb; 946 s->tls_session_ticket_ext_cb_arg = arg; 947 return (1); 948 } 949 950 int SSL_set_session_ticket_ext(SSL *s, void *ext_data, int ext_len) 951 { 952 if (s->version >= TLS1_VERSION) { 953 if (s->tlsext_session_ticket) { 954 OPENSSL_free(s->tlsext_session_ticket); 955 s->tlsext_session_ticket = NULL; 956 } 957 958 s->tlsext_session_ticket = 959 OPENSSL_malloc(sizeof(TLS_SESSION_TICKET_EXT) + ext_len); 960 if (!s->tlsext_session_ticket) { 961 SSLerr(SSL_F_SSL_SET_SESSION_TICKET_EXT, ERR_R_MALLOC_FAILURE); 962 return 0; 963 } 964 965 if (ext_data) { 966 s->tlsext_session_ticket->length = ext_len; 967 s->tlsext_session_ticket->data = s->tlsext_session_ticket + 1; 968 memcpy(s->tlsext_session_ticket->data, ext_data, ext_len); 969 } else { 970 s->tlsext_session_ticket->length = 0; 971 s->tlsext_session_ticket->data = NULL; 972 } 973 974 return 1; 975 } 976 977 return 0; 978 } 979 #endif /* OPENSSL_NO_TLSEXT */ 980 981 typedef struct timeout_param_st { 982 SSL_CTX *ctx; 983 long time; 984 LHASH_OF(SSL_SESSION) *cache; 985 } TIMEOUT_PARAM; 986 987 static void timeout_doall_arg(SSL_SESSION *s, TIMEOUT_PARAM *p) 988 { 989 if ((p->time == 0) || (p->time > (s->time + s->timeout))) { /* timeout */ 990 /* 991 * The reason we don't call SSL_CTX_remove_session() is to save on 992 * locking overhead 993 */ 994 (void)lh_SSL_SESSION_delete(p->cache, s); 995 SSL_SESSION_list_remove(p->ctx, s); 996 s->not_resumable = 1; 997 if (p->ctx->remove_session_cb != NULL) 998 p->ctx->remove_session_cb(p->ctx, s); 999 SSL_SESSION_free(s); 1000 } 1001 } 1002 1003 static IMPLEMENT_LHASH_DOALL_ARG_FN(timeout, SSL_SESSION, TIMEOUT_PARAM) 1004 1005 void SSL_CTX_flush_sessions(SSL_CTX *s, long t) 1006 { 1007 unsigned long i; 1008 TIMEOUT_PARAM tp; 1009 1010 tp.ctx = s; 1011 tp.cache = s->sessions; 1012 if (tp.cache == NULL) 1013 return; 1014 tp.time = t; 1015 CRYPTO_w_lock(CRYPTO_LOCK_SSL_CTX); 1016 i = CHECKED_LHASH_OF(SSL_SESSION, tp.cache)->down_load; 1017 CHECKED_LHASH_OF(SSL_SESSION, tp.cache)->down_load = 0; 1018 lh_SSL_SESSION_doall_arg(tp.cache, LHASH_DOALL_ARG_FN(timeout), 1019 TIMEOUT_PARAM, &tp); 1020 CHECKED_LHASH_OF(SSL_SESSION, tp.cache)->down_load = i; 1021 CRYPTO_w_unlock(CRYPTO_LOCK_SSL_CTX); 1022 } 1023 1024 int ssl_clear_bad_session(SSL *s) 1025 { 1026 if ((s->session != NULL) && 1027 !(s->shutdown & SSL_SENT_SHUTDOWN) && 1028 !(SSL_in_init(s) || SSL_in_before(s))) { 1029 SSL_CTX_remove_session(s->ctx, s->session); 1030 return (1); 1031 } else 1032 return (0); 1033 } 1034 1035 /* locked by SSL_CTX in the calling function */ 1036 static void SSL_SESSION_list_remove(SSL_CTX *ctx, SSL_SESSION *s) 1037 { 1038 if ((s->next == NULL) || (s->prev == NULL)) 1039 return; 1040 1041 if (s->next == (SSL_SESSION *)&(ctx->session_cache_tail)) { 1042 /* last element in list */ 1043 if (s->prev == (SSL_SESSION *)&(ctx->session_cache_head)) { 1044 /* only one element in list */ 1045 ctx->session_cache_head = NULL; 1046 ctx->session_cache_tail = NULL; 1047 } else { 1048 ctx->session_cache_tail = s->prev; 1049 s->prev->next = (SSL_SESSION *)&(ctx->session_cache_tail); 1050 } 1051 } else { 1052 if (s->prev == (SSL_SESSION *)&(ctx->session_cache_head)) { 1053 /* first element in list */ 1054 ctx->session_cache_head = s->next; 1055 s->next->prev = (SSL_SESSION *)&(ctx->session_cache_head); 1056 } else { 1057 /* middle of list */ 1058 s->next->prev = s->prev; 1059 s->prev->next = s->next; 1060 } 1061 } 1062 s->prev = s->next = NULL; 1063 } 1064 1065 static void SSL_SESSION_list_add(SSL_CTX *ctx, SSL_SESSION *s) 1066 { 1067 if ((s->next != NULL) && (s->prev != NULL)) 1068 SSL_SESSION_list_remove(ctx, s); 1069 1070 if (ctx->session_cache_head == NULL) { 1071 ctx->session_cache_head = s; 1072 ctx->session_cache_tail = s; 1073 s->prev = (SSL_SESSION *)&(ctx->session_cache_head); 1074 s->next = (SSL_SESSION *)&(ctx->session_cache_tail); 1075 } else { 1076 s->next = ctx->session_cache_head; 1077 s->next->prev = s; 1078 s->prev = (SSL_SESSION *)&(ctx->session_cache_head); 1079 ctx->session_cache_head = s; 1080 } 1081 } 1082 1083 void SSL_CTX_sess_set_new_cb(SSL_CTX *ctx, 1084 int (*cb) (struct ssl_st *ssl, 1085 SSL_SESSION *sess)) 1086 { 1087 ctx->new_session_cb = cb; 1088 } 1089 1090 int (*SSL_CTX_sess_get_new_cb(SSL_CTX *ctx)) (SSL *ssl, SSL_SESSION *sess) { 1091 return ctx->new_session_cb; 1092 } 1093 1094 void SSL_CTX_sess_set_remove_cb(SSL_CTX *ctx, 1095 void (*cb) (SSL_CTX *ctx, SSL_SESSION *sess)) 1096 { 1097 ctx->remove_session_cb = cb; 1098 } 1099 1100 void (*SSL_CTX_sess_get_remove_cb(SSL_CTX *ctx)) (SSL_CTX *ctx, 1101 SSL_SESSION *sess) { 1102 return ctx->remove_session_cb; 1103 } 1104 1105 void SSL_CTX_sess_set_get_cb(SSL_CTX *ctx, 1106 SSL_SESSION *(*cb) (struct ssl_st *ssl, 1107 unsigned char *data, int len, 1108 int *copy)) 1109 { 1110 ctx->get_session_cb = cb; 1111 } 1112 1113 SSL_SESSION *(*SSL_CTX_sess_get_get_cb(SSL_CTX *ctx)) (SSL *ssl, 1114 unsigned char *data, 1115 int len, int *copy) { 1116 return ctx->get_session_cb; 1117 } 1118 1119 void SSL_CTX_set_info_callback(SSL_CTX *ctx, 1120 void (*cb) (const SSL *ssl, int type, int val)) 1121 { 1122 ctx->info_callback = cb; 1123 } 1124 1125 void (*SSL_CTX_get_info_callback(SSL_CTX *ctx)) (const SSL *ssl, int type, 1126 int val) { 1127 return ctx->info_callback; 1128 } 1129 1130 void SSL_CTX_set_client_cert_cb(SSL_CTX *ctx, 1131 int (*cb) (SSL *ssl, X509 **x509, 1132 EVP_PKEY **pkey)) 1133 { 1134 ctx->client_cert_cb = cb; 1135 } 1136 1137 int (*SSL_CTX_get_client_cert_cb(SSL_CTX *ctx)) (SSL *ssl, X509 **x509, 1138 EVP_PKEY **pkey) { 1139 return ctx->client_cert_cb; 1140 } 1141 1142 #ifndef OPENSSL_NO_ENGINE 1143 int SSL_CTX_set_client_cert_engine(SSL_CTX *ctx, ENGINE *e) 1144 { 1145 if (!ENGINE_init(e)) { 1146 SSLerr(SSL_F_SSL_CTX_SET_CLIENT_CERT_ENGINE, ERR_R_ENGINE_LIB); 1147 return 0; 1148 } 1149 if (!ENGINE_get_ssl_client_cert_function(e)) { 1150 SSLerr(SSL_F_SSL_CTX_SET_CLIENT_CERT_ENGINE, 1151 SSL_R_NO_CLIENT_CERT_METHOD); 1152 ENGINE_finish(e); 1153 return 0; 1154 } 1155 ctx->client_cert_engine = e; 1156 return 1; 1157 } 1158 #endif 1159 1160 void SSL_CTX_set_cookie_generate_cb(SSL_CTX *ctx, 1161 int (*cb) (SSL *ssl, 1162 unsigned char *cookie, 1163 unsigned int *cookie_len)) 1164 { 1165 ctx->app_gen_cookie_cb = cb; 1166 } 1167 1168 void SSL_CTX_set_cookie_verify_cb(SSL_CTX *ctx, 1169 int (*cb) (SSL *ssl, unsigned char *cookie, 1170 unsigned int cookie_len)) 1171 { 1172 ctx->app_verify_cookie_cb = cb; 1173 } 1174 1175 IMPLEMENT_PEM_rw(SSL_SESSION, SSL_SESSION, PEM_STRING_SSL_SESSION, 1176 SSL_SESSION) 1177