statem_clnt.c 115.2 KB
Newer Older
R
Rich Salz 已提交
1 2
/*
 * Copyright 1995-2016 The OpenSSL Project Authors. All Rights Reserved.
3
 * Copyright (c) 2002, Oracle and/or its affiliates. All rights reserved
4
 * Copyright 2005 Nokia. All rights reserved.
5
 *
R
Rich Salz 已提交
6 7 8 9
 * Licensed under the OpenSSL license (the "License").  You may not use
 * this file except in compliance with the License.  You can obtain a copy
 * in the file LICENSE in the source distribution or at
 * https://www.openssl.org/source/license.html
10
 */
R
Rich Salz 已提交
11

12
#include <stdio.h>
M
Matt Caswell 已提交
13
#include <time.h>
M
Matt Caswell 已提交
14
#include "../ssl_locl.h"
M
Matt Caswell 已提交
15
#include "statem_locl.h"
16 17 18 19
#include <openssl/buffer.h>
#include <openssl/rand.h>
#include <openssl/objects.h>
#include <openssl/evp.h>
20
#include <openssl/md5.h>
R
Rich Salz 已提交
21
#include <openssl/dh.h>
22
#include <openssl/bn.h>
R
Rich Salz 已提交
23
#include <openssl/engine.h>
24

25
static MSG_PROCESS_RETURN tls_process_hello_retry_request(SSL *s, PACKET *pkt);
M
Matt Caswell 已提交
26 27
static MSG_PROCESS_RETURN tls_process_encrypted_extensions(SSL *s, PACKET *pkt);

M
Matt Caswell 已提交
28
static ossl_inline int cert_req_allowed(SSL *s);
29
static int key_exchange_expected(SSL *s);
M
Matt Caswell 已提交
30
static int ssl_cipher_list_to_bytes(SSL *s, STACK_OF(SSL_CIPHER) *sk,
M
Matt Caswell 已提交
31
                                    WPACKET *pkt);
B
Bodo Möller 已提交
32

M
Matt Caswell 已提交
33 34 35 36 37 38 39
/*
 * Is a CertificateRequest message allowed at the moment or not?
 *
 *  Return values are:
 *  1: Yes
 *  0: No
 */
M
Matt Caswell 已提交
40
static ossl_inline int cert_req_allowed(SSL *s)
M
Matt Caswell 已提交
41 42
{
    /* TLS does not like anon-DH with client cert */
43
    if ((s->version > SSL3_VERSION
E
Emilia Kasper 已提交
44 45
         && (s->s3->tmp.new_cipher->algorithm_auth & SSL_aNULL))
        || (s->s3->tmp.new_cipher->algorithm_auth & (SSL_aSRP | SSL_aPSK)))
M
Matt Caswell 已提交
46 47 48 49 50 51
        return 0;

    return 1;
}

/*
52
 * Should we expect the ServerKeyExchange message or not?
M
Matt Caswell 已提交
53 54 55 56 57
 *
 *  Return values are:
 *  1: Yes
 *  0: No
 */
58
static int key_exchange_expected(SSL *s)
M
Matt Caswell 已提交
59 60 61 62 63
{
    long alg_k = s->s3->tmp.new_cipher->algorithm_mkey;

    /*
     * Can't skip server key exchange if this is an ephemeral
64
     * ciphersuite or for SRP
M
Matt Caswell 已提交
65
     */
66 67 68
    if (alg_k & (SSL_kDHE | SSL_kECDHE | SSL_kDHEPSK | SSL_kECDHEPSK
                 | SSL_kSRP)) {
        return 1;
M
Matt Caswell 已提交
69 70
    }

71
    return 0;
M
Matt Caswell 已提交
72 73
}

74 75 76 77 78 79
/*
 * ossl_statem_client_read_transition() encapsulates the logic for the allowed
 * handshake state transitions when a TLS1.3 client is reading messages from the
 * server. The message type that the server has sent is provided in |mt|. The
 * current state is in |s->statem.hand_state|.
 *
80 81
 * Return values are 1 for success (transition allowed) and  0 on error
 * (transition not allowed)
82 83 84 85 86 87 88 89 90 91 92 93 94 95 96
 */
static int ossl_statem_client13_read_transition(SSL *s, int mt)
{
    OSSL_STATEM *st = &s->statem;

    /*
     * Note: There is no case for TLS_ST_CW_CLNT_HELLO, because we haven't
     * yet negotiated TLSv1.3 at that point so that is handled by
     * ossl_statem_client_read_transition()
     */

    switch (st->hand_state) {
    default:
        break;

97 98 99 100 101 102 103 104 105 106 107
    case TLS_ST_CW_CLNT_HELLO:
        /*
         * This must a ClientHello following a HelloRetryRequest, so the only
         * thing we can get now is a ServerHello.
         */
        if (mt == SSL3_MT_SERVER_HELLO) {
            st->hand_state = TLS_ST_CR_SRVR_HELLO;
            return 1;
        }
        break;

108
    case TLS_ST_CR_SRVR_HELLO:
M
Matt Caswell 已提交
109 110 111 112 113 114 115
        if (mt == SSL3_MT_ENCRYPTED_EXTENSIONS) {
            st->hand_state = TLS_ST_CR_ENCRYPTED_EXTENSIONS;
            return 1;
        }
        break;

    case TLS_ST_CR_ENCRYPTED_EXTENSIONS:
116
        if (s->hit) {
117 118
            if (mt == SSL3_MT_FINISHED) {
                st->hand_state = TLS_ST_CR_FINISHED;
119 120 121
                return 1;
            }
        } else {
122 123 124
            if (mt == SSL3_MT_CERTIFICATE_REQUEST) {
                st->hand_state = TLS_ST_CR_CERT_REQ;
                return 1;
125 126
            }
            if (mt == SSL3_MT_CERTIFICATE) {
127 128 129 130 131 132
                st->hand_state = TLS_ST_CR_CERT;
                return 1;
            }
        }
        break;

133 134 135 136 137 138 139
    case TLS_ST_CR_CERT_REQ:
        if (mt == SSL3_MT_CERTIFICATE) {
            st->hand_state = TLS_ST_CR_CERT;
            return 1;
        }
        break;

140
    case TLS_ST_CR_CERT:
141 142 143 144 145 146 147
        if (mt == SSL3_MT_CERTIFICATE_VERIFY) {
            st->hand_state = TLS_ST_CR_CERT_VRFY;
            return 1;
        }
        break;

    case TLS_ST_CR_CERT_VRFY:
148 149 150 151 152
        if (mt == SSL3_MT_FINISHED) {
            st->hand_state = TLS_ST_CR_FINISHED;
            return 1;
        }
        break;
153 154 155 156 157 158

    case TLS_ST_OK:
        if (mt == SSL3_MT_NEWSESSION_TICKET) {
            st->hand_state = TLS_ST_CR_SESSION_TICKET;
            return 1;
        }
159 160 161 162
        if (mt == SSL3_MT_KEY_UPDATE) {
            st->hand_state = TLS_ST_CR_KEY_UPDATE;
            return 1;
        }
163
        break;
164 165 166 167 168 169
    }

    /* No valid transition found */
    return 0;
}

M
Matt Caswell 已提交
170
/*
171 172 173 174
 * ossl_statem_client_read_transition() encapsulates the logic for the allowed
 * handshake state transitions when the client is reading messages from the
 * server. The message type that the server has sent is provided in |mt|. The
 * current state is in |s->statem.hand_state|.
M
Matt Caswell 已提交
175
 *
176 177
 * Return values are 1 for success (transition allowed) and  0 on error
 * (transition not allowed)
M
Matt Caswell 已提交
178
 */
179
int ossl_statem_client_read_transition(SSL *s, int mt)
M
Matt Caswell 已提交
180
{
M
Matt Caswell 已提交
181
    OSSL_STATEM *st = &s->statem;
182
    int ske_expected;
M
Matt Caswell 已提交
183

184
    /*
185 186
     * Note that after writing the first ClientHello we don't know what version
     * we are going to negotiate yet, so we don't take this branch until later.
187
     */
188
    if (SSL_IS_TLS13(s)) {
189 190 191 192
        if (!ossl_statem_client13_read_transition(s, mt))
            goto err;
        return 1;
    }
193

E
Emilia Kasper 已提交
194
    switch (st->hand_state) {
R
Rich Salz 已提交
195 196 197
    default:
        break;

M
Matt Caswell 已提交
198 199 200 201 202 203 204 205 206 207 208
    case TLS_ST_CW_CLNT_HELLO:
        if (mt == SSL3_MT_SERVER_HELLO) {
            st->hand_state = TLS_ST_CR_SRVR_HELLO;
            return 1;
        }

        if (SSL_IS_DTLS(s)) {
            if (mt == DTLS1_MT_HELLO_VERIFY_REQUEST) {
                st->hand_state = DTLS_ST_CR_HELLO_VERIFY_REQUEST;
                return 1;
            }
209 210 211 212 213
        } else {
            if (mt == SSL3_MT_HELLO_RETRY_REQUEST) {
                st->hand_state = TLS_ST_CR_HELLO_RETRY_REQUEST;
                return 1;
            }
M
Matt Caswell 已提交
214 215 216
        }
        break;

217
    case TLS_ST_EARLY_DATA:
218 219 220 221 222 223 224 225 226 227 228 229 230 231 232
        /*
         * We've not actually selected TLSv1.3 yet, but we have sent early
         * data. The only thing allowed now is a ServerHello or a
         * HelloRetryRequest.
         */
        if (mt == SSL3_MT_SERVER_HELLO) {
            st->hand_state = TLS_ST_CR_SRVR_HELLO;
            return 1;
        }
        if (mt == SSL3_MT_HELLO_RETRY_REQUEST) {
            st->hand_state = TLS_ST_CR_HELLO_RETRY_REQUEST;
            return 1;
        }
        break;

M
Matt Caswell 已提交
233 234
    case TLS_ST_CR_SRVR_HELLO:
        if (s->hit) {
R
Rich Salz 已提交
235
            if (s->ext.ticket_expected) {
M
Matt Caswell 已提交
236 237 238 239 240 241 242 243 244 245 246 247
                if (mt == SSL3_MT_NEWSESSION_TICKET) {
                    st->hand_state = TLS_ST_CR_SESSION_TICKET;
                    return 1;
                }
            } else if (mt == SSL3_MT_CHANGE_CIPHER_SPEC) {
                st->hand_state = TLS_ST_CR_CHANGE;
                return 1;
            }
        } else {
            if (SSL_IS_DTLS(s) && mt == DTLS1_MT_HELLO_VERIFY_REQUEST) {
                st->hand_state = DTLS_ST_CR_HELLO_VERIFY_REQUEST;
                return 1;
248
            } else if (s->version >= TLS1_VERSION
R
Rich Salz 已提交
249 250
                       && s->ext.session_secret_cb != NULL
                       && s->session->ext.tick != NULL
E
Emilia Kasper 已提交
251
                       && mt == SSL3_MT_CHANGE_CIPHER_SPEC) {
252 253 254 255 256 257 258 259 260
                /*
                 * Normally, we can tell if the server is resuming the session
                 * from the session ID. EAP-FAST (RFC 4851), however, relies on
                 * the next server message after the ServerHello to determine if
                 * the server is resuming.
                 */
                s->hit = 1;
                st->hand_state = TLS_ST_CR_CHANGE;
                return 1;
M
Matt Caswell 已提交
261
            } else if (!(s->s3->tmp.new_cipher->algorithm_auth
E
Emilia Kasper 已提交
262
                         & (SSL_aNULL | SSL_aSRP | SSL_aPSK))) {
M
Matt Caswell 已提交
263 264 265 266 267
                if (mt == SSL3_MT_CERTIFICATE) {
                    st->hand_state = TLS_ST_CR_CERT;
                    return 1;
                }
            } else {
268 269 270
                ske_expected = key_exchange_expected(s);
                /* SKE is optional for some PSK ciphersuites */
                if (ske_expected
E
Emilia Kasper 已提交
271 272
                    || ((s->s3->tmp.new_cipher->algorithm_mkey & SSL_PSK)
                        && mt == SSL3_MT_SERVER_KEY_EXCHANGE)) {
273 274 275 276 277
                    if (mt == SSL3_MT_SERVER_KEY_EXCHANGE) {
                        st->hand_state = TLS_ST_CR_KEY_EXCH;
                        return 1;
                    }
                } else if (mt == SSL3_MT_CERTIFICATE_REQUEST
E
Emilia Kasper 已提交
278 279 280
                           && cert_req_allowed(s)) {
                    st->hand_state = TLS_ST_CR_CERT_REQ;
                    return 1;
281
                } else if (mt == SSL3_MT_SERVER_DONE) {
E
Emilia Kasper 已提交
282 283
                    st->hand_state = TLS_ST_CR_SRVR_DONE;
                    return 1;
M
Matt Caswell 已提交
284 285 286 287 288 289
                }
            }
        }
        break;

    case TLS_ST_CR_CERT:
290 291
        /*
         * The CertificateStatus message is optional even if
R
Rich Salz 已提交
292
         * |ext.status_expected| is set
293
         */
R
Rich Salz 已提交
294
        if (s->ext.status_expected && mt == SSL3_MT_CERTIFICATE_STATUS) {
295 296
            st->hand_state = TLS_ST_CR_CERT_STATUS;
            return 1;
297 298 299 300 301 302
        }
        /* Fall through */

    case TLS_ST_CR_CERT_STATUS:
        ske_expected = key_exchange_expected(s);
        /* SKE is optional for some PSK ciphersuites */
E
Emilia Kasper 已提交
303 304
        if (ske_expected || ((s->s3->tmp.new_cipher->algorithm_mkey & SSL_PSK)
                             && mt == SSL3_MT_SERVER_KEY_EXCHANGE)) {
M
Matt Caswell 已提交
305 306 307 308
            if (mt == SSL3_MT_SERVER_KEY_EXCHANGE) {
                st->hand_state = TLS_ST_CR_KEY_EXCH;
                return 1;
            }
309
            goto err;
M
Matt Caswell 已提交
310
        }
311
        /* Fall through */
M
Matt Caswell 已提交
312

313 314 315
    case TLS_ST_CR_KEY_EXCH:
        if (mt == SSL3_MT_CERTIFICATE_REQUEST) {
            if (cert_req_allowed(s)) {
M
Matt Caswell 已提交
316 317 318
                st->hand_state = TLS_ST_CR_CERT_REQ;
                return 1;
            }
319
            goto err;
M
Matt Caswell 已提交
320
        }
321
        /* Fall through */
M
Matt Caswell 已提交
322 323 324 325 326 327 328 329 330

    case TLS_ST_CR_CERT_REQ:
        if (mt == SSL3_MT_SERVER_DONE) {
            st->hand_state = TLS_ST_CR_SRVR_DONE;
            return 1;
        }
        break;

    case TLS_ST_CW_FINISHED:
R
Rich Salz 已提交
331
        if (s->ext.ticket_expected) {
332 333 334 335
            if (mt == SSL3_MT_NEWSESSION_TICKET) {
                st->hand_state = TLS_ST_CR_SESSION_TICKET;
                return 1;
            }
M
Matt Caswell 已提交
336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354
        } else if (mt == SSL3_MT_CHANGE_CIPHER_SPEC) {
            st->hand_state = TLS_ST_CR_CHANGE;
            return 1;
        }
        break;

    case TLS_ST_CR_SESSION_TICKET:
        if (mt == SSL3_MT_CHANGE_CIPHER_SPEC) {
            st->hand_state = TLS_ST_CR_CHANGE;
            return 1;
        }
        break;

    case TLS_ST_CR_CHANGE:
        if (mt == SSL3_MT_FINISHED) {
            st->hand_state = TLS_ST_CR_FINISHED;
            return 1;
        }
        break;
355 356

    case TLS_ST_OK:
357
        if (mt == SSL3_MT_HELLO_REQUEST) {
358 359 360 361
            st->hand_state = TLS_ST_CR_HELLO_REQ;
            return 1;
        }
        break;
M
Matt Caswell 已提交
362 363
    }

364
 err:
M
Matt Caswell 已提交
365
    /* No valid transition found */
366 367 368
    SSLfatal(s, SSL3_AD_UNEXPECTED_MESSAGE,
             SSL_F_OSSL_STATEM_CLIENT_READ_TRANSITION,
             SSL_R_UNEXPECTED_MESSAGE);
M
Matt Caswell 已提交
369 370 371 372
    return 0;
}

/*
373 374 375 376 377 378 379 380 381
 * ossl_statem_client13_write_transition() works out what handshake state to
 * move to next when the TLSv1.3 client is writing messages to be sent to the
 * server.
 */
static WRITE_TRAN ossl_statem_client13_write_transition(SSL *s)
{
    OSSL_STATEM *st = &s->statem;

    /*
382 383 384
     * Note: There are no cases for TLS_ST_BEFORE because we haven't negotiated
     * TLSv1.3 yet at that point. They are handled by
     * ossl_statem_client_write_transition().
385 386 387 388
     */
    switch (st->hand_state) {
    default:
        /* Shouldn't happen */
389 390 391
        SSLfatal(s, SSL_AD_INTERNAL_ERROR,
                 SSL_F_OSSL_STATEM_CLIENT13_WRITE_TRANSITION,
                 ERR_R_INTERNAL_ERROR);
392 393
        return WRITE_TRAN_ERROR;

394 395 396 397
    case TLS_ST_CW_CLNT_HELLO:
        /* We only hit this in the case of HelloRetryRequest */
        return WRITE_TRAN_FINISHED;

398
    case TLS_ST_CR_FINISHED:
399 400
        if (s->early_data_state == SSL_EARLY_DATA_WRITE_RETRY
                || s->early_data_state == SSL_EARLY_DATA_FINISHED_WRITING)
401
            st->hand_state = TLS_ST_PENDING_EARLY_DATA_END;
402 403 404 405 406
        else
            st->hand_state = (s->s3->tmp.cert_req != 0) ? TLS_ST_CW_CERT
                                                        : TLS_ST_CW_FINISHED;
        return WRITE_TRAN_CONTINUE;

407
    case TLS_ST_PENDING_EARLY_DATA_END:
408 409 410 411 412 413 414
        if (s->ext.early_data == SSL_EARLY_DATA_ACCEPTED) {
            st->hand_state = TLS_ST_CW_END_OF_EARLY_DATA;
            return WRITE_TRAN_CONTINUE;
        }
        /* Fall through */

    case TLS_ST_CW_END_OF_EARLY_DATA:
415
        st->hand_state = (s->s3->tmp.cert_req != 0) ? TLS_ST_CW_CERT
416
                                                    : TLS_ST_CW_FINISHED;
417 418 419 420
        return WRITE_TRAN_CONTINUE;

    case TLS_ST_CW_CERT:
        /* If a non-empty Certificate we also send CertificateVerify */
421
        st->hand_state = (s->s3->tmp.cert_req == 1) ? TLS_ST_CW_CERT_VRFY
422
                                                    : TLS_ST_CW_FINISHED;
423 424 425 426 427 428
        return WRITE_TRAN_CONTINUE;

    case TLS_ST_CW_CERT_VRFY:
        st->hand_state = TLS_ST_CW_FINISHED;
        return WRITE_TRAN_CONTINUE;

429
    case TLS_ST_CR_KEY_UPDATE:
430 431 432 433 434 435
        if (s->key_update != SSL_KEY_UPDATE_NONE) {
            st->hand_state = TLS_ST_CW_KEY_UPDATE;
            return WRITE_TRAN_CONTINUE;
        }
        /* Fall through */

436
    case TLS_ST_CW_KEY_UPDATE:
437
    case TLS_ST_CR_SESSION_TICKET:
438
    case TLS_ST_CW_FINISHED:
439 440
        st->hand_state = TLS_ST_OK;
        return WRITE_TRAN_CONTINUE;
441 442

    case TLS_ST_OK:
443 444 445 446 447 448
        if (s->key_update != SSL_KEY_UPDATE_NONE) {
            st->hand_state = TLS_ST_CW_KEY_UPDATE;
            return WRITE_TRAN_CONTINUE;
        }

        /* Try to read from the server instead */
449
        return WRITE_TRAN_FINISHED;
450 451 452 453 454 455
    }
}

/*
 * ossl_statem_client_write_transition() works out what handshake state to
 * move to next when the client is writing messages to be sent to the server.
M
Matt Caswell 已提交
456
 */
