statem_srvr.c 128.8 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 "../ssl_locl.h"
M
Matt Caswell 已提交
14
#include "statem_locl.h"
15
#include "internal/constant_time_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/hmac.h>
21
#include <openssl/x509.h>
R
Rich Salz 已提交
22
#include <openssl/dh.h>
23
#include <openssl/bn.h>
24
#include <openssl/md5.h>
25

M
Matt Caswell 已提交
26
static int tls_construct_encrypted_extensions(SSL *s, WPACKET *pkt);
M
Matt Caswell 已提交
27

M
Matt Caswell 已提交
28
/*
29 30 31 32 33
 * ossl_statem_server13_read_transition() encapsulates the logic for the allowed
 * handshake state transitions when a TLSv1.3 server is reading messages from
 * the client. The message type that the client has sent is provided in |mt|.
 * The current state is in |s->statem.hand_state|.
 *
34 35
 * Return values are 1 for success (transition allowed) and  0 on error
 * (transition not allowed)
36 37 38 39 40 41 42 43 44 45 46 47 48 49
 */
static int ossl_statem_server13_read_transition(SSL *s, int mt)
{
    OSSL_STATEM *st = &s->statem;

    /*
     * Note: There is no case for TLS_ST_BEFORE because at that stage we have
     * not negotiated TLSv1.3 yet, so that case is handled by
     * ossl_statem_server_read_transition()
     */
    switch (st->hand_state) {
    default:
        break;

50
    case TLS_ST_EARLY_DATA:
51
        if (s->hello_retry_request == SSL_HRR_PENDING) {
M
Matt Caswell 已提交
52 53 54 55 56 57
            if (mt == SSL3_MT_CLIENT_HELLO) {
                st->hand_state = TLS_ST_SR_CLNT_HELLO;
                return 1;
            }
            break;
        } else if (s->ext.early_data == SSL_EARLY_DATA_ACCEPTED) {
58 59 60 61 62 63 64 65 66
            if (mt == SSL3_MT_END_OF_EARLY_DATA) {
                st->hand_state = TLS_ST_SR_END_OF_EARLY_DATA;
                return 1;
            }
            break;
        }
        /* Fall through */

    case TLS_ST_SR_END_OF_EARLY_DATA:
67
    case TLS_ST_SW_FINISHED:
68 69 70 71 72 73
        if (s->s3->tmp.cert_request) {
            if (mt == SSL3_MT_CERTIFICATE) {
                st->hand_state = TLS_ST_SR_CERT;
                return 1;
            }
        } else {
74 75
            if (mt == SSL3_MT_FINISHED) {
                st->hand_state = TLS_ST_SR_FINISHED;
76 77 78 79 80 81 82
                return 1;
            }
        }
        break;

    case TLS_ST_SR_CERT:
        if (s->session->peer == NULL) {
83 84
            if (mt == SSL3_MT_FINISHED) {
                st->hand_state = TLS_ST_SR_FINISHED;
85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100
                return 1;
            }
        } else {
            if (mt == SSL3_MT_CERTIFICATE_VERIFY) {
                st->hand_state = TLS_ST_SR_CERT_VRFY;
                return 1;
            }
        }
        break;

    case TLS_ST_SR_CERT_VRFY:
        if (mt == SSL3_MT_FINISHED) {
            st->hand_state = TLS_ST_SR_FINISHED;
            return 1;
        }
        break;
101 102

    case TLS_ST_OK:
103 104 105 106 107 108
        /*
         * Its never ok to start processing handshake messages in the middle of
         * early data (i.e. before we've received the end of early data alert)
         */
        if (s->early_data_state == SSL_EARLY_DATA_READING)
            break;
109 110 111 112 113
        if (mt == SSL3_MT_KEY_UPDATE) {
            st->hand_state = TLS_ST_SR_KEY_UPDATE;
            return 1;
        }
        break;
114 115 116 117 118 119 120 121 122 123 124
    }

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

/*
 * ossl_statem_server_read_transition() encapsulates the logic for the allowed
 * handshake state transitions when the server is reading messages from the
 * client. The message type that the client has sent is provided in |mt|. The
 * current state is in |s->statem.hand_state|.
M
Matt Caswell 已提交
125
 *
126 127
 * Return values are 1 for success (transition allowed) and  0 on error
 * (transition not allowed)
M
Matt Caswell 已提交
128
 */
129
int ossl_statem_server_read_transition(SSL *s, int mt)
M
Matt Caswell 已提交
130
{
M
Matt Caswell 已提交
131
    OSSL_STATEM *st = &s->statem;
M
Matt Caswell 已提交
132

133
    if (SSL_IS_TLS13(s)) {
134 135 136 137
        if (!ossl_statem_server13_read_transition(s, mt))
            goto err;
        return 1;
    }
138

139
    switch (st->hand_state) {
R
Rich Salz 已提交
140 141 142
    default:
        break;

M
Matt Caswell 已提交
143
    case TLS_ST_BEFORE:
144
    case TLS_ST_OK:
M
Matt Caswell 已提交
145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162
    case DTLS_ST_SW_HELLO_VERIFY_REQUEST:
        if (mt == SSL3_MT_CLIENT_HELLO) {
            st->hand_state = TLS_ST_SR_CLNT_HELLO;
            return 1;
        }
        break;

    case TLS_ST_SW_SRVR_DONE:
        /*
         * If we get a CKE message after a ServerDone then either
         * 1) We didn't request a Certificate
         * OR
         * 2) If we did request one then
         *      a) We allow no Certificate to be returned
         *      AND
         *      b) We are running SSL3 (in TLS1.0+ the client must return a 0
         *         list if we requested a certificate)
         */
163 164 165
        if (mt == SSL3_MT_CLIENT_KEY_EXCHANGE) {
            if (s->s3->tmp.cert_request) {
                if (s->version == SSL3_VERSION) {
166 167
                    if ((s->verify_mode & SSL_VERIFY_PEER)
                        && (s->verify_mode & SSL_VERIFY_FAIL_IF_NO_PEER_CERT)) {
168 169
                        /*
                         * This isn't an unexpected message as such - we're just
170 171
                         * not going to accept it because we require a client
                         * cert.
172
                         */
173 174 175
                        SSLfatal(s, SSL_AD_HANDSHAKE_FAILURE,
                                 SSL_F_OSSL_STATEM_SERVER_READ_TRANSITION,
                                 SSL_R_PEER_DID_NOT_RETURN_A_CERTIFICATE);
176 177 178 179 180 181 182 183 184
                        return 0;
                    }
                    st->hand_state = TLS_ST_SR_KEY_EXCH;
                    return 1;
                }
            } else {
                st->hand_state = TLS_ST_SR_KEY_EXCH;
                return 1;
            }
M
Matt Caswell 已提交
185 186 187 188
        } else if (s->s3->tmp.cert_request) {
            if (mt == SSL3_MT_CERTIFICATE) {
                st->hand_state = TLS_ST_SR_CERT;
                return 1;
189
            }
M
Matt Caswell 已提交
190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205
        }
        break;

    case TLS_ST_SR_CERT:
        if (mt == SSL3_MT_CLIENT_KEY_EXCHANGE) {
            st->hand_state = TLS_ST_SR_KEY_EXCH;
            return 1;
        }
        break;

    case TLS_ST_SR_KEY_EXCH:
        /*
         * We should only process a CertificateVerify message if we have
         * received a Certificate from the client. If so then |s->session->peer|
         * will be non NULL. In some instances a CertificateVerify message is
         * not required even if the peer has sent a Certificate (e.g. such as in
206
         * the case of static DH). In that case |st->no_cert_verify| should be
M
Matt Caswell 已提交
207 208
         * set.
         */
209
        if (s->session->peer == NULL || st->no_cert_verify) {
M
Matt Caswell 已提交
210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236
            if (mt == SSL3_MT_CHANGE_CIPHER_SPEC) {
                /*
                 * For the ECDH ciphersuites when the client sends its ECDH
                 * pub key in a certificate, the CertificateVerify message is
                 * not sent. Also for GOST ciphersuites when the client uses
                 * its key from the certificate for key exchange.
                 */
                st->hand_state = TLS_ST_SR_CHANGE;
                return 1;
            }
        } else {
            if (mt == SSL3_MT_CERTIFICATE_VERIFY) {
                st->hand_state = TLS_ST_SR_CERT_VRFY;
                return 1;
            }
        }
        break;

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

    case TLS_ST_SR_CHANGE:
#ifndef OPENSSL_NO_NEXTPROTONEG
R
Rich Salz 已提交
237
        if (s->s3->npn_seen) {
M
Matt Caswell 已提交
238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269
            if (mt == SSL3_MT_NEXT_PROTO) {
                st->hand_state = TLS_ST_SR_NEXT_PROTO;
                return 1;
            }
        } else {
#endif
            if (mt == SSL3_MT_FINISHED) {
                st->hand_state = TLS_ST_SR_FINISHED;
                return 1;
            }
#ifndef OPENSSL_NO_NEXTPROTONEG
        }
#endif
        break;

#ifndef OPENSSL_NO_NEXTPROTONEG
    case TLS_ST_SR_NEXT_PROTO:
        if (mt == SSL3_MT_FINISHED) {
            st->hand_state = TLS_ST_SR_FINISHED;
            return 1;
        }
        break;
#endif

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

270
 err:
M
Matt Caswell 已提交
271
    /* No valid transition found */
272 273 274
    SSLfatal(s, SSL3_AD_UNEXPECTED_MESSAGE,
             SSL_F_OSSL_STATEM_SERVER_READ_TRANSITION,
             SSL_R_UNEXPECTED_MESSAGE);
M
Matt Caswell 已提交
275 276 277 278 279 280 281 282 283 284
    return 0;
}

/*
 * Should we send a ServerKeyExchange message?
 *
 * Valid return values are:
 *   1: Yes
 *   0: No
 */
M
Matt Caswell 已提交
285
static int send_server_key_exchange(SSL *s)
M
Matt Caswell 已提交
286 287 288 289
{
    unsigned long alg_k = s->s3->tmp.new_cipher->algorithm_mkey;

    /*
290
     * only send a ServerKeyExchange if DH or fortezza but we have a
M
Matt Caswell 已提交
291 292 293 294 295 296
     * sign only certificate PSK: may send PSK identity hints For
     * ECC ciphersuites, we send a serverKeyExchange message only if
     * the cipher suite is either ECDH-anon or ECDHE. In other cases,
     * the server certificate contains the server's public key for
     * key exchange.
     */
E
Emilia Kasper 已提交
297
    if (alg_k & (SSL_kDHE | SSL_kECDHE)
M
Matt Caswell 已提交
298 299 300 301 302 303 304 305 306 307 308 309 310 311 312
        /*
         * PSK: send ServerKeyExchange if PSK identity hint if
         * provided
         */
#ifndef OPENSSL_NO_PSK
        /* Only send SKE if we have identity hint for plain PSK */
        || ((alg_k & (SSL_kPSK | SSL_kRSAPSK))
            && s->cert->psk_identity_hint)
        /* For other PSK always send SKE */
        || (alg_k & (SSL_PSK & (SSL_kDHEPSK | SSL_kECDHEPSK)))
#endif
#ifndef OPENSSL_NO_SRP
        /* SRP: send ServerKeyExchange */
        || (alg_k & SSL_kSRP)
#endif
E
Emilia Kasper 已提交
313
        ) {
M
Matt Caswell 已提交
314 315 316 317 318 319 320 321 322 323 324 325 326
        return 1;
    }

    return 0;
}

/*
 * Should we send a CertificateRequest message?
 *
 * Valid return values are:
 *   1: Yes
 *   0: No
 */
M
Matt Caswell 已提交
327
static int send_certificate_request(SSL *s)
M
Matt Caswell 已提交
328 329 330 331 332 333 334 335
{
    if (
           /* don't request cert unless asked for it: */
           s->verify_mode & SSL_VERIFY_PEER
           /*
            * if SSL_VERIFY_CLIENT_ONCE is set, don't request cert
            * during re-negotiation:
            */
M
Matt Caswell 已提交
336
           && (s->s3->tmp.finish_md_len == 0 ||
M
Matt Caswell 已提交
337 338 339 340 341 342 343
               !(s->verify_mode & SSL_VERIFY_CLIENT_ONCE))
           /*
            * never request cert in anonymous ciphersuites (see
            * section "Certificate request" in SSL 3 drafts and in
            * RFC 2246):
            */
           && (!(s->s3->tmp.new_cipher->algorithm_auth & SSL_aNULL)
E
Emilia Kasper 已提交
344 345 346 347 348
               /*
                * ... except when the application insists on
                * verification (against the specs, but statem_clnt.c accepts
                * this for SSL 3)
                */
M
Matt Caswell 已提交
349 350 351 352 353 354 355
               || (s->verify_mode & SSL_VERIFY_FAIL_IF_NO_PEER_CERT))
           /* don't request certificate for SRP auth */
           && !(s->s3->tmp.new_cipher->algorithm_auth & SSL_aSRP)
           /*
            * With normal PSK Certificates and Certificate Requests
            * are omitted
            */
356
           && !(s->s3->tmp.new_cipher->algorithm_auth & SSL_aPSK)) {
M
Matt Caswell 已提交
357 358 359 360 361 362 363
        return 1;
    }

    return 0;
}

/*
364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379
 * ossl_statem_server13_write_transition() works out what handshake state to
 * move to next when a TLSv1.3 server is writing messages to be sent to the
 * client.
 */
static WRITE_TRAN ossl_statem_server13_write_transition(SSL *s)
{
    OSSL_STATEM *st = &s->statem;

    /*
     * No case for TLS_ST_BEFORE, because at that stage we have not negotiated
     * TLSv1.3 yet, so that is handled by ossl_statem_server_write_transition()
     */

    switch (st->hand_state) {
    default:
        /* Shouldn't happen */
380 381 382
        SSLfatal(s, SSL_AD_INTERNAL_ERROR,
                 SSL_F_OSSL_STATEM_SERVER13_WRITE_TRANSITION,
                 ERR_R_INTERNAL_ERROR);
383 384
        return WRITE_TRAN_ERROR;

385 386 387 388 389
    case TLS_ST_OK:
        if (s->key_update != SSL_KEY_UPDATE_NONE) {
            st->hand_state = TLS_ST_SW_KEY_UPDATE;
            return WRITE_TRAN_CONTINUE;
        }
390 391
        /* Try to read from the client instead */
        return WRITE_TRAN_FINISHED;
392

393
    case TLS_ST_SR_CLNT_HELLO:
M
Matt Caswell 已提交
394
        st->hand_state = TLS_ST_SW_SRVR_HELLO;
M
Matt Caswell 已提交
395
        return WRITE_TRAN_CONTINUE;
396

397
    case TLS_ST_SW_SRVR_HELLO:
398 399
        if ((s->options & SSL_OP_ENABLE_MIDDLEBOX_COMPAT) != 0
                && s->hello_retry_request != SSL_HRR_COMPLETE)
400
            st->hand_state = TLS_ST_SW_CHANGE;
401 402
        else if (s->hello_retry_request == SSL_HRR_PENDING)
            st->hand_state = TLS_ST_EARLY_DATA;
403 404 405 406 407
        else
            st->hand_state = TLS_ST_SW_ENCRYPTED_EXTENSIONS;
        return WRITE_TRAN_CONTINUE;

    case TLS_ST_SW_CHANGE:
408 409 410 411
        if (s->hello_retry_request == SSL_HRR_PENDING)
            st->hand_state = TLS_ST_EARLY_DATA;
        else
            st->hand_state = TLS_ST_SW_ENCRYPTED_EXTENSIONS;
M
Matt Caswell 已提交
412 413 414
        return WRITE_TRAN_CONTINUE;

    case TLS_ST_SW_ENCRYPTED_EXTENSIONS:
415
        if (s->hit)
416 417 418
            st->hand_state = TLS_ST_SW_FINISHED;
        else if (send_certificate_request(s))
            st->hand_state = TLS_ST_SW_CERT_REQ;
419
        else
420
            st->hand_state = TLS_ST_SW_CERT;
421

422 423 424
        return WRITE_TRAN_CONTINUE;

    case TLS_ST_SW_CERT_REQ:
425
        st->hand_state = TLS_ST_SW_CERT;
426 427
        return WRITE_TRAN_CONTINUE;

428
    case TLS_ST_SW_CERT:
429 430 431 432
        st->hand_state = TLS_ST_SW_CERT_VRFY;
        return WRITE_TRAN_CONTINUE;

    case TLS_ST_SW_CERT_VRFY:
433
        st->hand_state = TLS_ST_SW_FINISHED;
434 435 436
        return WRITE_TRAN_CONTINUE;

    case TLS_ST_SW_FINISHED:
437 438
        st->hand_state = TLS_ST_EARLY_DATA;
        return WRITE_TRAN_CONTINUE;
439

440 441 442
    case TLS_ST_EARLY_DATA:
        return WRITE_TRAN_FINISHED;

443
    case TLS_ST_SR_FINISHED:
444 445 446 447 448 449 450 451 452 453 454
        /*
         * Technically we have finished the handshake at this point, but we're
         * going to remain "in_init" for now and write out the session ticket
         * immediately.
         * TODO(TLS1.3): Perhaps we need to be able to control this behaviour
         * and give the application the opportunity to delay sending the
         * session ticket?
         */
        st->hand_state = TLS_ST_SW_SESSION_TICKET;
        return WRITE_TRAN_CONTINUE;

455
    case TLS_ST_SR_KEY_UPDATE:
456 457 458 459 460 461
        if (s->key_update != SSL_KEY_UPDATE_NONE) {
            st->hand_state = TLS_ST_SW_KEY_UPDATE;
            return WRITE_TRAN_CONTINUE;
        }
        /* Fall through */

462
    case TLS_ST_SW_KEY_UPDATE:
463
    case TLS_ST_SW_SESSION_TICKET:
464 465 466 467 468 469 470 471
        st->hand_state = TLS_ST_OK;
        return WRITE_TRAN_CONTINUE;
    }
}

/*
 * ossl_statem_server_write_transition() works out what handshake state to move
 * to next when the server is writing messages to be sent to the client.
M
Matt Caswell 已提交
472
 */
473
WRITE_TRAN ossl_statem_server_write_transition(SSL *s)
M
Matt Caswell 已提交
474
{
M
Matt Caswell 已提交
475
    OSSL_STATEM *st = &s->statem;
M
Matt Caswell 已提交
476

477 478 479 480 481
    /*
     * Note that before the ClientHello we don't know what version we are going
     * to negotiate yet, so we don't take this branch until later
     */

482
    if (SSL_IS_TLS13(s))
483 484
        return ossl_statem_server13_write_transition(s);

485
    switch (st->hand_state) {
R
Rich Salz 已提交
486 487
    default:
        /* Shouldn't happen */
488 489 490
        SSLfatal(s, SSL_AD_INTERNAL_ERROR,
                 SSL_F_OSSL_STATEM_SERVER_WRITE_TRANSITION,
                 ERR_R_INTERNAL_ERROR);
R
Rich Salz 已提交
491 492
        return WRITE_TRAN_ERROR;

493 494 495 496 497 498 499
    case TLS_ST_OK:
        if (st->request_state == TLS_ST_SW_HELLO_REQ) {
            /* We must be trying to renegotiate */
            st->hand_state = TLS_ST_SW_HELLO_REQ;
            st->request_state = TLS_ST_BEFORE;
            return WRITE_TRAN_CONTINUE;
        }
500 501
        /* Must be an incoming ClientHello */
        if (!tls_setup_handshake(s)) {
502
            /* SSLfatal() already called */
503 504
            return WRITE_TRAN_ERROR;
        }
505 506
        /* Fall through */

507
    case TLS_ST_BEFORE:
E
Emilia Kasper 已提交
508
        /* Just go straight to trying to read from the client */
509
        return WRITE_TRAN_FINISHED;
M
Matt Caswell 已提交
510

511 512 513
    case TLS_ST_SW_HELLO_REQ:
        st->hand_state = TLS_ST_OK;
        return WRITE_TRAN_CONTINUE;
M
Matt Caswell 已提交
514

515 516
    case TLS_ST_SR_CLNT_HELLO:
        if (SSL_IS_DTLS(s) && !s->d1->cookie_verified
E
Emilia Kasper 已提交
517
            && (SSL_get_options(s) & SSL_OP_COOKIE_EXCHANGE))
518 519 520 521
            st->hand_state = DTLS_ST_SW_HELLO_VERIFY_REQUEST;
        else
            st->hand_state = TLS_ST_SW_SRVR_HELLO;
        return WRITE_TRAN_CONTINUE;
M
Matt Caswell 已提交
522

523 524
    case DTLS_ST_SW_HELLO_VERIFY_REQUEST:
        return WRITE_TRAN_FINISHED;
M
Matt Caswell 已提交
525

526 527
    case TLS_ST_SW_SRVR_HELLO:
        if (s->hit) {
R
Rich Salz 已提交
528
            if (s->ext.ticket_expected)
529 530 531 532 533 534 535
                st->hand_state = TLS_ST_SW_SESSION_TICKET;
            else
                st->hand_state = TLS_ST_SW_CHANGE;
        } else {
            /* Check if it is anon DH or anon ECDH, */
            /* normal PSK or SRP */
            if (!(s->s3->tmp.new_cipher->algorithm_auth &
E
Emilia Kasper 已提交
536
                  (SSL_aNULL | SSL_aSRP | SSL_aPSK))) {
537 538
                st->hand_state = TLS_ST_SW_CERT;
            } else if (send_server_key_exchange(s)) {
M
Matt Caswell 已提交
539
                st->hand_state = TLS_ST_SW_KEY_EXCH;
540
            } else if (send_certificate_request(s)) {
M
Matt Caswell 已提交
541
                st->hand_state = TLS_ST_SW_CERT_REQ;
542 543
            } else {
                st->hand_state = TLS_ST_SW_SRVR_DONE;
M
Matt Caswell 已提交
544
            }
545 546
        }
        return WRITE_TRAN_CONTINUE;
M
Matt Caswell 已提交
547

548
    case TLS_ST_SW_CERT:
R
Rich Salz 已提交
549
        if (s->ext.status_expected) {
550
            st->hand_state = TLS_ST_SW_CERT_STATUS;
M
Matt Caswell 已提交
551
            return WRITE_TRAN_CONTINUE;
552 553
        }
        /* Fall through */
M
Matt Caswell 已提交
554

555 556 557
    case TLS_ST_SW_CERT_STATUS:
        if (send_server_key_exchange(s)) {
            st->hand_state = TLS_ST_SW_KEY_EXCH;
M
Matt Caswell 已提交
558
            return WRITE_TRAN_CONTINUE;
559 560
        }
        /* Fall through */
M
Matt Caswell 已提交
561

562 563 564
    case TLS_ST_SW_KEY_EXCH:
        if (send_certificate_request(s)) {
            st->hand_state = TLS_ST_SW_CERT_REQ;
M
Matt Caswell 已提交
565
            return WRITE_TRAN_CONTINUE;
566 567
        }
        /* Fall through */
M
Matt Caswell 已提交
568

569 570 571
    case TLS_ST_SW_CERT_REQ:
        st->hand_state = TLS_ST_SW_SRVR_DONE;
        return WRITE_TRAN_CONTINUE;
M
Matt Caswell 已提交
572

573 574 575 576 577
    case TLS_ST_SW_SRVR_DONE:
        return WRITE_TRAN_FINISHED;

    case TLS_ST_SR_FINISHED:
        if (s->hit) {
M
Matt Caswell 已提交
578 579
            st->hand_state = TLS_ST_OK;
            return WRITE_TRAN_CONTINUE;
R
Rich Salz 已提交
580
        } else if (s->ext.ticket_expected) {
581 582 583 584 585 586 587 588 589
            st->hand_state = TLS_ST_SW_SESSION_TICKET;
        } else {
            st->hand_state = TLS_ST_SW_CHANGE;
        }
        return WRITE_TRAN_CONTINUE;

    case TLS_ST_SW_SESSION_TICKET:
        st->hand_state = TLS_ST_SW_CHANGE;
        return WRITE_TRAN_CONTINUE;
M
Matt Caswell 已提交
590

591 592 593 594 595 596 597 598 599 600
    case TLS_ST_SW_CHANGE:
        st->hand_state = TLS_ST_SW_FINISHED;
        return WRITE_TRAN_CONTINUE;

    case TLS_ST_SW_FINISHED:
        if (s->hit) {
            return WRITE_TRAN_FINISHED;
        }
        st->hand_state = TLS_ST_OK;
        return WRITE_TRAN_CONTINUE;
M
Matt Caswell 已提交
601 602 603 604 605 606 607
    }
}

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

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

M
Matt Caswell 已提交
617 618 619
    case TLS_ST_SW_HELLO_REQ:
        s->shutdown = 0;
        if (SSL_IS_DTLS(s))
620
            dtls1_clear_sent_buffer(s);
M
Matt Caswell 已提交
621 622 623 624 625
        break;

    case DTLS_ST_SW_HELLO_VERIFY_REQUEST:
        s->shutdown = 0;
        if (SSL_IS_DTLS(s)) {
626
            dtls1_clear_sent_buffer(s);
M
Matt Caswell 已提交
627 628 629 630 631 632 633 634
            /* We don't buffer this message so don't use the timer */
            st->use_timer = 0;
        }
        break;

    case TLS_ST_SW_SRVR_HELLO:
        if (SSL_IS_DTLS(s)) {
            /*
F
FdaSilvaYY 已提交
635
             * Messages we write from now on should be buffered and
M
Matt Caswell 已提交
636 637 638 639 640 641 642 643
             * retransmitted if necessary, so we need to use the timer now
             */
            st->use_timer = 1;
        }
        break;

    case TLS_ST_SW_SRVR_DONE:
#ifndef OPENSSL_NO_SCTP
644 645
        if (SSL_IS_DTLS(s) && BIO_dgram_is_sctp(SSL_get_wbio(s))) {
            /* Calls SSLfatal() as required */
M
Matt Caswell 已提交
646
            return dtls_wait_for_dry(s);
647
        }
M
Matt Caswell 已提交
648 649 650 651
#endif
        return WORK_FINISHED_CONTINUE;

    case TLS_ST_SW_SESSION_TICKET:
652 653 654 655 656
        if (SSL_IS_TLS13(s)) {
            /*
             * Actually this is the end of the handshake, but we're going
             * straight into writing the session ticket out. So we finish off
             * the handshake, but keep the various buffers active.
657
             *
658
             * Calls SSLfatal as required.
659 660 661
             */
            return tls_finish_handshake(s, wst, 0);
        } if (SSL_IS_DTLS(s)) {
M
Matt Caswell 已提交
662 663 664 665 666 667 668 669 670
            /*
             * We're into the last flight. We don't retransmit the last flight
             * unless we need to, so we don't use the timer
             */
            st->use_timer = 0;
        }
        break;

    case TLS_ST_SW_CHANGE:
671 672
        if (SSL_IS_TLS13(s))
            break;
M
Matt Caswell 已提交
673 674
        s->session->cipher = s->s3->tmp.new_cipher;
        if (!s->method->ssl3_enc->setup_key_block(s)) {
675
            /* SSLfatal() already called */
M
Matt Caswell 已提交
676 677 678 679 680 681 682 683 684 685 686 687 688
            return WORK_ERROR;
        }
        if (SSL_IS_DTLS(s)) {
            /*
             * We're into the last flight. We don't retransmit the last flight
             * unless we need to, so we don't use the timer. This might have
             * already been set to 0 if we sent a NewSessionTicket message,
             * but we'll set it again here in case we didn't.
             */
            st->use_timer = 0;
        }
        return WORK_FINISHED_CONTINUE;

689
    case TLS_ST_EARLY_DATA:
690 691 692 693
        if (s->early_data_state != SSL_EARLY_DATA_ACCEPTING)
            return WORK_FINISHED_CONTINUE;
        /* Fall through */

M
Matt Caswell 已提交
694
    case TLS_ST_OK:
695
        /* Calls SSLfatal() as required */
696
        return tls_finish_handshake(s, wst, 1);
M
Matt Caswell 已提交
697 698 699 700 701 702 703 704 705
    }

    return WORK_FINISHED_CONTINUE;
}

