Coverage Report

Created: 2022-11-30 06:20

/src/openssl/ssl/s23_clnt.c
Line
Count
Source (jump to first uncovered line)
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
0
{
124
#ifndef OPENSSL_NO_SSL2
125
    if (ver == SSL2_VERSION)
126
        return (SSLv2_client_method());
127
#endif
128
0
#ifndef OPENSSL_NO_SSL3
129
0
    if (ver == SSL3_VERSION)
130
0
        return (SSLv3_client_method());
131
0
#endif
132
0
    if (ver == TLS1_VERSION)
133
0
        return (TLSv1_client_method());
134
0
    else if (ver == TLS1_1_VERSION)
135
0
        return (TLSv1_1_client_method());
136
0
    else if (ver == TLS1_2_VERSION)
137
0
        return (TLSv1_2_client_method());
138
0
    else
139
0
        return (NULL);
140
0
}
141
142
IMPLEMENT_ssl23_meth_func(SSLv23_client_method,
143
                          ssl_undefined_function,
144
                          ssl23_connect, ssl23_get_client_method)
145
146
int ssl23_connect(SSL *s)
147
0
{
148
0
    BUF_MEM *buf = NULL;
149
0
    unsigned long Time = (unsigned long)time(NULL);
150
0
    void (*cb) (const SSL *ssl, int type, int val) = NULL;
151
0
    int ret = -1;
152
0
    int new_state, state;
153
154
0
    RAND_add(&Time, sizeof(Time), 0);
155
0
    ERR_clear_error();
156
0
    clear_sys_error();
157
158
0
    if (s->info_callback != NULL)
159
0
        cb = s->info_callback;
160
0
    else if (s->ctx->info_callback != NULL)
161
0
        cb = s->ctx->info_callback;
162
163
0
    s->in_handshake++;
164
0
    if (!SSL_in_init(s) || SSL_in_before(s))
165
0
        SSL_clear(s);
166
167
0
    for (;;) {
168
0
        state = s->state;
169
170
0
        switch (s->state) {
171
0
        case SSL_ST_BEFORE:
172
0
        case SSL_ST_CONNECT:
173
0
        case SSL_ST_BEFORE | SSL_ST_CONNECT:
174
0
        case SSL_ST_OK | SSL_ST_CONNECT:
175
176
0
            if (s->session != NULL) {
177
0
                SSLerr(SSL_F_SSL23_CONNECT,
178
0
                       SSL_R_SSL23_DOING_SESSION_ID_REUSE);
179
0
                ret = -1;
180
0
                goto end;
181
0
            }
182
0
            s->server = 0;
183
0
            if (cb != NULL)
184
0
                cb(s, SSL_CB_HANDSHAKE_START, 1);
185
186
            /* s->version=TLS1_VERSION; */
187
0
            s->type = SSL_ST_CONNECT;
188
189
0
            if (s->init_buf == NULL) {
190
0
                if ((buf = BUF_MEM_new()) == NULL) {
191
0
                    ret = -1;
192
0
                    goto end;
193
0
                }
194
0
                if (!BUF_MEM_grow(buf, SSL3_RT_MAX_PLAIN_LENGTH)) {
195
0
                    ret = -1;
196
0
                    goto end;
197
0
                }
198
0
                s->init_buf = buf;
199
0
                buf = NULL;
200
0
            }
201
202
0
            if (!ssl3_setup_buffers(s)) {
203
0
                ret = -1;
204
0
                goto end;
205
0
            }
206
207
0
            if (!ssl3_init_finished_mac(s)) {
208
0
                ret = -1;
209
0
                goto end;
210
0
            }
211
212
0
            s->state = SSL23_ST_CW_CLNT_HELLO_A;
213
0
            s->ctx->stats.sess_connect++;
214
0
            s->init_num = 0;
215
0
            break;
216
217
0
        case SSL23_ST_CW_CLNT_HELLO_A:
218
0
        case SSL23_ST_CW_CLNT_HELLO_B:
219
220
0
            s->shutdown = 0;
221
0
            ret = ssl23_client_hello(s);
222
0
            if (ret <= 0)
223
0
                goto end;
224
0
            s->state = SSL23_ST_CR_SRVR_HELLO_A;
225
0
            s->init_num = 0;
226
227
0
            break;
228
229
0
        case SSL23_ST_CR_SRVR_HELLO_A:
230
0
        case SSL23_ST_CR_SRVR_HELLO_B:
231
0
            ret = ssl23_get_server_hello(s);
232
0
            if (ret >= 0)
233
0
                cb = NULL;
234
0
            goto end;
235
            /* break; */
236
237
0
        default:
238
0
            SSLerr(SSL_F_SSL23_CONNECT, SSL_R_UNKNOWN_STATE);
239
0
            ret = -1;
240
0
            goto end;
241
            /* break; */
242
0
        }
243
244
0
        if (s->debug) {
245
0
            (void)BIO_flush(s->wbio);
246
0
        }
247
248
0
        if ((cb != NULL) && (s->state != state)) {
249
0
            new_state = s->state;
250
0
            s->state = state;
251
0
            cb(s, SSL_CB_CONNECT_LOOP, 1);
252
0
            s->state = new_state;
253
0
        }
254
0
    }
255
0
 end:
256
0
    s->in_handshake--;
257
0
    if (buf != NULL)
258
0
        BUF_MEM_free(buf);
259
0
    if (cb != NULL)
260
0
        cb(s, SSL_CB_CONNECT_EXIT, ret);
261
0
    return (ret);
262
0
}
263
264
static int ssl23_no_ssl2_ciphers(SSL *s)
265
0
{
266
0
    SSL_CIPHER *cipher;
267
0
    STACK_OF(SSL_CIPHER) *ciphers;
268
0
    int i;
269
0
    ciphers = SSL_get_ciphers(s);
270
0
    for (i = 0; i < sk_SSL_CIPHER_num(ciphers); i++) {
271
0
        cipher = sk_SSL_CIPHER_value(ciphers, i);
272
0
        if (cipher->algorithm_ssl == SSL_SSLV2)
273
0
            return 0;
274
0
    }
275
0
    return 1;
276
0
}
277
278
/*
279
 * Fill a ClientRandom or ServerRandom field of length len. Returns <= 0 on
280
 * failure, 1 on success.
281
 */