457
WRITE_TRAN ossl_statem_client_write_transition(SSL *s)
M
Matt Caswell 已提交
458
{
M
Matt Caswell 已提交
459
    OSSL_STATEM *st = &s->statem;
M
Matt Caswell 已提交
460

461 462 463 464 465
    /*
     * Note that immediately before/after a ClientHello we don't know what
     * version we are going to negotiate yet, so we don't take this branch until
     * later
     */
466
    if (SSL_IS_TLS13(s))
467 468
        return ossl_statem_client13_write_transition(s);

E
Emilia Kasper 已提交
469
    switch (st->hand_state) {
R
Rich Salz 已提交
470 471
    default:
        /* Shouldn't happen */
472 473 474
        SSLfatal(s, SSL_AD_INTERNAL_ERROR,
                 SSL_F_OSSL_STATEM_CLIENT_WRITE_TRANSITION,
                 ERR_R_INTERNAL_ERROR);
R
Rich Salz 已提交
475 476
        return WRITE_TRAN_ERROR;

E
Emilia Kasper 已提交
477
    case TLS_ST_OK:
478 479 480 481 482 483 484
        if (!s->renegotiate) {
            /*
             * We haven't requested a renegotiation ourselves so we must have
             * received a message from the server. Better read it.
             */
            return WRITE_TRAN_FINISHED;
        }
B
Bernd Edlinger 已提交
485 486
        /* Renegotiation */
        /* fall thru */
E
Emilia Kasper 已提交
487 488 489
    case TLS_ST_BEFORE:
        st->hand_state = TLS_ST_CW_CLNT_HELLO;
        return WRITE_TRAN_CONTINUE;
M
Matt Caswell 已提交
490

E
Emilia Kasper 已提交
491
    case TLS_ST_CW_CLNT_HELLO:
492 493 494 495 496
        if (s->early_data_state == SSL_EARLY_DATA_CONNECTING) {
            /*
             * We are assuming this is a TLSv1.3 connection, although we haven't
             * actually selected a version yet.
             */
497
            st->hand_state = TLS_ST_EARLY_DATA;
498 499
            return WRITE_TRAN_CONTINUE;
        }
E
Emilia Kasper 已提交
500 501 502 503 504
        /*
         * No transition at the end of writing because we don't know what
         * we will be sent
         */
        return WRITE_TRAN_FINISHED;
M
Matt Caswell 已提交
505

M
Matt Caswell 已提交
506 507 508 509
    case TLS_ST_CR_HELLO_RETRY_REQUEST:
        st->hand_state = TLS_ST_CW_CLNT_HELLO;
        return WRITE_TRAN_CONTINUE;

510
    case TLS_ST_EARLY_DATA:
511 512
        return WRITE_TRAN_FINISHED;

E
Emilia Kasper 已提交
513 514 515
    case DTLS_ST_CR_HELLO_VERIFY_REQUEST:
        st->hand_state = TLS_ST_CW_CLNT_HELLO;
        return WRITE_TRAN_CONTINUE;
M
Matt Caswell 已提交
516

E
Emilia Kasper 已提交
517 518 519 520
    case TLS_ST_CR_SRVR_DONE:
        if (s->s3->tmp.cert_req)
            st->hand_state = TLS_ST_CW_CERT;
        else
M
Matt Caswell 已提交
521
            st->hand_state = TLS_ST_CW_KEY_EXCH;
E
Emilia Kasper 已提交
522
        return WRITE_TRAN_CONTINUE;
M
Matt Caswell 已提交
523

E
Emilia Kasper 已提交
524 525 526
    case TLS_ST_CW_CERT:
        st->hand_state = TLS_ST_CW_KEY_EXCH;
        return WRITE_TRAN_CONTINUE;
M
Matt Caswell 已提交
527

E
Emilia Kasper 已提交
528 529 530 531 532 533 534 535 536 537 538 539 540 541
    case TLS_ST_CW_KEY_EXCH:
        /*
         * For TLS, cert_req is set to 2, so a cert chain of nothing is
         * sent, but no verify packet is sent
         */
        /*
         * XXX: For now, we do not support client authentication in ECDH
         * cipher suites with ECDH (rather than ECDSA) certificates. We
         * need to skip the certificate verify message when client's
         * ECDH public key is sent inside the client certificate.
         */
        if (s->s3->tmp.cert_req == 1) {
            st->hand_state = TLS_ST_CW_CERT_VRFY;
        } else {
M
Matt Caswell 已提交
542
            st->hand_state = TLS_ST_CW_CHANGE;
E
Emilia Kasper 已提交
543 544 545 546 547
        }
        if (s->s3->flags & TLS1_FLAGS_SKIP_CERT_VERIFY) {
            st->hand_state = TLS_ST_CW_CHANGE;
        }
        return WRITE_TRAN_CONTINUE;
M
Matt Caswell 已提交
548

E
Emilia Kasper 已提交
549 550 551 552 553
    case TLS_ST_CW_CERT_VRFY:
        st->hand_state = TLS_ST_CW_CHANGE;
        return WRITE_TRAN_CONTINUE;

    case TLS_ST_CW_CHANGE:
M
Matt Caswell 已提交
554
#if defined(OPENSSL_NO_NEXTPROTONEG)
555 556
        st->
        hand_state = TLS_ST_CW_FINISHED;
M
Matt Caswell 已提交
557
#else
R
Rich Salz 已提交
558
        if (!SSL_IS_DTLS(s) && s->s3->npn_seen)
E
Emilia Kasper 已提交
559 560 561
            st->hand_state = TLS_ST_CW_NEXT_PROTO;
        else
            st->hand_state = TLS_ST_CW_FINISHED;
M
Matt Caswell 已提交
562
#endif
E
Emilia Kasper 已提交
563
        return WRITE_TRAN_CONTINUE;
M
Matt Caswell 已提交
564 565

#if !defined(OPENSSL_NO_NEXTPROTONEG)
E
Emilia Kasper 已提交
566 567 568
    case TLS_ST_CW_NEXT_PROTO:
        st->hand_state = TLS_ST_CW_FINISHED;
        return WRITE_TRAN_CONTINUE;
M
Matt Caswell 已提交
569 570
#endif

E
Emilia Kasper 已提交
571 572 573 574 575 576 577
    case TLS_ST_CW_FINISHED:
        if (s->hit) {
            st->hand_state = TLS_ST_OK;
            return WRITE_TRAN_CONTINUE;
        } else {
            return WRITE_TRAN_FINISHED;
        }
M
Matt Caswell 已提交
578

E
Emilia Kasper 已提交
579 580 581 582 583 584 585 586
    case TLS_ST_CR_FINISHED:
        if (s->hit) {
            st->hand_state = TLS_ST_CW_CHANGE;
            return WRITE_TRAN_CONTINUE;
        } else {
            st->hand_state = TLS_ST_OK;
            return WRITE_TRAN_CONTINUE;
        }
587 588 589 590 591 592 593 594

    case TLS_ST_CR_HELLO_REQ:
        /*
         * If we can renegotiate now then do so, otherwise wait for a more
         * convenient time.
         */
        if (ssl3_renegotiate_check(s, 1)) {
            if (!tls_setup_handshake(s)) {
595
                /* SSLfatal() already called */
596 597 598 599 600 601 602
                return WRITE_TRAN_ERROR;
            }
            st->hand_state = TLS_ST_CW_CLNT_HELLO;
            return WRITE_TRAN_CONTINUE;
        }
        st->hand_state = TLS_ST_OK;
        return WRITE_TRAN_CONTINUE;
M
Matt Caswell 已提交
603 604 605 606 607 608 609
    }
}

/*
 * Perform any pre work that needs to be done prior to sending a message from
 * the client to the server.
 */
610
WORK_STATE ossl_statem_client_pre_work(SSL *s, WORK_STATE wst)
M
Matt Caswell 已提交
611
{
M
Matt Caswell 已提交
612
    OSSL_STATEM *st = &s->statem;
M
Matt Caswell 已提交
613

E
Emilia Kasper 已提交
614
    switch (st->hand_state) {
R
Rich Salz 已提交
615 616 617 618
    default:
        /* No pre work to be done */
        break;

M
Matt Caswell 已提交
619 620 621 622
    case TLS_ST_CW_CLNT_HELLO:
        s->shutdown = 0;
        if (SSL_IS_DTLS(s)) {
            /* every DTLS ClientHello resets Finished MAC */
623
            if (!ssl3_init_finished_mac(s)) {
624
                /* SSLfatal() already called */
625 626
                return WORK_ERROR;
            }
M
Matt Caswell 已提交
627 628 629 630 631 632 633 634 635 636 637 638 639
        }
        break;

    case TLS_ST_CW_CHANGE:
        if (SSL_IS_DTLS(s)) {
            if (s->hit) {
                /*
                 * We're into the last flight so we don't retransmit these
                 * messages unless we need to.
                 */
                st->use_timer = 0;
            }
#ifndef OPENSSL_NO_SCTP
640 641
            if (BIO_dgram_is_sctp(SSL_get_wbio(s))) {
                /* Calls SSLfatal() as required */
M
Matt Caswell 已提交
642
                return dtls_wait_for_dry(s);
643
            }
M
Matt Caswell 已提交
644 645
#endif
        }
R
Rich Salz 已提交
646
        break;
M
Matt Caswell 已提交
647

648
    case TLS_ST_PENDING_EARLY_DATA_END:
649 650 651 652 653 654 655 656 657 658 659
        /*
         * If we've been called by SSL_do_handshake()/SSL_write(), or we did not
         * attempt to write early data before calling SSL_read() then we press
         * on with the handshake. Otherwise we pause here.
         */
        if (s->early_data_state == SSL_EARLY_DATA_FINISHED_WRITING
                || s->early_data_state == SSL_EARLY_DATA_NONE)
            return WORK_FINISHED_CONTINUE;
        /* Fall through */

    case TLS_ST_EARLY_DATA:
M
Matt Caswell 已提交
660
    case TLS_ST_OK:
661
        /* Calls SSLfatal() as required */
662
        return tls_finish_handshake(s, wst, 1);
M
Matt Caswell 已提交
663 664 665 666 667 668 669 670 671
    }

    return WORK_FINISHED_CONTINUE;
}

/*
 * Perform any work that needs to be done after sending a message from the
 * client to the server.
 */
672
WORK_STATE ossl_statem_client_post_work(SSL *s, WORK_STATE wst)
M
Matt Caswell 已提交
673
{
M
Matt Caswell 已提交
674
    OSSL_STATEM *st = &s->statem;
M
Matt Caswell 已提交
675 676 677

    s->init_num = 0;

E
Emilia Kasper 已提交
678
    switch (st->hand_state) {
R
Rich Salz 已提交
679 680 681 682
    default:
        /* No post work to be done */
        break;

M
Matt Caswell 已提交
683
    case TLS_ST_CW_CLNT_HELLO:
M
Matt Caswell 已提交
684
        if (wst == WORK_MORE_A && statem_flush(s) != 1)
M
Matt Caswell 已提交
685
            return WORK_MORE_A;
M
Matt Caswell 已提交
686

M
Matt Caswell 已提交
687 688 689 690
        if (SSL_IS_DTLS(s)) {
            /* Treat the next message as the first packet */
            s->first_packet = 1;
        }
691 692 693 694 695 696 697 698 699

        if (s->early_data_state == SSL_EARLY_DATA_CONNECTING
                && s->max_early_data > 0) {
            /*
             * We haven't selected TLSv1.3 yet so we don't call the change
             * cipher state function associated with the SSL_METHOD. Instead
             * we call tls13_change_cipher_state() directly.
             */
            if (!tls13_change_cipher_state(s,
700 701
                        SSL3_CC_EARLY | SSL3_CHANGE_CIPHER_CLIENT_WRITE)) {
                /* SSLfatal() already called */
702
                return WORK_ERROR;
703
            }
704
        }
M
Matt Caswell 已提交
705 706
        break;

707 708 709 710 711 712 713 714 715
    case TLS_ST_CW_END_OF_EARLY_DATA:
        /*
         * We set the enc_write_ctx back to NULL because we may end up writing
         * in cleartext again if we get a HelloRetryRequest from the server.
         */
        EVP_CIPHER_CTX_free(s->enc_write_ctx);
        s->enc_write_ctx = NULL;
        break;

M
Matt Caswell 已提交
716
    case TLS_ST_CW_KEY_EXCH:
717 718
        if (tls_client_key_exchange_post_work(s) == 0) {
            /* SSLfatal() already called */
M
Matt Caswell 已提交
719
            return WORK_ERROR;
720
        }
M
Matt Caswell 已提交
721 722 723 724 725 726 727 728 729 730 731 732
        break;

    case TLS_ST_CW_CHANGE:
        s->session->cipher = s->s3->tmp.new_cipher;
#ifdef OPENSSL_NO_COMP
        s->session->compress_meth = 0;
#else
        if (s->s3->tmp.new_compression == NULL)
            s->session->compress_meth = 0;
        else
            s->session->compress_meth = s->s3->tmp.new_compression->id;
#endif
733 734
        if (!s->method->ssl3_enc->setup_key_block(s)) {
            /* SSLfatal() already called */
M
Matt Caswell 已提交
735
            return WORK_ERROR;
736
        }
M
Matt Caswell 已提交
737 738

        if (!s->method->ssl3_enc->change_cipher_state(s,
739 740
                                          SSL3_CHANGE_CIPHER_CLIENT_WRITE)) {
            /* SSLfatal() already called */
M
Matt Caswell 已提交
741
            return WORK_ERROR;
742
        }
M
Matt Caswell 已提交
743 744 745 746 747 748 749 750 751 752 753 754 755 756 757 758 759 760 761 762 763 764 765 766 767 768 769 770 771 772

        if (SSL_IS_DTLS(s)) {
#ifndef OPENSSL_NO_SCTP
            if (s->hit) {
                /*
                 * Change to new shared key of SCTP-Auth, will be ignored if
                 * no SCTP used.
                 */
                BIO_ctrl(SSL_get_wbio(s), BIO_CTRL_DGRAM_SCTP_NEXT_AUTH_KEY,
                         0, NULL);
            }
#endif

            dtls1_reset_seq_numbers(s, SSL3_CC_WRITE);
        }
        break;

    case TLS_ST_CW_FINISHED:
#ifndef OPENSSL_NO_SCTP
        if (wst == WORK_MORE_A && SSL_IS_DTLS(s) && s->hit == 0) {
            /*
             * Change to new shared key of SCTP-Auth, will be ignored if
             * no SCTP used.
             */
            BIO_ctrl(SSL_get_wbio(s), BIO_CTRL_DGRAM_SCTP_NEXT_AUTH_KEY,
                     0, NULL);
        }
#endif
        if (statem_flush(s) != 1)
            return WORK_MORE_B;
773 774 775

        if (SSL_IS_TLS13(s)) {
            if (!s->method->ssl3_enc->change_cipher_state(s,
776 777 778 779
                        SSL3_CC_APPLICATION | SSL3_CHANGE_CIPHER_CLIENT_WRITE)) {
                /* SSLfatal() already called */
                return WORK_ERROR;
            }
780
        }
M
Matt Caswell 已提交
781
        break;
782 783 784 785

    case TLS_ST_CW_KEY_UPDATE:
        if (statem_flush(s) != 1)
            return WORK_MORE_A;
786 787
        if (!tls13_update_key(s, 1)) {
            /* SSLfatal() already called */
788
            return WORK_ERROR;
789
        }
790
        break;
M
Matt Caswell 已提交
791 792 793 794 795 796
    }

    return WORK_FINISHED_CONTINUE;
}

/*
797 798
 * Get the message construction function and message type for sending from the
 * client
M
Matt Caswell 已提交
799 800 801 802 803
 *
 * Valid return values are:
 *   1: Success
 *   0: Error
 */
804
int ossl_statem_client_construct_message(SSL *s, WPACKET *pkt,
805
                                         confunc_f *confunc, int *mt)
M
Matt Caswell 已提交
806
{
M
Matt Caswell 已提交
807
    OSSL_STATEM *st = &s->statem;
M
Matt Caswell 已提交
808

809 810 811
    switch (st->hand_state) {
    default:
        /* Shouldn't happen */
812 813 814
        SSLfatal(s, SSL_AD_INTERNAL_ERROR,
                 SSL_F_OSSL_STATEM_CLIENT_CONSTRUCT_MESSAGE,
                 SSL_R_BAD_HANDSHAKE_STATE);
815 816 817
        return 0;

    case TLS_ST_CW_CHANGE:
818
        if (SSL_IS_DTLS(s))
819
            *confunc = dtls_construct_change_cipher_spec;
820
        else
821 822
            *confunc = tls_construct_change_cipher_spec;
        *mt = SSL3_MT_CHANGE_CIPHER_SPEC;
823 824 825
        break;

    case TLS_ST_CW_CLNT_HELLO:
826 827
        *confunc = tls_construct_client_hello;
        *mt = SSL3_MT_CLIENT_HELLO;
828 829
        break;

830 831 832 833 834 835 836 837 838 839
    case TLS_ST_CW_END_OF_EARLY_DATA:
        *confunc = tls_construct_end_of_early_data;
        *mt = SSL3_MT_END_OF_EARLY_DATA;
        break;

    case TLS_ST_PENDING_EARLY_DATA_END:
        *confunc = NULL;
        *mt = SSL3_MT_DUMMY;
        break;

840
    case TLS_ST_CW_CERT:
841 842
        *confunc = tls_construct_client_certificate;
        *mt = SSL3_MT_CERTIFICATE;
843 844 845
        break;

    case TLS_ST_CW_KEY_EXCH:
846 847
        *confunc = tls_construct_client_key_exchange;
        *mt = SSL3_MT_CLIENT_KEY_EXCHANGE;
848 849 850
        break;

    case TLS_ST_CW_CERT_VRFY:
851
        *confunc = tls_construct_cert_verify;
852
        *mt = SSL3_MT_CERTIFICATE_VERIFY;
853
        break;
M
Matt Caswell 已提交
854 855

#if !defined(OPENSSL_NO_NEXTPROTONEG)
856
    case TLS_ST_CW_NEXT_PROTO:
857 858
        *confunc = tls_construct_next_proto;
        *mt = SSL3_MT_NEXT_PROTO;
859
        break;
M
Matt Caswell 已提交
860
#endif
861
    case TLS_ST_CW_FINISHED:
862 863
        *confunc = tls_construct_finished;
        *mt = SSL3_MT_FINISHED;
864
        break;
865 866 867 868 869

    case TLS_ST_CW_KEY_UPDATE:
        *confunc = tls_construct_key_update;
        *mt = SSL3_MT_KEY_UPDATE;
        break;
870
    }
871 872

    return 1;
M
Matt Caswell 已提交
873 874 875 876 877 878
}

/*
 * Returns the maximum allowed length for the current message that we are
 * reading. Excludes the message header.
 */
879
size_t ossl_statem_client_max_message_size(SSL *s)
M
Matt Caswell 已提交
880
{
M
Matt Caswell 已提交
881
    OSSL_STATEM *st = &s->statem;
M
Matt Caswell 已提交
882

E
Emilia Kasper 已提交
883
    switch (st->hand_state) {
R
Rich Salz 已提交
884 885 886 887
    default:
        /* Shouldn't happen */
        return 0;

E
Emilia Kasper 已提交
888 889
    case TLS_ST_CR_SRVR_HELLO:
        return SERVER_HELLO_MAX_LENGTH;
M
Matt Caswell 已提交
890

E
Emilia Kasper 已提交
891 892
    case DTLS_ST_CR_HELLO_VERIFY_REQUEST:
        return HELLO_VERIFY_REQUEST_MAX_LENGTH;
M
Matt Caswell 已提交
893

894 895 896
    case TLS_ST_CR_HELLO_RETRY_REQUEST:
        return HELLO_RETRY_REQUEST_MAX_LENGTH;

E
Emilia Kasper 已提交
897 898
    case TLS_ST_CR_CERT:
        return s->max_cert_list;
M
Matt Caswell 已提交
899

900 901 902
    case TLS_ST_CR_CERT_VRFY:
        return SSL3_RT_MAX_PLAIN_LENGTH;

E
Emilia Kasper 已提交
903 904
    case TLS_ST_CR_CERT_STATUS:
        return SSL3_RT_MAX_PLAIN_LENGTH;
M
Matt Caswell 已提交
905

E
Emilia Kasper 已提交
906 907
    case TLS_ST_CR_KEY_EXCH:
        return SERVER_KEY_EXCH_MAX_LENGTH;
M
Matt Caswell 已提交
908

E
Emilia Kasper 已提交
909 910 911 912 913 914 915
    case TLS_ST_CR_CERT_REQ:
        /*
         * Set to s->max_cert_list for compatibility with previous releases. In
         * practice these messages can get quite long if servers are configured
         * to provide a long list of acceptable CAs
         */
        return s->max_cert_list;
M
Matt Caswell 已提交
916

E
Emilia Kasper 已提交
917 918
    case TLS_ST_CR_SRVR_DONE:
        return SERVER_HELLO_DONE_MAX_LENGTH;
M
Matt Caswell 已提交
919

E
Emilia Kasper 已提交
920 921 922 923
    case TLS_ST_CR_CHANGE:
        if (s->version == DTLS1_BAD_VER)
            return 3;
        return CCS_MAX_LENGTH;
M
Matt Caswell 已提交
924

E
Emilia Kasper 已提交
925 926
    case TLS_ST_CR_SESSION_TICKET:
        return SSL3_RT_MAX_PLAIN_LENGTH;
M
Matt Caswell 已提交
927

E
Emilia Kasper 已提交
928 929
    case TLS_ST_CR_FINISHED:
        return FINISHED_MAX_LENGTH;
M
Matt Caswell 已提交
930 931 932

    case TLS_ST_CR_ENCRYPTED_EXTENSIONS:
        return ENCRYPTED_EXTENSIONS_MAX_LENGTH;
933 934 935

    case TLS_ST_CR_KEY_UPDATE:
        return KEY_UPDATE_MAX_LENGTH;
M
Matt Caswell 已提交
936 937 938 939 940 941
    }
}

/*
 * Process a message that the client has been received from the server.
 */