/*
 * Perform any work that needs to be done after sending a message from the
 * server to the client.
 */
706
WORK_STATE ossl_statem_server_post_work(SSL *s, WORK_STATE wst)
M
Matt Caswell 已提交
707
{
M
Matt Caswell 已提交
708
    OSSL_STATEM *st = &s->statem;
M
Matt Caswell 已提交
709 710 711

    s->init_num = 0;

712
    switch (st->hand_state) {
R
Rich Salz 已提交
713 714 715 716
    default:
        /* No post work to be done */
        break;

M
Matt Caswell 已提交
717 718 719
    case TLS_ST_SW_HELLO_REQ:
        if (statem_flush(s) != 1)
            return WORK_MORE_A;
720
        if (!ssl3_init_finished_mac(s)) {
721
            /* SSLfatal() already called */
722 723
            return WORK_ERROR;
        }
M
Matt Caswell 已提交
724 725 726 727 728 729
        break;

    case DTLS_ST_SW_HELLO_VERIFY_REQUEST:
        if (statem_flush(s) != 1)
            return WORK_MORE_A;
        /* HelloVerifyRequest resets Finished MAC */
730
        if (s->version != DTLS1_BAD_VER && !ssl3_init_finished_mac(s)) {
731
            /* SSLfatal() already called */
732 733
            return WORK_ERROR;
        }
M
Matt Caswell 已提交
734 735 736 737 738 739 740 741
        /*
         * The next message should be another ClientHello which we need to
         * treat like it was the first packet
         */
        s->first_packet = 1;
        break;

    case TLS_ST_SW_SRVR_HELLO:
742
        if (SSL_IS_TLS13(s) && s->hello_retry_request == SSL_HRR_PENDING) {
M
Matt Caswell 已提交
743 744
            if ((s->options & SSL_OP_ENABLE_MIDDLEBOX_COMPAT) == 0
                    && statem_flush(s) != 1)
M
Matt Caswell 已提交
745 746 747
                return WORK_MORE_A;
            break;
        }
M
Matt Caswell 已提交
748 749 750 751 752 753 754 755 756
#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 已提交
757 758
            memcpy(labelbuffer, DTLS1_SCTP_AUTH_LABEL,
                   sizeof(DTLS1_SCTP_AUTH_LABEL));
M
Matt Caswell 已提交
759 760

            if (SSL_export_keying_material(s, sctpauthkey,
E
Emilia Kasper 已提交
761 762 763
                                           sizeof(sctpauthkey), labelbuffer,
                                           sizeof(labelbuffer), NULL, 0,
                                           0) <= 0) {
764 765 766
                SSLfatal(s, SSL_AD_INTERNAL_ERROR,
                         SSL_F_OSSL_STATEM_SERVER_POST_WORK,
                         ERR_R_INTERNAL_ERROR);
M
Matt Caswell 已提交
767 768 769 770 771 772 773
                return WORK_ERROR;
            }

            BIO_ctrl(SSL_get_wbio(s), BIO_CTRL_DGRAM_SCTP_ADD_AUTH_KEY,
                     sizeof(sctpauthkey), sctpauthkey);
        }
#endif
774
        if (!SSL_IS_TLS13(s)
775 776
                || ((s->options & SSL_OP_ENABLE_MIDDLEBOX_COMPAT) != 0
                    && s->hello_retry_request != SSL_HRR_COMPLETE))
777 778 779 780
            break;
        /* Fall through */

    case TLS_ST_SW_CHANGE:
M
Matt Caswell 已提交
781 782 783
        if (s->hello_retry_request == SSL_HRR_PENDING) {
            if (!statem_flush(s))
                return WORK_MORE_A;
784
            break;
M
Matt Caswell 已提交
785
        }
786 787 788 789 790 791 792 793 794
        /*
         * TODO(TLS1.3): This actually causes a problem. We don't yet know
         * whether the next record we are going to receive is an unencrypted
         * alert, or an encrypted handshake message. We're going to need
         * something clever in the record layer for this.
         */
        if (SSL_IS_TLS13(s)) {
            if (!s->method->ssl3_enc->setup_key_block(s)
                || !s->method->ssl3_enc->change_cipher_state(s,
795 796
                        SSL3_CC_HANDSHAKE | SSL3_CHANGE_CIPHER_SERVER_WRITE)) {
                /* SSLfatal() already called */
797
                return WORK_ERROR;
798
            }
799 800 801

            if (s->ext.early_data != SSL_EARLY_DATA_ACCEPTED
                && !s->method->ssl3_enc->change_cipher_state(s,
802 803
                        SSL3_CC_HANDSHAKE |SSL3_CHANGE_CIPHER_SERVER_READ)) {
                /* SSLfatal() already called */
804
                return WORK_ERROR;
805
            }
806
            break;
807
        }
M
Matt Caswell 已提交
808 809 810 811 812 813 814 815 816 817 818 819

#ifndef OPENSSL_NO_SCTP
        if (SSL_IS_DTLS(s) && !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
        if (!s->method->ssl3_enc->change_cipher_state(s,
E
Emilia Kasper 已提交
820 821
                                                      SSL3_CHANGE_CIPHER_SERVER_WRITE))
        {
822
            /* SSLfatal() already called */
M
Matt Caswell 已提交
823 824 825 826 827 828 829 830 831 832 833 834 835 836 837 838 839 840 841 842 843 844 845 846 847
            return WORK_ERROR;
        }

        if (SSL_IS_DTLS(s))
            dtls1_reset_seq_numbers(s, SSL3_CC_WRITE);
        break;

    case TLS_ST_SW_SRVR_DONE:
        if (statem_flush(s) != 1)
            return WORK_MORE_A;
        break;

    case TLS_ST_SW_FINISHED:
        if (statem_flush(s) != 1)
            return WORK_MORE_A;
#ifndef OPENSSL_NO_SCTP
        if (SSL_IS_DTLS(s) && 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
848 849
        if (SSL_IS_TLS13(s)) {
            if (!s->method->ssl3_enc->generate_master_secret(s,
850
                        s->master_secret, s->handshake_secret, 0,
851 852 853
                        &s->session->master_key_length)
                || !s->method->ssl3_enc->change_cipher_state(s,
                        SSL3_CC_APPLICATION | SSL3_CHANGE_CIPHER_SERVER_WRITE))
854
            /* SSLfatal() already called */
855 856
            return WORK_ERROR;
        }
M
Matt Caswell 已提交
857
        break;
858

859
    case TLS_ST_SW_KEY_UPDATE:
860 861
        if (statem_flush(s) != 1)
            return WORK_MORE_A;
862 863
        if (!tls13_update_key(s, 1)) {
            /* SSLfatal() already called */
864
            return WORK_ERROR;
865
        }
866 867
        break;

868 869 870 871
    case TLS_ST_SW_SESSION_TICKET:
        if (SSL_IS_TLS13(s) && statem_flush(s) != 1)
            return WORK_MORE_A;
        break;
M
Matt Caswell 已提交
872 873 874 875 876 877
    }

    return WORK_FINISHED_CONTINUE;
}

/*
878 879
 * Get the message construction function and message type for sending from the
 * server
M
Matt Caswell 已提交
880 881 882 883 884
 *
 * Valid return values are:
 *   1: Success
 *   0: Error
 */
885
int ossl_statem_server_construct_message(SSL *s, WPACKET *pkt,
886
                                         confunc_f *confunc, int *mt)
M
Matt Caswell 已提交
887
{
M
Matt Caswell 已提交
888
    OSSL_STATEM *st = &s->statem;
M
Matt Caswell 已提交
889

890 891 892
    switch (st->hand_state) {
    default:
        /* Shouldn't happen */
893 894 895
        SSLfatal(s, SSL_AD_INTERNAL_ERROR,
                 SSL_F_OSSL_STATEM_SERVER_CONSTRUCT_MESSAGE,
                 SSL_R_BAD_HANDSHAKE_STATE);
896 897 898
        return 0;

    case TLS_ST_SW_CHANGE:
899
        if (SSL_IS_DTLS(s))
900
            *confunc = dtls_construct_change_cipher_spec;
901
        else
902 903
            *confunc = tls_construct_change_cipher_spec;
        *mt = SSL3_MT_CHANGE_CIPHER_SPEC;
904
        break;
R
Rich Salz 已提交
905

906
    case DTLS_ST_SW_HELLO_VERIFY_REQUEST:
907 908
        *confunc = dtls_construct_hello_verify_request;
        *mt = DTLS1_MT_HELLO_VERIFY_REQUEST;
909
        break;
M
Matt Caswell 已提交
910

911 912
    case TLS_ST_SW_HELLO_REQ:
        /* No construction function needed */
913 914
        *confunc = NULL;
        *mt = SSL3_MT_HELLO_REQUEST;
915
        break;
M
Matt Caswell 已提交
916

917
    case TLS_ST_SW_SRVR_HELLO:
918 919
        *confunc = tls_construct_server_hello;
        *mt = SSL3_MT_SERVER_HELLO;
920
        break;
M
Matt Caswell 已提交
921

922
    case TLS_ST_SW_CERT:
923 924
        *confunc = tls_construct_server_certificate;
        *mt = SSL3_MT_CERTIFICATE;
925
        break;
M
Matt Caswell 已提交
926

927 928 929 930 931 932
    case TLS_ST_SW_CERT_VRFY:
        *confunc = tls_construct_cert_verify;
        *mt = SSL3_MT_CERTIFICATE_VERIFY;
        break;


933
    case TLS_ST_SW_KEY_EXCH:
934 935
        *confunc = tls_construct_server_key_exchange;
        *mt = SSL3_MT_SERVER_KEY_EXCHANGE;
936
        break;
M
Matt Caswell 已提交
937

938
    case TLS_ST_SW_CERT_REQ:
939 940
        *confunc = tls_construct_certificate_request;
        *mt = SSL3_MT_CERTIFICATE_REQUEST;
941
        break;
M
Matt Caswell 已提交
942

943
    case TLS_ST_SW_SRVR_DONE:
944 945
        *confunc = tls_construct_server_done;
        *mt = SSL3_MT_SERVER_DONE;
946
        break;
M
Matt Caswell 已提交
947

948
    case TLS_ST_SW_SESSION_TICKET:
949 950
        *confunc = tls_construct_new_session_ticket;
        *mt = SSL3_MT_NEWSESSION_TICKET;
951
        break;
M
Matt Caswell 已提交
952

953
    case TLS_ST_SW_CERT_STATUS:
954 955
        *confunc = tls_construct_cert_status;
        *mt = SSL3_MT_CERTIFICATE_STATUS;
956
        break;
M
Matt Caswell 已提交
957

958
    case TLS_ST_SW_FINISHED:
959 960
        *confunc = tls_construct_finished;
        *mt = SSL3_MT_FINISHED;
961
        break;
M
Matt Caswell 已提交
962

963 964 965 966 967
    case TLS_ST_EARLY_DATA:
        *confunc = NULL;
        *mt = SSL3_MT_DUMMY;
        break;

M
Matt Caswell 已提交
968 969 970 971
    case TLS_ST_SW_ENCRYPTED_EXTENSIONS:
        *confunc = tls_construct_encrypted_extensions;
        *mt = SSL3_MT_ENCRYPTED_EXTENSIONS;
        break;
972

973 974 975 976
    case TLS_ST_SW_KEY_UPDATE:
        *confunc = tls_construct_key_update;
        *mt = SSL3_MT_KEY_UPDATE;
        break;
977
    }
M
Matt Caswell 已提交
978

979
    return 1;
M
Matt Caswell 已提交
980 981
}

982 983 984 985 986 987 988 989 990 991 992 993 994 995 996 997 998
/*
 * Maximum size (excluding the Handshake header) of a ClientHello message,
 * calculated as follows:
 *
 *  2 + # client_version
 *  32 + # only valid length for random
 *  1 + # length of session_id
 *  32 + # maximum size for session_id
 *  2 + # length of cipher suites
 *  2^16-2 + # maximum length of cipher suites array
 *  1 + # length of compression_methods
 *  2^8-1 + # maximum length of compression methods
 *  2 + # length of extensions
 *  2^16-1 # maximum length of extensions
 */
#define CLIENT_HELLO_MAX_LENGTH         131396

M
Matt Caswell 已提交
999 1000 1001 1002 1003 1004 1005
#define CLIENT_KEY_EXCH_MAX_LENGTH      2048
#define NEXT_PROTO_MAX_LENGTH           514

/*
 * Returns the maximum allowed length for the current message that we are
 * reading. Excludes the message header.
 */
1006
size_t ossl_statem_server_max_message_size(SSL *s)
M
Matt Caswell 已提交
1007
{
M
Matt Caswell 已提交
1008
    OSSL_STATEM *st = &s->statem;
M
Matt Caswell 已提交
1009

1010
    switch (st->hand_state) {
R
Rich Salz 已提交
1011 1012 1013 1014
    default:
        /* Shouldn't happen */
        return 0;

M
Matt Caswell 已提交
1015
    case TLS_ST_SR_CLNT_HELLO:
1016
        return CLIENT_HELLO_MAX_LENGTH;
M
Matt Caswell 已提交
1017

1018 1019 1020
    case TLS_ST_SR_END_OF_EARLY_DATA:
        return END_OF_EARLY_DATA_MAX_LENGTH;

M
Matt Caswell 已提交
1021 1022 1023 1024 1025 1026 1027 1028 1029 1030 1031 1032 1033 1034 1035 1036 1037 1038 1039
    case TLS_ST_SR_CERT:
        return s->max_cert_list;

    case TLS_ST_SR_KEY_EXCH:
        return CLIENT_KEY_EXCH_MAX_LENGTH;

    case TLS_ST_SR_CERT_VRFY:
        return SSL3_RT_MAX_PLAIN_LENGTH;

#ifndef OPENSSL_NO_NEXTPROTONEG
    case TLS_ST_SR_NEXT_PROTO:
        return NEXT_PROTO_MAX_LENGTH;
#endif

    case TLS_ST_SR_CHANGE:
        return CCS_MAX_LENGTH;

    case TLS_ST_SR_FINISHED:
        return FINISHED_MAX_LENGTH;
1040 1041 1042

    case TLS_ST_SR_KEY_UPDATE:
        return KEY_UPDATE_MAX_LENGTH;
M
Matt Caswell 已提交
1043 1044 1045 1046 1047 1048
    }
}

/*
 * Process a message that the server has received from the client.
 */
1049
MSG_PROCESS_RETURN ossl_statem_server_process_message(SSL *s, PACKET *pkt)
M
Matt Caswell 已提交
1050
{
M
Matt Caswell 已提交
1051
    OSSL_STATEM *st = &s->statem;
M
Matt Caswell 已提交
1052

1053
    switch (st->hand_state) {
R
Rich Salz 已提交
1054 1055
    default:
        /* Shouldn't happen */
1056 1057 1058
        SSLfatal(s, SSL_AD_INTERNAL_ERROR,
                 SSL_F_OSSL_STATEM_SERVER_PROCESS_MESSAGE,
                 ERR_R_INTERNAL_ERROR);
R
Rich Salz 已提交
1059 1060
        return MSG_PROCESS_ERROR;

M
Matt Caswell 已提交
1061 1062 1063
    case TLS_ST_SR_CLNT_HELLO:
        return tls_process_client_hello(s, pkt);

1064 1065 1066
    case TLS_ST_SR_END_OF_EARLY_DATA:
        return tls_process_end_of_early_data(s, pkt);

M
Matt Caswell 已提交
1067 1068 1069 1070 1071 1072 1073 1074 1075 1076 1077 1078 1079 1080 1081 1082 1083 1084 1085
    case TLS_ST_SR_CERT:
        return tls_process_client_certificate(s, pkt);

    case TLS_ST_SR_KEY_EXCH:
        return tls_process_client_key_exchange(s, pkt);

    case TLS_ST_SR_CERT_VRFY:
        return tls_process_cert_verify(s, pkt);

#ifndef OPENSSL_NO_NEXTPROTONEG
    case TLS_ST_SR_NEXT_PROTO:
        return tls_process_next_proto(s, pkt);
#endif

    case TLS_ST_SR_CHANGE:
        return tls_process_change_cipher_spec(s, pkt);

    case TLS_ST_SR_FINISHED:
        return tls_process_finished(s, pkt);
1086 1087 1088 1089

    case TLS_ST_SR_KEY_UPDATE:
        return tls_process_key_update(s, pkt);

M
Matt Caswell 已提交
1090 1091 1092 1093 1094 1095 1096
    }
}

/*
 * Perform any further processing required following the receipt of a message
 * from the client
 */
1097
WORK_STATE ossl_statem_server_post_process_message(SSL *s, WORK_STATE wst)
M
Matt Caswell 已提交
1098
{
M
Matt Caswell 已提交
1099
    OSSL_STATEM *st = &s->statem;
M
Matt Caswell 已提交
1100

1101
    switch (st->hand_state) {
R
Rich Salz 已提交
1102 1103
    default:
        /* Shouldn't happen */
1104 1105 1106
        SSLfatal(s, SSL_AD_INTERNAL_ERROR,
                 SSL_F_OSSL_STATEM_SERVER_POST_PROCESS_MESSAGE,
                 ERR_R_INTERNAL_ERROR);
R
Rich Salz 已提交
1107 1108
        return WORK_ERROR;

M
Matt Caswell 已提交
1109 1110 1111 1112 1113 1114
    case TLS_ST_SR_CLNT_HELLO:
        return tls_post_process_client_hello(s, wst);

    case TLS_ST_SR_KEY_EXCH:
        return tls_post_process_client_key_exchange(s, wst);
    }
1115
    return WORK_FINISHED_CONTINUE;
M
Matt Caswell 已提交
1116 1117
}

B
Ben Laurie 已提交
1118
#ifndef OPENSSL_NO_SRP
M
Matt Caswell 已提交
1119 1120
/* Returns 1 on success, 0 for retryable error, -1 for fatal error */
static int ssl_check_srp_ext_ClientHello(SSL *s)
1121
{
M
Matt Caswell 已提交
1122 1123
    int ret;
    int al = SSL_AD_UNRECOGNIZED_NAME;
1124 1125 1126 1127 1128 1129 1130 1131

    if ((s->s3->tmp.new_cipher->algorithm_mkey & SSL_kSRP) &&
        (s->srp_ctx.TLS_ext_srp_username_callback != NULL)) {
        if (s->srp_ctx.login == NULL) {
            /*
             * RFC 5054 says SHOULD reject, we do so if There is no srp
             * login name
             */
M
Matt Caswell 已提交
1132 1133 1134 1135
            SSLfatal(s, SSL_AD_UNKNOWN_PSK_IDENTITY,
                     SSL_F_SSL_CHECK_SRP_EXT_CLIENTHELLO,
                     SSL_R_PSK_IDENTITY_NOT_FOUND);
            return -1;
1136
        } else {
M
Matt Caswell 已提交
1137 1138 1139 1140 1141 1142 1143 1144 1145 1146
            ret = SSL_srp_server_param_with_username(s, &al);
            if (ret < 0)
                return 0;
            if (ret == SSL3_AL_FATAL) {
                SSLfatal(s, al, SSL_F_SSL_CHECK_SRP_EXT_CLIENTHELLO,
                         al == SSL_AD_UNKNOWN_PSK_IDENTITY
                         ? SSL_R_PSK_IDENTITY_NOT_FOUND
                         : SSL_R_CLIENTHELLO_TLSEXT);
                return -1;
            }
1147 1148
        }
    }
M
Matt Caswell 已提交
1149
    return 1;
1150
}
B
Ben Laurie 已提交
1151 1152
#endif

1153
int dtls_raw_hello_verify_request(WPACKET *pkt, unsigned char *cookie,
M
Matt Caswell 已提交
1154
                                  size_t cookie_len)
M
Matt Caswell 已提交
1155 1156
{
    /* Always use DTLS 1.0 version: see RFC 6347 */
1157 1158 1159
    if (!WPACKET_put_bytes_u16(pkt, DTLS1_VERSION)
            || !WPACKET_sub_memcpy_u8(pkt, cookie, cookie_len))
        return 0;
M
Matt Caswell 已提交
1160

1161
    return 1;
M
Matt Caswell 已提交
1162 1163
}

1164
int dtls_construct_hello_verify_request(SSL *s, WPACKET *pkt)
M
Matt Caswell 已提交
1165
{
M
Matt Caswell 已提交
1166
    unsigned int cookie_leni;
M
Matt Caswell 已提交
1167 1168
    if (s->ctx->app_gen_cookie_cb == NULL ||
        s->ctx->app_gen_cookie_cb(s, s->d1->cookie,
M
Matt Caswell 已提交
1169 1170
                                  &cookie_leni) == 0 ||
        cookie_leni > 255) {
1171 1172
        SSLfatal(s, SSL_AD_NO_ALERT, SSL_F_DTLS_CONSTRUCT_HELLO_VERIFY_REQUEST,
                 SSL_R_COOKIE_GEN_CALLBACK_FAILURE);
M
Matt Caswell 已提交
1173 1174
        return 0;
    }
M
Matt Caswell 已提交
1175
    s->d1->cookie_len = cookie_leni;
M
Matt Caswell 已提交
1176

1177 1178
    if (!dtls_raw_hello_verify_request(pkt, s->d1->cookie,
                                              s->d1->cookie_len)) {
1179 1180
        SSLfatal(s, SSL_AD_NO_ALERT, SSL_F_DTLS_CONSTRUCT_HELLO_VERIFY_REQUEST,
                 ERR_R_INTERNAL_ERROR);
1181 1182
        return 0;
    }
M
Matt Caswell 已提交
1183 1184 1185 1186

    return 1;
}

1187 1188 1189 1190 1191 1192 1193 1194
#ifndef OPENSSL_NO_EC
/*-
 * ssl_check_for_safari attempts to fingerprint Safari using OS X
 * SecureTransport using the TLS extension block in |hello|.
 * Safari, since 10.6, sends exactly these extensions, in this order:
 *   SNI,
 *   elliptic_curves
 *   ec_point_formats
1195
 *   signature_algorithms (for TLSv1.2 only)
1196 1197 1198 1199 1200 1201 1202 1203 1204 1205 1206 1207 1208 1209 1210 1211 1212 1213 1214 1215 1216 1217 1218 1219 1220 1221 1222 1223 1224 1225 1226 1227
 *
 * We wish to fingerprint Safari because they broke ECDHE-ECDSA support in 10.8,
 * but they advertise support. So enabling ECDHE-ECDSA ciphers breaks them.
 * Sadly we cannot differentiate 10.6, 10.7 and 10.8.4 (which work), from
 * 10.8..10.8.3 (which don't work).
 */
static void ssl_check_for_safari(SSL *s, const CLIENTHELLO_MSG *hello)
{
    static const unsigned char kSafariExtensionsBlock[] = {
        0x00, 0x0a,             /* elliptic_curves extension */
        0x00, 0x08,             /* 8 bytes */
        0x00, 0x06,             /* 6 bytes of curve ids */
        0x00, 0x17,             /* P-256 */
        0x00, 0x18,             /* P-384 */
        0x00, 0x19,             /* P-521 */

        0x00, 0x0b,             /* ec_point_formats */
        0x00, 0x02,             /* 2 bytes */
        0x01,                   /* 1 point format */
        0x00,                   /* uncompressed */
        /* The following is only present in TLS 1.2 */
        0x00, 0x0d,             /* signature_algorithms */
        0x00, 0x0c,             /* 12 bytes */
        0x00, 0x0a,             /* 10 bytes */
        0x05, 0x01,             /* SHA-384/RSA */
        0x04, 0x01,             /* SHA-256/RSA */
        0x02, 0x01,             /* SHA-1/RSA */
        0x04, 0x03,             /* SHA-256/ECDSA */
        0x02, 0x03,             /* SHA-1/ECDSA */
    };
    /* Length of the common prefix (first two extensions). */
    static const size_t kSafariCommonExtensionsLength = 18;
1228 1229 1230
    unsigned int type;
    PACKET sni, tmppkt;
    size_t ext_len;
1231 1232 1233 1234 1235 1236 1237

    tmppkt = hello->extensions;

    if (!PACKET_forward(&tmppkt, 2)
        || !PACKET_get_net_2(&tmppkt, &type)
        || !PACKET_get_length_prefixed_2(&tmppkt, &sni)) {
        return;
1238 1239
    }

1240 1241 1242 1243 1244 1245 1246 1247
    if (type != TLSEXT_TYPE_server_name)
        return;

    ext_len = TLS1_get_client_version(s) >= TLS1_2_VERSION ?
        sizeof(kSafariExtensionsBlock) : kSafariCommonExtensionsLength;

    s->s3->is_probably_safari = PACKET_equal(&tmppkt, kSafariExtensionsBlock,
                                             ext_len);
1248
}
1249
#endif                          /* !OPENSSL_NO_EC */
1250

M
Matt Caswell 已提交
1251
MSG_PROCESS_RETURN tls_process_client_hello(SSL *s, PACKET *pkt)
M
Matt Caswell 已提交
1252 1253
{
    /* |cookie| will only be initialized for DTLS. */
1254
    PACKET session_id, compression, extensions, cookie;
M
Matt Caswell 已提交
1255
    static const unsigned char null_compression = 0;
B
Benjamin Kaduk 已提交
1256
    CLIENTHELLO_MSG *clienthello;
M
Matt Caswell 已提交
1257

B
Benjamin Kaduk 已提交
1258 1259
    clienthello = OPENSSL_zalloc(sizeof(*clienthello));
    if (clienthello == NULL) {
1260 1261
        SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_TLS_PROCESS_CLIENT_HELLO,
                 ERR_R_INTERNAL_ERROR);
B
Benjamin Kaduk 已提交
1262 1263
        goto err;
    }
1264 1265
    /* Check if this is actually an unexpected renegotiation ClientHello */
    if (s->renegotiate == 0 && !SSL_IS_FIRST_HANDSHAKE(s)) {
T
Todd Short 已提交
1266 1267 1268 1269
        if ((s->options & SSL_OP_NO_RENEGOTIATION)) {
            ssl3_send_alert(s, SSL3_AL_WARNING, SSL_AD_NO_RENEGOTIATION);
            goto err;
        }
1270 1271 1272 1273
        s->renegotiate = 1;
        s->new_session = 1;
    }

1274
    /*
1275
     * First, parse the raw ClientHello data into the CLIENTHELLO_MSG structure.
1276
     */
B
Benjamin Kaduk 已提交
1277
    clienthello->isv2 = RECORD_LAYER_is_sslv2_record(&s->rlayer);
E
Emilia Kasper 已提交
1278
    PACKET_null_init(&cookie);
1279

B
Benjamin Kaduk 已提交
1280
    if (clienthello->isv2) {
M
Matt Caswell 已提交
1281
        unsigned int mt;
1282

1283 1284
        if (!SSL_IS_FIRST_HANDSHAKE(s)
                || s->hello_retry_request != SSL_HRR_NONE) {
1285 1286 1287
            SSLfatal(s, SSL_AD_UNEXPECTED_MESSAGE,
                     SSL_F_TLS_PROCESS_CLIENT_HELLO, SSL_R_UNEXPECTED_MESSAGE);
            goto err;
1288 1289
        }

1290 1291 1292 1293 1294 1295 1296 1297 1298 1299 1300 1301 1302 1303 1304
        /*-
         * An SSLv3/TLSv1 backwards-compatible CLIENT-HELLO in an SSLv2
         * header is sent directly on the wire, not wrapped as a TLS
         * record. Our record layer just processes the message length and passes
         * the rest right through. Its format is:
         * Byte  Content
         * 0-1   msg_length - decoded by the record layer
         * 2     msg_type - s->init_msg points here
         * 3-4   version
         * 5-6   cipher_spec_length
         * 7-8   session_id_length
         * 9-10  challenge_length
         * ...   ...
         */

1305
        if (!PACKET_get_1(pkt, &mt)
E
Emilia Kasper 已提交
1306
            || mt != SSL2_MT_CLIENT_HELLO) {
1307 1308 1309 1310 1311
            /*
             * Should never happen. We should have tested this in the record
             * layer in order to have determined that this is a SSLv2 record
             * in the first place
             */
1312 1313
            SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_TLS_PROCESS_CLIENT_HELLO,
                     ERR_R_INTERNAL_ERROR);
M
Matt Caswell 已提交
1314
            goto err;
1315 1316 1317
        }
    }

