Blame ssl/statem/statem_lib.c

Packit Service 084de1
/*
Packit Service 084de1
 * Copyright 1995-2020 The OpenSSL Project Authors. All Rights Reserved.
Packit Service 084de1
 * Copyright (c) 2002, Oracle and/or its affiliates. All rights reserved
Packit Service 084de1
 *
Packit Service 084de1
 * Licensed under the OpenSSL license (the "License").  You may not use
Packit Service 084de1
 * this file except in compliance with the License.  You can obtain a copy
Packit Service 084de1
 * in the file LICENSE in the source distribution or at
Packit Service 084de1
 * https://www.openssl.org/source/license.html
Packit Service 084de1
 */
Packit Service 084de1
Packit Service 084de1
#include <limits.h>
Packit Service 084de1
#include <string.h>
Packit Service 084de1
#include <stdio.h>
Packit Service 084de1
#include "../ssl_local.h"
Packit Service 084de1
#include "statem_local.h"
Packit Service 084de1
#include "internal/cryptlib.h"
Packit Service 084de1
#include <openssl/buffer.h>
Packit Service 084de1
#include <openssl/objects.h>
Packit Service 084de1
#include <openssl/evp.h>
Packit Service 084de1
#include <openssl/x509.h>
Packit Service 084de1
Packit Service 084de1
/*
Packit Service 084de1
 * Map error codes to TLS/SSL alart types.
Packit Service 084de1
 */
Packit Service 084de1
typedef struct x509err2alert_st {
Packit Service 084de1
    int x509err;
Packit Service 084de1
    int alert;
Packit Service 084de1
} X509ERR2ALERT;
Packit Service 084de1
Packit Service 084de1
/* Fixed value used in the ServerHello random field to identify an HRR */
Packit Service 084de1
const unsigned char hrrrandom[] = {
Packit Service 084de1
    0xcf, 0x21, 0xad, 0x74, 0xe5, 0x9a, 0x61, 0x11, 0xbe, 0x1d, 0x8c, 0x02,
Packit Service 084de1
    0x1e, 0x65, 0xb8, 0x91, 0xc2, 0xa2, 0x11, 0x16, 0x7a, 0xbb, 0x8c, 0x5e,
Packit Service 084de1
    0x07, 0x9e, 0x09, 0xe2, 0xc8, 0xa8, 0x33, 0x9c
Packit Service 084de1
};
Packit Service 084de1
Packit Service 084de1
/*
Packit Service 084de1
 * send s->init_buf in records of type 'type' (SSL3_RT_HANDSHAKE or
Packit Service 084de1
 * SSL3_RT_CHANGE_CIPHER_SPEC)
Packit Service 084de1
 */
Packit Service 084de1
int ssl3_do_write(SSL *s, int type)
Packit Service 084de1
{
Packit Service 084de1
    int ret;
Packit Service 084de1
    size_t written = 0;
Packit Service 084de1
Packit Service 084de1
    ret = ssl3_write_bytes(s, type, &s->init_buf->data[s->init_off],
Packit Service 084de1
                           s->init_num, &written);
Packit Service 084de1
    if (ret < 0)
Packit Service 084de1
        return -1;
Packit Service 084de1
    if (type == SSL3_RT_HANDSHAKE)
Packit Service 084de1
        /*
Packit Service 084de1
         * should not be done for 'Hello Request's, but in that case we'll
Packit Service 084de1
         * ignore the result anyway
Packit Service 084de1
         * TLS1.3 KeyUpdate and NewSessionTicket do not need to be added
Packit Service 084de1
         */
Packit Service 084de1
        if (!SSL_IS_TLS13(s) || (s->statem.hand_state != TLS_ST_SW_SESSION_TICKET
Packit Service 084de1
                                 && s->statem.hand_state != TLS_ST_CW_KEY_UPDATE
Packit Service 084de1
                                 && s->statem.hand_state != TLS_ST_SW_KEY_UPDATE))
Packit Service 084de1
            if (!ssl3_finish_mac(s,
Packit Service 084de1
                                 (unsigned char *)&s->init_buf->data[s->init_off],
Packit Service 084de1
                                 written))
Packit Service 084de1
                return -1;
Packit Service 084de1
    if (written == s->init_num) {
Packit Service 084de1
        if (s->msg_callback)
Packit Service 084de1
            s->msg_callback(1, s->version, type, s->init_buf->data,
Packit Service 084de1
                            (size_t)(s->init_off + s->init_num), s,
Packit Service 084de1
                            s->msg_callback_arg);
Packit Service 084de1
        return 1;
Packit Service 084de1
    }
Packit Service 084de1
    s->init_off += written;
Packit Service 084de1
    s->init_num -= written;
Packit Service 084de1
    return 0;
Packit Service 084de1
}
Packit Service 084de1
Packit Service 084de1
int tls_close_construct_packet(SSL *s, WPACKET *pkt, int htype)
Packit Service 084de1
{
Packit Service 084de1
    size_t msglen;
Packit Service 084de1
Packit Service 084de1
    if ((htype != SSL3_MT_CHANGE_CIPHER_SPEC && !WPACKET_close(pkt))
Packit Service 084de1
            || !WPACKET_get_length(pkt, &msglen)
Packit Service 084de1
            || msglen > INT_MAX)
Packit Service 084de1
        return 0;
Packit Service 084de1
    s->init_num = (int)msglen;
Packit Service 084de1
    s->init_off = 0;
Packit Service 084de1
Packit Service 084de1
    return 1;
Packit Service 084de1
}
Packit Service 084de1
Packit Service 084de1
int tls_setup_handshake(SSL *s)
Packit Service 084de1
{
Packit Service 084de1
    if (!ssl3_init_finished_mac(s)) {
Packit Service 084de1
        /* SSLfatal() already called */
Packit Service 084de1
        return 0;
Packit Service 084de1
    }
Packit Service 084de1
Packit Service 084de1
    /* Reset any extension flags */
Packit Service 084de1
    memset(s->ext.extflags, 0, sizeof(s->ext.extflags));
Packit Service 084de1
Packit Service 084de1
    if (s->server) {
Packit Service 084de1
        STACK_OF(SSL_CIPHER) *ciphers = SSL_get_ciphers(s);
Packit Service 084de1
        int i, ver_min, ver_max, ok = 0;
Packit Service 084de1
Packit Service 084de1
        /*
Packit Service 084de1
         * Sanity check that the maximum version we accept has ciphers
Packit Service 084de1
         * enabled. For clients we do this check during construction of the
Packit Service 084de1
         * ClientHello.
Packit Service 084de1
         */
Packit Service 084de1
        if (ssl_get_min_max_version(s, &ver_min, &ver_max, NULL) != 0) {
Packit Service 084de1
            SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_TLS_SETUP_HANDSHAKE,
Packit Service 084de1
                     ERR_R_INTERNAL_ERROR);
Packit Service 084de1
            return 0;
Packit Service 084de1
        }
Packit Service 084de1
        for (i = 0; i < sk_SSL_CIPHER_num(ciphers); i++) {
Packit Service 084de1
            const SSL_CIPHER *c = sk_SSL_CIPHER_value(ciphers, i);
Packit Service 084de1
Packit Service 084de1
            if (SSL_IS_DTLS(s)) {
Packit Service 084de1
                if (DTLS_VERSION_GE(ver_max, c->min_dtls) &&
Packit Service 084de1
                        DTLS_VERSION_LE(ver_max, c->max_dtls))
Packit Service 084de1
                    ok = 1;
Packit Service 084de1
            } else if (ver_max >= c->min_tls && ver_max <= c->max_tls) {
Packit Service 084de1
                ok = 1;
Packit Service 084de1
            }
Packit Service 084de1
            if (ok)
Packit Service 084de1
                break;
Packit Service 084de1
        }
Packit Service 084de1
        if (!ok) {
Packit Service 084de1
            SSLfatal(s, SSL_AD_HANDSHAKE_FAILURE, SSL_F_TLS_SETUP_HANDSHAKE,
Packit Service 084de1
                     SSL_R_NO_CIPHERS_AVAILABLE);
Packit Service 084de1
            ERR_add_error_data(1, "No ciphers enabled for max supported "
Packit Service 084de1
                                  "SSL/TLS version");
Packit Service 084de1
            return 0;
Packit Service 084de1
        }
Packit Service 084de1
        if (SSL_IS_FIRST_HANDSHAKE(s)) {
Packit Service 084de1
            /* N.B. s->session_ctx == s->ctx here */
Packit Service 084de1
            tsan_counter(&s->session_ctx->stats.sess_accept);
Packit Service 084de1
        } else {
Packit Service 084de1
            /* N.B. s->ctx may not equal s->session_ctx */
Packit Service 084de1
            tsan_counter(&s->ctx->stats.sess_accept_renegotiate);
Packit Service 084de1
Packit Service 084de1
            s->s3->tmp.cert_request = 0;
Packit Service 084de1
        }
Packit Service 084de1
    } else {
Packit Service 084de1
        if (SSL_IS_FIRST_HANDSHAKE(s))
Packit Service 084de1
            tsan_counter(&s->session_ctx->stats.sess_connect);
Packit Service 084de1
        else
Packit Service 084de1
            tsan_counter(&s->session_ctx->stats.sess_connect_renegotiate);
Packit Service 084de1
Packit Service 084de1
        /* mark client_random uninitialized */
Packit Service 084de1
        memset(s->s3->client_random, 0, sizeof(s->s3->client_random));
Packit Service 084de1
        s->hit = 0;
Packit Service 084de1
Packit Service 084de1
        s->s3->tmp.cert_req = 0;
Packit Service 084de1
Packit Service 084de1
        if (SSL_IS_DTLS(s))
Packit Service 084de1
            s->statem.use_timer = 1;
Packit Service 084de1
    }
Packit Service 084de1
Packit Service 084de1
    return 1;
Packit Service 084de1
}
Packit Service 084de1
Packit Service 084de1
/*
Packit Service 084de1
 * Size of the to-be-signed TLS13 data, without the hash size itself:
Packit Service 084de1
 * 64 bytes of value 32, 33 context bytes, 1 byte separator
Packit Service 084de1
 */
Packit Service 084de1
#define TLS13_TBS_START_SIZE            64
Packit Service 084de1
#define TLS13_TBS_PREAMBLE_SIZE         (TLS13_TBS_START_SIZE + 33 + 1)
Packit Service 084de1
Packit Service 084de1
static int get_cert_verify_tbs_data(SSL *s, unsigned char *tls13tbs,
Packit Service 084de1
                                    void **hdata, size_t *hdatalen)
Packit Service 084de1
{
Packit Service 084de1
#ifdef CHARSET_EBCDIC
Packit Service 084de1
    static const char servercontext[] = { 0x54, 0x4c, 0x53, 0x20, 0x31, 0x2e,
Packit Service 084de1
     0x33, 0x2c, 0x20, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x20, 0x43, 0x65,
Packit Service 084de1
     0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x65, 0x56, 0x65, 0x72,
Packit Service 084de1
     0x69, 0x66, 0x79, 0x00 };
Packit Service 084de1
    static const char clientcontext[] = { 0x54, 0x4c, 0x53, 0x20, 0x31, 0x2e,
Packit Service 084de1
     0x33, 0x2c, 0x20, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x20, 0x43, 0x65,
Packit Service 084de1
     0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x65, 0x56, 0x65, 0x72,
Packit Service 084de1
     0x69, 0x66, 0x79, 0x00 };
Packit Service 084de1
#else
Packit Service 084de1
    static const char servercontext[] = "TLS 1.3, server CertificateVerify";
Packit Service 084de1
    static const char clientcontext[] = "TLS 1.3, client CertificateVerify";
Packit Service 084de1
#endif
Packit Service 084de1
    if (SSL_IS_TLS13(s)) {
Packit Service 084de1
        size_t hashlen;
Packit Service 084de1
Packit Service 084de1
        /* Set the first 64 bytes of to-be-signed data to octet 32 */
Packit Service 084de1
        memset(tls13tbs, 32, TLS13_TBS_START_SIZE);
Packit Service 084de1
        /* This copies the 33 bytes of context plus the 0 separator byte */
Packit Service 084de1
        if (s->statem.hand_state == TLS_ST_CR_CERT_VRFY
Packit Service 084de1
                 || s->statem.hand_state == TLS_ST_SW_CERT_VRFY)
Packit Service 084de1
            strcpy((char *)tls13tbs + TLS13_TBS_START_SIZE, servercontext);
Packit Service 084de1
        else
Packit Service 084de1
            strcpy((char *)tls13tbs + TLS13_TBS_START_SIZE, clientcontext);
Packit Service 084de1
Packit Service 084de1
        /*
Packit Service 084de1
         * If we're currently reading then we need to use the saved handshake
Packit Service 084de1
         * hash value. We can't use the current handshake hash state because
Packit Service 084de1
         * that includes the CertVerify itself.
Packit Service 084de1
         */
Packit Service 084de1
        if (s->statem.hand_state == TLS_ST_CR_CERT_VRFY
Packit Service 084de1
                || s->statem.hand_state == TLS_ST_SR_CERT_VRFY) {
Packit Service 084de1
            memcpy(tls13tbs + TLS13_TBS_PREAMBLE_SIZE, s->cert_verify_hash,
Packit Service 084de1
                   s->cert_verify_hash_len);
Packit Service 084de1
            hashlen = s->cert_verify_hash_len;
Packit Service 084de1
        } else if (!ssl_handshake_hash(s, tls13tbs + TLS13_TBS_PREAMBLE_SIZE,
Packit Service 084de1
                                       EVP_MAX_MD_SIZE, &hashlen)) {
Packit Service 084de1
            /* SSLfatal() already called */
Packit Service 084de1
            return 0;
Packit Service 084de1
        }
Packit Service 084de1
Packit Service 084de1
        *hdata = tls13tbs;
Packit Service 084de1
        *hdatalen = TLS13_TBS_PREAMBLE_SIZE + hashlen;
Packit Service 084de1
    } else {
Packit Service 084de1
        size_t retlen;
Packit Service 084de1
        long retlen_l;
Packit Service 084de1
Packit Service 084de1
        retlen = retlen_l = BIO_get_mem_data(s->s3->handshake_buffer, hdata);
Packit Service 084de1
        if (retlen_l <= 0) {
Packit Service 084de1
            SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_GET_CERT_VERIFY_TBS_DATA,
Packit Service 084de1
                     ERR_R_INTERNAL_ERROR);
Packit Service 084de1
            return 0;
Packit Service 084de1
        }
Packit Service 084de1
        *hdatalen = retlen;
Packit Service 084de1
    }
Packit Service 084de1
Packit Service 084de1
    return 1;
Packit Service 084de1
}
Packit Service 084de1
Packit Service 084de1
int tls_construct_cert_verify(SSL *s, WPACKET *pkt)
Packit Service 084de1
{
Packit Service 084de1
    EVP_PKEY *pkey = NULL;
Packit Service 084de1
    const EVP_MD *md = NULL;
Packit Service 084de1
    EVP_MD_CTX *mctx = NULL;
Packit Service 084de1
    EVP_PKEY_CTX *pctx = NULL;
Packit Service 084de1
    size_t hdatalen = 0, siglen = 0;
Packit Service 084de1
    void *hdata;
Packit Service 084de1
    unsigned char *sig = NULL;
Packit Service 084de1
    unsigned char tls13tbs[TLS13_TBS_PREAMBLE_SIZE + EVP_MAX_MD_SIZE];
Packit Service 084de1
    const SIGALG_LOOKUP *lu = s->s3->tmp.sigalg;
Packit Service 084de1
Packit Service 084de1
    if (lu == NULL || s->s3->tmp.cert == NULL) {
Packit Service 084de1
        SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_TLS_CONSTRUCT_CERT_VERIFY,
Packit Service 084de1
                 ERR_R_INTERNAL_ERROR);
Packit Service 084de1
        goto err;
Packit Service 084de1
    }
Packit Service 084de1
    pkey = s->s3->tmp.cert->privatekey;
Packit Service 084de1
Packit Service 084de1
    if (pkey == NULL || !tls1_lookup_md(lu, &md)) {
Packit Service 084de1
        SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_TLS_CONSTRUCT_CERT_VERIFY,
Packit Service 084de1
                 ERR_R_INTERNAL_ERROR);
Packit Service 084de1
        goto err;
Packit Service 084de1
    }
Packit Service 084de1
Packit Service 084de1
    mctx = EVP_MD_CTX_new();
Packit Service 084de1
    if (mctx == NULL) {
Packit Service 084de1
        SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_TLS_CONSTRUCT_CERT_VERIFY,
Packit Service 084de1
                 ERR_R_MALLOC_FAILURE);
Packit Service 084de1
        goto err;
Packit Service 084de1
    }
Packit Service 084de1
Packit Service 084de1
    /* Get the data to be signed */
Packit Service 084de1
    if (!get_cert_verify_tbs_data(s, tls13tbs, &hdata, &hdatalen)) {
Packit Service 084de1
        /* SSLfatal() already called */
Packit Service 084de1
        goto err;
Packit Service 084de1
    }
Packit Service 084de1
Packit Service 084de1
    if (SSL_USE_SIGALGS(s) && !WPACKET_put_bytes_u16(pkt, lu->sigalg)) {
Packit Service 084de1
        SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_TLS_CONSTRUCT_CERT_VERIFY,
Packit Service 084de1
                 ERR_R_INTERNAL_ERROR);
Packit Service 084de1
        goto err;
Packit Service 084de1
    }
Packit Service 084de1
    siglen = EVP_PKEY_size(pkey);
Packit Service 084de1
    sig = OPENSSL_malloc(siglen);
Packit Service 084de1
    if (sig == NULL) {
Packit Service 084de1
        SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_TLS_CONSTRUCT_CERT_VERIFY,
Packit Service 084de1
                 ERR_R_MALLOC_FAILURE);
Packit Service 084de1
        goto err;
Packit Service 084de1
    }
Packit Service 084de1
Packit Service 084de1
    if (EVP_DigestSignInit(mctx, &pctx, md, NULL, pkey) <= 0) {
Packit Service 084de1
        SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_TLS_CONSTRUCT_CERT_VERIFY,
Packit Service 084de1
                 ERR_R_EVP_LIB);
Packit Service 084de1
        goto err;
Packit Service 084de1
    }
Packit Service 084de1
Packit Service 084de1
    if (lu->sig == EVP_PKEY_RSA_PSS) {
Packit Service 084de1
        if (EVP_PKEY_CTX_set_rsa_padding(pctx, RSA_PKCS1_PSS_PADDING) <= 0
Packit Service 084de1
            || EVP_PKEY_CTX_set_rsa_pss_saltlen(pctx,
Packit Service 084de1
                                                RSA_PSS_SALTLEN_DIGEST) <= 0) {
Packit Service 084de1
            SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_TLS_CONSTRUCT_CERT_VERIFY,
Packit Service 084de1
                     ERR_R_EVP_LIB);
Packit Service 084de1
            goto err;
Packit Service 084de1
        }