942
MSG_PROCESS_RETURN ossl_statem_client_process_message(SSL *s, PACKET *pkt)
M
Matt Caswell 已提交
943
{
M
Matt Caswell 已提交
944
    OSSL_STATEM *st = &s->statem;
M
Matt Caswell 已提交
945

E
Emilia Kasper 已提交
946
    switch (st->hand_state) {
R
Rich Salz 已提交
947 948
    default:
        /* Shouldn't happen */
949 950 951
        SSLfatal(s, SSL_AD_INTERNAL_ERROR,
                 SSL_F_OSSL_STATEM_CLIENT_PROCESS_MESSAGE,
                 ERR_R_INTERNAL_ERROR);
R
Rich Salz 已提交
952 953
        return MSG_PROCESS_ERROR;

E
Emilia Kasper 已提交
954 955
    case TLS_ST_CR_SRVR_HELLO:
        return tls_process_server_hello(s, pkt);
M
Matt Caswell 已提交
956

E
Emilia Kasper 已提交
957 958
    case DTLS_ST_CR_HELLO_VERIFY_REQUEST:
        return dtls_process_hello_verify(s, pkt);
M
Matt Caswell 已提交
959

960 961 962
    case TLS_ST_CR_HELLO_RETRY_REQUEST:
        return tls_process_hello_retry_request(s, pkt);

E
Emilia Kasper 已提交
963 964
    case TLS_ST_CR_CERT:
        return tls_process_server_certificate(s, pkt);
M
Matt Caswell 已提交
965

966 967 968
    case TLS_ST_CR_CERT_VRFY:
        return tls_process_cert_verify(s, pkt);

E
Emilia Kasper 已提交
969 970
    case TLS_ST_CR_CERT_STATUS:
        return tls_process_cert_status(s, pkt);
M
Matt Caswell 已提交
971

E
Emilia Kasper 已提交
972 973
    case TLS_ST_CR_KEY_EXCH:
        return tls_process_key_exchange(s, pkt);
M
Matt Caswell 已提交
974

E
Emilia Kasper 已提交
975 976
    case TLS_ST_CR_CERT_REQ:
        return tls_process_certificate_request(s, pkt);
M
Matt Caswell 已提交
977

E
Emilia Kasper 已提交
978 979
    case TLS_ST_CR_SRVR_DONE:
        return tls_process_server_done(s, pkt);
M
Matt Caswell 已提交
980

E
Emilia Kasper 已提交
981 982
    case TLS_ST_CR_CHANGE:
        return tls_process_change_cipher_spec(s, pkt);
M
Matt Caswell 已提交
983

E
Emilia Kasper 已提交
984 985
    case TLS_ST_CR_SESSION_TICKET:
        return tls_process_new_session_ticket(s, pkt);
M
Matt Caswell 已提交
986

E
Emilia Kasper 已提交
987 988
    case TLS_ST_CR_FINISHED:
        return tls_process_finished(s, pkt);
M
Matt Caswell 已提交
989

990 991 992
    case TLS_ST_CR_HELLO_REQ:
        return tls_process_hello_req(s, pkt);

M
Matt Caswell 已提交
993 994
    case TLS_ST_CR_ENCRYPTED_EXTENSIONS:
        return tls_process_encrypted_extensions(s, pkt);
995 996 997

    case TLS_ST_CR_KEY_UPDATE:
        return tls_process_key_update(s, pkt);
M
Matt Caswell 已提交
998 999 1000 1001 1002 1003 1004
    }
}

/*
 * Perform any further processing required following the receipt of a message
 * from the server
 */
1005
WORK_STATE ossl_statem_client_post_process_message(SSL *s, WORK_STATE wst)
M
Matt Caswell 已提交
1006
{
M
Matt Caswell 已提交
1007
    OSSL_STATEM *st = &s->statem;
M
Matt Caswell 已提交
1008

E
Emilia Kasper 已提交
1009
    switch (st->hand_state) {
R
Rich Salz 已提交
1010 1011
    default:
        /* Shouldn't happen */
1012 1013 1014
        SSLfatal(s, SSL_AD_INTERNAL_ERROR,
                 SSL_F_OSSL_STATEM_CLIENT_POST_PROCESS_MESSAGE,
                 ERR_R_INTERNAL_ERROR);
R
Rich Salz 已提交
1015 1016
        return WORK_ERROR;

1017 1018
    case TLS_ST_CR_CERT_REQ:
        return tls_prepare_client_certificate(s, wst);
M
Matt Caswell 已提交
1019 1020 1021
    }
}

1022
int tls_construct_client_hello(SSL *s, WPACKET *pkt)
1023
{
1024
    unsigned char *p;
1025 1026
    size_t sess_id_len;
    int i, protverr;
1027
#ifndef OPENSSL_NO_COMP
1028 1029
    SSL_COMP *comp;
#endif
1030
    SSL_SESSION *sess = s->session;
1031

1032
    if (!WPACKET_set_max_size(pkt, SSL3_RT_MAX_PLAIN_LENGTH)) {
1033
        /* Should not happen */
1034 1035
        SSLfatal(s, SSL_AD_INTERNAL_ERROR,
                 SSL_F_TLS_CONSTRUCT_CLIENT_HELLO, ERR_R_INTERNAL_ERROR);
1036
        return 0;
1037
    }
1038

1039
    /* Work out what SSL/TLS/DTLS version to use */
1040 1041
    protverr = ssl_set_client_hello_version(s);
    if (protverr != 0) {
1042 1043
        SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_TLS_CONSTRUCT_CLIENT_HELLO,
                 protverr);
1044
        return 0;
1045
    }
1046

1047 1048 1049
    if (sess == NULL
            || !ssl_version_supported(s, sess->ssl_version)
            || !SSL_SESSION_is_resumable(sess)) {
1050 1051
        if (!ssl_get_new_session(s, 0)) {
            /* SSLfatal() already called */
1052
            return 0;
1053
        }
1054 1055
    }
    /* else use the pre-loaded session */
1056

1057
    p = s->s3->client_random;
1058

1059 1060 1061 1062 1063 1064 1065 1066 1067 1068 1069
    /*
     * for DTLS if client_random is initialized, reuse it, we are
     * required to use same upon reply to HelloVerify
     */
    if (SSL_IS_DTLS(s)) {
        size_t idx;
        i = 1;
        for (idx = 0; idx < sizeof(s->s3->client_random); idx++) {
            if (p[idx]) {
                i = 0;
                break;
1070 1071
            }
        }
1072 1073 1074
    } else {
        i = s->hello_retry_request == 0;
    }
1075

1076
    if (i && ssl_fill_hello_random(s, 0, p, sizeof(s->s3->client_random),
1077 1078 1079
                                   DOWNGRADE_NONE) <= 0) {
        SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_TLS_CONSTRUCT_CLIENT_HELLO,
                 ERR_R_INTERNAL_ERROR);
1080
        return 0;
1081
    }
1082 1083 1084 1085 1086 1087 1088 1089 1090 1091 1092 1093 1094 1095 1096 1097

    /*-
     * version indicates the negotiated version: for example from
     * an SSLv2/v3 compatible client hello). The client_version
     * field is the maximum version we permit and it is also
     * used in RSA encrypted premaster secrets. Some servers can
     * choke if we initially report a higher version then
     * renegotiate to a lower one in the premaster secret. This
     * didn't happen with TLS 1.0 as most servers supported it
     * but it can with TLS 1.1 or later if the server only supports
     * 1.0.
     *
     * Possible scenario with previous logic:
     *      1. Client hello indicates TLS 1.2
     *      2. Server hello says TLS 1.0
     *      3. RSA encrypted premaster secret uses 1.2.
F
FdaSilvaYY 已提交
1098
     *      4. Handshake proceeds using TLS 1.0.
1099 1100 1101 1102 1103 1104 1105 1106 1107 1108 1109 1110 1111
     *      5. Server sends hello request to renegotiate.
     *      6. Client hello indicates TLS v1.0 as we now
     *         know that is maximum server supports.
     *      7. Server chokes on RSA encrypted premaster secret
     *         containing version 1.0.
     *
     * For interoperability it should be OK to always use the
     * maximum version we support in client hello and then rely
     * on the checking of version to ensure the servers isn't
     * being inconsistent: for example initially negotiating with
     * TLS 1.0 and renegotiating with TLS 1.2. We do this by using
     * client_version in client hello and not resetting it to
     * the negotiated version.
1112 1113
     *
     * For TLS 1.3 we always set the ClientHello version to 1.2 and rely on the
1114
     * supported_versions extension for the real supported versions.
1115
     */
1116
    if (!WPACKET_put_bytes_u16(pkt, s->client_version)
1117
            || !WPACKET_memcpy(pkt, s->s3->client_random, SSL3_RANDOM_SIZE)) {
1118 1119
        SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_TLS_CONSTRUCT_CLIENT_HELLO,
                 ERR_R_INTERNAL_ERROR);
1120
        return 0;
1121
    }
1122 1123

    /* Session ID */
M
Matt Caswell 已提交
1124
    if (s->new_session || s->session->ssl_version == TLS1_3_VERSION)
1125
        sess_id_len = 0;
1126
    else
1127 1128
        sess_id_len = s->session->session_id_length;
    if (sess_id_len > sizeof(s->session->session_id)
1129
            || !WPACKET_start_sub_packet_u8(pkt)
1130 1131
            || (sess_id_len != 0 && !WPACKET_memcpy(pkt, s->session->session_id,
                                                    sess_id_len))
1132
            || !WPACKET_close(pkt)) {
1133 1134
        SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_TLS_CONSTRUCT_CLIENT_HELLO,
                 ERR_R_INTERNAL_ERROR);
1135
        return 0;
1136
    }
1137

1138 1139
    /* cookie stuff for DTLS */
    if (SSL_IS_DTLS(s)) {
1140
        if (s->d1->cookie_len > sizeof(s->d1->cookie)
1141
                || !WPACKET_sub_memcpy_u8(pkt, s->d1->cookie,
1142
                                          s->d1->cookie_len)) {
1143 1144
            SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_TLS_CONSTRUCT_CLIENT_HELLO,
                     ERR_R_INTERNAL_ERROR);
1145
            return 0;
1146
        }
1147 1148 1149
    }

    /* Ciphers supported */
1150
    if (!WPACKET_start_sub_packet_u16(pkt)) {
1151 1152
        SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_TLS_CONSTRUCT_CLIENT_HELLO,
                 ERR_R_INTERNAL_ERROR);
1153
        return 0;
1154
    }
1155

1156 1157
    if (!ssl_cipher_list_to_bytes(s, SSL_get_ciphers(s), pkt)) {
        /* SSLfatal() already called */
1158
        return 0;
1159
    }
1160
    if (!WPACKET_close(pkt)) {
1161 1162
        SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_TLS_CONSTRUCT_CLIENT_HELLO,
                 ERR_R_INTERNAL_ERROR);
1163
        return 0;
1164
    }
1165

1166
    /* COMPRESSION */
1167
    if (!WPACKET_start_sub_packet_u8(pkt)) {
1168 1169
        SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_TLS_CONSTRUCT_CLIENT_HELLO,
                 ERR_R_INTERNAL_ERROR);
1170
        return 0;
1171 1172
    }
#ifndef OPENSSL_NO_COMP
1173 1174 1175
    if (ssl_allow_compression(s)
            && s->ctx->comp_methods
            && (SSL_IS_DTLS(s) || s->s3->tmp.max_ver < TLS1_3_VERSION)) {
1176 1177 1178
        int compnum = sk_SSL_COMP_num(s->ctx->comp_methods);
        for (i = 0; i < compnum; i++) {
            comp = sk_SSL_COMP_value(s->ctx->comp_methods, i);
1179
            if (!WPACKET_put_bytes_u8(pkt, comp->id)) {
1180 1181 1182
                SSLfatal(s, SSL_AD_INTERNAL_ERROR,
                         SSL_F_TLS_CONSTRUCT_CLIENT_HELLO,
                         ERR_R_INTERNAL_ERROR);
1183
                return 0;
1184 1185
            }
        }
1186
    }
1187
#endif
1188
    /* Add the NULL method */
1189
    if (!WPACKET_put_bytes_u8(pkt, 0) || !WPACKET_close(pkt)) {
1190 1191
        SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_TLS_CONSTRUCT_CLIENT_HELLO,
                 ERR_R_INTERNAL_ERROR);
1192
        return 0;
1193
    }
1194

1195
    /* TLS extensions */
1196 1197
    if (!tls_construct_extensions(s, pkt, SSL_EXT_CLIENT_HELLO, NULL, 0)) {
        /* SSLfatal() already called */
1198
        return 0;
1199
    }
1200

1201
    return 1;
1202
}
1203

M
Matt Caswell 已提交
1204
MSG_PROCESS_RETURN dtls_process_hello_verify(SSL *s, PACKET *pkt)
M
Matt Caswell 已提交
1205
{
M
Matt Caswell 已提交
1206
    size_t cookie_len;
M
Matt Caswell 已提交
1207 1208 1209
    PACKET cookiepkt;

    if (!PACKET_forward(pkt, 2)
E
Emilia Kasper 已提交
1210
        || !PACKET_get_length_prefixed_1(pkt, &cookiepkt)) {
1211 1212 1213
        SSLfatal(s, SSL_AD_DECODE_ERROR, SSL_F_DTLS_PROCESS_HELLO_VERIFY,
                 SSL_R_LENGTH_MISMATCH);
        return MSG_PROCESS_ERROR;
M
Matt Caswell 已提交
1214 1215 1216 1217
    }

    cookie_len = PACKET_remaining(&cookiepkt);
    if (cookie_len > sizeof(s->d1->cookie)) {
1218 1219 1220
        SSLfatal(s, SSL_AD_ILLEGAL_PARAMETER, SSL_F_DTLS_PROCESS_HELLO_VERIFY,
                 SSL_R_LENGTH_TOO_LONG);
        return MSG_PROCESS_ERROR;
M
Matt Caswell 已提交
1221 1222 1223
    }

    if (!PACKET_copy_bytes(&cookiepkt, s->d1->cookie, cookie_len)) {
1224 1225 1226
        SSLfatal(s, SSL_AD_DECODE_ERROR, SSL_F_DTLS_PROCESS_HELLO_VERIFY,
                 SSL_R_LENGTH_MISMATCH);
        return MSG_PROCESS_ERROR;
M
Matt Caswell 已提交
1227 1228 1229 1230 1231 1232
    }
    s->d1->cookie_len = cookie_len;

    return MSG_PROCESS_FINISHED_READING;
}

1233
static int set_client_ciphersuite(SSL *s, const unsigned char *cipherchars)
1234 1235 1236
{
    STACK_OF(SSL_CIPHER) *sk;
    const SSL_CIPHER *c;
1237 1238 1239 1240 1241
    int i;

    c = ssl_get_cipher_by_char(s, cipherchars, 0);
    if (c == NULL) {
        /* unknown cipher */
1242 1243
        SSLfatal(s, SSL_AD_ILLEGAL_PARAMETER, SSL_F_SET_CLIENT_CIPHERSUITE,
                 SSL_R_UNKNOWN_CIPHER_RETURNED);
1244 1245 1246 1247 1248 1249
        return 0;
    }
    /*
     * If it is a disabled cipher we either didn't send it in client hello,
     * or it's not allowed for the selected protocol. So we return an error.
     */
1250
    if (ssl_cipher_disabled(s, c, SSL_SECOP_CIPHER_CHECK, 1)) {
1251 1252
        SSLfatal(s, SSL_AD_ILLEGAL_PARAMETER, SSL_F_SET_CLIENT_CIPHERSUITE,
                 SSL_R_WRONG_CIPHER_RETURNED);
1253 1254 1255 1256 1257 1258 1259
        return 0;
    }

    sk = ssl_get_ciphers_by_id(s);
    i = sk_SSL_CIPHER_find(sk, c);
    if (i < 0) {
        /* we did not say we would use this cipher */
1260 1261
        SSLfatal(s, SSL_AD_ILLEGAL_PARAMETER, SSL_F_SET_CLIENT_CIPHERSUITE,
                 SSL_R_WRONG_CIPHER_RETURNED);
1262 1263 1264 1265 1266 1267
        return 0;
    }

    if (SSL_IS_TLS13(s) && s->s3->tmp.new_cipher != NULL
            && s->s3->tmp.new_cipher->id != c->id) {
        /* ServerHello selected a different ciphersuite to that in the HRR */
1268 1269
        SSLfatal(s, SSL_AD_ILLEGAL_PARAMETER, SSL_F_SET_CLIENT_CIPHERSUITE,
                 SSL_R_WRONG_CIPHER_RETURNED);
1270 1271 1272 1273 1274 1275 1276 1277 1278 1279 1280
        return 0;
    }

    /*
     * Depending on the session caching (internal/external), the cipher
     * and/or cipher_id values may not be set. Make sure that cipher_id is
     * set and use it for comparison.
     */
    if (s->session->cipher != NULL)
        s->session->cipher_id = s->session->cipher->id;
    if (s->hit && (s->session->cipher_id != c->id)) {
1281 1282 1283 1284 1285 1286 1287
        if (SSL_IS_TLS13(s)) {
            /*
             * In TLSv1.3 it is valid for the server to select a different
             * ciphersuite as long as the hash is the same.
             */
            if (ssl_md(c->algorithm2)
                    != ssl_md(s->session->cipher->algorithm2)) {
1288 1289 1290
                SSLfatal(s, SSL_AD_ILLEGAL_PARAMETER,
                         SSL_F_SET_CLIENT_CIPHERSUITE,
                         SSL_R_CIPHERSUITE_DIGEST_HAS_CHANGED);
1291 1292 1293 1294 1295 1296 1297
                return 0;
            }
        } else {
            /*
             * Prior to TLSv1.3 resuming a session always meant using the same
             * ciphersuite.
             */
1298 1299
            SSLfatal(s, SSL_AD_ILLEGAL_PARAMETER, SSL_F_SET_CLIENT_CIPHERSUITE,
                     SSL_R_OLD_SESSION_CIPHER_NOT_RETURNED);
1300 1301
            return 0;
        }
1302 1303 1304 1305 1306 1307 1308 1309
    }
    s->s3->tmp.new_cipher = c;

    return 1;
}