B
Benjamin Kaduk 已提交
1318
    if (!PACKET_get_net_2(pkt, &clienthello->legacy_version)) {
1319 1320
        SSLfatal(s, SSL_AD_DECODE_ERROR, SSL_F_TLS_PROCESS_CLIENT_HELLO,
                 SSL_R_LENGTH_TOO_SHORT);
1321
        goto err;
1322 1323
    }

1324
    /* Parse the message and load client random. */
B
Benjamin Kaduk 已提交
1325
    if (clienthello->isv2) {
1326 1327 1328
        /*
         * Handle an SSLv2 backwards compatible ClientHello
         * Note, this is only for SSLv3+ using the backward compatible format.
1329
         * Real SSLv2 is not supported, and is rejected below.
1330
         */
1331
        unsigned int ciphersuite_len, session_id_len, challenge_len;
1332
        PACKET challenge;
1333

1334
        if (!PACKET_get_net_2(pkt, &ciphersuite_len)
E
Emilia Kasper 已提交
1335 1336
            || !PACKET_get_net_2(pkt, &session_id_len)
            || !PACKET_get_net_2(pkt, &challenge_len)) {
1337 1338 1339
            SSLfatal(s, SSL_AD_DECODE_ERROR, SSL_F_TLS_PROCESS_CLIENT_HELLO,
                     SSL_R_RECORD_LENGTH_MISMATCH);
            goto err;
1340
        }
1341

1342
        if (session_id_len > SSL_MAX_SSL_SESSION_ID_LENGTH) {
1343 1344 1345
            SSLfatal(s, SSL_AD_ILLEGAL_PARAMETER,
                     SSL_F_TLS_PROCESS_CLIENT_HELLO, SSL_R_LENGTH_MISMATCH);
            goto err;
1346 1347
        }

B
Benjamin Kaduk 已提交
1348
        if (!PACKET_get_sub_packet(pkt, &clienthello->ciphersuites,
1349
                                   ciphersuite_len)
B
Benjamin Kaduk 已提交
1350
            || !PACKET_copy_bytes(pkt, clienthello->session_id, session_id_len)
1351
            || !PACKET_get_sub_packet(pkt, &challenge, challenge_len)
1352
            /* No extensions. */
1353
            || PACKET_remaining(pkt) != 0) {
1354 1355 1356
            SSLfatal(s, SSL_AD_DECODE_ERROR, SSL_F_TLS_PROCESS_CLIENT_HELLO,
                     SSL_R_RECORD_LENGTH_MISMATCH);
            goto err;
M
Matt Caswell 已提交
1357
        }
B
Benjamin Kaduk 已提交
1358
        clienthello->session_id_len = session_id_len;
M
Matt Caswell 已提交
1359

1360
        /* Load the client random and compression list. We use SSL3_RANDOM_SIZE
B
Benjamin Kaduk 已提交
1361
         * here rather than sizeof(clienthello->random) because that is the limit
1362
         * for SSLv3 and it is fixed. It won't change even if
B
Benjamin Kaduk 已提交
1363
         * sizeof(clienthello->random) does.
1364 1365 1366
         */
        challenge_len = challenge_len > SSL3_RANDOM_SIZE
                        ? SSL3_RANDOM_SIZE : challenge_len;
B
Benjamin Kaduk 已提交
1367
        memset(clienthello->random, 0, SSL3_RANDOM_SIZE);
1368
        if (!PACKET_copy_bytes(&challenge,
B
Benjamin Kaduk 已提交
1369
                               clienthello->random + SSL3_RANDOM_SIZE -
D
David Benjamin 已提交
1370 1371 1372
                               challenge_len, challenge_len)
            /* Advertise only null compression. */
            || !PACKET_buf_init(&compression, &null_compression, 1)) {
1373 1374 1375
            SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_TLS_PROCESS_CLIENT_HELLO,
                     ERR_R_INTERNAL_ERROR);
            goto err;
M
Matt Caswell 已提交
1376
        }
1377

B
Benjamin Kaduk 已提交
1378
        PACKET_null_init(&clienthello->extensions);
1379
    } else {
1380
        /* Regular ClientHello. */
B
Benjamin Kaduk 已提交
1381
        if (!PACKET_copy_bytes(pkt, clienthello->random, SSL3_RANDOM_SIZE)
1382
            || !PACKET_get_length_prefixed_1(pkt, &session_id)
B
Benjamin Kaduk 已提交
1383
            || !PACKET_copy_all(&session_id, clienthello->session_id,
1384
                    SSL_MAX_SSL_SESSION_ID_LENGTH,
B
Benjamin Kaduk 已提交
1385
                    &clienthello->session_id_len)) {
1386 1387 1388
            SSLfatal(s, SSL_AD_DECODE_ERROR, SSL_F_TLS_PROCESS_CLIENT_HELLO,
                     SSL_R_LENGTH_MISMATCH);
            goto err;
M
Matt Caswell 已提交
1389
        }
1390

1391
        if (SSL_IS_DTLS(s)) {
1392
            if (!PACKET_get_length_prefixed_1(pkt, &cookie)) {
1393 1394 1395
                SSLfatal(s, SSL_AD_DECODE_ERROR, SSL_F_TLS_PROCESS_CLIENT_HELLO,
                         SSL_R_LENGTH_MISMATCH);
                goto err;
1396
            }
B
Benjamin Kaduk 已提交
1397
            if (!PACKET_copy_all(&cookie, clienthello->dtls_cookie,
1398
                                 DTLS1_COOKIE_LENGTH,
B
Benjamin Kaduk 已提交
1399
                                 &clienthello->dtls_cookie_len)) {
1400 1401 1402
                SSLfatal(s, SSL_AD_INTERNAL_ERROR,
                         SSL_F_TLS_PROCESS_CLIENT_HELLO, ERR_R_INTERNAL_ERROR);
                goto err;
1403
            }
1404 1405 1406 1407 1408 1409
            /*
             * If we require cookies and this ClientHello doesn't contain one,
             * just return since we do not want to allocate any memory yet.
             * So check cookie length...
             */
            if (SSL_get_options(s) & SSL_OP_COOKIE_EXCHANGE) {
B
Benjamin Kaduk 已提交
1410
                if (clienthello->dtls_cookie_len == 0)
1411
                    return MSG_PROCESS_FINISHED_READING;
1412
            }
1413
        }
1414

B
Benjamin Kaduk 已提交
1415
        if (!PACKET_get_length_prefixed_2(pkt, &clienthello->ciphersuites)) {
1416 1417 1418
            SSLfatal(s, SSL_AD_DECODE_ERROR, SSL_F_TLS_PROCESS_CLIENT_HELLO,
                     SSL_R_LENGTH_MISMATCH);
            goto err;
1419 1420
        }

1421
        if (!PACKET_get_length_prefixed_1(pkt, &compression)) {
1422 1423 1424
            SSLfatal(s, SSL_AD_DECODE_ERROR, SSL_F_TLS_PROCESS_CLIENT_HELLO,
                     SSL_R_LENGTH_MISMATCH);
            goto err;
1425
        }
1426

1427
        /* Could be empty. */
1428
        if (PACKET_remaining(pkt) == 0) {
B
Benjamin Kaduk 已提交
1429
            PACKET_null_init(&clienthello->extensions);
1430
        } else {
1431 1432
            if (!PACKET_get_length_prefixed_2(pkt, &clienthello->extensions)
                    || PACKET_remaining(pkt) != 0) {
1433 1434 1435
                SSLfatal(s, SSL_AD_DECODE_ERROR, SSL_F_TLS_PROCESS_CLIENT_HELLO,
                         SSL_R_LENGTH_MISMATCH);
                goto err;
1436 1437 1438 1439
            }
        }
    }

B
Benjamin Kaduk 已提交
1440
    if (!PACKET_copy_all(&compression, clienthello->compressions,
1441
                         MAX_COMPRESSIONS_SIZE,
B
Benjamin Kaduk 已提交
1442
                         &clienthello->compressions_len)) {
1443 1444 1445
        SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_TLS_PROCESS_CLIENT_HELLO,
                 ERR_R_INTERNAL_ERROR);
        goto err;
1446 1447
    }

1448
    /* Preserve the raw extensions PACKET for later use */
B
Benjamin Kaduk 已提交
1449
    extensions = clienthello->extensions;
1450
    if (!tls_collect_extensions(s, &extensions, SSL_EXT_CLIENT_HELLO,
1451
                                &clienthello->pre_proc_exts,
1452
                                &clienthello->pre_proc_exts_len, 1)) {
1453 1454
        /* SSLfatal already been called */
        goto err;
1455
    }
B
Benjamin Kaduk 已提交
1456
    s->clienthello = clienthello;
1457

B
Benjamin Kaduk 已提交
1458 1459
    return MSG_PROCESS_CONTINUE_PROCESSING;

1460
 err:
1461 1462
    if (clienthello != NULL)
        OPENSSL_free(clienthello->pre_proc_exts);
B
Benjamin Kaduk 已提交
1463 1464 1465 1466 1467
    OPENSSL_free(clienthello);

    return MSG_PROCESS_ERROR;
}