Packit Service 084de1
    }
Packit Service 084de1
    if (s->version == SSL3_VERSION) {
Packit Service 084de1
        if (EVP_DigestSignUpdate(mctx, hdata, hdatalen) <= 0
Packit Service 084de1
            || !EVP_MD_CTX_ctrl(mctx, EVP_CTRL_SSL3_MASTER_SECRET,
Packit Service 084de1
                                (int)s->session->master_key_length,
Packit Service 084de1
                                s->session->master_key)
Packit Service 084de1
            || EVP_DigestSignFinal(mctx, sig, &siglen) <= 0) {
Packit Service 084de1
Packit Service 084de1
            SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_TLS_CONSTRUCT_CERT_VERIFY,
Packit Service 084de1
                     ERR_R_EVP_LIB);
Packit Service 084de1
            goto err;
Packit Service 084de1
        }
Packit Service 084de1
    } else if (EVP_DigestSign(mctx, sig, &siglen, hdata, hdatalen) <= 0) {
Packit Service 084de1
        SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_TLS_CONSTRUCT_CERT_VERIFY,
Packit Service 084de1
                 ERR_R_EVP_LIB);
Packit Service 084de1
        goto err;
Packit Service 084de1
    }
Packit Service 084de1
Packit Service 084de1
#ifndef OPENSSL_NO_GOST
Packit Service 084de1
    {
Packit Service 084de1
        int pktype = lu->sig;
Packit Service 084de1
Packit Service 084de1
        if (pktype == NID_id_GostR3410_2001
Packit Service 084de1
            || pktype == NID_id_GostR3410_2012_256
Packit Service 084de1
            || pktype == NID_id_GostR3410_2012_512)
Packit Service 084de1
            BUF_reverse(sig, NULL, siglen);
Packit Service 084de1
    }
Packit Service 084de1
#endif
Packit Service 084de1
Packit Service 084de1
    if (!WPACKET_sub_memcpy_u16(pkt, sig, siglen)) {
Packit Service 084de1
        SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_TLS_CONSTRUCT_CERT_VERIFY,
Packit Service 084de1
                 ERR_R_INTERNAL_ERROR);
Packit Service 084de1
        goto err;
Packit Service 084de1
    }
Packit Service 084de1
Packit Service 084de1
    /* Digest cached records and discard handshake buffer */
Packit Service 084de1
    if (!ssl3_digest_cached_records(s, 0)) {
Packit Service 084de1
        /* SSLfatal() already called */
Packit Service 084de1
        goto err;
Packit Service 084de1
    }
Packit Service 084de1
Packit Service 084de1
    OPENSSL_free(sig);
Packit Service 084de1
    EVP_MD_CTX_free(mctx);
Packit Service 084de1
    return 1;
Packit Service 084de1
 err:
Packit Service 084de1
    OPENSSL_free(sig);
Packit Service 084de1
    EVP_MD_CTX_free(mctx);
Packit Service 084de1
    return 0;
Packit Service 084de1
}
Packit Service 084de1
Packit Service 084de1
MSG_PROCESS_RETURN tls_process_cert_verify(SSL *s, PACKET *pkt)
Packit Service 084de1
{
Packit Service 084de1
    EVP_PKEY *pkey = NULL;
Packit Service 084de1
    const unsigned char *data;
Packit Service 084de1
#ifndef OPENSSL_NO_GOST
Packit Service 084de1
    unsigned char *gost_data = NULL;
Packit Service 084de1
#endif
Packit Service 084de1
    MSG_PROCESS_RETURN ret = MSG_PROCESS_ERROR;
Packit Service 084de1
    int j;
Packit Service 084de1
    unsigned int len;
Packit Service 084de1
    X509 *peer;
Packit Service 084de1
    const EVP_MD *md = NULL;
Packit Service 084de1
    size_t hdatalen = 0;
Packit Service 084de1
    void *hdata;
Packit Service 084de1
    unsigned char tls13tbs[TLS13_TBS_PREAMBLE_SIZE + EVP_MAX_MD_SIZE];
Packit Service 084de1
    EVP_MD_CTX *mctx = EVP_MD_CTX_new();
Packit Service 084de1
    EVP_PKEY_CTX *pctx = NULL;
Packit Service 084de1
Packit Service 084de1
    if (mctx == NULL) {
Packit Service 084de1
        SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_TLS_PROCESS_CERT_VERIFY,
Packit Service 084de1
                 ERR_R_MALLOC_FAILURE);
Packit Service 084de1
        goto err;
Packit Service 084de1
    }
Packit Service 084de1
Packit Service 084de1
    peer = s->session->peer;
Packit Service 084de1
    pkey = X509_get0_pubkey(peer);
Packit Service 084de1
    if (pkey == NULL) {
Packit Service 084de1
        SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_TLS_PROCESS_CERT_VERIFY,
Packit Service 084de1
                 ERR_R_INTERNAL_ERROR);
Packit Service 084de1
        goto err;
Packit Service 084de1
    }
Packit Service 084de1
Packit Service 084de1
    if (ssl_cert_lookup_by_pkey(pkey, NULL) == NULL) {
Packit Service 084de1
        SSLfatal(s, SSL_AD_ILLEGAL_PARAMETER, SSL_F_TLS_PROCESS_CERT_VERIFY,
Packit Service 084de1
                 SSL_R_SIGNATURE_FOR_NON_SIGNING_CERTIFICATE);
Packit Service 084de1
        goto err;
Packit Service 084de1
    }
Packit Service 084de1
Packit Service 084de1
    if (SSL_USE_SIGALGS(s)) {
Packit Service 084de1
        unsigned int sigalg;
Packit Service 084de1
Packit Service 084de1
        if (!PACKET_get_net_2(pkt, &sigalg)) {
Packit Service 084de1
            SSLfatal(s, SSL_AD_DECODE_ERROR, SSL_F_TLS_PROCESS_CERT_VERIFY,
Packit Service 084de1
                     SSL_R_BAD_PACKET);
Packit Service 084de1
            goto err;
Packit Service 084de1
        }
Packit Service 084de1
        if (tls12_check_peer_sigalg(s, sigalg, pkey) <= 0) {
Packit Service 084de1
            /* SSLfatal() already called */
Packit Service 084de1
            goto err;
Packit Service 084de1
        }
Packit Service 084de1
    } else if (!tls1_set_peer_legacy_sigalg(s, pkey)) {
Packit Service 084de1
            SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_TLS_PROCESS_CERT_VERIFY,
Packit Service 084de1
                     ERR_R_INTERNAL_ERROR);
Packit Service 084de1
            goto err;
Packit Service 084de1
    }
Packit Service 084de1
Packit Service 084de1
    if (!tls1_lookup_md(s->s3->tmp.peer_sigalg, &md)) {
Packit Service 084de1
        SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_TLS_PROCESS_CERT_VERIFY,
Packit Service 084de1
                 ERR_R_INTERNAL_ERROR);
Packit Service 084de1
        goto err;
Packit Service 084de1
    }
Packit Service 084de1
Packit Service 084de1
#ifdef SSL_DEBUG
Packit Service 084de1
    if (SSL_USE_SIGALGS(s))
Packit Service 084de1
        fprintf(stderr, "USING TLSv1.2 HASH %s\n",
Packit Service 084de1
                md == NULL ? "n/a" : EVP_MD_name(md));
Packit Service 084de1
#endif
Packit Service 084de1
Packit Service 084de1
    /* Check for broken implementations of GOST ciphersuites */
Packit Service 084de1
    /*
Packit Service 084de1
     * If key is GOST and len is exactly 64 or 128, it is signature without
Packit Service 084de1
     * length field (CryptoPro implementations at least till TLS 1.2)
Packit Service 084de1
     */
Packit Service 084de1
#ifndef OPENSSL_NO_GOST
Packit Service 084de1
    if (!SSL_USE_SIGALGS(s)
Packit Service 084de1
        && ((PACKET_remaining(pkt) == 64
Packit Service 084de1
             && (EVP_PKEY_id(pkey) == NID_id_GostR3410_2001
Packit Service 084de1
                 || EVP_PKEY_id(pkey) == NID_id_GostR3410_2012_256))
Packit Service 084de1
            || (PACKET_remaining(pkt) == 128
Packit Service 084de1
                && EVP_PKEY_id(pkey) == NID_id_GostR3410_2012_512))) {
Packit Service 084de1
        len = PACKET_remaining(pkt);
Packit Service 084de1
    } else
Packit Service 084de1
#endif
Packit Service 084de1
    if (!PACKET_get_net_2(pkt, &len)) {
Packit Service 084de1
        SSLfatal(s, SSL_AD_DECODE_ERROR, SSL_F_TLS_PROCESS_CERT_VERIFY,
Packit Service 084de1
                 SSL_R_LENGTH_MISMATCH);
Packit Service 084de1
        goto err;
Packit Service 084de1
    }
Packit Service 084de1
Packit Service 084de1
    j = EVP_PKEY_size(pkey);
Packit Service 084de1
    if (((int)len > j) || ((int)PACKET_remaining(pkt) > j)
Packit Service 084de1
        || (PACKET_remaining(pkt) == 0)) {
Packit Service 084de1
        SSLfatal(s, SSL_AD_DECODE_ERROR, SSL_F_TLS_PROCESS_CERT_VERIFY,
Packit Service 084de1
                 SSL_R_WRONG_SIGNATURE_SIZE);
Packit Service 084de1
        goto err;
Packit Service 084de1
    }
Packit Service 084de1
    if (!PACKET_get_bytes(pkt, &data, len)) {
Packit Service 084de1
        SSLfatal(s, SSL_AD_DECODE_ERROR, SSL_F_TLS_PROCESS_CERT_VERIFY,
Packit Service 084de1
                 SSL_R_LENGTH_MISMATCH);
Packit Service 084de1
        goto err;
Packit Service 084de1
    }
Packit Service 084de1
Packit Service 084de1
    if (!get_cert_verify_tbs_data(s, tls13tbs, &hdata, &hdatalen)) {
Packit Service 084de1
        /* SSLfatal() already called */
Packit Service 084de1
        goto err;
Packit Service 084de1
    }
Packit Service 084de1
Packit Service 084de1
#ifdef SSL_DEBUG
Packit Service 084de1
    fprintf(stderr, "Using client verify alg %s\n",
Packit Service 084de1
            md == NULL ? "n/a" : EVP_MD_name(md));
Packit Service 084de1
#endif
Packit Service 084de1
    if (EVP_DigestVerifyInit(mctx, &pctx, md, NULL, pkey) <= 0) {
Packit Service 084de1
        SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_TLS_PROCESS_CERT_VERIFY,
Packit Service 084de1
                 ERR_R_EVP_LIB);
Packit Service 084de1
        goto err;
Packit Service 084de1
    }
Packit Service 084de1
#ifndef OPENSSL_NO_GOST
Packit Service 084de1
    {
Packit Service 084de1
        int pktype = EVP_PKEY_id(pkey);
Packit Service 084de1
        if (pktype == NID_id_GostR3410_2001
Packit Service 084de1
            || pktype == NID_id_GostR3410_2012_256
Packit Service 084de1
            || pktype == NID_id_GostR3410_2012_512) {
Packit Service 084de1
            if ((gost_data = OPENSSL_malloc(len)) == NULL) {
Packit Service 084de1
                SSLfatal(s, SSL_AD_INTERNAL_ERROR,
Packit Service 084de1
                         SSL_F_TLS_PROCESS_CERT_VERIFY, ERR_R_MALLOC_FAILURE);
Packit Service 084de1
                goto err;
Packit Service 084de1
            }
Packit Service 084de1
            BUF_reverse(gost_data, data, len);
Packit Service 084de1
            data = gost_data;
Packit Service 084de1
        }
Packit Service 084de1
    }
Packit Service 084de1
#endif
Packit Service 084de1
Packit Service 084de1
    if (SSL_USE_PSS(s)) {
Packit Service 084de1
        if (EVP_PKEY_CTX_set_rsa_padding(pctx, RSA_PKCS1_PSS_PADDING) <= 0
Packit Service 084de1
            || EVP_PKEY_CTX_set_rsa_pss_saltlen(pctx,
Packit Service 084de1
                                                RSA_PSS_SALTLEN_DIGEST) <= 0) {
Packit Service 084de1
            SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_TLS_PROCESS_CERT_VERIFY,
Packit Service 084de1
                     ERR_R_EVP_LIB);
Packit Service 084de1
            goto err;
Packit Service 084de1
        }
Packit Service 084de1
    }
Packit Service 084de1
    if (s->version == SSL3_VERSION) {
Packit Service 084de1
        if (EVP_DigestVerifyUpdate(mctx, hdata, hdatalen) <= 0
Packit Service 084de1
                || !EVP_MD_CTX_ctrl(mctx, EVP_CTRL_SSL3_MASTER_SECRET,
Packit Service 084de1
                                    (int)s->session->master_key_length,
Packit Service 084de1
                                    s->session->master_key)) {
Packit Service 084de1
            SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_TLS_PROCESS_CERT_VERIFY,
Packit Service 084de1
                     ERR_R_EVP_LIB);
Packit Service 084de1
            goto err;
Packit Service 084de1
        }
Packit Service 084de1
        if (EVP_DigestVerifyFinal(mctx, data, len) <= 0) {
Packit Service 084de1
            SSLfatal(s, SSL_AD_DECRYPT_ERROR, SSL_F_TLS_PROCESS_CERT_VERIFY,
Packit Service 084de1
                     SSL_R_BAD_SIGNATURE);
Packit Service 084de1
            goto err;
Packit Service 084de1
        }
Packit Service 084de1
    } else {
Packit Service 084de1
        j = EVP_DigestVerify(mctx, data, len, hdata, hdatalen);
Packit Service 084de1
        if (j <= 0) {
Packit Service 084de1
            SSLfatal(s, SSL_AD_DECRYPT_ERROR, SSL_F_TLS_PROCESS_CERT_VERIFY,
Packit Service 084de1
                     SSL_R_BAD_SIGNATURE);
Packit Service 084de1
            goto err;
Packit Service 084de1
        }
Packit Service 084de1
    }
Packit Service 084de1
Packit Service 084de1
    /*
Packit Service 084de1
     * In TLSv1.3 on the client side we make sure we prepare the client
Packit Service 084de1
     * certificate after the CertVerify instead of when we get the
Packit Service 084de1
     * CertificateRequest. This is because in TLSv1.3 the CertificateRequest
Packit Service 084de1
     * comes *before* the Certificate message. In TLSv1.2 it comes after. We
Packit Service 084de1
     * want to make sure that SSL_get_peer_certificate() will return the actual
Packit Service 084de1
     * server certificate from the client_cert_cb callback.
Packit Service 084de1
     */
Packit Service 084de1
    if (!s->server && SSL_IS_TLS13(s) && s->s3->tmp.cert_req == 1)
Packit Service 084de1
        ret = MSG_PROCESS_CONTINUE_PROCESSING;
Packit Service 084de1
    else
Packit Service 084de1
        ret = MSG_PROCESS_CONTINUE_READING;
Packit Service 084de1
 err:
Packit Service 084de1
    BIO_free(s->s3->handshake_buffer);
Packit Service 084de1
    s->s3->handshake_buffer = NULL;
Packit Service 084de1
    EVP_MD_CTX_free(mctx);
Packit Service 084de1
#ifndef OPENSSL_NO_GOST
Packit Service 084de1
    OPENSSL_free(gost_data);
Packit Service 084de1
#endif
Packit Service 084de1
    return ret;
Packit Service 084de1
}
Packit Service 084de1
Packit Service 084de1
int tls_construct_finished(SSL *s, WPACKET *pkt)
Packit Service 084de1
{
Packit Service 084de1
    size_t finish_md_len;
Packit Service 084de1
    const char *sender;
Packit Service 084de1
    size_t slen;
Packit Service 084de1
Packit Service 084de1
    /* This is a real handshake so make sure we clean it up at the end */
Packit Service 084de1
    if (!s->server && s->post_handshake_auth != SSL_PHA_REQUESTED)
Packit Service 084de1
        s->statem.cleanuphand = 1;
Packit Service 084de1
Packit Service 084de1
    /*
Packit Service 084de1
     * We only change the keys if we didn't already do this when we sent the
Packit Service 084de1
     * client certificate
Packit Service 084de1
     */
Packit Service 084de1
    if (SSL_IS_TLS13(s)
Packit Service 084de1
            && !s->server
Packit Service 084de1
            && s->s3->tmp.cert_req == 0
Packit Service 084de1
            && (!s->method->ssl3_enc->change_cipher_state(s,
Packit Service 084de1
                    SSL3_CC_HANDSHAKE | SSL3_CHANGE_CIPHER_CLIENT_WRITE))) {;
Packit Service 084de1
        /* SSLfatal() already called */
Packit Service 084de1
        return 0;
Packit Service 084de1
    }
Packit Service 084de1
Packit Service 084de1
    if (s->server) {
Packit Service 084de1
        sender = s->method->ssl3_enc->server_finished_label;
Packit Service 084de1
        slen = s->method->ssl3_enc->server_finished_label_len;
Packit Service 084de1
    } else {
Packit Service 084de1
        sender = s->method->ssl3_enc->client_finished_label;
Packit Service 084de1
        slen = s->method->ssl3_enc->client_finished_label_len;
Packit Service 084de1
    }
Packit Service 084de1
Packit Service 084de1
    finish_md_len = s->method->ssl3_enc->final_finish_mac(s,
Packit Service 084de1
                                                          sender, slen,
Packit Service 084de1
                                                          s->s3->tmp.finish_md);
Packit Service 084de1
    if (finish_md_len == 0) {
Packit Service 084de1
        /* SSLfatal() already called */
Packit Service 084de1
        return 0;
Packit Service 084de1
    }
Packit Service 084de1
Packit Service 084de1
    s->s3->tmp.finish_md_len = finish_md_len;
Packit Service 084de1
Packit Service 084de1
    if (!WPACKET_memcpy(pkt, s->s3->tmp.finish_md, finish_md_len)) {
Packit Service 084de1
        SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_TLS_CONSTRUCT_FINISHED,
Packit Service 084de1
                 ERR_R_INTERNAL_ERROR);
Packit Service 084de1
        return 0;
Packit Service 084de1
    }
Packit Service 084de1
Packit Service 084de1
    /*
Packit Service 084de1
     * Log the master secret, if logging is enabled. We don't log it for
Packit Service 084de1
     * TLSv1.3: there's a different key schedule for that.
Packit Service 084de1
     */
Packit Service 084de1
    if (!SSL_IS_TLS13(s) && !ssl_log_secret(s, MASTER_SECRET_LABEL,
Packit Service 084de1
                                            s->session->master_key,
Packit Service 084de1
                                            s->session->master_key_length)) {
Packit Service 084de1
        /* SSLfatal() already called */
Packit Service 084de1
        return 0;
Packit Service 084de1
    }