MSG_PROCESS_RETURN tls_process_server_hello(SSL *s, PACKET *pkt)
{
1310
    PACKET session_id, extpkt;
1311
    size_t session_id_len;
E
Emilia Kasper 已提交
1312
    const unsigned char *cipherchars;
1313
    unsigned int compression;
1314
    unsigned int sversion;
M
Matt Caswell 已提交
1315
    unsigned int context;
M
Matt Caswell 已提交
1316
    int discard;
1317
    RAW_EXTENSION *extensions = NULL;
1318 1319 1320 1321
#ifndef OPENSSL_NO_COMP
    SSL_COMP *comp;
#endif

1322
    if (!PACKET_get_net_2(pkt, &sversion)) {
1323 1324 1325
        SSLfatal(s, SSL_AD_DECODE_ERROR, SSL_F_TLS_PROCESS_SERVER_HELLO,
                 SSL_R_LENGTH_MISMATCH);
        goto err;
1326
    }
M
Matt Caswell 已提交
1327

1328 1329
    /* load the server random */
    if (!PACKET_copy_bytes(pkt, s->s3->server_random, SSL3_RANDOM_SIZE)) {
1330 1331 1332
        SSLfatal(s, SSL_AD_DECODE_ERROR, SSL_F_TLS_PROCESS_SERVER_HELLO,
                 SSL_R_LENGTH_MISMATCH);
        goto err;
1333 1334
    }

1335 1336 1337 1338
    /* Get the session-id. */
    if (!PACKET_get_length_prefixed_1(pkt, &session_id)) {
        SSLfatal(s, SSL_AD_DECODE_ERROR, SSL_F_TLS_PROCESS_SERVER_HELLO,
                 SSL_R_LENGTH_MISMATCH);
1339
        goto err;
1340
    }
1341 1342 1343 1344 1345
    session_id_len = PACKET_remaining(&session_id);
    if (session_id_len > sizeof(s->session->session_id)
        || session_id_len > SSL3_SESSION_ID_SIZE) {
        SSLfatal(s, SSL_AD_ILLEGAL_PARAMETER, SSL_F_TLS_PROCESS_SERVER_HELLO,
                 SSL_R_SSL3_SESSION_ID_TOO_LONG);
1346
        goto err;
1347 1348
    }

1349
    if (!PACKET_get_bytes(pkt, &cipherchars, TLS_CIPHER_LEN)) {
1350 1351 1352
        SSLfatal(s, SSL_AD_DECODE_ERROR, SSL_F_TLS_PROCESS_SERVER_HELLO,
                 SSL_R_LENGTH_MISMATCH);
        goto err;
1353 1354
    }

1355 1356 1357 1358
    if (!PACKET_get_1(pkt, &compression)) {
        SSLfatal(s, SSL_AD_DECODE_ERROR, SSL_F_TLS_PROCESS_SERVER_HELLO,
                 SSL_R_LENGTH_MISMATCH);
        goto err;
1359 1360 1361 1362 1363
    }

    /* TLS extensions */
    if (PACKET_remaining(pkt) == 0) {
        PACKET_null_init(&extpkt);
1364 1365
    } else if (!PACKET_as_length_prefixed_2(pkt, &extpkt)
               || PACKET_remaining(pkt) != 0) {
1366 1367 1368
        SSLfatal(s, SSL_AD_DECODE_ERROR, SSL_F_TLS_PROCESS_SERVER_HELLO,
                 SSL_R_BAD_LENGTH);
        goto err;
1369 1370
    }

1371 1372 1373 1374 1375 1376 1377 1378 1379 1380 1381 1382 1383 1384 1385 1386 1387
    if (!tls_collect_extensions(s, &extpkt,
                                SSL_EXT_TLS1_2_SERVER_HELLO
                                | SSL_EXT_TLS1_3_SERVER_HELLO,
                                &extensions, NULL, 1)) {
        /* SSLfatal() already called */
        goto err;
    }

    if (!ssl_choose_client_version(s, sversion, extensions)) {
        /* SSLfatal() already called */
        goto err;
    }

    /*
     * Now we have chosen the version we need to check again that the extensions
     * are appropriate for this version.
     */
1388 1389
    context = SSL_IS_TLS13(s) ? SSL_EXT_TLS1_3_SERVER_HELLO
                              : SSL_EXT_TLS1_2_SERVER_HELLO;
1390 1391 1392 1393 1394 1395 1396 1397 1398 1399 1400 1401 1402 1403 1404 1405 1406 1407 1408
    if (!tls_validate_all_contexts(s, context, extensions)) {
        SSLfatal(s, SSL_AD_ILLEGAL_PARAMETER, SSL_F_TLS_PROCESS_SERVER_HELLO,
                 SSL_R_BAD_EXTENSION);
        goto err;
    }

    /*
     * In TLSv1.3 a ServerHello message signals a key change so the end of the
     * message must be on a record boundary.
     */
    if (SSL_IS_TLS13(s) && RECORD_LAYER_processed_read_pending(&s->rlayer)) {
        SSLfatal(s, SSL_AD_UNEXPECTED_MESSAGE, SSL_F_TLS_PROCESS_SERVER_HELLO,
                 SSL_R_NOT_ON_RECORD_BOUNDARY);
        goto err;
    }

    if (SSL_IS_TLS13(s) && compression != 0) {
        SSLfatal(s, SSL_AD_ILLEGAL_PARAMETER, SSL_F_TLS_PROCESS_SERVER_HELLO,
               SSL_R_INVALID_COMPRESSION_ALGORITHM);
1409 1410
        goto err;
    }
1411 1412 1413 1414 1415 1416

    s->hit = 0;

    if (SSL_IS_TLS13(s)) {
        /* This will set s->hit if we are resuming */
        if (!tls_parse_extension(s, TLSEXT_IDX_psk,
1417
                                 SSL_EXT_TLS1_3_SERVER_HELLO,
1418
                                 extensions, NULL, 0)) {
1419 1420 1421
            /* SSLfatal() already called */
            goto err;
        }
1422
    } else {
1423
        /*
1424 1425 1426 1427 1428 1429 1430 1431 1432 1433
         * Check if we can resume the session based on external pre-shared
         * secret. EAP-FAST (RFC 4851) supports two types of session resumption.
         * Resumption based on server-side state works with session IDs.
         * Resumption based on pre-shared Protected Access Credentials (PACs)
         * works by overriding the SessionTicket extension at the application
         * layer, and does not send a session ID. (We do not know whether
         * EAP-FAST servers would honour the session ID.) Therefore, the session
         * ID alone is not a reliable indicator of session resumption, so we
         * first check if we can resume, and later peek at the next handshake
         * message to see if the server wants to resume.
1434
         */
1435 1436 1437 1438 1439 1440 1441 1442 1443 1444 1445 1446 1447 1448 1449 1450
        if (s->version >= TLS1_VERSION
                && s->ext.session_secret_cb != NULL && s->session->ext.tick) {
            const SSL_CIPHER *pref_cipher = NULL;
            /*
             * s->session->master_key_length is a size_t, but this is an int for
             * backwards compat reasons
             */
            int master_key_length;
            master_key_length = sizeof(s->session->master_key);
            if (s->ext.session_secret_cb(s, s->session->master_key,
                                         &master_key_length,
                                         NULL, &pref_cipher,
                                         s->ext.session_secret_cb_arg)
                     && master_key_length > 0) {
                s->session->master_key_length = master_key_length;
                s->session->cipher = pref_cipher ?
1451
                    pref_cipher : ssl_get_cipher_by_char(s, cipherchars, 0);
1452
            } else {
1453 1454 1455
                SSLfatal(s, SSL_AD_INTERNAL_ERROR,
                         SSL_F_TLS_PROCESS_SERVER_HELLO, ERR_R_INTERNAL_ERROR);
                goto err;
1456
            }
1457
        }
1458 1459 1460 1461 1462 1463

        if (session_id_len != 0
                && session_id_len == s->session->session_id_length
                && memcmp(PACKET_data(&session_id), s->session->session_id,
                          session_id_len) == 0)
            s->hit = 1;
M
Matt Caswell 已提交
1464 1465
    }

1466
    if (s->hit) {
1467
        if (s->sid_ctx_length != s->session->sid_ctx_length
1468
                || memcmp(s->session->sid_ctx, s->sid_ctx, s->sid_ctx_length)) {
1469
            /* actually a client application bug */
1470 1471 1472 1473
            SSLfatal(s, SSL_AD_ILLEGAL_PARAMETER,
                     SSL_F_TLS_PROCESS_SERVER_HELLO,
                     SSL_R_ATTEMPT_TO_REUSE_SESSION_IN_DIFFERENT_CONTEXT);
            goto err;
1474
        }
1475
    } else {
1476
        /*
1477
         * If we were trying for session-id reuse but the server
1478
         * didn't resume, make a new SSL_SESSION.
1479 1480 1481
         * In the case of EAP-FAST and PAC, we do not send a session ID,
         * so the PAC-based session secret is always preserved. It'll be
         * overwritten if the server refuses resumption.
1482
         */
1483 1484 1485 1486
        if (s->session->session_id_length > 0
                || (SSL_IS_TLS13(s)
                    && s->session->ext.tick_identity
                       != TLSEXT_PSK_BAD_IDENTITY)) {
1487 1488
            CRYPTO_atomic_add(&s->session_ctx->stats.sess_miss, 1, &discard,
                              s->session_ctx->lock);
1489
            if (!ssl_get_new_session(s, 0)) {
1490 1491
                /* SSLfatal() already called */
                goto err;
1492 1493
            }
        }
M
Matt Caswell 已提交
1494

1495
        s->session->ssl_version = s->version;
1496 1497
        s->session->session_id_length = session_id_len;
        /* session_id_len could be 0 */
1498 1499 1500
        if (session_id_len > 0)
            memcpy(s->session->session_id, PACKET_data(&session_id),
                   session_id_len);
1501
    }
1502

1503 1504
    /* Session version and negotiated protocol version should match */
    if (s->version != s->session->ssl_version) {
1505 1506 1507
        SSLfatal(s, SSL_AD_PROTOCOL_VERSION, SSL_F_TLS_PROCESS_SERVER_HELLO,
                 SSL_R_SSL_SESSION_VERSION_MISMATCH);
        goto err;
1508
    }
1509
    /*
1510 1511 1512 1513 1514
     * Now that we know the version, update the check to see if it's an allowed
     * version.
     */
    s->s3->tmp.min_ver = s->version;
    s->s3->tmp.max_ver = s->version;
1515

1516
    if (!set_client_ciphersuite(s, cipherchars)) {
1517 1518
        /* SSLfatal() already called */
        goto err;
1519 1520
    }

1521
#ifdef OPENSSL_NO_COMP
1522
    if (compression != 0) {
1523 1524 1525
        SSLfatal(s, SSL_AD_ILLEGAL_PARAMETER, SSL_F_TLS_PROCESS_SERVER_HELLO,
                 SSL_R_UNSUPPORTED_COMPRESSION_ALGORITHM);
        goto err;
1526 1527 1528 1529 1530 1531
    }
    /*
     * If compression is disabled we'd better not try to resume a session
     * using compression.
     */
    if (s->session->compress_meth != 0) {
1532 1533 1534
        SSLfatal(s, SSL_AD_HANDSHAKE_FAILURE, SSL_F_TLS_PROCESS_SERVER_HELLO,
                 SSL_R_INCONSISTENT_COMPRESSION);
        goto err;
1535
    }
1536
#else
1537
    if (s->hit && compression != s->session->compress_meth) {
1538
        SSLfatal(s, SSL_AD_ILLEGAL_PARAMETER, SSL_F_TLS_PROCESS_SERVER_HELLO,
M
Matt Caswell 已提交
1539
                 SSL_R_OLD_SESSION_COMPRESSION_ALGORITHM_NOT_RETURNED);
1540
        goto err;
1541
    }
1542
    if (compression == 0)
1543 1544
        comp = NULL;
    else if (!ssl_allow_compression(s)) {
1545 1546 1547
        SSLfatal(s, SSL_AD_ILLEGAL_PARAMETER, SSL_F_TLS_PROCESS_SERVER_HELLO,
                 SSL_R_COMPRESSION_DISABLED);
        goto err;
1548 1549 1550
    } else {
        comp = ssl3_comp_find(s->ctx->comp_methods, compression);
    }
1551

1552
    if (compression != 0 && comp == NULL) {
1553 1554 1555
        SSLfatal(s, SSL_AD_ILLEGAL_PARAMETER, SSL_F_TLS_PROCESS_SERVER_HELLO,
                 SSL_R_UNSUPPORTED_COMPRESSION_ALGORITHM);
        goto err;
1556 1557 1558
    } else {
        s->s3->tmp.new_compression = comp;
    }
1559
#endif
1560

1561 1562 1563 1564
    if (!tls_parse_all_extensions(s, context, extensions, NULL, 0, 1)) {
        /* SSLfatal() already called */
        goto err;
    }
1565

M
Matt Caswell 已提交
1566 1567 1568 1569 1570 1571 1572 1573 1574
#ifndef OPENSSL_NO_SCTP
    if (SSL_IS_DTLS(s) && s->hit) {
        unsigned char sctpauthkey[64];
        char labelbuffer[sizeof(DTLS1_SCTP_AUTH_LABEL)];

        /*
         * Add new shared key for SCTP-Auth, will be ignored if
         * no SCTP used.
         */
M
Matt Caswell 已提交
1575 1576
        memcpy(labelbuffer, DTLS1_SCTP_AUTH_LABEL,
               sizeof(DTLS1_SCTP_AUTH_LABEL));
M
Matt Caswell 已提交
1577 1578

        if (SSL_export_keying_material(s, sctpauthkey,
E
Emilia Kasper 已提交
1579 1580
                                       sizeof(sctpauthkey),
                                       labelbuffer,
1581 1582 1583 1584 1585
                                       sizeof(labelbuffer), NULL, 0, 0) <= 0) {
            SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_TLS_PROCESS_SERVER_HELLO,
                     ERR_R_INTERNAL_ERROR);
            goto err;
        }
M
Matt Caswell 已提交
1586 1587 1588 1589 1590 1591 1592

        BIO_ctrl(SSL_get_wbio(s),
                 BIO_CTRL_DGRAM_SCTP_ADD_AUTH_KEY,
                 sizeof(sctpauthkey), sctpauthkey);
    }
#endif

1593 1594 1595 1596 1597 1598 1599 1600
    /*
     * In TLSv1.3 we have some post-processing to change cipher state, otherwise
     * we're done with this message
     */
    if (SSL_IS_TLS13(s)
            && (!s->method->ssl3_enc->setup_key_block(s)
                || !s->method->ssl3_enc->change_cipher_state(s,
                    SSL3_CC_HANDSHAKE | SSL3_CHANGE_CIPHER_CLIENT_READ))) {
1601 1602
        /* SSLfatal() already called */
        goto err;
1603 1604
    }

M
Matt Caswell 已提交
1605
    OPENSSL_free(extensions);
1606
    return MSG_PROCESS_CONTINUE_READING;
1607
 err:
M
Matt Caswell 已提交
1608
    OPENSSL_free(extensions);
1609
    return MSG_PROCESS_ERROR;
1610
}
1611

1612 1613 1614
static MSG_PROCESS_RETURN tls_process_hello_retry_request(SSL *s, PACKET *pkt)
{
    unsigned int sversion;
1615
    const unsigned char *cipherchars;
1616 1617 1618 1619
    RAW_EXTENSION *extensions = NULL;
    PACKET extpkt;

    if (!PACKET_get_net_2(pkt, &sversion)) {
1620 1621 1622
        SSLfatal(s, SSL_AD_DECODE_ERROR, SSL_F_TLS_PROCESS_HELLO_RETRY_REQUEST,
                 SSL_R_LENGTH_MISMATCH);
        goto err;
1623 1624
    }

M
Matt Caswell 已提交
1625 1626
    /* TODO(TLS1.3): Remove the TLS1_3_VERSION_DRAFT clause before release */
    if (sversion != TLS1_3_VERSION && sversion != TLS1_3_VERSION_DRAFT) {
1627 1628 1629 1630
        SSLfatal(s, SSL_AD_PROTOCOL_VERSION,
                 SSL_F_TLS_PROCESS_HELLO_RETRY_REQUEST,
                 SSL_R_WRONG_SSL_VERSION);
        goto err;
M
Matt Caswell 已提交
1631 1632
    }

1633 1634
    s->hello_retry_request = 1;

M
Matt Caswell 已提交
1635 1636 1637 1638 1639 1640 1641
    /*
     * If we were sending early_data then the enc_write_ctx is now invalid and
     * should not be used.
     */
    EVP_CIPHER_CTX_free(s->enc_write_ctx);
    s->enc_write_ctx = NULL;

1642
    if (!PACKET_get_bytes(pkt, &cipherchars, TLS_CIPHER_LEN)) {
1643 1644 1645
        SSLfatal(s, SSL_AD_DECODE_ERROR, SSL_F_TLS_PROCESS_HELLO_RETRY_REQUEST,
                 SSL_R_LENGTH_MISMATCH);
        goto err;
1646 1647 1648
    }

    if (!set_client_ciphersuite(s, cipherchars)) {
1649 1650
        /* SSLfatal() already called */
        goto err;
1651 1652
    }

1653 1654 1655 1656 1657
    if (!PACKET_as_length_prefixed_2(pkt, &extpkt)
               /* Must have a non-empty extensions block */
            || PACKET_remaining(&extpkt) == 0
               /* Must be no trailing data after extensions */
            || PACKET_remaining(pkt) != 0) {
1658 1659 1660
        SSLfatal(s, SSL_AD_DECODE_ERROR, SSL_F_TLS_PROCESS_HELLO_RETRY_REQUEST,
                 SSL_R_BAD_LENGTH);
        goto err;
1661 1662
    }

1663
    if (!tls_collect_extensions(s, &extpkt, SSL_EXT_TLS1_3_HELLO_RETRY_REQUEST,
1664
                                &extensions, NULL, 1)
1665
            || !tls_parse_all_extensions(s, SSL_EXT_TLS1_3_HELLO_RETRY_REQUEST,
1666 1667 1668 1669
                                         extensions, NULL, 0, 1)) {
        /* SSLfatal() already called */
        goto err;
    }
1670 1671

    OPENSSL_free(extensions);
1672 1673
    extensions = NULL;

B
Benjamin Kaduk 已提交
1674 1675 1676 1677 1678
    if (s->ext.tls13_cookie_len == 0
#if !defined(OPENSSL_NO_EC) || !defined(OPENSSL_NO_DH)
        && s->s3->tmp.pkey != NULL
#endif
        ) {
1679 1680 1681 1682
        /*
         * We didn't receive a cookie or a new key_share so the next
         * ClientHello will not change
         */
1683 1684 1685 1686
        SSLfatal(s, SSL_AD_ILLEGAL_PARAMETER,
                 SSL_F_TLS_PROCESS_HELLO_RETRY_REQUEST,
                  SSL_R_NO_CHANGE_FOLLOWING_HRR);
        goto err;
1687
    }
1688

1689 1690 1691 1692 1693
    /*
     * Re-initialise the Transcript Hash. We're going to prepopulate it with
     * a synthetic message_hash in place of ClientHello1.
     */
    if (!create_synthetic_message_hash(s)) {
1694 1695
        /* SSLfatal() already called */
        goto err;
1696 1697 1698 1699 1700 1701 1702 1703 1704 1705
    }

    /*
     * Add this message to the Transcript Hash. Normally this is done
     * automatically prior to the message processing stage. However due to the
     * need to create the synthetic message hash, we defer that step until now
     * for HRR messages.
     */
    if (!ssl3_finish_mac(s, (unsigned char *)s->init_buf->data,
                                s->init_num + SSL3_HM_HEADER_LENGTH)) {
1706 1707
        /* SSLfatal() already called */
        goto err;
1708 1709
    }

1710
    return MSG_PROCESS_FINISHED_READING;
1711
 err:
1712 1713 1714 1715
    OPENSSL_free(extensions);
    return MSG_PROCESS_ERROR;
}

M
Matt Caswell 已提交
1716
MSG_PROCESS_RETURN tls_process_server_certificate(SSL *s, PACKET *pkt)
1717
{
1718
    int i;
1719
    MSG_PROCESS_RETURN ret = MSG_PROCESS_ERROR;
1720 1721
    unsigned long cert_list_len, cert_len;
    X509 *x = NULL;
E
Emilia Kasper 已提交
1722
    const unsigned char *certstart, *certbytes;
1723 1724
    STACK_OF(X509) *sk = NULL;
    EVP_PKEY *pkey = NULL;
1725
    size_t chainidx, certidx;
1726
    unsigned int context = 0;
1727
    const SSL_CERT_LOOKUP *clu;
1728 1729

    if ((sk = sk_X509_new_null()) == NULL) {
1730 1731
        SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_TLS_PROCESS_SERVER_CERTIFICATE,
                 ERR_R_MALLOC_FAILURE);
1732
        goto err;
1733 1734
    }

1735 1736 1737
    if ((SSL_IS_TLS13(s) && !PACKET_get_1(pkt, &context))
            || context != 0
            || !PACKET_get_net_3(pkt, &cert_list_len)
1738 1739
            || PACKET_remaining(pkt) != cert_list_len
            || PACKET_remaining(pkt) == 0) {
1740 1741 1742
        SSLfatal(s, SSL_AD_DECODE_ERROR, SSL_F_TLS_PROCESS_SERVER_CERTIFICATE,
                 SSL_R_LENGTH_MISMATCH);
        goto err;
1743
    }
1744
    for (chainidx = 0; PACKET_remaining(pkt); chainidx++) {
1745
        if (!PACKET_get_net_3(pkt, &cert_len)
E
Emilia Kasper 已提交
1746
            || !PACKET_get_bytes(pkt, &certbytes, cert_len)) {
1747 1748 1749 1750
            SSLfatal(s, SSL_AD_DECODE_ERROR,
                     SSL_F_TLS_PROCESS_SERVER_CERTIFICATE,
                     SSL_R_CERT_LENGTH_MISMATCH);
            goto err;
1751 1752
        }

1753 1754
        certstart = certbytes;
        x = d2i_X509(NULL, (const unsigned char **)&certbytes, cert_len);
1755
        if (x == NULL) {
1756 1757 1758
            SSLfatal(s, SSL_AD_BAD_CERTIFICATE,
                     SSL_F_TLS_PROCESS_SERVER_CERTIFICATE, ERR_R_ASN1_LIB);
            goto err;
1759
        }
1760
        if (certbytes != (certstart + cert_len)) {
1761 1762 1763 1764
            SSLfatal(s, SSL_AD_DECODE_ERROR,
                     SSL_F_TLS_PROCESS_SERVER_CERTIFICATE,
                     SSL_R_CERT_LENGTH_MISMATCH);
            goto err;
1765
        }
1766 1767 1768 1769 1770 1771

        if (SSL_IS_TLS13(s)) {
            RAW_EXTENSION *rawexts = NULL;
            PACKET extensions;

            if (!PACKET_get_length_prefixed_2(pkt, &extensions)) {
1772 1773 1774 1775
                SSLfatal(s, SSL_AD_DECODE_ERROR,
                         SSL_F_TLS_PROCESS_SERVER_CERTIFICATE,
                         SSL_R_BAD_LENGTH);
                goto err;
1776
            }
1777 1778
            if (!tls_collect_extensions(s, &extensions,
                                        SSL_EXT_TLS1_3_CERTIFICATE, &rawexts,
1779
                                        NULL, chainidx == 0)
1780
                || !tls_parse_all_extensions(s, SSL_EXT_TLS1_3_CERTIFICATE,
1781
                                             rawexts, x, chainidx,
1782
                                             PACKET_remaining(pkt) == 0)) {
1783
                OPENSSL_free(rawexts);
1784 1785
                /* SSLfatal already called */
                goto err;
1786 1787
            }
            OPENSSL_free(rawexts);
1788 1789
        }

1790
        if (!sk_X509_push(sk, x)) {
1791 1792 1793
            SSLfatal(s, SSL_AD_INTERNAL_ERROR,
                     SSL_F_TLS_PROCESS_SERVER_CERTIFICATE,
                     ERR_R_MALLOC_FAILURE);
1794
            goto err;
1795 1796 1797 1798 1799
        }
        x = NULL;
    }

    i = ssl_verify_cert_chain(s, sk);
1800 1801 1802 1803 1804 1805 1806 1807 1808 1809 1810 1811 1812 1813 1814
    /*
     * The documented interface is that SSL_VERIFY_PEER should be set in order
     * for client side verification of the server certificate to take place.
     * However, historically the code has only checked that *any* flag is set
     * to cause server verification to take place. Use of the other flags makes
     * no sense in client mode. An attempt to clean up the semantics was
     * reverted because at least one application *only* set
     * SSL_VERIFY_FAIL_IF_NO_PEER_CERT. Prior to the clean up this still caused
     * server verification to take place, after the clean up it silently did
     * nothing. SSL_CTX_set_verify()/SSL_set_verify() cannot validate the flags
     * sent to them because they are void functions. Therefore, we now use the
     * (less clean) historic behaviour of performing validation if any flag is
     * set. The *documented* interface remains the same.
     */
    if (s->verify_mode != SSL_VERIFY_NONE && i <= 0) {
1815 1816 1817 1818
        SSLfatal(s, ssl_verify_alarm_type(s->verify_result),
                 SSL_F_TLS_PROCESS_SERVER_CERTIFICATE,
                 SSL_R_CERTIFICATE_VERIFY_FAILED);
        goto err;
1819 1820 1821
    }
    ERR_clear_error();          /* but we keep s->verify_result */
    if (i > 1) {
1822 1823 1824
        SSLfatal(s, SSL_AD_HANDSHAKE_FAILURE,
                 SSL_F_TLS_PROCESS_SERVER_CERTIFICATE, i);
        goto err;
1825 1826
    }

1827
    s->session->peer_chain = sk;
1828 1829
    /*
     * Inconsistency alert: cert_chain does include the peer's certificate,
M
Matt Caswell 已提交
1830
     * which we don't include in statem_srvr.c
1831 1832 1833 1834
     */
    x = sk_X509_value(sk, 0);
    sk = NULL;