282
int ssl_fill_hello_random(SSL *s, int server, unsigned char *result, int len)
283
0
{
284
0
    int send_time = 0;
285
0
    if (len < 4)
286
0
        return 0;
287
0
    if (server)
288
0
        send_time = (s->mode & SSL_MODE_SEND_SERVERHELLO_TIME) != 0;
289
0
    else
290
0
        send_time = (s->mode & SSL_MODE_SEND_CLIENTHELLO_TIME) != 0;
291
0
    if (send_time) {
292
0
        unsigned long Time = (unsigned long)time(NULL);
293
0
        unsigned char *p = result;
294
0
        l2n(Time, p);
295
0
        return RAND_bytes(p, len - 4);
296
0
    } else
297
0
        return RAND_bytes(result, len);
298
0
}
299
300
static int ssl23_client_hello(SSL *s)
301
0
{
302
0
    unsigned char *buf;
303
0
    unsigned char *p, *d;
304
0
    int i, ch_len;
305
0
    unsigned long l;
306
0
    int ssl2_compat;
307
0
    int version = 0, version_major, version_minor;
308
0
    int al = 0;
309
0
#ifndef OPENSSL_NO_COMP
310
0
    int j;
311
0
    SSL_COMP *comp;
312
0
#endif
313
0
    int ret;
314
0
    unsigned long mask, options = s->options;
315
316
0
    ssl2_compat = (options & SSL_OP_NO_SSLv2) ? 0 : 1;
317
318
0
    if (ssl2_compat && ssl23_no_ssl2_ciphers(s))
319
0
        ssl2_compat = 0;
320
321
    /*
322
     * SSL_OP_NO_X disables all protocols above X *if* there are
323
     * some protocols below X enabled. This is required in order
324
     * to maintain "version capability" vector contiguous. So
325
     * that if application wants to disable TLS1.0 in favour of
326
     * TLS1>=1, it would be insufficient to pass SSL_NO_TLSv1, the
327
     * answer is SSL_OP_NO_TLSv1|SSL_OP_NO_SSLv3|SSL_OP_NO_SSLv2.
328
     */
329
0
    mask = SSL_OP_NO_TLSv1_1 | SSL_OP_NO_TLSv1
330
0
#if !defined(OPENSSL_NO_SSL3)
331
0
        | SSL_OP_NO_SSLv3
332
0
#endif
333
#if !defined(OPENSSL_NO_SSL2)
334
        | (ssl2_compat ? SSL_OP_NO_SSLv2 : 0)
335
#endif
336
0
        ;
337
0
#if !defined(OPENSSL_NO_TLS1_2_CLIENT)
338
0
    version = TLS1_2_VERSION;
339
340
0
    if ((options & SSL_OP_NO_TLSv1_2) && (options & mask) != mask)
341
0
        version = TLS1_1_VERSION;
342
#else
343
    version = TLS1_1_VERSION;
344
#endif
345
0
    mask &= ~SSL_OP_NO_TLSv1_1;
346
0
    if ((options & SSL_OP_NO_TLSv1_1) && (options & mask) != mask)
347
0
        version = TLS1_VERSION;
348
0
    mask &= ~SSL_OP_NO_TLSv1;
349
0
#if !defined(OPENSSL_NO_SSL3)
350
0
    if ((options & SSL_OP_NO_TLSv1) && (options & mask) != mask)
351
0
        version = SSL3_VERSION;
352
0
    mask &= ~SSL_OP_NO_SSLv3;
353
0
#endif
354
#if !defined(OPENSSL_NO_SSL2)
355
    if ((options & SSL_OP_NO_SSLv3) && (options & mask) != mask)
356
        version = SSL2_VERSION;
357
#endif
358
359
0
#ifndef OPENSSL_NO_TLSEXT
360
0
    if (version != SSL2_VERSION) {
361
        /*
362
         * have to disable SSL 2.0 compatibility if we need TLS extensions
363
         */
364
365
0
        if (s->tlsext_hostname != NULL)
366
0
            ssl2_compat = 0;
367
0
        if (s->tlsext_status_type != -1)
368
0
            ssl2_compat = 0;
369
# ifdef TLSEXT_TYPE_opaque_prf_input
370
        if (s->ctx->tlsext_opaque_prf_input_callback != 0
371
            || s->tlsext_opaque_prf_input != NULL)
372
            ssl2_compat = 0;
373
# endif
374
0
        if (s->cert->cli_ext.meths_count != 0)
375
0
            ssl2_compat = 0;
376
0
    }
377
0
#endif
378
379
0
    buf = (unsigned char *)s->init_buf->data;
380
0
    if (s->state == SSL23_ST_CW_CLNT_HELLO_A) {
381
        /*
382
         * Since we're sending s23 client hello, we're not reusing a session, as
383
         * we'd be using the method from the saved session instead
384
         */
385
0
        if (!ssl_get_new_session(s, 0)) {
386
0
            return -1;
387
0
        }
388
389
0
        p = s->s3->client_random;
390
0
        if (ssl_fill_hello_random(s, 0, p, SSL3_RANDOM_SIZE) <= 0)
391
0
            return -1;
392
393
0
        if (version == TLS1_2_VERSION) {
394
0
            version_major = TLS1_2_VERSION_MAJOR;
395
0
            version_minor = TLS1_2_VERSION_MINOR;
396
0
        } else if (tls1_suiteb(s)) {
397
0
            SSLerr(SSL_F_SSL23_CLIENT_HELLO,
398
0
                   SSL_R_ONLY_TLS_1_2_ALLOWED_IN_SUITEB_MODE);
399
0
            return -1;
400
0
        } else if (version == TLS1_1_VERSION) {
401
0
            version_major = TLS1_1_VERSION_MAJOR;
402
0
            version_minor = TLS1_1_VERSION_MINOR;
403
0
        } else if (version == TLS1_VERSION) {
404
0
            version_major = TLS1_VERSION_MAJOR;
405
0
            version_minor = TLS1_VERSION_MINOR;
406
0
        }
407
#ifdef OPENSSL_FIPS
408
        else if (FIPS_mode()) {
409
            SSLerr(SSL_F_SSL23_CLIENT_HELLO,
410
                   SSL_R_ONLY_TLS_ALLOWED_IN_FIPS_MODE);
411
            return -1;
412
        }
413
#endif
414
0
        else if (version == SSL3_VERSION) {
415
0
            version_major = SSL3_VERSION_MAJOR;
416
0
            version_minor = SSL3_VERSION_MINOR;
417
0
        } else if (version == SSL2_VERSION) {
418
0
            version_major = SSL2_VERSION_MAJOR;
419
0
            version_minor = SSL2_VERSION_MINOR;
420
0
        } else {
421
0
            SSLerr(SSL_F_SSL23_CLIENT_HELLO, SSL_R_NO_PROTOCOLS_AVAILABLE);
422
0
            return (-1);
423
0
        }
424
425
0
        s->client_version = version;
426
427
0
        if (ssl2_compat) {
428
            /* create SSL 2.0 compatible Client Hello */
429
430
            /* two byte record header will be written last */
431
0
            d = &(buf[2]);
432
0
            p = d + 9;          /* leave space for message type, version,
433
                                 * individual length fields */
434
435
0
            *(d++) = SSL2_MT_CLIENT_HELLO;
436
0
            *(d++) = version_major;
437
0
            *(d++) = version_minor;
438
439
            /* Ciphers supported */
440
0
            i = ssl_cipher_list_to_bytes(s, SSL_get_ciphers(s), p, 0);
441
0
            if (i == 0) {
442
                /* no ciphers */
443
0
                SSLerr(SSL_F_SSL23_CLIENT_HELLO, SSL_R_NO_CIPHERS_AVAILABLE);
444
0
                return -1;
445
0
            }
446
0
            s2n(i, d);
447
0
            p += i;
448
449
            /*
450
             * put in the session-id length (zero since there is no reuse)
451
             */
452
0
            s2n(0, d);
453
454
0
            if (s->options & SSL_OP_NETSCAPE_CHALLENGE_BUG)
455
0
                ch_len = SSL2_CHALLENGE_LENGTH;
456
0
            else
457
0
                ch_len = SSL2_MAX_CHALLENGE_LENGTH;
458
459
            /* write out sslv2 challenge */
460
            /*
461
             * Note that ch_len must be <= SSL3_RANDOM_SIZE (32), because it
462
             * is one of SSL2_MAX_CHALLENGE_LENGTH (32) or
463
             * SSL2_MAX_CHALLENGE_LENGTH (16), but leave the check in for
464
             * futurproofing
465
             */
466
0
            if (SSL3_RANDOM_SIZE < ch_len)
467
0
                i = SSL3_RANDOM_SIZE;
468
0
            else
469
0
                i = ch_len;
470
0
            s2n(i, d);
471
0
            memset(&(s->s3->client_random[0]), 0, SSL3_RANDOM_SIZE);
472
0
            if (RAND_bytes (&(s->s3->client_random[SSL3_RANDOM_SIZE - i]), i)
473
0
                    <= 0)
474
0
                return -1;
475
476
0
            memcpy(p, &(s->s3->client_random[SSL3_RANDOM_SIZE - i]), i);
477
0
            p += i;
478
479
0
            i = p - &(buf[2]);
480
0
            buf[0] = ((i >> 8) & 0xff) | 0x80;
481
0
            buf[1] = (i & 0xff);
482
483
            /* number of bytes to write */
484
0
            s->init_num = i + 2;
485
0
            s->init_off = 0;
486
487
0
            ssl3_finish_mac(s, &(buf[2]), i);
488
0
        } else {
489
            /* create Client Hello in SSL 3.0/TLS 1.0 format */
490
491
            /*
492
             * do the record header (5 bytes) and handshake message header (4
493
             * bytes) last
494
             */
495
0
            d = p = &(buf[9]);
496
497
0
            *(p++) = version_major;
498
0
            *(p++) = version_minor;
499
500
            /* Random stuff */
501
0
            memcpy(p, s->s3->client_random, SSL3_RANDOM_SIZE);
502
0
            p += SSL3_RANDOM_SIZE;
503
504
            /* Session ID (zero since there is no reuse) */
505
0
            *(p++) = 0;
506
507
            /* Ciphers supported (using SSL 3.0/TLS 1.0 format) */
508
0
            i = ssl_cipher_list_to_bytes(s, SSL_get_ciphers(s), &(p[2]),
509
0
                                         ssl3_put_cipher_by_char);
510
0
            if (i == 0) {
511
0
                SSLerr(SSL_F_SSL23_CLIENT_HELLO, SSL_R_NO_CIPHERS_AVAILABLE);
512
0
                return -1;
513
0
            }
514
#ifdef OPENSSL_MAX_TLS1_2_CIPHER_LENGTH
515
            /*
516
             * Some servers hang if client hello > 256 bytes as hack
517
             * workaround chop number of supported ciphers to keep it well
518
             * below this if we use TLS v1.2
519
             */
520
            if (TLS1_get_version(s) >= TLS1_2_VERSION
521
                && i > OPENSSL_MAX_TLS1_2_CIPHER_LENGTH)
522
                i = OPENSSL_MAX_TLS1_2_CIPHER_LENGTH & ~1;
523
#endif
524
0
            s2n(i, p);
525
0
            p += i;
526
527
            /* COMPRESSION */
528
#ifdef OPENSSL_NO_COMP
529
            *(p++) = 1;
530
#else
531
0
            if ((s->options & SSL_OP_NO_COMPRESSION)
532
0
                || !s->ctx->comp_methods)
533
0
                j = 0;
534
0
            else
535
0
                j = sk_SSL_COMP_num(s->ctx->comp_methods);
536
0
            *(p++) = 1 + j;
537
0
            for (i = 0; i < j; i++) {
538
0
                comp = sk_SSL_COMP_value(s->ctx->comp_methods, i);
539
0
                *(p++) = comp->id;
540
0
            }
541
0
#endif
542
0
            *(p++) = 0;         /* Add the NULL method */
543
544
0
#ifndef OPENSSL_NO_TLSEXT
545
            /* TLS extensions */
546
0
            if (ssl_prepare_clienthello_tlsext(s) <= 0) {
547
0
                SSLerr(SSL_F_SSL23_CLIENT_HELLO, SSL_R_CLIENTHELLO_TLSEXT);
548
0
                return -1;
549
0
            }
550
0
            if ((p =
551
0
                 ssl_add_clienthello_tlsext(s, p,
552
0
                                            buf + SSL3_RT_MAX_PLAIN_LENGTH,
553
0
                                            &al)) == NULL) {
554
0
                ssl3_send_alert(s, SSL3_AL_FATAL, al);
555
0
                SSLerr(SSL_F_SSL23_CLIENT_HELLO, ERR_R_INTERNAL_ERROR);
556
0
                return -1;
557
0
            }
558
0
#endif
559
560
0
            l = p - d;
561
562
            /* fill in 4-byte handshake header */
563
0
            d = &(buf[5]);
564
0
            *(d++) = SSL3_MT_CLIENT_HELLO;
565
0
            l2n3(l, d);
566
567
0
            l += 4;
568
569
0
            if (l > SSL3_RT_MAX_PLAIN_LENGTH) {
570
0
                SSLerr(SSL_F_SSL23_CLIENT_HELLO, ERR_R_INTERNAL_ERROR);
571
0
                return -1;
572
0
            }
573
574
            /* fill in 5-byte record header */
575
0
            d = buf;
576
0
            *(d++) = SSL3_RT_HANDSHAKE;
577
0
            *(d++) = version_major;
578
            /*
579
             * Some servers hang if we use long client hellos and a record
580
             * number > TLS 1.0.
581
             */
582
0
            if (TLS1_get_client_version(s) > TLS1_VERSION)
583
0
                *(d++) = 1;
584
0
            else
585
0
                *(d++) = version_minor;
586
0
            s2n((int)l, d);
587
588
            /* number of bytes to write */
589
0
            s->init_num = p - buf;
590
0
            s->init_off = 0;
591
592
0
            ssl3_finish_mac(s, &(buf[5]), s->init_num - 5);
593
0
        }
594
595
0
        s->state = SSL23_ST_CW_CLNT_HELLO_B;
596
0
        s->init_off = 0;
597
0
    }
598
599
    /* SSL3_ST_CW_CLNT_HELLO_B */
600
0
    ret = ssl23_write_bytes(s);
601
602
0
    if ((ret >= 2) && s->msg_callback) {
603
        /* Client Hello has been sent; tell msg_callback */
604
605
0
        if (ssl2_compat)
606
0
            s->msg_callback(1, SSL2_VERSION, 0, s->init_buf->data + 2,
607
0
                            ret - 2, s, s->msg_callback_arg);
608
0
        else {
609
0
            s->msg_callback(1, version, SSL3_RT_HEADER, s->init_buf->data, 5,
610
0
                            s, s->msg_callback_arg);
611
0
            s->msg_callback(1, version, SSL3_RT_HANDSHAKE,
612
0
                            s->init_buf->data + 5, ret - 5, s,
613
0
                            s->msg_callback_arg);
614
0
        }
615
0
    }
616
617
0
    return ret;
618
0
}
619
620
static int ssl23_get_server_hello(SSL *s)
621
0
{
622
0
    char buf[8];
623
0
    unsigned char *p;
624
0
    int i;
625
0
    int n;
626
627
0
    n = ssl23_read_bytes(s, 7);
628
629
0
    if (n != 7)
630
0
        return (n);
631
0
    p = s->packet;
632
633
0
    memcpy(buf, p, n);
634
635
0
    if ((p[0] & 0x80) && (p[2] == SSL2_MT_SERVER_HELLO) &&
636
0
        (p[5] == 0x00) && (p[6] == 0x02)) {
637
0
#ifdef OPENSSL_NO_SSL2
638
0
        SSLerr(SSL_F_SSL23_GET_SERVER_HELLO, SSL_R_UNSUPPORTED_PROTOCOL);
639
0
        goto err;
640
#else
641
        /* we are talking sslv2 */
642
        /*
643
         * we need to clean up the SSLv3 setup and put in the sslv2 stuff.
644
         */
645
        int ch_len;
646
647
        if (s->options & SSL_OP_NO_SSLv2) {
648
            SSLerr(SSL_F_SSL23_GET_SERVER_HELLO, SSL_R_UNSUPPORTED_PROTOCOL);
649
            goto err;
650
        }
651
        if (s->s2 == NULL) {
652
            if (!ssl2_new(s))
653
                goto err;
654
        } else
655
            ssl2_clear(s);
656
657
        if (s->options & SSL_OP_NETSCAPE_CHALLENGE_BUG)
658
            ch_len = SSL2_CHALLENGE_LENGTH;
659
        else
660
            ch_len = SSL2_MAX_CHALLENGE_LENGTH;
661
662
        /* write out sslv2 challenge */
663
        /*
664
         * Note that ch_len must be <= SSL3_RANDOM_SIZE (32), because it is
665
         * one of SSL2_MAX_CHALLENGE_LENGTH (32) or SSL2_MAX_CHALLENGE_LENGTH
666
         * (16), but leave the check in for futurproofing
667
         */
668
        i = (SSL3_RANDOM_SIZE < ch_len)
669
            ? SSL3_RANDOM_SIZE : ch_len;
670
        s->s2->challenge_length = i;
671
        memcpy(s->s2->challenge,
672
               &(s->s3->client_random[SSL3_RANDOM_SIZE - i]), i);
673
674
        if (s->s3 != NULL)
675
            ssl3_free(s);
676
677
        if (!BUF_MEM_grow_clean(s->init_buf,
678
                                SSL2_MAX_RECORD_LENGTH_3_BYTE_HEADER)) {
679
            SSLerr(SSL_F_SSL23_GET_SERVER_HELLO, ERR_R_BUF_LIB);
680
            goto err;
681
        }
682
683
        s->state = SSL2_ST_GET_SERVER_HELLO_A;
684
        if (!(s->client_version == SSL2_VERSION))
685
            /*
686
             * use special padding (SSL 3.0 draft/RFC 2246, App. E.2)
687
             */
688
            s->s2->ssl2_rollback = 1;
689
690
        /*
691
         * setup the 7 bytes we have read so we get them from the sslv2
692
         * buffer
693
         */
694
        s->rstate = SSL_ST_READ_HEADER;
695
        s->packet_length = n;
696
        s->packet = &(s->s2->rbuf[0]);
697
        memcpy(s->packet, buf, n);
698
        s->s2->rbuf_left = n;
699
        s->s2->rbuf_offs = 0;
700
701
        /* we have already written one */
702
        s->s2->write_sequence = 1;
703
704
        s->method = SSLv2_client_method();
705
        s->handshake_func = s->method->ssl_connect;
706
#endif
707
0
    } else if (p[1] == SSL3_VERSION_MAJOR &&
708
0
               p[2] <= TLS1_2_VERSION_MINOR &&
709
0
               ((p[0] == SSL3_RT_HANDSHAKE && p[5] == SSL3_MT_SERVER_HELLO) ||
710
0
                (p[0] == SSL3_RT_ALERT && p[3] == 0 && p[4] == 2))) {
711
        /* we have sslv3 or tls1 (server hello or alert) */
712
713
0
#ifndef OPENSSL_NO_SSL3
714
0
        if ((p[2] == SSL3_VERSION_MINOR) && !(s->options & SSL_OP_NO_SSLv3)) {
715
# ifdef OPENSSL_FIPS
716
            if (FIPS_mode()) {
717
                SSLerr(SSL_F_SSL23_GET_SERVER_HELLO,
718
                       SSL_R_ONLY_TLS_ALLOWED_IN_FIPS_MODE);
719
                goto err;
720
            }
721
# endif
722
0
            s->version = SSL3_VERSION;
723
0
            s->method = SSLv3_client_method();
724
0
        } else
725
0
#endif
726
0
        if ((p[2] == TLS1_VERSION_MINOR) && !(s->options & SSL_OP_NO_TLSv1)) {
727
0
            s->version = TLS1_VERSION;
728
0
            s->method = TLSv1_client_method();
729
0
        } else if ((p[2] == TLS1_1_VERSION_MINOR) &&
730
0
                   !(s->options & SSL_OP_NO_TLSv1_1)) {
731
0
            s->version = TLS1_1_VERSION;
732
0
            s->method = TLSv1_1_client_method();
733
0
        } else if ((p[2] == TLS1_2_VERSION_MINOR) &&
734
0
                   !(s->options & SSL_OP_NO_TLSv1_2)) {
735
0
            s->version = TLS1_2_VERSION;
736
0
            s->method = TLSv1_2_client_method();
737
0
        } else {
738
            /*
739
             * Unrecognised version, we'll send a protocol version alert using
740
             * our preferred version.
741
             */
742
0
            switch(s->client_version) {
743
0
            default:
744
                /*
745
                 * Shouldn't happen
746
                 * Fall through
747
                 */
748
0
            case TLS1_2_VERSION:
749
0
                s->version = TLS1_2_VERSION;
750
0
                s->method = TLSv1_2_client_method();
751
0
                break;
752
0
            case TLS1_1_VERSION:
753
0
                s->version = TLS1_1_VERSION;
754
0
                s->method = TLSv1_1_client_method();
755
0
                break;
756
0
            case TLS1_VERSION:
757
0
                s->version = TLS1_VERSION;
758
0
                s->method = TLSv1_client_method();
759
0
                break;
760
0
            case SSL3_VERSION:
761
0
                s->version = SSL3_VERSION;
762
0
                s->method = SSLv3_client_method();
763
0
                break;
764
0
            }
765
0
            SSLerr(SSL_F_SSL23_GET_SERVER_HELLO, SSL_R_UNSUPPORTED_PROTOCOL);
766
0
            ssl3_send_alert(s, SSL3_AL_FATAL, SSL_AD_PROTOCOL_VERSION);
767
0
            goto err;
768
0
        }
769
770
0
        s->session->ssl_version = s->version;
771
772
        /* ensure that TLS_MAX_VERSION is up-to-date */
773
0
        OPENSSL_assert(s->version <= TLS_MAX_VERSION);
774
775
0
        if (p[0] == SSL3_RT_ALERT && p[5] != SSL3_AL_WARNING) {
776
            /* fatal alert */
777
778
0
            void (*cb) (const SSL *ssl, int type, int val) = NULL;
779
0
            int j;
780
781
0
            if (s->info_callback != NULL)
782
0
                cb = s->info_callback;
783
0
            else if (s->ctx->info_callback != NULL)
784
0
                cb = s->ctx->info_callback;
785
786
0
            i = p[5];
787
0
            if (cb != NULL) {
788
0
                j = (i << 8) | p[6];
789
0
                cb(s, SSL_CB_READ_ALERT, j);
790
0
            }
791
792
0
            if (s->msg_callback) {
793
0
                s->msg_callback(0, s->version, SSL3_RT_HEADER, p, 5, s,
794
0
                                s->msg_callback_arg);
795
0
                s->msg_callback(0, s->version, SSL3_RT_ALERT, p + 5, 2, s,
796
0
                                s->msg_callback_arg);
797
0
            }
798
799
0
            s->rwstate = SSL_NOTHING;
800
0
            SSLerr(SSL_F_SSL23_GET_SERVER_HELLO, SSL_AD_REASON_OFFSET + p[6]);
801
0
            goto err;
802
0
        }
803
804
0
        if (!ssl_init_wbio_buffer(s, 1))
805
0
            goto err;
806
807
        /* we are in this state */
808
0
        s->state = SSL3_ST_CR_SRVR_HELLO_A;
809
810
        /*
811
         * put the 7 bytes we have read into the input buffer for SSLv3
812
         */
813
0
        s->rstate = SSL_ST_READ_HEADER;
814
0
        s->packet_length = n;
815
0
        if (s->s3->rbuf.buf == NULL)
816
0
            if (!ssl3_setup_read_buffer(s))
817
0
                goto err;
818
0
        s->packet = &(s->s3->rbuf.buf[0]);
819
0
        memcpy(s->packet, buf, n);
820
0
        s->s3->rbuf.left = n;
821
0
        s->s3->rbuf.offset = 0;
822
823
0
        s->handshake_func = s->method->ssl_connect;
824
0
    } else {
825
0
        SSLerr(SSL_F_SSL23_GET_SERVER_HELLO, SSL_R_UNKNOWN_PROTOCOL);
826
0
        goto err;
827
0
    }
828
0
    s->init_num = 0;
829
830
0
    return (SSL_connect(s));
831
0
 err:
832
0
    return (-1);
833
0
}