1468
static int tls_early_post_process_client_hello(SSL *s)
B
Benjamin Kaduk 已提交
1469 1470
{
    unsigned int j;
1471
    int i, al = SSL_AD_INTERNAL_ERROR;
B
Benjamin Kaduk 已提交
1472 1473 1474 1475 1476 1477 1478 1479 1480 1481
    int protverr;
    size_t loop;
    unsigned long id;
#ifndef OPENSSL_NO_COMP
    SSL_COMP *comp = NULL;
#endif
    const SSL_CIPHER *c;
    STACK_OF(SSL_CIPHER) *ciphers = NULL;
    STACK_OF(SSL_CIPHER) *scsvs = NULL;
    CLIENTHELLO_MSG *clienthello = s->clienthello;
1482
    DOWNGRADE dgrd = DOWNGRADE_NONE;
B
Benjamin Kaduk 已提交
1483

1484
    /* Finished parsing the ClientHello, now we can start processing it */
1485 1486 1487
    /* Give the ClientHello callback a crack at things */
    if (s->ctx->client_hello_cb != NULL) {
        /* A failure in the ClientHello callback terminates the connection. */
1488 1489 1490 1491
        switch (s->ctx->client_hello_cb(s, &al, s->ctx->client_hello_cb_arg)) {
        case SSL_CLIENT_HELLO_SUCCESS:
            break;
        case SSL_CLIENT_HELLO_RETRY:
1492
            s->rwstate = SSL_CLIENT_HELLO_CB;
1493 1494 1495
            return -1;
        case SSL_CLIENT_HELLO_ERROR:
        default:
1496 1497 1498
            SSLfatal(s, al,
                     SSL_F_TLS_EARLY_POST_PROCESS_CLIENT_HELLO,
                     SSL_R_CALLBACK_FAILED);
1499
            goto err;
B
Benjamin Kaduk 已提交
1500 1501
        }
    }
1502 1503

    /* Set up the client_random */
B
Benjamin Kaduk 已提交
1504
    memcpy(s->s3->client_random, clienthello->random, SSL3_RANDOM_SIZE);
1505 1506 1507

    /* Choose the version */

B
Benjamin Kaduk 已提交
1508 1509 1510
    if (clienthello->isv2) {
        if (clienthello->legacy_version == SSL2_VERSION
                || (clienthello->legacy_version & 0xff00)
1511 1512
                   != (SSL3_VERSION_MAJOR << 8)) {
            /*
1513
             * This is real SSLv2 or something completely unknown. We don't
1514 1515
             * support it.
             */
1516 1517 1518
            SSLfatal(s, SSL_AD_PROTOCOL_VERSION,
                     SSL_F_TLS_EARLY_POST_PROCESS_CLIENT_HELLO,
                     SSL_R_UNKNOWN_PROTOCOL);
1519 1520
            goto err;
        }
1521
        /* SSLv3/TLS */
B
Benjamin Kaduk 已提交
1522
        s->client_version = clienthello->legacy_version;
1523 1524 1525 1526 1527 1528
    }
    /*
     * Do SSL/TLS version negotiation if applicable. For DTLS we just check
     * versions are potentially compatible. Version negotiation comes later.
     */
    if (!SSL_IS_DTLS(s)) {
1529
        protverr = ssl_choose_server_version(s, clienthello, &dgrd);
1530
    } else if (s->method->version != DTLS_ANY_VERSION &&
B
Benjamin Kaduk 已提交
1531
               DTLS_VERSION_LT((int)clienthello->legacy_version, s->version)) {
1532 1533 1534 1535 1536 1537
        protverr = SSL_R_VERSION_TOO_LOW;
    } else {
        protverr = 0;
    }

    if (protverr) {
1538
        if (SSL_IS_FIRST_HANDSHAKE(s)) {
1539
            /* like ssl3_get_record, send alert using remote version number */
B
Benjamin Kaduk 已提交
1540
            s->version = s->client_version = clienthello->legacy_version;
1541
        }
1542 1543
        SSLfatal(s, SSL_AD_PROTOCOL_VERSION,
                 SSL_F_TLS_EARLY_POST_PROCESS_CLIENT_HELLO, protverr);
B
Benjamin Kaduk 已提交
1544
        goto err;
1545 1546
    }

M
Matt Caswell 已提交
1547
    /* TLSv1.3 specifies that a ClientHello must end on a record boundary */
1548
    if (SSL_IS_TLS13(s) && RECORD_LAYER_processed_read_pending(&s->rlayer)) {
1549 1550 1551
        SSLfatal(s, SSL_AD_UNEXPECTED_MESSAGE,
                 SSL_F_TLS_EARLY_POST_PROCESS_CLIENT_HELLO,
                 SSL_R_NOT_ON_RECORD_BOUNDARY);
1552 1553 1554
        goto err;
    }

1555 1556 1557 1558
    if (SSL_IS_DTLS(s)) {
        /* Empty cookie was already handled above by returning early. */
        if (SSL_get_options(s) & SSL_OP_COOKIE_EXCHANGE) {
            if (s->ctx->app_verify_cookie_cb != NULL) {
B
Benjamin Kaduk 已提交
1559 1560
                if (s->ctx->app_verify_cookie_cb(s, clienthello->dtls_cookie,
                        clienthello->dtls_cookie_len) == 0) {
1561 1562 1563
                    SSLfatal(s, SSL_AD_HANDSHAKE_FAILURE,
                             SSL_F_TLS_EARLY_POST_PROCESS_CLIENT_HELLO,
                             SSL_R_COOKIE_MISMATCH);
B
Benjamin Kaduk 已提交
1564
                    goto err;
1565 1566
                    /* else cookie verification succeeded */
                }
E
Emilia Kasper 已提交
1567
                /* default verification */
B
Benjamin Kaduk 已提交
1568 1569
            } else if (s->d1->cookie_len != clienthello->dtls_cookie_len
                    || memcmp(clienthello->dtls_cookie, s->d1->cookie,
1570
                              s->d1->cookie_len) != 0) {
1571 1572 1573
                SSLfatal(s, SSL_AD_HANDSHAKE_FAILURE,
                         SSL_F_TLS_EARLY_POST_PROCESS_CLIENT_HELLO,
                         SSL_R_COOKIE_MISMATCH);
B
Benjamin Kaduk 已提交
1574
                goto err;
1575 1576 1577 1578
            }
            s->d1->cookie_verified = 1;
        }
        if (s->method->version == DTLS_ANY_VERSION) {
1579
            protverr = ssl_choose_server_version(s, clienthello, &dgrd);
1580 1581
            if (protverr != 0) {
                s->version = s->client_version;
1582 1583
                SSLfatal(s, SSL_AD_PROTOCOL_VERSION,
                         SSL_F_TLS_EARLY_POST_PROCESS_CLIENT_HELLO, protverr);
B
Benjamin Kaduk 已提交
1584
                goto err;
1585 1586 1587 1588
            }
        }
    }

1589 1590
    s->hit = 0;

1591
    if (!ssl_cache_cipherlist(s, &clienthello->ciphersuites,
1592
                              clienthello->isv2) ||
1593
        !bytes_to_cipher_list(s, &clienthello->ciphersuites, &ciphers, &scsvs,
M
Matt Caswell 已提交
1594
                              clienthello->isv2, 1)) {
1595
        /* SSLfatal() already called */
1596 1597 1598 1599 1600 1601 1602 1603 1604 1605 1606
        goto err;
    }

    s->s3->send_connection_binding = 0;
    /* Check what signalling cipher-suite values were received. */
    if (scsvs != NULL) {
        for(i = 0; i < sk_SSL_CIPHER_num(scsvs); i++) {
            c = sk_SSL_CIPHER_value(scsvs, i);
            if (SSL_CIPHER_get_id(c) == SSL3_CK_SCSV) {
                if (s->renegotiate) {
                    /* SCSV is fatal if renegotiating */
1607 1608 1609
                    SSLfatal(s, SSL_AD_HANDSHAKE_FAILURE,
                             SSL_F_TLS_EARLY_POST_PROCESS_CLIENT_HELLO,
                             SSL_R_SCSV_RECEIVED_WHEN_RENEGOTIATING);
1610 1611 1612 1613 1614 1615 1616 1617 1618 1619 1620 1621
                    goto err;
                }
                s->s3->send_connection_binding = 1;
            } else if (SSL_CIPHER_get_id(c) == SSL3_CK_FALLBACK_SCSV &&
                       !ssl_check_version_downgrade(s)) {
                /*
                 * This SCSV indicates that the client previously tried
                 * a higher version.  We should fail if the current version
                 * is an unexpected downgrade, as that indicates that the first
                 * connection may have been tampered with in order to trigger
                 * an insecure downgrade.
                 */
1622 1623 1624
                SSLfatal(s, SSL_AD_INAPPROPRIATE_FALLBACK,
                         SSL_F_TLS_EARLY_POST_PROCESS_CLIENT_HELLO,
                         SSL_R_INAPPROPRIATE_FALLBACK);
1625 1626 1627 1628 1629 1630 1631 1632 1633 1634 1635
                goto err;
            }
        }
    }

    /* For TLSv1.3 we must select the ciphersuite *before* session resumption */
    if (SSL_IS_TLS13(s)) {
        const SSL_CIPHER *cipher =
            ssl3_choose_cipher(s, ciphers, SSL_get_ciphers(s));

        if (cipher == NULL) {
1636 1637 1638
            SSLfatal(s, SSL_AD_HANDSHAKE_FAILURE,
                     SSL_F_TLS_EARLY_POST_PROCESS_CLIENT_HELLO,
                     SSL_R_NO_SHARED_CIPHER);
1639 1640
            goto err;
        }
1641
        if (s->hello_retry_request == SSL_HRR_PENDING
1642 1643
                && (s->s3->tmp.new_cipher == NULL
                    || s->s3->tmp.new_cipher->id != cipher->id)) {
1644 1645 1646 1647
            /*
             * A previous HRR picked a different ciphersuite to the one we
             * just selected. Something must have changed.
             */
1648 1649 1650
            SSLfatal(s, SSL_AD_ILLEGAL_PARAMETER,
                     SSL_F_TLS_EARLY_POST_PROCESS_CLIENT_HELLO,
                     SSL_R_BAD_CIPHER);
1651 1652 1653 1654 1655
            goto err;
        }
        s->s3->tmp.new_cipher = cipher;
    }

1656
    /* We need to do this before getting the session */
1657
    if (!tls_parse_extension(s, TLSEXT_IDX_extended_master_secret,
1658
                             SSL_EXT_CLIENT_HELLO,
1659 1660
                             clienthello->pre_proc_exts, NULL, 0)) {
        /* SSLfatal() already called */
B
Benjamin Kaduk 已提交
1661
        goto err;
1662 1663
    }

1664 1665 1666 1667 1668 1669 1670 1671 1672 1673 1674 1675 1676 1677 1678 1679
    /*
     * We don't allow resumption in a backwards compatible ClientHello.
     * TODO(openssl-team): in TLS1.1+, session_id MUST be empty.
     *
     * Versions before 0.9.7 always allow clients to resume sessions in
     * renegotiation. 0.9.7 and later allow this by default, but optionally
     * ignore resumption requests with flag
     * SSL_OP_NO_SESSION_RESUMPTION_ON_RENEGOTIATION (it's a new flag rather
     * than a change to default behavior so that applications relying on
     * this for security won't even compile against older library versions).
     * 1.0.1 and later also have a function SSL_renegotiate_abbreviated() to
     * request renegotiation but not a new session (s->new_session remains
     * unset): for servers, this essentially just means that the
     * SSL_OP_NO_SESSION_RESUMPTION_ON_RENEGOTIATION setting will be
     * ignored.
     */
B
Benjamin Kaduk 已提交
1680
    if (clienthello->isv2 ||
1681 1682
        (s->new_session &&
         (s->options & SSL_OP_NO_SESSION_RESUMPTION_ON_RENEGOTIATION))) {
1683 1684
        if (!ssl_get_new_session(s, 1)) {
            /* SSLfatal() already called */
1685
            goto err;
1686
        }
1687
    } else {
1688
        i = ssl_get_prev_session(s, clienthello);
1689
        if (i == 1) {
1690 1691 1692
            /* previous session */
            s->hit = 1;
        } else if (i == -1) {
1693
            /* SSLfatal() already called */
B
Benjamin Kaduk 已提交
1694
            goto err;
1695
        } else {
1696
            /* i == 0 */
1697 1698
            if (!ssl_get_new_session(s, 1)) {
                /* SSLfatal() already called */
1699
                goto err;
1700
            }
1701
        }
1702
    }
1703

1704 1705 1706 1707 1708 1709
    if (SSL_IS_TLS13(s)) {
        memcpy(s->tmp_session_id, s->clienthello->session_id,
               s->clienthello->session_id_len);
        s->tmp_session_id_len = s->clienthello->session_id_len;
    }

1710
    /*
1711 1712
     * If it is a hit, check that the cipher is in the list. In TLSv1.3 we check
     * ciphersuite compatibility with the session as part of resumption.
1713 1714
     */
    if (!SSL_IS_TLS13(s) && s->hit) {
1715 1716
        j = 0;
        id = s->session->cipher->id;
1717

1718
#ifdef CIPHER_DEBUG
E
Emilia Kasper 已提交
1719
        fprintf(stderr, "client sent %d ciphers\n", sk_SSL_CIPHER_num(ciphers));
1720
#endif
1721 1722
        for (i = 0; i < sk_SSL_CIPHER_num(ciphers); i++) {
            c = sk_SSL_CIPHER_value(ciphers, i);
1723
#ifdef CIPHER_DEBUG
1724 1725
            fprintf(stderr, "client [%2d of %2d]:%s\n",
                    i, sk_SSL_CIPHER_num(ciphers), SSL_CIPHER_get_name(c));
1726
#endif
1727 1728 1729
            if (c->id == id) {
                j = 1;
                break;
1730
            }
1731
        }
1732
        if (j == 0) {
1733
            /*
1734 1735
             * we need to have the cipher in the cipher list if we are asked
             * to reuse it
1736
             */
1737 1738 1739
            SSLfatal(s, SSL_AD_ILLEGAL_PARAMETER,
                     SSL_F_TLS_EARLY_POST_PROCESS_CLIENT_HELLO,
                     SSL_R_REQUIRED_CIPHER_MISSING);
B
Benjamin Kaduk 已提交
1740
            goto err;
1741
        }
1742
    }
M
Matt Caswell 已提交
1743

B
Benjamin Kaduk 已提交
1744 1745
    for (loop = 0; loop < clienthello->compressions_len; loop++) {
        if (clienthello->compressions[loop] == 0)
1746
            break;
1747
    }
1748

B
Benjamin Kaduk 已提交
1749
    if (loop >= clienthello->compressions_len) {
1750
        /* no compress */
1751 1752 1753
        SSLfatal(s, SSL_AD_DECODE_ERROR,
                 SSL_F_TLS_EARLY_POST_PROCESS_CLIENT_HELLO,
                 SSL_R_NO_COMPRESSION_SPECIFIED);
B
Benjamin Kaduk 已提交
1754
        goto err;
1755
    }
1756

1757 1758
#ifndef OPENSSL_NO_EC
    if (s->options & SSL_OP_SAFARI_ECDHE_ECDSA_BUG)
B
Benjamin Kaduk 已提交
1759
        ssl_check_for_safari(s, clienthello);
1760 1761
#endif                          /* !OPENSSL_NO_EC */

1762
    /* TLS extensions */
1763
    if (!tls_parse_all_extensions(s, SSL_EXT_CLIENT_HELLO,
1764 1765
                                  clienthello->pre_proc_exts, NULL, 0, 1)) {
        /* SSLfatal() already called */
B
Benjamin Kaduk 已提交
1766
        goto err;
1767 1768 1769 1770 1771 1772 1773 1774 1775 1776 1777
    }

    /*
     * Check if we want to use external pre-shared secret for this handshake
     * for not reused session only. We need to generate server_random before
     * calling tls_session_secret_cb in order to allow SessionTicket
     * processing to use it in key derivation.
     */
    {
        unsigned char *pos;
        pos = s->s3->server_random;
1778
        if (ssl_fill_hello_random(s, 1, pos, SSL3_RANDOM_SIZE, dgrd) <= 0) {
1779 1780 1781
            SSLfatal(s, SSL_AD_INTERNAL_ERROR,
                     SSL_F_TLS_EARLY_POST_PROCESS_CLIENT_HELLO,
                     ERR_R_INTERNAL_ERROR);
B
Benjamin Kaduk 已提交
1782
            goto err;
1783 1784 1785
        }
    }

1786 1787 1788 1789 1790
    if (!s->hit
            && s->version >= TLS1_VERSION
            && !SSL_IS_TLS13(s)
            && !SSL_IS_DTLS(s)
            && s->ext.session_secret_cb) {
1791
        const SSL_CIPHER *pref_cipher = NULL;
1792 1793 1794 1795 1796
        /*
         * s->session->master_key_length is a size_t, but this is an int for
         * backwards compat reasons
         */
        int master_key_length;
1797

1798
        master_key_length = sizeof(s->session->master_key);
R
Rich Salz 已提交
1799
        if (s->ext.session_secret_cb(s, s->session->master_key,
1800
                                     &master_key_length, ciphers,
1801
                                     &pref_cipher,
R
Rich Salz 已提交
1802
                                     s->ext.session_secret_cb_arg)
1803 1804
                && master_key_length > 0) {
            s->session->master_key_length = master_key_length;
1805 1806 1807 1808 1809 1810 1811
            s->hit = 1;
            s->session->ciphers = ciphers;
            s->session->verify_result = X509_V_OK;

            ciphers = NULL;

            /* check if some cipher was preferred by call back */
D
Dr. Stephen Henson 已提交
1812 1813 1814
            if (pref_cipher == NULL)
                pref_cipher = ssl3_choose_cipher(s, s->session->ciphers,
                                                 SSL_get_ciphers(s));
1815
            if (pref_cipher == NULL) {
1816 1817 1818
                SSLfatal(s, SSL_AD_HANDSHAKE_FAILURE,
                         SSL_F_TLS_EARLY_POST_PROCESS_CLIENT_HELLO,
                         SSL_R_NO_SHARED_CIPHER);
B
Benjamin Kaduk 已提交
1819
                goto err;
1820 1821 1822
            }

            s->session->cipher = pref_cipher;
R
Rich Salz 已提交
1823
            sk_SSL_CIPHER_free(s->cipher_list);
1824
            s->cipher_list = sk_SSL_CIPHER_dup(s->session->ciphers);
R
Rich Salz 已提交
1825
            sk_SSL_CIPHER_free(s->cipher_list_by_id);
1826 1827 1828
            s->cipher_list_by_id = sk_SSL_CIPHER_dup(s->session->ciphers);
        }
    }
1829

1830 1831
    /*
     * Worst case, we will use the NULL compression, but if we have other
1832
     * options, we will now look for them.  We have complen-1 compression
1833 1834 1835
     * algorithms from the client, starting at q.
     */
    s->s3->tmp.new_compression = NULL;
1836 1837 1838 1839 1840 1841 1842
    if (SSL_IS_TLS13(s)) {
        /*
         * We already checked above that the NULL compression method appears in
         * the list. Now we check there aren't any others (which is illegal in
         * a TLSv1.3 ClientHello.
         */
        if (clienthello->compressions_len != 1) {
1843 1844 1845
            SSLfatal(s, SSL_AD_ILLEGAL_PARAMETER,
                     SSL_F_TLS_EARLY_POST_PROCESS_CLIENT_HELLO,
                     SSL_R_INVALID_COMPRESSION_ALGORITHM);
1846 1847 1848
            goto err;
        }
    }
1849
#ifndef OPENSSL_NO_COMP
1850
    /* This only happens if we have a cache hit */
1851
    else if (s->session->compress_meth != 0) {
1852
        int m, comp_id = s->session->compress_meth;
M
Matt Caswell 已提交
1853
        unsigned int k;
1854 1855 1856
        /* Perform sanity checks on resumed compression algorithm */
        /* Can't disable compression */
        if (!ssl_allow_compression(s)) {
1857 1858 1859
            SSLfatal(s, SSL_AD_HANDSHAKE_FAILURE,
                     SSL_F_TLS_EARLY_POST_PROCESS_CLIENT_HELLO,
                     SSL_R_INCONSISTENT_COMPRESSION);
B
Benjamin Kaduk 已提交
1860
            goto err;
1861 1862 1863 1864 1865 1866 1867 1868 1869 1870
        }
        /* Look for resumed compression method */
        for (m = 0; m < sk_SSL_COMP_num(s->ctx->comp_methods); m++) {
            comp = sk_SSL_COMP_value(s->ctx->comp_methods, m);
            if (comp_id == comp->id) {
                s->s3->tmp.new_compression = comp;
                break;
            }
        }
        if (s->s3->tmp.new_compression == NULL) {
1871 1872 1873
            SSLfatal(s, SSL_AD_HANDSHAKE_FAILURE,
                     SSL_F_TLS_EARLY_POST_PROCESS_CLIENT_HELLO,
                     SSL_R_INVALID_COMPRESSION_ALGORITHM);
B
Benjamin Kaduk 已提交
1874
            goto err;
1875 1876
        }
        /* Look for resumed method in compression list */
B
Benjamin Kaduk 已提交
1877 1878
        for (k = 0; k < clienthello->compressions_len; k++) {
            if (clienthello->compressions[k] == comp_id)
1879 1880
                break;
        }
B
Benjamin Kaduk 已提交
1881
        if (k >= clienthello->compressions_len) {
1882 1883 1884
            SSLfatal(s, SSL_AD_ILLEGAL_PARAMETER,
                     SSL_F_TLS_EARLY_POST_PROCESS_CLIENT_HELLO,
                     SSL_R_REQUIRED_COMPRESSION_ALGORITHM_MISSING);
B
Benjamin Kaduk 已提交
1885
            goto err;
1886
        }
1887
    } else if (s->hit) {
1888
        comp = NULL;
1889
    } else if (ssl_allow_compression(s) && s->ctx->comp_methods) {
1890
        /* See if we have a match */
M
Matt Caswell 已提交
1891 1892
        int m, nn, v, done = 0;
        unsigned int o;
1893 1894 1895 1896 1897

        nn = sk_SSL_COMP_num(s->ctx->comp_methods);
        for (m = 0; m < nn; m++) {
            comp = sk_SSL_COMP_value(s->ctx->comp_methods, m);
            v = comp->id;
B
Benjamin Kaduk 已提交
1898 1899
            for (o = 0; o < clienthello->compressions_len; o++) {
                if (v == clienthello->compressions[o]) {
1900 1901 1902 1903 1904 1905 1906 1907 1908 1909 1910 1911
                    done = 1;
                    break;
                }
            }
            if (done)
                break;
        }
        if (done)
            s->s3->tmp.new_compression = comp;
        else
            comp = NULL;
    }
1912
#else
1913 1914 1915 1916 1917
    /*
     * If compression is disabled we'd better not try to resume a session
     * using compression.
     */
    if (s->session->compress_meth != 0) {
1918 1919 1920
        SSLfatal(s, SSL_AD_HANDSHAKE_FAILURE,
                 SSL_F_TLS_EARLY_POST_PROCESS_CLIENT_HELLO,
                 SSL_R_INCONSISTENT_COMPRESSION);
B
Benjamin Kaduk 已提交
1921
        goto err;
1922
    }
1923
#endif
1924

1925 1926 1927
    /*
     * Given s->session->ciphers and SSL_get_ciphers, we must pick a cipher
     */
1928

1929
    if (!s->hit || SSL_IS_TLS13(s)) {
R
Rich Salz 已提交
1930
        sk_SSL_CIPHER_free(s->session->ciphers);
1931 1932
        s->session->ciphers = ciphers;
        if (ciphers == NULL) {
1933 1934 1935
            SSLfatal(s, SSL_AD_INTERNAL_ERROR,
                     SSL_F_TLS_EARLY_POST_PROCESS_CLIENT_HELLO,
                     ERR_R_INTERNAL_ERROR);
B
Benjamin Kaduk 已提交
1936
            goto err;
1937 1938
        }
        ciphers = NULL;
1939 1940 1941 1942 1943 1944 1945 1946
    }

    if (!s->hit) {
#ifdef OPENSSL_NO_COMP
        s->session->compress_meth = 0;
#else
        s->session->compress_meth = (comp == NULL) ? 0 : comp->id;
#endif
1947
        if (!tls1_set_server_sigalgs(s)) {
1948
            /* SSLfatal() already called */
1949 1950
            goto err;
        }
M
Matt Caswell 已提交
1951 1952 1953
    }

    sk_SSL_CIPHER_free(ciphers);
B
Benjamin Kaduk 已提交
1954 1955 1956 1957 1958
    sk_SSL_CIPHER_free(scsvs);
    OPENSSL_free(clienthello->pre_proc_exts);
    OPENSSL_free(s->clienthello);
    s->clienthello = NULL;
    return 1;
M
Matt Caswell 已提交
1959 1960
 err:
    sk_SSL_CIPHER_free(ciphers);
B
Benjamin Kaduk 已提交
1961 1962 1963 1964
    sk_SSL_CIPHER_free(scsvs);
    OPENSSL_free(clienthello->pre_proc_exts);
    OPENSSL_free(s->clienthello);
    s->clienthello = NULL;
M
Matt Caswell 已提交
1965

B
Benjamin Kaduk 已提交
1966
    return 0;
M
Matt Caswell 已提交
1967 1968
}

1969 1970
/*
 * Call the status request callback if needed. Upon success, returns 1.
1971
 * Upon failure, returns 0.
1972
 */
1973
static int tls_handle_status_request(SSL *s)
1974
{
R
Rich Salz 已提交
1975
    s->ext.status_expected = 0;
1976 1977 1978 1979 1980 1981 1982

    /*
     * If status request then ask callback what to do. Note: this must be
     * called after servername callbacks in case the certificate has changed,
     * and must be called after the cipher has been chosen because this may
     * influence which certificate is sent
     */
R
Rich Salz 已提交
1983 1984
    if (s->ext.status_type != TLSEXT_STATUSTYPE_nothing && s->ctx != NULL
            && s->ctx->ext.status_cb != NULL) {
1985
        int ret;
1986

1987
        /* If no certificate can't return certificate status */
1988
        if (s->s3->tmp.cert != NULL) {
1989 1990 1991 1992
            /*
             * Set current certificate to one we will use so SSL_get_certificate
             * et al can pick it up.
             */
1993
            s->cert->key = s->s3->tmp.cert;
R
Rich Salz 已提交
1994
            ret = s->ctx->ext.status_cb(s, s->ctx->ext.status_arg);
1995 1996 1997
            switch (ret) {
                /* We don't want to send a status request response */
            case SSL_TLSEXT_ERR_NOACK:
R
Rich Salz 已提交
1998
                s->ext.status_expected = 0;
1999 2000 2001
                break;
                /* status request response should be sent */
            case SSL_TLSEXT_ERR_OK:
R
Rich Salz 已提交
2002 2003
                if (s->ext.ocsp.resp)
                    s->ext.status_expected = 1;
2004 2005 2006 2007
                break;
                /* something bad happened */
            case SSL_TLSEXT_ERR_ALERT_FATAL:
            default:
2008 2009 2010
                SSLfatal(s, SSL_AD_INTERNAL_ERROR,
                         SSL_F_TLS_HANDLE_STATUS_REQUEST,
                         SSL_R_CLIENTHELLO_TLSEXT);
2011 2012 2013 2014 2015 2016 2017 2018
                return 0;
            }
        }
    }

    return 1;
}

2019 2020
/*
 * Call the alpn_select callback if needed. Upon success, returns 1.
M
Matt Caswell 已提交
2021
 * Upon failure, returns 0.
2022
 */