1835
    pkey = X509_get0_pubkey(x);
1836

1837
    if (pkey == NULL || EVP_PKEY_missing_parameters(pkey)) {
1838
        x = NULL;
1839 1840 1841
        SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_TLS_PROCESS_SERVER_CERTIFICATE,
                 SSL_R_UNABLE_TO_FIND_PUBLIC_KEY_PARAMETERS);
        goto err;
1842 1843
    }

1844
    if ((clu = ssl_cert_lookup_by_pkey(pkey, &certidx)) == NULL) {
1845
        x = NULL;
1846 1847 1848 1849
        SSLfatal(s, SSL_AD_ILLEGAL_PARAMETER,
                 SSL_F_TLS_PROCESS_SERVER_CERTIFICATE,
                 SSL_R_UNKNOWN_CERTIFICATE_TYPE);
        goto err;
1850
    }
1851 1852 1853 1854 1855 1856
    /*
     * Check certificate type is consistent with ciphersuite. For TLS 1.3
     * skip check since TLS 1.3 ciphersuites can be used with any certificate
     * type.
     */
    if (!SSL_IS_TLS13(s)) {
1857
        if ((clu->amask & s->s3->tmp.new_cipher->algorithm_auth) == 0) {
1858
            x = NULL;
1859 1860 1861 1862
            SSLfatal(s, SSL_AD_ILLEGAL_PARAMETER,
                     SSL_F_TLS_PROCESS_SERVER_CERTIFICATE,
                     SSL_R_WRONG_CERTIFICATE_TYPE);
            goto err;
1863
        }
1864
    }
1865
    s->session->peer_type = certidx;
1866 1867

    X509_free(s->session->peer);
D
Dr. Stephen Henson 已提交
1868
    X509_up_ref(x);
1869
    s->session->peer = x;
1870 1871
    s->session->verify_result = s->verify_result;
    x = NULL;
1872 1873 1874 1875 1876 1877

    /* Save the current hash state for when we receive the CertificateVerify */
    if (SSL_IS_TLS13(s)
            && !ssl_handshake_hash(s, s->cert_verify_hash,
                                   sizeof(s->cert_verify_hash),
                                   &s->cert_verify_hash_len)) {
1878 1879
        /* SSLfatal() already called */;
        goto err;
1880 1881
    }

1882
    ret = MSG_PROCESS_CONTINUE_READING;
R
Rich Salz 已提交
1883

1884
 err:
1885 1886
    X509_free(x);
    sk_X509_pop_free(sk, X509_free);
1887
    return ret;
1888
}
1889

1890
static int tls_process_ske_psk_preamble(SSL *s, PACKET *pkt)
1891 1892
{
#ifndef OPENSSL_NO_PSK
1893
    PACKET psk_identity_hint;
1894

1895 1896 1897
    /* PSK ciphersuites are preceded by an identity hint */

    if (!PACKET_get_length_prefixed_2(pkt, &psk_identity_hint)) {
1898 1899
        SSLfatal(s, SSL_AD_DECODE_ERROR, SSL_F_TLS_PROCESS_SKE_PSK_PREAMBLE,
                 SSL_R_LENGTH_MISMATCH);
1900 1901 1902 1903 1904 1905 1906 1907 1908 1909
        return 0;
    }

    /*
     * Store PSK identity hint for later use, hint is used in
     * tls_construct_client_key_exchange.  Assume that the maximum length of
     * a PSK identity hint can be as long as the maximum length of a PSK
     * identity.
     */
    if (PACKET_remaining(&psk_identity_hint) > PSK_MAX_IDENTITY_LEN) {
1910 1911 1912
        SSLfatal(s, SSL_AD_HANDSHAKE_FAILURE,
                 SSL_F_TLS_PROCESS_SKE_PSK_PREAMBLE,
                 SSL_R_DATA_LENGTH_TOO_LONG);
1913 1914
        return 0;
    }
1915

1916 1917 1918 1919
    if (PACKET_remaining(&psk_identity_hint) == 0) {
        OPENSSL_free(s->session->psk_identity_hint);
        s->session->psk_identity_hint = NULL;
    } else if (!PACKET_strndup(&psk_identity_hint,
E
Emilia Kasper 已提交
1920
                               &s->session->psk_identity_hint)) {
1921 1922
        SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_TLS_PROCESS_SKE_PSK_PREAMBLE,
                 ERR_R_INTERNAL_ERROR);
1923 1924 1925 1926 1927
        return 0;
    }

    return 1;
#else
1928 1929
    SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_TLS_PROCESS_SKE_PSK_PREAMBLE,
             ERR_R_INTERNAL_ERROR);
1930
    return 0;
1931 1932 1933
#endif
}

1934
static int tls_process_ske_srp(SSL *s, PACKET *pkt, EVP_PKEY **pkey)
1935 1936 1937 1938 1939 1940 1941 1942
{
#ifndef OPENSSL_NO_SRP
    PACKET prime, generator, salt, server_pub;

    if (!PACKET_get_length_prefixed_2(pkt, &prime)
        || !PACKET_get_length_prefixed_2(pkt, &generator)
        || !PACKET_get_length_prefixed_1(pkt, &salt)
        || !PACKET_get_length_prefixed_2(pkt, &server_pub)) {
1943 1944
        SSLfatal(s, SSL_AD_DECODE_ERROR, SSL_F_TLS_PROCESS_SKE_SRP,
                 SSL_R_LENGTH_MISMATCH);
1945 1946 1947
        return 0;
    }

1948
    /* TODO(size_t): Convert BN_bin2bn() calls */
1949 1950
    if ((s->srp_ctx.N =
         BN_bin2bn(PACKET_data(&prime),
1951
                   (int)PACKET_remaining(&prime), NULL)) == NULL
1952 1953
        || (s->srp_ctx.g =
            BN_bin2bn(PACKET_data(&generator),
1954
                      (int)PACKET_remaining(&generator), NULL)) == NULL
1955 1956
        || (s->srp_ctx.s =
            BN_bin2bn(PACKET_data(&salt),
1957
                      (int)PACKET_remaining(&salt), NULL)) == NULL
1958 1959
        || (s->srp_ctx.B =
            BN_bin2bn(PACKET_data(&server_pub),
1960
                      (int)PACKET_remaining(&server_pub), NULL)) == NULL) {
1961 1962
        SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_TLS_PROCESS_SKE_SRP,
                 ERR_R_BN_LIB);
1963 1964 1965
        return 0;
    }

1966 1967
    if (!srp_verify_server_param(s)) {
        /* SSLfatal() already called */
1968 1969 1970 1971
        return 0;
    }

    /* We must check if there is a certificate */
E
Emilia Kasper 已提交
1972
    if (s->s3->tmp.new_cipher->algorithm_auth & (SSL_aRSA | SSL_aDSS))
1973 1974 1975 1976
        *pkey = X509_get0_pubkey(s->session->peer);

    return 1;
#else
1977 1978
    SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_TLS_PROCESS_SKE_SRP,
             ERR_R_INTERNAL_ERROR);
1979 1980 1981 1982
    return 0;
#endif
}

1983
static int tls_process_ske_dhe(SSL *s, PACKET *pkt, EVP_PKEY **pkey)
1984 1985 1986 1987 1988 1989 1990 1991
{
#ifndef OPENSSL_NO_DH
    PACKET prime, generator, pub_key;
    EVP_PKEY *peer_tmp = NULL;

    DH *dh = NULL;
    BIGNUM *p = NULL, *g = NULL, *bnpub_key = NULL;

1992 1993
    int check_bits = 0;

1994 1995 1996
    if (!PACKET_get_length_prefixed_2(pkt, &prime)
        || !PACKET_get_length_prefixed_2(pkt, &generator)
        || !PACKET_get_length_prefixed_2(pkt, &pub_key)) {
1997 1998
        SSLfatal(s, SSL_AD_DECODE_ERROR, SSL_F_TLS_PROCESS_SKE_DHE,
                 SSL_R_LENGTH_MISMATCH);
1999 2000 2001 2002 2003 2004 2005
        return 0;
    }

    peer_tmp = EVP_PKEY_new();
    dh = DH_new();

    if (peer_tmp == NULL || dh == NULL) {
2006 2007
        SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_TLS_PROCESS_SKE_DHE,
                 ERR_R_MALLOC_FAILURE);
2008 2009 2010
        goto err;
    }

2011 2012 2013 2014 2015 2016
    /* TODO(size_t): Convert these calls */
    p = BN_bin2bn(PACKET_data(&prime), (int)PACKET_remaining(&prime), NULL);
    g = BN_bin2bn(PACKET_data(&generator), (int)PACKET_remaining(&generator),
                  NULL);
    bnpub_key = BN_bin2bn(PACKET_data(&pub_key),
                          (int)PACKET_remaining(&pub_key), NULL);
2017
    if (p == NULL || g == NULL || bnpub_key == NULL) {
2018 2019
        SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_TLS_PROCESS_SKE_DHE,
                 ERR_R_BN_LIB);
2020 2021 2022
        goto err;
    }

F
FdaSilvaYY 已提交
2023
    /* test non-zero pubkey */
2024
    if (BN_is_zero(bnpub_key)) {
2025 2026
        SSLfatal(s, SSL_AD_ILLEGAL_PARAMETER, SSL_F_TLS_PROCESS_SKE_DHE,
                 SSL_R_BAD_DH_VALUE);
2027 2028 2029 2030
        goto err;
    }

    if (!DH_set0_pqg(dh, p, NULL, g)) {
2031 2032
        SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_TLS_PROCESS_SKE_DHE,
                 ERR_R_BN_LIB);
2033 2034 2035 2036
        goto err;
    }
    p = g = NULL;

2037
    if (DH_check_params(dh, &check_bits) == 0 || check_bits != 0) {
2038 2039
        SSLfatal(s, SSL_AD_ILLEGAL_PARAMETER, SSL_F_TLS_PROCESS_SKE_DHE,
                 SSL_R_BAD_DH_VALUE);
2040 2041 2042
        goto err;
    }

2043
    if (!DH_set0_key(dh, bnpub_key, NULL)) {
2044 2045
        SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_TLS_PROCESS_SKE_DHE,
                 ERR_R_BN_LIB);
2046 2047 2048 2049 2050
        goto err;
    }
    bnpub_key = NULL;

    if (!ssl_security(s, SSL_SECOP_TMP_DH, DH_security_bits(dh), 0, dh)) {
2051 2052
        SSLfatal(s, SSL_AD_HANDSHAKE_FAILURE, SSL_F_TLS_PROCESS_SKE_DHE,
                 SSL_R_DH_KEY_TOO_SMALL);
2053 2054 2055 2056
        goto err;
    }

    if (EVP_PKEY_assign_DH(peer_tmp, dh) == 0) {
2057 2058
        SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_TLS_PROCESS_SKE_DHE,
                 ERR_R_EVP_LIB);
2059 2060 2061 2062 2063 2064 2065 2066 2067
        goto err;
    }

    s->s3->peer_tmp = peer_tmp;

    /*
     * FIXME: This makes assumptions about which ciphersuites come with
     * public keys. We should have a less ad-hoc way of doing this
     */
E
Emilia Kasper 已提交
2068
    if (s->s3->tmp.new_cipher->algorithm_auth & (SSL_aRSA | SSL_aDSS))
2069 2070 2071 2072 2073 2074 2075 2076 2077 2078 2079 2080 2081 2082
        *pkey = X509_get0_pubkey(s->session->peer);
    /* else anonymous DH, so no certificate or pkey. */

    return 1;

 err:
    BN_free(p);
    BN_free(g);
    BN_free(bnpub_key);
    DH_free(dh);
    EVP_PKEY_free(peer_tmp);

    return 0;
#else
2083 2084
    SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_TLS_PROCESS_SKE_DHE,
             ERR_R_INTERNAL_ERROR);
2085 2086 2087 2088
    return 0;
#endif
}

2089
static int tls_process_ske_ecdhe(SSL *s, PACKET *pkt, EVP_PKEY **pkey)
2090 2091 2092
{
#ifndef OPENSSL_NO_EC
    PACKET encoded_pt;
2093
    unsigned int curve_type, curve_id;
2094 2095 2096

    /*
     * Extract elliptic curve parameters and the server's ephemeral ECDH
2097
     * public key. We only support named (not generic) curves and
2098 2099
     * ECParameters in this case is just three bytes.
     */
2100
    if (!PACKET_get_1(pkt, &curve_type) || !PACKET_get_net_2(pkt, &curve_id)) {
2101 2102
        SSLfatal(s, SSL_AD_DECODE_ERROR, SSL_F_TLS_PROCESS_SKE_ECDHE,
                 SSL_R_LENGTH_TOO_SHORT);
2103 2104 2105
        return 0;
    }
    /*
2106 2107
     * Check curve is named curve type and one of our preferences, if not
     * server has sent an invalid curve.
2108
     */
2109
    if (curve_type != NAMED_CURVE_TYPE || !tls1_check_group_id(s, curve_id)) {
2110 2111
        SSLfatal(s, SSL_AD_ILLEGAL_PARAMETER, SSL_F_TLS_PROCESS_SKE_ECDHE,
                 SSL_R_WRONG_CURVE);
2112 2113 2114
        return 0;
    }

2115
    if ((s->s3->peer_tmp = ssl_generate_param_group(curve_id)) == NULL) {
2116 2117
        SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_TLS_PROCESS_SKE_ECDHE,
                 SSL_R_UNABLE_TO_FIND_ECDH_PARAMETERS);
2118 2119 2120 2121
        return 0;
    }

    if (!PACKET_get_length_prefixed_1(pkt, &encoded_pt)) {
2122 2123
        SSLfatal(s, SSL_AD_DECODE_ERROR, SSL_F_TLS_PROCESS_SKE_ECDHE,
                 SSL_R_LENGTH_MISMATCH);
2124 2125 2126
        return 0;
    }

2127 2128 2129
    if (!EVP_PKEY_set1_tls_encodedpoint(s->s3->peer_tmp,
                                        PACKET_data(&encoded_pt),
                                        PACKET_remaining(&encoded_pt))) {
2130 2131
        SSLfatal(s, SSL_AD_ILLEGAL_PARAMETER, SSL_F_TLS_PROCESS_SKE_ECDHE,
                 SSL_R_BAD_ECPOINT);
2132 2133 2134 2135 2136 2137 2138 2139 2140 2141 2142 2143 2144 2145 2146 2147
        return 0;
    }

    /*
     * The ECC/TLS specification does not mention the use of DSA to sign
     * ECParameters in the server key exchange message. We do support RSA
     * and ECDSA.
     */
    if (s->s3->tmp.new_cipher->algorithm_auth & SSL_aECDSA)
        *pkey = X509_get0_pubkey(s->session->peer);
    else if (s->s3->tmp.new_cipher->algorithm_auth & SSL_aRSA)
        *pkey = X509_get0_pubkey(s->session->peer);
    /* else anonymous ECDH, so no certificate or pkey. */

    return 1;
#else
2148 2149
    SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_TLS_PROCESS_SKE_ECDHE,
             ERR_R_INTERNAL_ERROR);
2150 2151 2152 2153
    return 0;
#endif
}

M
Matt Caswell 已提交
2154
MSG_PROCESS_RETURN tls_process_key_exchange(SSL *s, PACKET *pkt)
2155
{
2156
    long alg_k;
2157
    EVP_PKEY *pkey = NULL;
2158 2159
    EVP_MD_CTX *md_ctx = NULL;
    EVP_PKEY_CTX *pctx = NULL;
2160
    PACKET save_param_start, signature;
2161 2162 2163

    alg_k = s->s3->tmp.new_cipher->algorithm_mkey;

2164
    save_param_start = *pkt;
2165

2166
#if !defined(OPENSSL_NO_EC) || !defined(OPENSSL_NO_DH)
2167 2168
    EVP_PKEY_free(s->s3->peer_tmp);
    s->s3->peer_tmp = NULL;
2169
#endif
2170

2171
    if (alg_k & SSL_PSK) {
2172 2173
        if (!tls_process_ske_psk_preamble(s, pkt)) {
            /* SSLfatal() already called */
2174
            goto err;
2175
        }
2176 2177 2178 2179
    }

    /* Nothing else to do for plain PSK or RSAPSK */
    if (alg_k & (SSL_kPSK | SSL_kRSAPSK)) {
2180
    } else if (alg_k & SSL_kSRP) {
2181 2182
        if (!tls_process_ske_srp(s, pkt, &pkey)) {
            /* SSLfatal() already called */
2183
            goto err;
2184
        }
2185
    } else if (alg_k & (SSL_kDHE | SSL_kDHEPSK)) {
2186 2187
        if (!tls_process_ske_dhe(s, pkt, &pkey)) {
            /* SSLfatal() already called */
2188
            goto err;
2189
        }
2190
    } else if (alg_k & (SSL_kECDHE | SSL_kECDHEPSK)) {
2191 2192
        if (!tls_process_ske_ecdhe(s, pkt, &pkey)) {
            /* SSLfatal() already called */
2193
            goto err;
2194
        }
2195
    } else if (alg_k) {
2196 2197
        SSLfatal(s, SSL_AD_UNEXPECTED_MESSAGE, SSL_F_TLS_PROCESS_KEY_EXCHANGE,
                 SSL_R_UNEXPECTED_MESSAGE);
2198
        goto err;
2199 2200 2201 2202
    }

    /* if it was signed, check the signature */
    if (pkey != NULL) {
2203
        PACKET params;
2204 2205
        int maxsig;
        const EVP_MD *md = NULL;
2206 2207 2208
        unsigned char *tbs;
        size_t tbslen;
        int rv;
2209

2210 2211 2212 2213 2214 2215
        /*
         * |pkt| now points to the beginning of the signature, so the difference
         * equals the length of the parameters.
         */
        if (!PACKET_get_sub_packet(&save_param_start, &params,
                                   PACKET_remaining(&save_param_start) -
2216
                                   PACKET_remaining(pkt))) {
2217 2218
            SSLfatal(s, SSL_AD_DECODE_ERROR, SSL_F_TLS_PROCESS_KEY_EXCHANGE,
                     ERR_R_INTERNAL_ERROR);
2219
            goto err;
2220 2221
        }

2222
        if (SSL_USE_SIGALGS(s)) {
2223 2224 2225
            unsigned int sigalg;

            if (!PACKET_get_net_2(pkt, &sigalg)) {
2226 2227
                SSLfatal(s, SSL_AD_DECODE_ERROR, SSL_F_TLS_PROCESS_KEY_EXCHANGE,
                         SSL_R_LENGTH_TOO_SHORT);
2228
                goto err;
2229
            }
2230 2231
            if (tls12_check_peer_sigalg(s, sigalg, pkey) <=0) {
                /* SSLfatal() already called */
2232 2233
                goto err;
            }
2234
#ifdef SSL_DEBUG
2235 2236
            fprintf(stderr, "USING TLSv1.2 HASH %s\n", EVP_MD_name(md));
#endif
D
Dr. Stephen Henson 已提交
2237
        } else if (!tls1_set_peer_legacy_sigalg(s, pkey)) {
2238 2239
            SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_TLS_PROCESS_KEY_EXCHANGE,
                     ERR_R_INTERNAL_ERROR);
D
Dr. Stephen Henson 已提交
2240
            goto err;
2241
        }
2242

D
Dr. Stephen Henson 已提交
2243
        if (!tls1_lookup_md(s->s3->tmp.peer_sigalg, &md)) {
2244 2245
            SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_TLS_PROCESS_KEY_EXCHANGE,
                     ERR_R_INTERNAL_ERROR);
D
Dr. Stephen Henson 已提交
2246 2247
            goto err;
        }
D
Dr. Stephen Henson 已提交
2248

2249 2250
        if (!PACKET_get_length_prefixed_2(pkt, &signature)
            || PACKET_remaining(pkt) != 0) {
2251 2252
            SSLfatal(s, SSL_AD_DECODE_ERROR, SSL_F_TLS_PROCESS_KEY_EXCHANGE,
                     SSL_R_LENGTH_MISMATCH);
2253
            goto err;
2254
        }
2255 2256
        maxsig = EVP_PKEY_size(pkey);
        if (maxsig < 0) {
2257 2258
            SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_TLS_PROCESS_KEY_EXCHANGE,
                     ERR_R_INTERNAL_ERROR);
2259
            goto err;
M
Matt Caswell 已提交
2260
        }
2261 2262

        /*
M
Matt Caswell 已提交
2263
         * Check signature length
2264
         */
2265
        if (PACKET_remaining(&signature) > (size_t)maxsig) {
2266
            /* wrong packet length */
2267
            SSLfatal(s, SSL_AD_DECODE_ERROR, SSL_F_TLS_PROCESS_KEY_EXCHANGE,
E
Emilia Kasper 已提交
2268
                   SSL_R_WRONG_SIGNATURE_LENGTH);
2269 2270 2271 2272 2273
            goto err;
        }

        md_ctx = EVP_MD_CTX_new();
        if (md_ctx == NULL) {
2274
            SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_TLS_PROCESS_KEY_EXCHANGE,
M
Matt Caswell 已提交
2275
                     ERR_R_MALLOC_FAILURE);
2276
            goto err;
2277
        }
2278

2279
        if (EVP_DigestVerifyInit(md_ctx, &pctx, md, NULL, pkey) <= 0) {
2280 2281
            SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_TLS_PROCESS_KEY_EXCHANGE,
                     ERR_R_EVP_LIB);
2282 2283
            goto err;
        }