Packit Service 084de1
Packit Service 084de1
    /*
Packit Service 084de1
     * Copy the finished so we can use it for renegotiation checks
Packit Service 084de1
     */
Packit Service 084de1
    if (!ossl_assert(finish_md_len <= EVP_MAX_MD_SIZE)) {
Packit Service 084de1
        SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_TLS_CONSTRUCT_FINISHED,
Packit Service 084de1
                 ERR_R_INTERNAL_ERROR);
Packit Service 084de1
        return 0;
Packit Service 084de1
    }
Packit Service 084de1
    if (!s->server) {
Packit Service 084de1
        memcpy(s->s3->previous_client_finished, s->s3->tmp.finish_md,
Packit Service 084de1
               finish_md_len);
Packit Service 084de1
        s->s3->previous_client_finished_len = finish_md_len;
Packit Service 084de1
    } else {
Packit Service 084de1
        memcpy(s->s3->previous_server_finished, s->s3->tmp.finish_md,
Packit Service 084de1
               finish_md_len);
Packit Service 084de1
        s->s3->previous_server_finished_len = finish_md_len;
Packit Service 084de1
    }
Packit Service 084de1
Packit Service 084de1
    return 1;
Packit Service 084de1
}
Packit Service 084de1
Packit Service 084de1
int tls_construct_key_update(SSL *s, WPACKET *pkt)
Packit Service 084de1
{
Packit Service 084de1
    if (!WPACKET_put_bytes_u8(pkt, s->key_update)) {
Packit Service 084de1
        SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_TLS_CONSTRUCT_KEY_UPDATE,
Packit Service 084de1
                 ERR_R_INTERNAL_ERROR);
Packit Service 084de1
        return 0;
Packit Service 084de1
    }
Packit Service 084de1
Packit Service 084de1
    s->key_update = SSL_KEY_UPDATE_NONE;
Packit Service 084de1
    return 1;
Packit Service 084de1
}
Packit Service 084de1
Packit Service 084de1
MSG_PROCESS_RETURN tls_process_key_update(SSL *s, PACKET *pkt)
Packit Service 084de1
{
Packit Service 084de1
    unsigned int updatetype;
Packit Service 084de1
Packit Service 084de1
    /*
Packit Service 084de1
     * A KeyUpdate message signals a key change so the end of the message must
Packit Service 084de1
     * be on a record boundary.
Packit Service 084de1
     */
Packit Service 084de1
    if (RECORD_LAYER_processed_read_pending(&s->rlayer)) {
Packit Service 084de1
        SSLfatal(s, SSL_AD_UNEXPECTED_MESSAGE, SSL_F_TLS_PROCESS_KEY_UPDATE,
Packit Service 084de1
                 SSL_R_NOT_ON_RECORD_BOUNDARY);
Packit Service 084de1
        return MSG_PROCESS_ERROR;
Packit Service 084de1
    }
Packit Service 084de1
Packit Service 084de1
    if (!PACKET_get_1(pkt, &updatetype)
Packit Service 084de1
            || PACKET_remaining(pkt) != 0) {
Packit Service 084de1
        SSLfatal(s, SSL_AD_DECODE_ERROR, SSL_F_TLS_PROCESS_KEY_UPDATE,
Packit Service 084de1
                 SSL_R_BAD_KEY_UPDATE);
Packit Service 084de1
        return MSG_PROCESS_ERROR;
Packit Service 084de1
    }
Packit Service 084de1
Packit Service 084de1
    /*
Packit Service 084de1
     * There are only two defined key update types. Fail if we get a value we
Packit Service 084de1
     * didn't recognise.
Packit Service 084de1
     */
Packit Service 084de1
    if (updatetype != SSL_KEY_UPDATE_NOT_REQUESTED
Packit Service 084de1
            && updatetype != SSL_KEY_UPDATE_REQUESTED) {
Packit Service 084de1
        SSLfatal(s, SSL_AD_ILLEGAL_PARAMETER, SSL_F_TLS_PROCESS_KEY_UPDATE,
Packit Service 084de1
                 SSL_R_BAD_KEY_UPDATE);
Packit Service 084de1
        return MSG_PROCESS_ERROR;
Packit Service 084de1
    }
Packit Service 084de1
Packit Service 084de1
    /*
Packit Service 084de1
     * If we get a request for us to update our sending keys too then, we need
Packit Service 084de1
     * to additionally send a KeyUpdate message. However that message should
Packit Service 084de1
     * not also request an update (otherwise we get into an infinite loop).
Packit Service 084de1
     */
Packit Service 084de1
    if (updatetype == SSL_KEY_UPDATE_REQUESTED)
Packit Service 084de1
        s->key_update = SSL_KEY_UPDATE_NOT_REQUESTED;
Packit Service 084de1
Packit Service 084de1
    if (!tls13_update_key(s, 0)) {
Packit Service 084de1
        /* SSLfatal() already called */
Packit Service 084de1
        return MSG_PROCESS_ERROR;
Packit Service 084de1
    }
Packit Service 084de1
Packit Service 084de1
    return MSG_PROCESS_FINISHED_READING;
Packit Service 084de1
}
Packit Service 084de1
Packit Service 084de1
/*
Packit Service 084de1
 * ssl3_take_mac calculates the Finished MAC for the handshakes messages seen
Packit Service 084de1
 * to far.
Packit Service 084de1
 */
Packit Service 084de1
int ssl3_take_mac(SSL *s)
Packit Service 084de1
{
Packit Service 084de1
    const char *sender;
Packit Service 084de1
    size_t slen;
Packit Service 084de1
Packit Service 084de1
    if (!s->server) {
Packit Service 084de1
        sender = s->method->ssl3_enc->server_finished_label;
Packit Service 084de1
        slen = s->method->ssl3_enc->server_finished_label_len;
Packit Service 084de1
    } else {
Packit Service 084de1
        sender = s->method->ssl3_enc->client_finished_label;
Packit Service 084de1
        slen = s->method->ssl3_enc->client_finished_label_len;
Packit Service 084de1
    }
Packit Service 084de1
Packit Service 084de1
    s->s3->tmp.peer_finish_md_len =
Packit Service 084de1
        s->method->ssl3_enc->final_finish_mac(s, sender, slen,
Packit Service 084de1
                                              s->s3->tmp.peer_finish_md);
Packit Service 084de1
Packit Service 084de1
    if (s->s3->tmp.peer_finish_md_len == 0) {
Packit Service 084de1
        /* SSLfatal() already called */
Packit Service 084de1
        return 0;
Packit Service 084de1
    }
Packit Service 084de1
Packit Service 084de1
    return 1;
Packit Service 084de1
}
Packit Service 084de1
Packit Service 084de1
MSG_PROCESS_RETURN tls_process_change_cipher_spec(SSL *s, PACKET *pkt)
Packit Service 084de1
{
Packit Service 084de1
    size_t remain;
Packit Service 084de1
Packit Service 084de1
    remain = PACKET_remaining(pkt);
Packit Service 084de1
    /*
Packit Service 084de1
     * 'Change Cipher Spec' is just a single byte, which should already have
Packit Service 084de1
     * been consumed by ssl_get_message() so there should be no bytes left,
Packit Service 084de1
     * unless we're using DTLS1_BAD_VER, which has an extra 2 bytes
Packit Service 084de1
     */
Packit Service 084de1
    if (SSL_IS_DTLS(s)) {
Packit Service 084de1
        if ((s->version == DTLS1_BAD_VER
Packit Service 084de1
             && remain != DTLS1_CCS_HEADER_LENGTH + 1)
Packit Service 084de1
            || (s->version != DTLS1_BAD_VER
Packit Service 084de1
                && remain != DTLS1_CCS_HEADER_LENGTH - 1)) {
Packit Service 084de1
            SSLfatal(s, SSL_AD_DECODE_ERROR,
Packit Service 084de1
                     SSL_F_TLS_PROCESS_CHANGE_CIPHER_SPEC,
Packit Service 084de1
                    SSL_R_BAD_CHANGE_CIPHER_SPEC);
Packit Service 084de1
            return MSG_PROCESS_ERROR;
Packit Service 084de1
        }
Packit Service 084de1
    } else {
Packit Service 084de1
        if (remain != 0) {
Packit Service 084de1
            SSLfatal(s, SSL_AD_DECODE_ERROR,
Packit Service 084de1
                     SSL_F_TLS_PROCESS_CHANGE_CIPHER_SPEC,
Packit Service 084de1
                     SSL_R_BAD_CHANGE_CIPHER_SPEC);
Packit Service 084de1
            return MSG_PROCESS_ERROR;
Packit Service 084de1
        }
Packit Service 084de1
    }
Packit Service 084de1
Packit Service 084de1
    /* Check we have a cipher to change to */
Packit Service 084de1
    if (s->s3->tmp.new_cipher == NULL) {
Packit Service 084de1
        SSLfatal(s, SSL_AD_UNEXPECTED_MESSAGE,
Packit Service 084de1
                 SSL_F_TLS_PROCESS_CHANGE_CIPHER_SPEC, SSL_R_CCS_RECEIVED_EARLY);
Packit Service 084de1
        return MSG_PROCESS_ERROR;
Packit Service 084de1
    }
Packit Service 084de1
Packit Service 084de1
    s->s3->change_cipher_spec = 1;
Packit Service 084de1
    if (!ssl3_do_change_cipher_spec(s)) {
Packit Service 084de1
        SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_TLS_PROCESS_CHANGE_CIPHER_SPEC,
Packit Service 084de1
                 ERR_R_INTERNAL_ERROR);
Packit Service 084de1
        return MSG_PROCESS_ERROR;
Packit Service 084de1
    }
Packit Service 084de1
Packit Service 084de1
    if (SSL_IS_DTLS(s)) {
Packit Service 084de1
        dtls1_reset_seq_numbers(s, SSL3_CC_READ);
Packit Service 084de1
Packit Service 084de1
        if (s->version == DTLS1_BAD_VER)
Packit Service 084de1
            s->d1->handshake_read_seq++;
Packit Service 084de1
Packit Service 084de1
#ifndef OPENSSL_NO_SCTP
Packit Service 084de1
        /*
Packit Service 084de1
         * Remember that a CCS has been received, so that an old key of
Packit Service 084de1
         * SCTP-Auth can be deleted when a CCS is sent. Will be ignored if no
Packit Service 084de1
         * SCTP is used
Packit Service 084de1
         */
Packit Service 084de1
        BIO_ctrl(SSL_get_wbio(s), BIO_CTRL_DGRAM_SCTP_AUTH_CCS_RCVD, 1, NULL);
Packit Service 084de1
#endif
Packit Service 084de1
    }
Packit Service 084de1
Packit Service 084de1
    return MSG_PROCESS_CONTINUE_READING;
Packit Service 084de1
}
Packit Service 084de1
Packit Service 084de1
MSG_PROCESS_RETURN tls_process_finished(SSL *s, PACKET *pkt)
Packit Service 084de1
{
Packit Service 084de1
    size_t md_len;
Packit Service 084de1
Packit Service 084de1
Packit Service 084de1
    /* This is a real handshake so make sure we clean it up at the end */
Packit Service 084de1
    if (s->server) {
Packit Service 084de1
        /*
Packit Service 084de1
        * To get this far we must have read encrypted data from the client. We
Packit Service 084de1
        * no longer tolerate unencrypted alerts. This value is ignored if less
Packit Service 084de1
        * than TLSv1.3
Packit Service 084de1
        */
Packit Service 084de1
        s->statem.enc_read_state = ENC_READ_STATE_VALID;
Packit Service 084de1
        if (s->post_handshake_auth != SSL_PHA_REQUESTED)
Packit Service 084de1
            s->statem.cleanuphand = 1;
Packit Service 084de1
        if (SSL_IS_TLS13(s) && !tls13_save_handshake_digest_for_pha(s)) {
Packit Service 084de1
                /* SSLfatal() already called */
Packit Service 084de1
                return MSG_PROCESS_ERROR;
Packit Service 084de1
        }
Packit Service 084de1
    }
Packit Service 084de1
Packit Service 084de1
    /*
Packit Service 084de1
     * In TLSv1.3 a Finished message signals a key change so the end of the
Packit Service 084de1
     * message must be on a record boundary.
Packit Service 084de1
     */
Packit Service 084de1
    if (SSL_IS_TLS13(s) && RECORD_LAYER_processed_read_pending(&s->rlayer)) {
Packit Service 084de1
        SSLfatal(s, SSL_AD_UNEXPECTED_MESSAGE, SSL_F_TLS_PROCESS_FINISHED,
Packit Service 084de1
                 SSL_R_NOT_ON_RECORD_BOUNDARY);
Packit Service 084de1
        return MSG_PROCESS_ERROR;
Packit Service 084de1
    }
Packit Service 084de1
Packit Service 084de1
    /* If this occurs, we have missed a message */
Packit Service 084de1
    if (!SSL_IS_TLS13(s) && !s->s3->change_cipher_spec) {
Packit Service 084de1
        SSLfatal(s, SSL_AD_UNEXPECTED_MESSAGE, SSL_F_TLS_PROCESS_FINISHED,
Packit Service 084de1
                 SSL_R_GOT_A_FIN_BEFORE_A_CCS);
Packit Service 084de1
        return MSG_PROCESS_ERROR;
Packit Service 084de1
    }
Packit Service 084de1
    s->s3->change_cipher_spec = 0;
Packit Service 084de1
Packit Service 084de1
    md_len = s->s3->tmp.peer_finish_md_len;
Packit Service 084de1
Packit Service 084de1
    if (md_len != PACKET_remaining(pkt)) {
Packit Service 084de1
        SSLfatal(s, SSL_AD_DECODE_ERROR, SSL_F_TLS_PROCESS_FINISHED,
Packit Service 084de1
                 SSL_R_BAD_DIGEST_LENGTH);
Packit Service 084de1
        return MSG_PROCESS_ERROR;
Packit Service 084de1
    }
Packit Service 084de1
Packit Service 084de1
    if (CRYPTO_memcmp(PACKET_data(pkt), s->s3->tmp.peer_finish_md,
Packit Service 084de1
                      md_len) != 0) {
Packit Service 084de1
        SSLfatal(s, SSL_AD_DECRYPT_ERROR, SSL_F_TLS_PROCESS_FINISHED,
Packit Service 084de1
                 SSL_R_DIGEST_CHECK_FAILED);
Packit Service 084de1
        return MSG_PROCESS_ERROR;
Packit Service 084de1
    }
Packit Service 084de1
Packit Service 084de1
    /*
Packit Service 084de1
     * Copy the finished so we can use it for renegotiation checks
Packit Service 084de1
     */
Packit Service 084de1
    if (!ossl_assert(md_len <= EVP_MAX_MD_SIZE)) {
Packit Service 084de1
        SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_TLS_PROCESS_FINISHED,
Packit Service 084de1
                 ERR_R_INTERNAL_ERROR);
Packit Service 084de1
        return MSG_PROCESS_ERROR;
Packit Service 084de1
    }
Packit Service 084de1
    if (s->server) {
Packit Service 084de1
        memcpy(s->s3->previous_client_finished, s->s3->tmp.peer_finish_md,
Packit Service 084de1
               md_len);
Packit Service 084de1
        s->s3->previous_client_finished_len = md_len;
Packit Service 084de1
    } else {
Packit Service 084de1
        memcpy(s->s3->previous_server_finished, s->s3->tmp.peer_finish_md,
Packit Service 084de1
               md_len);
Packit Service 084de1
        s->s3->previous_server_finished_len = md_len;
Packit Service 084de1
    }
Packit Service 084de1
Packit Service 084de1
    /*
Packit Service 084de1
     * In TLS1.3 we also have to change cipher state and do any final processing
Packit Service 084de1
     * of the initial server flight (if we are a client)
Packit Service 084de1
     */
Packit Service 084de1
    if (SSL_IS_TLS13(s)) {
Packit Service 084de1
        if (s->server) {
Packit Service 084de1
            if (s->post_handshake_auth != SSL_PHA_REQUESTED &&
Packit Service 084de1
                    !s->method->ssl3_enc->change_cipher_state(s,
Packit Service 084de1
                    SSL3_CC_APPLICATION | SSL3_CHANGE_CIPHER_SERVER_READ)) {
Packit Service 084de1
                /* SSLfatal() already called */
Packit Service 084de1
                return MSG_PROCESS_ERROR;
Packit Service 084de1
            }
Packit Service 084de1
        } else {
Packit Service 084de1
            /* TLS 1.3 gets the secret size from the handshake md */
Packit Service 084de1
            size_t dummy;
Packit Service 084de1
            if (!s->method->ssl3_enc->generate_master_secret(s,
Packit Service 084de1
                    s->master_secret, s->handshake_secret, 0,
Packit Service 084de1
                    &dummy)) {
Packit Service 084de1
                /* SSLfatal() already called */
Packit Service 084de1
                return MSG_PROCESS_ERROR;
Packit Service 084de1
            }
Packit Service 084de1
            if (!s->method->ssl3_enc->change_cipher_state(s,
Packit Service 084de1
                    SSL3_CC_APPLICATION | SSL3_CHANGE_CIPHER_CLIENT_READ)) {
Packit Service 084de1
                /* SSLfatal() already called */
Packit Service 084de1
                return MSG_PROCESS_ERROR;
Packit Service 084de1
            }
Packit Service 084de1
            if (!tls_process_initial_server_flight(s)) {
Packit Service 084de1
                /* SSLfatal() already called */
Packit Service 084de1
                return MSG_PROCESS_ERROR;
Packit Service 084de1
            }
Packit Service 084de1
        }
Packit Service 084de1
    }
Packit Service 084de1
Packit Service 084de1
    return MSG_PROCESS_FINISHED_READING;
Packit Service 084de1
}
Packit Service 084de1
Packit Service 084de1
int tls_construct_change_cipher_spec(SSL *s, WPACKET *pkt)
Packit Service 084de1
{
Packit Service 084de1
    if (!WPACKET_put_bytes_u8(pkt, SSL3_MT_CCS)) {
Packit Service 084de1
        SSLfatal(s, SSL_AD_INTERNAL_ERROR,
Packit Service 084de1
                 SSL_F_TLS_CONSTRUCT_CHANGE_CIPHER_SPEC, ERR_R_INTERNAL_ERROR);
Packit Service 084de1
        return 0;
Packit Service 084de1
    }
Packit Service 084de1
Packit Service 084de1
    return 1;
Packit Service 084de1
}
Packit Service 084de1
Packit Service 084de1
/* Add a certificate to the WPACKET */
Packit Service 084de1
static int ssl_add_cert_to_wpacket(SSL *s, WPACKET *pkt, X509 *x, int chain)
Packit Service 084de1
{
Packit Service 084de1
    int len;
Packit Service 084de1
    unsigned char *outbytes;
Packit Service 084de1
Packit Service 084de1
    len = i2d_X509(x, NULL);
Packit Service 084de1
    if (len < 0) {
Packit Service 084de1
        SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_SSL_ADD_CERT_TO_WPACKET,
Packit Service 084de1
                 ERR_R_BUF_LIB);
Packit Service 084de1
        return 0;
Packit Service 084de1
    }