2023
int tls_handle_alpn(SSL *s)
2024 2025 2026 2027 2028 2029 2030 2031 2032 2033 2034 2035 2036 2037
{
    const unsigned char *selected = NULL;
    unsigned char selected_len = 0;

    if (s->ctx->ext.alpn_select_cb != NULL && s->s3->alpn_proposed != NULL) {
        int r = s->ctx->ext.alpn_select_cb(s, &selected, &selected_len,
                                           s->s3->alpn_proposed,
                                           (unsigned int)s->s3->alpn_proposed_len,
                                           s->ctx->ext.alpn_select_cb_arg);

        if (r == SSL_TLSEXT_ERR_OK) {
            OPENSSL_free(s->s3->alpn_selected);
            s->s3->alpn_selected = OPENSSL_memdup(selected, selected_len);
            if (s->s3->alpn_selected == NULL) {
2038 2039
                SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_TLS_HANDLE_ALPN,
                         ERR_R_INTERNAL_ERROR);
2040 2041 2042 2043 2044 2045 2046
                return 0;
            }
            s->s3->alpn_selected_len = selected_len;
#ifndef OPENSSL_NO_NEXTPROTONEG
            /* ALPN takes precedence over NPN. */
            s->s3->npn_seen = 0;
#endif
2047

2048 2049
            /* Check ALPN is consistent with session */
            if (s->session->ext.alpn_selected == NULL
2050 2051
                        || selected_len != s->session->ext.alpn_selected_len
                        || memcmp(selected, s->session->ext.alpn_selected,
2052 2053
                                  selected_len) != 0) {
                /* Not consistent so can't be used for early_data */
2054 2055
                s->ext.early_data_ok = 0;

2056 2057 2058 2059 2060
                if (!s->hit) {
                    /* If a new session update it with the new ALPN value */
                    s->session->ext.alpn_selected = OPENSSL_memdup(selected,
                                                                   selected_len);
                    if (s->session->ext.alpn_selected == NULL) {
2061 2062 2063
                        SSLfatal(s, SSL_AD_INTERNAL_ERROR,
                                 SSL_F_TLS_HANDLE_ALPN,
                                 ERR_R_INTERNAL_ERROR);
2064 2065 2066 2067 2068 2069
                        return 0;
                    }
                    s->session->ext.alpn_selected_len = selected_len;
                }
            }

2070
            return 1;
2071
        } else if (r != SSL_TLSEXT_ERR_NOACK) {
2072 2073
            SSLfatal(s, SSL_AD_NO_APPLICATION_PROTOCOL, SSL_F_TLS_HANDLE_ALPN,
                     SSL_R_NO_APPLICATION_PROTOCOL);
2074 2075
            return 0;
        }
2076 2077 2078 2079
        /*
         * If r == SSL_TLSEXT_ERR_NOACK then behave as if no callback was
         * present.
         */
2080 2081
    }

2082 2083 2084
    /* Check ALPN is consistent with session */
    if (s->session->ext.alpn_selected != NULL) {
        /* Not consistent so can't be used for early_data */
2085
        s->ext.early_data_ok = 0;
2086
    }
2087

2088 2089 2090
    return 1;
}

M
Matt Caswell 已提交
2091
WORK_STATE tls_post_process_client_hello(SSL *s, WORK_STATE wst)
M
Matt Caswell 已提交
2092
{
2093
    const SSL_CIPHER *cipher;
M
Matt Caswell 已提交
2094 2095

    if (wst == WORK_MORE_A) {
2096
        int rv = tls_early_post_process_client_hello(s);
B
Benjamin Kaduk 已提交
2097
        if (rv == 0) {
2098 2099
            /* SSLfatal() was already called */
            goto err;
B
Benjamin Kaduk 已提交
2100 2101 2102 2103 2104 2105
        }
        if (rv < 0)
            return WORK_MORE_A;
        wst = WORK_MORE_B;
    }
    if (wst == WORK_MORE_B) {
2106
        if (!s->hit || SSL_IS_TLS13(s)) {
M
Matt Caswell 已提交
2107
            /* Let cert callback update server certificates if required */
2108
            if (!s->hit && s->cert->cert_cb != NULL) {
M
Matt Caswell 已提交
2109 2110
                int rv = s->cert->cert_cb(s, s->cert->cert_cb_arg);
                if (rv == 0) {
2111 2112 2113 2114
                    SSLfatal(s, SSL_AD_INTERNAL_ERROR,
                             SSL_F_TLS_POST_PROCESS_CLIENT_HELLO,
                             SSL_R_CERT_CB_ERROR);
                    goto err;
M
Matt Caswell 已提交
2115 2116 2117
                }
                if (rv < 0) {
                    s->rwstate = SSL_X509_LOOKUP;
B
Benjamin Kaduk 已提交
2118
                    return WORK_MORE_B;
M
Matt Caswell 已提交
2119 2120
                }
                s->rwstate = SSL_NOTHING;
2121
            }
M
Matt Caswell 已提交
2122

2123 2124 2125 2126 2127 2128
            /* In TLSv1.3 we selected the ciphersuite before resumption */
            if (!SSL_IS_TLS13(s)) {
                cipher =
                    ssl3_choose_cipher(s, s->session->ciphers, SSL_get_ciphers(s));

                if (cipher == NULL) {
2129 2130 2131 2132
                    SSLfatal(s, SSL_AD_HANDSHAKE_FAILURE,
                             SSL_F_TLS_POST_PROCESS_CLIENT_HELLO,
                             SSL_R_NO_SHARED_CIPHER);
                    goto err;
2133 2134
                }
                s->s3->tmp.new_cipher = cipher;
2135
            }
2136
            if (!s->hit) {
2137 2138 2139 2140
                if (!tls_choose_sigalg(s, 1)) {
                    /* SSLfatal already called */
                    goto err;
                }
2141 2142 2143
                /* check whether we should disable session resumption */
                if (s->not_resumable_session_cb != NULL)
                    s->session->not_resumable =
2144 2145 2146
                        s->not_resumable_session_cb(s,
                            ((s->s3->tmp.new_cipher->algorithm_mkey
                              & (SSL_kDHE | SSL_kECDHE)) != 0));
2147 2148 2149 2150
                if (s->session->not_resumable)
                    /* do not send a session ticket */
                    s->ext.ticket_expected = 0;
            }
M
Matt Caswell 已提交
2151 2152 2153
        } else {
            /* Session-id reuse */
            s->s3->tmp.new_cipher = s->session->cipher;
2154 2155
        }

M
Matt Caswell 已提交
2156 2157 2158
        /*-
         * we now have the following setup.
         * client_random
2159 2160
         * cipher_list          - our preferred list of ciphers
         * ciphers              - the clients preferred list of ciphers
M
Matt Caswell 已提交
2161 2162 2163 2164 2165 2166
         * compression          - basically ignored right now
         * ssl version is set   - sslv3
         * s->session           - The ssl session has been setup.
         * s->hit               - session reuse flag
         * s->s3->tmp.new_cipher- the new cipher to use.
         */
2167

2168 2169 2170 2171
        /*
         * Call status_request callback if needed. Has to be done after the
         * certificate callbacks etc above.
         */
2172 2173 2174
        if (!tls_handle_status_request(s)) {
            /* SSLfatal() already called */
            goto err;
M
Matt Caswell 已提交
2175
        }
2176 2177
        /*
         * Call alpn_select callback if needed.  Has to be done after SNI and
2178 2179 2180
         * cipher negotiation (HTTP/2 restricts permitted ciphers). In TLSv1.3
         * we already did this because cipher negotiation happens earlier, and
         * we must handle ALPN before we decide whether to accept early_data.
2181
         */
2182 2183 2184
        if (!SSL_IS_TLS13(s) && !tls_handle_alpn(s)) {
            /* SSLfatal() already called */
            goto err;
2185
        }
2186

B
Benjamin Kaduk 已提交
2187
        wst = WORK_MORE_C;
M
Matt Caswell 已提交
2188 2189
    }
#ifndef OPENSSL_NO_SRP
B
Benjamin Kaduk 已提交
2190
    if (wst == WORK_MORE_C) {
M
Matt Caswell 已提交
2191
        int ret;
M
Matt Caswell 已提交
2192
        if ((ret = ssl_check_srp_ext_ClientHello(s)) == 0) {
M
Matt Caswell 已提交
2193 2194 2195 2196
            /*
             * callback indicates further work to be done
             */
            s->rwstate = SSL_X509_LOOKUP;
B
Benjamin Kaduk 已提交
2197
            return WORK_MORE_C;
M
Matt Caswell 已提交
2198
        }
M
Matt Caswell 已提交
2199 2200
        if (ret < 0) {
            /* SSLfatal() already called */
2201
            goto err;
2202 2203
        }
    }
M
Matt Caswell 已提交
2204
#endif
2205

M
Matt Caswell 已提交
2206
    return WORK_FINISHED_STOP;
2207
 err:
M
Matt Caswell 已提交
2208 2209 2210
    return WORK_ERROR;
}

2211
int tls_construct_server_hello(SSL *s, WPACKET *pkt)
2212
{
2213
    int compm;
2214
    size_t sl, len;
2215
    int version;
2216
    unsigned char *session_id;
2217
    int usetls13 = SSL_IS_TLS13(s) || s->hello_retry_request == SSL_HRR_PENDING;
2218

M
Matt Caswell 已提交
2219
    version = usetls13 ? TLS1_2_VERSION : s->version;
2220
    if (!WPACKET_put_bytes_u16(pkt, version)
2221 2222 2223 2224
               /*
                * Random stuff. Filling of the server_random takes place in
                * tls_process_client_hello()
                */
M
Matt Caswell 已提交
2225
            || !WPACKET_memcpy(pkt,
2226
                               s->hello_retry_request == SSL_HRR_PENDING
M
Matt Caswell 已提交
2227 2228
                                   ? hrrrandom : s->s3->server_random,
                               SSL3_RANDOM_SIZE)) {
2229 2230 2231
        SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_TLS_CONSTRUCT_SERVER_HELLO,
                 ERR_R_INTERNAL_ERROR);
        return 0;
2232
    }
2233

M
Matt Caswell 已提交
2234 2235 2236 2237 2238 2239 2240 2241 2242 2243 2244 2245
    /*-
     * There are several cases for the session ID to send
     * back in the server hello:
     * - For session reuse from the session cache,
     *   we send back the old session ID.
     * - If stateless session reuse (using a session ticket)
     *   is successful, we send back the client's "session ID"
     *   (which doesn't actually identify the session).
     * - If it is a new session, we send back the new
     *   session ID.
     * - However, if we want the new session to be single-use,
     *   we send back a 0-length session ID.
2246 2247
     * - In TLSv1.3 we echo back the session id sent to us by the client
     *   regardless
M
Matt Caswell 已提交
2248 2249 2250 2251 2252 2253 2254 2255 2256
     * s->hit is non-zero in either case of session reuse,
     * so the following won't overwrite an ID that we're supposed
     * to send back.
     */
    if (s->session->not_resumable ||
        (!(s->ctx->session_cache_mode & SSL_SESS_CACHE_SERVER)
         && !s->hit))
        s->session->session_id_length = 0;

M
Matt Caswell 已提交
2257
    if (usetls13) {
2258 2259 2260 2261 2262 2263 2264
        sl = s->tmp_session_id_len;
        session_id = s->tmp_session_id;
    } else {
        sl = s->session->session_id_length;
        session_id = s->session->session_id;
    }

2265
    if (sl > sizeof(s->session->session_id)) {
2266 2267 2268
        SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_TLS_CONSTRUCT_SERVER_HELLO,
                 ERR_R_INTERNAL_ERROR);
        return 0;
M
Matt Caswell 已提交
2269
    }
2270

2271
    /* set up the compression method */
2272
#ifdef OPENSSL_NO_COMP
2273
    compm = 0;
2274
#else
M
Matt Caswell 已提交
2275
    if (usetls13 || s->s3->tmp.new_compression == NULL)
2276
        compm = 0;
M
Matt Caswell 已提交
2277
    else
2278
        compm = s->s3->tmp.new_compression->id;
2279
#endif
2280

M
Matt Caswell 已提交
2281
    if (!WPACKET_sub_memcpy_u8(pkt, session_id, sl)
2282
            || !s->method->put_cipher_by_char(s->s3->tmp.new_cipher, pkt, &len)
2283
            || !WPACKET_put_bytes_u8(pkt, compm)
2284
            || !tls_construct_extensions(s, pkt,
M
Matt Caswell 已提交
2285
                                         s->hello_retry_request
2286
                                            == SSL_HRR_PENDING
M
Matt Caswell 已提交
2287 2288 2289 2290
                                            ? SSL_EXT_TLS1_3_HELLO_RETRY_REQUEST
                                            : (SSL_IS_TLS13(s)
                                                ? SSL_EXT_TLS1_3_SERVER_HELLO
                                                : SSL_EXT_TLS1_2_SERVER_HELLO),
2291 2292 2293
                                         NULL, 0)) {
        /* SSLfatal() already called */
        return 0;
2294
    }
2295

2296
    if (s->hello_retry_request == SSL_HRR_PENDING) {
M
Matt Caswell 已提交
2297 2298 2299 2300 2301 2302 2303 2304 2305 2306 2307 2308 2309 2310 2311
        /* Ditch the session. We'll create a new one next time around */
        SSL_SESSION_free(s->session);
        s->session = NULL;
        s->hit = 0;

        /*
         * 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)) {
            /* SSLfatal() already called */
            return 0;
        }
    } else if (!(s->verify_mode & SSL_VERIFY_PEER)
                && !ssl3_digest_cached_records(s, 0)) {
2312 2313
        /* SSLfatal() already called */;
        return 0;
2314 2315
    }

M
Matt Caswell 已提交
2316
    return 1;
2317
}
2318

2319
int tls_construct_server_done(SSL *s, WPACKET *pkt)
M
Matt Caswell 已提交
2320 2321
{
    if (!s->s3->tmp.cert_request) {
2322
        if (!ssl3_digest_cached_records(s, 0)) {
2323
            /* SSLfatal() already called */
2324 2325
            return 0;
        }
M
Matt Caswell 已提交
2326 2327 2328 2329
    }
    return 1;
}

2330
int tls_construct_server_key_exchange(SSL *s, WPACKET *pkt)
2331
{
2332
#ifndef OPENSSL_NO_DH
2333
    EVP_PKEY *pkdh = NULL;
B
Bodo Möller 已提交
2334
#endif
2335
#ifndef OPENSSL_NO_EC
2336
    unsigned char *encodedPoint = NULL;
2337
    size_t encodedlen = 0;
2338
    int curve_id = 0;
2339
#endif
2340
    const SIGALG_LOOKUP *lu = s->s3->tmp.sigalg;
2341
    int i;
2342
    unsigned long type;
2343
    const BIGNUM *r[4];
2344
    EVP_MD_CTX *md_ctx = EVP_MD_CTX_new();
2345
    EVP_PKEY_CTX *pctx = NULL;
2346 2347
    size_t paramlen, paramoffset;

2348
    if (!WPACKET_get_total_written(pkt, &paramoffset)) {
2349 2350 2351
        SSLfatal(s, SSL_AD_INTERNAL_ERROR,
                 SSL_F_TLS_CONSTRUCT_SERVER_KEY_EXCHANGE, ERR_R_INTERNAL_ERROR);
        goto err;
2352
    }
2353

2354
    if (md_ctx == NULL) {
2355 2356 2357
        SSLfatal(s, SSL_AD_INTERNAL_ERROR,
                 SSL_F_TLS_CONSTRUCT_SERVER_KEY_EXCHANGE, ERR_R_MALLOC_FAILURE);
        goto err;
2358
    }
2359

M
Matt Caswell 已提交
2360 2361 2362
    type = s->s3->tmp.new_cipher->algorithm_mkey;

    r[0] = r[1] = r[2] = r[3] = NULL;
2363
#ifndef OPENSSL_NO_PSK
M
Matt Caswell 已提交
2364 2365 2366
    /* Plain PSK or RSAPSK nothing to do */
    if (type & (SSL_kPSK | SSL_kRSAPSK)) {
    } else
2367
#endif                          /* !OPENSSL_NO_PSK */
2368
#ifndef OPENSSL_NO_DH
M
Matt Caswell 已提交
2369
    if (type & (SSL_kDHE | SSL_kDHEPSK)) {
2370 2371
        CERT *cert = s->cert;

2372 2373 2374
        EVP_PKEY *pkdhp = NULL;
        DH *dh;

M
Matt Caswell 已提交
2375
        if (s->cert->dh_tmp_auto) {
2376 2377 2378 2379
            DH *dhp = ssl_get_auto_dh(s);
            pkdh = EVP_PKEY_new();
            if (pkdh == NULL || dhp == NULL) {
                DH_free(dhp);
2380 2381 2382 2383
                SSLfatal(s, SSL_AD_INTERNAL_ERROR,
                         SSL_F_TLS_CONSTRUCT_SERVER_KEY_EXCHANGE,
                         ERR_R_INTERNAL_ERROR);
                goto err;
2384
            }
2385 2386 2387 2388 2389 2390 2391 2392 2393
            EVP_PKEY_assign_DH(pkdh, dhp);
            pkdhp = pkdh;
        } else {
            pkdhp = cert->dh_tmp;
        }
        if ((pkdhp == NULL) && (s->cert->dh_tmp_cb != NULL)) {
            DH *dhp = s->cert->dh_tmp_cb(s, 0, 1024);
            pkdh = ssl_dh_to_pkey(dhp);
            if (pkdh == NULL) {
2394 2395 2396 2397
                SSLfatal(s, SSL_AD_INTERNAL_ERROR,
                         SSL_F_TLS_CONSTRUCT_SERVER_KEY_EXCHANGE,
                         ERR_R_INTERNAL_ERROR);
                goto err;
2398 2399 2400 2401
            }
            pkdhp = pkdh;
        }
        if (pkdhp == NULL) {
2402 2403 2404 2405
            SSLfatal(s, SSL_AD_INTERNAL_ERROR,
                     SSL_F_TLS_CONSTRUCT_SERVER_KEY_EXCHANGE,
                     SSL_R_MISSING_TMP_DH_KEY);
            goto err;
M
Matt Caswell 已提交
2406 2407
        }
        if (!ssl_security(s, SSL_SECOP_TMP_DH,
2408
                          EVP_PKEY_security_bits(pkdhp), 0, pkdhp)) {
2409 2410 2411 2412
            SSLfatal(s, SSL_AD_HANDSHAKE_FAILURE,
                     SSL_F_TLS_CONSTRUCT_SERVER_KEY_EXCHANGE,
                     SSL_R_DH_KEY_TOO_SMALL);
            goto err;
M
Matt Caswell 已提交
2413
        }
2414
        if (s->s3->tmp.pkey != NULL) {
2415 2416 2417
            SSLfatal(s, SSL_AD_INTERNAL_ERROR,
                     SSL_F_TLS_CONSTRUCT_SERVER_KEY_EXCHANGE,
                     ERR_R_INTERNAL_ERROR);
M
Matt Caswell 已提交
2418 2419
            goto err;
        }
2420

D
Dr. Stephen Henson 已提交
2421
        s->s3->tmp.pkey = ssl_generate_pkey(pkdhp);
2422
        if (s->s3->tmp.pkey == NULL) {
2423
            /* SSLfatal() already called */
2424
            goto err;
M
Matt Caswell 已提交
2425
        }
2426 2427 2428 2429 2430 2431

        dh = EVP_PKEY_get0_DH(s->s3->tmp.pkey);

        EVP_PKEY_free(pkdh);
        pkdh = NULL;

M
Matt Caswell 已提交
2432 2433
        DH_get0_pqg(dh, &r[0], NULL, &r[1]);
        DH_get0_key(dh, &r[2], NULL);
M
Matt Caswell 已提交
2434
    } else
2435
#endif
2436
#ifndef OPENSSL_NO_EC
M
Matt Caswell 已提交
2437 2438
    if (type & (SSL_kECDHE | SSL_kECDHEPSK)) {

D
Dr. Stephen Henson 已提交
2439
        if (s->s3->tmp.pkey != NULL) {
2440 2441 2442
            SSLfatal(s, SSL_AD_INTERNAL_ERROR,
                     SSL_F_TLS_CONSTRUCT_SERVER_KEY_EXCHANGE,
                     ERR_R_INTERNAL_ERROR);
M
Matt Caswell 已提交
2443 2444 2445
            goto err;
        }

2446
        /* Get NID of appropriate shared curve */
2447
        curve_id = tls1_shared_group(s, -2);
2448
        if (curve_id == 0) {
2449 2450 2451
            SSLfatal(s, SSL_AD_HANDSHAKE_FAILURE,
                     SSL_F_TLS_CONSTRUCT_SERVER_KEY_EXCHANGE,
                     SSL_R_UNSUPPORTED_ELLIPTIC_CURVE);
M
Matt Caswell 已提交
2452 2453
            goto err;
        }
2454
        s->s3->tmp.pkey = ssl_generate_pkey_group(s, curve_id);
D
Dr. Stephen Henson 已提交
2455 2456
        /* Generate a new key for this curve */
        if (s->s3->tmp.pkey == NULL) {
2457 2458
            /* SSLfatal() already called */
            goto err;
2459 2460
        }

D
Dr. Stephen Henson 已提交
2461
        /* Encode the public key. */
2462 2463
        encodedlen = EVP_PKEY_get1_tls_encodedpoint(s->s3->tmp.pkey,
                                                    &encodedPoint);
M
Matt Caswell 已提交
2464
        if (encodedlen == 0) {
2465 2466
            SSLfatal(s, SSL_AD_INTERNAL_ERROR,
                     SSL_F_TLS_CONSTRUCT_SERVER_KEY_EXCHANGE, ERR_R_EC_LIB);
M
Matt Caswell 已提交
2467 2468
            goto err;
        }
2469

M
Matt Caswell 已提交
2470 2471 2472 2473 2474 2475 2476 2477 2478
        /*
         * We'll generate the serverKeyExchange message explicitly so we
         * can set these to NULLs
         */
        r[0] = NULL;
        r[1] = NULL;
        r[2] = NULL;
        r[3] = NULL;
    } else
2479
#endif                          /* !OPENSSL_NO_EC */
B
Ben Laurie 已提交
2480
#ifndef OPENSSL_NO_SRP
M
Matt Caswell 已提交
2481 2482 2483 2484
    if (type & SSL_kSRP) {
        if ((s->srp_ctx.N == NULL) ||
            (s->srp_ctx.g == NULL) ||
            (s->srp_ctx.s == NULL) || (s->srp_ctx.B == NULL)) {
2485 2486 2487
            SSLfatal(s, SSL_AD_INTERNAL_ERROR,
                     SSL_F_TLS_CONSTRUCT_SERVER_KEY_EXCHANGE,
                     SSL_R_MISSING_SRP_PARAM);
M
Matt Caswell 已提交
2488
            goto err;
2489
        }
M
Matt Caswell 已提交
2490 2491 2492 2493 2494 2495 2496
        r[0] = s->srp_ctx.N;
        r[1] = s->srp_ctx.g;
        r[2] = s->srp_ctx.s;
        r[3] = s->srp_ctx.B;
    } else
#endif
    {
2497 2498 2499 2500
        SSLfatal(s, SSL_AD_INTERNAL_ERROR,
                 SSL_F_TLS_CONSTRUCT_SERVER_KEY_EXCHANGE,
                 SSL_R_UNKNOWN_KEY_EXCHANGE_TYPE);
        goto err;
M
Matt Caswell 已提交
2501
    }
2502

2503 2504 2505 2506
    if (((s->s3->tmp.new_cipher->algorithm_auth & (SSL_aNULL | SSL_aSRP)) != 0)
        || ((s->s3->tmp.new_cipher->algorithm_mkey & SSL_PSK)) != 0) {
        lu = NULL;
    } else if (lu == NULL) {
2507 2508 2509
        SSLfatal(s, SSL_AD_DECODE_ERROR,
                 SSL_F_TLS_CONSTRUCT_SERVER_KEY_EXCHANGE, ERR_R_INTERNAL_ERROR);
        goto err;
M
Matt Caswell 已提交
2510
    }
2511

2512
#ifndef OPENSSL_NO_PSK
M
Matt Caswell 已提交
2513
    if (type & SSL_PSK) {
2514 2515 2516 2517 2518 2519 2520 2521
        size_t len = (s->cert->psk_identity_hint == NULL)
                        ? 0 : strlen(s->cert->psk_identity_hint);

        /*
         * It should not happen that len > PSK_MAX_IDENTITY_LEN - we already
         * checked this when we set the identity hint - but just in case
         */
        if (len > PSK_MAX_IDENTITY_LEN
2522
                || !WPACKET_sub_memcpy_u16(pkt, s->cert->psk_identity_hint,
2523
                                           len)) {
2524 2525 2526 2527
            SSLfatal(s, SSL_AD_INTERNAL_ERROR,
                     SSL_F_TLS_CONSTRUCT_SERVER_KEY_EXCHANGE,
                     ERR_R_INTERNAL_ERROR);
            goto err;
2528
        }
M
Matt Caswell 已提交
2529
    }
2530 2531
#endif

M
Matt Caswell 已提交
2532
    for (i = 0; i < 4 && r[i] != NULL; i++) {
2533 2534 2535
        unsigned char *binval;
        int res;

B
Ben Laurie 已提交
2536
#ifndef OPENSSL_NO_SRP
M
Matt Caswell 已提交
2537
        if ((i == 2) && (type & SSL_kSRP)) {
2538
            res = WPACKET_start_sub_packet_u8(pkt);
M
Matt Caswell 已提交
2539
        } else
2540
#endif
2541
            res = WPACKET_start_sub_packet_u16(pkt);
2542 2543

        if (!res) {
2544 2545 2546 2547
            SSLfatal(s, SSL_AD_INTERNAL_ERROR,
                     SSL_F_TLS_CONSTRUCT_SERVER_KEY_EXCHANGE,
                     ERR_R_INTERNAL_ERROR);
            goto err;
2548 2549
        }

2550
#ifndef OPENSSL_NO_DH
E
Emilia Kasper 已提交
2551
        /*-
2552 2553 2554 2555 2556
         * for interoperability with some versions of the Microsoft TLS
         * stack, we need to zero pad the DHE pub key to the same length
         * as the prime
         */
        if ((i == 2) && (type & (SSL_kDHE | SSL_kDHEPSK))) {
2557
            size_t len = BN_num_bytes(r[0]) - BN_num_bytes(r[2]);
M
Matt Caswell 已提交
2558

2559
            if (len > 0) {
2560
                if (!WPACKET_allocate_bytes(pkt, len, &binval)) {
2561 2562 2563 2564
                    SSLfatal(s, SSL_AD_INTERNAL_ERROR,
                             SSL_F_TLS_CONSTRUCT_SERVER_KEY_EXCHANGE,
                             ERR_R_INTERNAL_ERROR);
                    goto err;
2565 2566
                }
                memset(binval, 0, len);
2567
            }
2568
        }
B
Ben Laurie 已提交
2569
#endif
2570 2571
        if (!WPACKET_allocate_bytes(pkt, BN_num_bytes(r[i]), &binval)
                || !WPACKET_close(pkt)) {
2572 2573 2574 2575
            SSLfatal(s, SSL_AD_INTERNAL_ERROR,
                     SSL_F_TLS_CONSTRUCT_SERVER_KEY_EXCHANGE,
                     ERR_R_INTERNAL_ERROR);
            goto err;
2576 2577 2578
        }

        BN_bn2bin(r[i], binval);
M
Matt Caswell 已提交
2579
    }
2580

2581
#ifndef OPENSSL_NO_EC
M
Matt Caswell 已提交
2582 2583
    if (type & (SSL_kECDHE | SSL_kECDHEPSK)) {
        /*
2584 2585 2586 2587
         * We only support named (not generic) curves. In this situation, the
         * ServerKeyExchange message has: [1 byte CurveType], [2 byte CurveName]
         * [1 byte length of encoded point], followed by the actual encoded
         * point itself
M
Matt Caswell 已提交
2588
         */
2589 2590 2591 2592
        if (!WPACKET_put_bytes_u8(pkt, NAMED_CURVE_TYPE)
                || !WPACKET_put_bytes_u8(pkt, 0)
                || !WPACKET_put_bytes_u8(pkt, curve_id)
                || !WPACKET_sub_memcpy_u8(pkt, encodedPoint, encodedlen)) {
2593 2594 2595 2596
            SSLfatal(s, SSL_AD_INTERNAL_ERROR,
                     SSL_F_TLS_CONSTRUCT_SERVER_KEY_EXCHANGE,
                     ERR_R_INTERNAL_ERROR);
            goto err;
2597
        }
M
Matt Caswell 已提交
2598 2599 2600
        OPENSSL_free(encodedPoint);
        encodedPoint = NULL;
    }
B
Bodo Möller 已提交
2601 2602
#endif

M
Matt Caswell 已提交
2603
    /* not anonymous */
2604
    if (lu != NULL) {
2605
        EVP_PKEY *pkey = s->s3->tmp.cert->privatekey;
2606 2607 2608 2609
        const EVP_MD *md;
        unsigned char *sigbytes1, *sigbytes2, *tbs;
        size_t siglen, tbslen;
        int rv;
2610

D
Dr. Stephen Henson 已提交
2611
        if (pkey == NULL || !tls1_lookup_md(lu, &md)) {
2612
            /* Should never happen */
2613 2614 2615 2616
            SSLfatal(s, SSL_AD_INTERNAL_ERROR,
                     SSL_F_TLS_CONSTRUCT_SERVER_KEY_EXCHANGE,
                     ERR_R_INTERNAL_ERROR);
            goto err;
2617 2618 2619
        }
        /* Get length of the parameters we have written above */
        if (!WPACKET_get_length(pkt, &paramlen)) {
2620 2621 2622 2623
            SSLfatal(s, SSL_AD_INTERNAL_ERROR,
                     SSL_F_TLS_CONSTRUCT_SERVER_KEY_EXCHANGE,
                     ERR_R_INTERNAL_ERROR);
            goto err;
2624 2625
        }
        /* send signature algorithm */
2626 2627 2628 2629 2630 2631
        if (SSL_USE_SIGALGS(s) && !WPACKET_put_bytes_u16(pkt, lu->sigalg)) {
            SSLfatal(s, SSL_AD_INTERNAL_ERROR,
                     SSL_F_TLS_CONSTRUCT_SERVER_KEY_EXCHANGE,
                     ERR_R_INTERNAL_ERROR);
            goto err;
        }
2632 2633 2634 2635 2636 2637 2638 2639 2640
        /*
         * Create the signature. We don't know the actual length of the sig
         * until after we've created it, so we reserve enough bytes for it
         * up front, and then properly allocate them in the WPACKET
         * afterwards.
         */
        siglen = EVP_PKEY_size(pkey);
        if (!WPACKET_sub_reserve_bytes_u16(pkt, siglen, &sigbytes1)
            || EVP_DigestSignInit(md_ctx, &pctx, md, NULL, pkey) <= 0) {
2641 2642 2643 2644
            SSLfatal(s, SSL_AD_INTERNAL_ERROR,
                     SSL_F_TLS_CONSTRUCT_SERVER_KEY_EXCHANGE,
                     ERR_R_INTERNAL_ERROR);
            goto err;
2645 2646 2647 2648
        }
        if (lu->sig == EVP_PKEY_RSA_PSS) {
            if (EVP_PKEY_CTX_set_rsa_padding(pctx, RSA_PKCS1_PSS_PADDING) <= 0
                || EVP_PKEY_CTX_set_rsa_pss_saltlen(pctx, RSA_PSS_SALTLEN_DIGEST) <= 0) {
2649 2650 2651 2652
                SSLfatal(s, SSL_AD_INTERNAL_ERROR,
                         SSL_F_TLS_CONSTRUCT_SERVER_KEY_EXCHANGE,
                        ERR_R_EVP_LIB);
                goto err;
2653
            }
2654
        }
2655 2656 2657 2658
        tbslen = construct_key_exchange_tbs(s, &tbs,
                                            s->init_buf->data + paramoffset,
                                            paramlen);
        if (tbslen == 0) {
2659 2660
            /* SSLfatal() already called */
            goto err;
2661 2662 2663 2664
        }
        rv = EVP_DigestSign(md_ctx, sigbytes1, &siglen, tbs, tbslen);
        OPENSSL_free(tbs);
        if (rv <= 0 || !WPACKET_sub_allocate_bytes_u16(pkt, siglen, &sigbytes2)
2665
            || sigbytes1 != sigbytes2) {
2666 2667 2668 2669
            SSLfatal(s, SSL_AD_INTERNAL_ERROR,
                     SSL_F_TLS_CONSTRUCT_SERVER_KEY_EXCHANGE,
                     ERR_R_INTERNAL_ERROR);
            goto err;
M
Matt Caswell 已提交
2670
        }
2671 2672
    }

2673
    EVP_MD_CTX_free(md_ctx);
M
Matt Caswell 已提交
2674
    return 1;
2675
 err:
2676 2677 2678
#ifndef OPENSSL_NO_DH
    EVP_PKEY_free(pkdh);
#endif
2679
#ifndef OPENSSL_NO_EC
R
Rich Salz 已提交
2680
    OPENSSL_free(encodedPoint);
B
Bodo Möller 已提交
2681
#endif
2682
    EVP_MD_CTX_free(md_ctx);
M
Matt Caswell 已提交
2683
    return 0;
2684
}
2685

