1 /* ssl/t1_lib.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 #include <stdio.h> 60 #include <openssl/objects.h> 61 #include <openssl/evp.h> 62 #include <openssl/hmac.h> 63 #include <openssl/ocsp.h> 64 #include "ssl_locl.h" 65 66 const char tls1_version_str[]="TLSv1" OPENSSL_VERSION_PTEXT; 67 68 #ifndef OPENSSL_NO_TLSEXT 69 static int tls_decrypt_ticket(SSL *s, const unsigned char *tick, int ticklen, 70 const unsigned char *sess_id, int sesslen, 71 SSL_SESSION **psess); 72 #endif 73 74 SSL3_ENC_METHOD TLSv1_enc_data={ 75 tls1_enc, 76 tls1_mac, 77 tls1_setup_key_block, 78 tls1_generate_master_secret, 79 tls1_change_cipher_state, 80 tls1_final_finish_mac, 81 TLS1_FINISH_MAC_LENGTH, 82 tls1_cert_verify_mac, 83 TLS_MD_CLIENT_FINISH_CONST,TLS_MD_CLIENT_FINISH_CONST_SIZE, 84 TLS_MD_SERVER_FINISH_CONST,TLS_MD_SERVER_FINISH_CONST_SIZE, 85 tls1_alert_code, 86 }; 87 88 long tls1_default_timeout(void) 89 { 90 /* 2 hours, the 24 hours mentioned in the TLSv1 spec 91 * is way too long for http, the cache would over fill */ 92 return(60*60*2); 93 } 94 95 IMPLEMENT_tls1_meth_func(tlsv1_base_method, 96 ssl_undefined_function, 97 ssl_undefined_function, 98 ssl_bad_method) 99 100 int tls1_new(SSL *s) 101 { 102 if (!ssl3_new(s)) return(0); 103 s->method->ssl_clear(s); 104 return(1); 105 } 106 107 void tls1_free(SSL *s) 108 { 109 ssl3_free(s); 110 } 111 112 void tls1_clear(SSL *s) 113 { 114 ssl3_clear(s); 115 s->version=TLS1_VERSION; 116 } 117 118 #if 0 119 long tls1_ctrl(SSL *s, int cmd, long larg, char *parg) 120 { 121 return(0); 122 } 123 124 long tls1_callback_ctrl(SSL *s, int cmd, void *(*fp)()) 125 { 126 return(0); 127 } 128 #endif 129 130 #ifndef OPENSSL_NO_TLSEXT 131 unsigned char *ssl_add_clienthello_tlsext(SSL *s, unsigned char *p, unsigned char *limit) 132 { 133 int extdatalen=0; 134 unsigned char *ret = p; 135 136 /* don't add extensions for SSLv3 unless doing secure renegotiation */ 137 if (s->client_version == SSL3_VERSION 138 && !s->s3->send_connection_binding) 139 return p; 140 141 ret+=2; 142 143 if (ret>=limit) return NULL; /* this really never occurs, but ... */ 144 145 if (s->tlsext_hostname != NULL) 146 { 147 /* Add TLS extension servername to the Client Hello message */ 148 unsigned long size_str; 149 long lenmax; 150 151 /* check for enough space. 152 4 for the servername type and entension length 153 2 for servernamelist length 154 1 for the hostname type 155 2 for hostname length 156 + hostname length 157 */ 158 159 if ((lenmax = limit - ret - 9) < 0 160 || (size_str = strlen(s->tlsext_hostname)) > (unsigned long)lenmax) 161 return NULL; 162 163 /* extension type and length */ 164 s2n(TLSEXT_TYPE_server_name,ret); 165 s2n(size_str+5,ret); 166 167 /* length of servername list */ 168 s2n(size_str+3,ret); 169 170 /* hostname type, length and hostname */ 171 *(ret++) = (unsigned char) TLSEXT_NAMETYPE_host_name; 172 s2n(size_str,ret); 173 memcpy(ret, s->tlsext_hostname, size_str); 174 ret+=size_str; 175 176 } 177 178 /* Add RI if renegotiating */ 179 if (s->new_session) 180 { 181 int el; 182 183 if(!ssl_add_clienthello_renegotiate_ext(s, 0, &el, 0)) 184 { 185 SSLerr(SSL_F_SSL_ADD_CLIENTHELLO_TLSEXT, ERR_R_INTERNAL_ERROR); 186 return NULL; 187 } 188 189 if((limit - p - 4 - el) < 0) return NULL; 190 191 s2n(TLSEXT_TYPE_renegotiate,ret); 192 s2n(el,ret); 193 194 if(!ssl_add_clienthello_renegotiate_ext(s, ret, &el, el)) 195 { 196 SSLerr(SSL_F_SSL_ADD_CLIENTHELLO_TLSEXT, ERR_R_INTERNAL_ERROR); 197 return NULL; 198 } 199 200 ret += el; 201 } 202 203 204 if (!(SSL_get_options(s) & SSL_OP_NO_TICKET)) 205 { 206 int ticklen; 207 if (!s->new_session && s->session && s->session->tlsext_tick) 208 ticklen = s->session->tlsext_ticklen; 209 else 210 ticklen = 0; 211 /* Check for enough room 2 for extension type, 2 for len 212 * rest for ticket 213 */ 214 if (limit - ret - 4 - ticklen < 0) 215 return NULL; 216 s2n(TLSEXT_TYPE_session_ticket,ret); 217 s2n(ticklen,ret); 218 if (ticklen) 219 { 220 memcpy(ret, s->session->tlsext_tick, ticklen); 221 ret += ticklen; 222 } 223 } 224 225 if (s->tlsext_status_type == TLSEXT_STATUSTYPE_ocsp && 226 s->version != DTLS1_VERSION) 227 { 228 int i; 229 long extlen, idlen, itmp; 230 OCSP_RESPID *id; 231 232 idlen = 0; 233 for (i = 0; i < sk_OCSP_RESPID_num(s->tlsext_ocsp_ids); i++) 234 { 235 id = sk_OCSP_RESPID_value(s->tlsext_ocsp_ids, i); 236 itmp = i2d_OCSP_RESPID(id, NULL); 237 if (itmp <= 0) 238 return NULL; 239 idlen += itmp + 2; 240 } 241 242 if (s->tlsext_ocsp_exts) 243 { 244 extlen = i2d_X509_EXTENSIONS(s->tlsext_ocsp_exts, NULL); 245 if (extlen < 0) 246 return NULL; 247 } 248 else 249 extlen = 0; 250 251 if ((long)(limit - ret - 7 - extlen - idlen) < 0) return NULL; 252 s2n(TLSEXT_TYPE_status_request, ret); 253 if (extlen + idlen > 0xFFF0) 254 return NULL; 255 s2n(extlen + idlen + 5, ret); 256 *(ret++) = TLSEXT_STATUSTYPE_ocsp; 257 s2n(idlen, ret); 258 for (i = 0; i < sk_OCSP_RESPID_num(s->tlsext_ocsp_ids); i++) 259 { 260 /* save position of id len */ 261 unsigned char *q = ret; 262 id = sk_OCSP_RESPID_value(s->tlsext_ocsp_ids, i); 263 /* skip over id len */ 264 ret += 2; 265 itmp = i2d_OCSP_RESPID(id, &ret); 266 /* write id len */ 267 s2n(itmp, q); 268 } 269 s2n(extlen, ret); 270 if (extlen > 0) 271 i2d_X509_EXTENSIONS(s->tlsext_ocsp_exts, &ret); 272 } 273 274 if ((extdatalen = ret-p-2)== 0) 275 return p; 276 277 s2n(extdatalen,p); 278 return ret; 279 } 280 281 unsigned char *ssl_add_serverhello_tlsext(SSL *s, unsigned char *p, unsigned char *limit) 282 { 283 int extdatalen=0; 284 unsigned char *ret = p; 285 286 /* don't add extensions for SSLv3, unless doing secure renegotiation */ 287 if (s->version == SSL3_VERSION && !s->s3->send_connection_binding) 288 return p; 289 290 ret+=2; 291 if (ret>=limit) return NULL; /* this really never occurs, but ... */ 292 293 if (!s->hit && s->servername_done == 1 && s->session->tlsext_hostname != NULL) 294 { 295 if (limit - ret - 4 < 0) return NULL; 296 297 s2n(TLSEXT_TYPE_server_name,ret); 298 s2n(0,ret); 299 } 300 301 if(s->s3->send_connection_binding) 302 { 303 int el; 304 305 if(!ssl_add_serverhello_renegotiate_ext(s, 0, &el, 0)) 306 { 307 SSLerr(SSL_F_SSL_ADD_SERVERHELLO_TLSEXT, ERR_R_INTERNAL_ERROR); 308 return NULL; 309 } 310 311 if((limit - p - 4 - el) < 0) return NULL; 312 313 s2n(TLSEXT_TYPE_renegotiate,ret); 314 s2n(el,ret); 315 316 if(!ssl_add_serverhello_renegotiate_ext(s, ret, &el, el)) 317 { 318 SSLerr(SSL_F_SSL_ADD_SERVERHELLO_TLSEXT, ERR_R_INTERNAL_ERROR); 319 return NULL; 320 } 321 322 ret += el; 323 } 324 325 if (s->tlsext_ticket_expected 326 && !(SSL_get_options(s) & SSL_OP_NO_TICKET)) 327 { 328 if (limit - ret - 4 < 0) return NULL; 329 s2n(TLSEXT_TYPE_session_ticket,ret); 330 s2n(0,ret); 331 } 332 333 if (s->tlsext_status_expected) 334 { 335 if ((long)(limit - ret - 4) < 0) return NULL; 336 s2n(TLSEXT_TYPE_status_request,ret); 337 s2n(0,ret); 338 } 339 340 if ((extdatalen = ret-p-2)== 0) 341 return p; 342 343 s2n(extdatalen,p); 344 return ret; 345 } 346 347 int ssl_parse_clienthello_tlsext(SSL *s, unsigned char **p, unsigned char *d, int n, int *al) 348 { 349 unsigned short type; 350 unsigned short size; 351 unsigned short len; 352 unsigned char *data = *p; 353 int renegotiate_seen = 0; 354 355 s->servername_done = 0; 356 s->tlsext_status_type = -1; 357 358 if (data >= (d+n-2)) 359 goto ri_check; 360 361 n2s(data,len); 362 363 if (data > (d+n-len)) 364 goto ri_check; 365 366 while (data <= (d+n-4)) 367 { 368 n2s(data,type); 369 n2s(data,size); 370 371 if (data+size > (d+n)) 372 goto ri_check; 373 374 if (s->tlsext_debug_cb) 375 s->tlsext_debug_cb(s, 0, type, data, size, 376 s->tlsext_debug_arg); 377 /* The servername extension is treated as follows: 378 379 - Only the hostname type is supported with a maximum length of 255. 380 - The servername is rejected if too long or if it contains zeros, 381 in which case an fatal alert is generated. 382 - The servername field is maintained together with the session cache. 383 - When a session is resumed, the servername call back invoked in order 384 to allow the application to position itself to the right context. 385 - The servername is acknowledged if it is new for a session or when 386 it is identical to a previously used for the same session. 387 Applications can control the behaviour. They can at any time 388 set a 'desirable' servername for a new SSL object. This can be the 389 case for example with HTTPS when a Host: header field is received and 390 a renegotiation is requested. In this case, a possible servername 391 presented in the new client hello is only acknowledged if it matches 392 the value of the Host: field. 393 - Applications must use SSL_OP_NO_SESSION_RESUMPTION_ON_RENEGOTIATION 394 if they provide for changing an explicit servername context for the session, 395 i.e. when the session has been established with a servername extension. 396 - On session reconnect, the servername extension may be absent. 397 398 */ 399 400 if (type == TLSEXT_TYPE_server_name) 401 { 402 unsigned char *sdata; 403 int servname_type; 404 int dsize; 405 406 if (size < 2) 407 { 408 *al = SSL_AD_DECODE_ERROR; 409 return 0; 410 } 411 n2s(data,dsize); 412 size -= 2; 413 if (dsize > size ) 414 { 415 *al = SSL_AD_DECODE_ERROR; 416 return 0; 417 } 418 419 sdata = data; 420 while (dsize > 3) 421 { 422 servname_type = *(sdata++); 423 n2s(sdata,len); 424 dsize -= 3; 425 426 if (len > dsize) 427 { 428 *al = SSL_AD_DECODE_ERROR; 429 return 0; 430 } 431 if (s->servername_done == 0) 432 switch (servname_type) 433 { 434 case TLSEXT_NAMETYPE_host_name: 435 if (s->session->tlsext_hostname == NULL) 436 { 437 if (len > TLSEXT_MAXLEN_host_name || 438 ((s->session->tlsext_hostname = OPENSSL_malloc(len+1)) == NULL)) 439 { 440 *al = TLS1_AD_UNRECOGNIZED_NAME; 441 return 0; 442 } 443 memcpy(s->session->tlsext_hostname, sdata, len); 444 s->session->tlsext_hostname[len]='\0'; 445 if (strlen(s->session->tlsext_hostname) != len) { 446 OPENSSL_free(s->session->tlsext_hostname); 447 s->session->tlsext_hostname = NULL; 448 *al = TLS1_AD_UNRECOGNIZED_NAME; 449 return 0; 450 } 451 s->servername_done = 1; 452 453 } 454 else 455 s->servername_done = strlen(s->session->tlsext_hostname) == len 456 && strncmp(s->session->tlsext_hostname, (char *)sdata, len) == 0; 457 458 break; 459 460 default: 461 break; 462 } 463 464 dsize -= len; 465 } 466 if (dsize != 0) 467 { 468 *al = SSL_AD_DECODE_ERROR; 469 return 0; 470 } 471 472 } 473 else if (type == TLSEXT_TYPE_renegotiate) 474 { 475 if(!ssl_parse_clienthello_renegotiate_ext(s, data, size, al)) 476 return 0; 477 renegotiate_seen = 1; 478 } 479 else if (type == TLSEXT_TYPE_status_request && 480 s->version != DTLS1_VERSION && s->ctx->tlsext_status_cb) 481 { 482 483 if (size < 5) 484 { 485 *al = SSL_AD_DECODE_ERROR; 486 return 0; 487 } 488 489 s->tlsext_status_type = *data++; 490 size--; 491 if (s->tlsext_status_type == TLSEXT_STATUSTYPE_ocsp) 492 { 493 const unsigned char *sdata; 494 int dsize; 495 /* Read in responder_id_list */ 496 n2s(data,dsize); 497 size -= 2; 498 if (dsize > size ) 499 { 500 *al = SSL_AD_DECODE_ERROR; 501 return 0; 502 } 503 while (dsize > 0) 504 { 505 OCSP_RESPID *id; 506 int idsize; 507 if (dsize < 4) 508 { 509 *al = SSL_AD_DECODE_ERROR; 510 return 0; 511 } 512 n2s(data, idsize); 513 dsize -= 2 + idsize; 514 if (dsize < 0) 515 { 516 *al = SSL_AD_DECODE_ERROR; 517 return 0; 518 } 519 sdata = data; 520 data += idsize; 521 id = d2i_OCSP_RESPID(NULL, 522 &sdata, idsize); 523 if (!id) 524 { 525 *al = SSL_AD_DECODE_ERROR; 526 return 0; 527 } 528 if (data != sdata) 529 { 530 OCSP_RESPID_free(id); 531 *al = SSL_AD_DECODE_ERROR; 532 return 0; 533 } 534 if (!s->tlsext_ocsp_ids 535 && !(s->tlsext_ocsp_ids = 536 sk_OCSP_RESPID_new_null())) 537 { 538 OCSP_RESPID_free(id); 539 *al = SSL_AD_INTERNAL_ERROR; 540 return 0; 541 } 542 if (!sk_OCSP_RESPID_push( 543 s->tlsext_ocsp_ids, id)) 544 { 545 OCSP_RESPID_free(id); 546 *al = SSL_AD_INTERNAL_ERROR; 547 return 0; 548 } 549 } 550 551 /* Read in request_extensions */ 552 n2s(data,dsize); 553 size -= 2; 554 if (dsize > size) 555 { 556 *al = SSL_AD_DECODE_ERROR; 557 return 0; 558 } 559 sdata = data; 560 if (dsize > 0) 561 { 562 s->tlsext_ocsp_exts = 563 d2i_X509_EXTENSIONS(NULL, 564 &sdata, dsize); 565 if (!s->tlsext_ocsp_exts 566 || (data + dsize != sdata)) 567 { 568 *al = SSL_AD_DECODE_ERROR; 569 return 0; 570 } 571 } 572 } 573 /* We don't know what to do with any other type 574 * so ignore it. 575 */ 576 else 577 s->tlsext_status_type = -1; 578 } 579 580 /* session ticket processed earlier */ 581 582 data+=size; 583 } 584 *p = data; 585 586 ri_check: 587 588 /* Need RI if renegotiating */ 589 590 if (!renegotiate_seen && s->new_session && 591 !(s->options & SSL_OP_ALLOW_UNSAFE_LEGACY_RENEGOTIATION)) 592 { 593 *al = SSL_AD_HANDSHAKE_FAILURE; 594 SSLerr(SSL_F_SSL_PARSE_CLIENTHELLO_TLSEXT, 595 SSL_R_UNSAFE_LEGACY_RENEGOTIATION_DISABLED); 596 return 0; 597 } 598 599 return 1; 600 } 601 602 int ssl_parse_serverhello_tlsext(SSL *s, unsigned char **p, unsigned char *d, int n, int *al) 603 { 604 unsigned short type; 605 unsigned short size; 606 unsigned short len; 607 unsigned char *data = *p; 608 int tlsext_servername = 0; 609 int renegotiate_seen = 0; 610 611 if (data >= (d+n-2)) 612 goto ri_check; 613 614 n2s(data,len); 615 616 while(data <= (d+n-4)) 617 { 618 n2s(data,type); 619 n2s(data,size); 620 621 if (data+size > (d+n)) 622 goto ri_check; 623 624 if (s->tlsext_debug_cb) 625 s->tlsext_debug_cb(s, 1, type, data, size, 626 s->tlsext_debug_arg); 627 628 if (type == TLSEXT_TYPE_server_name) 629 { 630 if (s->tlsext_hostname == NULL || size > 0) 631 { 632 *al = TLS1_AD_UNRECOGNIZED_NAME; 633 return 0; 634 } 635 tlsext_servername = 1; 636 } 637 else if (type == TLSEXT_TYPE_session_ticket) 638 { 639 if ((SSL_get_options(s) & SSL_OP_NO_TICKET) 640 || (size > 0)) 641 { 642 *al = TLS1_AD_UNSUPPORTED_EXTENSION; 643 return 0; 644 } 645 s->tlsext_ticket_expected = 1; 646 } 647 else if (type == TLSEXT_TYPE_status_request && 648 s->version != DTLS1_VERSION) 649 { 650 /* MUST be empty and only sent if we've requested 651 * a status request message. 652 */ 653 if ((s->tlsext_status_type == -1) || (size > 0)) 654 { 655 *al = TLS1_AD_UNSUPPORTED_EXTENSION; 656 return 0; 657 } 658 /* Set flag to expect CertificateStatus message */ 659 s->tlsext_status_expected = 1; 660 } 661 else if (type == TLSEXT_TYPE_renegotiate) 662 { 663 if(!ssl_parse_serverhello_renegotiate_ext(s, data, size, al)) 664 return 0; 665 renegotiate_seen = 1; 666 } 667 data+=size; 668 } 669 670 if (data != d+n) 671 { 672 *al = SSL_AD_DECODE_ERROR; 673 return 0; 674 } 675 676 if (!s->hit && tlsext_servername == 1) 677 { 678 if (s->tlsext_hostname) 679 { 680 if (s->session->tlsext_hostname == NULL) 681 { 682 s->session->tlsext_hostname = BUF_strdup(s->tlsext_hostname); 683 if (!s->session->tlsext_hostname) 684 { 685 *al = SSL_AD_UNRECOGNIZED_NAME; 686 return 0; 687 } 688 } 689 else 690 { 691 *al = SSL_AD_DECODE_ERROR; 692 return 0; 693 } 694 } 695 } 696 697 *p = data; 698 699 ri_check: 700 701 /* Determine if we need to see RI. Strictly speaking if we want to 702 * avoid an attack we should *always* see RI even on initial server 703 * hello because the client doesn't see any renegotiation during an 704 * attack. However this would mean we could not connect to any server 705 * which doesn't support RI so for the immediate future tolerate RI 706 * absence on initial connect only. 707 */ 708 if (!renegotiate_seen 709 && !(s->options & SSL_OP_LEGACY_SERVER_CONNECT) 710 && !(s->options & SSL_OP_ALLOW_UNSAFE_LEGACY_RENEGOTIATION)) 711 { 712 *al = SSL_AD_HANDSHAKE_FAILURE; 713 SSLerr(SSL_F_SSL_PARSE_SERVERHELLO_TLSEXT, 714 SSL_R_UNSAFE_LEGACY_RENEGOTIATION_DISABLED); 715 return 0; 716 } 717 718 return 1; 719 } 720 721 int ssl_check_clienthello_tlsext(SSL *s) 722 { 723 int ret=SSL_TLSEXT_ERR_NOACK; 724 int al = SSL_AD_UNRECOGNIZED_NAME; 725 726 if (s->ctx != NULL && s->ctx->tlsext_servername_callback != 0) 727 ret = s->ctx->tlsext_servername_callback(s, &al, s->ctx->tlsext_servername_arg); 728 else if (s->initial_ctx != NULL && s->initial_ctx->tlsext_servername_callback != 0) 729 ret = s->initial_ctx->tlsext_servername_callback(s, &al, s->initial_ctx->tlsext_servername_arg); 730 731 /* If status request then ask callback what to do. 732 * Note: this must be called after servername callbacks in case 733 * the certificate has changed. 734 */ 735 if ((s->tlsext_status_type != -1) && s->ctx->tlsext_status_cb) 736 { 737 int r; 738 r = s->ctx->tlsext_status_cb(s, s->ctx->tlsext_status_arg); 739 switch (r) 740 { 741 /* We don't want to send a status request response */ 742 case SSL_TLSEXT_ERR_NOACK: 743 s->tlsext_status_expected = 0; 744 break; 745 /* status request response should be sent */ 746 case SSL_TLSEXT_ERR_OK: 747 if (s->tlsext_ocsp_resp) 748 s->tlsext_status_expected = 1; 749 else 750 s->tlsext_status_expected = 0; 751 break; 752 /* something bad happened */ 753 case SSL_TLSEXT_ERR_ALERT_FATAL: 754 ret = SSL_TLSEXT_ERR_ALERT_FATAL; 755 al = SSL_AD_INTERNAL_ERROR; 756 goto err; 757 } 758 } 759 else 760 s->tlsext_status_expected = 0; 761 err: 762 switch (ret) 763 { 764 case SSL_TLSEXT_ERR_ALERT_FATAL: 765 ssl3_send_alert(s,SSL3_AL_FATAL,al); 766 return -1; 767 768 case SSL_TLSEXT_ERR_ALERT_WARNING: 769 ssl3_send_alert(s,SSL3_AL_WARNING,al); 770 return 1; 771 772 case SSL_TLSEXT_ERR_NOACK: 773 s->servername_done=0; 774 default: 775 return 1; 776 } 777 } 778 779 int ssl_check_serverhello_tlsext(SSL *s) 780 { 781 int ret=SSL_TLSEXT_ERR_NOACK; 782 int al = SSL_AD_UNRECOGNIZED_NAME; 783 784 if (s->ctx != NULL && s->ctx->tlsext_servername_callback != 0) 785 ret = s->ctx->tlsext_servername_callback(s, &al, s->ctx->tlsext_servername_arg); 786 else if (s->initial_ctx != NULL && s->initial_ctx->tlsext_servername_callback != 0) 787 ret = s->initial_ctx->tlsext_servername_callback(s, &al, s->initial_ctx->tlsext_servername_arg); 788 789 /* If we've requested certificate status and we wont get one 790 * tell the callback 791 */ 792 if ((s->tlsext_status_type != -1) && !(s->tlsext_status_expected) 793 && s->ctx->tlsext_status_cb) 794 { 795 int r; 796 /* Set resp to NULL, resplen to -1 so callback knows 797 * there is no response. 798 */ 799 if (s->tlsext_ocsp_resp) 800 { 801 OPENSSL_free(s->tlsext_ocsp_resp); 802 s->tlsext_ocsp_resp = NULL; 803 } 804 s->tlsext_ocsp_resplen = -1; 805 r = s->ctx->tlsext_status_cb(s, s->ctx->tlsext_status_arg); 806 if (r == 0) 807 { 808 al = SSL_AD_BAD_CERTIFICATE_STATUS_RESPONSE; 809 ret = SSL_TLSEXT_ERR_ALERT_FATAL; 810 } 811 if (r < 0) 812 { 813 al = SSL_AD_INTERNAL_ERROR; 814 ret = SSL_TLSEXT_ERR_ALERT_FATAL; 815 } 816 } 817 818 switch (ret) 819 { 820 case SSL_TLSEXT_ERR_ALERT_FATAL: 821 ssl3_send_alert(s,SSL3_AL_FATAL,al); 822 return -1; 823 824 case SSL_TLSEXT_ERR_ALERT_WARNING: 825 ssl3_send_alert(s,SSL3_AL_WARNING,al); 826 return 1; 827 828 case SSL_TLSEXT_ERR_NOACK: 829 s->servername_done=0; 830 default: 831 return 1; 832 } 833 } 834 835 /* Since the server cache lookup is done early on in the processing of client 836 * hello and other operations depend on the result we need to handle any TLS 837 * session ticket extension at the same time. 838 */ 839 840 int tls1_process_ticket(SSL *s, unsigned char *session_id, int len, 841 const unsigned char *limit, SSL_SESSION **ret) 842 { 843 /* Point after session ID in client hello */ 844 const unsigned char *p = session_id + len; 845 unsigned short i; 846 847 /* If tickets disabled behave as if no ticket present 848 * to permit stateful resumption. 849 */ 850 if (SSL_get_options(s) & SSL_OP_NO_TICKET) 851 return 1; 852 853 if ((s->version <= SSL3_VERSION) || !limit) 854 return 1; 855 if (p >= limit) 856 return -1; 857 /* Skip past DTLS cookie */ 858 if (s->version == DTLS1_VERSION || s->version == DTLS1_BAD_VER) 859 { 860 i = *(p++); 861 p+= i; 862 if (p >= limit) 863 return -1; 864 } 865 /* Skip past cipher list */ 866 n2s(p, i); 867 p+= i; 868 if (p >= limit) 869 return -1; 870 /* Skip past compression algorithm list */ 871 i = *(p++); 872 p += i; 873 if (p > limit) 874 return -1; 875 /* Now at start of extensions */ 876 if ((p + 2) >= limit) 877 return 1; 878 n2s(p, i); 879 while ((p + 4) <= limit) 880 { 881 unsigned short type, size; 882 n2s(p, type); 883 n2s(p, size); 884 if (p + size > limit) 885 return 1; 886 if (type == TLSEXT_TYPE_session_ticket) 887 { 888 /* If zero length note client will accept a ticket 889 * and indicate cache miss to trigger full handshake 890 */ 891 if (size == 0) 892 { 893 s->tlsext_ticket_expected = 1; 894 return 0; /* Cache miss */ 895 } 896 return tls_decrypt_ticket(s, p, size, session_id, len, 897 ret); 898 } 899 p += size; 900 } 901 return 1; 902 } 903 904 static int tls_decrypt_ticket(SSL *s, const unsigned char *etick, int eticklen, 905 const unsigned char *sess_id, int sesslen, 906 SSL_SESSION **psess) 907 { 908 SSL_SESSION *sess; 909 unsigned char *sdec; 910 const unsigned char *p; 911 int slen, mlen, renew_ticket = 0; 912 unsigned char tick_hmac[EVP_MAX_MD_SIZE]; 913 HMAC_CTX hctx; 914 EVP_CIPHER_CTX ctx; 915 SSL_CTX *tctx = s->initial_ctx; 916 /* Need at least keyname + iv + some encrypted data */ 917 if (eticklen < 48) 918 goto tickerr; 919 /* Initialize session ticket encryption and HMAC contexts */ 920 HMAC_CTX_init(&hctx); 921 EVP_CIPHER_CTX_init(&ctx); 922 if (tctx->tlsext_ticket_key_cb) 923 { 924 unsigned char *nctick = (unsigned char *)etick; 925 int rv = tctx->tlsext_ticket_key_cb(s, nctick, nctick + 16, 926 &ctx, &hctx, 0); 927 if (rv < 0) 928 return -1; 929 if (rv == 0) 930 goto tickerr; 931 if (rv == 2) 932 renew_ticket = 1; 933 } 934 else 935 { 936 /* Check key name matches */ 937 if (memcmp(etick, tctx->tlsext_tick_key_name, 16)) 938 goto tickerr; 939 HMAC_Init_ex(&hctx, tctx->tlsext_tick_hmac_key, 16, 940 tlsext_tick_md(), NULL); 941 EVP_DecryptInit_ex(&ctx, EVP_aes_128_cbc(), NULL, 942 tctx->tlsext_tick_aes_key, etick + 16); 943 } 944 /* Attempt to process session ticket, first conduct sanity and 945 * integrity checks on ticket. 946 */ 947 mlen = HMAC_size(&hctx); 948 eticklen -= mlen; 949 /* Check HMAC of encrypted ticket */ 950 HMAC_Update(&hctx, etick, eticklen); 951 HMAC_Final(&hctx, tick_hmac, NULL); 952 HMAC_CTX_cleanup(&hctx); 953 if (memcmp(tick_hmac, etick + eticklen, mlen)) 954 goto tickerr; 955 /* Attempt to decrypt session data */ 956 /* Move p after IV to start of encrypted ticket, update length */ 957 p = etick + 16 + EVP_CIPHER_CTX_iv_length(&ctx); 958 eticklen -= 16 + EVP_CIPHER_CTX_iv_length(&ctx); 959 sdec = OPENSSL_malloc(eticklen); 960 if (!sdec) 961 { 962 EVP_CIPHER_CTX_cleanup(&ctx); 963 return -1; 964 } 965 EVP_DecryptUpdate(&ctx, sdec, &slen, p, eticklen); 966 if (EVP_DecryptFinal(&ctx, sdec + slen, &mlen) <= 0) 967 goto tickerr; 968 slen += mlen; 969 EVP_CIPHER_CTX_cleanup(&ctx); 970 p = sdec; 971 972 sess = d2i_SSL_SESSION(NULL, &p, slen); 973 OPENSSL_free(sdec); 974 if (sess) 975 { 976 /* The session ID if non-empty is used by some clients to 977 * detect that the ticket has been accepted. So we copy it to 978 * the session structure. If it is empty set length to zero 979 * as required by standard. 980 */ 981 if (sesslen) 982 memcpy(sess->session_id, sess_id, sesslen); 983 sess->session_id_length = sesslen; 984 *psess = sess; 985 s->tlsext_ticket_expected = renew_ticket; 986 return 1; 987 } 988 /* If session decrypt failure indicate a cache miss and set state to 989 * send a new ticket 990 */ 991 tickerr: 992 s->tlsext_ticket_expected = 1; 993 return 0; 994 } 995 996 #endif 997