Packit Service 084de1
    if (!WPACKET_sub_allocate_bytes_u24(pkt, len, &outbytes)
Packit Service 084de1
            || i2d_X509(x, &outbytes) != len) {
Packit Service 084de1
        SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_SSL_ADD_CERT_TO_WPACKET,
Packit Service 084de1
                 ERR_R_INTERNAL_ERROR);
Packit Service 084de1
        return 0;
Packit Service 084de1
    }
Packit Service 084de1
Packit Service 084de1
    if (SSL_IS_TLS13(s)
Packit Service 084de1
            && !tls_construct_extensions(s, pkt, SSL_EXT_TLS1_3_CERTIFICATE, x,
Packit Service 084de1
                                         chain)) {
Packit Service 084de1
        /* SSLfatal() already called */
Packit Service 084de1
        return 0;
Packit Service 084de1
    }
Packit Service 084de1
Packit Service 084de1
    return 1;
Packit Service 084de1
}
Packit Service 084de1
Packit Service 084de1
/* Add certificate chain to provided WPACKET */
Packit Service 084de1
static int ssl_add_cert_chain(SSL *s, WPACKET *pkt, CERT_PKEY *cpk)
Packit Service 084de1
{
Packit Service 084de1
    int i, chain_count;
Packit Service 084de1
    X509 *x;
Packit Service 084de1
    STACK_OF(X509) *extra_certs;
Packit Service 084de1
    STACK_OF(X509) *chain = NULL;
Packit Service 084de1
    X509_STORE *chain_store;
Packit Service 084de1
Packit Service 084de1
    if (cpk == NULL || cpk->x509 == NULL)
Packit Service 084de1
        return 1;
Packit Service 084de1
Packit Service 084de1
    x = cpk->x509;
Packit Service 084de1
Packit Service 084de1
    /*
Packit Service 084de1
     * If we have a certificate specific chain use it, else use parent ctx.
Packit Service 084de1
     */
Packit Service 084de1
    if (cpk->chain != NULL)
Packit Service 084de1
        extra_certs = cpk->chain;
Packit Service 084de1
    else
Packit Service 084de1
        extra_certs = s->ctx->extra_certs;
Packit Service 084de1
Packit Service 084de1
    if ((s->mode & SSL_MODE_NO_AUTO_CHAIN) || extra_certs)
Packit Service 084de1
        chain_store = NULL;
Packit Service 084de1
    else if (s->cert->chain_store)
Packit Service 084de1
        chain_store = s->cert->chain_store;
Packit Service 084de1
    else
Packit Service 084de1
        chain_store = s->ctx->cert_store;
Packit Service 084de1
Packit Service 084de1
    if (chain_store != NULL) {
Packit Service 084de1
        X509_STORE_CTX *xs_ctx = X509_STORE_CTX_new();
Packit Service 084de1
Packit Service 084de1
        if (xs_ctx == NULL) {
Packit Service 084de1
            SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_SSL_ADD_CERT_CHAIN,
Packit Service 084de1
                     ERR_R_MALLOC_FAILURE);
Packit Service 084de1
            return 0;
Packit Service 084de1
        }
Packit Service 084de1
        if (!X509_STORE_CTX_init(xs_ctx, chain_store, x, NULL)) {
Packit Service 084de1
            X509_STORE_CTX_free(xs_ctx);
Packit Service 084de1
            SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_SSL_ADD_CERT_CHAIN,
Packit Service 084de1
                     ERR_R_X509_LIB);
Packit Service 084de1
            return 0;
Packit Service 084de1
        }
Packit Service 084de1
        /*
Packit Service 084de1
         * It is valid for the chain not to be complete (because normally we
Packit Service 084de1
         * don't include the root cert in the chain). Therefore we deliberately
Packit Service 084de1
         * ignore the error return from this call. We're not actually verifying
Packit Service 084de1
         * the cert - we're just building as much of the chain as we can
Packit Service 084de1
         */
Packit Service 084de1
        (void)X509_verify_cert(xs_ctx);
Packit Service 084de1
        /* Don't leave errors in the queue */
Packit Service 084de1
        ERR_clear_error();
Packit Service 084de1
        chain = X509_STORE_CTX_get0_chain(xs_ctx);
Packit Service 084de1
        i = ssl_security_cert_chain(s, chain, NULL, 0);
Packit Service 084de1
        if (i != 1) {
Packit Service 084de1
#if 0
Packit Service 084de1
            /* Dummy error calls so mkerr generates them */
Packit Service 084de1
            SSLerr(SSL_F_SSL_ADD_CERT_CHAIN, SSL_R_EE_KEY_TOO_SMALL);
Packit Service 084de1
            SSLerr(SSL_F_SSL_ADD_CERT_CHAIN, SSL_R_CA_KEY_TOO_SMALL);
Packit Service 084de1
            SSLerr(SSL_F_SSL_ADD_CERT_CHAIN, SSL_R_CA_MD_TOO_WEAK);
Packit Service 084de1
#endif
Packit Service 084de1
            X509_STORE_CTX_free(xs_ctx);
Packit Service 084de1
            SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_SSL_ADD_CERT_CHAIN, i);
Packit Service 084de1
            return 0;
Packit Service 084de1
        }
Packit Service 084de1
        chain_count = sk_X509_num(chain);
Packit Service 084de1
        for (i = 0; i < chain_count; i++) {
Packit Service 084de1
            x = sk_X509_value(chain, i);
Packit Service 084de1
Packit Service 084de1
            if (!ssl_add_cert_to_wpacket(s, pkt, x, i)) {
Packit Service 084de1
                /* SSLfatal() already called */
Packit Service 084de1
                X509_STORE_CTX_free(xs_ctx);
Packit Service 084de1
                return 0;
Packit Service 084de1
            }
Packit Service 084de1
        }
Packit Service 084de1
        X509_STORE_CTX_free(xs_ctx);
Packit Service 084de1
    } else {
Packit Service 084de1
        i = ssl_security_cert_chain(s, extra_certs, x, 0);
Packit Service 084de1
        if (i != 1) {
Packit Service 084de1
            SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_SSL_ADD_CERT_CHAIN, i);
Packit Service 084de1
            return 0;
Packit Service 084de1
        }
Packit Service 084de1
        if (!ssl_add_cert_to_wpacket(s, pkt, x, 0)) {
Packit Service 084de1
            /* SSLfatal() already called */
Packit Service 084de1
            return 0;
Packit Service 084de1
        }
Packit Service 084de1
        for (i = 0; i < sk_X509_num(extra_certs); i++) {
Packit Service 084de1
            x = sk_X509_value(extra_certs, i);
Packit Service 084de1
            if (!ssl_add_cert_to_wpacket(s, pkt, x, i + 1)) {
Packit Service 084de1
                /* SSLfatal() already called */
Packit Service 084de1
                return 0;
Packit Service 084de1
            }
Packit Service 084de1
        }
Packit Service 084de1
    }
Packit Service 084de1
    return 1;
Packit Service 084de1
}
Packit Service 084de1
Packit Service 084de1
unsigned long ssl3_output_cert_chain(SSL *s, WPACKET *pkt, CERT_PKEY *cpk)
Packit Service 084de1
{
Packit Service 084de1
    if (!WPACKET_start_sub_packet_u24(pkt)) {
Packit Service 084de1
        SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_SSL3_OUTPUT_CERT_CHAIN,
Packit Service 084de1
                 ERR_R_INTERNAL_ERROR);
Packit Service 084de1
        return 0;
Packit Service 084de1
    }
Packit Service 084de1
Packit Service 084de1
    if (!ssl_add_cert_chain(s, pkt, cpk))
Packit Service 084de1
        return 0;
Packit Service 084de1
Packit Service 084de1
    if (!WPACKET_close(pkt)) {
Packit Service 084de1
        SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_SSL3_OUTPUT_CERT_CHAIN,
Packit Service 084de1
                 ERR_R_INTERNAL_ERROR);
Packit Service 084de1
        return 0;
Packit Service 084de1
    }
Packit Service 084de1
Packit Service 084de1
    return 1;
Packit Service 084de1
}
Packit Service 084de1
Packit Service 084de1
/*
Packit Service 084de1
 * Tidy up after the end of a handshake. In the case of SCTP this may result
Packit Service 084de1
 * in NBIO events. If |clearbufs| is set then init_buf and the wbio buffer is
Packit Service 084de1
 * freed up as well.
Packit Service 084de1
 */
Packit Service 084de1
WORK_STATE tls_finish_handshake(SSL *s, WORK_STATE wst, int clearbufs, int stop)
Packit Service 084de1
{
Packit Service 084de1
    void (*cb) (const SSL *ssl, int type, int val) = NULL;
Packit Service 084de1
    int cleanuphand = s->statem.cleanuphand;
Packit Service 084de1
Packit Service 084de1
    if (clearbufs) {
Packit Service 084de1
        if (!SSL_IS_DTLS(s)
Packit Service 084de1
#ifndef OPENSSL_NO_SCTP
Packit Service 084de1
            /*
Packit Service 084de1
             * RFC6083: SCTP provides a reliable and in-sequence transport service for DTLS
Packit Service 084de1
             * messages that require it. Therefore, DTLS procedures for retransmissions
Packit Service 084de1
             * MUST NOT be used.
Packit Service 084de1
             * Hence the init_buf can be cleared when DTLS over SCTP as transport is used.
Packit Service 084de1
             */
Packit Service 084de1
            || BIO_dgram_is_sctp(SSL_get_wbio(s))
Packit Service 084de1
#endif
Packit Service 084de1
            ) {
Packit Service 084de1
            /*
Packit Service 084de1
             * We don't do this in DTLS over UDP because we may still need the init_buf
Packit Service 084de1
             * in case there are any unexpected retransmits
Packit Service 084de1
             */
Packit Service 084de1
            BUF_MEM_free(s->init_buf);
Packit Service 084de1
            s->init_buf = NULL;
Packit Service 084de1
        }
Packit Service 084de1
Packit Service 084de1
        if (!ssl_free_wbio_buffer(s)) {
Packit Service 084de1
            SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_TLS_FINISH_HANDSHAKE,
Packit Service 084de1
                     ERR_R_INTERNAL_ERROR);
Packit Service 084de1
            return WORK_ERROR;
Packit Service 084de1
        }
Packit Service 084de1
        s->init_num = 0;
Packit Service 084de1
    }
Packit Service 084de1
Packit Service 084de1
    if (SSL_IS_TLS13(s) && !s->server
Packit Service 084de1
            && s->post_handshake_auth == SSL_PHA_REQUESTED)
Packit Service 084de1
        s->post_handshake_auth = SSL_PHA_EXT_SENT;
Packit Service 084de1
Packit Service 084de1
    /*
Packit Service 084de1
     * Only set if there was a Finished message and this isn't after a TLSv1.3
Packit Service 084de1
     * post handshake exchange
Packit Service 084de1
     */
Packit Service 084de1
    if (cleanuphand) {
Packit Service 084de1
        /* skipped if we just sent a HelloRequest */
Packit Service 084de1
        s->renegotiate = 0;
Packit Service 084de1
        s->new_session = 0;
Packit Service 084de1
        s->statem.cleanuphand = 0;
Packit Service 084de1
        s->ext.ticket_expected = 0;
Packit Service 084de1
Packit Service 084de1
        ssl3_cleanup_key_block(s);
Packit Service 084de1
Packit Service 084de1
        if (s->server) {
Packit Service 084de1
            /*
Packit Service 084de1
             * In TLSv1.3 we update the cache as part of constructing the
Packit Service 084de1
             * NewSessionTicket
Packit Service 084de1
             */
Packit Service 084de1
            if (!SSL_IS_TLS13(s))
Packit Service 084de1
                ssl_update_cache(s, SSL_SESS_CACHE_SERVER);
Packit Service 084de1
Packit Service 084de1
            /* N.B. s->ctx may not equal s->session_ctx */
Packit Service 084de1
            tsan_counter(&s->ctx->stats.sess_accept_good);
Packit Service 084de1
            s->handshake_func = ossl_statem_accept;
Packit Service 084de1
        } else {
Packit Service 084de1
            if (SSL_IS_TLS13(s)) {
Packit Service 084de1
                /*
Packit Service 084de1
                 * We encourage applications to only use TLSv1.3 tickets once,
Packit Service 084de1
                 * so we remove this one from the cache.
Packit Service 084de1
                 */
Packit Service 084de1
                if ((s->session_ctx->session_cache_mode
Packit Service 084de1
                     & SSL_SESS_CACHE_CLIENT) != 0)
Packit Service 084de1
                    SSL_CTX_remove_session(s->session_ctx, s->session);
Packit Service 084de1
            } else {
Packit Service 084de1
                /*
Packit Service 084de1
                 * In TLSv1.3 we update the cache as part of processing the
Packit Service 084de1
                 * NewSessionTicket
Packit Service 084de1
                 */
Packit Service 084de1
                ssl_update_cache(s, SSL_SESS_CACHE_CLIENT);
Packit Service 084de1
            }
Packit Service 084de1
            if (s->hit)
Packit Service 084de1
                tsan_counter(&s->session_ctx->stats.sess_hit);
Packit Service 084de1
Packit Service 084de1
            s->handshake_func = ossl_statem_connect;
Packit Service 084de1
            tsan_counter(&s->session_ctx->stats.sess_connect_good);
Packit Service 084de1
        }
Packit Service 084de1
Packit Service 084de1
        if (SSL_IS_DTLS(s)) {
Packit Service 084de1
            /* done with handshaking */
Packit Service 084de1
            s->d1->handshake_read_seq = 0;
Packit Service 084de1
            s->d1->handshake_write_seq = 0;
Packit Service 084de1
            s->d1->next_handshake_write_seq = 0;
Packit Service 084de1
            dtls1_clear_received_buffer(s);
Packit Service 084de1
        }
Packit Service 084de1
    }
Packit Service 084de1
Packit Service 084de1
    if (s->info_callback != NULL)
Packit Service 084de1
        cb = s->info_callback;
Packit Service 084de1
    else if (s->ctx->info_callback != NULL)
Packit Service 084de1
        cb = s->ctx->info_callback;
Packit Service 084de1
Packit Service 084de1
    /* The callback may expect us to not be in init at handshake done */
Packit Service 084de1
    ossl_statem_set_in_init(s, 0);
Packit Service 084de1
Packit Service 084de1
    if (cb != NULL) {
Packit Service 084de1
        if (cleanuphand
Packit Service 084de1
                || !SSL_IS_TLS13(s)
Packit Service 084de1
                || SSL_IS_FIRST_HANDSHAKE(s))
Packit Service 084de1
            cb(s, SSL_CB_HANDSHAKE_DONE, 1);
Packit Service 084de1
    }
Packit Service 084de1
Packit Service 084de1
    if (!stop) {
Packit Service 084de1
        /* If we've got more work to do we go back into init */
Packit Service 084de1
        ossl_statem_set_in_init(s, 1);
Packit Service 084de1
        return WORK_FINISHED_CONTINUE;
Packit Service 084de1
    }
Packit Service 084de1
Packit Service 084de1
    return WORK_FINISHED_STOP;
