1 /* ssl/s23_clnt.c */
   2 /* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
   3  * All rights reserved.
   4  *
   5  * This package is an SSL implementation written
   6  * by Eric Young (eay@cryptsoft.com).
   7  * The implementation was written so as to conform with Netscapes SSL.
   8  *
   9  * This library is free for commercial and non-commercial use as long as
  10  * the following conditions are aheared to.  The following conditions
  11  * apply to all code found in this distribution, be it the RC4, RSA,
  12  * lhash, DES, etc., code; not just the SSL code.  The SSL documentation
  13  * included with this distribution is covered by the same copyright terms
  14  * except that the holder is Tim Hudson (tjh@cryptsoft.com).
  15  *
  16  * Copyright remains Eric Young's, and as such any Copyright notices in
  17  * the code are not to be removed.
  18  * If this package is used in a product, Eric Young should be given attribution
  19  * as the author of the parts of the library used.
  20  * This can be in the form of a textual message at program startup or
  21  * in documentation (online or textual) provided with the package.
  22  *
  23  * Redistribution and use in source and binary forms, with or without
  24  * modification, are permitted provided that the following conditions
  25  * are met:
  26  * 1. Redistributions of source code must retain the copyright
  27  *    notice, this list of conditions and the following disclaimer.
  28  * 2. Redistributions in binary form must reproduce the above copyright
  29  *    notice, this list of conditions and the following disclaimer in the
  30  *    documentation and/or other materials provided with the distribution.
  31  * 3. All advertising materials mentioning features or use of this software
  32  *    must display the following acknowledgement:
  33  *    "This product includes cryptographic software written by
  34  *     Eric Young (eay@cryptsoft.com)"
  35  *    The word 'cryptographic' can be left out if the rouines from the library
  36  *    being used are not cryptographic related :-).
  37  * 4. If you include any Windows specific code (or a derivative thereof) from
  38  *    the apps directory (application code) you must include an acknowledgement:
  39  *    "This product includes software written by Tim Hudson (tjh@cryptsoft.com)"
  40  *
  41  * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND
  42  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
  43  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
  44  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
  45  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
  46  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
  47  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
  48  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
  49  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
  50  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  51  * SUCH DAMAGE.
  52  *
  53  * The licence and distribution terms for any publically available version or
  54  * derivative of this code cannot be changed.  i.e. this code cannot simply be
  55  * copied and put under another distribution licence
  56  * [including the GNU Public Licence.]
  57  */
  58 /* ====================================================================
  59  * Copyright (c) 1998-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 #include <stdio.h>
 113 #include "ssl_locl.h"
 114 #include <openssl/buffer.h>
 115 #include <openssl/rand.h>
 116 #include <openssl/objects.h>
 117 #include <openssl/evp.h>
 118 
 119 static const SSL_METHOD *ssl23_get_client_method(int ver);
 120 static int ssl23_client_hello(SSL *s);
 121 static int ssl23_get_server_hello(SSL *s);
 122 static const SSL_METHOD *ssl23_get_client_method(int ver)
 123         {
 124 #ifndef OPENSSL_NO_SSL2
 125         if (ver == SSL2_VERSION)
 126                 return(SSLv2_client_method());
 127 #endif
 128         if (ver == SSL3_VERSION)
 129                 return(SSLv3_client_method());
 130         else if (ver == TLS1_VERSION)
 131                 return(TLSv1_client_method());
 132         else if (ver == TLS1_1_VERSION)
 133                 return(TLSv1_1_client_method());
 134         else if (ver == TLS1_2_VERSION)
 135                 return(TLSv1_2_client_method());
 136         else
 137                 return(NULL);
 138         }
 139 
 140 IMPLEMENT_ssl23_meth_func(SSLv23_client_method,
 141                         ssl_undefined_function,
 142                         ssl23_connect,
 143                         ssl23_get_client_method)
 144 
 145 int ssl23_connect(SSL *s)
 146         {
 147         BUF_MEM *buf=NULL;
 148         unsigned long Time=(unsigned long)time(NULL);
 149         void (*cb)(const SSL *ssl,int type,int val)=NULL;
 150         int ret= -1;
 151         int new_state,state;
 152 
 153         RAND_add(&Time,sizeof(Time),0);
 154         ERR_clear_error();
 155         clear_sys_error();
 156 
 157         if (s->info_callback != NULL)
 158                 cb=s->info_callback;
 159         else if (s->ctx->info_callback != NULL)
 160                 cb=s->ctx->info_callback;
 161 
 162         s->in_handshake++;
 163         if (!SSL_in_init(s) || SSL_in_before(s)) SSL_clear(s);
 164 
 165         for (;;)
 166                 {
 167                 state=s->state;
 168 
 169                 switch(s->state)
 170                         {
 171                 case SSL_ST_BEFORE:
 172                 case SSL_ST_CONNECT:
 173                 case SSL_ST_BEFORE|SSL_ST_CONNECT:
 174                 case SSL_ST_OK|SSL_ST_CONNECT:
 175 
 176                         if (s->session != NULL)
 177                                 {
 178                                 SSLerr(SSL_F_SSL23_CONNECT,SSL_R_SSL23_DOING_SESSION_ID_REUSE);
 179                                 ret= -1;
 180                                 goto end;
 181                                 }
 182                         s->server=0;
 183                         if (cb != NULL) cb(s,SSL_CB_HANDSHAKE_START,1);
 184 
 185                         /* s->version=TLS1_VERSION; */
 186                         s->type=SSL_ST_CONNECT;
 187 
 188                         if (s->init_buf == NULL)
 189                                 {
 190                                 if ((buf=BUF_MEM_new()) == NULL)
 191                                         {
 192                                         ret= -1;
 193                                         goto end;
 194                                         }
 195                                 if (!BUF_MEM_grow(buf,SSL3_RT_MAX_PLAIN_LENGTH))
 196                                         {
 197                                         ret= -1;
 198                                         goto end;
 199                                         }
 200                                 s->init_buf=buf;
 201                                 buf=NULL;
 202                                 }
 203 
 204                         if (!ssl3_setup_buffers(s)) { ret= -1; goto end; }
 205 
 206                         ssl3_init_finished_mac(s);
 207 
 208                         s->state=SSL23_ST_CW_CLNT_HELLO_A;
 209                         s->ctx->stats.sess_connect++;
 210                         s->init_num=0;
 211                         break;
 212 
 213                 case SSL23_ST_CW_CLNT_HELLO_A:
 214                 case SSL23_ST_CW_CLNT_HELLO_B:
 215 
 216                         s->shutdown=0;
 217                         ret=ssl23_client_hello(s);
 218                         if (ret <= 0) goto end;
 219                         s->state=SSL23_ST_CR_SRVR_HELLO_A;
 220                         s->init_num=0;
 221 
 222                         break;
 223 
 224                 case SSL23_ST_CR_SRVR_HELLO_A:
 225                 case SSL23_ST_CR_SRVR_HELLO_B:
 226                         ret=ssl23_get_server_hello(s);
 227                         if (ret >= 0) cb=NULL;
 228                         goto end;
 229                         /* break; */
 230 
 231                 default:
 232                         SSLerr(SSL_F_SSL23_CONNECT,SSL_R_UNKNOWN_STATE);
 233                         ret= -1;
 234                         goto end;
 235                         /* break; */
 236                         }
 237 
 238                 if (s->debug) { (void)BIO_flush(s->wbio); }
 239 
 240                 if ((cb != NULL) && (s->state != state))
 241                         {
 242                         new_state=s->state;
 243                         s->state=state;
 244                         cb(s,SSL_CB_CONNECT_LOOP,1);
 245                         s->state=new_state;
 246                         }
 247                 }
 248 end:
 249         s->in_handshake--;
 250         if (buf != NULL)
 251                 BUF_MEM_free(buf);
 252         if (cb != NULL)
 253                 cb(s,SSL_CB_CONNECT_EXIT,ret);
 254         return(ret);
 255         }
 256 
 257 static int ssl23_no_ssl2_ciphers(SSL *s)
 258         {
 259         SSL_CIPHER *cipher;
 260         STACK_OF(SSL_CIPHER) *ciphers;
 261         int i;
 262         ciphers = SSL_get_ciphers(s);
 263         for (i = 0; i < sk_SSL_CIPHER_num(ciphers); i++)
 264                 {
 265                 cipher = sk_SSL_CIPHER_value(ciphers, i);
 266                 if (cipher->algorithm_ssl == SSL_SSLV2)
 267                         return 0;
 268                 }
 269         return 1;
 270         }
 271 
 272 /* Fill a ClientRandom or ServerRandom field of length len. Returns <= 0
 273  * on failure, 1 on success. */
 274 int ssl_fill_hello_random(SSL *s, int server, unsigned char *result, int len)
 275         {
 276         int send_time = 0;
 277 
 278         if (len < 4)
 279                 return 0;
 280         if (server)
 281                 send_time = (s->mode & SSL_MODE_SEND_SERVERHELLO_TIME) != 0;
 282         else
 283                 send_time = (s->mode & SSL_MODE_SEND_CLIENTHELLO_TIME) != 0;
 284         if (send_time)
 285                 {
 286                 unsigned long Time = (unsigned long)time(NULL);
 287                 unsigned char *p = result;
 288                 l2n(Time, p);
 289                 return RAND_pseudo_bytes(p, len-4);
 290                 }
 291         else
 292                 return RAND_pseudo_bytes(result, len);
 293         }
 294 
 295 static int ssl23_client_hello(SSL *s)
 296         {
 297         unsigned char *buf;
 298         unsigned char *p,*d;
 299         int i,ch_len;
 300         unsigned long l;
 301         int ssl2_compat;
 302         int version = 0, version_major, version_minor;
 303 #ifndef OPENSSL_NO_COMP
 304         int j;
 305         SSL_COMP *comp;
 306 #endif
 307         int ret;
 308         unsigned long mask, options = s->options;
 309 
 310         ssl2_compat = (options & SSL_OP_NO_SSLv2) ? 0 : 1;
 311 
 312         if (ssl2_compat && ssl23_no_ssl2_ciphers(s))
 313                 ssl2_compat = 0;
 314 
 315         /*
 316          * SSL_OP_NO_X disables all protocols above X *if* there are
 317          * some protocols below X enabled. This is required in order
 318          * to maintain "version capability" vector contiguous. So
 319          * that if application wants to disable TLS1.0 in favour of
 320          * TLS1>=1, it would be insufficient to pass SSL_NO_TLSv1, the
 321          * answer is SSL_OP_NO_TLSv1|SSL_OP_NO_SSLv3|SSL_OP_NO_SSLv2.
 322          */
 323         mask =  SSL_OP_NO_TLSv1_1|SSL_OP_NO_TLSv1
 324 #if !defined(OPENSSL_NO_SSL3)
 325                 |SSL_OP_NO_SSLv3
 326 #endif
 327 #if !defined(OPENSSL_NO_SSL2)
 328                 |(ssl2_compat?SSL_OP_NO_SSLv2:0)
 329 #endif
 330                 ;
 331 #if !defined(OPENSSL_NO_TLS1_2_CLIENT)
 332         version = TLS1_2_VERSION;
 333 
 334         if ((options & SSL_OP_NO_TLSv1_2) && (options & mask) != mask)
 335                 version = TLS1_1_VERSION;
 336 #else
 337         version = TLS1_1_VERSION;
 338 #endif
 339         mask &= ~SSL_OP_NO_TLSv1_1;
 340         if ((options & SSL_OP_NO_TLSv1_1) && (options & mask) != mask)
 341                 version = TLS1_VERSION;
 342         mask &= ~SSL_OP_NO_TLSv1;
 343 #if !defined(OPENSSL_NO_SSL3)
 344         if ((options & SSL_OP_NO_TLSv1) && (options & mask) != mask)
 345                 version = SSL3_VERSION;
 346         mask &= ~SSL_OP_NO_SSLv3;
 347 #endif
 348 #if !defined(OPENSSL_NO_SSL2)
 349         if ((options & SSL_OP_NO_SSLv3) && (options & mask) != mask)
 350                 version = SSL2_VERSION;
 351 #endif
 352 
 353 #ifndef OPENSSL_NO_TLSEXT
 354         if (version != SSL2_VERSION)
 355                 {
 356                 /* have to disable SSL 2.0 compatibility if we need TLS extensions */
 357 
 358                 if (s->tlsext_hostname != NULL)
 359                         ssl2_compat = 0;
 360                 if (s->tlsext_status_type != -1)
 361                         ssl2_compat = 0;
 362 #ifdef TLSEXT_TYPE_opaque_prf_input
 363                 if (s->ctx->tlsext_opaque_prf_input_callback != 0 || s->tlsext_opaque_prf_input != NULL)
 364                         ssl2_compat = 0;
 365 #endif
 366                 }
 367 #endif
 368 
 369         buf=(unsigned char *)s->init_buf->data;
 370         if (s->state == SSL23_ST_CW_CLNT_HELLO_A)
 371                 {
 372 #if 0
 373                 /* don't reuse session-id's */
 374                 if (!ssl_get_new_session(s,0))
 375                         {
 376                         return(-1);
 377                         }
 378 #endif
 379 
 380                 p=s->s3->client_random;
 381                 if (ssl_fill_hello_random(s, 0, p, SSL3_RANDOM_SIZE) <= 0)
 382                         return -1;
 383 
 384                 if (version == TLS1_2_VERSION)
 385                         {
 386                         version_major = TLS1_2_VERSION_MAJOR;
 387                         version_minor = TLS1_2_VERSION_MINOR;
 388                         }
 389                 else if (version == TLS1_1_VERSION)
 390                         {
 391                         version_major = TLS1_1_VERSION_MAJOR;
 392                         version_minor = TLS1_1_VERSION_MINOR;
 393                         }
 394                 else if (version == TLS1_VERSION)
 395                         {
 396                         version_major = TLS1_VERSION_MAJOR;
 397                         version_minor = TLS1_VERSION_MINOR;
 398                         }
 399 #ifdef OPENSSL_FIPS
 400                 else if(FIPS_mode())
 401                         {
 402                         SSLerr(SSL_F_SSL23_CLIENT_HELLO,
 403                                         SSL_R_ONLY_TLS_ALLOWED_IN_FIPS_MODE);
 404                         return -1;
 405                         }
 406 #endif
 407                 else if (version == SSL3_VERSION)
 408                         {
 409                         version_major = SSL3_VERSION_MAJOR;
 410                         version_minor = SSL3_VERSION_MINOR;
 411                         }
 412                 else if (version == SSL2_VERSION)
 413                         {
 414                         version_major = SSL2_VERSION_MAJOR;
 415                         version_minor = SSL2_VERSION_MINOR;
 416                         }
 417                 else
 418                         {
 419                         SSLerr(SSL_F_SSL23_CLIENT_HELLO,SSL_R_NO_PROTOCOLS_AVAILABLE);
 420                         return(-1);
 421                         }
 422 
 423                 s->client_version = version;
 424 
 425                 if (ssl2_compat)
 426                         {
 427                         /* create SSL 2.0 compatible Client Hello */
 428 
 429                         /* two byte record header will be written last */
 430                         d = &(buf[2]);
 431                         p = d + 9; /* leave space for message type, version, individual length fields */
 432 
 433                         *(d++) = SSL2_MT_CLIENT_HELLO;
 434                         *(d++) = version_major;
 435                         *(d++) = version_minor;
 436 
 437                         /* Ciphers supported */
 438                         i=ssl_cipher_list_to_bytes(s,SSL_get_ciphers(s),p,0);
 439                         if (i == 0)
 440                                 {
 441                                 /* no ciphers */
 442                                 SSLerr(SSL_F_SSL23_CLIENT_HELLO,SSL_R_NO_CIPHERS_AVAILABLE);
 443                                 return -1;
 444                                 }
 445                         s2n(i,d);
 446                         p+=i;
 447 
 448                         /* put in the session-id length (zero since there is no reuse) */
 449 #if 0
 450                         s->session->session_id_length=0;
 451 #endif
 452                         s2n(0,d);
 453 
 454                         if (s->options & SSL_OP_NETSCAPE_CHALLENGE_BUG)
 455                                 ch_len=SSL2_CHALLENGE_LENGTH;
 456                         else
 457                                 ch_len=SSL2_MAX_CHALLENGE_LENGTH;
 458 
 459                         /* write out sslv2 challenge */
 460                         /* Note that ch_len must be <= SSL3_RANDOM_SIZE (32),
 461                            because it is one of SSL2_MAX_CHALLENGE_LENGTH (32)
 462                            or SSL2_MAX_CHALLENGE_LENGTH (16), but leave the
 463                            check in for futurproofing */
 464                         if (SSL3_RANDOM_SIZE < ch_len)
 465                                 i=SSL3_RANDOM_SIZE;
 466                         else
 467                                 i=ch_len;
 468                         s2n(i,d);
 469                         memset(&(s->s3->client_random[0]),0,SSL3_RANDOM_SIZE);
 470                         if (RAND_pseudo_bytes(&(s->s3->client_random[SSL3_RANDOM_SIZE-i]),i) <= 0)
 471                                 return -1;
 472 
 473                         memcpy(p,&(s->s3->client_random[SSL3_RANDOM_SIZE-i]),i);
 474                         p+=i;
 475 
 476                         i= p- &(buf[2]);
 477                         buf[0]=((i>>8)&0xff)|0x80;
 478                         buf[1]=(i&0xff);
 479 
 480                         /* number of bytes to write */
 481                         s->init_num=i+2;
 482                         s->init_off=0;
 483 
 484                         ssl3_finish_mac(s,&(buf[2]),i);
 485                         }
 486                 else
 487                         {
 488                         /* create Client Hello in SSL 3.0/TLS 1.0 format */
 489 
 490                         /* do the record header (5 bytes) and handshake message header (4 bytes) last */
 491                         d = p = &(buf[9]);
 492 
 493                         *(p++) = version_major;
 494                         *(p++) = version_minor;
 495 
 496                         /* Random stuff */
 497                         memcpy(p, s->s3->client_random, SSL3_RANDOM_SIZE);
 498                         p += SSL3_RANDOM_SIZE;
 499 
 500                         /* Session ID (zero since there is no reuse) */
 501                         *(p++) = 0;
 502 
 503                         /* Ciphers supported (using SSL 3.0/TLS 1.0 format) */
 504                         i=ssl_cipher_list_to_bytes(s,SSL_get_ciphers(s),&(p[2]),ssl3_put_cipher_by_char);
 505                         if (i == 0)
 506                                 {
 507                                 SSLerr(SSL_F_SSL23_CLIENT_HELLO,SSL_R_NO_CIPHERS_AVAILABLE);
 508                                 return -1;
 509                                 }
 510 #ifdef OPENSSL_MAX_TLS1_2_CIPHER_LENGTH
 511                         /* Some servers hang if client hello > 256 bytes
 512                          * as hack workaround chop number of supported ciphers
 513                          * to keep it well below this if we use TLS v1.2
 514                          */
 515                         if (TLS1_get_version(s) >= TLS1_2_VERSION
 516                                 && i > OPENSSL_MAX_TLS1_2_CIPHER_LENGTH)
 517                                 i = OPENSSL_MAX_TLS1_2_CIPHER_LENGTH & ~1;
 518 #endif
 519                         s2n(i,p);
 520                         p+=i;
 521 
 522                         /* COMPRESSION */
 523 #ifdef OPENSSL_NO_COMP
 524                         *(p++)=1;
 525 #else
 526                         if ((s->options & SSL_OP_NO_COMPRESSION)
 527                                                 || !s->ctx->comp_methods)
 528                                 j=0;
 529                         else
 530                                 j=sk_SSL_COMP_num(s->ctx->comp_methods);
 531                         *(p++)=1+j;
 532                         for (i=0; i<j; i++)
 533                                 {
 534                                 comp=sk_SSL_COMP_value(s->ctx->comp_methods,i);
 535                                 *(p++)=comp->id;
 536                                 }
 537 #endif
 538                         *(p++)=0; /* Add the NULL method */
 539 
 540 #ifndef OPENSSL_NO_TLSEXT
 541                         /* TLS extensions*/
 542                         if (ssl_prepare_clienthello_tlsext(s) <= 0)
 543                                 {
 544                                 SSLerr(SSL_F_SSL23_CLIENT_HELLO,SSL_R_CLIENTHELLO_TLSEXT);
 545                                 return -1;
 546                                 }
 547                         if ((p = ssl_add_clienthello_tlsext(s, p, buf+SSL3_RT_MAX_PLAIN_LENGTH)) == NULL)
 548                                 {
 549                                 SSLerr(SSL_F_SSL23_CLIENT_HELLO,ERR_R_INTERNAL_ERROR);
 550                                 return -1;
 551                                 }
 552 #endif
 553 
 554                         l = p-d;
 555 
 556                         /* fill in 4-byte handshake header */
 557                         d=&(buf[5]);
 558                         *(d++)=SSL3_MT_CLIENT_HELLO;
 559                         l2n3(l,d);
 560 
 561                         l += 4;
 562 
 563                         if (l > SSL3_RT_MAX_PLAIN_LENGTH)
 564                                 {
 565                                 SSLerr(SSL_F_SSL23_CLIENT_HELLO,ERR_R_INTERNAL_ERROR);
 566                                 return -1;
 567                                 }
 568 
 569                         /* fill in 5-byte record header */
 570                         d=buf;
 571                         *(d++) = SSL3_RT_HANDSHAKE;
 572                         *(d++) = version_major;
 573                         /* Some servers hang if we use long client hellos
 574                          * and a record number > TLS 1.0.
 575                          */
 576                         if (TLS1_get_client_version(s) > TLS1_VERSION)
 577                                 *(d++) = 1;
 578                         else
 579                                 *(d++) = version_minor;
 580                         s2n((int)l,d);
 581 
 582                         /* number of bytes to write */
 583                         s->init_num=p-buf;
 584                         s->init_off=0;
 585 
 586                         ssl3_finish_mac(s,&(buf[5]), s->init_num - 5);
 587                         }
 588 
 589                 s->state=SSL23_ST_CW_CLNT_HELLO_B;
 590                 s->init_off=0;
 591                 }
 592 
 593         /* SSL3_ST_CW_CLNT_HELLO_B */
 594         ret = ssl23_write_bytes(s);
 595 
 596         if ((ret >= 2) && s->msg_callback)
 597                 {
 598                 /* Client Hello has been sent; tell msg_callback */
 599 
 600                 if (ssl2_compat)
 601                         s->msg_callback(1, SSL2_VERSION, 0, s->init_buf->data+2, ret-2, s, s->msg_callback_arg);
 602                 else
 603                         s->msg_callback(1, version, SSL3_RT_HANDSHAKE, s->init_buf->data+5, ret-5, s, s->msg_callback_arg);
 604                 }
 605 
 606         return ret;
 607         }
 608 
 609 static int ssl23_get_server_hello(SSL *s)
 610         {
 611         char buf[8];
 612         unsigned char *p;
 613         int i;
 614         int n;
 615 
 616         n=ssl23_read_bytes(s,7);
 617 
 618         if (n != 7) return(n);
 619         p=s->packet;
 620 
 621         memcpy(buf,p,n);
 622 
 623         if ((p[0] & 0x80) && (p[2] == SSL2_MT_SERVER_HELLO) &&
 624                 (p[5] == 0x00) && (p[6] == 0x02))
 625                 {
 626 #ifdef OPENSSL_NO_SSL2
 627                 SSLerr(SSL_F_SSL23_GET_SERVER_HELLO,SSL_R_UNSUPPORTED_PROTOCOL);
 628                 goto err;
 629 #else
 630                 /* we are talking sslv2 */
 631                 /* we need to clean up the SSLv3 setup and put in the
 632                  * sslv2 stuff. */
 633                 int ch_len;
 634 
 635                 if (s->options & SSL_OP_NO_SSLv2)
 636                         {
 637                         SSLerr(SSL_F_SSL23_GET_SERVER_HELLO,SSL_R_UNSUPPORTED_PROTOCOL);
 638                         goto err;
 639                         }
 640                 if (s->s2 == NULL)
 641                         {
 642                         if (!ssl2_new(s))
 643                                 goto err;
 644                         }
 645                 else
 646                         ssl2_clear(s);
 647 
 648                 if (s->options & SSL_OP_NETSCAPE_CHALLENGE_BUG)
 649                         ch_len=SSL2_CHALLENGE_LENGTH;
 650                 else
 651                         ch_len=SSL2_MAX_CHALLENGE_LENGTH;
 652 
 653                 /* write out sslv2 challenge */
 654                 /* Note that ch_len must be <= SSL3_RANDOM_SIZE (32), because
 655                    it is one of SSL2_MAX_CHALLENGE_LENGTH (32) or
 656                    SSL2_MAX_CHALLENGE_LENGTH (16), but leave the check in for
 657                    futurproofing */
 658                 i=(SSL3_RANDOM_SIZE < ch_len)
 659                         ?SSL3_RANDOM_SIZE:ch_len;
 660                 s->s2->challenge_length=i;
 661                 memcpy(s->s2->challenge,
 662                         &(s->s3->client_random[SSL3_RANDOM_SIZE-i]),i);
 663 
 664                 if (s->s3 != NULL) ssl3_free(s);
 665 
 666                 if (!BUF_MEM_grow_clean(s->init_buf,
 667                         SSL2_MAX_RECORD_LENGTH_3_BYTE_HEADER))
 668                         {
 669                         SSLerr(SSL_F_SSL23_GET_SERVER_HELLO,ERR_R_BUF_LIB);
 670                         goto err;
 671                         }
 672 
 673                 s->state=SSL2_ST_GET_SERVER_HELLO_A;
 674                 if (!(s->client_version == SSL2_VERSION))
 675                         /* use special padding (SSL 3.0 draft/RFC 2246, App. E.2) */
 676                         s->s2->ssl2_rollback=1;
 677 
 678                 /* setup the 7 bytes we have read so we get them from
 679                  * the sslv2 buffer */
 680                 s->rstate=SSL_ST_READ_HEADER;
 681                 s->packet_length=n;
 682                 s->packet= &(s->s2->rbuf[0]);
 683                 memcpy(s->packet,buf,n);
 684                 s->s2->rbuf_left=n;
 685                 s->s2->rbuf_offs=0;
 686 
 687                 /* we have already written one */
 688                 s->s2->write_sequence=1;
 689 
 690                 s->method=SSLv2_client_method();
 691                 s->handshake_func=s->method->ssl_connect;
 692 #endif
 693                 }
 694         else if (p[1] == SSL3_VERSION_MAJOR &&
 695                  p[2] <= TLS1_2_VERSION_MINOR &&
 696                  ((p[0] == SSL3_RT_HANDSHAKE && p[5] == SSL3_MT_SERVER_HELLO) ||
 697                   (p[0] == SSL3_RT_ALERT && p[3] == 0 && p[4] == 2)))
 698                 {
 699                 /* we have sslv3 or tls1 (server hello or alert) */
 700 
 701                 if ((p[2] == SSL3_VERSION_MINOR) &&
 702                         !(s->options & SSL_OP_NO_SSLv3))
 703                         {
 704 #ifdef OPENSSL_FIPS
 705                         if(FIPS_mode())
 706                                 {
 707                                 SSLerr(SSL_F_SSL23_GET_SERVER_HELLO,
 708                                         SSL_R_ONLY_TLS_ALLOWED_IN_FIPS_MODE);
 709                                 goto err;
 710                                 }
 711 #endif
 712                         s->version=SSL3_VERSION;
 713                         s->method=SSLv3_client_method();
 714                         }
 715                 else if ((p[2] == TLS1_VERSION_MINOR) &&
 716                         !(s->options & SSL_OP_NO_TLSv1))
 717                         {
 718                         s->version=TLS1_VERSION;
 719                         s->method=TLSv1_client_method();
 720                         }
 721                 else if ((p[2] == TLS1_1_VERSION_MINOR) &&
 722                         !(s->options & SSL_OP_NO_TLSv1_1))
 723                         {
 724                         s->version=TLS1_1_VERSION;
 725                         s->method=TLSv1_1_client_method();
 726                         }
 727                 else if ((p[2] == TLS1_2_VERSION_MINOR) &&
 728                         !(s->options & SSL_OP_NO_TLSv1_2))
 729                         {
 730                         s->version=TLS1_2_VERSION;
 731                         s->method=TLSv1_2_client_method();
 732                         }
 733                 else
 734                         {
 735                         SSLerr(SSL_F_SSL23_GET_SERVER_HELLO,SSL_R_UNSUPPORTED_PROTOCOL);
 736                         goto err;
 737                         }
 738 
 739                 if (p[0] == SSL3_RT_ALERT && p[5] != SSL3_AL_WARNING)
 740                         {
 741                         /* fatal alert */
 742 
 743                         void (*cb)(const SSL *ssl,int type,int val)=NULL;
 744                         int j;
 745 
 746                         if (s->info_callback != NULL)
 747                                 cb=s->info_callback;
 748                         else if (s->ctx->info_callback != NULL)
 749                                 cb=s->ctx->info_callback;
 750 
 751                         i=p[5];
 752                         if (cb != NULL)
 753                                 {
 754                                 j=(i<<8)|p[6];
 755                                 cb(s,SSL_CB_READ_ALERT,j);
 756                                 }
 757 
 758                         if (s->msg_callback)
 759                                 s->msg_callback(0, s->version, SSL3_RT_ALERT, p+5, 2, s, s->msg_callback_arg);
 760 
 761                         s->rwstate=SSL_NOTHING;
 762                         SSLerr(SSL_F_SSL23_GET_SERVER_HELLO,SSL_AD_REASON_OFFSET+p[6]);
 763                         goto err;
 764                         }
 765 
 766                 if (!ssl_init_wbio_buffer(s,1)) goto err;
 767 
 768                 /* we are in this state */
 769                 s->state=SSL3_ST_CR_SRVR_HELLO_A;
 770 
 771                 /* put the 7 bytes we have read into the input buffer
 772                  * for SSLv3 */
 773                 s->rstate=SSL_ST_READ_HEADER;
 774                 s->packet_length=n;
 775                 if (s->s3->rbuf.buf == NULL)
 776                         if (!ssl3_setup_read_buffer(s))
 777                                 goto err;
 778                 s->packet= &(s->s3->rbuf.buf[0]);
 779                 memcpy(s->packet,buf,n);
 780                 s->s3->rbuf.left=n;
 781                 s->s3->rbuf.offset=0;
 782 
 783                 s->handshake_func=s->method->ssl_connect;
 784                 }
 785         else
 786                 {
 787                 SSLerr(SSL_F_SSL23_GET_SERVER_HELLO,SSL_R_UNKNOWN_PROTOCOL);
 788                 goto err;
 789                 }
 790         s->init_num=0;
 791 
 792         /* Since, if we are sending a ssl23 client hello, we are not
 793          * reusing a session-id */
 794         if (!ssl_get_new_session(s,0))
 795                 goto err;
 796 
 797         return(SSL_connect(s));
 798 err:
 799         return(-1);
 800         }