2686
int tls_construct_certificate_request(SSL *s, WPACKET *pkt)
2687
{
2688 2689 2690
    if (SSL_IS_TLS13(s)) {
        /* TODO(TLS1.3) for now send empty request context */
        if (!WPACKET_put_bytes_u8(pkt, 0)) {
2691 2692 2693 2694
            SSLfatal(s, SSL_AD_INTERNAL_ERROR,
                     SSL_F_TLS_CONSTRUCT_CERTIFICATE_REQUEST,
                     ERR_R_INTERNAL_ERROR);
            return 0;
2695
        }
2696

2697 2698
        if (!tls_construct_extensions(s, pkt,
                                      SSL_EXT_TLS1_3_CERTIFICATE_REQUEST, NULL,
2699 2700 2701
                                      0)) {
            /* SSLfatal() already called */
            return 0;
2702
        }
2703 2704 2705 2706 2707 2708
        goto done;
    }

    /* get the list of acceptable cert types */
    if (!WPACKET_start_sub_packet_u8(pkt)
        || !ssl3_get_req_cert_type(s, pkt) || !WPACKET_close(pkt)) {
2709 2710 2711
        SSLfatal(s, SSL_AD_INTERNAL_ERROR,
                 SSL_F_TLS_CONSTRUCT_CERTIFICATE_REQUEST, ERR_R_INTERNAL_ERROR);
        return 0;
2712
    }
2713

M
Matt Caswell 已提交
2714
    if (SSL_USE_SIGALGS(s)) {
2715
        const uint16_t *psigs;
2716
        size_t nl = tls12_get_psigalgs(s, 1, &psigs);
2717

2718
        if (!WPACKET_start_sub_packet_u16(pkt)
2719
                || !WPACKET_set_flags(pkt, WPACKET_FLAGS_NON_ZERO_LENGTH)
2720 2721
                || !tls12_copy_sigalgs(s, pkt, psigs, nl)
                || !WPACKET_close(pkt)) {
2722 2723 2724 2725
            SSLfatal(s, SSL_AD_INTERNAL_ERROR,
                     SSL_F_TLS_CONSTRUCT_CERTIFICATE_REQUEST,
                     ERR_R_INTERNAL_ERROR);
            return 0;
2726
        }
M
Matt Caswell 已提交
2727
    }
2728

2729
    if (!construct_ca_names(s, pkt)) {
2730 2731
        /* SSLfatal() already called */
        return 0;
2732
    }
M
Matt Caswell 已提交
2733

2734
 done:
M
Matt Caswell 已提交
2735 2736
    s->s3->tmp.cert_request = 1;
    return 1;
2737
}
2738

2739
static int tls_process_cke_psk_preamble(SSL *s, PACKET *pkt)
M
Matt Caswell 已提交
2740
{
2741
#ifndef OPENSSL_NO_PSK
2742 2743 2744
    unsigned char psk[PSK_MAX_PSK_LEN];
    size_t psklen;
    PACKET psk_identity;
2745

2746
    if (!PACKET_get_length_prefixed_2(pkt, &psk_identity)) {
2747 2748
        SSLfatal(s, SSL_AD_DECODE_ERROR, SSL_F_TLS_PROCESS_CKE_PSK_PREAMBLE,
                 SSL_R_LENGTH_MISMATCH);
2749 2750 2751
        return 0;
    }
    if (PACKET_remaining(&psk_identity) > PSK_MAX_IDENTITY_LEN) {
2752 2753
        SSLfatal(s, SSL_AD_DECODE_ERROR, SSL_F_TLS_PROCESS_CKE_PSK_PREAMBLE,
                 SSL_R_DATA_LENGTH_TOO_LONG);
2754 2755 2756
        return 0;
    }
    if (s->psk_server_callback == NULL) {
2757 2758
        SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_TLS_PROCESS_CKE_PSK_PREAMBLE,
                 SSL_R_PSK_NO_SERVER_CB);
2759 2760
        return 0;
    }
2761

2762
    if (!PACKET_strndup(&psk_identity, &s->session->psk_identity)) {
2763 2764
        SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_TLS_PROCESS_CKE_PSK_PREAMBLE,
                 ERR_R_INTERNAL_ERROR);
2765 2766
        return 0;
    }
2767

2768
    psklen = s->psk_server_callback(s, s->session->psk_identity,
E
Emilia Kasper 已提交
2769
                                    psk, sizeof(psk));
2770

2771
    if (psklen > PSK_MAX_PSK_LEN) {
2772 2773
        SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_TLS_PROCESS_CKE_PSK_PREAMBLE,
                 ERR_R_INTERNAL_ERROR);
2774 2775 2776 2777 2778
        return 0;
    } else if (psklen == 0) {
        /*
         * PSK related to the given identity not found
         */
2779 2780 2781
        SSLfatal(s, SSL_AD_UNKNOWN_PSK_IDENTITY,
                 SSL_F_TLS_PROCESS_CKE_PSK_PREAMBLE,
                 SSL_R_PSK_IDENTITY_NOT_FOUND);
2782 2783
        return 0;
    }
2784

2785 2786 2787
    OPENSSL_free(s->s3->tmp.psk);
    s->s3->tmp.psk = OPENSSL_memdup(psk, psklen);
    OPENSSL_cleanse(psk, psklen);
2788

2789
    if (s->s3->tmp.psk == NULL) {
2790 2791
        SSLfatal(s, SSL_AD_INTERNAL_ERROR,
                 SSL_F_TLS_PROCESS_CKE_PSK_PREAMBLE, ERR_R_MALLOC_FAILURE);
2792
        return 0;
2793
    }
2794 2795 2796 2797 2798 2799

    s->s3->tmp.psklen = psklen;

    return 1;
#else
    /* Should never happen */
2800 2801
    SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_TLS_PROCESS_CKE_PSK_PREAMBLE,
             ERR_R_INTERNAL_ERROR);
2802
    return 0;
2803
#endif
2804 2805
}

2806
static int tls_process_cke_rsa(SSL *s, PACKET *pkt)
2807
{
2808
#ifndef OPENSSL_NO_RSA
2809 2810 2811 2812 2813 2814 2815 2816 2817
    unsigned char rand_premaster_secret[SSL_MAX_MASTER_KEY_LENGTH];
    int decrypt_len;
    unsigned char decrypt_good, version_good;
    size_t j, padding_len;
    PACKET enc_premaster;
    RSA *rsa = NULL;
    unsigned char *rsa_decrypt = NULL;
    int ret = 0;

2818
    rsa = EVP_PKEY_get0_RSA(s->cert->pkeys[SSL_PKEY_RSA].privatekey);
2819
    if (rsa == NULL) {
2820 2821
        SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_TLS_PROCESS_CKE_RSA,
                 SSL_R_MISSING_RSA_CERTIFICATE);
2822 2823 2824 2825 2826 2827 2828 2829 2830
        return 0;
    }

    /* SSLv3 and pre-standard DTLS omit the length bytes. */
    if (s->version == SSL3_VERSION || s->version == DTLS1_BAD_VER) {
        enc_premaster = *pkt;
    } else {
        if (!PACKET_get_length_prefixed_2(pkt, &enc_premaster)
            || PACKET_remaining(pkt) != 0) {
2831 2832
            SSLfatal(s, SSL_AD_DECODE_ERROR, SSL_F_TLS_PROCESS_CKE_RSA,
                     SSL_R_LENGTH_MISMATCH);
2833
            return 0;
2834
        }
2835
    }
2836

2837 2838 2839 2840 2841 2842 2843
    /*
     * We want to be sure that the plaintext buffer size makes it safe to
     * iterate over the entire size of a premaster secret
     * (SSL_MAX_MASTER_KEY_LENGTH). Reject overly short RSA keys because
     * their ciphertext cannot accommodate a premaster secret anyway.
     */
    if (RSA_size(rsa) < SSL_MAX_MASTER_KEY_LENGTH) {
2844 2845
        SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_TLS_PROCESS_CKE_RSA,
                 RSA_R_KEY_SIZE_TOO_SMALL);
2846 2847
        return 0;
    }
2848

2849 2850
    rsa_decrypt = OPENSSL_malloc(RSA_size(rsa));
    if (rsa_decrypt == NULL) {
2851 2852
        SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_TLS_PROCESS_CKE_RSA,
                 ERR_R_MALLOC_FAILURE);
2853 2854
        return 0;
    }
2855

2856 2857 2858 2859 2860 2861 2862
    /*
     * We must not leak whether a decryption failure occurs because of
     * Bleichenbacher's attack on PKCS #1 v1.5 RSA padding (see RFC 2246,
     * section 7.4.7.1). The code follows that advice of the TLS RFC and
     * generates a random premaster secret for the case that the decrypt
     * fails. See https://tools.ietf.org/html/rfc5246#section-7.4.7.1
     */
2863

2864 2865 2866 2867
    if (ssl_randbytes(s, rand_premaster_secret,
                      sizeof(rand_premaster_secret)) <= 0) {
        SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_TLS_PROCESS_CKE_RSA,
                 ERR_R_INTERNAL_ERROR);
2868
        goto err;
2869
    }
2870

2871 2872 2873 2874
    /*
     * Decrypt with no padding. PKCS#1 padding will be removed as part of
     * the timing-sensitive code below.
     */
2875 2876 2877 2878
     /* TODO(size_t): Convert this function */
    decrypt_len = (int)RSA_private_decrypt((int)PACKET_remaining(&enc_premaster),
                                           PACKET_data(&enc_premaster),
                                           rsa_decrypt, rsa, RSA_NO_PADDING);
2879 2880 2881
    if (decrypt_len < 0) {
        SSLfatal(s, SSL_AD_DECRYPT_ERROR, SSL_F_TLS_PROCESS_CKE_RSA,
                 ERR_R_INTERNAL_ERROR);
2882
        goto err;
2883
    }
2884

2885
    /* Check the padding. See RFC 3447, section 7.2.2. */
2886

2887 2888 2889 2890 2891 2892
    /*
     * The smallest padded premaster is 11 bytes of overhead. Small keys
     * are publicly invalid, so this may return immediately. This ensures
     * PS is at least 8 bytes.
     */
    if (decrypt_len < 11 + SSL_MAX_MASTER_KEY_LENGTH) {
2893 2894
        SSLfatal(s, SSL_AD_DECRYPT_ERROR, SSL_F_TLS_PROCESS_CKE_RSA,
                 SSL_R_DECRYPTION_FAILED);
2895 2896
        goto err;
    }
2897

2898 2899
    padding_len = decrypt_len - SSL_MAX_MASTER_KEY_LENGTH;
    decrypt_good = constant_time_eq_int_8(rsa_decrypt[0], 0) &
E
Emilia Kasper 已提交
2900
        constant_time_eq_int_8(rsa_decrypt[1], 2);
2901 2902 2903 2904
    for (j = 2; j < padding_len - 1; j++) {
        decrypt_good &= ~constant_time_is_zero_8(rsa_decrypt[j]);
    }
    decrypt_good &= constant_time_is_zero_8(rsa_decrypt[padding_len - 1]);
2905

2906 2907 2908 2909 2910 2911 2912 2913 2914 2915 2916 2917 2918 2919
    /*
     * If the version in the decrypted pre-master secret is correct then
     * version_good will be 0xff, otherwise it'll be zero. The
     * Klima-Pokorny-Rosa extension of Bleichenbacher's attack
     * (http://eprint.iacr.org/2003/052/) exploits the version number
     * check as a "bad version oracle". Thus version checks are done in
     * constant time and are treated like any other decryption error.
     */
    version_good =
        constant_time_eq_8(rsa_decrypt[padding_len],
                           (unsigned)(s->client_version >> 8));
    version_good &=
        constant_time_eq_8(rsa_decrypt[padding_len + 1],
                           (unsigned)(s->client_version & 0xff));
2920

2921 2922 2923 2924 2925 2926 2927 2928 2929 2930 2931 2932 2933 2934
    /*
     * The premaster secret must contain the same version number as the
     * ClientHello to detect version rollback attacks (strangely, the
     * protocol does not offer such protection for DH ciphersuites).
     * However, buggy clients exist that send the negotiated protocol
     * version instead if the server does not support the requested
     * protocol version. If SSL_OP_TLS_ROLLBACK_BUG is set, tolerate such
     * clients.
     */
    if (s->options & SSL_OP_TLS_ROLLBACK_BUG) {
        unsigned char workaround_good;
        workaround_good = constant_time_eq_8(rsa_decrypt[padding_len],
                                             (unsigned)(s->version >> 8));
        workaround_good &=
2935
            constant_time_eq_8(rsa_decrypt[padding_len + 1],
2936 2937 2938
                               (unsigned)(s->version & 0xff));
        version_good |= workaround_good;
    }
2939

2940 2941 2942 2943 2944
    /*
     * Both decryption and version must be good for decrypt_good to
     * remain non-zero (0xff).
     */
    decrypt_good &= version_good;
2945

2946 2947 2948 2949 2950 2951 2952 2953 2954 2955 2956 2957
    /*
     * Now copy rand_premaster_secret over from p using
     * decrypt_good_mask. If decryption failed, then p does not
     * contain valid plaintext, however, a check above guarantees
     * it is still sufficiently large to read from.
     */
    for (j = 0; j < sizeof(rand_premaster_secret); j++) {
        rsa_decrypt[padding_len + j] =
            constant_time_select_8(decrypt_good,
                                   rsa_decrypt[padding_len + j],
                                   rand_premaster_secret[j]);
    }
2958

2959 2960
    if (!ssl_generate_master_secret(s, rsa_decrypt + padding_len,
                                    sizeof(rand_premaster_secret), 0)) {
2961
        /* SSLfatal() already called */
2962 2963
        goto err;
    }
2964

2965 2966 2967 2968 2969 2970
    ret = 1;
 err:
    OPENSSL_free(rsa_decrypt);
    return ret;
#else
    /* Should never happen */