Packit Service 084de1
}
Packit Service 084de1
Packit Service 084de1
int tls_get_message_header(SSL *s, int *mt)
Packit Service 084de1
{
Packit Service 084de1
    /* s->init_num < SSL3_HM_HEADER_LENGTH */
Packit Service 084de1
    int skip_message, i, recvd_type;
Packit Service 084de1
    unsigned char *p;
Packit Service 084de1
    size_t l, readbytes;
Packit Service 084de1
Packit Service 084de1
    p = (unsigned char *)s->init_buf->data;
Packit Service 084de1
Packit Service 084de1
    do {
Packit Service 084de1
        while (s->init_num < SSL3_HM_HEADER_LENGTH) {
Packit Service 084de1
            i = s->method->ssl_read_bytes(s, SSL3_RT_HANDSHAKE, &recvd_type,
Packit Service 084de1
                                          &p[s->init_num],
Packit Service 084de1
                                          SSL3_HM_HEADER_LENGTH - s->init_num,
Packit Service 084de1
                                          0, &readbytes);
Packit Service 084de1
            if (i <= 0) {
Packit Service 084de1
                s->rwstate = SSL_READING;
Packit Service 084de1
                return 0;
Packit Service 084de1
            }
Packit Service 084de1
            if (recvd_type == SSL3_RT_CHANGE_CIPHER_SPEC) {
Packit Service 084de1
                /*
Packit Service 084de1
                 * A ChangeCipherSpec must be a single byte and may not occur
Packit Service 084de1
                 * in the middle of a handshake message.
Packit Service 084de1
                 */
Packit Service 084de1
                if (s->init_num != 0 || readbytes != 1 || p[0] != SSL3_MT_CCS) {
Packit Service 084de1
                    SSLfatal(s, SSL_AD_UNEXPECTED_MESSAGE,
Packit Service 084de1
                             SSL_F_TLS_GET_MESSAGE_HEADER,
Packit Service 084de1
                             SSL_R_BAD_CHANGE_CIPHER_SPEC);
Packit Service 084de1
                    return 0;
Packit Service 084de1
                }
Packit Service 084de1
                if (s->statem.hand_state == TLS_ST_BEFORE
Packit Service 084de1
                        && (s->s3->flags & TLS1_FLAGS_STATELESS) != 0) {
Packit Service 084de1
                    /*
Packit Service 084de1
                     * We are stateless and we received a CCS. Probably this is
Packit Service 084de1
                     * from a client between the first and second ClientHellos.
Packit Service 084de1
                     * We should ignore this, but return an error because we do
Packit Service 084de1
                     * not return success until we see the second ClientHello
Packit Service 084de1
                     * with a valid cookie.
Packit Service 084de1
                     */
Packit Service 084de1
                    return 0;
Packit Service 084de1
                }
Packit Service 084de1
                s->s3->tmp.message_type = *mt = SSL3_MT_CHANGE_CIPHER_SPEC;
Packit Service 084de1
                s->init_num = readbytes - 1;
Packit Service 084de1
                s->init_msg = s->init_buf->data;
Packit Service 084de1
                s->s3->tmp.message_size = readbytes;
Packit Service 084de1
                return 1;
Packit Service 084de1
            } else if (recvd_type != SSL3_RT_HANDSHAKE) {
Packit Service 084de1
                SSLfatal(s, SSL_AD_UNEXPECTED_MESSAGE,
Packit Service 084de1
                         SSL_F_TLS_GET_MESSAGE_HEADER,
Packit Service 084de1
                         SSL_R_CCS_RECEIVED_EARLY);
Packit Service 084de1
                return 0;
Packit Service 084de1
            }
Packit Service 084de1
            s->init_num += readbytes;
Packit Service 084de1
        }
Packit Service 084de1
Packit Service 084de1
        skip_message = 0;
Packit Service 084de1
        if (!s->server)
Packit Service 084de1
            if (s->statem.hand_state != TLS_ST_OK
Packit Service 084de1
                    && p[0] == SSL3_MT_HELLO_REQUEST)
Packit Service 084de1
                /*
Packit Service 084de1
                 * The server may always send 'Hello Request' messages --
Packit Service 084de1
                 * we are doing a handshake anyway now, so ignore them if
Packit Service 084de1
                 * their format is correct. Does not count for 'Finished'
Packit Service 084de1
                 * MAC.
Packit Service 084de1
                 */
Packit Service 084de1
                if (p[1] == 0 && p[2] == 0 && p[3] == 0) {
Packit Service 084de1
                    s->init_num = 0;
Packit Service 084de1
                    skip_message = 1;
Packit Service 084de1
Packit Service 084de1
                    if (s->msg_callback)
Packit Service 084de1
                        s->msg_callback(0, s->version, SSL3_RT_HANDSHAKE,
Packit Service 084de1
                                        p, SSL3_HM_HEADER_LENGTH, s,
Packit Service 084de1
                                        s->msg_callback_arg);
Packit Service 084de1
                }
Packit Service 084de1
    } while (skip_message);
Packit Service 084de1
    /* s->init_num == SSL3_HM_HEADER_LENGTH */
Packit Service 084de1
Packit Service 084de1
    *mt = *p;
Packit Service 084de1
    s->s3->tmp.message_type = *(p++);
Packit Service 084de1
Packit Service 084de1
    if (RECORD_LAYER_is_sslv2_record(&s->rlayer)) {
Packit Service 084de1
        /*
Packit Service 084de1
         * Only happens with SSLv3+ in an SSLv2 backward compatible
Packit Service 084de1
         * ClientHello
Packit Service 084de1
         *
Packit Service 084de1
         * Total message size is the remaining record bytes to read
Packit Service 084de1
         * plus the SSL3_HM_HEADER_LENGTH bytes that we already read
Packit Service 084de1
         */
Packit Service 084de1
        l = RECORD_LAYER_get_rrec_length(&s->rlayer)
Packit Service 084de1
            + SSL3_HM_HEADER_LENGTH;
Packit Service 084de1
        s->s3->tmp.message_size = l;
Packit Service 084de1
Packit Service 084de1
        s->init_msg = s->init_buf->data;
Packit Service 084de1
        s->init_num = SSL3_HM_HEADER_LENGTH;
Packit Service 084de1
    } else {
Packit Service 084de1
        n2l3(p, l);
Packit Service 084de1
        /* BUF_MEM_grow takes an 'int' parameter */
Packit Service 084de1
        if (l > (INT_MAX - SSL3_HM_HEADER_LENGTH)) {
Packit Service 084de1
            SSLfatal(s, SSL_AD_ILLEGAL_PARAMETER, SSL_F_TLS_GET_MESSAGE_HEADER,
Packit Service 084de1
                     SSL_R_EXCESSIVE_MESSAGE_SIZE);
Packit Service 084de1
            return 0;
Packit Service 084de1
        }
Packit Service 084de1
        s->s3->tmp.message_size = l;
Packit Service 084de1
Packit Service 084de1
        s->init_msg = s->init_buf->data + SSL3_HM_HEADER_LENGTH;
Packit Service 084de1
        s->init_num = 0;
Packit Service 084de1
    }
Packit Service 084de1
Packit Service 084de1
    return 1;
Packit Service 084de1
}
Packit Service 084de1
Packit Service 084de1
int tls_get_message_body(SSL *s, size_t *len)
Packit Service 084de1
{
Packit Service 084de1
    size_t n, readbytes;
Packit Service 084de1
    unsigned char *p;
Packit Service 084de1
    int i;
Packit Service 084de1
Packit Service 084de1
    if (s->s3->tmp.message_type == SSL3_MT_CHANGE_CIPHER_SPEC) {
Packit Service 084de1
        /* We've already read everything in */
Packit Service 084de1
        *len = (unsigned long)s->init_num;
Packit Service 084de1
        return 1;
Packit Service 084de1
    }
Packit Service 084de1
Packit Service 084de1
    p = s->init_msg;
Packit Service 084de1
    n = s->s3->tmp.message_size - s->init_num;
Packit Service 084de1
    while (n > 0) {
Packit Service 084de1
        i = s->method->ssl_read_bytes(s, SSL3_RT_HANDSHAKE, NULL,
Packit Service 084de1
                                      &p[s->init_num], n, 0, &readbytes);
Packit Service 084de1
        if (i <= 0) {
Packit Service 084de1
            s->rwstate = SSL_READING;
Packit Service 084de1
            *len = 0;
Packit Service 084de1
            return 0;
Packit Service 084de1
        }
Packit Service 084de1
        s->init_num += readbytes;
Packit Service 084de1
        n -= readbytes;
Packit Service 084de1
    }
Packit Service 084de1
Packit Service 084de1
    /*
Packit Service 084de1
     * If receiving Finished, record MAC of prior handshake messages for
Packit Service 084de1
     * Finished verification.
Packit Service 084de1
     */
Packit Service 084de1
    if (*(s->init_buf->data) == SSL3_MT_FINISHED && !ssl3_take_mac(s)) {
Packit Service 084de1
        /* SSLfatal() already called */
Packit Service 084de1
        *len = 0;
Packit Service 084de1
        return 0;
Packit Service 084de1
    }
Packit Service 084de1
Packit Service 084de1
    /* Feed this message into MAC computation. */
Packit Service 084de1
    if (RECORD_LAYER_is_sslv2_record(&s->rlayer)) {
Packit Service 084de1
        if (!ssl3_finish_mac(s, (unsigned char *)s->init_buf->data,
Packit Service 084de1
                             s->init_num)) {
Packit Service 084de1
            /* SSLfatal() already called */
Packit Service 084de1
            *len = 0;
Packit Service 084de1
            return 0;
Packit Service 084de1
        }
Packit Service 084de1
        if (s->msg_callback)
Packit Service 084de1
            s->msg_callback(0, SSL2_VERSION, 0, s->init_buf->data,
Packit Service 084de1
                            (size_t)s->init_num, s, s->msg_callback_arg);
Packit Service 084de1
    } else {
Packit Service 084de1
        /*
Packit Service 084de1
         * We defer feeding in the HRR until later. We'll do it as part of
Packit Service 084de1
         * processing the message
Packit Service 084de1
         * The TLsv1.3 handshake transcript stops at the ClientFinished
Packit Service 084de1
         * message.
Packit Service 084de1
         */
Packit Service 084de1
#define SERVER_HELLO_RANDOM_OFFSET  (SSL3_HM_HEADER_LENGTH + 2)
Packit Service 084de1
        /* KeyUpdate and NewSessionTicket do not need to be added */
Packit Service 084de1
        if (!SSL_IS_TLS13(s) || (s->s3->tmp.message_type != SSL3_MT_NEWSESSION_TICKET
Packit Service 084de1
                                 && s->s3->tmp.message_type != SSL3_MT_KEY_UPDATE)) {
Packit Service 084de1
            if (s->s3->tmp.message_type != SSL3_MT_SERVER_HELLO
Packit Service 084de1
                    || s->init_num < SERVER_HELLO_RANDOM_OFFSET + SSL3_RANDOM_SIZE
Packit Service 084de1
                    || memcmp(hrrrandom,
Packit Service 084de1
                              s->init_buf->data + SERVER_HELLO_RANDOM_OFFSET,
Packit Service 084de1
                              SSL3_RANDOM_SIZE) != 0) {
Packit Service 084de1
                if (!ssl3_finish_mac(s, (unsigned char *)s->init_buf->data,
Packit Service 084de1
                                     s->init_num + SSL3_HM_HEADER_LENGTH)) {
Packit Service 084de1
                    /* SSLfatal() already called */
Packit Service 084de1
                    *len = 0;
Packit Service 084de1
                    return 0;
Packit Service 084de1
                }
Packit Service 084de1
            }
Packit Service 084de1
        }
Packit Service 084de1
        if (s->msg_callback)
Packit Service 084de1
            s->msg_callback(0, s->version, SSL3_RT_HANDSHAKE, s->init_buf->data,
Packit Service 084de1
                            (size_t)s->init_num + SSL3_HM_HEADER_LENGTH, s,
Packit Service 084de1
                            s->msg_callback_arg);
Packit Service 084de1
    }
Packit Service 084de1
Packit Service 084de1
    *len = s->init_num;
Packit Service 084de1
    return 1;
Packit Service 084de1
}
Packit Service 084de1
Packit Service 084de1
static const X509ERR2ALERT x509table[] = {
Packit Service 084de1
    {X509_V_ERR_APPLICATION_VERIFICATION, SSL_AD_HANDSHAKE_FAILURE},
Packit Service 084de1
    {X509_V_ERR_CA_KEY_TOO_SMALL, SSL_AD_BAD_CERTIFICATE},
Packit Service dd46e1
    {X509_V_ERR_EC_KEY_EXPLICIT_PARAMS, SSL_AD_BAD_CERTIFICATE},
Packit Service 084de1
    {X509_V_ERR_CA_MD_TOO_WEAK, SSL_AD_BAD_CERTIFICATE},
Packit Service 084de1
    {X509_V_ERR_CERT_CHAIN_TOO_LONG, SSL_AD_UNKNOWN_CA},
Packit Service 084de1
    {X509_V_ERR_CERT_HAS_EXPIRED, SSL_AD_CERTIFICATE_EXPIRED},
Packit Service 084de1
    {X509_V_ERR_CERT_NOT_YET_VALID, SSL_AD_BAD_CERTIFICATE},
Packit Service 084de1
    {X509_V_ERR_CERT_REJECTED, SSL_AD_BAD_CERTIFICATE},
Packit Service 084de1
    {X509_V_ERR_CERT_REVOKED, SSL_AD_CERTIFICATE_REVOKED},
Packit Service 084de1
    {X509_V_ERR_CERT_SIGNATURE_FAILURE, SSL_AD_DECRYPT_ERROR},
Packit Service 084de1
    {X509_V_ERR_CERT_UNTRUSTED, SSL_AD_BAD_CERTIFICATE},
Packit Service 084de1
    {X509_V_ERR_CRL_HAS_EXPIRED, SSL_AD_CERTIFICATE_EXPIRED},
Packit Service 084de1
    {X509_V_ERR_CRL_NOT_YET_VALID, SSL_AD_BAD_CERTIFICATE},
Packit Service 084de1
    {X509_V_ERR_CRL_SIGNATURE_FAILURE, SSL_AD_DECRYPT_ERROR},
Packit Service 084de1
    {X509_V_ERR_DANE_NO_MATCH, SSL_AD_BAD_CERTIFICATE},
Packit Service 084de1
    {X509_V_ERR_DEPTH_ZERO_SELF_SIGNED_CERT, SSL_AD_UNKNOWN_CA},
Packit Service 084de1
    {X509_V_ERR_EE_KEY_TOO_SMALL, SSL_AD_BAD_CERTIFICATE},
Packit Service 084de1
    {X509_V_ERR_EMAIL_MISMATCH, SSL_AD_BAD_CERTIFICATE},
Packit Service 084de1
    {X509_V_ERR_ERROR_IN_CERT_NOT_AFTER_FIELD, SSL_AD_BAD_CERTIFICATE},
Packit Service 084de1
    {X509_V_ERR_ERROR_IN_CERT_NOT_BEFORE_FIELD, SSL_AD_BAD_CERTIFICATE},
Packit Service 084de1
    {X509_V_ERR_ERROR_IN_CRL_LAST_UPDATE_FIELD, SSL_AD_BAD_CERTIFICATE},
Packit Service 084de1
    {X509_V_ERR_ERROR_IN_CRL_NEXT_UPDATE_FIELD, SSL_AD_BAD_CERTIFICATE},
Packit Service 084de1
    {X509_V_ERR_HOSTNAME_MISMATCH, SSL_AD_BAD_CERTIFICATE},
Packit Service 084de1
    {X509_V_ERR_INVALID_CA, SSL_AD_UNKNOWN_CA},
Packit Service 084de1
    {X509_V_ERR_INVALID_CALL, SSL_AD_INTERNAL_ERROR},
Packit Service 084de1
    {X509_V_ERR_INVALID_PURPOSE, SSL_AD_UNSUPPORTED_CERTIFICATE},
Packit Service 084de1
    {X509_V_ERR_IP_ADDRESS_MISMATCH, SSL_AD_BAD_CERTIFICATE},
Packit Service 084de1
    {X509_V_ERR_OUT_OF_MEM, SSL_AD_INTERNAL_ERROR},
Packit Service 084de1
    {X509_V_ERR_PATH_LENGTH_EXCEEDED, SSL_AD_UNKNOWN_CA},
Packit Service 084de1
    {X509_V_ERR_SELF_SIGNED_CERT_IN_CHAIN, SSL_AD_UNKNOWN_CA},
Packit Service 084de1
    {X509_V_ERR_STORE_LOOKUP, SSL_AD_INTERNAL_ERROR},
Packit Service 084de1
    {X509_V_ERR_UNABLE_TO_DECODE_ISSUER_PUBLIC_KEY, SSL_AD_BAD_CERTIFICATE},
Packit Service 084de1
    {X509_V_ERR_UNABLE_TO_DECRYPT_CERT_SIGNATURE, SSL_AD_BAD_CERTIFICATE},
Packit Service 084de1
    {X509_V_ERR_UNABLE_TO_DECRYPT_CRL_SIGNATURE, SSL_AD_BAD_CERTIFICATE},
Packit Service 084de1
    {X509_V_ERR_UNABLE_TO_GET_CRL, SSL_AD_UNKNOWN_CA},
Packit Service 084de1
    {X509_V_ERR_UNABLE_TO_GET_CRL_ISSUER, SSL_AD_UNKNOWN_CA},
Packit Service 084de1
    {X509_V_ERR_UNABLE_TO_GET_ISSUER_CERT, SSL_AD_UNKNOWN_CA},
Packit Service 084de1
    {X509_V_ERR_UNABLE_TO_GET_ISSUER_CERT_LOCALLY, SSL_AD_UNKNOWN_CA},
Packit Service 084de1
    {X509_V_ERR_UNABLE_TO_VERIFY_LEAF_SIGNATURE, SSL_AD_UNKNOWN_CA},
Packit Service 084de1
    {X509_V_ERR_UNSPECIFIED, SSL_AD_INTERNAL_ERROR},
Packit Service 084de1
Packit Service 084de1
    /* Last entry; return this if we don't find the value above. */
Packit Service 084de1
    {X509_V_OK, SSL_AD_CERTIFICATE_UNKNOWN}
Packit Service 084de1
};
Packit Service 084de1
Packit Service 084de1
int ssl_x509err2alert(int x509err)
Packit Service 084de1
{
Packit Service 084de1
    const X509ERR2ALERT *tp;
Packit Service 084de1
Packit Service 084de1
    for (tp = x509table; tp->x509err != X509_V_OK; ++tp)
Packit Service 084de1
        if (tp->x509err == x509err)
Packit Service 084de1
            break;
Packit Service 084de1
    return tp->alert;
Packit Service 084de1
}
Packit Service 084de1
Packit Service 084de1
int ssl_allow_compression(SSL *s)
Packit Service 084de1
{
Packit Service 084de1
    if (s->options & SSL_OP_NO_COMPRESSION)
Packit Service 084de1
        return 0;
Packit Service 084de1
    return ssl_security(s, SSL_SECOP_COMPRESSION, 0, 0, NULL);
Packit Service 084de1
}
Packit Service 084de1
Packit Service 084de1
static int version_cmp(const SSL *s, int a, int b)
Packit Service 084de1
{
Packit Service 084de1
    int dtls = SSL_IS_DTLS(s);
Packit Service 084de1
Packit Service 084de1
    if (a == b)
Packit Service 084de1
        return 0;
Packit Service 084de1
    if (!dtls)
Packit Service 084de1
        return a < b ? -1 : 1;
Packit Service 084de1
    return DTLS_VERSION_LT(a, b) ? -1 : 1;
Packit Service 084de1
}
Packit Service 084de1
Packit Service 084de1
typedef struct {
Packit Service 084de1
    int version;
Packit Service 084de1
    const SSL_METHOD *(*cmeth) (void);
Packit Service 084de1
    const SSL_METHOD *(*smeth) (void);
Packit Service 084de1
} version_info;
Packit Service 084de1
Packit Service 084de1
#if TLS_MAX_VERSION != TLS1_3_VERSION
Packit Service 084de1
# error Code needs update for TLS_method() support beyond TLS1_3_VERSION.
Packit Service 084de1
#endif
Packit Service 084de1
Packit Service 084de1
/* Must be in order high to low */
Packit Service 084de1
static const version_info tls_version_table[] = {
Packit Service 084de1
#ifndef OPENSSL_NO_TLS1_3
Packit Service 084de1
    {TLS1_3_VERSION, tlsv1_3_client_method, tlsv1_3_server_method},
Packit Service 084de1
#else
Packit Service 084de1
    {TLS1_3_VERSION, NULL, NULL},
Packit Service 084de1
#endif
Packit Service 084de1
#ifndef OPENSSL_NO_TLS1_2
Packit Service 084de1
    {TLS1_2_VERSION, tlsv1_2_client_method, tlsv1_2_server_method},
Packit Service 084de1
#else
Packit Service 084de1
    {TLS1_2_VERSION, NULL, NULL},
Packit Service 084de1
#endif
Packit Service 084de1
#ifndef OPENSSL_NO_TLS1_1
Packit Service 084de1
    {TLS1_1_VERSION, tlsv1_1_client_method, tlsv1_1_server_method},
Packit Service 084de1
#else
Packit Service 084de1
    {TLS1_1_VERSION, NULL, NULL},
Packit Service 084de1
#endif
Packit Service 084de1
#ifndef OPENSSL_NO_TLS1
Packit Service 084de1
    {TLS1_VERSION, tlsv1_client_method, tlsv1_server_method},
Packit Service 084de1
#else
Packit Service 084de1
    {TLS1_VERSION, NULL, NULL},
Packit Service 084de1
#endif
Packit Service 084de1
#ifndef OPENSSL_NO_SSL3
Packit Service 084de1
    {SSL3_VERSION, sslv3_client_method, sslv3_server_method},
Packit Service 084de1
#else
Packit Service 084de1
    {SSL3_VERSION, NULL, NULL},
Packit Service 084de1
#endif
Packit Service 084de1
    {0, NULL, NULL},
Packit Service 084de1
};
Packit Service 084de1
Packit Service 084de1
#if DTLS_MAX_VERSION != DTLS1_2_VERSION
Packit Service 084de1
# error Code needs update for DTLS_method() support beyond DTLS1_2_VERSION.
Packit Service 084de1
#endif
Packit Service 084de1
Packit Service 084de1
/* Must be in order high to low */
Packit Service 084de1
static const version_info dtls_version_table[] = {
Packit Service 084de1
#ifndef OPENSSL_NO_DTLS1_2
Packit Service 084de1
    {DTLS1_2_VERSION, dtlsv1_2_client_method, dtlsv1_2_server_method},
Packit Service 084de1
#else
Packit Service 084de1
    {DTLS1_2_VERSION, NULL, NULL},
Packit Service 084de1
#endif
Packit Service 084de1
#ifndef OPENSSL_NO_DTLS1
Packit Service 084de1
    {DTLS1_VERSION, dtlsv1_client_method, dtlsv1_server_method},
Packit Service 084de1
    {DTLS1_BAD_VER, dtls_bad_ver_client_method, NULL},
Packit Service 084de1
#else
Packit Service 084de1
    {DTLS1_VERSION, NULL, NULL},
Packit Service 084de1
    {DTLS1_BAD_VER, NULL, NULL},
Packit Service 084de1
#endif
Packit Service 084de1
    {0, NULL, NULL},
Packit Service 084de1
};
Packit Service 084de1
Packit Service 084de1
/*
Packit Service 084de1
 * ssl_method_error - Check whether an SSL_METHOD is enabled.
Packit Service 084de1
 *
Packit Service 084de1
 * @s: The SSL handle for the candidate method
Packit Service 084de1
 * @method: the intended method.
Packit Service 084de1
 *
Packit Service 084de1
 * Returns 0 on success, or an SSL error reason on failure.
Packit Service 084de1
 */