D
Dr. Stephen Henson 已提交
2284
        if (SSL_USE_PSS(s)) {
2285
            if (EVP_PKEY_CTX_set_rsa_padding(pctx, RSA_PKCS1_PSS_PADDING) <= 0
D
Dr. Stephen Henson 已提交
2286
                || EVP_PKEY_CTX_set_rsa_pss_saltlen(pctx,
2287
                                                RSA_PSS_SALTLEN_DIGEST) <= 0) {
2288 2289
                SSLfatal(s, SSL_AD_INTERNAL_ERROR,
                         SSL_F_TLS_PROCESS_KEY_EXCHANGE, ERR_R_EVP_LIB);
2290 2291 2292
                goto err;
            }
        }
2293 2294 2295
        tbslen = construct_key_exchange_tbs(s, &tbs, PACKET_data(&params),
                                            PACKET_remaining(&params));
        if (tbslen == 0) {
2296
            /* SSLfatal() already called */
2297
            goto err;
2298
        }
2299 2300 2301 2302

        rv = EVP_DigestVerify(md_ctx, PACKET_data(&signature),
                              PACKET_remaining(&signature), tbs, tbslen);
        OPENSSL_free(tbs);
2303
        if (rv <= 0) {
2304 2305
            SSLfatal(s, SSL_AD_DECRYPT_ERROR, SSL_F_TLS_PROCESS_KEY_EXCHANGE,
                     SSL_R_BAD_SIGNATURE);
2306
            goto err;
2307
        }
2308
        EVP_MD_CTX_free(md_ctx);
2309
        md_ctx = NULL;
2310
    } else {
2311
        /* aNULL, aSRP or PSK do not need public keys */
2312
        if (!(s->s3->tmp.new_cipher->algorithm_auth & (SSL_aNULL | SSL_aSRP))
E
Emilia Kasper 已提交
2313
            && !(alg_k & SSL_PSK)) {
2314
            /* Might be wrong key type, check it */
2315
            if (ssl3_check_cert_and_algorithm(s)) {
2316 2317
                SSLfatal(s, SSL_AD_DECODE_ERROR, SSL_F_TLS_PROCESS_KEY_EXCHANGE,
                         SSL_R_BAD_DATA);
2318
            }
2319
            /* else this shouldn't happen, SSLfatal() already called */
2320 2321 2322
            goto err;
        }
        /* still data left over */
2323
        if (PACKET_remaining(pkt) != 0) {
2324 2325
            SSLfatal(s, SSL_AD_DECODE_ERROR, SSL_F_TLS_PROCESS_KEY_EXCHANGE,
                     SSL_R_EXTRA_DATA_IN_MESSAGE);
2326
            goto err;
2327 2328
        }
    }
2329

2330
    return MSG_PROCESS_CONTINUE_READING;
2331
 err:
2332
    EVP_MD_CTX_free(md_ctx);
2333
    return MSG_PROCESS_ERROR;
2334
}
2335

M
Matt Caswell 已提交
2336
MSG_PROCESS_RETURN tls_process_certificate_request(SSL *s, PACKET *pkt)
2337
{
2338 2339 2340 2341 2342
    size_t i;

    /* Clear certificate validity flags */
    for (i = 0; i < SSL_PKEY_NUM; i++)
        s->s3->tmp.valid_flags[i] = 0;
2343

2344
    if (SSL_IS_TLS13(s)) {
2345 2346
        PACKET reqctx, extensions;
        RAW_EXTENSION *rawexts = NULL;
2347 2348 2349 2350 2351

        /* Free and zero certificate types: it is not present in TLS 1.3 */
        OPENSSL_free(s->s3->tmp.ctype);
        s->s3->tmp.ctype = NULL;
        s->s3->tmp.ctype_len = 0;
2352

2353 2354
        /* TODO(TLS1.3) need to process request context, for now ignore */
        if (!PACKET_get_length_prefixed_1(pkt, &reqctx)) {
2355 2356 2357 2358
            SSLfatal(s, SSL_AD_DECODE_ERROR,
                     SSL_F_TLS_PROCESS_CERTIFICATE_REQUEST,
                     SSL_R_LENGTH_MISMATCH);
            return MSG_PROCESS_ERROR;
2359
        }
2360 2361

        if (!PACKET_get_length_prefixed_2(pkt, &extensions)) {
2362 2363 2364 2365
            SSLfatal(s, SSL_AD_DECODE_ERROR,
                     SSL_F_TLS_PROCESS_CERTIFICATE_REQUEST,
                     SSL_R_BAD_LENGTH);
            return MSG_PROCESS_ERROR;
2366 2367
        }
        if (!tls_collect_extensions(s, &extensions,
2368
                                    SSL_EXT_TLS1_3_CERTIFICATE_REQUEST,
2369
                                    &rawexts, NULL, 1)
2370
            || !tls_parse_all_extensions(s, SSL_EXT_TLS1_3_CERTIFICATE_REQUEST,
2371 2372
                                         rawexts, NULL, 0, 1)) {
            /* SSLfatal() already called */
2373
            OPENSSL_free(rawexts);
2374
            return MSG_PROCESS_ERROR;
2375 2376 2377
        }
        OPENSSL_free(rawexts);
        if (!tls1_process_sigalgs(s)) {
2378 2379 2380 2381
            SSLfatal(s, SSL_AD_INTERNAL_ERROR,
                     SSL_F_TLS_PROCESS_CERTIFICATE_REQUEST,
                     SSL_R_BAD_LENGTH);
            return MSG_PROCESS_ERROR;
2382
        }
2383 2384
    } else {
        PACKET ctypes;
2385

2386 2387
        /* get the certificate types */
        if (!PACKET_get_length_prefixed_1(pkt, &ctypes)) {
2388 2389 2390 2391
            SSLfatal(s, SSL_AD_DECODE_ERROR,
                     SSL_F_TLS_PROCESS_CERTIFICATE_REQUEST,
                     SSL_R_LENGTH_MISMATCH);
            return MSG_PROCESS_ERROR;
2392 2393 2394
        }

        if (!PACKET_memdup(&ctypes, &s->s3->tmp.ctype, &s->s3->tmp.ctype_len)) {
2395 2396 2397 2398
            SSLfatal(s, SSL_AD_INTERNAL_ERROR,
                     SSL_F_TLS_PROCESS_CERTIFICATE_REQUEST,
                     ERR_R_INTERNAL_ERROR);
            return MSG_PROCESS_ERROR;
2399
        }
M
Matt Caswell 已提交
2400

2401 2402
        if (SSL_USE_SIGALGS(s)) {
            PACKET sigalgs;
2403

2404
            if (!PACKET_get_length_prefixed_2(pkt, &sigalgs)) {
2405 2406 2407 2408
                SSLfatal(s, SSL_AD_INTERNAL_ERROR,
                         SSL_F_TLS_PROCESS_CERTIFICATE_REQUEST,
                         SSL_R_LENGTH_MISMATCH);
                return MSG_PROCESS_ERROR;
2409
            }
M
Matt Caswell 已提交
2410

2411
            if (!tls1_save_sigalgs(s, &sigalgs)) {
2412 2413 2414 2415
                SSLfatal(s, SSL_AD_INTERNAL_ERROR,
                         SSL_F_TLS_PROCESS_CERTIFICATE_REQUEST,
                         SSL_R_SIGNATURE_ALGORITHMS_ERROR);
                return MSG_PROCESS_ERROR;
2416 2417
            }
            if (!tls1_process_sigalgs(s)) {
2418 2419 2420 2421
                SSLfatal(s, SSL_AD_INTERNAL_ERROR,
                         SSL_F_TLS_PROCESS_CERTIFICATE_REQUEST,
                         ERR_R_MALLOC_FAILURE);
                return MSG_PROCESS_ERROR;
2422
            }
2423 2424
        }

2425
        /* get the CA RDNs */
2426 2427 2428 2429
        if (!parse_ca_names(s, pkt)) {
            /* SSLfatal() already called */
            return MSG_PROCESS_ERROR;
        }
2430 2431 2432
    }

    if (PACKET_remaining(pkt) != 0) {
2433 2434 2435 2436
        SSLfatal(s, SSL_AD_INTERNAL_ERROR,
                 SSL_F_TLS_PROCESS_CERTIFICATE_REQUEST,
                 SSL_R_LENGTH_MISMATCH);
        return MSG_PROCESS_ERROR;
2437
    }
2438 2439 2440 2441

    /* we should setup a certificate to return.... */
    s->s3->tmp.cert_req = 1;

2442
    return MSG_PROCESS_CONTINUE_PROCESSING;
2443 2444
}

M
Matt Caswell 已提交
2445
MSG_PROCESS_RETURN tls_process_new_session_ticket(SSL *s, PACKET *pkt)
2446 2447
{
    unsigned int ticklen;
2448
    unsigned long ticket_lifetime_hint, age_add = 0;
2449
    unsigned int sess_len;
2450
    RAW_EXTENSION *exts = NULL;
2451
    PACKET nonce;
2452

2453
    if (!PACKET_get_net_4(pkt, &ticket_lifetime_hint)
2454 2455 2456 2457 2458
        || (SSL_IS_TLS13(s)
            && (!PACKET_get_net_4(pkt, &age_add)
                || !PACKET_get_length_prefixed_1(pkt, &nonce)
                || !PACKET_memdup(&nonce, &s->session->ext.tick_nonce,
                                  &s->session->ext.tick_nonce_len)))
E
Emilia Kasper 已提交
2459
        || !PACKET_get_net_2(pkt, &ticklen)
2460
        || (!SSL_IS_TLS13(s) && PACKET_remaining(pkt) != ticklen)
2461 2462
        || (SSL_IS_TLS13(s)
            && (ticklen == 0 || PACKET_remaining(pkt) < ticklen))) {
2463 2464 2465
        SSLfatal(s, SSL_AD_DECODE_ERROR, SSL_F_TLS_PROCESS_NEW_SESSION_TICKET,
                 SSL_R_LENGTH_MISMATCH);
        goto err;
2466 2467
    }

2468 2469 2470 2471 2472
    /*
     * Server is allowed to change its mind (in <=TLSv1.2) and send an empty
     * ticket. We already checked this TLSv1.3 case above, so it should never
     * be 0 here in that instance
     */
2473
    if (ticklen == 0)
2474
        return MSG_PROCESS_CONTINUE_READING;
2475

2476 2477 2478 2479 2480 2481 2482 2483 2484
    /*
     * Sessions must be immutable once they go into the session cache. Otherwise
     * we can get multi-thread problems. Therefore we don't "update" sessions,
     * we replace them with a duplicate. In TLSv1.3 we need to do this every
     * time a NewSessionTicket arrives because those messages arrive
     * post-handshake and the session may have already gone into the session
     * cache.
     */
    if (SSL_IS_TLS13(s) || s->session->session_id_length > 0) {
2485 2486 2487 2488 2489 2490
        int i = s->session_ctx->session_cache_mode;
        SSL_SESSION *new_sess;
        /*
         * We reused an existing session, so we need to replace it with a new
         * one
         */
2491
        if ((new_sess = ssl_session_dup(s->session, 0)) == 0) {
2492 2493 2494 2495
            SSLfatal(s, SSL_AD_INTERNAL_ERROR,
                     SSL_F_TLS_PROCESS_NEW_SESSION_TICKET,
                     ERR_R_MALLOC_FAILURE);
            goto err;
2496 2497
        }

2498 2499
        if (i & SSL_SESS_CACHE_CLIENT) {
            /*
2500
             * Remove the old session from the cache. We carry on if this fails
2501
             */
2502
            SSL_CTX_remove_session(s->session_ctx, s->session);
2503 2504 2505 2506 2507 2508
        }

        SSL_SESSION_free(s->session);
        s->session = new_sess;
    }

M
Matt Caswell 已提交
2509 2510 2511 2512 2513 2514
    /*
     * Technically the cast to long here is not guaranteed by the C standard -
     * but we use it elsewhere, so this should be ok.
     */
    s->session->time = (long)time(NULL);

R
Rich Salz 已提交
2515 2516 2517
    OPENSSL_free(s->session->ext.tick);
    s->session->ext.tick = NULL;
    s->session->ext.ticklen = 0;
2518

R
Rich Salz 已提交
2519 2520
    s->session->ext.tick = OPENSSL_malloc(ticklen);
    if (s->session->ext.tick == NULL) {
2521 2522
        SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_TLS_PROCESS_NEW_SESSION_TICKET,
                 ERR_R_MALLOC_FAILURE);
2523 2524
        goto err;
    }
R
Rich Salz 已提交
2525
    if (!PACKET_copy_bytes(pkt, s->session->ext.tick, ticklen)) {
2526 2527 2528
        SSLfatal(s, SSL_AD_DECODE_ERROR, SSL_F_TLS_PROCESS_NEW_SESSION_TICKET,
                 SSL_R_LENGTH_MISMATCH);
        goto err;
M
Matt Caswell 已提交
2529
    }
2530

R
Rich Salz 已提交
2531
    s->session->ext.tick_lifetime_hint = ticket_lifetime_hint;
M
Matt Caswell 已提交
2532
    s->session->ext.tick_age_add = age_add;
R
Rich Salz 已提交
2533
    s->session->ext.ticklen = ticklen;
2534 2535 2536 2537 2538

    if (SSL_IS_TLS13(s)) {
        PACKET extpkt;

        if (!PACKET_as_length_prefixed_2(pkt, &extpkt)
2539
                || PACKET_remaining(pkt) != 0
2540
                || !tls_collect_extensions(s, &extpkt,
2541
                                           SSL_EXT_TLS1_3_NEW_SESSION_TICKET,
2542
                                           &exts, NULL, 1)
2543 2544
                || !tls_parse_all_extensions(s,
                                             SSL_EXT_TLS1_3_NEW_SESSION_TICKET,
2545 2546 2547
                                             exts, NULL, 0, 1)) {
            /* SSLfatal() already called */
            goto err;
2548 2549 2550
        }
    }

2551 2552 2553 2554 2555 2556 2557 2558 2559 2560 2561
    /*
     * There are two ways to detect a resumed ticket session. One is to set
     * an appropriate session ID and then the server must return a match in
     * ServerHello. This allows the normal client session ID matching to work
     * and we know much earlier that the ticket has been accepted. The
     * other way is to set zero length session ID when the ticket is
     * presented and rely on the handshake to determine session resumption.
     * We choose the former approach because this fits in with assumptions
     * elsewhere in OpenSSL. The session ID is set to the SHA256 (or SHA1 is
     * SHA256 is disabled) hash of the ticket.
     */
2562 2563 2564 2565
    /*
     * TODO(size_t): we use sess_len here because EVP_Digest expects an int
     * but s->session->session_id_length is a size_t
     */
R
Rich Salz 已提交
2566
    if (!EVP_Digest(s->session->ext.tick, ticklen,
2567
                    s->session->session_id, &sess_len,
2568
                    EVP_sha256(), NULL)) {
2569 2570
        SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_TLS_PROCESS_NEW_SESSION_TICKET,
                 ERR_R_EVP_LIB);
2571 2572
        goto err;
    }
2573
    s->session->session_id_length = sess_len;
2574 2575 2576

    /* This is a standalone message in TLSv1.3, so there is no more to read */
    if (SSL_IS_TLS13(s)) {
2577
        OPENSSL_free(exts);
2578 2579 2580 2581
        ssl_update_cache(s, SSL_SESS_CACHE_CLIENT);
        return MSG_PROCESS_FINISHED_READING;
    }

2582
    return MSG_PROCESS_CONTINUE_READING;
2583
 err:
2584
    OPENSSL_free(exts);
2585
    return MSG_PROCESS_ERROR;
2586
}
2587

2588 2589
/*
 * In TLSv1.3 this is called from the extensions code, otherwise it is used to
2590
 * parse a separate message. Returns 1 on success or 0 on failure
2591
 */
2592
int tls_process_cert_status_body(SSL *s, PACKET *pkt)
2593
{
M
Matt Caswell 已提交
2594
    size_t resplen;
2595 2596
    unsigned int type;

2597
    if (!PACKET_get_1(pkt, &type)
E
Emilia Kasper 已提交
2598
        || type != TLSEXT_STATUSTYPE_ocsp) {
2599 2600
        SSLfatal(s, SSL_AD_DECODE_ERROR, SSL_F_TLS_PROCESS_CERT_STATUS_BODY,
                 SSL_R_UNSUPPORTED_STATUS_TYPE);
2601
        return 0;
2602
    }
2603 2604
    if (!PACKET_get_net_3_len(pkt, &resplen)
        || PACKET_remaining(pkt) != resplen) {
2605 2606
        SSLfatal(s, SSL_AD_DECODE_ERROR, SSL_F_TLS_PROCESS_CERT_STATUS_BODY,
                 SSL_R_LENGTH_MISMATCH);
2607
        return 0;
2608
    }
2609 2610
    s->ext.ocsp.resp = OPENSSL_malloc(resplen);
    if (s->ext.ocsp.resp == NULL) {
2611 2612
        SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_TLS_PROCESS_CERT_STATUS_BODY,
                 ERR_R_MALLOC_FAILURE);
2613
        return 0;
2614
    }
2615
    if (!PACKET_copy_bytes(pkt, s->ext.ocsp.resp, resplen)) {
2616 2617
        SSLfatal(s, SSL_AD_DECODE_ERROR, SSL_F_TLS_PROCESS_CERT_STATUS_BODY,
                 SSL_R_LENGTH_MISMATCH);
2618
        return 0;
2619
    }
2620
    s->ext.ocsp.resp_len = resplen;
2621 2622 2623

    return 1;
}
2624

2625 2626 2627

MSG_PROCESS_RETURN tls_process_cert_status(SSL *s, PACKET *pkt)
{
2628 2629
    if (!tls_process_cert_status_body(s, pkt)) {
        /* SSLfatal() already called */
2630 2631 2632
        return MSG_PROCESS_ERROR;
    }

2633
    return MSG_PROCESS_CONTINUE_READING;
2634
}
2635

2636 2637 2638
/*
 * Perform miscellaneous checks and processing after we have received the
 * server's initial flight. In TLS1.3 this is after the Server Finished message.
2639 2640
 * In <=TLS1.2 this is after the ServerDone message. Returns 1 on success or 0
 * on failure.
2641
 */
2642
int tls_process_initial_server_flight(SSL *s)
2643
{
2644 2645 2646 2647 2648
    /*
     * at this point we check that we have the required stuff from
     * the server
     */
    if (!ssl3_check_cert_and_algorithm(s)) {
2649
        /* SSLfatal() already called */
2650
        return 0;
2651 2652
    }

2653
    /*
R
Rich Salz 已提交
2654 2655
     * Call the ocsp status callback if needed. The |ext.ocsp.resp| and
     * |ext.ocsp.resp_len| values will be set if we actually received a status
2656 2657
     * message, or NULL and -1 otherwise
     */
R
Rich Salz 已提交
2658 2659 2660 2661
    if (s->ext.status_type != TLSEXT_STATUSTYPE_nothing
            && s->ctx->ext.status_cb != NULL) {
        int ret = s->ctx->ext.status_cb(s, s->ctx->ext.status_arg);

2662
        if (ret == 0) {
2663 2664 2665
            SSLfatal(s, SSL_AD_BAD_CERTIFICATE_STATUS_RESPONSE,
                     SSL_F_TLS_PROCESS_INITIAL_SERVER_FLIGHT,
                     SSL_R_INVALID_STATUS_RESPONSE);
2666
            return 0;
2667 2668
        }
        if (ret < 0) {
2669 2670
            SSLfatal(s, SSL_AD_INTERNAL_ERROR,
                     SSL_F_TLS_PROCESS_INITIAL_SERVER_FLIGHT,
M
Matt Caswell 已提交
2671
                     ERR_R_MALLOC_FAILURE);
2672
            return 0;
2673 2674
        }
    }
2675 2676
#ifndef OPENSSL_NO_CT
    if (s->ct_validation_callback != NULL) {
2677 2678
        /* Note we validate the SCTs whether or not we abort on error */
        if (!ssl_validate_ct(s) && (s->verify_mode & SSL_VERIFY_PEER)) {
2679
            /* SSLfatal() already called */
2680
            return 0;
2681 2682 2683 2684
        }
    }
#endif

2685 2686 2687 2688 2689 2690 2691
    return 1;
}

MSG_PROCESS_RETURN tls_process_server_done(SSL *s, PACKET *pkt)
{
    if (PACKET_remaining(pkt) > 0) {
        /* should contain no data */
2692 2693 2694
        SSLfatal(s, SSL_AD_DECODE_ERROR, SSL_F_TLS_PROCESS_SERVER_DONE,
                 SSL_R_LENGTH_MISMATCH);
        return MSG_PROCESS_ERROR;
2695 2696 2697 2698
    }
#ifndef OPENSSL_NO_SRP
    if (s->s3->tmp.new_cipher->algorithm_mkey & SSL_kSRP) {
        if (SRP_Calc_A_param(s) <= 0) {
2699 2700 2701
            SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_TLS_PROCESS_SERVER_DONE,
                     SSL_R_SRP_A_CALC);
            return MSG_PROCESS_ERROR;
2702 2703 2704 2705
        }
    }
#endif

2706 2707 2708 2709
    if (!tls_process_initial_server_flight(s)) {
        /* SSLfatal() already called */
        return MSG_PROCESS_ERROR;
    }
2710

2711
    return MSG_PROCESS_FINISHED_READING;
2712
}
2713

2714
static int tls_construct_cke_psk_preamble(SSL *s, WPACKET *pkt)
2715
{
2716
#ifndef OPENSSL_NO_PSK
2717 2718 2719 2720 2721 2722 2723 2724 2725 2726 2727 2728 2729 2730
    int ret = 0;
    /*
     * The callback needs PSK_MAX_IDENTITY_LEN + 1 bytes to return a
     * \0-terminated identity. The last byte is for us for simulating
     * strnlen.
     */
    char identity[PSK_MAX_IDENTITY_LEN + 1];
    size_t identitylen = 0;
    unsigned char psk[PSK_MAX_PSK_LEN];
    unsigned char *tmppsk = NULL;
    char *tmpidentity = NULL;
    size_t psklen = 0;

    if (s->psk_client_callback == NULL) {
2731 2732
        SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_TLS_CONSTRUCT_CKE_PSK_PREAMBLE,
                 SSL_R_PSK_NO_CLIENT_CB);
2733 2734
        goto err;
    }