2971 2972
    SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_TLS_PROCESS_CKE_RSA,
             ERR_R_INTERNAL_ERROR);
2973 2974 2975 2976
    return 0;
#endif
}

2977
static int tls_process_cke_dhe(SSL *s, PACKET *pkt)
2978 2979 2980 2981 2982 2983 2984 2985 2986 2987
{
#ifndef OPENSSL_NO_DH
    EVP_PKEY *skey = NULL;
    DH *cdh;
    unsigned int i;
    BIGNUM *pub_key;
    const unsigned char *data;
    EVP_PKEY *ckey = NULL;
    int ret = 0;

D
Dr. Stephen Henson 已提交
2988
    if (!PACKET_get_net_2(pkt, &i) || PACKET_remaining(pkt) != i) {
2989
        SSLfatal(s, SSL_AD_DECODE_ERROR, SSL_F_TLS_PROCESS_CKE_DHE,
2990 2991 2992 2993 2994
               SSL_R_DH_PUBLIC_VALUE_LENGTH_IS_WRONG);
        goto err;
    }
    skey = s->s3->tmp.pkey;
    if (skey == NULL) {
2995 2996
        SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_TLS_PROCESS_CKE_DHE,
                 SSL_R_MISSING_TMP_DH_KEY);
2997 2998 2999 3000
        goto err;
    }

    if (PACKET_remaining(pkt) == 0L) {
3001 3002
        SSLfatal(s, SSL_AD_DECODE_ERROR, SSL_F_TLS_PROCESS_CKE_DHE,
                 SSL_R_MISSING_TMP_DH_KEY);
3003 3004 3005 3006
        goto err;
    }
    if (!PACKET_get_bytes(pkt, &data, i)) {
        /* We already checked we have enough data */
3007 3008
        SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_TLS_PROCESS_CKE_DHE,
                 ERR_R_INTERNAL_ERROR);
3009 3010 3011 3012
        goto err;
    }
    ckey = EVP_PKEY_new();
    if (ckey == NULL || EVP_PKEY_copy_parameters(ckey, skey) == 0) {
3013 3014
        SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_TLS_PROCESS_CKE_DHE,
                 SSL_R_BN_LIB);
3015 3016 3017 3018 3019 3020
        goto err;
    }
    cdh = EVP_PKEY_get0_DH(ckey);
    pub_key = BN_bin2bn(data, i, NULL);

    if (pub_key == NULL || !DH_set0_key(cdh, pub_key, NULL)) {
3021 3022
        SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_TLS_PROCESS_CKE_DHE,
                 ERR_R_INTERNAL_ERROR);
3023 3024 3025 3026 3027
        if (pub_key != NULL)
            BN_free(pub_key);
        goto err;
    }

3028
    if (ssl_derive(s, skey, ckey, 1) == 0) {
3029
        /* SSLfatal() already called */
3030 3031 3032 3033 3034 3035 3036 3037 3038 3039 3040
        goto err;
    }

    ret = 1;
    EVP_PKEY_free(s->s3->tmp.pkey);
    s->s3->tmp.pkey = NULL;
 err:
    EVP_PKEY_free(ckey);
    return ret;
#else
    /* Should never happen */
3041 3042
    SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_TLS_PROCESS_CKE_DHE,
             ERR_R_INTERNAL_ERROR);
3043 3044 3045 3046
    return 0;
#endif
}

3047
static int tls_process_cke_ecdhe(SSL *s, PACKET *pkt)
3048 3049 3050 3051 3052 3053 3054 3055
{
#ifndef OPENSSL_NO_EC
    EVP_PKEY *skey = s->s3->tmp.pkey;
    EVP_PKEY *ckey = NULL;
    int ret = 0;

    if (PACKET_remaining(pkt) == 0L) {
        /* We don't support ECDH client auth */
3056 3057
        SSLfatal(s, SSL_AD_HANDSHAKE_FAILURE, SSL_F_TLS_PROCESS_CKE_ECDHE,
                 SSL_R_MISSING_TMP_ECDH_KEY);
3058 3059 3060 3061 3062 3063 3064 3065 3066 3067 3068
        goto err;
    } else {
        unsigned int i;
        const unsigned char *data;

        /*
         * Get client's public key from encoded point in the
         * ClientKeyExchange message.
         */

        /* Get encoded point length */
D
Dr. Stephen Henson 已提交
3069 3070
        if (!PACKET_get_1(pkt, &i) || !PACKET_get_bytes(pkt, &data, i)
            || PACKET_remaining(pkt) != 0) {
3071 3072
            SSLfatal(s, SSL_AD_DECODE_ERROR, SSL_F_TLS_PROCESS_CKE_ECDHE,
                     SSL_R_LENGTH_MISMATCH);
3073 3074 3075 3076
            goto err;
        }
        ckey = EVP_PKEY_new();
        if (ckey == NULL || EVP_PKEY_copy_parameters(ckey, skey) <= 0) {
3077 3078
            SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_TLS_PROCESS_CKE_ECDHE,
                     ERR_R_EVP_LIB);
3079 3080
            goto err;
        }
3081
        if (EVP_PKEY_set1_tls_encodedpoint(ckey, data, i) == 0) {
3082 3083
            SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_TLS_PROCESS_CKE_ECDHE,
                     ERR_R_EC_LIB);
3084 3085 3086 3087
            goto err;
        }
    }

3088
    if (ssl_derive(s, skey, ckey, 1) == 0) {
3089
        /* SSLfatal() already called */
3090 3091 3092 3093 3094 3095 3096 3097 3098 3099 3100 3101
        goto err;
    }

    ret = 1;
    EVP_PKEY_free(s->s3->tmp.pkey);
    s->s3->tmp.pkey = NULL;
 err:
    EVP_PKEY_free(ckey);

    return ret;
#else
    /* Should never happen */
3102 3103
    SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_TLS_PROCESS_CKE_ECDHE,
             ERR_R_INTERNAL_ERROR);
3104 3105 3106 3107
    return 0;
#endif
}

3108
static int tls_process_cke_srp(SSL *s, PACKET *pkt)
3109 3110 3111 3112 3113 3114
{
#ifndef OPENSSL_NO_SRP
    unsigned int i;
    const unsigned char *data;

    if (!PACKET_get_net_2(pkt, &i)
E
Emilia Kasper 已提交
3115
        || !PACKET_get_bytes(pkt, &data, i)) {
3116 3117
        SSLfatal(s, SSL_AD_DECODE_ERROR, SSL_F_TLS_PROCESS_CKE_SRP,
                 SSL_R_BAD_SRP_A_LENGTH);
3118 3119 3120
        return 0;
    }
    if ((s->srp_ctx.A = BN_bin2bn(data, i, NULL)) == NULL) {
3121 3122
        SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_TLS_PROCESS_CKE_SRP,
                 ERR_R_BN_LIB);
3123 3124
        return 0;
    }
E
Emilia Kasper 已提交
3125
    if (BN_ucmp(s->srp_ctx.A, s->srp_ctx.N) >= 0 || BN_is_zero(s->srp_ctx.A)) {
3126 3127
        SSLfatal(s, SSL_AD_ILLEGAL_PARAMETER, SSL_F_TLS_PROCESS_CKE_SRP,
                 SSL_R_BAD_SRP_PARAMETERS);
3128 3129 3130 3131 3132
        return 0;
    }
    OPENSSL_free(s->session->srp_username);
    s->session->srp_username = OPENSSL_strdup(s->srp_ctx.login);
    if (s->session->srp_username == NULL) {
3133 3134
        SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_TLS_PROCESS_CKE_SRP,
                 ERR_R_MALLOC_FAILURE);
3135 3136 3137 3138
        return 0;
    }

    if (!srp_generate_server_master_secret(s)) {
3139
        /* SSLfatal() already called */
3140 3141 3142 3143 3144 3145
        return 0;
    }

    return 1;
#else
    /* Should never happen */
3146 3147
    SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_TLS_PROCESS_CKE_SRP,
             ERR_R_INTERNAL_ERROR);
3148 3149 3150 3151
    return 0;
#endif
}

3152
static int tls_process_cke_gost(SSL *s, PACKET *pkt)
3153 3154 3155 3156 3157 3158 3159 3160 3161 3162
{
#ifndef OPENSSL_NO_GOST
    EVP_PKEY_CTX *pkey_ctx;
    EVP_PKEY *client_pub_pkey = NULL, *pk = NULL;
    unsigned char premaster_secret[32];
    const unsigned char *start;
    size_t outlen = 32, inlen;
    unsigned long alg_a;
    int Ttag, Tclass;
    long Tlen;
3163
    size_t sess_key_len;
3164 3165 3166 3167 3168 3169 3170 3171 3172 3173 3174 3175 3176 3177 3178 3179 3180 3181 3182 3183 3184 3185
    const unsigned char *data;
    int ret = 0;

    /* Get our certificate private key */
    alg_a = s->s3->tmp.new_cipher->algorithm_auth;
    if (alg_a & SSL_aGOST12) {
        /*
         * New GOST ciphersuites have SSL_aGOST01 bit too
         */
        pk = s->cert->pkeys[SSL_PKEY_GOST12_512].privatekey;
        if (pk == NULL) {
            pk = s->cert->pkeys[SSL_PKEY_GOST12_256].privatekey;
        }
        if (pk == NULL) {
            pk = s->cert->pkeys[SSL_PKEY_GOST01].privatekey;
        }
    } else if (alg_a & SSL_aGOST01) {
        pk = s->cert->pkeys[SSL_PKEY_GOST01].privatekey;
    }

    pkey_ctx = EVP_PKEY_CTX_new(pk, NULL);
    if (pkey_ctx == NULL) {
3186 3187
        SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_TLS_PROCESS_CKE_GOST,
                 ERR_R_MALLOC_FAILURE);
3188 3189 3190
        return 0;
    }
    if (EVP_PKEY_decrypt_init(pkey_ctx) <= 0) {
3191 3192
        SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_TLS_PROCESS_CKE_GOST,
                 ERR_R_INTERNAL_ERROR);
3193 3194 3195 3196 3197 3198 3199 3200 3201 3202 3203 3204 3205 3206 3207 3208
        return 0;
    }
    /*
     * If client certificate is present and is of the same type, maybe
     * use it for key exchange.  Don't mind errors from
     * EVP_PKEY_derive_set_peer, because it is completely valid to use a
     * client certificate for authorization only.
     */
    client_pub_pkey = X509_get0_pubkey(s->session->peer);
    if (client_pub_pkey) {
        if (EVP_PKEY_derive_set_peer(pkey_ctx, client_pub_pkey) <= 0)
            ERR_clear_error();
    }
    /* Decrypt session key */
    sess_key_len = PACKET_remaining(pkt);
    if (!PACKET_get_bytes(pkt, &data, sess_key_len)) {
3209 3210
        SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_TLS_PROCESS_CKE_GOST,
                 ERR_R_INTERNAL_ERROR);
3211 3212
        goto err;
    }
3213
    /* TODO(size_t): Convert this function */
E
Emilia Kasper 已提交
3214
    if (ASN1_get_object((const unsigned char **)&data, &Tlen, &Ttag,
3215
                        &Tclass, (long)sess_key_len) != V_ASN1_CONSTRUCTED
E
Emilia Kasper 已提交
3216
        || Ttag != V_ASN1_SEQUENCE || Tclass != V_ASN1_UNIVERSAL) {
3217 3218
        SSLfatal(s, SSL_AD_DECODE_ERROR, SSL_F_TLS_PROCESS_CKE_GOST,
                 SSL_R_DECRYPTION_FAILED);
3219 3220 3221 3222
        goto err;
    }
    start = data;
    inlen = Tlen;
3223 3224 3225 3226
    if (EVP_PKEY_decrypt(pkey_ctx, premaster_secret, &outlen, start,
                         inlen) <= 0) {
        SSLfatal(s, SSL_AD_DECODE_ERROR, SSL_F_TLS_PROCESS_CKE_GOST,
                 SSL_R_DECRYPTION_FAILED);
3227 3228 3229 3230 3231
        goto err;
    }
    /* Generate master secret */
    if (!ssl_generate_master_secret(s, premaster_secret,
                                    sizeof(premaster_secret), 0)) {
3232
        /* SSLfatal() already called */
3233 3234 3235
        goto err;
    }
    /* Check if pubkey from client certificate was used */
3236 3237
    if (EVP_PKEY_CTX_ctrl(pkey_ctx, -1, -1, EVP_PKEY_CTRL_PEER_KEY, 2,
                          NULL) > 0)
3238 3239 3240 3241 3242 3243 3244 3245
        s->statem.no_cert_verify = 1;

    ret = 1;
 err:
    EVP_PKEY_CTX_free(pkey_ctx);
    return ret;
#else
    /* Should never happen */
3246 3247
    SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_TLS_PROCESS_CKE_GOST,
             ERR_R_INTERNAL_ERROR);
3248 3249 3250 3251
    return 0;
#endif
}

3252 3253 3254 3255 3256 3257 3258
MSG_PROCESS_RETURN tls_process_client_key_exchange(SSL *s, PACKET *pkt)
{
    unsigned long alg_k;

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

    /* For PSK parse and retrieve identity, obtain PSK key */
3259 3260
    if ((alg_k & SSL_PSK) && !tls_process_cke_psk_preamble(s, pkt)) {
        /* SSLfatal() already called */
3261
        goto err;
3262
    }
3263 3264 3265 3266

    if (alg_k & SSL_kPSK) {
        /* Identity extracted earlier: should be nothing left */
        if (PACKET_remaining(pkt) != 0) {
3267 3268 3269
            SSLfatal(s, SSL_AD_DECODE_ERROR,
                     SSL_F_TLS_PROCESS_CLIENT_KEY_EXCHANGE,
                     SSL_R_LENGTH_MISMATCH);
3270
            goto err;
3271 3272 3273
        }
        /* PSK handled by ssl_generate_master_secret */
        if (!ssl_generate_master_secret(s, NULL, 0, 0)) {
3274
            /* SSLfatal() already called */
3275
            goto err;
M
Matt Caswell 已提交
3276
        }
3277
    } else if (alg_k & (SSL_kRSA | SSL_kRSAPSK)) {
3278 3279
        if (!tls_process_cke_rsa(s, pkt)) {
            /* SSLfatal() already called */
3280
            goto err;
3281
        }
3282
    } else if (alg_k & (SSL_kDHE | SSL_kDHEPSK)) {
3283 3284
        if (!tls_process_cke_dhe(s, pkt)) {
            /* SSLfatal() already called */
3285
            goto err;
3286
        }
3287
    } else if (alg_k & (SSL_kECDHE | SSL_kECDHEPSK)) {
3288 3289
        if (!tls_process_cke_ecdhe(s, pkt)) {
            /* SSLfatal() already called */
3290
            goto err;
3291
        }
3292
    } else if (alg_k & SSL_kSRP) {
3293 3294
        if (!tls_process_cke_srp(s, pkt)) {
            /* SSLfatal() already called */
3295
            goto err;
3296
        }
3297
    } else if (alg_k & SSL_kGOST) {
3298 3299
        if (!tls_process_cke_gost(s, pkt)) {
            /* SSLfatal() already called */
3300
            goto err;
3301
        }
3302
    } else {
3303 3304 3305
        SSLfatal(s, SSL_AD_INTERNAL_ERROR,
                 SSL_F_TLS_PROCESS_CLIENT_KEY_EXCHANGE,
                 SSL_R_UNKNOWN_CIPHER_TYPE);
3306
        goto err;
3307 3308
    }

M
Matt Caswell 已提交
3309
    return MSG_PROCESS_CONTINUE_PROCESSING;
3310
 err:
3311 3312 3313
#ifndef OPENSSL_NO_PSK
    OPENSSL_clear_free(s->s3->tmp.psk, s->s3->tmp.psklen);
    s->s3->tmp.psk = NULL;
3314
#endif
M
Matt Caswell 已提交
3315
    return MSG_PROCESS_ERROR;
3316
}
3317

M
Matt Caswell 已提交
3318
WORK_STATE tls_post_process_client_key_exchange(SSL *s, WORK_STATE wst)
3319 3320
{
#ifndef OPENSSL_NO_SCTP
3321 3322 3323 3324 3325 3326 3327 3328
    if (wst == WORK_MORE_A) {
        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 已提交
3329 3330
            memcpy(labelbuffer, DTLS1_SCTP_AUTH_LABEL,
                   sizeof(DTLS1_SCTP_AUTH_LABEL));
3331 3332

            if (SSL_export_keying_material(s, sctpauthkey,
E
Emilia Kasper 已提交
3333 3334 3335
                                           sizeof(sctpauthkey), labelbuffer,
                                           sizeof(labelbuffer), NULL, 0,
                                           0) <= 0) {
3336 3337 3338
                SSLfatal(s, SSL_AD_INTERNAL_ERROR,
                         SSL_F_TLS_POST_PROCESS_CLIENT_KEY_EXCHANGE,
                         ERR_R_INTERNAL_ERROR);
F
FdaSilvaYY 已提交
3339
                return WORK_ERROR;
3340
            }
3341

3342 3343
            BIO_ctrl(SSL_get_wbio(s), BIO_CTRL_DGRAM_SCTP_ADD_AUTH_KEY,
                     sizeof(sctpauthkey), sctpauthkey);
3344 3345 3346 3347
        }
    }
#endif

3348
    if (s->statem.no_cert_verify || !s->session->peer) {
E
Emilia Kasper 已提交
3349 3350 3351
        /*
         * No certificate verify or no peer certificate so we no longer need
         * the handshake_buffer
3352 3353
         */
        if (!ssl3_digest_cached_records(s, 0)) {
3354
            /* SSLfatal() already called */
3355 3356
            return WORK_ERROR;
        }
3357
        return WORK_FINISHED_CONTINUE;
3358
    } else {
3359
        if (!s->s3->handshake_buffer) {
3360 3361 3362
            SSLfatal(s, SSL_AD_INTERNAL_ERROR,
                     SSL_F_TLS_POST_PROCESS_CLIENT_KEY_EXCHANGE,
                     ERR_R_INTERNAL_ERROR);
3363 3364 3365 3366 3367 3368 3369
            return WORK_ERROR;
        }
        /*
         * For sigalgs freeze the handshake buffer. If we support
         * extms we've done this already so this is a no-op
         */
        if (!ssl3_digest_cached_records(s, 1)) {
3370
            /* SSLfatal() already called */
3371 3372 3373 3374 3375 3376 3377
            return WORK_ERROR;
        }
    }

    return WORK_FINISHED_CONTINUE;
}

M
Matt Caswell 已提交
3378
MSG_PROCESS_RETURN tls_process_client_certificate(SSL *s, PACKET *pkt)
M
Matt Caswell 已提交
3379
{
3380
    int i;
3381
    MSG_PROCESS_RETURN ret = MSG_PROCESS_ERROR;
M
Matt Caswell 已提交
3382 3383
    X509 *x = NULL;
    unsigned long l, llen;
E
Emilia Kasper 已提交
3384
    const unsigned char *certstart, *certbytes;
M
Matt Caswell 已提交
3385
    STACK_OF(X509) *sk = NULL;
3386
    PACKET spkt, context;
3387
    size_t chainidx;
3388 3389

    if ((sk = sk_X509_new_null()) == NULL) {
3390 3391 3392
        SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_TLS_PROCESS_CLIENT_CERTIFICATE,
                 ERR_R_MALLOC_FAILURE);
        goto err;
3393 3394
    }

3395 3396 3397 3398 3399
    /* TODO(TLS1.3): For now we ignore the context. We need to verify this */
    if ((SSL_IS_TLS13(s) && !PACKET_get_length_prefixed_1(pkt, &context))
            || !PACKET_get_net_3(pkt, &llen)
            || !PACKET_get_sub_packet(pkt, &spkt, llen)
            || PACKET_remaining(pkt) != 0) {
3400 3401 3402
        SSLfatal(s, SSL_AD_DECODE_ERROR, SSL_F_TLS_PROCESS_CLIENT_CERTIFICATE,
                 SSL_R_LENGTH_MISMATCH);
        goto err;
3403
    }
3404

3405
    for (chainidx = 0; PACKET_remaining(&spkt) > 0; chainidx++) {
3406
        if (!PACKET_get_net_3(&spkt, &l)
E
Emilia Kasper 已提交
3407
            || !PACKET_get_bytes(&spkt, &certbytes, l)) {
3408 3409 3410 3411
            SSLfatal(s, SSL_AD_DECODE_ERROR,
                     SSL_F_TLS_PROCESS_CLIENT_CERTIFICATE,
                     SSL_R_CERT_LENGTH_MISMATCH);
            goto err;
3412 3413
        }

3414 3415
        certstart = certbytes;
        x = d2i_X509(NULL, (const unsigned char **)&certbytes, l);
3416
        if (x == NULL) {
3417 3418 3419
            SSLfatal(s, SSL_AD_DECODE_ERROR,
                     SSL_F_TLS_PROCESS_CLIENT_CERTIFICATE, ERR_R_ASN1_LIB);
            goto err;
3420
        }
3421
        if (certbytes != (certstart + l)) {
3422 3423 3424 3425
            SSLfatal(s, SSL_AD_DECODE_ERROR,
                     SSL_F_TLS_PROCESS_CLIENT_CERTIFICATE,
                     SSL_R_CERT_LENGTH_MISMATCH);
            goto err;
3426
        }
3427 3428 3429 3430 3431 3432

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

            if (!PACKET_get_length_prefixed_2(&spkt, &extensions)) {
3433 3434 3435 3436
                SSLfatal(s, SSL_AD_DECODE_ERROR,
                         SSL_F_TLS_PROCESS_CLIENT_CERTIFICATE,
                         SSL_R_BAD_LENGTH);
                goto err;
3437
            }
3438 3439
            if (!tls_collect_extensions(s, &extensions,
                                        SSL_EXT_TLS1_3_CERTIFICATE, &rawexts,
3440
                                        NULL, chainidx == 0)
3441
                || !tls_parse_all_extensions(s, SSL_EXT_TLS1_3_CERTIFICATE,
3442
                                             rawexts, x, chainidx,
3443
                                             PACKET_remaining(&spkt) == 0)) {
3444
                OPENSSL_free(rawexts);
3445
                goto err;
3446 3447
            }
            OPENSSL_free(rawexts);
3448 3449
        }