Packit Service 084de1
static int ssl_method_error(const SSL *s, const SSL_METHOD *method)
Packit Service 084de1
{
Packit Service 084de1
    int version = method->version;
Packit Service 084de1
Packit Service 084de1
    if ((s->min_proto_version != 0 &&
Packit Service 084de1
         version_cmp(s, version, s->min_proto_version) < 0) ||
Packit Service 084de1
        ssl_security(s, SSL_SECOP_VERSION, 0, version, NULL) == 0)
Packit Service 084de1
        return SSL_R_VERSION_TOO_LOW;
Packit Service 084de1
Packit Service 084de1
    if (s->max_proto_version != 0 &&
Packit Service 084de1
        version_cmp(s, version, s->max_proto_version) > 0)
Packit Service 084de1
        return SSL_R_VERSION_TOO_HIGH;
Packit Service 084de1
Packit Service 084de1
    if ((s->options & method->mask) != 0)
Packit Service 084de1
        return SSL_R_UNSUPPORTED_PROTOCOL;
Packit Service 084de1
    if ((method->flags & SSL_METHOD_NO_SUITEB) != 0 && tls1_suiteb(s))
Packit Service 084de1
        return SSL_R_AT_LEAST_TLS_1_2_NEEDED_IN_SUITEB_MODE;
Packit Service 084de1
Packit Service 084de1
    return 0;
Packit Service 084de1
}
Packit Service 084de1
Packit Service 084de1
/*
Packit Service 084de1
 * Only called by servers. Returns 1 if the server has a TLSv1.3 capable
Packit Service 084de1
 * certificate type, or has PSK or a certificate callback configured. Otherwise
Packit Service 084de1
 * returns 0.
Packit Service 084de1
 */
Packit Service 084de1
static int is_tls13_capable(const SSL *s)
Packit Service 084de1
{
Packit Service 084de1
    int i;
Packit Service 084de1
#ifndef OPENSSL_NO_EC
Packit Service 084de1
    int curve;
Packit Service 084de1
    EC_KEY *eckey;
Packit Service 084de1
#endif
Packit Service 084de1
Packit Service 084de1
#ifndef OPENSSL_NO_PSK
Packit Service 084de1
    if (s->psk_server_callback != NULL)
Packit Service 084de1
        return 1;
Packit Service 084de1
#endif
Packit Service 084de1
Packit Service 084de1
    if (s->psk_find_session_cb != NULL || s->cert->cert_cb != NULL)
Packit Service 084de1
        return 1;
Packit Service 084de1
Packit Service 084de1
    for (i = 0; i < SSL_PKEY_NUM; i++) {
Packit Service 084de1
        /* Skip over certs disallowed for TLSv1.3 */
Packit Service 084de1
        switch (i) {
Packit Service 084de1
        case SSL_PKEY_DSA_SIGN:
Packit Service 084de1
        case SSL_PKEY_GOST01:
Packit Service 084de1
        case SSL_PKEY_GOST12_256:
Packit Service 084de1
        case SSL_PKEY_GOST12_512:
Packit Service 084de1
            continue;
Packit Service 084de1
        default:
Packit Service 084de1
            break;
Packit Service 084de1
        }
Packit Service 084de1
        if (!ssl_has_cert(s, i))
Packit Service 084de1
            continue;
Packit Service 084de1
#ifndef OPENSSL_NO_EC
Packit Service 084de1
        if (i != SSL_PKEY_ECC)
Packit Service 084de1
            return 1;
Packit Service 084de1
        /*
Packit Service 084de1
         * Prior to TLSv1.3 sig algs allowed any curve to be used. TLSv1.3 is
Packit Service 084de1
         * more restrictive so check that our sig algs are consistent with this
Packit Service 084de1
         * EC cert. See section 4.2.3 of RFC8446.
Packit Service 084de1
         */
Packit Service 084de1
        eckey = EVP_PKEY_get0_EC_KEY(s->cert->pkeys[SSL_PKEY_ECC].privatekey);
Packit Service 084de1
        if (eckey == NULL)
Packit Service 084de1
            continue;
Packit Service 084de1
        curve = EC_GROUP_get_curve_name(EC_KEY_get0_group(eckey));
Packit Service 084de1
        if (tls_check_sigalg_curve(s, curve))
Packit Service 084de1
            return 1;
Packit Service 084de1
#else
Packit Service 084de1
        return 1;
Packit Service 084de1
#endif
Packit Service 084de1
    }
Packit Service 084de1
Packit Service 084de1
    return 0;
Packit Service 084de1
}
Packit Service 084de1
Packit Service 084de1
/*
Packit Service 084de1
 * ssl_version_supported - Check that the specified `version` is supported by
Packit Service 084de1
 * `SSL *` instance
Packit Service 084de1
 *
Packit Service 084de1
 * @s: The SSL handle for the candidate method
Packit Service 084de1
 * @version: Protocol version to test against
Packit Service 084de1
 *
Packit Service 084de1
 * Returns 1 when supported, otherwise 0
Packit Service 084de1
 */
Packit Service 084de1
int ssl_version_supported(const SSL *s, int version, const SSL_METHOD **meth)
Packit Service 084de1
{
Packit Service 084de1
    const version_info *vent;
Packit Service 084de1
    const version_info *table;
Packit Service 084de1
Packit Service 084de1
    switch (s->method->version) {
Packit Service 084de1
    default:
Packit Service 084de1
        /* Version should match method version for non-ANY method */
Packit Service 084de1
        return version_cmp(s, version, s->version) == 0;
Packit Service 084de1
    case TLS_ANY_VERSION:
Packit Service 084de1
        table = tls_version_table;
Packit Service 084de1
        break;
Packit Service 084de1
    case DTLS_ANY_VERSION:
Packit Service 084de1
        table = dtls_version_table;
Packit Service 084de1
        break;
Packit Service 084de1
    }
Packit Service 084de1
Packit Service 084de1
    for (vent = table;
Packit Service 084de1
         vent->version != 0 && version_cmp(s, version, vent->version) <= 0;
Packit Service 084de1
         ++vent) {
Packit Service 084de1
        if (vent->cmeth != NULL
Packit Service 084de1
                && version_cmp(s, version, vent->version) == 0
Packit Service 084de1
                && ssl_method_error(s, vent->cmeth()) == 0
Packit Service 084de1
                && (!s->server
Packit Service 084de1
                    || version != TLS1_3_VERSION
Packit Service 084de1
                    || is_tls13_capable(s))) {
Packit Service 084de1
            if (meth != NULL)
Packit Service 084de1
                *meth = vent->cmeth();
Packit Service 084de1
            return 1;
Packit Service 084de1
        }
Packit Service 084de1
    }
Packit Service 084de1
    return 0;
Packit Service 084de1
}
Packit Service 084de1
Packit Service 084de1
/*
Packit Service 084de1
 * ssl_check_version_downgrade - In response to RFC7507 SCSV version
Packit Service 084de1
 * fallback indication from a client check whether we're using the highest
Packit Service 084de1
 * supported protocol version.
Packit Service 084de1
 *
Packit Service 084de1
 * @s server SSL handle.
Packit Service 084de1
 *
Packit Service 084de1
 * Returns 1 when using the highest enabled version, 0 otherwise.
Packit Service 084de1
 */
Packit Service 084de1
int ssl_check_version_downgrade(SSL *s)
Packit Service 084de1
{
Packit Service 084de1
    const version_info *vent;
Packit Service 084de1
    const version_info *table;
Packit Service 084de1
Packit Service 084de1
    /*
Packit Service 084de1
     * Check that the current protocol is the highest enabled version
Packit Service 084de1
     * (according to s->ctx->method, as version negotiation may have changed
Packit Service 084de1
     * s->method).
Packit Service 084de1
     */
Packit Service 084de1
    if (s->version == s->ctx->method->version)
Packit Service 084de1
        return 1;
Packit Service 084de1
Packit Service 084de1
    /*
Packit Service 084de1
     * Apparently we're using a version-flexible SSL_METHOD (not at its
Packit Service 084de1
     * highest protocol version).
Packit Service 084de1
     */
Packit Service 084de1
    if (s->ctx->method->version == TLS_method()->version)
Packit Service 084de1
        table = tls_version_table;
Packit Service 084de1
    else if (s->ctx->method->version == DTLS_method()->version)
Packit Service 084de1
        table = dtls_version_table;
Packit Service 084de1
    else {
Packit Service 084de1
        /* Unexpected state; fail closed. */
Packit Service 084de1
        return 0;
Packit Service 084de1
    }
Packit Service 084de1
Packit Service 084de1
    for (vent = table; vent->version != 0; ++vent) {
Packit Service 084de1
        if (vent->smeth != NULL && ssl_method_error(s, vent->smeth()) == 0)
Packit Service 084de1
            return s->version == vent->version;
Packit Service 084de1
    }
Packit Service 084de1
    return 0;
Packit Service 084de1
}
Packit Service 084de1
Packit Service 084de1
/*
Packit Service 084de1
 * ssl_set_version_bound - set an upper or lower bound on the supported (D)TLS
Packit Service 084de1
 * protocols, provided the initial (D)TLS method is version-flexible.  This
Packit Service 084de1
 * function sanity-checks the proposed value and makes sure the method is
Packit Service 084de1
 * version-flexible, then sets the limit if all is well.
Packit Service 084de1
 *
Packit Service 084de1
 * @method_version: The version of the current SSL_METHOD.
Packit Service 084de1
 * @version: the intended limit.
Packit Service 084de1
 * @bound: pointer to limit to be updated.
Packit Service 084de1
 *
Packit Service 084de1
 * Returns 1 on success, 0 on failure.
Packit Service 084de1
 */
Packit Service 084de1
int ssl_set_version_bound(int method_version, int version, int *bound)
Packit Service 084de1
{
Packit Service 084de1
    if (version == 0) {
Packit Service 084de1
        *bound = version;
Packit Service 084de1
        return 1;
Packit Service 084de1
    }
Packit Service 084de1
Packit Service 084de1
    /*-
Packit Service 084de1
     * Restrict TLS methods to TLS protocol versions.
Packit Service 084de1
     * Restrict DTLS methods to DTLS protocol versions.
Packit Service 084de1
     * Note, DTLS version numbers are decreasing, use comparison macros.
Packit Service 084de1
     *
Packit Service 084de1
     * Note that for both lower-bounds we use explicit versions, not
Packit Service 084de1
     * (D)TLS_MIN_VERSION.  This is because we don't want to break user
Packit Service 084de1
     * configurations.  If the MIN (supported) version ever rises, the user's
Packit Service 084de1
     * "floor" remains valid even if no longer available.  We don't expect the
Packit Service 084de1
     * MAX ceiling to ever get lower, so making that variable makes sense.
Packit Service 084de1
     */
Packit Service 084de1
    switch (method_version) {
Packit Service 084de1
    default:
Packit Service 084de1
        /*
Packit Service 084de1
         * XXX For fixed version methods, should we always fail and not set any
Packit Service 084de1
         * bounds, always succeed and not set any bounds, or set the bounds and
Packit Service 084de1
         * arrange to fail later if they are not met?  At present fixed-version
Packit Service 084de1
         * methods are not subject to controls that disable individual protocol
Packit Service 084de1
         * versions.
Packit Service 084de1
         */
Packit Service 084de1
        return 1;
Packit Service 084de1
Packit Service 084de1
    case TLS_ANY_VERSION:
Packit Service 084de1
        if (version < SSL3_VERSION || version > TLS_MAX_VERSION)
Packit Service 084de1
            return 0;
Packit Service 084de1
        break;
Packit Service 084de1
Packit Service 084de1
    case DTLS_ANY_VERSION:
Packit Service 084de1
        if (DTLS_VERSION_GT(version, DTLS_MAX_VERSION) ||
Packit Service 084de1
            DTLS_VERSION_LT(version, DTLS1_BAD_VER))
Packit Service 084de1
            return 0;
Packit Service 084de1
        break;
Packit Service 084de1
    }
Packit Service 084de1
Packit Service 084de1
    *bound = version;
Packit Service 084de1
    return 1;
Packit Service 084de1
}
Packit Service 084de1
Packit Service 084de1
static void check_for_downgrade(SSL *s, int vers, DOWNGRADE *dgrd)
Packit Service 084de1
{
Packit Service 084de1
    if (vers == TLS1_2_VERSION
Packit Service 084de1
            && ssl_version_supported(s, TLS1_3_VERSION, NULL)) {
Packit Service 084de1
        *dgrd = DOWNGRADE_TO_1_2;
Packit Service 084de1
    } else if (!SSL_IS_DTLS(s)
Packit Service 084de1
            && vers < TLS1_2_VERSION
Packit Service 084de1
               /*
Packit Service 084de1
                * We need to ensure that a server that disables TLSv1.2
Packit Service 084de1
                * (creating a hole between TLSv1.3 and TLSv1.1) can still
Packit Service 084de1
                * complete handshakes with clients that support TLSv1.2 and
Packit Service 084de1
                * below. Therefore we do not enable the sentinel if TLSv1.3 is
Packit Service 084de1
                * enabled and TLSv1.2 is not.
Packit Service 084de1
                */
Packit Service 084de1
            && ssl_version_supported(s, TLS1_2_VERSION, NULL)) {
Packit Service 084de1
        *dgrd = DOWNGRADE_TO_1_1;
Packit Service 084de1
    } else {
Packit Service 084de1
        *dgrd = DOWNGRADE_NONE;
Packit Service 084de1
    }
Packit Service 084de1
}
Packit Service 084de1
Packit Service 084de1
/*
Packit Service 084de1
 * ssl_choose_server_version - Choose server (D)TLS version.  Called when the
Packit Service 084de1
 * client HELLO is received to select the final server protocol version and
Packit Service 084de1
 * the version specific method.
Packit Service 084de1
 *
Packit Service 084de1
 * @s: server SSL handle.
Packit Service 084de1
 *
Packit Service 084de1
 * Returns 0 on success or an SSL error reason number on failure.
Packit Service 084de1
 */