2735

2736
    memset(identity, 0, sizeof(identity));
2737

2738 2739 2740
    psklen = s->psk_client_callback(s, s->session->psk_identity_hint,
                                    identity, sizeof(identity) - 1,
                                    psk, sizeof(psk));
2741

2742
    if (psklen > PSK_MAX_PSK_LEN) {
2743 2744
        SSLfatal(s, SSL_AD_HANDSHAKE_FAILURE,
                 SSL_F_TLS_CONSTRUCT_CKE_PSK_PREAMBLE, ERR_R_INTERNAL_ERROR);
2745 2746
        goto err;
    } else if (psklen == 0) {
2747 2748 2749
        SSLfatal(s, SSL_AD_HANDSHAKE_FAILURE,
                 SSL_F_TLS_CONSTRUCT_CKE_PSK_PREAMBLE,
                 SSL_R_PSK_IDENTITY_NOT_FOUND);
2750 2751
        goto err;
    }
2752

2753 2754
    identitylen = strlen(identity);
    if (identitylen > PSK_MAX_IDENTITY_LEN) {
2755 2756
        SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_TLS_CONSTRUCT_CKE_PSK_PREAMBLE,
                 ERR_R_INTERNAL_ERROR);
2757 2758
        goto err;
    }
2759

2760 2761 2762
    tmppsk = OPENSSL_memdup(psk, psklen);
    tmpidentity = OPENSSL_strdup(identity);
    if (tmppsk == NULL || tmpidentity == NULL) {
2763 2764
        SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_TLS_CONSTRUCT_CKE_PSK_PREAMBLE,
                 ERR_R_MALLOC_FAILURE);
2765 2766
        goto err;
    }
2767

2768 2769 2770 2771 2772 2773 2774
    OPENSSL_free(s->s3->tmp.psk);
    s->s3->tmp.psk = tmppsk;
    s->s3->tmp.psklen = psklen;
    tmppsk = NULL;
    OPENSSL_free(s->session->psk_identity);
    s->session->psk_identity = tmpidentity;
    tmpidentity = NULL;
2775

2776
    if (!WPACKET_sub_memcpy_u16(pkt, identity, identitylen))  {
2777 2778
        SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_TLS_CONSTRUCT_CKE_PSK_PREAMBLE,
                 ERR_R_INTERNAL_ERROR);
2779 2780
        goto err;
    }
2781

2782
    ret = 1;
2783

2784 2785 2786 2787 2788
 err:
    OPENSSL_cleanse(psk, psklen);
    OPENSSL_cleanse(identity, sizeof(identity));
    OPENSSL_clear_free(tmppsk, psklen);
    OPENSSL_clear_free(tmpidentity, identitylen);
2789

2790 2791
    return ret;
#else
2792 2793
    SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_TLS_CONSTRUCT_CKE_PSK_PREAMBLE,
             ERR_R_INTERNAL_ERROR);
2794
    return 0;
2795
#endif
2796
}
2797

2798
static int tls_construct_cke_rsa(SSL *s, WPACKET *pkt)
2799
{
2800
#ifndef OPENSSL_NO_RSA
2801
    unsigned char *encdata = NULL;
2802 2803 2804 2805 2806
    EVP_PKEY *pkey = NULL;
    EVP_PKEY_CTX *pctx = NULL;
    size_t enclen;
    unsigned char *pms = NULL;
    size_t pmslen = 0;
2807

2808 2809 2810 2811
    if (s->session->peer == NULL) {
        /*
         * We should always have a server certificate with SSL_kRSA.
         */
2812 2813
        SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_TLS_CONSTRUCT_CKE_RSA,
                 ERR_R_INTERNAL_ERROR);
2814 2815
        return 0;
    }
2816

2817 2818
    pkey = X509_get0_pubkey(s->session->peer);
    if (EVP_PKEY_get0_RSA(pkey) == NULL) {
2819 2820
        SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_TLS_CONSTRUCT_CKE_RSA,
                 ERR_R_INTERNAL_ERROR);
2821 2822
        return 0;
    }
2823

2824 2825 2826
    pmslen = SSL_MAX_MASTER_KEY_LENGTH;
    pms = OPENSSL_malloc(pmslen);
    if (pms == NULL) {
2827 2828
        SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_TLS_CONSTRUCT_CKE_RSA,
                 ERR_R_MALLOC_FAILURE);
2829 2830
        return 0;
    }
2831

2832 2833
    pms[0] = s->client_version >> 8;
    pms[1] = s->client_version & 0xff;
2834
    /* TODO(size_t): Convert this function */
R
Rich Salz 已提交
2835
    if (ssl_randbytes(s, pms + 2, (int)(pmslen - 2)) <= 0) {
2836 2837
        SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_TLS_CONSTRUCT_CKE_RSA,
                 ERR_R_MALLOC_FAILURE);
2838 2839
        goto err;
    }
2840

2841
    /* Fix buf for TLS and beyond */
2842
    if (s->version > SSL3_VERSION && !WPACKET_start_sub_packet_u16(pkt)) {
2843 2844
        SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_TLS_CONSTRUCT_CKE_RSA,
                 ERR_R_INTERNAL_ERROR);
2845 2846
        goto err;
    }
2847 2848 2849
    pctx = EVP_PKEY_CTX_new(pkey, NULL);
    if (pctx == NULL || EVP_PKEY_encrypt_init(pctx) <= 0
        || EVP_PKEY_encrypt(pctx, NULL, &enclen, pms, pmslen) <= 0) {
2850 2851
        SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_TLS_CONSTRUCT_CKE_RSA,
                 ERR_R_EVP_LIB);
2852 2853
        goto err;
    }
2854 2855
    if (!WPACKET_allocate_bytes(pkt, enclen, &encdata)
            || EVP_PKEY_encrypt(pctx, encdata, &enclen, pms, pmslen) <= 0) {
2856 2857
        SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_TLS_CONSTRUCT_CKE_RSA,
                 SSL_R_BAD_RSA_ENCRYPT);
2858 2859 2860 2861
        goto err;
    }
    EVP_PKEY_CTX_free(pctx);
    pctx = NULL;
2862

2863
    /* Fix buf for TLS and beyond */
2864
    if (s->version > SSL3_VERSION && !WPACKET_close(pkt)) {
2865 2866
        SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_TLS_CONSTRUCT_CKE_RSA,
                 ERR_R_INTERNAL_ERROR);
2867
        goto err;
2868
    }
2869

2870
    /* Log the premaster secret, if logging is enabled. */
2871 2872
    if (!ssl_log_rsa_client_key_exchange(s, encdata, enclen, pms, pmslen)) {
        /* SSLfatal() already called */
2873
        goto err;
2874
    }
2875

2876 2877 2878
    s->s3->tmp.pms = pms;
    s->s3->tmp.pmslen = pmslen;

2879 2880 2881 2882 2883 2884 2885
    return 1;
 err:
    OPENSSL_clear_free(pms, pmslen);
    EVP_PKEY_CTX_free(pctx);

    return 0;
#else
2886 2887
    SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_TLS_CONSTRUCT_CKE_RSA,
             ERR_R_INTERNAL_ERROR);
2888
    return 0;
2889
#endif
2890 2891
}

2892
static int tls_construct_cke_dhe(SSL *s, WPACKET *pkt)
2893 2894 2895 2896 2897
{
#ifndef OPENSSL_NO_DH
    DH *dh_clnt = NULL;
    const BIGNUM *pub_key;
    EVP_PKEY *ckey = NULL, *skey = NULL;
2898
    unsigned char *keybytes = NULL;
2899 2900

    skey = s->s3->peer_tmp;
2901 2902 2903
    if (skey == NULL) {
        SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_TLS_CONSTRUCT_CKE_DHE,
                 ERR_R_INTERNAL_ERROR);
2904
        goto err;
2905
    }
2906

D
Dr. Stephen Henson 已提交
2907
    ckey = ssl_generate_pkey(skey);
2908 2909 2910
    if (ckey == NULL) {
        SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_TLS_CONSTRUCT_CKE_DHE,
                 ERR_R_INTERNAL_ERROR);
2911
        goto err;
2912
    }
2913

2914 2915
    dh_clnt = EVP_PKEY_get0_DH(ckey);

2916 2917 2918 2919 2920 2921 2922 2923
    if (dh_clnt == NULL) {
        SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_TLS_CONSTRUCT_CKE_DHE,
                 ERR_R_INTERNAL_ERROR);
        goto err;
    }

    if (ssl_derive(s, ckey, skey, 0) == 0) {
        /* SSLfatal() already called */
2924
        goto err;
2925
    }
2926 2927 2928

    /* send off the data */
    DH_get0_key(dh_clnt, &pub_key, NULL);
2929 2930 2931 2932
    if (!WPACKET_sub_allocate_bytes_u16(pkt, BN_num_bytes(pub_key),
                                        &keybytes)) {
        SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_TLS_CONSTRUCT_CKE_DHE,
                 ERR_R_INTERNAL_ERROR);
2933
        goto err;
2934
    }
2935 2936

    BN_bn2bin(pub_key, keybytes);
2937 2938 2939
    EVP_PKEY_free(ckey);

    return 1;
2940 2941
 err:
    EVP_PKEY_free(ckey);
2942 2943
    return 0;
#else
2944 2945
    SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_TLS_CONSTRUCT_CKE_DHE,
             ERR_R_INTERNAL_ERROR);
2946
    return 0;
2947
#endif
2948 2949
}

2950
static int tls_construct_cke_ecdhe(SSL *s, WPACKET *pkt)
2951 2952 2953
{
#ifndef OPENSSL_NO_EC
    unsigned char *encodedPoint = NULL;
2954
    size_t encoded_pt_len = 0;
2955
    EVP_PKEY *ckey = NULL, *skey = NULL;
2956
    int ret = 0;
2957 2958

    skey = s->s3->peer_tmp;
2959
    if (skey == NULL) {
2960 2961
        SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_TLS_CONSTRUCT_CKE_ECDHE,
                 ERR_R_INTERNAL_ERROR);
2962 2963 2964
        return 0;
    }

D
Dr. Stephen Henson 已提交
2965
    ckey = ssl_generate_pkey(skey);
2966
    if (ckey == NULL) {
2967 2968
        SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_TLS_CONSTRUCT_CKE_ECDHE,
                 ERR_R_MALLOC_FAILURE);
2969 2970
        goto err;
    }
2971

2972
    if (ssl_derive(s, ckey, skey, 0) == 0) {
2973
        /* SSLfatal() already called */
2974 2975 2976 2977
        goto err;
    }

    /* Generate encoding of client key */
2978
    encoded_pt_len = EVP_PKEY_get1_tls_encodedpoint(ckey, &encodedPoint);
2979 2980

    if (encoded_pt_len == 0) {
2981 2982
        SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_TLS_CONSTRUCT_CKE_ECDHE,
                 ERR_R_EC_LIB);
2983 2984 2985
        goto err;
    }

2986
    if (!WPACKET_sub_memcpy_u8(pkt, encodedPoint, encoded_pt_len)) {
2987 2988
        SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_TLS_CONSTRUCT_CKE_ECDHE,
                 ERR_R_INTERNAL_ERROR);
2989 2990
        goto err;
    }
2991

2992
    ret = 1;
2993
 err:
2994
    OPENSSL_free(encodedPoint);
2995
    EVP_PKEY_free(ckey);
2996
    return ret;
2997
#else
2998 2999
    SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_TLS_CONSTRUCT_CKE_ECDHE,
             ERR_R_INTERNAL_ERROR);
3000 3001 3002 3003
    return 0;
#endif
}

3004
static int tls_construct_cke_gost(SSL *s, WPACKET *pkt)
3005 3006 3007 3008 3009 3010 3011 3012 3013 3014 3015 3016 3017 3018 3019 3020 3021
{
#ifndef OPENSSL_NO_GOST
    /* GOST key exchange message creation */
    EVP_PKEY_CTX *pkey_ctx = NULL;
    X509 *peer_cert;
    size_t msglen;
    unsigned int md_len;
    unsigned char shared_ukm[32], tmp[256];
    EVP_MD_CTX *ukm_hash = NULL;
    int dgst_nid = NID_id_GostR3411_94;
    unsigned char *pms = NULL;
    size_t pmslen = 0;

    if ((s->s3->tmp.new_cipher->algorithm_auth & SSL_aGOST12) != 0)
        dgst_nid = NID_id_GostR3411_2012_256;

    /*
F
FdaSilvaYY 已提交
3022
     * Get server certificate PKEY and create ctx from it
3023 3024 3025
     */
    peer_cert = s->session->peer;
    if (!peer_cert) {
3026
        SSLfatal(s, SSL_AD_HANDSHAKE_FAILURE, SSL_F_TLS_CONSTRUCT_CKE_GOST,
3027 3028 3029 3030 3031 3032
               SSL_R_NO_GOST_CERTIFICATE_SENT_BY_PEER);
        return 0;
    }

    pkey_ctx = EVP_PKEY_CTX_new(X509_get0_pubkey(peer_cert), NULL);
    if (pkey_ctx == NULL) {
3033 3034
        SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_TLS_CONSTRUCT_CKE_GOST,
                 ERR_R_MALLOC_FAILURE);
3035 3036 3037 3038 3039 3040 3041 3042 3043 3044 3045 3046
        return 0;
    }
    /*
     * If we have send a certificate, and certificate key
     * parameters match those of server certificate, use
     * certificate key for key exchange
     */

    /* Otherwise, generate ephemeral key pair */
    pmslen = 32;
    pms = OPENSSL_malloc(pmslen);
    if (pms == NULL) {
3047 3048
        SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_TLS_CONSTRUCT_CKE_GOST,
                 ERR_R_MALLOC_FAILURE);
3049
        goto err;
3050 3051 3052
    }

    if (EVP_PKEY_encrypt_init(pkey_ctx) <= 0
3053 3054 3055
        /* Generate session key
         * TODO(size_t): Convert this function
         */
R
Rich Salz 已提交
3056
        || ssl_randbytes(s, pms, (int)pmslen) <= 0) {
3057 3058
        SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_TLS_CONSTRUCT_CKE_GOST,
                 ERR_R_INTERNAL_ERROR);
3059 3060 3061 3062 3063 3064 3065 3066
        goto err;
    };
    /*
     * Compute shared IV and store it in algorithm-specific context
     * data
     */
    ukm_hash = EVP_MD_CTX_new();
    if (ukm_hash == NULL
E
Emilia Kasper 已提交
3067 3068 3069 3070 3071 3072
        || EVP_DigestInit(ukm_hash, EVP_get_digestbynid(dgst_nid)) <= 0
        || EVP_DigestUpdate(ukm_hash, s->s3->client_random,
                            SSL3_RANDOM_SIZE) <= 0
        || EVP_DigestUpdate(ukm_hash, s->s3->server_random,
                            SSL3_RANDOM_SIZE) <= 0
        || EVP_DigestFinal_ex(ukm_hash, shared_ukm, &md_len) <= 0) {
3073 3074
        SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_TLS_CONSTRUCT_CKE_GOST,
                 ERR_R_INTERNAL_ERROR);
3075 3076 3077 3078 3079 3080
        goto err;
    }
    EVP_MD_CTX_free(ukm_hash);
    ukm_hash = NULL;
    if (EVP_PKEY_CTX_ctrl(pkey_ctx, -1, EVP_PKEY_OP_ENCRYPT,
                          EVP_PKEY_CTRL_SET_IV, 8, shared_ukm) < 0) {
3081 3082
        SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_TLS_CONSTRUCT_CKE_GOST,
                 SSL_R_LIBRARY_BUG);
3083 3084 3085 3086 3087 3088 3089 3090
        goto err;
    }
    /* Make GOST keytransport blob message */
    /*
     * Encapsulate it into sequence
     */
    msglen = 255;
    if (EVP_PKEY_encrypt(pkey_ctx, tmp, &msglen, pms, pmslen) <= 0) {
3091 3092
        SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_TLS_CONSTRUCT_CKE_GOST,
                 SSL_R_LIBRARY_BUG);
3093 3094
        goto err;
    }
3095

3096 3097
    if (!WPACKET_put_bytes_u8(pkt, V_ASN1_SEQUENCE | V_ASN1_CONSTRUCTED)
            || (msglen >= 0x80 && !WPACKET_put_bytes_u8(pkt, 0x81))
3098
            || !WPACKET_sub_memcpy_u8(pkt, tmp, msglen)) {
3099 3100
        SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_TLS_CONSTRUCT_CKE_GOST,
                 ERR_R_INTERNAL_ERROR);
3101
        goto err;
3102
    }
3103

3104 3105 3106 3107 3108 3109 3110 3111 3112 3113 3114
    EVP_PKEY_CTX_free(pkey_ctx);
    s->s3->tmp.pms = pms;
    s->s3->tmp.pmslen = pmslen;

    return 1;
 err:
    EVP_PKEY_CTX_free(pkey_ctx);
    OPENSSL_clear_free(pms, pmslen);
    EVP_MD_CTX_free(ukm_hash);
    return 0;
#else
3115 3116
    SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_TLS_CONSTRUCT_CKE_GOST,
             ERR_R_INTERNAL_ERROR);
3117 3118 3119 3120
    return 0;
#endif
}

3121
static int tls_construct_cke_srp(SSL *s, WPACKET *pkt)
3122
{
3123
#ifndef OPENSSL_NO_SRP
3124 3125 3126
    unsigned char *abytes = NULL;

    if (s->srp_ctx.A == NULL
3127 3128
            || !WPACKET_sub_allocate_bytes_u16(pkt, BN_num_bytes(s->srp_ctx.A),
                                               &abytes)) {
3129 3130
        SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_TLS_CONSTRUCT_CKE_SRP,
                 ERR_R_INTERNAL_ERROR);
3131 3132
        return 0;
    }
3133 3134
    BN_bn2bin(s->srp_ctx.A, abytes);

3135 3136 3137
    OPENSSL_free(s->session->srp_username);
    s->session->srp_username = OPENSSL_strdup(s->srp_ctx.login);
    if (s->session->srp_username == NULL) {
3138 3139
        SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_TLS_CONSTRUCT_CKE_SRP,
                 ERR_R_MALLOC_FAILURE);
3140 3141 3142 3143 3144
        return 0;
    }

    return 1;
#else
3145 3146
    SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_TLS_CONSTRUCT_CKE_SRP,
             ERR_R_INTERNAL_ERROR);
3147 3148 3149 3150
    return 0;
#endif
}

3151
int tls_construct_client_key_exchange(SSL *s, WPACKET *pkt)
3152 3153 3154
{
    unsigned long alg_k;

3155
    alg_k = s->s3->tmp.new_cipher->algorithm_mkey;
3156

3157 3158 3159 3160
    /*
     * All of the construct functions below call SSLfatal() if necessary so
     * no need to do so here.
     */
3161
    if ((alg_k & SSL_PSK)
3162
        && !tls_construct_cke_psk_preamble(s, pkt))
3163 3164
        goto err;

3165
    if (alg_k & (SSL_kRSA | SSL_kRSAPSK)) {
3166
        if (!tls_construct_cke_rsa(s, pkt))
3167
            goto err;
3168
    } else if (alg_k & (SSL_kDHE | SSL_kDHEPSK)) {
3169
        if (!tls_construct_cke_dhe(s, pkt))
3170
            goto err;
3171
    } else if (alg_k & (SSL_kECDHE | SSL_kECDHEPSK)) {
3172
        if (!tls_construct_cke_ecdhe(s, pkt))
D
Dr. Stephen Henson 已提交
3173
            goto err;
3174
    } else if (alg_k & SSL_kGOST) {
3175
        if (!tls_construct_cke_gost(s, pkt))
3176
            goto err;
3177
    } else if (alg_k & SSL_kSRP) {
3178
        if (!tls_construct_cke_srp(s, pkt))
M
Matt Caswell 已提交
3179
            goto err;
3180
    } else if (!(alg_k & SSL_kPSK)) {
3181 3182
        SSLfatal(s, SSL_AD_INTERNAL_ERROR,
                 SSL_F_TLS_CONSTRUCT_CLIENT_KEY_EXCHANGE, ERR_R_INTERNAL_ERROR);
3183 3184 3185 3186
        goto err;
    }

    return 1;
3187
 err:
3188
    OPENSSL_clear_free(s->s3->tmp.pms, s->s3->tmp.pmslen);
D
Dr. Stephen Henson 已提交
3189
    s->s3->tmp.pms = NULL;
3190 3191 3192
#ifndef OPENSSL_NO_PSK
    OPENSSL_clear_free(s->s3->tmp.psk, s->s3->tmp.psklen);
    s->s3->tmp.psk = NULL;
3193
#endif
3194 3195 3196 3197 3198 3199 3200 3201
    return 0;
}