3450
        if (!sk_X509_push(sk, x)) {
3451 3452 3453 3454
            SSLfatal(s, SSL_AD_INTERNAL_ERROR,
                     SSL_F_TLS_PROCESS_CLIENT_CERTIFICATE,
                     ERR_R_MALLOC_FAILURE);
            goto err;
3455 3456 3457 3458 3459 3460 3461
        }
        x = NULL;
    }

    if (sk_X509_num(sk) <= 0) {
        /* TLS does not mind 0 certs returned */
        if (s->version == SSL3_VERSION) {
3462 3463 3464 3465
            SSLfatal(s, SSL_AD_HANDSHAKE_FAILURE,
                     SSL_F_TLS_PROCESS_CLIENT_CERTIFICATE,
                     SSL_R_NO_CERTIFICATES_RETURNED);
            goto err;
3466 3467 3468 3469
        }
        /* Fail for TLS only if we required a certificate */
        else if ((s->verify_mode & SSL_VERIFY_PEER) &&
                 (s->verify_mode & SSL_VERIFY_FAIL_IF_NO_PEER_CERT)) {
3470 3471 3472 3473
            SSLfatal(s, SSL_AD_CERTIFICATE_REQUIRED,
                     SSL_F_TLS_PROCESS_CLIENT_CERTIFICATE,
                     SSL_R_PEER_DID_NOT_RETURN_A_CERTIFICATE);
            goto err;
3474 3475
        }
        /* No client certificate so digest cached records */
3476
        if (s->s3->handshake_buffer && !ssl3_digest_cached_records(s, 0)) {
3477 3478
            /* SSLfatal() already called */
            goto err;
3479 3480 3481 3482 3483
        }
    } else {
        EVP_PKEY *pkey;
        i = ssl_verify_cert_chain(s, sk);
        if (i <= 0) {
3484 3485 3486 3487
            SSLfatal(s, ssl_verify_alarm_type(s->verify_result),
                     SSL_F_TLS_PROCESS_CLIENT_CERTIFICATE,
                     SSL_R_CERTIFICATE_VERIFY_FAILED);
            goto err;
3488 3489
        }
        if (i > 1) {
3490 3491 3492
            SSLfatal(s, SSL_AD_HANDSHAKE_FAILURE,
                     SSL_F_TLS_PROCESS_CLIENT_CERTIFICATE, i);
            goto err;
3493
        }
3494
        pkey = X509_get0_pubkey(sk_X509_value(sk, 0));
3495
        if (pkey == NULL) {
3496 3497 3498 3499
            SSLfatal(s, SSL_AD_HANDSHAKE_FAILURE,
                     SSL_F_TLS_PROCESS_CLIENT_CERTIFICATE,
                     SSL_R_UNKNOWN_CERTIFICATE_TYPE);
            goto err;
3500 3501 3502
        }
    }

R
Rich Salz 已提交
3503
    X509_free(s->session->peer);
3504 3505 3506
    s->session->peer = sk_X509_shift(sk);
    s->session->verify_result = s->verify_result;

3507 3508
    sk_X509_pop_free(s->session->peer_chain, X509_free);
    s->session->peer_chain = sk;
3509 3510 3511 3512 3513

    /*
     * Freeze the handshake buffer. For <TLS1.3 we do this after the CKE
     * message
     */
3514
    if (SSL_IS_TLS13(s) && !ssl3_digest_cached_records(s, 1)) {
3515 3516
        /* SSLfatal() already called */
        goto err;
3517 3518
    }

3519 3520
    /*
     * Inconsistency alert: cert_chain does *not* include the peer's own
M
Matt Caswell 已提交
3521
     * certificate, while we do include it in statem_clnt.c
3522 3523
     */
    sk = NULL;
3524 3525 3526 3527 3528 3529

    /* 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)) {
3530 3531
        /* SSLfatal() already called */
        goto err;
3532 3533
    }

M
Matt Caswell 已提交
3534
    ret = MSG_PROCESS_CONTINUE_READING;
R
Rich Salz 已提交
3535

3536
 err:
R
Rich Salz 已提交
3537 3538
    X509_free(x);
    sk_X509_pop_free(sk, X509_free);
M
Matt Caswell 已提交
3539
    return ret;
3540
}
3541

3542
int tls_construct_server_certificate(SSL *s, WPACKET *pkt)
M
Matt Caswell 已提交
3543
{
3544
    CERT_PKEY *cpk = s->s3->tmp.cert;
M
Matt Caswell 已提交
3545

3546
    if (cpk == NULL) {
3547 3548
        SSLfatal(s, SSL_AD_INTERNAL_ERROR,
                 SSL_F_TLS_CONSTRUCT_SERVER_CERTIFICATE, ERR_R_INTERNAL_ERROR);
M
Matt Caswell 已提交
3549 3550 3551
        return 0;
    }

3552 3553 3554 3555
    /*
     * In TLSv1.3 the certificate chain is always preceded by a 0 length context
     * for the server Certificate message
     */
3556 3557 3558 3559 3560 3561 3562
    if (SSL_IS_TLS13(s) && !WPACKET_put_bytes_u8(pkt, 0)) {
        SSLfatal(s, SSL_AD_INTERNAL_ERROR,
                 SSL_F_TLS_CONSTRUCT_SERVER_CERTIFICATE, ERR_R_INTERNAL_ERROR);
        return 0;
    }
    if (!ssl3_output_cert_chain(s, pkt, cpk)) {
        /* SSLfatal() already called */
M
Matt Caswell 已提交
3563 3564 3565 3566 3567 3568
        return 0;
    }

    return 1;
}

3569
int tls_construct_new_session_ticket(SSL *s, WPACKET *pkt)
M
Matt Caswell 已提交
3570 3571
{
    unsigned char *senc = NULL;
3572
    EVP_CIPHER_CTX *ctx = NULL;
3573
    HMAC_CTX *hctx = NULL;
3574
    unsigned char *p, *encdata1, *encdata2, *macdata1, *macdata2;
M
Matt Caswell 已提交
3575
    const unsigned char *const_p;
3576
    int len, slen_full, slen, lenfinal;
M
Matt Caswell 已提交
3577 3578
    SSL_SESSION *sess;
    unsigned int hlen;
3579
    SSL_CTX *tctx = s->session_ctx;
M
Matt Caswell 已提交
3580
    unsigned char iv[EVP_MAX_IV_LENGTH];
K
Kurt Roeckx 已提交
3581
    unsigned char key_name[TLSEXT_KEYNAME_LENGTH];
3582
    int iv_len;
3583
    size_t macoffset, macendoffset;
3584 3585 3586 3587
    union {
        unsigned char age_add_c[sizeof(uint32_t)];
        uint32_t age_add;
    } age_add_u;
M
Matt Caswell 已提交
3588

M
Matt Caswell 已提交
3589
    if (SSL_IS_TLS13(s)) {
3590 3591 3592 3593
        if (ssl_randbytes(s, age_add_u.age_add_c, sizeof(age_add_u)) <= 0) {
            SSLfatal(s, SSL_AD_INTERNAL_ERROR,
                     SSL_F_TLS_CONSTRUCT_NEW_SESSION_TICKET,
                     ERR_R_INTERNAL_ERROR);
M
Matt Caswell 已提交
3594
            goto err;
3595
        }
M
Matt Caswell 已提交
3596
        s->session->ext.tick_age_add = age_add_u.age_add;
3597 3598 3599 3600 3601 3602 3603 3604
       /*
        * ticket_nonce is set to a single 0 byte because we only ever send a
        * single ticket per connection. IMPORTANT: If we ever support multiple
        * tickets per connection then this will need to be changed.
        */
        OPENSSL_free(s->session->ext.tick_nonce);
        s->session->ext.tick_nonce = OPENSSL_zalloc(sizeof(char));
        if (s->session->ext.tick_nonce == NULL) {
3605 3606 3607
            SSLfatal(s, SSL_AD_INTERNAL_ERROR,
                     SSL_F_TLS_CONSTRUCT_NEW_SESSION_TICKET,
                     ERR_R_MALLOC_FAILURE);
3608 3609 3610
            goto err;
        }
        s->session->ext.tick_nonce_len = 1;
3611
        s->session->time = (long)time(NULL);
3612 3613 3614 3615 3616
        if (s->s3->alpn_selected != NULL) {
            OPENSSL_free(s->session->ext.alpn_selected);
            s->session->ext.alpn_selected =
                OPENSSL_memdup(s->s3->alpn_selected, s->s3->alpn_selected_len);
            if (s->session->ext.alpn_selected == NULL) {
3617 3618 3619
                SSLfatal(s, SSL_AD_INTERNAL_ERROR,
                         SSL_F_TLS_CONSTRUCT_NEW_SESSION_TICKET,
                         ERR_R_MALLOC_FAILURE);
3620 3621 3622 3623 3624
                goto err;
            }
            s->session->ext.alpn_selected_len = s->s3->alpn_selected_len;
        }
        s->session->ext.max_early_data = s->max_early_data;
M
Matt Caswell 已提交
3625 3626
    }

M
Matt Caswell 已提交
3627 3628 3629 3630 3631 3632 3633
    /* get session encoding length */
    slen_full = i2d_SSL_SESSION(s->session, NULL);
    /*
     * Some length values are 16 bits, so forget it if session is too
     * long
     */
    if (slen_full == 0 || slen_full > 0xFF00) {
3634 3635
        SSLfatal(s, SSL_AD_INTERNAL_ERROR,
                 SSL_F_TLS_CONSTRUCT_NEW_SESSION_TICKET, ERR_R_INTERNAL_ERROR);
3636
        goto err;
M
Matt Caswell 已提交
3637 3638
    }
    senc = OPENSSL_malloc(slen_full);
3639
    if (senc == NULL) {
3640 3641
        SSLfatal(s, SSL_AD_INTERNAL_ERROR,
                 SSL_F_TLS_CONSTRUCT_NEW_SESSION_TICKET, ERR_R_MALLOC_FAILURE);
3642
        goto err;
M
Matt Caswell 已提交
3643
    }
3644

3645
    ctx = EVP_CIPHER_CTX_new();
3646
    hctx = HMAC_CTX_new();
3647
    if (ctx == NULL || hctx == NULL) {
3648 3649
        SSLfatal(s, SSL_AD_INTERNAL_ERROR,
                 SSL_F_TLS_CONSTRUCT_NEW_SESSION_TICKET, ERR_R_MALLOC_FAILURE);
3650 3651
        goto err;
    }
3652

M
Matt Caswell 已提交
3653
    p = senc;
3654 3655 3656
    if (!i2d_SSL_SESSION(s->session, &p)) {
        SSLfatal(s, SSL_AD_INTERNAL_ERROR,
                 SSL_F_TLS_CONSTRUCT_NEW_SESSION_TICKET, ERR_R_INTERNAL_ERROR);
M
Matt Caswell 已提交
3657
        goto err;
3658
    }
M
Matt Caswell 已提交
3659

M
Matt Caswell 已提交
3660 3661 3662 3663 3664
    /*
     * create a fresh copy (not shared with other threads) to clean up
     */
    const_p = senc;
    sess = d2i_SSL_SESSION(NULL, &const_p, slen_full);
3665 3666 3667
    if (sess == NULL) {
        SSLfatal(s, SSL_AD_INTERNAL_ERROR,
                 SSL_F_TLS_CONSTRUCT_NEW_SESSION_TICKET, ERR_R_INTERNAL_ERROR);
M
Matt Caswell 已提交
3668
        goto err;
3669
    }
M
Matt Caswell 已提交
3670
    sess->session_id_length = 0; /* ID is irrelevant for the ticket */
3671

M
Matt Caswell 已提交
3672
    slen = i2d_SSL_SESSION(sess, NULL);
3673 3674 3675 3676
    if (slen == 0 || slen > slen_full) {
        /* shouldn't ever happen */
        SSLfatal(s, SSL_AD_INTERNAL_ERROR,
                 SSL_F_TLS_CONSTRUCT_NEW_SESSION_TICKET, ERR_R_INTERNAL_ERROR);
M
Matt Caswell 已提交
3677 3678 3679 3680 3681
        SSL_SESSION_free(sess);
        goto err;
    }
    p = senc;
    if (!i2d_SSL_SESSION(sess, &p)) {
3682 3683
        SSLfatal(s, SSL_AD_INTERNAL_ERROR,
                 SSL_F_TLS_CONSTRUCT_NEW_SESSION_TICKET, ERR_R_INTERNAL_ERROR);
M
Matt Caswell 已提交
3684 3685 3686 3687
        SSL_SESSION_free(sess);
        goto err;
    }
    SSL_SESSION_free(sess);
3688

M
Matt Caswell 已提交
3689 3690 3691 3692
    /*
     * Initialize HMAC and cipher contexts. If callback present it does
     * all the work otherwise use generated values from parent ctx.
     */
R
Rich Salz 已提交
3693
    if (tctx->ext.ticket_key_cb) {
T
Todd Short 已提交
3694
        /* if 0 is returned, write an empty ticket */
R
Rich Salz 已提交
3695
        int ret = tctx->ext.ticket_key_cb(s, key_name, iv, ctx,
T
Todd Short 已提交
3696 3697 3698
                                             hctx, 1);

        if (ret == 0) {
3699 3700

            /* Put timeout and length */
3701
            if (!WPACKET_put_bytes_u32(pkt, 0)
3702
                    || !WPACKET_put_bytes_u16(pkt, 0)) {
3703 3704 3705
                SSLfatal(s, SSL_AD_INTERNAL_ERROR,
                         SSL_F_TLS_CONSTRUCT_NEW_SESSION_TICKET,
                         ERR_R_INTERNAL_ERROR);
T
Todd Short 已提交
3706
                goto err;
3707
            }
T
Todd Short 已提交
3708 3709 3710 3711 3712
            OPENSSL_free(senc);
            EVP_CIPHER_CTX_free(ctx);
            HMAC_CTX_free(hctx);
            return 1;
        }
3713 3714 3715 3716
        if (ret < 0) {
            SSLfatal(s, SSL_AD_INTERNAL_ERROR,
                     SSL_F_TLS_CONSTRUCT_NEW_SESSION_TICKET,
                     SSL_R_CALLBACK_FAILED);
M
Matt Caswell 已提交
3717
            goto err;
3718
        }
K
Kurt Roeckx 已提交
3719
        iv_len = EVP_CIPHER_CTX_iv_length(ctx);
M
Matt Caswell 已提交
3720
    } else {
K
Kurt Roeckx 已提交
3721 3722 3723
        const EVP_CIPHER *cipher = EVP_aes_256_cbc();

        iv_len = EVP_CIPHER_iv_length(cipher);
3724 3725 3726 3727 3728 3729 3730 3731 3732
        if (ssl_randbytes(s, iv, iv_len) <= 0
                || !EVP_EncryptInit_ex(ctx, cipher, NULL,
                                       tctx->ext.tick_aes_key, iv)
                || !HMAC_Init_ex(hctx, tctx->ext.tick_hmac_key,
                                 sizeof(tctx->ext.tick_hmac_key),
                                 EVP_sha256(), NULL)) {
            SSLfatal(s, SSL_AD_INTERNAL_ERROR,
                     SSL_F_TLS_CONSTRUCT_NEW_SESSION_TICKET,
                     ERR_R_INTERNAL_ERROR);
3733
            goto err;
3734
        }
R
Rich Salz 已提交
3735 3736
        memcpy(key_name, tctx->ext.tick_key_name,
               sizeof(tctx->ext.tick_key_name));
3737 3738
    }

M
Matt Caswell 已提交
3739
    /*
3740 3741 3742 3743
     * Ticket lifetime hint: For TLSv1.2 this is advisory only and we leave this
     * unspecified for resumed session (for simplicity).
     * In TLSv1.3 we reset the "time" field above, and always specify the
     * timeout.
M
Matt Caswell 已提交
3744
     */
3745 3746 3747
    if (!WPACKET_put_bytes_u32(pkt,
                               (s->hit && !SSL_IS_TLS13(s))
                               ? 0 : s->session->timeout)
3748
            || (SSL_IS_TLS13(s)
3749
                && (!WPACKET_put_bytes_u32(pkt, age_add_u.age_add)
3750 3751
                    || !WPACKET_sub_memcpy_u8(pkt, s->session->ext.tick_nonce,
                                              s->session->ext.tick_nonce_len)))
3752
               /* Now the actual ticket data */
3753 3754
            || !WPACKET_start_sub_packet_u16(pkt)
            || !WPACKET_get_total_written(pkt, &macoffset)
3755
               /* Output key name */
3756
            || !WPACKET_memcpy(pkt, key_name, sizeof(key_name))
3757
               /* output IV */
3758 3759
            || !WPACKET_memcpy(pkt, iv, iv_len)
            || !WPACKET_reserve_bytes(pkt, slen + EVP_MAX_BLOCK_LENGTH,
3760 3761 3762
                                      &encdata1)
               /* Encrypt session data */
            || !EVP_EncryptUpdate(ctx, encdata1, &len, senc, slen)
3763
            || !WPACKET_allocate_bytes(pkt, len, &encdata2)
3764 3765
            || encdata1 != encdata2
            || !EVP_EncryptFinal(ctx, encdata1 + len, &lenfinal)
3766
            || !WPACKET_allocate_bytes(pkt, lenfinal, &encdata2)
3767 3768
            || encdata1 + len != encdata2
            || len + lenfinal > slen + EVP_MAX_BLOCK_LENGTH
3769
            || !WPACKET_get_total_written(pkt, &macendoffset)
3770 3771 3772
            || !HMAC_Update(hctx,
                            (unsigned char *)s->init_buf->data + macoffset,
                            macendoffset - macoffset)
3773
            || !WPACKET_reserve_bytes(pkt, EVP_MAX_MD_SIZE, &macdata1)
3774 3775
            || !HMAC_Final(hctx, macdata1, &hlen)
            || hlen > EVP_MAX_MD_SIZE
3776
            || !WPACKET_allocate_bytes(pkt, hlen, &macdata2)
3777
            || macdata1 != macdata2
3778
            || !WPACKET_close(pkt)) {
3779 3780
        SSLfatal(s, SSL_AD_INTERNAL_ERROR,
                 SSL_F_TLS_CONSTRUCT_NEW_SESSION_TICKET, ERR_R_INTERNAL_ERROR);
M
Matt Caswell 已提交
3781
        goto err;
3782
    }
3783 3784 3785 3786 3787 3788 3789
    if (SSL_IS_TLS13(s)
            && !tls_construct_extensions(s, pkt,
                                         SSL_EXT_TLS1_3_NEW_SESSION_TICKET,
                                         NULL, 0)) {
        /* SSLfatal() already called */
        goto err;
    }
D
Dr. Stephen Henson 已提交
3790 3791
    EVP_CIPHER_CTX_free(ctx);
    HMAC_CTX_free(hctx);
M
Matt Caswell 已提交
3792 3793 3794
    OPENSSL_free(senc);

    return 1;
M
Matt Caswell 已提交
3795
 err:
R
Rich Salz 已提交
3796
    OPENSSL_free(senc);
3797
    EVP_CIPHER_CTX_free(ctx);
3798
    HMAC_CTX_free(hctx);
M
Matt Caswell 已提交
3799
    return 0;
3800
}
3801

3802 3803 3804 3805 3806
/*
 * In TLSv1.3 this is called from the extensions code, otherwise it is used to
 * create a separate message. Returns 1 on success or 0 on failure.
 */
int tls_construct_cert_status_body(SSL *s, WPACKET *pkt)
M
Matt Caswell 已提交
3807
{
3808 3809 3810
    if (!WPACKET_put_bytes_u8(pkt, s->ext.status_type)
            || !WPACKET_sub_memcpy_u24(pkt, s->ext.ocsp.resp,
                                       s->ext.ocsp.resp_len)) {
3811 3812
        SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_TLS_CONSTRUCT_CERT_STATUS_BODY,
                 ERR_R_INTERNAL_ERROR);
3813 3814 3815 3816 3817 3818 3819 3820 3821
        return 0;
    }

    return 1;
}

int tls_construct_cert_status(SSL *s, WPACKET *pkt)
{
    if (!tls_construct_cert_status_body(s, pkt)) {
3822
        /* SSLfatal() already called */
3823 3824
        return 0;
    }
M
Matt Caswell 已提交
3825 3826 3827 3828

    return 1;
}

3829
#ifndef OPENSSL_NO_NEXTPROTONEG
M
Matt Caswell 已提交
3830 3831 3832 3833
/*
 * tls_process_next_proto reads a Next Protocol Negotiation handshake message.
 * It sets the next_proto member in s if found
 */
M
Matt Caswell 已提交
3834
MSG_PROCESS_RETURN tls_process_next_proto(SSL *s, PACKET *pkt)
M
Matt Caswell 已提交
3835
{
3836
    PACKET next_proto, padding;
M
Matt Caswell 已提交
3837 3838
    size_t next_proto_len;

3839 3840 3841 3842 3843 3844 3845
    /*-
     * The payload looks like:
     *   uint8 proto_len;
     *   uint8 proto[proto_len];
     *   uint8 padding_len;
     *   uint8 padding[padding_len];
     */
3846 3847 3848
    if (!PACKET_get_length_prefixed_1(pkt, &next_proto)
        || !PACKET_get_length_prefixed_1(pkt, &padding)
        || PACKET_remaining(pkt) > 0) {
3849 3850 3851
        SSLfatal(s, SSL_AD_DECODE_ERROR, SSL_F_TLS_PROCESS_NEXT_PROTO,
                 SSL_R_LENGTH_MISMATCH);
        return MSG_PROCESS_ERROR;
M
Matt Caswell 已提交
3852
    }
3853

R
Rich Salz 已提交
3854 3855
    if (!PACKET_memdup(&next_proto, &s->ext.npn, &next_proto_len)) {
        s->ext.npn_len = 0;
3856 3857 3858
        SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_TLS_PROCESS_NEXT_PROTO,
                 ERR_R_INTERNAL_ERROR);
        return MSG_PROCESS_ERROR;
M
Matt Caswell 已提交
3859 3860
    }

R
Rich Salz 已提交
3861
    s->ext.npn_len = (unsigned char)next_proto_len;
3862

M
Matt Caswell 已提交
3863
    return MSG_PROCESS_CONTINUE_READING;
3864
}
3865
#endif
M
Matt Caswell 已提交
3866

M
Matt Caswell 已提交
3867 3868
static int tls_construct_encrypted_extensions(SSL *s, WPACKET *pkt)
{
3869
    if (!tls_construct_extensions(s, pkt, SSL_EXT_TLS1_3_ENCRYPTED_EXTENSIONS,
3870 3871
                                  NULL, 0)) {
        /* SSLfatal() already called */
M
Matt Caswell 已提交
3872 3873 3874 3875 3876 3877
        return 0;
    }

    return 1;
}

3878 3879 3880
MSG_PROCESS_RETURN tls_process_end_of_early_data(SSL *s, PACKET *pkt)
{
    if (PACKET_remaining(pkt) != 0) {
3881 3882
        SSLfatal(s, SSL_AD_DECODE_ERROR, SSL_F_TLS_PROCESS_END_OF_EARLY_DATA,
                 SSL_R_LENGTH_MISMATCH);
3883 3884 3885 3886 3887
        return MSG_PROCESS_ERROR;
    }

    if (s->early_data_state != SSL_EARLY_DATA_READING
            && s->early_data_state != SSL_EARLY_DATA_READ_RETRY) {
3888 3889 3890
        SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_TLS_PROCESS_END_OF_EARLY_DATA,
                 ERR_R_INTERNAL_ERROR);
        return MSG_PROCESS_ERROR;
3891 3892 3893 3894 3895 3896 3897
    }

    /*
     * EndOfEarlyData signals a key change so the end of the message must be on
     * a record boundary.
     */
    if (RECORD_LAYER_processed_read_pending(&s->rlayer)) {
3898 3899 3900 3901
        SSLfatal(s, SSL_AD_UNEXPECTED_MESSAGE,
                 SSL_F_TLS_PROCESS_END_OF_EARLY_DATA,
                 SSL_R_NOT_ON_RECORD_BOUNDARY);
        return MSG_PROCESS_ERROR;
3902 3903 3904 3905 3906
    }

    s->early_data_state = SSL_EARLY_DATA_FINISHED_READING;
    if (!s->method->ssl3_enc->change_cipher_state(s,
                SSL3_CC_HANDSHAKE | SSL3_CHANGE_CIPHER_SERVER_READ)) {
3907 3908
        /* SSLfatal() already called */
        return MSG_PROCESS_ERROR;
3909 3910 3911 3912
    }

    return MSG_PROCESS_CONTINUE_READING;
}