Packit Service 084de1
int ssl_choose_server_version(SSL *s, CLIENTHELLO_MSG *hello, DOWNGRADE *dgrd)
Packit Service 084de1
{
Packit Service 084de1
    /*-
Packit Service 084de1
     * With version-flexible methods we have an initial state with:
Packit Service 084de1
     *
Packit Service 084de1
     *   s->method->version == (D)TLS_ANY_VERSION,
Packit Service 084de1
     *   s->version == (D)TLS_MAX_VERSION.
Packit Service 084de1
     *
Packit Service 084de1
     * So we detect version-flexible methods via the method version, not the
Packit Service 084de1
     * handle version.
Packit Service 084de1
     */
Packit Service 084de1
    int server_version = s->method->version;
Packit Service 084de1
    int client_version = hello->legacy_version;
Packit Service 084de1
    const version_info *vent;
Packit Service 084de1
    const version_info *table;
Packit Service 084de1
    int disabled = 0;
Packit Service 084de1
    RAW_EXTENSION *suppversions;
Packit Service 084de1
Packit Service 084de1
    s->client_version = client_version;
Packit Service 084de1
Packit Service 084de1
    switch (server_version) {
Packit Service 084de1
    default:
Packit Service 084de1
        if (!SSL_IS_TLS13(s)) {
Packit Service 084de1
            if (version_cmp(s, client_version, s->version) < 0)
Packit Service 084de1
                return SSL_R_WRONG_SSL_VERSION;
Packit Service 084de1
            *dgrd = DOWNGRADE_NONE;
Packit Service 084de1
            /*
Packit Service 084de1
             * If this SSL handle is not from a version flexible method we don't
Packit Service 084de1
             * (and never did) check min/max FIPS or Suite B constraints.  Hope
Packit Service 084de1
             * that's OK.  It is up to the caller to not choose fixed protocol
Packit Service 084de1
             * versions they don't want.  If not, then easy to fix, just return
Packit Service 084de1
             * ssl_method_error(s, s->method)
Packit Service 084de1
             */
Packit Service 084de1
            return 0;
Packit Service 084de1
        }
Packit Service 084de1
        /*
Packit Service 084de1
         * Fall through if we are TLSv1.3 already (this means we must be after
Packit Service 084de1
         * a HelloRetryRequest
Packit Service 084de1
         */
Packit Service 084de1
        /* fall thru */
Packit Service 084de1
    case TLS_ANY_VERSION:
Packit Service 084de1
        table = tls_version_table;
Packit Service 084de1
        break;
Packit Service 084de1
    case DTLS_ANY_VERSION:
Packit Service 084de1
        table = dtls_version_table;
Packit Service 084de1
        break;
Packit Service 084de1
    }
Packit Service 084de1
Packit Service 084de1
    suppversions = &hello->pre_proc_exts[TLSEXT_IDX_supported_versions];
Packit Service 084de1
Packit Service 084de1
    /* If we did an HRR then supported versions is mandatory */
Packit Service 084de1
    if (!suppversions->present && s->hello_retry_request != SSL_HRR_NONE)
Packit Service 084de1
        return SSL_R_UNSUPPORTED_PROTOCOL;
Packit Service 084de1
Packit Service 084de1
    if (suppversions->present && !SSL_IS_DTLS(s)) {
Packit Service 084de1
        unsigned int candidate_vers = 0;
Packit Service 084de1
        unsigned int best_vers = 0;
Packit Service 084de1
        const SSL_METHOD *best_method = NULL;
Packit Service 084de1
        PACKET versionslist;
Packit Service 084de1
Packit Service 084de1
        suppversions->parsed = 1;
Packit Service 084de1
Packit Service 084de1
        if (!PACKET_as_length_prefixed_1(&suppversions->data, &versionslist)) {
Packit Service 084de1
            /* Trailing or invalid data? */
Packit Service 084de1
            return SSL_R_LENGTH_MISMATCH;
Packit Service 084de1
        }
Packit Service 084de1
Packit Service 084de1
        /*
Packit Service 084de1
         * The TLSv1.3 spec says the client MUST set this to TLS1_2_VERSION.
Packit Service 084de1
         * The spec only requires servers to check that it isn't SSLv3:
Packit Service 084de1
         * "Any endpoint receiving a Hello message with
Packit Service 084de1
         * ClientHello.legacy_version or ServerHello.legacy_version set to
Packit Service 084de1
         * 0x0300 MUST abort the handshake with a "protocol_version" alert."
Packit Service 084de1
         * We are slightly stricter and require that it isn't SSLv3 or lower.
Packit Service 084de1
         * We tolerate TLSv1 and TLSv1.1.
Packit Service 084de1
         */
Packit Service 084de1
        if (client_version <= SSL3_VERSION)
Packit Service 084de1
            return SSL_R_BAD_LEGACY_VERSION;
Packit Service 084de1
Packit Service 084de1
        while (PACKET_get_net_2(&versionslist, &candidate_vers)) {
Packit Service 084de1
            if (version_cmp(s, candidate_vers, best_vers) <= 0)
Packit Service 084de1
                continue;
Packit Service 084de1
            if (ssl_version_supported(s, candidate_vers, &best_method))
Packit Service 084de1
                best_vers = candidate_vers;
Packit Service 084de1
        }
Packit Service 084de1
        if (PACKET_remaining(&versionslist) != 0) {
Packit Service 084de1
            /* Trailing data? */
Packit Service 084de1
            return SSL_R_LENGTH_MISMATCH;
Packit Service 084de1
        }
Packit Service 084de1
Packit Service 084de1
        if (best_vers > 0) {
Packit Service 084de1
            if (s->hello_retry_request != SSL_HRR_NONE) {
Packit Service 084de1
                /*
Packit Service 084de1
                 * This is after a HelloRetryRequest so we better check that we
Packit Service 084de1
                 * negotiated TLSv1.3
Packit Service 084de1
                 */
Packit Service 084de1
                if (best_vers != TLS1_3_VERSION)
Packit Service 084de1
                    return SSL_R_UNSUPPORTED_PROTOCOL;
Packit Service 084de1
                return 0;
Packit Service 084de1
            }
Packit Service 084de1
            check_for_downgrade(s, best_vers, dgrd);
Packit Service 084de1
            s->version = best_vers;
Packit Service 084de1
            s->method = best_method;
Packit Service 084de1
            return 0;
Packit Service 084de1
        }
Packit Service 084de1
        return SSL_R_UNSUPPORTED_PROTOCOL;
Packit Service 084de1
    }
Packit Service 084de1
Packit Service 084de1
    /*
Packit Service 084de1
     * If the supported versions extension isn't present, then the highest
Packit Service 084de1
     * version we can negotiate is TLSv1.2
Packit Service 084de1
     */
Packit Service 084de1
    if (version_cmp(s, client_version, TLS1_3_VERSION) >= 0)
Packit Service 084de1
        client_version = TLS1_2_VERSION;
Packit Service 084de1
Packit Service 084de1
    /*
Packit Service 084de1
     * No supported versions extension, so we just use the version supplied in
Packit Service 084de1
     * the ClientHello.
Packit Service 084de1
     */
Packit Service 084de1
    for (vent = table; vent->version != 0; ++vent) {
Packit Service 084de1
        const SSL_METHOD *method;
Packit Service 084de1
Packit Service 084de1
        if (vent->smeth == NULL ||
Packit Service 084de1
            version_cmp(s, client_version, vent->version) < 0)
Packit Service 084de1
            continue;
Packit Service 084de1
        method = vent->smeth();
Packit Service 084de1
        if (ssl_method_error(s, method) == 0) {
Packit Service 084de1
            check_for_downgrade(s, vent->version, dgrd);
Packit Service 084de1
            s->version = vent->version;
Packit Service 084de1
            s->method = method;
Packit Service 084de1
            return 0;
Packit Service 084de1
        }
Packit Service 084de1
        disabled = 1;
Packit Service 084de1
    }
Packit Service 084de1
    return disabled ? SSL_R_UNSUPPORTED_PROTOCOL : SSL_R_VERSION_TOO_LOW;
Packit Service 084de1
}
Packit Service 084de1
Packit Service 084de1
/*
Packit Service 084de1
 * ssl_choose_client_version - Choose client (D)TLS version.  Called when the
Packit Service 084de1
 * server HELLO is received to select the final client protocol version and
Packit Service 084de1
 * the version specific method.
Packit Service 084de1
 *
Packit Service 084de1
 * @s: client SSL handle.
Packit Service 084de1
 * @version: The proposed version from the server's HELLO.
Packit Service 084de1
 * @extensions: The extensions received
Packit Service 084de1
 *
Packit Service 084de1
 * Returns 1 on success or 0 on error.
Packit Service 084de1
 */
Packit Service 084de1
int ssl_choose_client_version(SSL *s, int version, RAW_EXTENSION *extensions)
Packit Service 084de1
{
Packit Service 084de1
    const version_info *vent;
Packit Service 084de1
    const version_info *table;
Packit Service 084de1
    int ret, ver_min, ver_max, real_max, origv;
Packit Service 084de1
Packit Service 084de1
    origv = s->version;
Packit Service 084de1
    s->version = version;
Packit Service 084de1
Packit Service 084de1
    /* This will overwrite s->version if the extension is present */
Packit Service 084de1
    if (!tls_parse_extension(s, TLSEXT_IDX_supported_versions,
Packit Service 084de1
                             SSL_EXT_TLS1_2_SERVER_HELLO
Packit Service 084de1
                             | SSL_EXT_TLS1_3_SERVER_HELLO, extensions,
Packit Service 084de1
                             NULL, 0)) {
Packit Service 084de1
        s->version = origv;
Packit Service 084de1
        return 0;
Packit Service 084de1
    }
Packit Service 084de1
Packit Service 084de1
    if (s->hello_retry_request != SSL_HRR_NONE
Packit Service 084de1
            && s->version != TLS1_3_VERSION) {
Packit Service 084de1
        s->version = origv;
Packit Service 084de1
        SSLfatal(s, SSL_AD_PROTOCOL_VERSION, SSL_F_SSL_CHOOSE_CLIENT_VERSION,
Packit Service 084de1
                 SSL_R_WRONG_SSL_VERSION);
Packit Service 084de1
        return 0;
Packit Service 084de1
    }
Packit Service 084de1
Packit Service 084de1
    switch (s->method->version) {
Packit Service 084de1
    default:
Packit Service 084de1
        if (s->version != s->method->version) {
Packit Service 084de1
            s->version = origv;
Packit Service 084de1
            SSLfatal(s, SSL_AD_PROTOCOL_VERSION,
Packit Service 084de1
                     SSL_F_SSL_CHOOSE_CLIENT_VERSION,
Packit Service 084de1
                     SSL_R_WRONG_SSL_VERSION);
Packit Service 084de1
            return 0;
Packit Service 084de1
        }
Packit Service 084de1
        /*
Packit Service 084de1
         * If this SSL handle is not from a version flexible method we don't
Packit Service 084de1
         * (and never did) check min/max, FIPS or Suite B constraints.  Hope
Packit Service 084de1
         * that's OK.  It is up to the caller to not choose fixed protocol
Packit Service 084de1
         * versions they don't want.  If not, then easy to fix, just return
Packit Service 084de1
         * ssl_method_error(s, s->method)
Packit Service 084de1
         */
Packit Service 084de1
        return 1;
Packit Service 084de1
    case TLS_ANY_VERSION:
Packit Service 084de1
        table = tls_version_table;
Packit Service 084de1
        break;
Packit Service 084de1
    case DTLS_ANY_VERSION:
Packit Service 084de1
        table = dtls_version_table;
Packit Service 084de1
        break;
Packit Service 084de1
    }
Packit Service 084de1
Packit Service 084de1
    ret = ssl_get_min_max_version(s, &ver_min, &ver_max, &real_max);
Packit Service 084de1
    if (ret != 0) {
Packit Service 084de1
        s->version = origv;
Packit Service 084de1
        SSLfatal(s, SSL_AD_PROTOCOL_VERSION,
Packit Service 084de1
                 SSL_F_SSL_CHOOSE_CLIENT_VERSION, ret);
Packit Service 084de1
        return 0;
Packit Service 084de1
    }
Packit Service 084de1
    if (SSL_IS_DTLS(s) ? DTLS_VERSION_LT(s->version, ver_min)
Packit Service 084de1
                       : s->version < ver_min) {
Packit Service 084de1
        s->version = origv;
Packit Service 084de1
        SSLfatal(s, SSL_AD_PROTOCOL_VERSION,
Packit Service 084de1
                 SSL_F_SSL_CHOOSE_CLIENT_VERSION, SSL_R_UNSUPPORTED_PROTOCOL);
Packit Service 084de1
        return 0;
Packit Service 084de1
    } else if (SSL_IS_DTLS(s) ? DTLS_VERSION_GT(s->version, ver_max)
Packit Service 084de1
                              : s->version > ver_max) {
Packit Service 084de1
        s->version = origv;
Packit Service 084de1
        SSLfatal(s, SSL_AD_PROTOCOL_VERSION,
Packit Service 084de1
                 SSL_F_SSL_CHOOSE_CLIENT_VERSION, SSL_R_UNSUPPORTED_PROTOCOL);
Packit Service 084de1
        return 0;
Packit Service 084de1
    }
Packit Service 084de1
Packit Service 084de1
    if ((s->mode & SSL_MODE_SEND_FALLBACK_SCSV) == 0)
Packit Service 084de1
        real_max = ver_max;
Packit Service 084de1
Packit Service 084de1
    /* Check for downgrades */
Packit Service 084de1
    if (s->version == TLS1_2_VERSION && real_max > s->version) {
Packit Service 084de1
        if (memcmp(tls12downgrade,
Packit Service 084de1
                   s->s3->server_random + SSL3_RANDOM_SIZE
Packit Service 084de1
                                        - sizeof(tls12downgrade),
Packit Service 084de1
                   sizeof(tls12downgrade)) == 0) {
Packit Service 084de1
            s->version = origv;
Packit Service 084de1
            SSLfatal(s, SSL_AD_ILLEGAL_PARAMETER,
Packit Service 084de1
                     SSL_F_SSL_CHOOSE_CLIENT_VERSION,
Packit Service 084de1
                     SSL_R_INAPPROPRIATE_FALLBACK);
Packit Service 084de1
            return 0;
Packit Service 084de1
        }
Packit Service 084de1
    } else if (!SSL_IS_DTLS(s)
Packit Service 084de1
               && s->version < TLS1_2_VERSION
Packit Service 084de1
               && real_max > s->version) {
Packit Service 084de1
        if (memcmp(tls11downgrade,
Packit Service 084de1
                   s->s3->server_random + SSL3_RANDOM_SIZE
Packit Service 084de1
                                        - sizeof(tls11downgrade),
Packit Service 084de1
                   sizeof(tls11downgrade)) == 0) {
Packit Service 084de1
            s->version = origv;
Packit Service 084de1
            SSLfatal(s, SSL_AD_ILLEGAL_PARAMETER,
Packit Service 084de1
                     SSL_F_SSL_CHOOSE_CLIENT_VERSION,
Packit Service 084de1
                     SSL_R_INAPPROPRIATE_FALLBACK);
Packit Service 084de1
            return 0;
Packit Service 084de1
        }
Packit Service 084de1
    }
Packit Service 084de1
Packit Service 084de1
    for (vent = table; vent->version != 0; ++vent) {
Packit Service 084de1
        if (vent->cmeth == NULL || s->version != vent->version)
Packit Service 084de1
            continue;
Packit Service 084de1
Packit Service 084de1
        s->method = vent->cmeth();
Packit Service 084de1
        return 1;
Packit Service 084de1
    }
Packit Service 084de1
Packit Service 084de1
    s->version = origv;
Packit Service 084de1
    SSLfatal(s, SSL_AD_PROTOCOL_VERSION, SSL_F_SSL_CHOOSE_CLIENT_VERSION,
Packit Service 084de1
             SSL_R_UNSUPPORTED_PROTOCOL);
Packit Service 084de1
    return 0;
Packit Service 084de1
}
Packit Service 084de1
Packit Service 084de1
/*
Packit Service 084de1
 * ssl_get_min_max_version - get minimum and maximum protocol version
Packit Service 084de1
 * @s: The SSL connection
Packit Service 084de1
 * @min_version: The minimum supported version
Packit Service 084de1
 * @max_version: The maximum supported version
Packit Service 084de1
 * @real_max:    The highest version below the lowest compile time version hole
Packit Service 084de1
 *               where that hole lies above at least one run-time enabled
Packit Service 084de1
 *               protocol.
Packit Service 084de1
 *
Packit Service 084de1
 * Work out what version we should be using for the initial ClientHello if the
Packit Service 084de1
 * version is initially (D)TLS_ANY_VERSION.  We apply any explicit SSL_OP_NO_xxx
Packit Service 084de1
 * options, the MinProtocol and MaxProtocol configuration commands, any Suite B
Packit Service 084de1
 * constraints and any floor imposed by the security level here,
Packit Service 084de1
 * so we don't advertise the wrong protocol version to only reject the outcome later.
Packit Service 084de1
 *
Packit Service 084de1
 * Computing the right floor matters.  If, e.g., TLS 1.0 and 1.2 are enabled,
Packit Service 084de1
 * TLS 1.1 is disabled, but the security level, Suite-B  and/or MinProtocol
Packit Service 084de1
 * only allow TLS 1.2, we want to advertise TLS1.2, *not* TLS1.
Packit Service 084de1
 *
Packit Service 084de1
 * Returns 0 on success or an SSL error reason number on failure.  On failure
Packit Service 084de1
 * min_version and max_version will also be set to 0.
Packit Service 084de1
 */
Packit Service 084de1
int ssl_get_min_max_version(const SSL *s, int *min_version, int *max_version,
Packit Service 084de1
                            int *real_max)
Packit Service 084de1
{
Packit Service 084de1
    int version, tmp_real_max;
Packit Service 084de1
    int hole;
Packit Service 084de1
    const SSL_METHOD *single = NULL;
Packit Service 084de1
    const SSL_METHOD *method;
Packit Service 084de1
    const version_info *table;
Packit Service 084de1
    const version_info *vent;
Packit Service 084de1
Packit Service 084de1
    switch (s->method->version) {
Packit Service 084de1
    default:
Packit Service 084de1
        /*
Packit Service 084de1
         * If this SSL handle is not from a version flexible method we don't
Packit Service 084de1
         * (and never did) check min/max FIPS or Suite B constraints.  Hope
Packit Service 084de1
         * that's OK.  It is up to the caller to not choose fixed protocol
Packit Service 084de1
         * versions they don't want.  If not, then easy to fix, just return
Packit Service 084de1
         * ssl_method_error(s, s->method)
Packit Service 084de1
         */
Packit Service 084de1
        *min_version = *max_version = s->version;
Packit Service 084de1
        /*
Packit Service 084de1
         * Providing a real_max only makes sense where we're using a version
Packit Service 084de1
         * flexible method.
Packit Service 084de1
         */
Packit Service 084de1
        if (!ossl_assert(real_max == NULL))
Packit Service 084de1
            return ERR_R_INTERNAL_ERROR;
Packit Service 084de1
        return 0;
Packit Service 084de1
    case TLS_ANY_VERSION:
Packit Service 084de1
        table = tls_version_table;
Packit Service 084de1
        break;
Packit Service 084de1
    case DTLS_ANY_VERSION:
Packit Service 084de1
        table = dtls_version_table;
Packit Service 084de1
        break;
Packit Service 084de1
    }
Packit Service 084de1
Packit Service 084de1
    /*
Packit Service 084de1
     * SSL_OP_NO_X disables all protocols above X *if* there are some protocols
Packit Service 084de1
     * below X enabled. This is required in order to maintain the "version
Packit Service 084de1
     * capability" vector contiguous. Any versions with a NULL client method
Packit Service 084de1
     * (protocol version client is disabled at compile-time) is also a "hole".
Packit Service 084de1
     *
Packit Service 084de1
     * Our initial state is hole == 1, version == 0.  That is, versions above
Packit Service 084de1
     * the first version in the method table are disabled (a "hole" above
Packit Service 084de1
     * the valid protocol entries) and we don't have a selected version yet.
Packit Service 084de1
     *
Packit Service 084de1
     * Whenever "hole == 1", and we hit an enabled method, its version becomes
Packit Service 084de1
     * the selected version, and the method becomes a candidate "single"
Packit Service 084de1
     * method.  We're no longer in a hole, so "hole" becomes 0.
Packit Service 084de1
     *
Packit Service 084de1
     * If "hole == 0" and we hit an enabled method, then "single" is cleared,
Packit Service 084de1
     * as we support a contiguous range of at least two methods.  If we hit
Packit Service 084de1
     * a disabled method, then hole becomes true again, but nothing else
Packit Service 084de1
     * changes yet, because all the remaining methods may be disabled too.
Packit Service 084de1
     * If we again hit an enabled method after the new hole, it becomes
Packit Service 084de1
     * selected, as we start from scratch.
Packit Service 084de1
     */
Packit Service 084de1
    *min_version = version = 0;
Packit Service 084de1
    hole = 1;
Packit Service 084de1
    if (real_max != NULL)
Packit Service 084de1
        *real_max = 0;
Packit Service 084de1
    tmp_real_max = 0;
Packit Service 084de1
    for (vent = table; vent->version != 0; ++vent) {
Packit Service 084de1
        /*
Packit Service 084de1
         * A table entry with a NULL client method is still a hole in the
Packit Service 084de1
         * "version capability" vector.
Packit Service 084de1
         */
Packit Service 084de1
        if (vent->cmeth == NULL) {
Packit Service 084de1
            hole = 1;
Packit Service 084de1
            tmp_real_max = 0;
Packit Service 084de1
            continue;
Packit Service 084de1
        }
Packit Service 084de1
        method = vent->cmeth();
Packit Service 084de1
Packit Service 084de1
        if (hole == 1 && tmp_real_max == 0)
Packit Service 084de1
            tmp_real_max = vent->version;
Packit Service 084de1
Packit Service 084de1
        if (ssl_method_error(s, method) != 0) {
Packit Service 084de1
            hole = 1;
Packit Service 084de1
        } else if (!hole) {
Packit Service 084de1
            single = NULL;
Packit Service 084de1
            *min_version = method->version;
Packit Service 084de1
        } else {
Packit Service 084de1
            if (real_max != NULL && tmp_real_max != 0)
Packit Service 084de1
                *real_max = tmp_real_max;
Packit Service 084de1
            version = (single = method)->version;
Packit Service 084de1
            *min_version = version;
Packit Service 084de1
            hole = 0;
Packit Service 084de1
        }
Packit Service 084de1
    }
Packit Service 084de1
Packit Service 084de1
    *max_version = version;
Packit Service 084de1
Packit Service 084de1
    /* Fail if everything is disabled */
Packit Service 084de1
    if (version == 0)
Packit Service 084de1
        return SSL_R_NO_PROTOCOLS_AVAILABLE;
Packit Service 084de1
Packit Service 084de1
    return 0;
Packit Service 084de1
}
Packit Service 084de1
Packit Service 084de1
/*
Packit Service 084de1
 * ssl_set_client_hello_version - Work out what version we should be using for
Packit Service 084de1
 * the initial ClientHello.legacy_version field.
Packit Service 084de1
 *
Packit Service 084de1
 * @s: client SSL handle.
Packit Service 084de1
 *
Packit Service 084de1
 * Returns 0 on success or an SSL error reason number on failure.
Packit Service 084de1
 */