int tls_client_key_exchange_post_work(SSL *s)
{
    unsigned char *pms = NULL;
    size_t pmslen = 0;

3202 3203 3204
    pms = s->s3->tmp.pms;
    pmslen = s->s3->tmp.pmslen;

3205 3206 3207 3208
#ifndef OPENSSL_NO_SRP
    /* Check for SRP */
    if (s->s3->tmp.new_cipher->algorithm_mkey & SSL_kSRP) {
        if (!srp_generate_client_master_secret(s)) {
3209
            /* SSLfatal() already called */
3210 3211 3212 3213 3214 3215 3216
            goto err;
        }
        return 1;
    }
#endif

    if (pms == NULL && !(s->s3->tmp.new_cipher->algorithm_mkey & SSL_kPSK)) {
3217 3218
        SSLfatal(s, SSL_AD_INTERNAL_ERROR,
                 SSL_F_TLS_CLIENT_KEY_EXCHANGE_POST_WORK, ERR_R_MALLOC_FAILURE);
3219 3220 3221
        goto err;
    }
    if (!ssl_generate_master_secret(s, pms, pmslen, 1)) {
3222
        /* SSLfatal() already called */
3223 3224 3225
        /* ssl_generate_master_secret frees the pms even on error */
        pms = NULL;
        pmslen = 0;
3226 3227
        goto err;
    }
3228 3229
    pms = NULL;
    pmslen = 0;
3230 3231 3232 3233 3234 3235 3236 3237 3238 3239

#ifndef OPENSSL_NO_SCTP
    if (SSL_IS_DTLS(s)) {
        unsigned char sctpauthkey[64];
        char labelbuffer[sizeof(DTLS1_SCTP_AUTH_LABEL)];

        /*
         * Add new shared key for SCTP-Auth, will be ignored if no SCTP
         * used.
         */
M
Matt Caswell 已提交
3240 3241
        memcpy(labelbuffer, DTLS1_SCTP_AUTH_LABEL,
               sizeof(DTLS1_SCTP_AUTH_LABEL));
3242 3243

        if (SSL_export_keying_material(s, sctpauthkey,
E
Emilia Kasper 已提交
3244
                                       sizeof(sctpauthkey), labelbuffer,
3245 3246
                                       sizeof(labelbuffer), NULL, 0, 0) <= 0) {
            SSLfatal(s, SSL_AD_INTERNAL_ERROR,
M
Matt Caswell 已提交
3247 3248
                     SSL_F_TLS_CLIENT_KEY_EXCHANGE_POST_WORK,
                     ERR_R_INTERNAL_ERROR);
3249
            goto err;
3250
        }
3251 3252 3253 3254 3255 3256

        BIO_ctrl(SSL_get_wbio(s), BIO_CTRL_DGRAM_SCTP_ADD_AUTH_KEY,
                 sizeof(sctpauthkey), sctpauthkey);
    }
#endif

3257 3258 3259 3260 3261
    return 1;
 err:
    OPENSSL_clear_free(pms, pmslen);
    s->s3->tmp.pms = NULL;
    return 0;
3262
}
3263

3264 3265 3266 3267
/*
 * Check a certificate can be used for client authentication. Currently check
 * cert exists, if we have a suitable digest for TLS 1.2 if static DH client
 * certificates can be used and optionally checks suitability for Suite B.
3268 3269
 */
static int ssl3_check_client_certificate(SSL *s)
3270 3271
{
    /* If no suitable signature algorithm can't use certificate */
3272
    if (!tls_choose_sigalg(s, 0) || s->s3->tmp.sigalg == NULL)
3273 3274 3275 3276 3277 3278 3279 3280 3281 3282
        return 0;
    /*
     * If strict mode check suitability of chain before using it. This also
     * adjusts suite B digest if necessary.
     */
    if (s->cert->cert_flags & SSL_CERT_FLAGS_CHECK_TLS_STRICT &&
        !tls1_check_chain(s, NULL, NULL, NULL, -2))
        return 0;
    return 1;
}
3283

M
Matt Caswell 已提交
3284
WORK_STATE tls_prepare_client_certificate(SSL *s, WORK_STATE wst)
3285 3286 3287 3288 3289
{
    X509 *x509 = NULL;
    EVP_PKEY *pkey = NULL;
    int i;

3290
    if (wst == WORK_MORE_A) {
3291 3292 3293 3294 3295
        /* Let cert callback update client certificates if required */
        if (s->cert->cert_cb) {
            i = s->cert->cert_cb(s, s->cert->cert_cb_arg);
            if (i < 0) {
                s->rwstate = SSL_X509_LOOKUP;
3296
                return WORK_MORE_A;
3297 3298
            }
            if (i == 0) {
3299 3300 3301
                SSLfatal(s, SSL_AD_INTERNAL_ERROR,
                         SSL_F_TLS_PREPARE_CLIENT_CERTIFICATE,
                         SSL_R_CALLBACK_FAILED);
3302
                return WORK_ERROR;
3303 3304 3305 3306
            }
            s->rwstate = SSL_NOTHING;
        }
        if (ssl3_check_client_certificate(s))
3307 3308 3309 3310
            return WORK_FINISHED_CONTINUE;

        /* Fall through to WORK_MORE_B */
        wst = WORK_MORE_B;
3311 3312 3313
    }

    /* We need to get a client cert */
3314
    if (wst == WORK_MORE_B) {
3315 3316 3317 3318 3319 3320 3321
        /*
         * If we get an error, we need to ssl->rwstate=SSL_X509_LOOKUP;
         * return(-1); We then get retied later
         */
        i = ssl_do_client_cert_cb(s, &x509, &pkey);
        if (i < 0) {
            s->rwstate = SSL_X509_LOOKUP;
3322
            return WORK_MORE_B;
3323 3324 3325 3326 3327 3328 3329
        }
        s->rwstate = SSL_NOTHING;
        if ((i == 1) && (pkey != NULL) && (x509 != NULL)) {
            if (!SSL_use_certificate(s, x509) || !SSL_use_PrivateKey(s, pkey))
                i = 0;
        } else if (i == 1) {
            i = 0;
3330
            SSLerr(SSL_F_TLS_PREPARE_CLIENT_CERTIFICATE,
3331 3332 3333
                   SSL_R_BAD_DATA_RETURNED_BY_CALLBACK);
        }

R
Rich Salz 已提交
3334
        X509_free(x509);
R
Rich Salz 已提交
3335
        EVP_PKEY_free(pkey);
3336 3337 3338 3339 3340 3341
        if (i && !ssl3_check_client_certificate(s))
            i = 0;
        if (i == 0) {
            if (s->version == SSL3_VERSION) {
                s->s3->tmp.cert_req = 0;
                ssl3_send_alert(s, SSL3_AL_WARNING, SSL_AD_NO_CERTIFICATE);
3342
                return WORK_FINISHED_CONTINUE;
3343 3344
            } else {
                s->s3->tmp.cert_req = 2;
3345
                if (!ssl3_digest_cached_records(s, 0)) {
3346
                    /* SSLfatal() already called */
3347
                    return WORK_ERROR;
3348
                }
3349 3350 3351
            }
        }

3352
        return WORK_FINISHED_CONTINUE;
3353 3354
    }

3355
    /* Shouldn't ever get here */
3356 3357
    SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_TLS_PREPARE_CLIENT_CERTIFICATE,
             ERR_R_INTERNAL_ERROR);
3358 3359 3360
    return WORK_ERROR;
}

3361
int tls_construct_client_certificate(SSL *s, WPACKET *pkt)
3362
{
3363 3364 3365 3366
    /*
     * TODO(TLS1.3): For now we must put an empty context. Needs to be filled in
     * later
     */
3367 3368 3369 3370 3371 3372 3373 3374 3375 3376
    if (SSL_IS_TLS13(s) && !WPACKET_put_bytes_u8(pkt, 0)) {
        SSLfatal(s, SSL_AD_INTERNAL_ERROR,
                 SSL_F_TLS_CONSTRUCT_CLIENT_CERTIFICATE, ERR_R_INTERNAL_ERROR);
        return 0;
    }
    if (!ssl3_output_cert_chain(s, pkt,
                                (s->s3->tmp.cert_req == 2) ? NULL
                                                           : s->cert->key)) {
        /* SSLfatal() already called */
        return 0;
3377 3378 3379 3380 3381 3382
    }

    if (SSL_IS_TLS13(s)
            && SSL_IS_FIRST_HANDSHAKE(s)
            && (!s->method->ssl3_enc->change_cipher_state(s,
                    SSL3_CC_HANDSHAKE | SSL3_CHANGE_CIPHER_CLIENT_WRITE))) {
3383
        /*
3384
         * This is a fatal error, which leaves enc_write_ctx in an inconsistent
3385
         * state and thus ssl3_send_alert may crash.
3386
         */
3387
        SSLfatal(s, SSL_AD_NO_ALERT, SSL_F_TLS_CONSTRUCT_CLIENT_CERTIFICATE,
M
Matt Caswell 已提交
3388
                 SSL_R_CANNOT_CHANGE_CIPHER);
3389
        return 0;
3390
    }
3391 3392

    return 1;
3393 3394
}

B
Ben Laurie 已提交
3395
int ssl3_check_cert_and_algorithm(SSL *s)
3396
{
3397 3398
    const SSL_CERT_LOOKUP *clu;
    size_t idx;
3399
    long alg_k, alg_a;
3400

3401 3402
    alg_k = s->s3->tmp.new_cipher->algorithm_mkey;
    alg_a = s->s3->tmp.new_cipher->algorithm_auth;
3403

3404
    /* we don't have a certificate */
3405 3406
    if (!(alg_a & SSL_aCERT))
        return 1;
3407

3408
    /* This is the passed certificate */
3409
    clu = ssl_cert_lookup_by_pkey(X509_get0_pubkey(s->session->peer), &idx);
3410

3411 3412
    /* Check certificate is recognised and suitable for cipher */
    if (clu == NULL || (alg_a & clu->amask) == 0) {
3413 3414 3415 3416
        SSLfatal(s, SSL_AD_HANDSHAKE_FAILURE,
                 SSL_F_SSL3_CHECK_CERT_AND_ALGORITHM,
                 SSL_R_MISSING_SIGNING_CERT);
        return 0;
3417 3418
    }

3419 3420 3421 3422
#ifndef OPENSSL_NO_EC
    if (clu->amask & SSL_aECDSA) {
        if (ssl_check_srvr_ecc_cert_and_alg(s->session->peer, s))
            return 1;
3423 3424 3425
        SSLfatal(s, SSL_AD_HANDSHAKE_FAILURE,
                 SSL_F_SSL3_CHECK_CERT_AND_ALGORITHM, SSL_R_BAD_ECC_CERT);
        return 0;
3426
    }
3427
#endif
3428
#ifndef OPENSSL_NO_RSA
3429
    if (alg_k & (SSL_kRSA | SSL_kRSAPSK) && idx != SSL_PKEY_RSA) {
3430 3431 3432 3433
        SSLfatal(s, SSL_AD_HANDSHAKE_FAILURE,
                 SSL_F_SSL3_CHECK_CERT_AND_ALGORITHM,
                 SSL_R_MISSING_RSA_ENCRYPTING_CERT);
        return 0;
3434
    }
3435
#endif
3436
#ifndef OPENSSL_NO_DH
D
Dr. Stephen Henson 已提交
3437
    if ((alg_k & SSL_kDHE) && (s->s3->peer_tmp == NULL)) {
3438 3439 3440
        SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_SSL3_CHECK_CERT_AND_ALGORITHM,
                 ERR_R_INTERNAL_ERROR);
        return 0;
3441
    }
3442 3443
#endif

3444
    return 1;
3445 3446
}

3447
#ifndef OPENSSL_NO_NEXTPROTONEG
3448
int tls_construct_next_proto(SSL *s, WPACKET *pkt)
3449
{
3450 3451 3452
    size_t len, padding_len;
    unsigned char *padding = NULL;

R
Rich Salz 已提交
3453
    len = s->ext.npn_len;
3454
    padding_len = 32 - ((len + 2) % 32);
3455

R
Rich Salz 已提交
3456
    if (!WPACKET_sub_memcpy_u8(pkt, s->ext.npn, len)
3457
            || !WPACKET_sub_allocate_bytes_u8(pkt, padding_len, &padding)) {
3458 3459 3460
        SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_TLS_CONSTRUCT_NEXT_PROTO,
                 ERR_R_INTERNAL_ERROR);
        return 0;
3461 3462 3463 3464
    }

    memset(padding, 0, padding_len);

3465 3466
    return 1;
}
3467
#endif
3468

3469 3470 3471 3472
MSG_PROCESS_RETURN tls_process_hello_req(SSL *s, PACKET *pkt)
{
    if (PACKET_remaining(pkt) > 0) {
        /* should contain no data */
3473 3474
        SSLfatal(s, SSL_AD_DECODE_ERROR, SSL_F_TLS_PROCESS_HELLO_REQ,
                 SSL_R_LENGTH_MISMATCH);
3475 3476 3477
        return MSG_PROCESS_ERROR;
    }

T
Todd Short 已提交
3478 3479 3480 3481 3482
    if ((s->options & SSL_OP_NO_RENEGOTIATION)) {
        ssl3_send_alert(s, SSL3_AL_WARNING, SSL_AD_NO_RENEGOTIATION);
        return MSG_PROCESS_FINISHED_READING;
    }

3483
    /*
3484 3485 3486 3487 3488
     * This is a historical discrepancy (not in the RFC) maintained for
     * compatibility reasons. If a TLS client receives a HelloRequest it will
     * attempt an abbreviated handshake. However if a DTLS client receives a
     * HelloRequest it will do a full handshake. Either behaviour is reasonable
     * but doing one for TLS and another for DTLS is odd.
3489 3490 3491 3492 3493 3494 3495 3496 3497
     */
    if (SSL_IS_DTLS(s))
        SSL_renegotiate(s);
    else
        SSL_renegotiate_abbreviated(s);

    return MSG_PROCESS_FINISHED_READING;
}

M
Matt Caswell 已提交
3498 3499 3500
static MSG_PROCESS_RETURN tls_process_encrypted_extensions(SSL *s, PACKET *pkt)
{
    PACKET extensions;
M
Matt Caswell 已提交
3501
    RAW_EXTENSION *rawexts = NULL;
M
Matt Caswell 已提交
3502

3503 3504
    if (!PACKET_as_length_prefixed_2(pkt, &extensions)
            || PACKET_remaining(pkt) != 0) {
3505 3506
        SSLfatal(s, SSL_AD_DECODE_ERROR, SSL_F_TLS_PROCESS_ENCRYPTED_EXTENSIONS,
                 SSL_R_LENGTH_MISMATCH);
M
Matt Caswell 已提交
3507 3508 3509
        goto err;
    }

3510 3511
    if (!tls_collect_extensions(s, &extensions,
                                SSL_EXT_TLS1_3_ENCRYPTED_EXTENSIONS, &rawexts,
3512
                                NULL, 1)
3513
            || !tls_parse_all_extensions(s, SSL_EXT_TLS1_3_ENCRYPTED_EXTENSIONS,
3514 3515
                                         rawexts, NULL, 0, 1)) {
        /* SSLfatal() already called */
M
Matt Caswell 已提交
3516
        goto err;
3517
    }
M
Matt Caswell 已提交
3518

M
Matt Caswell 已提交
3519
    OPENSSL_free(rawexts);
M
Matt Caswell 已提交
3520 3521 3522
    return MSG_PROCESS_CONTINUE_READING;

 err:
M
Matt Caswell 已提交
3523
    OPENSSL_free(rawexts);
M
Matt Caswell 已提交
3524 3525 3526
    return MSG_PROCESS_ERROR;
}

3527
int ssl_do_client_cert_cb(SSL *s, X509 **px509, EVP_PKEY **ppkey)
3528 3529
{
    int i = 0;
3530
#ifndef OPENSSL_NO_ENGINE
3531 3532 3533 3534 3535 3536 3537 3538 3539 3540 3541 3542
    if (s->ctx->client_cert_engine) {
        i = ENGINE_load_ssl_client_cert(s->ctx->client_cert_engine, s,
                                        SSL_get_client_CA_list(s),
                                        px509, ppkey, NULL, NULL, NULL);
        if (i != 0)
            return i;
    }
#endif
    if (s->ctx->client_cert_cb)
        i = s->ctx->client_cert_cb(s, px509, ppkey);
    return i;
}
M
Matt Caswell 已提交
3543

M
Matt Caswell 已提交
3544
int ssl_cipher_list_to_bytes(SSL *s, STACK_OF(SSL_CIPHER) *sk, WPACKET *pkt)
M
Matt Caswell 已提交
3545
{
3546
    int i;
3547
    size_t totlen = 0, len, maxlen, maxverok = 0;
M
Matt Caswell 已提交
3548 3549 3550 3551
    int empty_reneg_info_scsv = !s->renegotiate;
    /* Set disabled masks for this session */
    ssl_set_client_disabled(s);

3552 3553 3554
    if (sk == NULL) {
        SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_SSL_CIPHER_LIST_TO_BYTES,
                 ERR_R_INTERNAL_ERROR);
K
KaoruToda 已提交
3555
        return 0;
3556
    }
M
Matt Caswell 已提交
3557

3558 3559 3560 3561 3562 3563 3564 3565 3566 3567 3568 3569 3570 3571 3572 3573 3574 3575 3576 3577 3578 3579 3580 3581
#ifdef OPENSSL_MAX_TLS1_2_CIPHER_LENGTH
# if OPENSSL_MAX_TLS1_2_CIPHER_LENGTH < 6
#  error Max cipher length too short
# endif
    /*
     * Some servers hang if client hello > 256 bytes as hack workaround
     * chop number of supported ciphers to keep it well below this if we
     * use TLS v1.2
     */
    if (TLS1_get_version(s) >= TLS1_2_VERSION)
        maxlen = OPENSSL_MAX_TLS1_2_CIPHER_LENGTH & ~1;
    else
#endif
        /* Maximum length that can be stored in 2 bytes. Length must be even */
        maxlen = 0xfffe;

    if (empty_reneg_info_scsv)
        maxlen -= 2;
    if (s->mode & SSL_MODE_SEND_FALLBACK_SCSV)
        maxlen -= 2;

    for (i = 0; i < sk_SSL_CIPHER_num(sk) && totlen < maxlen; i++) {
        const SSL_CIPHER *c;

M
Matt Caswell 已提交
3582 3583
        c = sk_SSL_CIPHER_value(sk, i);
        /* Skip disabled ciphers */
3584
        if (ssl_cipher_disabled(s, c, SSL_SECOP_CIPHER_SUPPORTED, 0))
M
Matt Caswell 已提交
3585
            continue;
3586 3587

        if (!s->method->put_cipher_by_char(c, pkt, &len)) {
3588 3589
            SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_SSL_CIPHER_LIST_TO_BYTES,
                     ERR_R_INTERNAL_ERROR);
3590 3591 3592
            return 0;
        }

3593 3594 3595 3596 3597 3598 3599 3600 3601 3602 3603 3604 3605
        /* Sanity check that the maximum version we offer has ciphers enabled */
        if (!maxverok) {
            if (SSL_IS_DTLS(s)) {
                if (DTLS_VERSION_GE(c->max_dtls, s->s3->tmp.max_ver)
                        && DTLS_VERSION_LE(c->min_dtls, s->s3->tmp.max_ver))
                    maxverok = 1;
            } else {
                if (c->max_tls >= s->s3->tmp.max_ver
                        && c->min_tls <= s->s3->tmp.max_ver)
                    maxverok = 1;
            }
        }

3606
        totlen += len;
M
Matt Caswell 已提交
3607
    }
3608

3609
    if (totlen == 0 || !maxverok) {
3610 3611
        SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_SSL_CIPHER_LIST_TO_BYTES,
                 SSL_R_NO_CIPHERS_AVAILABLE);
3612 3613 3614 3615 3616

        if (!maxverok)
            ERR_add_error_data(1, "No ciphers enabled for max supported "
                                  "SSL/TLS version");

3617 3618 3619 3620
        return 0;
    }

    if (totlen != 0) {
M
Matt Caswell 已提交
3621 3622
        if (empty_reneg_info_scsv) {
            static SSL_CIPHER scsv = {
3623
                0, NULL, NULL, SSL3_CK_SCSV, 0, 0, 0, 0, 0, 0, 0, 0, 0
M
Matt Caswell 已提交
3624
            };
3625
            if (!s->method->put_cipher_by_char(&scsv, pkt, &len)) {
3626 3627
                SSLfatal(s, SSL_AD_INTERNAL_ERROR,
                         SSL_F_SSL_CIPHER_LIST_TO_BYTES, ERR_R_INTERNAL_ERROR);
3628 3629
                return 0;
            }
M
Matt Caswell 已提交
3630 3631 3632
        }
        if (s->mode & SSL_MODE_SEND_FALLBACK_SCSV) {
            static SSL_CIPHER scsv = {
3633
                0, NULL, NULL, SSL3_CK_FALLBACK_SCSV, 0, 0, 0, 0, 0, 0, 0, 0, 0
M
Matt Caswell 已提交
3634
            };
3635
            if (!s->method->put_cipher_by_char(&scsv, pkt, &len)) {
3636 3637
                SSLfatal(s, SSL_AD_INTERNAL_ERROR,
                         SSL_F_SSL_CIPHER_LIST_TO_BYTES, ERR_R_INTERNAL_ERROR);
3638 3639
                return 0;
            }
M
Matt Caswell 已提交
3640 3641 3642
        }
    }

3643
    return 1;
M
Matt Caswell 已提交
3644
}
3645 3646 3647 3648 3649

int tls_construct_end_of_early_data(SSL *s, WPACKET *pkt)
{
    if (s->early_data_state != SSL_EARLY_DATA_WRITE_RETRY
            && s->early_data_state != SSL_EARLY_DATA_FINISHED_WRITING) {
3650 3651 3652
        SSLfatal(s, SSL_AD_INTERNAL_ERROR,
                 SSL_F_TLS_CONSTRUCT_END_OF_EARLY_DATA,
                 ERR_R_SHOULD_NOT_HAVE_BEEN_CALLED);
3653 3654 3655 3656 3657 3658
        return 0;
    }

    s->early_data_state = SSL_EARLY_DATA_FINISHED_WRITING;
    return 1;
}