Packit Service 084de1
int ssl_set_client_hello_version(SSL *s)
Packit Service 084de1
{
Packit Service 084de1
    int ver_min, ver_max, ret;
Packit Service 084de1
Packit Service 084de1
    /*
Packit Service 084de1
     * In a renegotiation we always send the same client_version that we sent
Packit Service 084de1
     * last time, regardless of which version we eventually negotiated.
Packit Service 084de1
     */
Packit Service 084de1
    if (!SSL_IS_FIRST_HANDSHAKE(s))
Packit Service 084de1
        return 0;
Packit Service 084de1
Packit Service 084de1
    ret = ssl_get_min_max_version(s, &ver_min, &ver_max, NULL);
Packit Service 084de1
Packit Service 084de1
    if (ret != 0)
Packit Service 084de1
        return ret;
Packit Service 084de1
Packit Service 084de1
    s->version = ver_max;
Packit Service 084de1
Packit Service 084de1
    /* TLS1.3 always uses TLS1.2 in the legacy_version field */
Packit Service 084de1
    if (!SSL_IS_DTLS(s) && ver_max > TLS1_2_VERSION)
Packit Service 084de1
        ver_max = TLS1_2_VERSION;
Packit Service 084de1
Packit Service 084de1
    s->client_version = ver_max;
Packit Service 084de1
    return 0;
Packit Service 084de1
}
Packit Service 084de1
Packit Service 084de1
/*
Packit Service 084de1
 * Checks a list of |groups| to determine if the |group_id| is in it. If it is
Packit Service 084de1
 * and |checkallow| is 1 then additionally check if the group is allowed to be
Packit Service 084de1
 * used. Returns 1 if the group is in the list (and allowed if |checkallow| is
Packit Service 084de1
 * 1) or 0 otherwise.
Packit Service 084de1
 */
Packit Service 084de1
#ifndef OPENSSL_NO_EC
Packit Service 084de1
int check_in_list(SSL *s, uint16_t group_id, const uint16_t *groups,
Packit Service 084de1
                  size_t num_groups, int checkallow)
Packit Service 084de1
{
Packit Service 084de1
    size_t i;
Packit Service 084de1
Packit Service 084de1
    if (groups == NULL || num_groups == 0)
Packit Service 084de1
        return 0;
Packit Service 084de1
Packit Service 084de1
    for (i = 0; i < num_groups; i++) {
Packit Service 084de1
        uint16_t group = groups[i];
Packit Service 084de1
Packit Service 084de1
        if (group_id == group
Packit Service 084de1
                && (!checkallow
Packit Service 084de1
                    || tls_curve_allowed(s, group, SSL_SECOP_CURVE_CHECK))) {
Packit Service 084de1
            return 1;
Packit Service 084de1
        }
Packit Service 084de1
    }
Packit Service 084de1
Packit Service 084de1
    return 0;
Packit Service 084de1
}
Packit Service 084de1
#endif
Packit Service 084de1
Packit Service 084de1
/* Replace ClientHello1 in the transcript hash with a synthetic message */
Packit Service 084de1
int create_synthetic_message_hash(SSL *s, const unsigned char *hashval,
Packit Service 084de1
                                  size_t hashlen, const unsigned char *hrr,
Packit Service 084de1
                                  size_t hrrlen)
Packit Service 084de1
{
Packit Service 084de1
    unsigned char hashvaltmp[EVP_MAX_MD_SIZE];
Packit Service 084de1
    unsigned char msghdr[SSL3_HM_HEADER_LENGTH];
Packit Service 084de1
Packit Service 084de1
    memset(msghdr, 0, sizeof(msghdr));
Packit Service 084de1
Packit Service 084de1
    if (hashval == NULL) {
Packit Service 084de1
        hashval = hashvaltmp;
Packit Service 084de1
        hashlen = 0;
Packit Service 084de1
        /* Get the hash of the initial ClientHello */
Packit Service 084de1
        if (!ssl3_digest_cached_records(s, 0)
Packit Service 084de1
                || !ssl_handshake_hash(s, hashvaltmp, sizeof(hashvaltmp),
Packit Service 084de1
                                       &hashlen)) {
Packit Service 084de1
            /* SSLfatal() already called */
Packit Service 084de1
            return 0;
Packit Service 084de1
        }
Packit Service 084de1
    }
Packit Service 084de1
Packit Service 084de1
    /* Reinitialise the transcript hash */
Packit Service 084de1
    if (!ssl3_init_finished_mac(s)) {
Packit Service 084de1
        /* SSLfatal() already called */
Packit Service 084de1
        return 0;
Packit Service 084de1
    }
Packit Service 084de1
Packit Service 084de1
    /* Inject the synthetic message_hash message */
Packit Service 084de1
    msghdr[0] = SSL3_MT_MESSAGE_HASH;
Packit Service 084de1
    msghdr[SSL3_HM_HEADER_LENGTH - 1] = (unsigned char)hashlen;
Packit Service 084de1
    if (!ssl3_finish_mac(s, msghdr, SSL3_HM_HEADER_LENGTH)
Packit Service 084de1
            || !ssl3_finish_mac(s, hashval, hashlen)) {
Packit Service 084de1
        /* SSLfatal() already called */
Packit Service 084de1
        return 0;
Packit Service 084de1
    }
Packit Service 084de1
Packit Service 084de1
    /*
Packit Service 084de1
     * Now re-inject the HRR and current message if appropriate (we just deleted
Packit Service 084de1
     * it when we reinitialised the transcript hash above). Only necessary after
Packit Service 084de1
     * receiving a ClientHello2 with a cookie.
Packit Service 084de1
     */
Packit Service 084de1
    if (hrr != NULL
Packit Service 084de1
            && (!ssl3_finish_mac(s, hrr, hrrlen)
Packit Service 084de1
                || !ssl3_finish_mac(s, (unsigned char *)s->init_buf->data,
Packit Service 084de1
                                    s->s3->tmp.message_size
Packit Service 084de1
                                    + SSL3_HM_HEADER_LENGTH))) {
Packit Service 084de1
        /* SSLfatal() already called */
Packit Service 084de1
        return 0;
Packit Service 084de1
    }
Packit Service 084de1
Packit Service 084de1
    return 1;
Packit Service 084de1
}
Packit Service 084de1
Packit Service 084de1
static int ca_dn_cmp(const X509_NAME *const *a, const X509_NAME *const *b)
Packit Service 084de1
{
Packit Service 084de1
    return X509_NAME_cmp(*a, *b);
Packit Service 084de1
}
Packit Service 084de1
Packit Service 084de1
int parse_ca_names(SSL *s, PACKET *pkt)
Packit Service 084de1
{
Packit Service 084de1
    STACK_OF(X509_NAME) *ca_sk = sk_X509_NAME_new(ca_dn_cmp);
Packit Service 084de1
    X509_NAME *xn = NULL;
Packit Service 084de1
    PACKET cadns;
Packit Service 084de1
Packit Service 084de1
    if (ca_sk == NULL) {
Packit Service 084de1
        SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_PARSE_CA_NAMES,
Packit Service 084de1
                 ERR_R_MALLOC_FAILURE);
Packit Service 084de1
        goto err;
Packit Service 084de1
    }
Packit Service 084de1
    /* get the CA RDNs */
Packit Service 084de1
    if (!PACKET_get_length_prefixed_2(pkt, &cadns)) {
Packit Service 084de1
        SSLfatal(s, SSL_AD_DECODE_ERROR,SSL_F_PARSE_CA_NAMES,
Packit Service 084de1
                 SSL_R_LENGTH_MISMATCH);
Packit Service 084de1
        goto err;
Packit Service 084de1
    }
Packit Service 084de1
Packit Service 084de1
    while (PACKET_remaining(&cadns)) {
Packit Service 084de1
        const unsigned char *namestart, *namebytes;
Packit Service 084de1
        unsigned int name_len;
Packit Service 084de1
Packit Service 084de1
        if (!PACKET_get_net_2(&cadns, &name_len)
Packit Service 084de1
            || !PACKET_get_bytes(&cadns, &namebytes, name_len)) {
Packit Service 084de1
            SSLfatal(s, SSL_AD_DECODE_ERROR, SSL_F_PARSE_CA_NAMES,
Packit Service 084de1
                     SSL_R_LENGTH_MISMATCH);
Packit Service 084de1
            goto err;
Packit Service 084de1
        }
Packit Service 084de1
Packit Service 084de1
        namestart = namebytes;
Packit Service 084de1
        if ((xn = d2i_X509_NAME(NULL, &namebytes, name_len)) == NULL) {
Packit Service 084de1
            SSLfatal(s, SSL_AD_DECODE_ERROR, SSL_F_PARSE_CA_NAMES,
Packit Service 084de1
                     ERR_R_ASN1_LIB);
Packit Service 084de1
            goto err;
Packit Service 084de1
        }
Packit Service 084de1
        if (namebytes != (namestart + name_len)) {
Packit Service 084de1
            SSLfatal(s, SSL_AD_DECODE_ERROR, SSL_F_PARSE_CA_NAMES,
Packit Service 084de1
                     SSL_R_CA_DN_LENGTH_MISMATCH);
Packit Service 084de1
            goto err;
Packit Service 084de1
        }
Packit Service 084de1
Packit Service 084de1
        if (!sk_X509_NAME_push(ca_sk, xn)) {
Packit Service 084de1
            SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_PARSE_CA_NAMES,
Packit Service 084de1
                     ERR_R_MALLOC_FAILURE);
Packit Service 084de1
            goto err;
Packit Service 084de1
        }
Packit Service 084de1
        xn = NULL;
Packit Service 084de1
    }
Packit Service 084de1
Packit Service 084de1
    sk_X509_NAME_pop_free(s->s3->tmp.peer_ca_names, X509_NAME_free);
Packit Service 084de1
    s->s3->tmp.peer_ca_names = ca_sk;
Packit Service 084de1
Packit Service 084de1
    return 1;
Packit Service 084de1
Packit Service 084de1
 err:
Packit Service 084de1
    sk_X509_NAME_pop_free(ca_sk, X509_NAME_free);
Packit Service 084de1
    X509_NAME_free(xn);
Packit Service 084de1
    return 0;
Packit Service 084de1
}
Packit Service 084de1
Packit Service 084de1
const STACK_OF(X509_NAME) *get_ca_names(SSL *s)
Packit Service 084de1
{
Packit Service 084de1
    const STACK_OF(X509_NAME) *ca_sk = NULL;;
Packit Service 084de1
Packit Service 084de1
    if (s->server) {
Packit Service 084de1
        ca_sk = SSL_get_client_CA_list(s);
Packit Service 084de1
        if (ca_sk != NULL && sk_X509_NAME_num(ca_sk) == 0)
Packit Service 084de1
            ca_sk = NULL;
Packit Service 084de1
    }
Packit Service 084de1
Packit Service 084de1
    if (ca_sk == NULL)
Packit Service 084de1
        ca_sk = SSL_get0_CA_list(s);
Packit Service 084de1
Packit Service 084de1
    return ca_sk;
Packit Service 084de1
}
Packit Service 084de1
Packit Service 084de1
int construct_ca_names(SSL *s, const STACK_OF(X509_NAME) *ca_sk, WPACKET *pkt)
Packit Service 084de1
{
Packit Service 084de1
    /* Start sub-packet for client CA list */
Packit Service 084de1
    if (!WPACKET_start_sub_packet_u16(pkt)) {
Packit Service 084de1
        SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_CONSTRUCT_CA_NAMES,
Packit Service 084de1
                 ERR_R_INTERNAL_ERROR);
Packit Service 084de1
        return 0;
Packit Service 084de1
    }
Packit Service 084de1
Packit Service 084de1
    if (ca_sk != NULL) {
Packit Service 084de1
        int i;
Packit Service 084de1
Packit Service 084de1
        for (i = 0; i < sk_X509_NAME_num(ca_sk); i++) {
Packit Service 084de1
            unsigned char *namebytes;
Packit Service 084de1
            X509_NAME *name = sk_X509_NAME_value(ca_sk, i);
Packit Service 084de1
            int namelen;
Packit Service 084de1
Packit Service 084de1
            if (name == NULL
Packit Service 084de1
                    || (namelen = i2d_X509_NAME(name, NULL)) < 0
Packit Service 084de1
                    || !WPACKET_sub_allocate_bytes_u16(pkt, namelen,
Packit Service 084de1
                                                       &namebytes)
Packit Service 084de1
                    || i2d_X509_NAME(name, &namebytes) != namelen) {
Packit Service 084de1
                SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_CONSTRUCT_CA_NAMES,
Packit Service 084de1
                         ERR_R_INTERNAL_ERROR);
Packit Service 084de1
                return 0;
Packit Service 084de1
            }
Packit Service 084de1
        }
Packit Service 084de1
    }
Packit Service 084de1
Packit Service 084de1
    if (!WPACKET_close(pkt)) {
Packit Service 084de1
        SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_CONSTRUCT_CA_NAMES,
Packit Service 084de1
                 ERR_R_INTERNAL_ERROR);
Packit Service 084de1
        return 0;
Packit Service 084de1
    }
Packit Service 084de1
Packit Service 084de1
    return 1;
Packit Service 084de1
}
Packit Service 084de1
Packit Service 084de1
/* Create a buffer containing data to be signed for server key exchange */
Packit Service 084de1
size_t construct_key_exchange_tbs(SSL *s, unsigned char **ptbs,
Packit Service 084de1
                                  const void *param, size_t paramlen)
Packit Service 084de1
{
Packit Service 084de1
    size_t tbslen = 2 * SSL3_RANDOM_SIZE + paramlen;
Packit Service 084de1
    unsigned char *tbs = OPENSSL_malloc(tbslen);
Packit Service 084de1
Packit Service 084de1
    if (tbs == NULL) {
Packit Service 084de1
        SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_CONSTRUCT_KEY_EXCHANGE_TBS,
Packit Service 084de1
                 ERR_R_MALLOC_FAILURE);
Packit Service 084de1
        return 0;
Packit Service 084de1
    }
Packit Service 084de1
    memcpy(tbs, s->s3->client_random, SSL3_RANDOM_SIZE);
Packit Service 084de1
    memcpy(tbs + SSL3_RANDOM_SIZE, s->s3->server_random, SSL3_RANDOM_SIZE);
Packit Service 084de1
Packit Service 084de1
    memcpy(tbs + SSL3_RANDOM_SIZE * 2, param, paramlen);
Packit Service 084de1
Packit Service 084de1
    *ptbs = tbs;
Packit Service 084de1
    return tbslen;
Packit Service 084de1
}
Packit Service 084de1
Packit Service 084de1
/*
Packit Service 084de1
 * Saves the current handshake digest for Post-Handshake Auth,
Packit Service 084de1
 * Done after ClientFinished is processed, done exactly once
Packit Service 084de1
 */
Packit Service 084de1
int tls13_save_handshake_digest_for_pha(SSL *s)
Packit Service 084de1
{
Packit Service 084de1
    if (s->pha_dgst == NULL) {
Packit Service 084de1
        if (!ssl3_digest_cached_records(s, 1))
Packit Service 084de1
            /* SSLfatal() already called */
Packit Service 084de1
            return 0;
Packit Service 084de1
Packit Service 084de1
        s->pha_dgst = EVP_MD_CTX_new();
Packit Service 084de1
        if (s->pha_dgst == NULL) {
Packit Service 084de1
            SSLfatal(s, SSL_AD_INTERNAL_ERROR,
Packit Service 084de1
                     SSL_F_TLS13_SAVE_HANDSHAKE_DIGEST_FOR_PHA,
Packit Service 084de1
                     ERR_R_INTERNAL_ERROR);
Packit Service 084de1
            return 0;
Packit Service 084de1
        }
Packit Service 084de1
        if (!EVP_MD_CTX_copy_ex(s->pha_dgst,
Packit Service 084de1
                                s->s3->handshake_dgst)) {
Packit Service 084de1
            SSLfatal(s, SSL_AD_INTERNAL_ERROR,
Packit Service 084de1
                     SSL_F_TLS13_SAVE_HANDSHAKE_DIGEST_FOR_PHA,
Packit Service 084de1
                     ERR_R_INTERNAL_ERROR);
Packit Service 084de1
            return 0;
Packit Service 084de1
        }
Packit Service 084de1
    }
Packit Service 084de1
    return 1;
Packit Service 084de1
}
Packit Service 084de1
Packit Service 084de1
/*
Packit Service 084de1
 * Restores the Post-Handshake Auth handshake digest
Packit Service 084de1
 * Done just before sending/processing the Cert Request
Packit Service 084de1
 */
Packit Service 084de1
int tls13_restore_handshake_digest_for_pha(SSL *s)
Packit Service 084de1
{
Packit Service 084de1
    if (s->pha_dgst == NULL) {
Packit Service 084de1
        SSLfatal(s, SSL_AD_INTERNAL_ERROR,
Packit Service 084de1
                 SSL_F_TLS13_RESTORE_HANDSHAKE_DIGEST_FOR_PHA,
Packit Service 084de1
                 ERR_R_INTERNAL_ERROR);
Packit Service 084de1
        return 0;
Packit Service 084de1
    }
Packit Service 084de1
    if (!EVP_MD_CTX_copy_ex(s->s3->handshake_dgst,
Packit Service 084de1
                            s->pha_dgst)) {
Packit Service 084de1
        SSLfatal(s, SSL_AD_INTERNAL_ERROR,
Packit Service 084de1
                 SSL_F_TLS13_RESTORE_HANDSHAKE_DIGEST_FOR_PHA,
Packit Service 084de1
                 ERR_R_INTERNAL_ERROR);
Packit Service 084de1
        return 0;
Packit Service 084de1
    }
Packit Service 084de1
    return 1;
Packit Service 084de1
}