1e71b7053SJung-uk Kim /* 2e71b7053SJung-uk Kim * Copyright 1995-2018 The OpenSSL Project Authors. All Rights Reserved. 3e71b7053SJung-uk Kim * Copyright (c) 2002, Oracle and/or its affiliates. All rights reserved 4e71b7053SJung-uk Kim * 5e71b7053SJung-uk Kim * Licensed under the OpenSSL license (the "License"). You may not use 6e71b7053SJung-uk Kim * this file except in compliance with the License. You can obtain a copy 7e71b7053SJung-uk Kim * in the file LICENSE in the source distribution or at 8e71b7053SJung-uk Kim * https://www.openssl.org/source/license.html 9e71b7053SJung-uk Kim */ 10e71b7053SJung-uk Kim 11e71b7053SJung-uk Kim #include <limits.h> 12e71b7053SJung-uk Kim #include <string.h> 13e71b7053SJung-uk Kim #include <stdio.h> 14e71b7053SJung-uk Kim #include "../ssl_locl.h" 15e71b7053SJung-uk Kim #include "statem_locl.h" 16e71b7053SJung-uk Kim #include "internal/cryptlib.h" 17e71b7053SJung-uk Kim #include <openssl/buffer.h> 18e71b7053SJung-uk Kim #include <openssl/objects.h> 19e71b7053SJung-uk Kim #include <openssl/evp.h> 20e71b7053SJung-uk Kim #include <openssl/x509.h> 21e71b7053SJung-uk Kim 22e71b7053SJung-uk Kim /* 23e71b7053SJung-uk Kim * Map error codes to TLS/SSL alart types. 24e71b7053SJung-uk Kim */ 25e71b7053SJung-uk Kim typedef struct x509err2alert_st { 26e71b7053SJung-uk Kim int x509err; 27e71b7053SJung-uk Kim int alert; 28e71b7053SJung-uk Kim } X509ERR2ALERT; 29e71b7053SJung-uk Kim 30e71b7053SJung-uk Kim /* Fixed value used in the ServerHello random field to identify an HRR */ 31e71b7053SJung-uk Kim const unsigned char hrrrandom[] = { 32e71b7053SJung-uk Kim 0xcf, 0x21, 0xad, 0x74, 0xe5, 0x9a, 0x61, 0x11, 0xbe, 0x1d, 0x8c, 0x02, 33e71b7053SJung-uk Kim 0x1e, 0x65, 0xb8, 0x91, 0xc2, 0xa2, 0x11, 0x16, 0x7a, 0xbb, 0x8c, 0x5e, 34e71b7053SJung-uk Kim 0x07, 0x9e, 0x09, 0xe2, 0xc8, 0xa8, 0x33, 0x9c 35e71b7053SJung-uk Kim }; 36e71b7053SJung-uk Kim 37e71b7053SJung-uk Kim /* 38e71b7053SJung-uk Kim * send s->init_buf in records of type 'type' (SSL3_RT_HANDSHAKE or 39e71b7053SJung-uk Kim * SSL3_RT_CHANGE_CIPHER_SPEC) 40e71b7053SJung-uk Kim */ 41e71b7053SJung-uk Kim int ssl3_do_write(SSL *s, int type) 42e71b7053SJung-uk Kim { 43e71b7053SJung-uk Kim int ret; 44e71b7053SJung-uk Kim size_t written = 0; 45e71b7053SJung-uk Kim 46e71b7053SJung-uk Kim ret = ssl3_write_bytes(s, type, &s->init_buf->data[s->init_off], 47e71b7053SJung-uk Kim s->init_num, &written); 48e71b7053SJung-uk Kim if (ret < 0) 49e71b7053SJung-uk Kim return -1; 50e71b7053SJung-uk Kim if (type == SSL3_RT_HANDSHAKE) 51e71b7053SJung-uk Kim /* 52e71b7053SJung-uk Kim * should not be done for 'Hello Request's, but in that case we'll 53e71b7053SJung-uk Kim * ignore the result anyway 54e71b7053SJung-uk Kim * TLS1.3 KeyUpdate and NewSessionTicket do not need to be added 55e71b7053SJung-uk Kim */ 56e71b7053SJung-uk Kim if (!SSL_IS_TLS13(s) || (s->statem.hand_state != TLS_ST_SW_SESSION_TICKET 57e71b7053SJung-uk Kim && s->statem.hand_state != TLS_ST_CW_KEY_UPDATE 58e71b7053SJung-uk Kim && s->statem.hand_state != TLS_ST_SW_KEY_UPDATE)) 59e71b7053SJung-uk Kim if (!ssl3_finish_mac(s, 60e71b7053SJung-uk Kim (unsigned char *)&s->init_buf->data[s->init_off], 61e71b7053SJung-uk Kim written)) 62e71b7053SJung-uk Kim return -1; 63e71b7053SJung-uk Kim if (written == s->init_num) { 64e71b7053SJung-uk Kim if (s->msg_callback) 65e71b7053SJung-uk Kim s->msg_callback(1, s->version, type, s->init_buf->data, 66e71b7053SJung-uk Kim (size_t)(s->init_off + s->init_num), s, 67e71b7053SJung-uk Kim s->msg_callback_arg); 68e71b7053SJung-uk Kim return 1; 69e71b7053SJung-uk Kim } 70e71b7053SJung-uk Kim s->init_off += written; 71e71b7053SJung-uk Kim s->init_num -= written; 72e71b7053SJung-uk Kim return 0; 73e71b7053SJung-uk Kim } 74e71b7053SJung-uk Kim 75e71b7053SJung-uk Kim int tls_close_construct_packet(SSL *s, WPACKET *pkt, int htype) 76e71b7053SJung-uk Kim { 77e71b7053SJung-uk Kim size_t msglen; 78e71b7053SJung-uk Kim 79e71b7053SJung-uk Kim if ((htype != SSL3_MT_CHANGE_CIPHER_SPEC && !WPACKET_close(pkt)) 80e71b7053SJung-uk Kim || !WPACKET_get_length(pkt, &msglen) 81e71b7053SJung-uk Kim || msglen > INT_MAX) 82e71b7053SJung-uk Kim return 0; 83e71b7053SJung-uk Kim s->init_num = (int)msglen; 84e71b7053SJung-uk Kim s->init_off = 0; 85e71b7053SJung-uk Kim 86e71b7053SJung-uk Kim return 1; 87e71b7053SJung-uk Kim } 88e71b7053SJung-uk Kim 89e71b7053SJung-uk Kim int tls_setup_handshake(SSL *s) 90e71b7053SJung-uk Kim { 91e71b7053SJung-uk Kim if (!ssl3_init_finished_mac(s)) { 92e71b7053SJung-uk Kim /* SSLfatal() already called */ 93e71b7053SJung-uk Kim return 0; 94e71b7053SJung-uk Kim } 95e71b7053SJung-uk Kim 96e71b7053SJung-uk Kim /* Reset any extension flags */ 97e71b7053SJung-uk Kim memset(s->ext.extflags, 0, sizeof(s->ext.extflags)); 98e71b7053SJung-uk Kim 99e71b7053SJung-uk Kim if (s->server) { 100e71b7053SJung-uk Kim STACK_OF(SSL_CIPHER) *ciphers = SSL_get_ciphers(s); 101e71b7053SJung-uk Kim int i, ver_min, ver_max, ok = 0; 102e71b7053SJung-uk Kim 103e71b7053SJung-uk Kim /* 104e71b7053SJung-uk Kim * Sanity check that the maximum version we accept has ciphers 105e71b7053SJung-uk Kim * enabled. For clients we do this check during construction of the 106e71b7053SJung-uk Kim * ClientHello. 107e71b7053SJung-uk Kim */ 108e71b7053SJung-uk Kim if (ssl_get_min_max_version(s, &ver_min, &ver_max, NULL) != 0) { 109e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_TLS_SETUP_HANDSHAKE, 110e71b7053SJung-uk Kim ERR_R_INTERNAL_ERROR); 111e71b7053SJung-uk Kim return 0; 112e71b7053SJung-uk Kim } 113e71b7053SJung-uk Kim for (i = 0; i < sk_SSL_CIPHER_num(ciphers); i++) { 114e71b7053SJung-uk Kim const SSL_CIPHER *c = sk_SSL_CIPHER_value(ciphers, i); 115e71b7053SJung-uk Kim 116e71b7053SJung-uk Kim if (SSL_IS_DTLS(s)) { 117e71b7053SJung-uk Kim if (DTLS_VERSION_GE(ver_max, c->min_dtls) && 118e71b7053SJung-uk Kim DTLS_VERSION_LE(ver_max, c->max_dtls)) 119e71b7053SJung-uk Kim ok = 1; 120e71b7053SJung-uk Kim } else if (ver_max >= c->min_tls && ver_max <= c->max_tls) { 121e71b7053SJung-uk Kim ok = 1; 122e71b7053SJung-uk Kim } 123e71b7053SJung-uk Kim if (ok) 124e71b7053SJung-uk Kim break; 125e71b7053SJung-uk Kim } 126e71b7053SJung-uk Kim if (!ok) { 127e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_HANDSHAKE_FAILURE, SSL_F_TLS_SETUP_HANDSHAKE, 128e71b7053SJung-uk Kim SSL_R_NO_CIPHERS_AVAILABLE); 129e71b7053SJung-uk Kim ERR_add_error_data(1, "No ciphers enabled for max supported " 130e71b7053SJung-uk Kim "SSL/TLS version"); 131e71b7053SJung-uk Kim return 0; 132e71b7053SJung-uk Kim } 133e71b7053SJung-uk Kim if (SSL_IS_FIRST_HANDSHAKE(s)) { 134e71b7053SJung-uk Kim /* N.B. s->session_ctx == s->ctx here */ 135e71b7053SJung-uk Kim tsan_counter(&s->session_ctx->stats.sess_accept); 136e71b7053SJung-uk Kim } else { 137e71b7053SJung-uk Kim /* N.B. s->ctx may not equal s->session_ctx */ 138e71b7053SJung-uk Kim tsan_counter(&s->ctx->stats.sess_accept_renegotiate); 139e71b7053SJung-uk Kim 140e71b7053SJung-uk Kim s->s3->tmp.cert_request = 0; 141e71b7053SJung-uk Kim } 142e71b7053SJung-uk Kim } else { 143e71b7053SJung-uk Kim if (SSL_IS_FIRST_HANDSHAKE(s)) 144e71b7053SJung-uk Kim tsan_counter(&s->session_ctx->stats.sess_connect); 145e71b7053SJung-uk Kim else 146e71b7053SJung-uk Kim tsan_counter(&s->session_ctx->stats.sess_connect_renegotiate); 147e71b7053SJung-uk Kim 148e71b7053SJung-uk Kim /* mark client_random uninitialized */ 149e71b7053SJung-uk Kim memset(s->s3->client_random, 0, sizeof(s->s3->client_random)); 150e71b7053SJung-uk Kim s->hit = 0; 151e71b7053SJung-uk Kim 152e71b7053SJung-uk Kim s->s3->tmp.cert_req = 0; 153e71b7053SJung-uk Kim 154e71b7053SJung-uk Kim if (SSL_IS_DTLS(s)) 155e71b7053SJung-uk Kim s->statem.use_timer = 1; 156e71b7053SJung-uk Kim } 157e71b7053SJung-uk Kim 158e71b7053SJung-uk Kim return 1; 159e71b7053SJung-uk Kim } 160e71b7053SJung-uk Kim 161e71b7053SJung-uk Kim /* 162e71b7053SJung-uk Kim * Size of the to-be-signed TLS13 data, without the hash size itself: 163e71b7053SJung-uk Kim * 64 bytes of value 32, 33 context bytes, 1 byte separator 164e71b7053SJung-uk Kim */ 165e71b7053SJung-uk Kim #define TLS13_TBS_START_SIZE 64 166e71b7053SJung-uk Kim #define TLS13_TBS_PREAMBLE_SIZE (TLS13_TBS_START_SIZE + 33 + 1) 167e71b7053SJung-uk Kim 168e71b7053SJung-uk Kim static int get_cert_verify_tbs_data(SSL *s, unsigned char *tls13tbs, 169e71b7053SJung-uk Kim void **hdata, size_t *hdatalen) 170e71b7053SJung-uk Kim { 171e71b7053SJung-uk Kim static const char *servercontext = "TLS 1.3, server CertificateVerify"; 172e71b7053SJung-uk Kim static const char *clientcontext = "TLS 1.3, client CertificateVerify"; 173e71b7053SJung-uk Kim 174e71b7053SJung-uk Kim if (SSL_IS_TLS13(s)) { 175e71b7053SJung-uk Kim size_t hashlen; 176e71b7053SJung-uk Kim 177e71b7053SJung-uk Kim /* Set the first 64 bytes of to-be-signed data to octet 32 */ 178e71b7053SJung-uk Kim memset(tls13tbs, 32, TLS13_TBS_START_SIZE); 179e71b7053SJung-uk Kim /* This copies the 33 bytes of context plus the 0 separator byte */ 180e71b7053SJung-uk Kim if (s->statem.hand_state == TLS_ST_CR_CERT_VRFY 181e71b7053SJung-uk Kim || s->statem.hand_state == TLS_ST_SW_CERT_VRFY) 182e71b7053SJung-uk Kim strcpy((char *)tls13tbs + TLS13_TBS_START_SIZE, servercontext); 183e71b7053SJung-uk Kim else 184e71b7053SJung-uk Kim strcpy((char *)tls13tbs + TLS13_TBS_START_SIZE, clientcontext); 185e71b7053SJung-uk Kim 186e71b7053SJung-uk Kim /* 187e71b7053SJung-uk Kim * If we're currently reading then we need to use the saved handshake 188e71b7053SJung-uk Kim * hash value. We can't use the current handshake hash state because 189e71b7053SJung-uk Kim * that includes the CertVerify itself. 190e71b7053SJung-uk Kim */ 191e71b7053SJung-uk Kim if (s->statem.hand_state == TLS_ST_CR_CERT_VRFY 192e71b7053SJung-uk Kim || s->statem.hand_state == TLS_ST_SR_CERT_VRFY) { 193e71b7053SJung-uk Kim memcpy(tls13tbs + TLS13_TBS_PREAMBLE_SIZE, s->cert_verify_hash, 194e71b7053SJung-uk Kim s->cert_verify_hash_len); 195e71b7053SJung-uk Kim hashlen = s->cert_verify_hash_len; 196e71b7053SJung-uk Kim } else if (!ssl_handshake_hash(s, tls13tbs + TLS13_TBS_PREAMBLE_SIZE, 197e71b7053SJung-uk Kim EVP_MAX_MD_SIZE, &hashlen)) { 198e71b7053SJung-uk Kim /* SSLfatal() already called */ 199e71b7053SJung-uk Kim return 0; 200e71b7053SJung-uk Kim } 201e71b7053SJung-uk Kim 202e71b7053SJung-uk Kim *hdata = tls13tbs; 203e71b7053SJung-uk Kim *hdatalen = TLS13_TBS_PREAMBLE_SIZE + hashlen; 204e71b7053SJung-uk Kim } else { 205e71b7053SJung-uk Kim size_t retlen; 206*c9cf7b5cSJung-uk Kim long retlen_l; 207e71b7053SJung-uk Kim 208*c9cf7b5cSJung-uk Kim retlen = retlen_l = BIO_get_mem_data(s->s3->handshake_buffer, hdata); 209*c9cf7b5cSJung-uk Kim if (retlen_l <= 0) { 210e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_GET_CERT_VERIFY_TBS_DATA, 211e71b7053SJung-uk Kim ERR_R_INTERNAL_ERROR); 212e71b7053SJung-uk Kim return 0; 213e71b7053SJung-uk Kim } 214e71b7053SJung-uk Kim *hdatalen = retlen; 215e71b7053SJung-uk Kim } 216e71b7053SJung-uk Kim 217e71b7053SJung-uk Kim return 1; 218e71b7053SJung-uk Kim } 219e71b7053SJung-uk Kim 220e71b7053SJung-uk Kim int tls_construct_cert_verify(SSL *s, WPACKET *pkt) 221e71b7053SJung-uk Kim { 222e71b7053SJung-uk Kim EVP_PKEY *pkey = NULL; 223e71b7053SJung-uk Kim const EVP_MD *md = NULL; 224e71b7053SJung-uk Kim EVP_MD_CTX *mctx = NULL; 225e71b7053SJung-uk Kim EVP_PKEY_CTX *pctx = NULL; 226e71b7053SJung-uk Kim size_t hdatalen = 0, siglen = 0; 227e71b7053SJung-uk Kim void *hdata; 228e71b7053SJung-uk Kim unsigned char *sig = NULL; 229e71b7053SJung-uk Kim unsigned char tls13tbs[TLS13_TBS_PREAMBLE_SIZE + EVP_MAX_MD_SIZE]; 230e71b7053SJung-uk Kim const SIGALG_LOOKUP *lu = s->s3->tmp.sigalg; 231e71b7053SJung-uk Kim 232e71b7053SJung-uk Kim if (lu == NULL || s->s3->tmp.cert == NULL) { 233e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_TLS_CONSTRUCT_CERT_VERIFY, 234e71b7053SJung-uk Kim ERR_R_INTERNAL_ERROR); 235e71b7053SJung-uk Kim goto err; 236e71b7053SJung-uk Kim } 237e71b7053SJung-uk Kim pkey = s->s3->tmp.cert->privatekey; 238e71b7053SJung-uk Kim 239e71b7053SJung-uk Kim if (pkey == NULL || !tls1_lookup_md(lu, &md)) { 240e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_TLS_CONSTRUCT_CERT_VERIFY, 241e71b7053SJung-uk Kim ERR_R_INTERNAL_ERROR); 242e71b7053SJung-uk Kim goto err; 243e71b7053SJung-uk Kim } 244e71b7053SJung-uk Kim 245e71b7053SJung-uk Kim mctx = EVP_MD_CTX_new(); 246e71b7053SJung-uk Kim if (mctx == NULL) { 247e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_TLS_CONSTRUCT_CERT_VERIFY, 248e71b7053SJung-uk Kim ERR_R_MALLOC_FAILURE); 249e71b7053SJung-uk Kim goto err; 250e71b7053SJung-uk Kim } 251e71b7053SJung-uk Kim 252e71b7053SJung-uk Kim /* Get the data to be signed */ 253e71b7053SJung-uk Kim if (!get_cert_verify_tbs_data(s, tls13tbs, &hdata, &hdatalen)) { 254e71b7053SJung-uk Kim /* SSLfatal() already called */ 255e71b7053SJung-uk Kim goto err; 256e71b7053SJung-uk Kim } 257e71b7053SJung-uk Kim 258e71b7053SJung-uk Kim if (SSL_USE_SIGALGS(s) && !WPACKET_put_bytes_u16(pkt, lu->sigalg)) { 259e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_TLS_CONSTRUCT_CERT_VERIFY, 260e71b7053SJung-uk Kim ERR_R_INTERNAL_ERROR); 261e71b7053SJung-uk Kim goto err; 262e71b7053SJung-uk Kim } 263e71b7053SJung-uk Kim siglen = EVP_PKEY_size(pkey); 264e71b7053SJung-uk Kim sig = OPENSSL_malloc(siglen); 265e71b7053SJung-uk Kim if (sig == NULL) { 266e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_TLS_CONSTRUCT_CERT_VERIFY, 267e71b7053SJung-uk Kim ERR_R_MALLOC_FAILURE); 268e71b7053SJung-uk Kim goto err; 269e71b7053SJung-uk Kim } 270e71b7053SJung-uk Kim 271e71b7053SJung-uk Kim if (EVP_DigestSignInit(mctx, &pctx, md, NULL, pkey) <= 0) { 272e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_TLS_CONSTRUCT_CERT_VERIFY, 273e71b7053SJung-uk Kim ERR_R_EVP_LIB); 274e71b7053SJung-uk Kim goto err; 275e71b7053SJung-uk Kim } 276e71b7053SJung-uk Kim 277e71b7053SJung-uk Kim if (lu->sig == EVP_PKEY_RSA_PSS) { 278e71b7053SJung-uk Kim if (EVP_PKEY_CTX_set_rsa_padding(pctx, RSA_PKCS1_PSS_PADDING) <= 0 279e71b7053SJung-uk Kim || EVP_PKEY_CTX_set_rsa_pss_saltlen(pctx, 280e71b7053SJung-uk Kim RSA_PSS_SALTLEN_DIGEST) <= 0) { 281e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_TLS_CONSTRUCT_CERT_VERIFY, 282e71b7053SJung-uk Kim ERR_R_EVP_LIB); 283e71b7053SJung-uk Kim goto err; 284e71b7053SJung-uk Kim } 285e71b7053SJung-uk Kim } 286e71b7053SJung-uk Kim if (s->version == SSL3_VERSION) { 287e71b7053SJung-uk Kim if (EVP_DigestSignUpdate(mctx, hdata, hdatalen) <= 0 288e71b7053SJung-uk Kim || !EVP_MD_CTX_ctrl(mctx, EVP_CTRL_SSL3_MASTER_SECRET, 289e71b7053SJung-uk Kim (int)s->session->master_key_length, 290e71b7053SJung-uk Kim s->session->master_key) 291e71b7053SJung-uk Kim || EVP_DigestSignFinal(mctx, sig, &siglen) <= 0) { 292e71b7053SJung-uk Kim 293e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_TLS_CONSTRUCT_CERT_VERIFY, 294e71b7053SJung-uk Kim ERR_R_EVP_LIB); 295e71b7053SJung-uk Kim goto err; 296e71b7053SJung-uk Kim } 297e71b7053SJung-uk Kim } else if (EVP_DigestSign(mctx, sig, &siglen, hdata, hdatalen) <= 0) { 298e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_TLS_CONSTRUCT_CERT_VERIFY, 299e71b7053SJung-uk Kim ERR_R_EVP_LIB); 300e71b7053SJung-uk Kim goto err; 301e71b7053SJung-uk Kim } 302e71b7053SJung-uk Kim 303e71b7053SJung-uk Kim #ifndef OPENSSL_NO_GOST 304e71b7053SJung-uk Kim { 305e71b7053SJung-uk Kim int pktype = lu->sig; 306e71b7053SJung-uk Kim 307e71b7053SJung-uk Kim if (pktype == NID_id_GostR3410_2001 308e71b7053SJung-uk Kim || pktype == NID_id_GostR3410_2012_256 309e71b7053SJung-uk Kim || pktype == NID_id_GostR3410_2012_512) 310e71b7053SJung-uk Kim BUF_reverse(sig, NULL, siglen); 311e71b7053SJung-uk Kim } 312e71b7053SJung-uk Kim #endif 313e71b7053SJung-uk Kim 314e71b7053SJung-uk Kim if (!WPACKET_sub_memcpy_u16(pkt, sig, siglen)) { 315e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_TLS_CONSTRUCT_CERT_VERIFY, 316e71b7053SJung-uk Kim ERR_R_INTERNAL_ERROR); 317e71b7053SJung-uk Kim goto err; 318e71b7053SJung-uk Kim } 319e71b7053SJung-uk Kim 320e71b7053SJung-uk Kim /* Digest cached records and discard handshake buffer */ 321e71b7053SJung-uk Kim if (!ssl3_digest_cached_records(s, 0)) { 322e71b7053SJung-uk Kim /* SSLfatal() already called */ 323e71b7053SJung-uk Kim goto err; 324e71b7053SJung-uk Kim } 325e71b7053SJung-uk Kim 326e71b7053SJung-uk Kim OPENSSL_free(sig); 327e71b7053SJung-uk Kim EVP_MD_CTX_free(mctx); 328e71b7053SJung-uk Kim return 1; 329e71b7053SJung-uk Kim err: 330e71b7053SJung-uk Kim OPENSSL_free(sig); 331e71b7053SJung-uk Kim EVP_MD_CTX_free(mctx); 332e71b7053SJung-uk Kim return 0; 333e71b7053SJung-uk Kim } 334e71b7053SJung-uk Kim 335e71b7053SJung-uk Kim MSG_PROCESS_RETURN tls_process_cert_verify(SSL *s, PACKET *pkt) 336e71b7053SJung-uk Kim { 337e71b7053SJung-uk Kim EVP_PKEY *pkey = NULL; 338e71b7053SJung-uk Kim const unsigned char *data; 339e71b7053SJung-uk Kim #ifndef OPENSSL_NO_GOST 340e71b7053SJung-uk Kim unsigned char *gost_data = NULL; 341e71b7053SJung-uk Kim #endif 342e71b7053SJung-uk Kim MSG_PROCESS_RETURN ret = MSG_PROCESS_ERROR; 343e71b7053SJung-uk Kim int j; 344e71b7053SJung-uk Kim unsigned int len; 345e71b7053SJung-uk Kim X509 *peer; 346e71b7053SJung-uk Kim const EVP_MD *md = NULL; 347e71b7053SJung-uk Kim size_t hdatalen = 0; 348e71b7053SJung-uk Kim void *hdata; 349e71b7053SJung-uk Kim unsigned char tls13tbs[TLS13_TBS_PREAMBLE_SIZE + EVP_MAX_MD_SIZE]; 350e71b7053SJung-uk Kim EVP_MD_CTX *mctx = EVP_MD_CTX_new(); 351e71b7053SJung-uk Kim EVP_PKEY_CTX *pctx = NULL; 352e71b7053SJung-uk Kim 353e71b7053SJung-uk Kim if (mctx == NULL) { 354e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_TLS_PROCESS_CERT_VERIFY, 355e71b7053SJung-uk Kim ERR_R_MALLOC_FAILURE); 356e71b7053SJung-uk Kim goto err; 357e71b7053SJung-uk Kim } 358e71b7053SJung-uk Kim 359e71b7053SJung-uk Kim peer = s->session->peer; 360e71b7053SJung-uk Kim pkey = X509_get0_pubkey(peer); 361e71b7053SJung-uk Kim if (pkey == NULL) { 362e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_TLS_PROCESS_CERT_VERIFY, 363e71b7053SJung-uk Kim ERR_R_INTERNAL_ERROR); 364e71b7053SJung-uk Kim goto err; 365e71b7053SJung-uk Kim } 366e71b7053SJung-uk Kim 367e71b7053SJung-uk Kim if (ssl_cert_lookup_by_pkey(pkey, NULL) == NULL) { 368e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_ILLEGAL_PARAMETER, SSL_F_TLS_PROCESS_CERT_VERIFY, 369e71b7053SJung-uk Kim SSL_R_SIGNATURE_FOR_NON_SIGNING_CERTIFICATE); 370e71b7053SJung-uk Kim goto err; 371e71b7053SJung-uk Kim } 372e71b7053SJung-uk Kim 373e71b7053SJung-uk Kim if (SSL_USE_SIGALGS(s)) { 374e71b7053SJung-uk Kim unsigned int sigalg; 375e71b7053SJung-uk Kim 376e71b7053SJung-uk Kim if (!PACKET_get_net_2(pkt, &sigalg)) { 377e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_DECODE_ERROR, SSL_F_TLS_PROCESS_CERT_VERIFY, 378e71b7053SJung-uk Kim SSL_R_BAD_PACKET); 379e71b7053SJung-uk Kim goto err; 380e71b7053SJung-uk Kim } 381e71b7053SJung-uk Kim if (tls12_check_peer_sigalg(s, sigalg, pkey) <= 0) { 382e71b7053SJung-uk Kim /* SSLfatal() already called */ 383e71b7053SJung-uk Kim goto err; 384e71b7053SJung-uk Kim } 385e71b7053SJung-uk Kim } else if (!tls1_set_peer_legacy_sigalg(s, pkey)) { 386e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_TLS_PROCESS_CERT_VERIFY, 387e71b7053SJung-uk Kim ERR_R_INTERNAL_ERROR); 388e71b7053SJung-uk Kim goto err; 389e71b7053SJung-uk Kim } 390e71b7053SJung-uk Kim 391e71b7053SJung-uk Kim if (!tls1_lookup_md(s->s3->tmp.peer_sigalg, &md)) { 392e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_TLS_PROCESS_CERT_VERIFY, 393e71b7053SJung-uk Kim ERR_R_INTERNAL_ERROR); 394e71b7053SJung-uk Kim goto err; 395e71b7053SJung-uk Kim } 396e71b7053SJung-uk Kim 397e71b7053SJung-uk Kim #ifdef SSL_DEBUG 398e71b7053SJung-uk Kim if (SSL_USE_SIGALGS(s)) 399e71b7053SJung-uk Kim fprintf(stderr, "USING TLSv1.2 HASH %s\n", EVP_MD_name(md)); 400e71b7053SJung-uk Kim #endif 401e71b7053SJung-uk Kim 402e71b7053SJung-uk Kim /* Check for broken implementations of GOST ciphersuites */ 403e71b7053SJung-uk Kim /* 404e71b7053SJung-uk Kim * If key is GOST and len is exactly 64 or 128, it is signature without 405e71b7053SJung-uk Kim * length field (CryptoPro implementations at least till TLS 1.2) 406e71b7053SJung-uk Kim */ 407e71b7053SJung-uk Kim #ifndef OPENSSL_NO_GOST 408e71b7053SJung-uk Kim if (!SSL_USE_SIGALGS(s) 409e71b7053SJung-uk Kim && ((PACKET_remaining(pkt) == 64 410e71b7053SJung-uk Kim && (EVP_PKEY_id(pkey) == NID_id_GostR3410_2001 411e71b7053SJung-uk Kim || EVP_PKEY_id(pkey) == NID_id_GostR3410_2012_256)) 412e71b7053SJung-uk Kim || (PACKET_remaining(pkt) == 128 413e71b7053SJung-uk Kim && EVP_PKEY_id(pkey) == NID_id_GostR3410_2012_512))) { 414e71b7053SJung-uk Kim len = PACKET_remaining(pkt); 415e71b7053SJung-uk Kim } else 416e71b7053SJung-uk Kim #endif 417e71b7053SJung-uk Kim if (!PACKET_get_net_2(pkt, &len)) { 418e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_DECODE_ERROR, SSL_F_TLS_PROCESS_CERT_VERIFY, 419e71b7053SJung-uk Kim SSL_R_LENGTH_MISMATCH); 420e71b7053SJung-uk Kim goto err; 421e71b7053SJung-uk Kim } 422e71b7053SJung-uk Kim 423e71b7053SJung-uk Kim j = EVP_PKEY_size(pkey); 424e71b7053SJung-uk Kim if (((int)len > j) || ((int)PACKET_remaining(pkt) > j) 425e71b7053SJung-uk Kim || (PACKET_remaining(pkt) == 0)) { 426e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_DECODE_ERROR, SSL_F_TLS_PROCESS_CERT_VERIFY, 427e71b7053SJung-uk Kim SSL_R_WRONG_SIGNATURE_SIZE); 428e71b7053SJung-uk Kim goto err; 429e71b7053SJung-uk Kim } 430e71b7053SJung-uk Kim if (!PACKET_get_bytes(pkt, &data, len)) { 431e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_DECODE_ERROR, SSL_F_TLS_PROCESS_CERT_VERIFY, 432e71b7053SJung-uk Kim SSL_R_LENGTH_MISMATCH); 433e71b7053SJung-uk Kim goto err; 434e71b7053SJung-uk Kim } 435e71b7053SJung-uk Kim 436e71b7053SJung-uk Kim if (!get_cert_verify_tbs_data(s, tls13tbs, &hdata, &hdatalen)) { 437e71b7053SJung-uk Kim /* SSLfatal() already called */ 438e71b7053SJung-uk Kim goto err; 439e71b7053SJung-uk Kim } 440e71b7053SJung-uk Kim 441e71b7053SJung-uk Kim #ifdef SSL_DEBUG 442e71b7053SJung-uk Kim fprintf(stderr, "Using client verify alg %s\n", EVP_MD_name(md)); 443e71b7053SJung-uk Kim #endif 444e71b7053SJung-uk Kim if (EVP_DigestVerifyInit(mctx, &pctx, md, NULL, pkey) <= 0) { 445e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_TLS_PROCESS_CERT_VERIFY, 446e71b7053SJung-uk Kim ERR_R_EVP_LIB); 447e71b7053SJung-uk Kim goto err; 448e71b7053SJung-uk Kim } 449e71b7053SJung-uk Kim #ifndef OPENSSL_NO_GOST 450e71b7053SJung-uk Kim { 451e71b7053SJung-uk Kim int pktype = EVP_PKEY_id(pkey); 452e71b7053SJung-uk Kim if (pktype == NID_id_GostR3410_2001 453e71b7053SJung-uk Kim || pktype == NID_id_GostR3410_2012_256 454e71b7053SJung-uk Kim || pktype == NID_id_GostR3410_2012_512) { 455e71b7053SJung-uk Kim if ((gost_data = OPENSSL_malloc(len)) == NULL) { 456e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_INTERNAL_ERROR, 457e71b7053SJung-uk Kim SSL_F_TLS_PROCESS_CERT_VERIFY, ERR_R_MALLOC_FAILURE); 458e71b7053SJung-uk Kim goto err; 459e71b7053SJung-uk Kim } 460e71b7053SJung-uk Kim BUF_reverse(gost_data, data, len); 461e71b7053SJung-uk Kim data = gost_data; 462e71b7053SJung-uk Kim } 463e71b7053SJung-uk Kim } 464e71b7053SJung-uk Kim #endif 465e71b7053SJung-uk Kim 466e71b7053SJung-uk Kim if (SSL_USE_PSS(s)) { 467e71b7053SJung-uk Kim if (EVP_PKEY_CTX_set_rsa_padding(pctx, RSA_PKCS1_PSS_PADDING) <= 0 468e71b7053SJung-uk Kim || EVP_PKEY_CTX_set_rsa_pss_saltlen(pctx, 469e71b7053SJung-uk Kim RSA_PSS_SALTLEN_DIGEST) <= 0) { 470e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_TLS_PROCESS_CERT_VERIFY, 471e71b7053SJung-uk Kim ERR_R_EVP_LIB); 472e71b7053SJung-uk Kim goto err; 473e71b7053SJung-uk Kim } 474e71b7053SJung-uk Kim } 475e71b7053SJung-uk Kim if (s->version == SSL3_VERSION) { 476e71b7053SJung-uk Kim if (EVP_DigestVerifyUpdate(mctx, hdata, hdatalen) <= 0 477e71b7053SJung-uk Kim || !EVP_MD_CTX_ctrl(mctx, EVP_CTRL_SSL3_MASTER_SECRET, 478e71b7053SJung-uk Kim (int)s->session->master_key_length, 479e71b7053SJung-uk Kim s->session->master_key)) { 480e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_TLS_PROCESS_CERT_VERIFY, 481e71b7053SJung-uk Kim ERR_R_EVP_LIB); 482e71b7053SJung-uk Kim goto err; 483e71b7053SJung-uk Kim } 484e71b7053SJung-uk Kim if (EVP_DigestVerifyFinal(mctx, data, len) <= 0) { 485e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_DECRYPT_ERROR, SSL_F_TLS_PROCESS_CERT_VERIFY, 486e71b7053SJung-uk Kim SSL_R_BAD_SIGNATURE); 487e71b7053SJung-uk Kim goto err; 488e71b7053SJung-uk Kim } 489e71b7053SJung-uk Kim } else { 490e71b7053SJung-uk Kim j = EVP_DigestVerify(mctx, data, len, hdata, hdatalen); 491e71b7053SJung-uk Kim if (j <= 0) { 492e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_DECRYPT_ERROR, SSL_F_TLS_PROCESS_CERT_VERIFY, 493e71b7053SJung-uk Kim SSL_R_BAD_SIGNATURE); 494e71b7053SJung-uk Kim goto err; 495e71b7053SJung-uk Kim } 496e71b7053SJung-uk Kim } 497e71b7053SJung-uk Kim 498*c9cf7b5cSJung-uk Kim /* 499*c9cf7b5cSJung-uk Kim * In TLSv1.3 on the client side we make sure we prepare the client 500*c9cf7b5cSJung-uk Kim * certificate after the CertVerify instead of when we get the 501*c9cf7b5cSJung-uk Kim * CertificateRequest. This is because in TLSv1.3 the CertificateRequest 502*c9cf7b5cSJung-uk Kim * comes *before* the Certificate message. In TLSv1.2 it comes after. We 503*c9cf7b5cSJung-uk Kim * want to make sure that SSL_get_peer_certificate() will return the actual 504*c9cf7b5cSJung-uk Kim * server certificate from the client_cert_cb callback. 505*c9cf7b5cSJung-uk Kim */ 506*c9cf7b5cSJung-uk Kim if (!s->server && SSL_IS_TLS13(s) && s->s3->tmp.cert_req == 1) 507*c9cf7b5cSJung-uk Kim ret = MSG_PROCESS_CONTINUE_PROCESSING; 508*c9cf7b5cSJung-uk Kim else 509e71b7053SJung-uk Kim ret = MSG_PROCESS_CONTINUE_READING; 510e71b7053SJung-uk Kim err: 511e71b7053SJung-uk Kim BIO_free(s->s3->handshake_buffer); 512e71b7053SJung-uk Kim s->s3->handshake_buffer = NULL; 513e71b7053SJung-uk Kim EVP_MD_CTX_free(mctx); 514e71b7053SJung-uk Kim #ifndef OPENSSL_NO_GOST 515e71b7053SJung-uk Kim OPENSSL_free(gost_data); 516e71b7053SJung-uk Kim #endif 517e71b7053SJung-uk Kim return ret; 518e71b7053SJung-uk Kim } 519e71b7053SJung-uk Kim 520e71b7053SJung-uk Kim int tls_construct_finished(SSL *s, WPACKET *pkt) 521e71b7053SJung-uk Kim { 522e71b7053SJung-uk Kim size_t finish_md_len; 523e71b7053SJung-uk Kim const char *sender; 524e71b7053SJung-uk Kim size_t slen; 525e71b7053SJung-uk Kim 526e71b7053SJung-uk Kim /* This is a real handshake so make sure we clean it up at the end */ 527e71b7053SJung-uk Kim if (!s->server && s->post_handshake_auth != SSL_PHA_REQUESTED) 528e71b7053SJung-uk Kim s->statem.cleanuphand = 1; 529e71b7053SJung-uk Kim 530e71b7053SJung-uk Kim /* 531e71b7053SJung-uk Kim * We only change the keys if we didn't already do this when we sent the 532e71b7053SJung-uk Kim * client certificate 533e71b7053SJung-uk Kim */ 534e71b7053SJung-uk Kim if (SSL_IS_TLS13(s) 535e71b7053SJung-uk Kim && !s->server 536e71b7053SJung-uk Kim && s->s3->tmp.cert_req == 0 537e71b7053SJung-uk Kim && (!s->method->ssl3_enc->change_cipher_state(s, 538e71b7053SJung-uk Kim SSL3_CC_HANDSHAKE | SSL3_CHANGE_CIPHER_CLIENT_WRITE))) {; 539e71b7053SJung-uk Kim /* SSLfatal() already called */ 540e71b7053SJung-uk Kim return 0; 541e71b7053SJung-uk Kim } 542e71b7053SJung-uk Kim 543e71b7053SJung-uk Kim if (s->server) { 544e71b7053SJung-uk Kim sender = s->method->ssl3_enc->server_finished_label; 545e71b7053SJung-uk Kim slen = s->method->ssl3_enc->server_finished_label_len; 546e71b7053SJung-uk Kim } else { 547e71b7053SJung-uk Kim sender = s->method->ssl3_enc->client_finished_label; 548e71b7053SJung-uk Kim slen = s->method->ssl3_enc->client_finished_label_len; 549e71b7053SJung-uk Kim } 550e71b7053SJung-uk Kim 551e71b7053SJung-uk Kim finish_md_len = s->method->ssl3_enc->final_finish_mac(s, 552e71b7053SJung-uk Kim sender, slen, 553e71b7053SJung-uk Kim s->s3->tmp.finish_md); 554e71b7053SJung-uk Kim if (finish_md_len == 0) { 555e71b7053SJung-uk Kim /* SSLfatal() already called */ 556e71b7053SJung-uk Kim return 0; 557e71b7053SJung-uk Kim } 558e71b7053SJung-uk Kim 559e71b7053SJung-uk Kim s->s3->tmp.finish_md_len = finish_md_len; 560e71b7053SJung-uk Kim 561e71b7053SJung-uk Kim if (!WPACKET_memcpy(pkt, s->s3->tmp.finish_md, finish_md_len)) { 562e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_TLS_CONSTRUCT_FINISHED, 563e71b7053SJung-uk Kim ERR_R_INTERNAL_ERROR); 564e71b7053SJung-uk Kim return 0; 565e71b7053SJung-uk Kim } 566e71b7053SJung-uk Kim 567e71b7053SJung-uk Kim /* 568e71b7053SJung-uk Kim * Log the master secret, if logging is enabled. We don't log it for 569e71b7053SJung-uk Kim * TLSv1.3: there's a different key schedule for that. 570e71b7053SJung-uk Kim */ 571e71b7053SJung-uk Kim if (!SSL_IS_TLS13(s) && !ssl_log_secret(s, MASTER_SECRET_LABEL, 572e71b7053SJung-uk Kim s->session->master_key, 573e71b7053SJung-uk Kim s->session->master_key_length)) { 574e71b7053SJung-uk Kim /* SSLfatal() already called */ 575e71b7053SJung-uk Kim return 0; 576e71b7053SJung-uk Kim } 577e71b7053SJung-uk Kim 578e71b7053SJung-uk Kim /* 579e71b7053SJung-uk Kim * Copy the finished so we can use it for renegotiation checks 580e71b7053SJung-uk Kim */ 581e71b7053SJung-uk Kim if (!ossl_assert(finish_md_len <= EVP_MAX_MD_SIZE)) { 582e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_TLS_CONSTRUCT_FINISHED, 583e71b7053SJung-uk Kim ERR_R_INTERNAL_ERROR); 584e71b7053SJung-uk Kim return 0; 585e71b7053SJung-uk Kim } 586e71b7053SJung-uk Kim if (!s->server) { 587e71b7053SJung-uk Kim memcpy(s->s3->previous_client_finished, s->s3->tmp.finish_md, 588e71b7053SJung-uk Kim finish_md_len); 589e71b7053SJung-uk Kim s->s3->previous_client_finished_len = finish_md_len; 590e71b7053SJung-uk Kim } else { 591e71b7053SJung-uk Kim memcpy(s->s3->previous_server_finished, s->s3->tmp.finish_md, 592e71b7053SJung-uk Kim finish_md_len); 593e71b7053SJung-uk Kim s->s3->previous_server_finished_len = finish_md_len; 594e71b7053SJung-uk Kim } 595e71b7053SJung-uk Kim 596e71b7053SJung-uk Kim return 1; 597e71b7053SJung-uk Kim } 598e71b7053SJung-uk Kim 599e71b7053SJung-uk Kim int tls_construct_key_update(SSL *s, WPACKET *pkt) 600e71b7053SJung-uk Kim { 601e71b7053SJung-uk Kim if (!WPACKET_put_bytes_u8(pkt, s->key_update)) { 602e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_TLS_CONSTRUCT_KEY_UPDATE, 603e71b7053SJung-uk Kim ERR_R_INTERNAL_ERROR); 604e71b7053SJung-uk Kim return 0; 605e71b7053SJung-uk Kim } 606e71b7053SJung-uk Kim 607e71b7053SJung-uk Kim s->key_update = SSL_KEY_UPDATE_NONE; 608e71b7053SJung-uk Kim return 1; 609e71b7053SJung-uk Kim } 610e71b7053SJung-uk Kim 611e71b7053SJung-uk Kim MSG_PROCESS_RETURN tls_process_key_update(SSL *s, PACKET *pkt) 612e71b7053SJung-uk Kim { 613e71b7053SJung-uk Kim unsigned int updatetype; 614e71b7053SJung-uk Kim 615e71b7053SJung-uk Kim s->key_update_count++; 616e71b7053SJung-uk Kim if (s->key_update_count > MAX_KEY_UPDATE_MESSAGES) { 617e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_ILLEGAL_PARAMETER, SSL_F_TLS_PROCESS_KEY_UPDATE, 618e71b7053SJung-uk Kim SSL_R_TOO_MANY_KEY_UPDATES); 619e71b7053SJung-uk Kim return MSG_PROCESS_ERROR; 620e71b7053SJung-uk Kim } 621e71b7053SJung-uk Kim 622e71b7053SJung-uk Kim /* 623e71b7053SJung-uk Kim * A KeyUpdate message signals a key change so the end of the message must 624e71b7053SJung-uk Kim * be on a record boundary. 625e71b7053SJung-uk Kim */ 626e71b7053SJung-uk Kim if (RECORD_LAYER_processed_read_pending(&s->rlayer)) { 627e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_UNEXPECTED_MESSAGE, SSL_F_TLS_PROCESS_KEY_UPDATE, 628e71b7053SJung-uk Kim SSL_R_NOT_ON_RECORD_BOUNDARY); 629e71b7053SJung-uk Kim return MSG_PROCESS_ERROR; 630e71b7053SJung-uk Kim } 631e71b7053SJung-uk Kim 632e71b7053SJung-uk Kim if (!PACKET_get_1(pkt, &updatetype) 633e71b7053SJung-uk Kim || PACKET_remaining(pkt) != 0) { 634e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_DECODE_ERROR, SSL_F_TLS_PROCESS_KEY_UPDATE, 635e71b7053SJung-uk Kim SSL_R_BAD_KEY_UPDATE); 636e71b7053SJung-uk Kim return MSG_PROCESS_ERROR; 637e71b7053SJung-uk Kim } 638e71b7053SJung-uk Kim 639e71b7053SJung-uk Kim /* 640e71b7053SJung-uk Kim * There are only two defined key update types. Fail if we get a value we 641e71b7053SJung-uk Kim * didn't recognise. 642e71b7053SJung-uk Kim */ 643e71b7053SJung-uk Kim if (updatetype != SSL_KEY_UPDATE_NOT_REQUESTED 644e71b7053SJung-uk Kim && updatetype != SSL_KEY_UPDATE_REQUESTED) { 645e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_ILLEGAL_PARAMETER, SSL_F_TLS_PROCESS_KEY_UPDATE, 646e71b7053SJung-uk Kim SSL_R_BAD_KEY_UPDATE); 647e71b7053SJung-uk Kim return MSG_PROCESS_ERROR; 648e71b7053SJung-uk Kim } 649e71b7053SJung-uk Kim 650e71b7053SJung-uk Kim /* 651e71b7053SJung-uk Kim * If we get a request for us to update our sending keys too then, we need 652e71b7053SJung-uk Kim * to additionally send a KeyUpdate message. However that message should 653e71b7053SJung-uk Kim * not also request an update (otherwise we get into an infinite loop). We 654e71b7053SJung-uk Kim * ignore a request for us to update our sending keys too if we already 655e71b7053SJung-uk Kim * sent close_notify. 656e71b7053SJung-uk Kim */ 657e71b7053SJung-uk Kim if (updatetype == SSL_KEY_UPDATE_REQUESTED 658e71b7053SJung-uk Kim && (s->shutdown & SSL_SENT_SHUTDOWN) == 0) 659e71b7053SJung-uk Kim s->key_update = SSL_KEY_UPDATE_NOT_REQUESTED; 660e71b7053SJung-uk Kim 661e71b7053SJung-uk Kim if (!tls13_update_key(s, 0)) { 662e71b7053SJung-uk Kim /* SSLfatal() already called */ 663e71b7053SJung-uk Kim return MSG_PROCESS_ERROR; 664e71b7053SJung-uk Kim } 665e71b7053SJung-uk Kim 666e71b7053SJung-uk Kim return MSG_PROCESS_FINISHED_READING; 667e71b7053SJung-uk Kim } 668e71b7053SJung-uk Kim 669e71b7053SJung-uk Kim /* 670e71b7053SJung-uk Kim * ssl3_take_mac calculates the Finished MAC for the handshakes messages seen 671e71b7053SJung-uk Kim * to far. 672e71b7053SJung-uk Kim */ 673e71b7053SJung-uk Kim int ssl3_take_mac(SSL *s) 674e71b7053SJung-uk Kim { 675e71b7053SJung-uk Kim const char *sender; 676e71b7053SJung-uk Kim size_t slen; 677e71b7053SJung-uk Kim 678e71b7053SJung-uk Kim if (!s->server) { 679e71b7053SJung-uk Kim sender = s->method->ssl3_enc->server_finished_label; 680e71b7053SJung-uk Kim slen = s->method->ssl3_enc->server_finished_label_len; 681e71b7053SJung-uk Kim } else { 682e71b7053SJung-uk Kim sender = s->method->ssl3_enc->client_finished_label; 683e71b7053SJung-uk Kim slen = s->method->ssl3_enc->client_finished_label_len; 684e71b7053SJung-uk Kim } 685e71b7053SJung-uk Kim 686e71b7053SJung-uk Kim s->s3->tmp.peer_finish_md_len = 687e71b7053SJung-uk Kim s->method->ssl3_enc->final_finish_mac(s, sender, slen, 688e71b7053SJung-uk Kim s->s3->tmp.peer_finish_md); 689e71b7053SJung-uk Kim 690e71b7053SJung-uk Kim if (s->s3->tmp.peer_finish_md_len == 0) { 691e71b7053SJung-uk Kim /* SSLfatal() already called */ 692e71b7053SJung-uk Kim return 0; 693e71b7053SJung-uk Kim } 694e71b7053SJung-uk Kim 695e71b7053SJung-uk Kim return 1; 696e71b7053SJung-uk Kim } 697e71b7053SJung-uk Kim 698e71b7053SJung-uk Kim MSG_PROCESS_RETURN tls_process_change_cipher_spec(SSL *s, PACKET *pkt) 699e71b7053SJung-uk Kim { 700e71b7053SJung-uk Kim size_t remain; 701e71b7053SJung-uk Kim 702e71b7053SJung-uk Kim remain = PACKET_remaining(pkt); 703e71b7053SJung-uk Kim /* 704e71b7053SJung-uk Kim * 'Change Cipher Spec' is just a single byte, which should already have 705e71b7053SJung-uk Kim * been consumed by ssl_get_message() so there should be no bytes left, 706e71b7053SJung-uk Kim * unless we're using DTLS1_BAD_VER, which has an extra 2 bytes 707e71b7053SJung-uk Kim */ 708e71b7053SJung-uk Kim if (SSL_IS_DTLS(s)) { 709e71b7053SJung-uk Kim if ((s->version == DTLS1_BAD_VER 710e71b7053SJung-uk Kim && remain != DTLS1_CCS_HEADER_LENGTH + 1) 711e71b7053SJung-uk Kim || (s->version != DTLS1_BAD_VER 712e71b7053SJung-uk Kim && remain != DTLS1_CCS_HEADER_LENGTH - 1)) { 713e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_DECODE_ERROR, 714e71b7053SJung-uk Kim SSL_F_TLS_PROCESS_CHANGE_CIPHER_SPEC, 715e71b7053SJung-uk Kim SSL_R_BAD_CHANGE_CIPHER_SPEC); 716e71b7053SJung-uk Kim return MSG_PROCESS_ERROR; 717e71b7053SJung-uk Kim } 718e71b7053SJung-uk Kim } else { 719e71b7053SJung-uk Kim if (remain != 0) { 720e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_DECODE_ERROR, 721e71b7053SJung-uk Kim SSL_F_TLS_PROCESS_CHANGE_CIPHER_SPEC, 722e71b7053SJung-uk Kim SSL_R_BAD_CHANGE_CIPHER_SPEC); 723e71b7053SJung-uk Kim return MSG_PROCESS_ERROR; 724e71b7053SJung-uk Kim } 725e71b7053SJung-uk Kim } 726e71b7053SJung-uk Kim 727e71b7053SJung-uk Kim /* Check we have a cipher to change to */ 728e71b7053SJung-uk Kim if (s->s3->tmp.new_cipher == NULL) { 729e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_UNEXPECTED_MESSAGE, 730e71b7053SJung-uk Kim SSL_F_TLS_PROCESS_CHANGE_CIPHER_SPEC, SSL_R_CCS_RECEIVED_EARLY); 731e71b7053SJung-uk Kim return MSG_PROCESS_ERROR; 732e71b7053SJung-uk Kim } 733e71b7053SJung-uk Kim 734e71b7053SJung-uk Kim s->s3->change_cipher_spec = 1; 735e71b7053SJung-uk Kim if (!ssl3_do_change_cipher_spec(s)) { 736e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_TLS_PROCESS_CHANGE_CIPHER_SPEC, 737e71b7053SJung-uk Kim ERR_R_INTERNAL_ERROR); 738e71b7053SJung-uk Kim return MSG_PROCESS_ERROR; 739e71b7053SJung-uk Kim } 740e71b7053SJung-uk Kim 741e71b7053SJung-uk Kim if (SSL_IS_DTLS(s)) { 742e71b7053SJung-uk Kim dtls1_reset_seq_numbers(s, SSL3_CC_READ); 743e71b7053SJung-uk Kim 744e71b7053SJung-uk Kim if (s->version == DTLS1_BAD_VER) 745e71b7053SJung-uk Kim s->d1->handshake_read_seq++; 746e71b7053SJung-uk Kim 747e71b7053SJung-uk Kim #ifndef OPENSSL_NO_SCTP 748e71b7053SJung-uk Kim /* 749e71b7053SJung-uk Kim * Remember that a CCS has been received, so that an old key of 750e71b7053SJung-uk Kim * SCTP-Auth can be deleted when a CCS is sent. Will be ignored if no 751e71b7053SJung-uk Kim * SCTP is used 752e71b7053SJung-uk Kim */ 753e71b7053SJung-uk Kim BIO_ctrl(SSL_get_wbio(s), BIO_CTRL_DGRAM_SCTP_AUTH_CCS_RCVD, 1, NULL); 754e71b7053SJung-uk Kim #endif 755e71b7053SJung-uk Kim } 756e71b7053SJung-uk Kim 757e71b7053SJung-uk Kim return MSG_PROCESS_CONTINUE_READING; 758e71b7053SJung-uk Kim } 759e71b7053SJung-uk Kim 760e71b7053SJung-uk Kim MSG_PROCESS_RETURN tls_process_finished(SSL *s, PACKET *pkt) 761e71b7053SJung-uk Kim { 762e71b7053SJung-uk Kim size_t md_len; 763e71b7053SJung-uk Kim 764e71b7053SJung-uk Kim 765e71b7053SJung-uk Kim /* This is a real handshake so make sure we clean it up at the end */ 766e71b7053SJung-uk Kim if (s->server) { 767e71b7053SJung-uk Kim /* 768e71b7053SJung-uk Kim * To get this far we must have read encrypted data from the client. We 769e71b7053SJung-uk Kim * no longer tolerate unencrypted alerts. This value is ignored if less 770e71b7053SJung-uk Kim * than TLSv1.3 771e71b7053SJung-uk Kim */ 772e71b7053SJung-uk Kim s->statem.enc_read_state = ENC_READ_STATE_VALID; 773e71b7053SJung-uk Kim if (s->post_handshake_auth != SSL_PHA_REQUESTED) 774e71b7053SJung-uk Kim s->statem.cleanuphand = 1; 775e71b7053SJung-uk Kim if (SSL_IS_TLS13(s) && !tls13_save_handshake_digest_for_pha(s)) { 776e71b7053SJung-uk Kim /* SSLfatal() already called */ 777e71b7053SJung-uk Kim return MSG_PROCESS_ERROR; 778e71b7053SJung-uk Kim } 779e71b7053SJung-uk Kim } 780e71b7053SJung-uk Kim 781e71b7053SJung-uk Kim /* 782e71b7053SJung-uk Kim * In TLSv1.3 a Finished message signals a key change so the end of the 783e71b7053SJung-uk Kim * message must be on a record boundary. 784e71b7053SJung-uk Kim */ 785e71b7053SJung-uk Kim if (SSL_IS_TLS13(s) && RECORD_LAYER_processed_read_pending(&s->rlayer)) { 786e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_UNEXPECTED_MESSAGE, SSL_F_TLS_PROCESS_FINISHED, 787e71b7053SJung-uk Kim SSL_R_NOT_ON_RECORD_BOUNDARY); 788e71b7053SJung-uk Kim return MSG_PROCESS_ERROR; 789e71b7053SJung-uk Kim } 790e71b7053SJung-uk Kim 791e71b7053SJung-uk Kim /* If this occurs, we have missed a message */ 792e71b7053SJung-uk Kim if (!SSL_IS_TLS13(s) && !s->s3->change_cipher_spec) { 793e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_UNEXPECTED_MESSAGE, SSL_F_TLS_PROCESS_FINISHED, 794e71b7053SJung-uk Kim SSL_R_GOT_A_FIN_BEFORE_A_CCS); 795e71b7053SJung-uk Kim return MSG_PROCESS_ERROR; 796e71b7053SJung-uk Kim } 797e71b7053SJung-uk Kim s->s3->change_cipher_spec = 0; 798e71b7053SJung-uk Kim 799e71b7053SJung-uk Kim md_len = s->s3->tmp.peer_finish_md_len; 800e71b7053SJung-uk Kim 801e71b7053SJung-uk Kim if (md_len != PACKET_remaining(pkt)) { 802e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_DECODE_ERROR, SSL_F_TLS_PROCESS_FINISHED, 803e71b7053SJung-uk Kim SSL_R_BAD_DIGEST_LENGTH); 804e71b7053SJung-uk Kim return MSG_PROCESS_ERROR; 805e71b7053SJung-uk Kim } 806e71b7053SJung-uk Kim 807e71b7053SJung-uk Kim if (CRYPTO_memcmp(PACKET_data(pkt), s->s3->tmp.peer_finish_md, 808e71b7053SJung-uk Kim md_len) != 0) { 809e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_DECRYPT_ERROR, SSL_F_TLS_PROCESS_FINISHED, 810e71b7053SJung-uk Kim SSL_R_DIGEST_CHECK_FAILED); 811e71b7053SJung-uk Kim return MSG_PROCESS_ERROR; 812e71b7053SJung-uk Kim } 813e71b7053SJung-uk Kim 814e71b7053SJung-uk Kim /* 815e71b7053SJung-uk Kim * Copy the finished so we can use it for renegotiation checks 816e71b7053SJung-uk Kim */ 817e71b7053SJung-uk Kim if (!ossl_assert(md_len <= EVP_MAX_MD_SIZE)) { 818e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_TLS_PROCESS_FINISHED, 819e71b7053SJung-uk Kim ERR_R_INTERNAL_ERROR); 820e71b7053SJung-uk Kim return MSG_PROCESS_ERROR; 821e71b7053SJung-uk Kim } 822e71b7053SJung-uk Kim if (s->server) { 823e71b7053SJung-uk Kim memcpy(s->s3->previous_client_finished, s->s3->tmp.peer_finish_md, 824e71b7053SJung-uk Kim md_len); 825e71b7053SJung-uk Kim s->s3->previous_client_finished_len = md_len; 826e71b7053SJung-uk Kim } else { 827e71b7053SJung-uk Kim memcpy(s->s3->previous_server_finished, s->s3->tmp.peer_finish_md, 828e71b7053SJung-uk Kim md_len); 829e71b7053SJung-uk Kim s->s3->previous_server_finished_len = md_len; 830e71b7053SJung-uk Kim } 831e71b7053SJung-uk Kim 832e71b7053SJung-uk Kim /* 833e71b7053SJung-uk Kim * In TLS1.3 we also have to change cipher state and do any final processing 834e71b7053SJung-uk Kim * of the initial server flight (if we are a client) 835e71b7053SJung-uk Kim */ 836e71b7053SJung-uk Kim if (SSL_IS_TLS13(s)) { 837e71b7053SJung-uk Kim if (s->server) { 838e71b7053SJung-uk Kim if (s->post_handshake_auth != SSL_PHA_REQUESTED && 839e71b7053SJung-uk Kim !s->method->ssl3_enc->change_cipher_state(s, 840e71b7053SJung-uk Kim SSL3_CC_APPLICATION | SSL3_CHANGE_CIPHER_SERVER_READ)) { 841e71b7053SJung-uk Kim /* SSLfatal() already called */ 842e71b7053SJung-uk Kim return MSG_PROCESS_ERROR; 843e71b7053SJung-uk Kim } 844e71b7053SJung-uk Kim } else { 845e71b7053SJung-uk Kim if (!s->method->ssl3_enc->generate_master_secret(s, 846e71b7053SJung-uk Kim s->master_secret, s->handshake_secret, 0, 847e71b7053SJung-uk Kim &s->session->master_key_length)) { 848e71b7053SJung-uk Kim /* SSLfatal() already called */ 849e71b7053SJung-uk Kim return MSG_PROCESS_ERROR; 850e71b7053SJung-uk Kim } 851e71b7053SJung-uk Kim if (!s->method->ssl3_enc->change_cipher_state(s, 852e71b7053SJung-uk Kim SSL3_CC_APPLICATION | SSL3_CHANGE_CIPHER_CLIENT_READ)) { 853e71b7053SJung-uk Kim /* SSLfatal() already called */ 854e71b7053SJung-uk Kim return MSG_PROCESS_ERROR; 855e71b7053SJung-uk Kim } 856e71b7053SJung-uk Kim if (!tls_process_initial_server_flight(s)) { 857e71b7053SJung-uk Kim /* SSLfatal() already called */ 858e71b7053SJung-uk Kim return MSG_PROCESS_ERROR; 859e71b7053SJung-uk Kim } 860e71b7053SJung-uk Kim } 861e71b7053SJung-uk Kim } 862e71b7053SJung-uk Kim 863e71b7053SJung-uk Kim return MSG_PROCESS_FINISHED_READING; 864e71b7053SJung-uk Kim } 865e71b7053SJung-uk Kim 866e71b7053SJung-uk Kim int tls_construct_change_cipher_spec(SSL *s, WPACKET *pkt) 867e71b7053SJung-uk Kim { 868e71b7053SJung-uk Kim if (!WPACKET_put_bytes_u8(pkt, SSL3_MT_CCS)) { 869e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_INTERNAL_ERROR, 870e71b7053SJung-uk Kim SSL_F_TLS_CONSTRUCT_CHANGE_CIPHER_SPEC, ERR_R_INTERNAL_ERROR); 871e71b7053SJung-uk Kim return 0; 872e71b7053SJung-uk Kim } 873e71b7053SJung-uk Kim 874e71b7053SJung-uk Kim return 1; 875e71b7053SJung-uk Kim } 876e71b7053SJung-uk Kim 877e71b7053SJung-uk Kim /* Add a certificate to the WPACKET */ 878e71b7053SJung-uk Kim static int ssl_add_cert_to_wpacket(SSL *s, WPACKET *pkt, X509 *x, int chain) 879e71b7053SJung-uk Kim { 880e71b7053SJung-uk Kim int len; 881e71b7053SJung-uk Kim unsigned char *outbytes; 882e71b7053SJung-uk Kim 883e71b7053SJung-uk Kim len = i2d_X509(x, NULL); 884e71b7053SJung-uk Kim if (len < 0) { 885e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_SSL_ADD_CERT_TO_WPACKET, 886e71b7053SJung-uk Kim ERR_R_BUF_LIB); 887e71b7053SJung-uk Kim return 0; 888e71b7053SJung-uk Kim } 889e71b7053SJung-uk Kim if (!WPACKET_sub_allocate_bytes_u24(pkt, len, &outbytes) 890e71b7053SJung-uk Kim || i2d_X509(x, &outbytes) != len) { 891e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_SSL_ADD_CERT_TO_WPACKET, 892e71b7053SJung-uk Kim ERR_R_INTERNAL_ERROR); 893e71b7053SJung-uk Kim return 0; 894e71b7053SJung-uk Kim } 895e71b7053SJung-uk Kim 896e71b7053SJung-uk Kim if (SSL_IS_TLS13(s) 897e71b7053SJung-uk Kim && !tls_construct_extensions(s, pkt, SSL_EXT_TLS1_3_CERTIFICATE, x, 898e71b7053SJung-uk Kim chain)) { 899e71b7053SJung-uk Kim /* SSLfatal() already called */ 900e71b7053SJung-uk Kim return 0; 901e71b7053SJung-uk Kim } 902e71b7053SJung-uk Kim 903e71b7053SJung-uk Kim return 1; 904e71b7053SJung-uk Kim } 905e71b7053SJung-uk Kim 906e71b7053SJung-uk Kim /* Add certificate chain to provided WPACKET */ 907e71b7053SJung-uk Kim static int ssl_add_cert_chain(SSL *s, WPACKET *pkt, CERT_PKEY *cpk) 908e71b7053SJung-uk Kim { 909e71b7053SJung-uk Kim int i, chain_count; 910e71b7053SJung-uk Kim X509 *x; 911e71b7053SJung-uk Kim STACK_OF(X509) *extra_certs; 912e71b7053SJung-uk Kim STACK_OF(X509) *chain = NULL; 913e71b7053SJung-uk Kim X509_STORE *chain_store; 914e71b7053SJung-uk Kim 915e71b7053SJung-uk Kim if (cpk == NULL || cpk->x509 == NULL) 916e71b7053SJung-uk Kim return 1; 917e71b7053SJung-uk Kim 918e71b7053SJung-uk Kim x = cpk->x509; 919e71b7053SJung-uk Kim 920e71b7053SJung-uk Kim /* 921e71b7053SJung-uk Kim * If we have a certificate specific chain use it, else use parent ctx. 922e71b7053SJung-uk Kim */ 923e71b7053SJung-uk Kim if (cpk->chain != NULL) 924e71b7053SJung-uk Kim extra_certs = cpk->chain; 925e71b7053SJung-uk Kim else 926e71b7053SJung-uk Kim extra_certs = s->ctx->extra_certs; 927e71b7053SJung-uk Kim 928e71b7053SJung-uk Kim if ((s->mode & SSL_MODE_NO_AUTO_CHAIN) || extra_certs) 929e71b7053SJung-uk Kim chain_store = NULL; 930e71b7053SJung-uk Kim else if (s->cert->chain_store) 931e71b7053SJung-uk Kim chain_store = s->cert->chain_store; 932e71b7053SJung-uk Kim else 933e71b7053SJung-uk Kim chain_store = s->ctx->cert_store; 934e71b7053SJung-uk Kim 935e71b7053SJung-uk Kim if (chain_store != NULL) { 936e71b7053SJung-uk Kim X509_STORE_CTX *xs_ctx = X509_STORE_CTX_new(); 937e71b7053SJung-uk Kim 938e71b7053SJung-uk Kim if (xs_ctx == NULL) { 939e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_SSL_ADD_CERT_CHAIN, 940e71b7053SJung-uk Kim ERR_R_MALLOC_FAILURE); 941e71b7053SJung-uk Kim return 0; 942e71b7053SJung-uk Kim } 943e71b7053SJung-uk Kim if (!X509_STORE_CTX_init(xs_ctx, chain_store, x, NULL)) { 944e71b7053SJung-uk Kim X509_STORE_CTX_free(xs_ctx); 945e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_SSL_ADD_CERT_CHAIN, 946e71b7053SJung-uk Kim ERR_R_X509_LIB); 947e71b7053SJung-uk Kim return 0; 948e71b7053SJung-uk Kim } 949e71b7053SJung-uk Kim /* 950e71b7053SJung-uk Kim * It is valid for the chain not to be complete (because normally we 951e71b7053SJung-uk Kim * don't include the root cert in the chain). Therefore we deliberately 952e71b7053SJung-uk Kim * ignore the error return from this call. We're not actually verifying 953e71b7053SJung-uk Kim * the cert - we're just building as much of the chain as we can 954e71b7053SJung-uk Kim */ 955e71b7053SJung-uk Kim (void)X509_verify_cert(xs_ctx); 956e71b7053SJung-uk Kim /* Don't leave errors in the queue */ 957e71b7053SJung-uk Kim ERR_clear_error(); 958e71b7053SJung-uk Kim chain = X509_STORE_CTX_get0_chain(xs_ctx); 959e71b7053SJung-uk Kim i = ssl_security_cert_chain(s, chain, NULL, 0); 960e71b7053SJung-uk Kim if (i != 1) { 961e71b7053SJung-uk Kim #if 0 962e71b7053SJung-uk Kim /* Dummy error calls so mkerr generates them */ 963e71b7053SJung-uk Kim SSLerr(SSL_F_SSL_ADD_CERT_CHAIN, SSL_R_EE_KEY_TOO_SMALL); 964e71b7053SJung-uk Kim SSLerr(SSL_F_SSL_ADD_CERT_CHAIN, SSL_R_CA_KEY_TOO_SMALL); 965e71b7053SJung-uk Kim SSLerr(SSL_F_SSL_ADD_CERT_CHAIN, SSL_R_CA_MD_TOO_WEAK); 966e71b7053SJung-uk Kim #endif 967e71b7053SJung-uk Kim X509_STORE_CTX_free(xs_ctx); 968e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_SSL_ADD_CERT_CHAIN, i); 969e71b7053SJung-uk Kim return 0; 970e71b7053SJung-uk Kim } 971e71b7053SJung-uk Kim chain_count = sk_X509_num(chain); 972e71b7053SJung-uk Kim for (i = 0; i < chain_count; i++) { 973e71b7053SJung-uk Kim x = sk_X509_value(chain, i); 974e71b7053SJung-uk Kim 975e71b7053SJung-uk Kim if (!ssl_add_cert_to_wpacket(s, pkt, x, i)) { 976e71b7053SJung-uk Kim /* SSLfatal() already called */ 977e71b7053SJung-uk Kim X509_STORE_CTX_free(xs_ctx); 978e71b7053SJung-uk Kim return 0; 979e71b7053SJung-uk Kim } 980e71b7053SJung-uk Kim } 981e71b7053SJung-uk Kim X509_STORE_CTX_free(xs_ctx); 982e71b7053SJung-uk Kim } else { 983e71b7053SJung-uk Kim i = ssl_security_cert_chain(s, extra_certs, x, 0); 984e71b7053SJung-uk Kim if (i != 1) { 985e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_SSL_ADD_CERT_CHAIN, i); 986e71b7053SJung-uk Kim return 0; 987e71b7053SJung-uk Kim } 988e71b7053SJung-uk Kim if (!ssl_add_cert_to_wpacket(s, pkt, x, 0)) { 989e71b7053SJung-uk Kim /* SSLfatal() already called */ 990e71b7053SJung-uk Kim return 0; 991e71b7053SJung-uk Kim } 992e71b7053SJung-uk Kim for (i = 0; i < sk_X509_num(extra_certs); i++) { 993e71b7053SJung-uk Kim x = sk_X509_value(extra_certs, i); 994e71b7053SJung-uk Kim if (!ssl_add_cert_to_wpacket(s, pkt, x, i + 1)) { 995e71b7053SJung-uk Kim /* SSLfatal() already called */ 996e71b7053SJung-uk Kim return 0; 997e71b7053SJung-uk Kim } 998e71b7053SJung-uk Kim } 999e71b7053SJung-uk Kim } 1000e71b7053SJung-uk Kim return 1; 1001e71b7053SJung-uk Kim } 1002e71b7053SJung-uk Kim 1003e71b7053SJung-uk Kim unsigned long ssl3_output_cert_chain(SSL *s, WPACKET *pkt, CERT_PKEY *cpk) 1004e71b7053SJung-uk Kim { 1005e71b7053SJung-uk Kim if (!WPACKET_start_sub_packet_u24(pkt)) { 1006e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_SSL3_OUTPUT_CERT_CHAIN, 1007e71b7053SJung-uk Kim ERR_R_INTERNAL_ERROR); 1008e71b7053SJung-uk Kim return 0; 1009e71b7053SJung-uk Kim } 1010e71b7053SJung-uk Kim 1011e71b7053SJung-uk Kim if (!ssl_add_cert_chain(s, pkt, cpk)) 1012e71b7053SJung-uk Kim return 0; 1013e71b7053SJung-uk Kim 1014e71b7053SJung-uk Kim if (!WPACKET_close(pkt)) { 1015e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_SSL3_OUTPUT_CERT_CHAIN, 1016e71b7053SJung-uk Kim ERR_R_INTERNAL_ERROR); 1017e71b7053SJung-uk Kim return 0; 1018e71b7053SJung-uk Kim } 1019e71b7053SJung-uk Kim 1020e71b7053SJung-uk Kim return 1; 1021e71b7053SJung-uk Kim } 1022e71b7053SJung-uk Kim 1023e71b7053SJung-uk Kim /* 1024e71b7053SJung-uk Kim * Tidy up after the end of a handshake. In the case of SCTP this may result 1025e71b7053SJung-uk Kim * in NBIO events. If |clearbufs| is set then init_buf and the wbio buffer is 1026e71b7053SJung-uk Kim * freed up as well. 1027e71b7053SJung-uk Kim */ 1028e71b7053SJung-uk Kim WORK_STATE tls_finish_handshake(SSL *s, WORK_STATE wst, int clearbufs, int stop) 1029e71b7053SJung-uk Kim { 1030e71b7053SJung-uk Kim void (*cb) (const SSL *ssl, int type, int val) = NULL; 1031e71b7053SJung-uk Kim 1032e71b7053SJung-uk Kim if (clearbufs) { 1033e71b7053SJung-uk Kim if (!SSL_IS_DTLS(s)) { 1034e71b7053SJung-uk Kim /* 1035e71b7053SJung-uk Kim * We don't do this in DTLS because we may still need the init_buf 1036e71b7053SJung-uk Kim * in case there are any unexpected retransmits 1037e71b7053SJung-uk Kim */ 1038e71b7053SJung-uk Kim BUF_MEM_free(s->init_buf); 1039e71b7053SJung-uk Kim s->init_buf = NULL; 1040e71b7053SJung-uk Kim } 1041e71b7053SJung-uk Kim if (!ssl_free_wbio_buffer(s)) { 1042e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_TLS_FINISH_HANDSHAKE, 1043e71b7053SJung-uk Kim ERR_R_INTERNAL_ERROR); 1044e71b7053SJung-uk Kim return WORK_ERROR; 1045e71b7053SJung-uk Kim } 1046e71b7053SJung-uk Kim s->init_num = 0; 1047e71b7053SJung-uk Kim } 1048e71b7053SJung-uk Kim 1049e71b7053SJung-uk Kim if (SSL_IS_TLS13(s) && !s->server 1050e71b7053SJung-uk Kim && s->post_handshake_auth == SSL_PHA_REQUESTED) 1051e71b7053SJung-uk Kim s->post_handshake_auth = SSL_PHA_EXT_SENT; 1052e71b7053SJung-uk Kim 1053e71b7053SJung-uk Kim /* 1054e71b7053SJung-uk Kim * Only set if there was a Finished message and this isn't after a TLSv1.3 1055e71b7053SJung-uk Kim * post handshake exchange 1056e71b7053SJung-uk Kim */ 1057e71b7053SJung-uk Kim if (s->statem.cleanuphand) { 1058e71b7053SJung-uk Kim /* skipped if we just sent a HelloRequest */ 1059e71b7053SJung-uk Kim s->renegotiate = 0; 1060e71b7053SJung-uk Kim s->new_session = 0; 1061e71b7053SJung-uk Kim s->statem.cleanuphand = 0; 1062e71b7053SJung-uk Kim s->ext.ticket_expected = 0; 1063e71b7053SJung-uk Kim 1064e71b7053SJung-uk Kim ssl3_cleanup_key_block(s); 1065e71b7053SJung-uk Kim 1066e71b7053SJung-uk Kim if (s->server) { 1067e71b7053SJung-uk Kim /* 1068e71b7053SJung-uk Kim * In TLSv1.3 we update the cache as part of constructing the 1069e71b7053SJung-uk Kim * NewSessionTicket 1070e71b7053SJung-uk Kim */ 1071e71b7053SJung-uk Kim if (!SSL_IS_TLS13(s)) 1072e71b7053SJung-uk Kim ssl_update_cache(s, SSL_SESS_CACHE_SERVER); 1073e71b7053SJung-uk Kim 1074e71b7053SJung-uk Kim /* N.B. s->ctx may not equal s->session_ctx */ 1075e71b7053SJung-uk Kim tsan_counter(&s->ctx->stats.sess_accept_good); 1076e71b7053SJung-uk Kim s->handshake_func = ossl_statem_accept; 1077e71b7053SJung-uk Kim 1078e71b7053SJung-uk Kim if (SSL_IS_DTLS(s) && !s->hit) { 1079e71b7053SJung-uk Kim /* 1080e71b7053SJung-uk Kim * We are finishing after the client. We start the timer going 1081e71b7053SJung-uk Kim * in case there are any retransmits of our final flight 1082e71b7053SJung-uk Kim * required. 1083e71b7053SJung-uk Kim */ 1084e71b7053SJung-uk Kim dtls1_start_timer(s); 1085e71b7053SJung-uk Kim } 1086e71b7053SJung-uk Kim } else { 1087e71b7053SJung-uk Kim if (SSL_IS_TLS13(s)) { 1088e71b7053SJung-uk Kim /* 1089e71b7053SJung-uk Kim * We encourage applications to only use TLSv1.3 tickets once, 1090e71b7053SJung-uk Kim * so we remove this one from the cache. 1091e71b7053SJung-uk Kim */ 1092e71b7053SJung-uk Kim if ((s->session_ctx->session_cache_mode 1093e71b7053SJung-uk Kim & SSL_SESS_CACHE_CLIENT) != 0) 1094e71b7053SJung-uk Kim SSL_CTX_remove_session(s->session_ctx, s->session); 1095e71b7053SJung-uk Kim } else { 1096e71b7053SJung-uk Kim /* 1097e71b7053SJung-uk Kim * In TLSv1.3 we update the cache as part of processing the 1098e71b7053SJung-uk Kim * NewSessionTicket 1099e71b7053SJung-uk Kim */ 1100e71b7053SJung-uk Kim ssl_update_cache(s, SSL_SESS_CACHE_CLIENT); 1101e71b7053SJung-uk Kim } 1102e71b7053SJung-uk Kim if (s->hit) 1103e71b7053SJung-uk Kim tsan_counter(&s->session_ctx->stats.sess_hit); 1104e71b7053SJung-uk Kim 1105e71b7053SJung-uk Kim s->handshake_func = ossl_statem_connect; 1106e71b7053SJung-uk Kim tsan_counter(&s->session_ctx->stats.sess_connect_good); 1107e71b7053SJung-uk Kim 1108e71b7053SJung-uk Kim if (SSL_IS_DTLS(s) && s->hit) { 1109e71b7053SJung-uk Kim /* 1110e71b7053SJung-uk Kim * We are finishing after the server. We start the timer going 1111e71b7053SJung-uk Kim * in case there are any retransmits of our final flight 1112e71b7053SJung-uk Kim * required. 1113e71b7053SJung-uk Kim */ 1114e71b7053SJung-uk Kim dtls1_start_timer(s); 1115e71b7053SJung-uk Kim } 1116e71b7053SJung-uk Kim } 1117e71b7053SJung-uk Kim 1118e71b7053SJung-uk Kim if (SSL_IS_DTLS(s)) { 1119e71b7053SJung-uk Kim /* done with handshaking */ 1120e71b7053SJung-uk Kim s->d1->handshake_read_seq = 0; 1121e71b7053SJung-uk Kim s->d1->handshake_write_seq = 0; 1122e71b7053SJung-uk Kim s->d1->next_handshake_write_seq = 0; 1123e71b7053SJung-uk Kim dtls1_clear_received_buffer(s); 1124e71b7053SJung-uk Kim } 1125e71b7053SJung-uk Kim } 1126e71b7053SJung-uk Kim 1127e71b7053SJung-uk Kim if (s->info_callback != NULL) 1128e71b7053SJung-uk Kim cb = s->info_callback; 1129e71b7053SJung-uk Kim else if (s->ctx->info_callback != NULL) 1130e71b7053SJung-uk Kim cb = s->ctx->info_callback; 1131e71b7053SJung-uk Kim 1132e71b7053SJung-uk Kim /* The callback may expect us to not be in init at handshake done */ 1133e71b7053SJung-uk Kim ossl_statem_set_in_init(s, 0); 1134e71b7053SJung-uk Kim 1135e71b7053SJung-uk Kim if (cb != NULL) 1136e71b7053SJung-uk Kim cb(s, SSL_CB_HANDSHAKE_DONE, 1); 1137e71b7053SJung-uk Kim 1138e71b7053SJung-uk Kim if (!stop) { 1139e71b7053SJung-uk Kim /* If we've got more work to do we go back into init */ 1140e71b7053SJung-uk Kim ossl_statem_set_in_init(s, 1); 1141e71b7053SJung-uk Kim return WORK_FINISHED_CONTINUE; 1142e71b7053SJung-uk Kim } 1143e71b7053SJung-uk Kim 1144e71b7053SJung-uk Kim return WORK_FINISHED_STOP; 1145e71b7053SJung-uk Kim } 1146e71b7053SJung-uk Kim 1147e71b7053SJung-uk Kim int tls_get_message_header(SSL *s, int *mt) 1148e71b7053SJung-uk Kim { 1149e71b7053SJung-uk Kim /* s->init_num < SSL3_HM_HEADER_LENGTH */ 1150e71b7053SJung-uk Kim int skip_message, i, recvd_type; 1151e71b7053SJung-uk Kim unsigned char *p; 1152e71b7053SJung-uk Kim size_t l, readbytes; 1153e71b7053SJung-uk Kim 1154e71b7053SJung-uk Kim p = (unsigned char *)s->init_buf->data; 1155e71b7053SJung-uk Kim 1156e71b7053SJung-uk Kim do { 1157e71b7053SJung-uk Kim while (s->init_num < SSL3_HM_HEADER_LENGTH) { 1158e71b7053SJung-uk Kim i = s->method->ssl_read_bytes(s, SSL3_RT_HANDSHAKE, &recvd_type, 1159e71b7053SJung-uk Kim &p[s->init_num], 1160e71b7053SJung-uk Kim SSL3_HM_HEADER_LENGTH - s->init_num, 1161e71b7053SJung-uk Kim 0, &readbytes); 1162e71b7053SJung-uk Kim if (i <= 0) { 1163e71b7053SJung-uk Kim s->rwstate = SSL_READING; 1164e71b7053SJung-uk Kim return 0; 1165e71b7053SJung-uk Kim } 1166e71b7053SJung-uk Kim if (recvd_type == SSL3_RT_CHANGE_CIPHER_SPEC) { 1167e71b7053SJung-uk Kim /* 1168e71b7053SJung-uk Kim * A ChangeCipherSpec must be a single byte and may not occur 1169e71b7053SJung-uk Kim * in the middle of a handshake message. 1170e71b7053SJung-uk Kim */ 1171e71b7053SJung-uk Kim if (s->init_num != 0 || readbytes != 1 || p[0] != SSL3_MT_CCS) { 1172e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_UNEXPECTED_MESSAGE, 1173e71b7053SJung-uk Kim SSL_F_TLS_GET_MESSAGE_HEADER, 1174e71b7053SJung-uk Kim SSL_R_BAD_CHANGE_CIPHER_SPEC); 1175e71b7053SJung-uk Kim return 0; 1176e71b7053SJung-uk Kim } 1177e71b7053SJung-uk Kim if (s->statem.hand_state == TLS_ST_BEFORE 1178e71b7053SJung-uk Kim && (s->s3->flags & TLS1_FLAGS_STATELESS) != 0) { 1179e71b7053SJung-uk Kim /* 1180e71b7053SJung-uk Kim * We are stateless and we received a CCS. Probably this is 1181e71b7053SJung-uk Kim * from a client between the first and second ClientHellos. 1182e71b7053SJung-uk Kim * We should ignore this, but return an error because we do 1183e71b7053SJung-uk Kim * not return success until we see the second ClientHello 1184e71b7053SJung-uk Kim * with a valid cookie. 1185e71b7053SJung-uk Kim */ 1186e71b7053SJung-uk Kim return 0; 1187e71b7053SJung-uk Kim } 1188e71b7053SJung-uk Kim s->s3->tmp.message_type = *mt = SSL3_MT_CHANGE_CIPHER_SPEC; 1189e71b7053SJung-uk Kim s->init_num = readbytes - 1; 1190e71b7053SJung-uk Kim s->init_msg = s->init_buf->data; 1191e71b7053SJung-uk Kim s->s3->tmp.message_size = readbytes; 1192e71b7053SJung-uk Kim return 1; 1193e71b7053SJung-uk Kim } else if (recvd_type != SSL3_RT_HANDSHAKE) { 1194e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_UNEXPECTED_MESSAGE, 1195e71b7053SJung-uk Kim SSL_F_TLS_GET_MESSAGE_HEADER, 1196e71b7053SJung-uk Kim SSL_R_CCS_RECEIVED_EARLY); 1197e71b7053SJung-uk Kim return 0; 1198e71b7053SJung-uk Kim } 1199e71b7053SJung-uk Kim s->init_num += readbytes; 1200e71b7053SJung-uk Kim } 1201e71b7053SJung-uk Kim 1202e71b7053SJung-uk Kim skip_message = 0; 1203e71b7053SJung-uk Kim if (!s->server) 1204e71b7053SJung-uk Kim if (s->statem.hand_state != TLS_ST_OK 1205e71b7053SJung-uk Kim && p[0] == SSL3_MT_HELLO_REQUEST) 1206e71b7053SJung-uk Kim /* 1207e71b7053SJung-uk Kim * The server may always send 'Hello Request' messages -- 1208e71b7053SJung-uk Kim * we are doing a handshake anyway now, so ignore them if 1209e71b7053SJung-uk Kim * their format is correct. Does not count for 'Finished' 1210e71b7053SJung-uk Kim * MAC. 1211e71b7053SJung-uk Kim */ 1212e71b7053SJung-uk Kim if (p[1] == 0 && p[2] == 0 && p[3] == 0) { 1213e71b7053SJung-uk Kim s->init_num = 0; 1214e71b7053SJung-uk Kim skip_message = 1; 1215e71b7053SJung-uk Kim 1216e71b7053SJung-uk Kim if (s->msg_callback) 1217e71b7053SJung-uk Kim s->msg_callback(0, s->version, SSL3_RT_HANDSHAKE, 1218e71b7053SJung-uk Kim p, SSL3_HM_HEADER_LENGTH, s, 1219e71b7053SJung-uk Kim s->msg_callback_arg); 1220e71b7053SJung-uk Kim } 1221e71b7053SJung-uk Kim } while (skip_message); 1222e71b7053SJung-uk Kim /* s->init_num == SSL3_HM_HEADER_LENGTH */ 1223e71b7053SJung-uk Kim 1224e71b7053SJung-uk Kim *mt = *p; 1225e71b7053SJung-uk Kim s->s3->tmp.message_type = *(p++); 1226e71b7053SJung-uk Kim 1227e71b7053SJung-uk Kim if (RECORD_LAYER_is_sslv2_record(&s->rlayer)) { 1228e71b7053SJung-uk Kim /* 1229e71b7053SJung-uk Kim * Only happens with SSLv3+ in an SSLv2 backward compatible 1230e71b7053SJung-uk Kim * ClientHello 1231e71b7053SJung-uk Kim * 1232e71b7053SJung-uk Kim * Total message size is the remaining record bytes to read 1233e71b7053SJung-uk Kim * plus the SSL3_HM_HEADER_LENGTH bytes that we already read 1234e71b7053SJung-uk Kim */ 1235e71b7053SJung-uk Kim l = RECORD_LAYER_get_rrec_length(&s->rlayer) 1236e71b7053SJung-uk Kim + SSL3_HM_HEADER_LENGTH; 1237e71b7053SJung-uk Kim s->s3->tmp.message_size = l; 1238e71b7053SJung-uk Kim 1239e71b7053SJung-uk Kim s->init_msg = s->init_buf->data; 1240e71b7053SJung-uk Kim s->init_num = SSL3_HM_HEADER_LENGTH; 1241e71b7053SJung-uk Kim } else { 1242e71b7053SJung-uk Kim n2l3(p, l); 1243e71b7053SJung-uk Kim /* BUF_MEM_grow takes an 'int' parameter */ 1244e71b7053SJung-uk Kim if (l > (INT_MAX - SSL3_HM_HEADER_LENGTH)) { 1245e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_ILLEGAL_PARAMETER, SSL_F_TLS_GET_MESSAGE_HEADER, 1246e71b7053SJung-uk Kim SSL_R_EXCESSIVE_MESSAGE_SIZE); 1247e71b7053SJung-uk Kim return 0; 1248e71b7053SJung-uk Kim } 1249e71b7053SJung-uk Kim s->s3->tmp.message_size = l; 1250e71b7053SJung-uk Kim 1251e71b7053SJung-uk Kim s->init_msg = s->init_buf->data + SSL3_HM_HEADER_LENGTH; 1252e71b7053SJung-uk Kim s->init_num = 0; 1253e71b7053SJung-uk Kim } 1254e71b7053SJung-uk Kim 1255e71b7053SJung-uk Kim return 1; 1256e71b7053SJung-uk Kim } 1257e71b7053SJung-uk Kim 1258e71b7053SJung-uk Kim int tls_get_message_body(SSL *s, size_t *len) 1259e71b7053SJung-uk Kim { 1260e71b7053SJung-uk Kim size_t n, readbytes; 1261e71b7053SJung-uk Kim unsigned char *p; 1262e71b7053SJung-uk Kim int i; 1263e71b7053SJung-uk Kim 1264e71b7053SJung-uk Kim if (s->s3->tmp.message_type == SSL3_MT_CHANGE_CIPHER_SPEC) { 1265e71b7053SJung-uk Kim /* We've already read everything in */ 1266e71b7053SJung-uk Kim *len = (unsigned long)s->init_num; 1267e71b7053SJung-uk Kim return 1; 1268e71b7053SJung-uk Kim } 1269e71b7053SJung-uk Kim 1270e71b7053SJung-uk Kim p = s->init_msg; 1271e71b7053SJung-uk Kim n = s->s3->tmp.message_size - s->init_num; 1272e71b7053SJung-uk Kim while (n > 0) { 1273e71b7053SJung-uk Kim i = s->method->ssl_read_bytes(s, SSL3_RT_HANDSHAKE, NULL, 1274e71b7053SJung-uk Kim &p[s->init_num], n, 0, &readbytes); 1275e71b7053SJung-uk Kim if (i <= 0) { 1276e71b7053SJung-uk Kim s->rwstate = SSL_READING; 1277e71b7053SJung-uk Kim *len = 0; 1278e71b7053SJung-uk Kim return 0; 1279e71b7053SJung-uk Kim } 1280e71b7053SJung-uk Kim s->init_num += readbytes; 1281e71b7053SJung-uk Kim n -= readbytes; 1282e71b7053SJung-uk Kim } 1283e71b7053SJung-uk Kim 1284e71b7053SJung-uk Kim /* 1285e71b7053SJung-uk Kim * If receiving Finished, record MAC of prior handshake messages for 1286e71b7053SJung-uk Kim * Finished verification. 1287e71b7053SJung-uk Kim */ 1288e71b7053SJung-uk Kim if (*(s->init_buf->data) == SSL3_MT_FINISHED && !ssl3_take_mac(s)) { 1289e71b7053SJung-uk Kim /* SSLfatal() already called */ 1290e71b7053SJung-uk Kim *len = 0; 1291e71b7053SJung-uk Kim return 0; 1292e71b7053SJung-uk Kim } 1293e71b7053SJung-uk Kim 1294e71b7053SJung-uk Kim /* Feed this message into MAC computation. */ 1295e71b7053SJung-uk Kim if (RECORD_LAYER_is_sslv2_record(&s->rlayer)) { 1296e71b7053SJung-uk Kim if (!ssl3_finish_mac(s, (unsigned char *)s->init_buf->data, 1297e71b7053SJung-uk Kim s->init_num)) { 1298e71b7053SJung-uk Kim /* SSLfatal() already called */ 1299e71b7053SJung-uk Kim *len = 0; 1300e71b7053SJung-uk Kim return 0; 1301e71b7053SJung-uk Kim } 1302e71b7053SJung-uk Kim if (s->msg_callback) 1303e71b7053SJung-uk Kim s->msg_callback(0, SSL2_VERSION, 0, s->init_buf->data, 1304e71b7053SJung-uk Kim (size_t)s->init_num, s, s->msg_callback_arg); 1305e71b7053SJung-uk Kim } else { 1306e71b7053SJung-uk Kim /* 1307e71b7053SJung-uk Kim * We defer feeding in the HRR until later. We'll do it as part of 1308e71b7053SJung-uk Kim * processing the message 1309e71b7053SJung-uk Kim * The TLsv1.3 handshake transcript stops at the ClientFinished 1310e71b7053SJung-uk Kim * message. 1311e71b7053SJung-uk Kim */ 1312e71b7053SJung-uk Kim #define SERVER_HELLO_RANDOM_OFFSET (SSL3_HM_HEADER_LENGTH + 2) 1313e71b7053SJung-uk Kim /* KeyUpdate and NewSessionTicket do not need to be added */ 1314e71b7053SJung-uk Kim if (!SSL_IS_TLS13(s) || (s->s3->tmp.message_type != SSL3_MT_NEWSESSION_TICKET 1315e71b7053SJung-uk Kim && s->s3->tmp.message_type != SSL3_MT_KEY_UPDATE)) { 1316e71b7053SJung-uk Kim if (s->s3->tmp.message_type != SSL3_MT_SERVER_HELLO 1317e71b7053SJung-uk Kim || s->init_num < SERVER_HELLO_RANDOM_OFFSET + SSL3_RANDOM_SIZE 1318e71b7053SJung-uk Kim || memcmp(hrrrandom, 1319e71b7053SJung-uk Kim s->init_buf->data + SERVER_HELLO_RANDOM_OFFSET, 1320e71b7053SJung-uk Kim SSL3_RANDOM_SIZE) != 0) { 1321e71b7053SJung-uk Kim if (!ssl3_finish_mac(s, (unsigned char *)s->init_buf->data, 1322e71b7053SJung-uk Kim s->init_num + SSL3_HM_HEADER_LENGTH)) { 1323e71b7053SJung-uk Kim /* SSLfatal() already called */ 1324e71b7053SJung-uk Kim *len = 0; 1325e71b7053SJung-uk Kim return 0; 1326e71b7053SJung-uk Kim } 1327e71b7053SJung-uk Kim } 1328e71b7053SJung-uk Kim } 1329e71b7053SJung-uk Kim if (s->msg_callback) 1330e71b7053SJung-uk Kim s->msg_callback(0, s->version, SSL3_RT_HANDSHAKE, s->init_buf->data, 1331e71b7053SJung-uk Kim (size_t)s->init_num + SSL3_HM_HEADER_LENGTH, s, 1332e71b7053SJung-uk Kim s->msg_callback_arg); 1333e71b7053SJung-uk Kim } 1334e71b7053SJung-uk Kim 1335e71b7053SJung-uk Kim *len = s->init_num; 1336e71b7053SJung-uk Kim return 1; 1337e71b7053SJung-uk Kim } 1338e71b7053SJung-uk Kim 1339e71b7053SJung-uk Kim static const X509ERR2ALERT x509table[] = { 1340e71b7053SJung-uk Kim {X509_V_ERR_APPLICATION_VERIFICATION, SSL_AD_HANDSHAKE_FAILURE}, 1341e71b7053SJung-uk Kim {X509_V_ERR_CA_KEY_TOO_SMALL, SSL_AD_BAD_CERTIFICATE}, 1342e71b7053SJung-uk Kim {X509_V_ERR_CA_MD_TOO_WEAK, SSL_AD_BAD_CERTIFICATE}, 1343e71b7053SJung-uk Kim {X509_V_ERR_CERT_CHAIN_TOO_LONG, SSL_AD_UNKNOWN_CA}, 1344e71b7053SJung-uk Kim {X509_V_ERR_CERT_HAS_EXPIRED, SSL_AD_CERTIFICATE_EXPIRED}, 1345e71b7053SJung-uk Kim {X509_V_ERR_CERT_NOT_YET_VALID, SSL_AD_BAD_CERTIFICATE}, 1346e71b7053SJung-uk Kim {X509_V_ERR_CERT_REJECTED, SSL_AD_BAD_CERTIFICATE}, 1347e71b7053SJung-uk Kim {X509_V_ERR_CERT_REVOKED, SSL_AD_CERTIFICATE_REVOKED}, 1348e71b7053SJung-uk Kim {X509_V_ERR_CERT_SIGNATURE_FAILURE, SSL_AD_DECRYPT_ERROR}, 1349e71b7053SJung-uk Kim {X509_V_ERR_CERT_UNTRUSTED, SSL_AD_BAD_CERTIFICATE}, 1350e71b7053SJung-uk Kim {X509_V_ERR_CRL_HAS_EXPIRED, SSL_AD_CERTIFICATE_EXPIRED}, 1351e71b7053SJung-uk Kim {X509_V_ERR_CRL_NOT_YET_VALID, SSL_AD_BAD_CERTIFICATE}, 1352e71b7053SJung-uk Kim {X509_V_ERR_CRL_SIGNATURE_FAILURE, SSL_AD_DECRYPT_ERROR}, 1353e71b7053SJung-uk Kim {X509_V_ERR_DANE_NO_MATCH, SSL_AD_BAD_CERTIFICATE}, 1354e71b7053SJung-uk Kim {X509_V_ERR_DEPTH_ZERO_SELF_SIGNED_CERT, SSL_AD_UNKNOWN_CA}, 1355e71b7053SJung-uk Kim {X509_V_ERR_EE_KEY_TOO_SMALL, SSL_AD_BAD_CERTIFICATE}, 1356e71b7053SJung-uk Kim {X509_V_ERR_EMAIL_MISMATCH, SSL_AD_BAD_CERTIFICATE}, 1357e71b7053SJung-uk Kim {X509_V_ERR_ERROR_IN_CERT_NOT_AFTER_FIELD, SSL_AD_BAD_CERTIFICATE}, 1358e71b7053SJung-uk Kim {X509_V_ERR_ERROR_IN_CERT_NOT_BEFORE_FIELD, SSL_AD_BAD_CERTIFICATE}, 1359e71b7053SJung-uk Kim {X509_V_ERR_ERROR_IN_CRL_LAST_UPDATE_FIELD, SSL_AD_BAD_CERTIFICATE}, 1360e71b7053SJung-uk Kim {X509_V_ERR_ERROR_IN_CRL_NEXT_UPDATE_FIELD, SSL_AD_BAD_CERTIFICATE}, 1361e71b7053SJung-uk Kim {X509_V_ERR_HOSTNAME_MISMATCH, SSL_AD_BAD_CERTIFICATE}, 1362e71b7053SJung-uk Kim {X509_V_ERR_INVALID_CA, SSL_AD_UNKNOWN_CA}, 1363e71b7053SJung-uk Kim {X509_V_ERR_INVALID_CALL, SSL_AD_INTERNAL_ERROR}, 1364e71b7053SJung-uk Kim {X509_V_ERR_INVALID_PURPOSE, SSL_AD_UNSUPPORTED_CERTIFICATE}, 1365e71b7053SJung-uk Kim {X509_V_ERR_IP_ADDRESS_MISMATCH, SSL_AD_BAD_CERTIFICATE}, 1366e71b7053SJung-uk Kim {X509_V_ERR_OUT_OF_MEM, SSL_AD_INTERNAL_ERROR}, 1367e71b7053SJung-uk Kim {X509_V_ERR_PATH_LENGTH_EXCEEDED, SSL_AD_UNKNOWN_CA}, 1368e71b7053SJung-uk Kim {X509_V_ERR_SELF_SIGNED_CERT_IN_CHAIN, SSL_AD_UNKNOWN_CA}, 1369e71b7053SJung-uk Kim {X509_V_ERR_STORE_LOOKUP, SSL_AD_INTERNAL_ERROR}, 1370e71b7053SJung-uk Kim {X509_V_ERR_UNABLE_TO_DECODE_ISSUER_PUBLIC_KEY, SSL_AD_BAD_CERTIFICATE}, 1371e71b7053SJung-uk Kim {X509_V_ERR_UNABLE_TO_DECRYPT_CERT_SIGNATURE, SSL_AD_BAD_CERTIFICATE}, 1372e71b7053SJung-uk Kim {X509_V_ERR_UNABLE_TO_DECRYPT_CRL_SIGNATURE, SSL_AD_BAD_CERTIFICATE}, 1373e71b7053SJung-uk Kim {X509_V_ERR_UNABLE_TO_GET_CRL, SSL_AD_UNKNOWN_CA}, 1374e71b7053SJung-uk Kim {X509_V_ERR_UNABLE_TO_GET_CRL_ISSUER, SSL_AD_UNKNOWN_CA}, 1375e71b7053SJung-uk Kim {X509_V_ERR_UNABLE_TO_GET_ISSUER_CERT, SSL_AD_UNKNOWN_CA}, 1376e71b7053SJung-uk Kim {X509_V_ERR_UNABLE_TO_GET_ISSUER_CERT_LOCALLY, SSL_AD_UNKNOWN_CA}, 1377e71b7053SJung-uk Kim {X509_V_ERR_UNABLE_TO_VERIFY_LEAF_SIGNATURE, SSL_AD_UNKNOWN_CA}, 1378e71b7053SJung-uk Kim {X509_V_ERR_UNSPECIFIED, SSL_AD_INTERNAL_ERROR}, 1379e71b7053SJung-uk Kim 1380e71b7053SJung-uk Kim /* Last entry; return this if we don't find the value above. */ 1381e71b7053SJung-uk Kim {X509_V_OK, SSL_AD_CERTIFICATE_UNKNOWN} 1382e71b7053SJung-uk Kim }; 1383e71b7053SJung-uk Kim 1384e71b7053SJung-uk Kim int ssl_x509err2alert(int x509err) 1385e71b7053SJung-uk Kim { 1386e71b7053SJung-uk Kim const X509ERR2ALERT *tp; 1387e71b7053SJung-uk Kim 1388e71b7053SJung-uk Kim for (tp = x509table; tp->x509err != X509_V_OK; ++tp) 1389e71b7053SJung-uk Kim if (tp->x509err == x509err) 1390e71b7053SJung-uk Kim break; 1391e71b7053SJung-uk Kim return tp->alert; 1392e71b7053SJung-uk Kim } 1393e71b7053SJung-uk Kim 1394e71b7053SJung-uk Kim int ssl_allow_compression(SSL *s) 1395e71b7053SJung-uk Kim { 1396e71b7053SJung-uk Kim if (s->options & SSL_OP_NO_COMPRESSION) 1397e71b7053SJung-uk Kim return 0; 1398e71b7053SJung-uk Kim return ssl_security(s, SSL_SECOP_COMPRESSION, 0, 0, NULL); 1399e71b7053SJung-uk Kim } 1400e71b7053SJung-uk Kim 1401e71b7053SJung-uk Kim static int version_cmp(const SSL *s, int a, int b) 1402e71b7053SJung-uk Kim { 1403e71b7053SJung-uk Kim int dtls = SSL_IS_DTLS(s); 1404e71b7053SJung-uk Kim 1405e71b7053SJung-uk Kim if (a == b) 1406e71b7053SJung-uk Kim return 0; 1407e71b7053SJung-uk Kim if (!dtls) 1408e71b7053SJung-uk Kim return a < b ? -1 : 1; 1409e71b7053SJung-uk Kim return DTLS_VERSION_LT(a, b) ? -1 : 1; 1410e71b7053SJung-uk Kim } 1411e71b7053SJung-uk Kim 1412e71b7053SJung-uk Kim typedef struct { 1413e71b7053SJung-uk Kim int version; 1414e71b7053SJung-uk Kim const SSL_METHOD *(*cmeth) (void); 1415e71b7053SJung-uk Kim const SSL_METHOD *(*smeth) (void); 1416e71b7053SJung-uk Kim } version_info; 1417e71b7053SJung-uk Kim 1418e71b7053SJung-uk Kim #if TLS_MAX_VERSION != TLS1_3_VERSION 1419e71b7053SJung-uk Kim # error Code needs update for TLS_method() support beyond TLS1_3_VERSION. 1420e71b7053SJung-uk Kim #endif 1421e71b7053SJung-uk Kim 1422e71b7053SJung-uk Kim /* Must be in order high to low */ 1423e71b7053SJung-uk Kim static const version_info tls_version_table[] = { 1424e71b7053SJung-uk Kim #ifndef OPENSSL_NO_TLS1_3 1425e71b7053SJung-uk Kim {TLS1_3_VERSION, tlsv1_3_client_method, tlsv1_3_server_method}, 1426e71b7053SJung-uk Kim #else 1427e71b7053SJung-uk Kim {TLS1_3_VERSION, NULL, NULL}, 1428e71b7053SJung-uk Kim #endif 1429e71b7053SJung-uk Kim #ifndef OPENSSL_NO_TLS1_2 1430e71b7053SJung-uk Kim {TLS1_2_VERSION, tlsv1_2_client_method, tlsv1_2_server_method}, 1431e71b7053SJung-uk Kim #else 1432e71b7053SJung-uk Kim {TLS1_2_VERSION, NULL, NULL}, 1433e71b7053SJung-uk Kim #endif 1434e71b7053SJung-uk Kim #ifndef OPENSSL_NO_TLS1_1 1435e71b7053SJung-uk Kim {TLS1_1_VERSION, tlsv1_1_client_method, tlsv1_1_server_method}, 1436e71b7053SJung-uk Kim #else 1437e71b7053SJung-uk Kim {TLS1_1_VERSION, NULL, NULL}, 1438e71b7053SJung-uk Kim #endif 1439e71b7053SJung-uk Kim #ifndef OPENSSL_NO_TLS1 1440e71b7053SJung-uk Kim {TLS1_VERSION, tlsv1_client_method, tlsv1_server_method}, 1441e71b7053SJung-uk Kim #else 1442e71b7053SJung-uk Kim {TLS1_VERSION, NULL, NULL}, 1443e71b7053SJung-uk Kim #endif 1444e71b7053SJung-uk Kim #ifndef OPENSSL_NO_SSL3 1445e71b7053SJung-uk Kim {SSL3_VERSION, sslv3_client_method, sslv3_server_method}, 1446e71b7053SJung-uk Kim #else 1447e71b7053SJung-uk Kim {SSL3_VERSION, NULL, NULL}, 1448e71b7053SJung-uk Kim #endif 1449e71b7053SJung-uk Kim {0, NULL, NULL}, 1450e71b7053SJung-uk Kim }; 1451e71b7053SJung-uk Kim 1452e71b7053SJung-uk Kim #if DTLS_MAX_VERSION != DTLS1_2_VERSION 1453e71b7053SJung-uk Kim # error Code needs update for DTLS_method() support beyond DTLS1_2_VERSION. 1454e71b7053SJung-uk Kim #endif 1455e71b7053SJung-uk Kim 1456e71b7053SJung-uk Kim /* Must be in order high to low */ 1457e71b7053SJung-uk Kim static const version_info dtls_version_table[] = { 1458e71b7053SJung-uk Kim #ifndef OPENSSL_NO_DTLS1_2 1459e71b7053SJung-uk Kim {DTLS1_2_VERSION, dtlsv1_2_client_method, dtlsv1_2_server_method}, 1460e71b7053SJung-uk Kim #else 1461e71b7053SJung-uk Kim {DTLS1_2_VERSION, NULL, NULL}, 1462e71b7053SJung-uk Kim #endif 1463e71b7053SJung-uk Kim #ifndef OPENSSL_NO_DTLS1 1464e71b7053SJung-uk Kim {DTLS1_VERSION, dtlsv1_client_method, dtlsv1_server_method}, 1465e71b7053SJung-uk Kim {DTLS1_BAD_VER, dtls_bad_ver_client_method, NULL}, 1466e71b7053SJung-uk Kim #else 1467e71b7053SJung-uk Kim {DTLS1_VERSION, NULL, NULL}, 1468e71b7053SJung-uk Kim {DTLS1_BAD_VER, NULL, NULL}, 1469e71b7053SJung-uk Kim #endif 1470e71b7053SJung-uk Kim {0, NULL, NULL}, 1471e71b7053SJung-uk Kim }; 1472e71b7053SJung-uk Kim 1473e71b7053SJung-uk Kim /* 1474e71b7053SJung-uk Kim * ssl_method_error - Check whether an SSL_METHOD is enabled. 1475e71b7053SJung-uk Kim * 1476e71b7053SJung-uk Kim * @s: The SSL handle for the candidate method 1477e71b7053SJung-uk Kim * @method: the intended method. 1478e71b7053SJung-uk Kim * 1479e71b7053SJung-uk Kim * Returns 0 on success, or an SSL error reason on failure. 1480e71b7053SJung-uk Kim */ 1481e71b7053SJung-uk Kim static int ssl_method_error(const SSL *s, const SSL_METHOD *method) 1482e71b7053SJung-uk Kim { 1483e71b7053SJung-uk Kim int version = method->version; 1484e71b7053SJung-uk Kim 1485e71b7053SJung-uk Kim if ((s->min_proto_version != 0 && 1486e71b7053SJung-uk Kim version_cmp(s, version, s->min_proto_version) < 0) || 1487e71b7053SJung-uk Kim ssl_security(s, SSL_SECOP_VERSION, 0, version, NULL) == 0) 1488e71b7053SJung-uk Kim return SSL_R_VERSION_TOO_LOW; 1489e71b7053SJung-uk Kim 1490e71b7053SJung-uk Kim if (s->max_proto_version != 0 && 1491e71b7053SJung-uk Kim version_cmp(s, version, s->max_proto_version) > 0) 1492e71b7053SJung-uk Kim return SSL_R_VERSION_TOO_HIGH; 1493e71b7053SJung-uk Kim 1494e71b7053SJung-uk Kim if ((s->options & method->mask) != 0) 1495e71b7053SJung-uk Kim return SSL_R_UNSUPPORTED_PROTOCOL; 1496e71b7053SJung-uk Kim if ((method->flags & SSL_METHOD_NO_SUITEB) != 0 && tls1_suiteb(s)) 1497e71b7053SJung-uk Kim return SSL_R_AT_LEAST_TLS_1_2_NEEDED_IN_SUITEB_MODE; 1498e71b7053SJung-uk Kim 1499e71b7053SJung-uk Kim return 0; 1500e71b7053SJung-uk Kim } 1501e71b7053SJung-uk Kim 1502e71b7053SJung-uk Kim /* 1503e71b7053SJung-uk Kim * Only called by servers. Returns 1 if the server has a TLSv1.3 capable 1504e71b7053SJung-uk Kim * certificate type, or has PSK or a certificate callback configured. Otherwise 1505e71b7053SJung-uk Kim * returns 0. 1506e71b7053SJung-uk Kim */ 1507e71b7053SJung-uk Kim static int is_tls13_capable(const SSL *s) 1508e71b7053SJung-uk Kim { 1509e71b7053SJung-uk Kim int i; 1510*c9cf7b5cSJung-uk Kim #ifndef OPENSSL_NO_EC 1511*c9cf7b5cSJung-uk Kim int curve; 1512*c9cf7b5cSJung-uk Kim EC_KEY *eckey; 1513*c9cf7b5cSJung-uk Kim #endif 1514e71b7053SJung-uk Kim 1515e71b7053SJung-uk Kim #ifndef OPENSSL_NO_PSK 1516e71b7053SJung-uk Kim if (s->psk_server_callback != NULL) 1517e71b7053SJung-uk Kim return 1; 1518e71b7053SJung-uk Kim #endif 1519e71b7053SJung-uk Kim 1520e71b7053SJung-uk Kim if (s->psk_find_session_cb != NULL || s->cert->cert_cb != NULL) 1521e71b7053SJung-uk Kim return 1; 1522e71b7053SJung-uk Kim 1523e71b7053SJung-uk Kim for (i = 0; i < SSL_PKEY_NUM; i++) { 1524e71b7053SJung-uk Kim /* Skip over certs disallowed for TLSv1.3 */ 1525e71b7053SJung-uk Kim switch (i) { 1526e71b7053SJung-uk Kim case SSL_PKEY_DSA_SIGN: 1527e71b7053SJung-uk Kim case SSL_PKEY_GOST01: 1528e71b7053SJung-uk Kim case SSL_PKEY_GOST12_256: 1529e71b7053SJung-uk Kim case SSL_PKEY_GOST12_512: 1530e71b7053SJung-uk Kim continue; 1531e71b7053SJung-uk Kim default: 1532e71b7053SJung-uk Kim break; 1533e71b7053SJung-uk Kim } 1534*c9cf7b5cSJung-uk Kim if (!ssl_has_cert(s, i)) 1535*c9cf7b5cSJung-uk Kim continue; 1536*c9cf7b5cSJung-uk Kim #ifndef OPENSSL_NO_EC 1537*c9cf7b5cSJung-uk Kim if (i != SSL_PKEY_ECC) 1538e71b7053SJung-uk Kim return 1; 1539*c9cf7b5cSJung-uk Kim /* 1540*c9cf7b5cSJung-uk Kim * Prior to TLSv1.3 sig algs allowed any curve to be used. TLSv1.3 is 1541*c9cf7b5cSJung-uk Kim * more restrictive so check that our sig algs are consistent with this 1542*c9cf7b5cSJung-uk Kim * EC cert. See section 4.2.3 of RFC8446. 1543*c9cf7b5cSJung-uk Kim */ 1544*c9cf7b5cSJung-uk Kim eckey = EVP_PKEY_get0_EC_KEY(s->cert->pkeys[SSL_PKEY_ECC].privatekey); 1545*c9cf7b5cSJung-uk Kim if (eckey == NULL) 1546*c9cf7b5cSJung-uk Kim continue; 1547*c9cf7b5cSJung-uk Kim curve = EC_GROUP_get_curve_name(EC_KEY_get0_group(eckey)); 1548*c9cf7b5cSJung-uk Kim if (tls_check_sigalg_curve(s, curve)) 1549*c9cf7b5cSJung-uk Kim return 1; 1550*c9cf7b5cSJung-uk Kim #else 1551*c9cf7b5cSJung-uk Kim return 1; 1552*c9cf7b5cSJung-uk Kim #endif 1553e71b7053SJung-uk Kim } 1554e71b7053SJung-uk Kim 1555e71b7053SJung-uk Kim return 0; 1556e71b7053SJung-uk Kim } 1557e71b7053SJung-uk Kim 1558e71b7053SJung-uk Kim /* 1559e71b7053SJung-uk Kim * ssl_version_supported - Check that the specified `version` is supported by 1560e71b7053SJung-uk Kim * `SSL *` instance 1561e71b7053SJung-uk Kim * 1562e71b7053SJung-uk Kim * @s: The SSL handle for the candidate method 1563e71b7053SJung-uk Kim * @version: Protocol version to test against 1564e71b7053SJung-uk Kim * 1565e71b7053SJung-uk Kim * Returns 1 when supported, otherwise 0 1566e71b7053SJung-uk Kim */ 1567e71b7053SJung-uk Kim int ssl_version_supported(const SSL *s, int version, const SSL_METHOD **meth) 1568e71b7053SJung-uk Kim { 1569e71b7053SJung-uk Kim const version_info *vent; 1570e71b7053SJung-uk Kim const version_info *table; 1571e71b7053SJung-uk Kim 1572e71b7053SJung-uk Kim switch (s->method->version) { 1573e71b7053SJung-uk Kim default: 1574e71b7053SJung-uk Kim /* Version should match method version for non-ANY method */ 1575e71b7053SJung-uk Kim return version_cmp(s, version, s->version) == 0; 1576e71b7053SJung-uk Kim case TLS_ANY_VERSION: 1577e71b7053SJung-uk Kim table = tls_version_table; 1578e71b7053SJung-uk Kim break; 1579e71b7053SJung-uk Kim case DTLS_ANY_VERSION: 1580e71b7053SJung-uk Kim table = dtls_version_table; 1581e71b7053SJung-uk Kim break; 1582e71b7053SJung-uk Kim } 1583e71b7053SJung-uk Kim 1584e71b7053SJung-uk Kim for (vent = table; 1585e71b7053SJung-uk Kim vent->version != 0 && version_cmp(s, version, vent->version) <= 0; 1586e71b7053SJung-uk Kim ++vent) { 1587e71b7053SJung-uk Kim if (vent->cmeth != NULL 1588e71b7053SJung-uk Kim && version_cmp(s, version, vent->version) == 0 1589e71b7053SJung-uk Kim && ssl_method_error(s, vent->cmeth()) == 0 1590e71b7053SJung-uk Kim && (!s->server 1591e71b7053SJung-uk Kim || version != TLS1_3_VERSION 1592e71b7053SJung-uk Kim || is_tls13_capable(s))) { 1593e71b7053SJung-uk Kim if (meth != NULL) 1594e71b7053SJung-uk Kim *meth = vent->cmeth(); 1595e71b7053SJung-uk Kim return 1; 1596e71b7053SJung-uk Kim } 1597e71b7053SJung-uk Kim } 1598e71b7053SJung-uk Kim return 0; 1599e71b7053SJung-uk Kim } 1600e71b7053SJung-uk Kim 1601e71b7053SJung-uk Kim /* 1602e71b7053SJung-uk Kim * ssl_check_version_downgrade - In response to RFC7507 SCSV version 1603e71b7053SJung-uk Kim * fallback indication from a client check whether we're using the highest 1604e71b7053SJung-uk Kim * supported protocol version. 1605e71b7053SJung-uk Kim * 1606e71b7053SJung-uk Kim * @s server SSL handle. 1607e71b7053SJung-uk Kim * 1608e71b7053SJung-uk Kim * Returns 1 when using the highest enabled version, 0 otherwise. 1609e71b7053SJung-uk Kim */ 1610e71b7053SJung-uk Kim int ssl_check_version_downgrade(SSL *s) 1611e71b7053SJung-uk Kim { 1612e71b7053SJung-uk Kim const version_info *vent; 1613e71b7053SJung-uk Kim const version_info *table; 1614e71b7053SJung-uk Kim 1615e71b7053SJung-uk Kim /* 1616e71b7053SJung-uk Kim * Check that the current protocol is the highest enabled version 1617e71b7053SJung-uk Kim * (according to s->ctx->method, as version negotiation may have changed 1618e71b7053SJung-uk Kim * s->method). 1619e71b7053SJung-uk Kim */ 1620e71b7053SJung-uk Kim if (s->version == s->ctx->method->version) 1621e71b7053SJung-uk Kim return 1; 1622e71b7053SJung-uk Kim 1623e71b7053SJung-uk Kim /* 1624e71b7053SJung-uk Kim * Apparently we're using a version-flexible SSL_METHOD (not at its 1625e71b7053SJung-uk Kim * highest protocol version). 1626e71b7053SJung-uk Kim */ 1627e71b7053SJung-uk Kim if (s->ctx->method->version == TLS_method()->version) 1628e71b7053SJung-uk Kim table = tls_version_table; 1629e71b7053SJung-uk Kim else if (s->ctx->method->version == DTLS_method()->version) 1630e71b7053SJung-uk Kim table = dtls_version_table; 1631e71b7053SJung-uk Kim else { 1632e71b7053SJung-uk Kim /* Unexpected state; fail closed. */ 1633e71b7053SJung-uk Kim return 0; 1634e71b7053SJung-uk Kim } 1635e71b7053SJung-uk Kim 1636e71b7053SJung-uk Kim for (vent = table; vent->version != 0; ++vent) { 1637e71b7053SJung-uk Kim if (vent->smeth != NULL && ssl_method_error(s, vent->smeth()) == 0) 1638e71b7053SJung-uk Kim return s->version == vent->version; 1639e71b7053SJung-uk Kim } 1640e71b7053SJung-uk Kim return 0; 1641e71b7053SJung-uk Kim } 1642e71b7053SJung-uk Kim 1643e71b7053SJung-uk Kim /* 1644e71b7053SJung-uk Kim * ssl_set_version_bound - set an upper or lower bound on the supported (D)TLS 1645e71b7053SJung-uk Kim * protocols, provided the initial (D)TLS method is version-flexible. This 1646e71b7053SJung-uk Kim * function sanity-checks the proposed value and makes sure the method is 1647e71b7053SJung-uk Kim * version-flexible, then sets the limit if all is well. 1648e71b7053SJung-uk Kim * 1649e71b7053SJung-uk Kim * @method_version: The version of the current SSL_METHOD. 1650e71b7053SJung-uk Kim * @version: the intended limit. 1651e71b7053SJung-uk Kim * @bound: pointer to limit to be updated. 1652e71b7053SJung-uk Kim * 1653e71b7053SJung-uk Kim * Returns 1 on success, 0 on failure. 1654e71b7053SJung-uk Kim */ 1655e71b7053SJung-uk Kim int ssl_set_version_bound(int method_version, int version, int *bound) 1656e71b7053SJung-uk Kim { 1657e71b7053SJung-uk Kim if (version == 0) { 1658e71b7053SJung-uk Kim *bound = version; 1659e71b7053SJung-uk Kim return 1; 1660e71b7053SJung-uk Kim } 1661e71b7053SJung-uk Kim 1662e71b7053SJung-uk Kim /*- 1663e71b7053SJung-uk Kim * Restrict TLS methods to TLS protocol versions. 1664e71b7053SJung-uk Kim * Restrict DTLS methods to DTLS protocol versions. 1665e71b7053SJung-uk Kim * Note, DTLS version numbers are decreasing, use comparison macros. 1666e71b7053SJung-uk Kim * 1667e71b7053SJung-uk Kim * Note that for both lower-bounds we use explicit versions, not 1668e71b7053SJung-uk Kim * (D)TLS_MIN_VERSION. This is because we don't want to break user 1669e71b7053SJung-uk Kim * configurations. If the MIN (supported) version ever rises, the user's 1670e71b7053SJung-uk Kim * "floor" remains valid even if no longer available. We don't expect the 1671e71b7053SJung-uk Kim * MAX ceiling to ever get lower, so making that variable makes sense. 1672e71b7053SJung-uk Kim */ 1673e71b7053SJung-uk Kim switch (method_version) { 1674e71b7053SJung-uk Kim default: 1675e71b7053SJung-uk Kim /* 1676e71b7053SJung-uk Kim * XXX For fixed version methods, should we always fail and not set any 1677e71b7053SJung-uk Kim * bounds, always succeed and not set any bounds, or set the bounds and 1678e71b7053SJung-uk Kim * arrange to fail later if they are not met? At present fixed-version 1679e71b7053SJung-uk Kim * methods are not subject to controls that disable individual protocol 1680e71b7053SJung-uk Kim * versions. 1681e71b7053SJung-uk Kim */ 1682e71b7053SJung-uk Kim return 0; 1683e71b7053SJung-uk Kim 1684e71b7053SJung-uk Kim case TLS_ANY_VERSION: 1685e71b7053SJung-uk Kim if (version < SSL3_VERSION || version > TLS_MAX_VERSION) 1686e71b7053SJung-uk Kim return 0; 1687e71b7053SJung-uk Kim break; 1688e71b7053SJung-uk Kim 1689e71b7053SJung-uk Kim case DTLS_ANY_VERSION: 1690e71b7053SJung-uk Kim if (DTLS_VERSION_GT(version, DTLS_MAX_VERSION) || 1691e71b7053SJung-uk Kim DTLS_VERSION_LT(version, DTLS1_BAD_VER)) 1692e71b7053SJung-uk Kim return 0; 1693e71b7053SJung-uk Kim break; 1694e71b7053SJung-uk Kim } 1695e71b7053SJung-uk Kim 1696e71b7053SJung-uk Kim *bound = version; 1697e71b7053SJung-uk Kim return 1; 1698e71b7053SJung-uk Kim } 1699e71b7053SJung-uk Kim 1700e71b7053SJung-uk Kim static void check_for_downgrade(SSL *s, int vers, DOWNGRADE *dgrd) 1701e71b7053SJung-uk Kim { 1702e71b7053SJung-uk Kim if (vers == TLS1_2_VERSION 1703e71b7053SJung-uk Kim && ssl_version_supported(s, TLS1_3_VERSION, NULL)) { 1704e71b7053SJung-uk Kim *dgrd = DOWNGRADE_TO_1_2; 1705e71b7053SJung-uk Kim } else if (!SSL_IS_DTLS(s) 1706e71b7053SJung-uk Kim && vers < TLS1_2_VERSION 1707e71b7053SJung-uk Kim /* 1708e71b7053SJung-uk Kim * We need to ensure that a server that disables TLSv1.2 1709e71b7053SJung-uk Kim * (creating a hole between TLSv1.3 and TLSv1.1) can still 1710e71b7053SJung-uk Kim * complete handshakes with clients that support TLSv1.2 and 1711e71b7053SJung-uk Kim * below. Therefore we do not enable the sentinel if TLSv1.3 is 1712e71b7053SJung-uk Kim * enabled and TLSv1.2 is not. 1713e71b7053SJung-uk Kim */ 1714e71b7053SJung-uk Kim && ssl_version_supported(s, TLS1_2_VERSION, NULL)) { 1715e71b7053SJung-uk Kim *dgrd = DOWNGRADE_TO_1_1; 1716e71b7053SJung-uk Kim } else { 1717e71b7053SJung-uk Kim *dgrd = DOWNGRADE_NONE; 1718e71b7053SJung-uk Kim } 1719e71b7053SJung-uk Kim } 1720e71b7053SJung-uk Kim 1721e71b7053SJung-uk Kim /* 1722e71b7053SJung-uk Kim * ssl_choose_server_version - Choose server (D)TLS version. Called when the 1723e71b7053SJung-uk Kim * client HELLO is received to select the final server protocol version and 1724e71b7053SJung-uk Kim * the version specific method. 1725e71b7053SJung-uk Kim * 1726e71b7053SJung-uk Kim * @s: server SSL handle. 1727e71b7053SJung-uk Kim * 1728e71b7053SJung-uk Kim * Returns 0 on success or an SSL error reason number on failure. 1729e71b7053SJung-uk Kim */ 1730e71b7053SJung-uk Kim int ssl_choose_server_version(SSL *s, CLIENTHELLO_MSG *hello, DOWNGRADE *dgrd) 1731e71b7053SJung-uk Kim { 1732e71b7053SJung-uk Kim /*- 1733e71b7053SJung-uk Kim * With version-flexible methods we have an initial state with: 1734e71b7053SJung-uk Kim * 1735e71b7053SJung-uk Kim * s->method->version == (D)TLS_ANY_VERSION, 1736e71b7053SJung-uk Kim * s->version == (D)TLS_MAX_VERSION. 1737e71b7053SJung-uk Kim * 1738e71b7053SJung-uk Kim * So we detect version-flexible methods via the method version, not the 1739e71b7053SJung-uk Kim * handle version. 1740e71b7053SJung-uk Kim */ 1741e71b7053SJung-uk Kim int server_version = s->method->version; 1742e71b7053SJung-uk Kim int client_version = hello->legacy_version; 1743e71b7053SJung-uk Kim const version_info *vent; 1744e71b7053SJung-uk Kim const version_info *table; 1745e71b7053SJung-uk Kim int disabled = 0; 1746e71b7053SJung-uk Kim RAW_EXTENSION *suppversions; 1747e71b7053SJung-uk Kim 1748e71b7053SJung-uk Kim s->client_version = client_version; 1749e71b7053SJung-uk Kim 1750e71b7053SJung-uk Kim switch (server_version) { 1751e71b7053SJung-uk Kim default: 1752e71b7053SJung-uk Kim if (!SSL_IS_TLS13(s)) { 1753e71b7053SJung-uk Kim if (version_cmp(s, client_version, s->version) < 0) 1754e71b7053SJung-uk Kim return SSL_R_WRONG_SSL_VERSION; 1755e71b7053SJung-uk Kim *dgrd = DOWNGRADE_NONE; 1756e71b7053SJung-uk Kim /* 1757e71b7053SJung-uk Kim * If this SSL handle is not from a version flexible method we don't 1758e71b7053SJung-uk Kim * (and never did) check min/max FIPS or Suite B constraints. Hope 1759e71b7053SJung-uk Kim * that's OK. It is up to the caller to not choose fixed protocol 1760e71b7053SJung-uk Kim * versions they don't want. If not, then easy to fix, just return 1761e71b7053SJung-uk Kim * ssl_method_error(s, s->method) 1762e71b7053SJung-uk Kim */ 1763e71b7053SJung-uk Kim return 0; 1764e71b7053SJung-uk Kim } 1765e71b7053SJung-uk Kim /* 1766e71b7053SJung-uk Kim * Fall through if we are TLSv1.3 already (this means we must be after 1767e71b7053SJung-uk Kim * a HelloRetryRequest 1768e71b7053SJung-uk Kim */ 1769e71b7053SJung-uk Kim /* fall thru */ 1770e71b7053SJung-uk Kim case TLS_ANY_VERSION: 1771e71b7053SJung-uk Kim table = tls_version_table; 1772e71b7053SJung-uk Kim break; 1773e71b7053SJung-uk Kim case DTLS_ANY_VERSION: 1774e71b7053SJung-uk Kim table = dtls_version_table; 1775e71b7053SJung-uk Kim break; 1776e71b7053SJung-uk Kim } 1777e71b7053SJung-uk Kim 1778e71b7053SJung-uk Kim suppversions = &hello->pre_proc_exts[TLSEXT_IDX_supported_versions]; 1779e71b7053SJung-uk Kim 1780e71b7053SJung-uk Kim /* If we did an HRR then supported versions is mandatory */ 1781e71b7053SJung-uk Kim if (!suppversions->present && s->hello_retry_request != SSL_HRR_NONE) 1782e71b7053SJung-uk Kim return SSL_R_UNSUPPORTED_PROTOCOL; 1783e71b7053SJung-uk Kim 1784e71b7053SJung-uk Kim if (suppversions->present && !SSL_IS_DTLS(s)) { 1785e71b7053SJung-uk Kim unsigned int candidate_vers = 0; 1786e71b7053SJung-uk Kim unsigned int best_vers = 0; 1787e71b7053SJung-uk Kim const SSL_METHOD *best_method = NULL; 1788e71b7053SJung-uk Kim PACKET versionslist; 1789e71b7053SJung-uk Kim 1790e71b7053SJung-uk Kim suppversions->parsed = 1; 1791e71b7053SJung-uk Kim 1792e71b7053SJung-uk Kim if (!PACKET_as_length_prefixed_1(&suppversions->data, &versionslist)) { 1793e71b7053SJung-uk Kim /* Trailing or invalid data? */ 1794e71b7053SJung-uk Kim return SSL_R_LENGTH_MISMATCH; 1795e71b7053SJung-uk Kim } 1796e71b7053SJung-uk Kim 1797e71b7053SJung-uk Kim /* 1798e71b7053SJung-uk Kim * The TLSv1.3 spec says the client MUST set this to TLS1_2_VERSION. 1799e71b7053SJung-uk Kim * The spec only requires servers to check that it isn't SSLv3: 1800e71b7053SJung-uk Kim * "Any endpoint receiving a Hello message with 1801e71b7053SJung-uk Kim * ClientHello.legacy_version or ServerHello.legacy_version set to 1802e71b7053SJung-uk Kim * 0x0300 MUST abort the handshake with a "protocol_version" alert." 1803e71b7053SJung-uk Kim * We are slightly stricter and require that it isn't SSLv3 or lower. 1804e71b7053SJung-uk Kim * We tolerate TLSv1 and TLSv1.1. 1805e71b7053SJung-uk Kim */ 1806e71b7053SJung-uk Kim if (client_version <= SSL3_VERSION) 1807e71b7053SJung-uk Kim return SSL_R_BAD_LEGACY_VERSION; 1808e71b7053SJung-uk Kim 1809e71b7053SJung-uk Kim while (PACKET_get_net_2(&versionslist, &candidate_vers)) { 1810e71b7053SJung-uk Kim if (version_cmp(s, candidate_vers, best_vers) <= 0) 1811e71b7053SJung-uk Kim continue; 1812e71b7053SJung-uk Kim if (ssl_version_supported(s, candidate_vers, &best_method)) 1813e71b7053SJung-uk Kim best_vers = candidate_vers; 1814e71b7053SJung-uk Kim } 1815e71b7053SJung-uk Kim if (PACKET_remaining(&versionslist) != 0) { 1816e71b7053SJung-uk Kim /* Trailing data? */ 1817e71b7053SJung-uk Kim return SSL_R_LENGTH_MISMATCH; 1818e71b7053SJung-uk Kim } 1819e71b7053SJung-uk Kim 1820e71b7053SJung-uk Kim if (best_vers > 0) { 1821e71b7053SJung-uk Kim if (s->hello_retry_request != SSL_HRR_NONE) { 1822e71b7053SJung-uk Kim /* 1823e71b7053SJung-uk Kim * This is after a HelloRetryRequest so we better check that we 1824e71b7053SJung-uk Kim * negotiated TLSv1.3 1825e71b7053SJung-uk Kim */ 1826e71b7053SJung-uk Kim if (best_vers != TLS1_3_VERSION) 1827e71b7053SJung-uk Kim return SSL_R_UNSUPPORTED_PROTOCOL; 1828e71b7053SJung-uk Kim return 0; 1829e71b7053SJung-uk Kim } 1830e71b7053SJung-uk Kim check_for_downgrade(s, best_vers, dgrd); 1831e71b7053SJung-uk Kim s->version = best_vers; 1832e71b7053SJung-uk Kim s->method = best_method; 1833e71b7053SJung-uk Kim return 0; 1834e71b7053SJung-uk Kim } 1835e71b7053SJung-uk Kim return SSL_R_UNSUPPORTED_PROTOCOL; 1836e71b7053SJung-uk Kim } 1837e71b7053SJung-uk Kim 1838e71b7053SJung-uk Kim /* 1839e71b7053SJung-uk Kim * If the supported versions extension isn't present, then the highest 1840e71b7053SJung-uk Kim * version we can negotiate is TLSv1.2 1841e71b7053SJung-uk Kim */ 1842e71b7053SJung-uk Kim if (version_cmp(s, client_version, TLS1_3_VERSION) >= 0) 1843e71b7053SJung-uk Kim client_version = TLS1_2_VERSION; 1844e71b7053SJung-uk Kim 1845e71b7053SJung-uk Kim /* 1846e71b7053SJung-uk Kim * No supported versions extension, so we just use the version supplied in 1847e71b7053SJung-uk Kim * the ClientHello. 1848e71b7053SJung-uk Kim */ 1849e71b7053SJung-uk Kim for (vent = table; vent->version != 0; ++vent) { 1850e71b7053SJung-uk Kim const SSL_METHOD *method; 1851e71b7053SJung-uk Kim 1852e71b7053SJung-uk Kim if (vent->smeth == NULL || 1853e71b7053SJung-uk Kim version_cmp(s, client_version, vent->version) < 0) 1854e71b7053SJung-uk Kim continue; 1855e71b7053SJung-uk Kim method = vent->smeth(); 1856e71b7053SJung-uk Kim if (ssl_method_error(s, method) == 0) { 1857e71b7053SJung-uk Kim check_for_downgrade(s, vent->version, dgrd); 1858e71b7053SJung-uk Kim s->version = vent->version; 1859e71b7053SJung-uk Kim s->method = method; 1860e71b7053SJung-uk Kim return 0; 1861e71b7053SJung-uk Kim } 1862e71b7053SJung-uk Kim disabled = 1; 1863e71b7053SJung-uk Kim } 1864e71b7053SJung-uk Kim return disabled ? SSL_R_UNSUPPORTED_PROTOCOL : SSL_R_VERSION_TOO_LOW; 1865e71b7053SJung-uk Kim } 1866e71b7053SJung-uk Kim 1867e71b7053SJung-uk Kim /* 1868e71b7053SJung-uk Kim * ssl_choose_client_version - Choose client (D)TLS version. Called when the 1869e71b7053SJung-uk Kim * server HELLO is received to select the final client protocol version and 1870e71b7053SJung-uk Kim * the version specific method. 1871e71b7053SJung-uk Kim * 1872e71b7053SJung-uk Kim * @s: client SSL handle. 1873e71b7053SJung-uk Kim * @version: The proposed version from the server's HELLO. 1874e71b7053SJung-uk Kim * @extensions: The extensions received 1875e71b7053SJung-uk Kim * 1876e71b7053SJung-uk Kim * Returns 1 on success or 0 on error. 1877e71b7053SJung-uk Kim */ 1878e71b7053SJung-uk Kim int ssl_choose_client_version(SSL *s, int version, RAW_EXTENSION *extensions) 1879e71b7053SJung-uk Kim { 1880e71b7053SJung-uk Kim const version_info *vent; 1881e71b7053SJung-uk Kim const version_info *table; 1882e71b7053SJung-uk Kim int ret, ver_min, ver_max, real_max, origv; 1883e71b7053SJung-uk Kim 1884e71b7053SJung-uk Kim origv = s->version; 1885e71b7053SJung-uk Kim s->version = version; 1886e71b7053SJung-uk Kim 1887e71b7053SJung-uk Kim /* This will overwrite s->version if the extension is present */ 1888e71b7053SJung-uk Kim if (!tls_parse_extension(s, TLSEXT_IDX_supported_versions, 1889e71b7053SJung-uk Kim SSL_EXT_TLS1_2_SERVER_HELLO 1890e71b7053SJung-uk Kim | SSL_EXT_TLS1_3_SERVER_HELLO, extensions, 1891e71b7053SJung-uk Kim NULL, 0)) { 1892e71b7053SJung-uk Kim s->version = origv; 1893e71b7053SJung-uk Kim return 0; 1894e71b7053SJung-uk Kim } 1895e71b7053SJung-uk Kim 1896e71b7053SJung-uk Kim if (s->hello_retry_request != SSL_HRR_NONE 1897e71b7053SJung-uk Kim && s->version != TLS1_3_VERSION) { 1898e71b7053SJung-uk Kim s->version = origv; 1899e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_PROTOCOL_VERSION, SSL_F_SSL_CHOOSE_CLIENT_VERSION, 1900e71b7053SJung-uk Kim SSL_R_WRONG_SSL_VERSION); 1901e71b7053SJung-uk Kim return 0; 1902e71b7053SJung-uk Kim } 1903e71b7053SJung-uk Kim 1904e71b7053SJung-uk Kim switch (s->method->version) { 1905e71b7053SJung-uk Kim default: 1906e71b7053SJung-uk Kim if (s->version != s->method->version) { 1907e71b7053SJung-uk Kim s->version = origv; 1908e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_PROTOCOL_VERSION, 1909e71b7053SJung-uk Kim SSL_F_SSL_CHOOSE_CLIENT_VERSION, 1910e71b7053SJung-uk Kim SSL_R_WRONG_SSL_VERSION); 1911e71b7053SJung-uk Kim return 0; 1912e71b7053SJung-uk Kim } 1913e71b7053SJung-uk Kim /* 1914e71b7053SJung-uk Kim * If this SSL handle is not from a version flexible method we don't 1915e71b7053SJung-uk Kim * (and never did) check min/max, FIPS or Suite B constraints. Hope 1916e71b7053SJung-uk Kim * that's OK. It is up to the caller to not choose fixed protocol 1917e71b7053SJung-uk Kim * versions they don't want. If not, then easy to fix, just return 1918e71b7053SJung-uk Kim * ssl_method_error(s, s->method) 1919e71b7053SJung-uk Kim */ 1920e71b7053SJung-uk Kim return 1; 1921e71b7053SJung-uk Kim case TLS_ANY_VERSION: 1922e71b7053SJung-uk Kim table = tls_version_table; 1923e71b7053SJung-uk Kim break; 1924e71b7053SJung-uk Kim case DTLS_ANY_VERSION: 1925e71b7053SJung-uk Kim table = dtls_version_table; 1926e71b7053SJung-uk Kim break; 1927e71b7053SJung-uk Kim } 1928e71b7053SJung-uk Kim 1929e71b7053SJung-uk Kim ret = ssl_get_min_max_version(s, &ver_min, &ver_max, &real_max); 1930e71b7053SJung-uk Kim if (ret != 0) { 1931e71b7053SJung-uk Kim s->version = origv; 1932e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_PROTOCOL_VERSION, 1933e71b7053SJung-uk Kim SSL_F_SSL_CHOOSE_CLIENT_VERSION, ret); 1934e71b7053SJung-uk Kim return 0; 1935e71b7053SJung-uk Kim } 1936e71b7053SJung-uk Kim if (SSL_IS_DTLS(s) ? DTLS_VERSION_LT(s->version, ver_min) 1937e71b7053SJung-uk Kim : s->version < ver_min) { 1938e71b7053SJung-uk Kim s->version = origv; 1939e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_PROTOCOL_VERSION, 1940e71b7053SJung-uk Kim SSL_F_SSL_CHOOSE_CLIENT_VERSION, SSL_R_UNSUPPORTED_PROTOCOL); 1941e71b7053SJung-uk Kim return 0; 1942e71b7053SJung-uk Kim } else if (SSL_IS_DTLS(s) ? DTLS_VERSION_GT(s->version, ver_max) 1943e71b7053SJung-uk Kim : s->version > ver_max) { 1944e71b7053SJung-uk Kim s->version = origv; 1945e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_PROTOCOL_VERSION, 1946e71b7053SJung-uk Kim SSL_F_SSL_CHOOSE_CLIENT_VERSION, SSL_R_UNSUPPORTED_PROTOCOL); 1947e71b7053SJung-uk Kim return 0; 1948e71b7053SJung-uk Kim } 1949e71b7053SJung-uk Kim 1950e71b7053SJung-uk Kim if ((s->mode & SSL_MODE_SEND_FALLBACK_SCSV) == 0) 1951e71b7053SJung-uk Kim real_max = ver_max; 1952e71b7053SJung-uk Kim 1953e71b7053SJung-uk Kim /* Check for downgrades */ 1954e71b7053SJung-uk Kim if (s->version == TLS1_2_VERSION && real_max > s->version) { 1955e71b7053SJung-uk Kim if (memcmp(tls12downgrade, 1956e71b7053SJung-uk Kim s->s3->server_random + SSL3_RANDOM_SIZE 1957e71b7053SJung-uk Kim - sizeof(tls12downgrade), 1958e71b7053SJung-uk Kim sizeof(tls12downgrade)) == 0) { 1959e71b7053SJung-uk Kim s->version = origv; 1960e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_ILLEGAL_PARAMETER, 1961e71b7053SJung-uk Kim SSL_F_SSL_CHOOSE_CLIENT_VERSION, 1962e71b7053SJung-uk Kim SSL_R_INAPPROPRIATE_FALLBACK); 1963e71b7053SJung-uk Kim return 0; 1964e71b7053SJung-uk Kim } 1965e71b7053SJung-uk Kim } else if (!SSL_IS_DTLS(s) 1966e71b7053SJung-uk Kim && s->version < TLS1_2_VERSION 1967e71b7053SJung-uk Kim && real_max > s->version) { 1968e71b7053SJung-uk Kim if (memcmp(tls11downgrade, 1969e71b7053SJung-uk Kim s->s3->server_random + SSL3_RANDOM_SIZE 1970e71b7053SJung-uk Kim - sizeof(tls11downgrade), 1971e71b7053SJung-uk Kim sizeof(tls11downgrade)) == 0) { 1972e71b7053SJung-uk Kim s->version = origv; 1973e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_ILLEGAL_PARAMETER, 1974e71b7053SJung-uk Kim SSL_F_SSL_CHOOSE_CLIENT_VERSION, 1975e71b7053SJung-uk Kim SSL_R_INAPPROPRIATE_FALLBACK); 1976e71b7053SJung-uk Kim return 0; 1977e71b7053SJung-uk Kim } 1978e71b7053SJung-uk Kim } 1979e71b7053SJung-uk Kim 1980e71b7053SJung-uk Kim for (vent = table; vent->version != 0; ++vent) { 1981e71b7053SJung-uk Kim if (vent->cmeth == NULL || s->version != vent->version) 1982e71b7053SJung-uk Kim continue; 1983e71b7053SJung-uk Kim 1984e71b7053SJung-uk Kim s->method = vent->cmeth(); 1985e71b7053SJung-uk Kim return 1; 1986e71b7053SJung-uk Kim } 1987e71b7053SJung-uk Kim 1988e71b7053SJung-uk Kim s->version = origv; 1989e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_PROTOCOL_VERSION, SSL_F_SSL_CHOOSE_CLIENT_VERSION, 1990e71b7053SJung-uk Kim SSL_R_UNSUPPORTED_PROTOCOL); 1991e71b7053SJung-uk Kim return 0; 1992e71b7053SJung-uk Kim } 1993e71b7053SJung-uk Kim 1994e71b7053SJung-uk Kim /* 1995e71b7053SJung-uk Kim * ssl_get_min_max_version - get minimum and maximum protocol version 1996e71b7053SJung-uk Kim * @s: The SSL connection 1997e71b7053SJung-uk Kim * @min_version: The minimum supported version 1998e71b7053SJung-uk Kim * @max_version: The maximum supported version 1999e71b7053SJung-uk Kim * @real_max: The highest version below the lowest compile time version hole 2000e71b7053SJung-uk Kim * where that hole lies above at least one run-time enabled 2001e71b7053SJung-uk Kim * protocol. 2002e71b7053SJung-uk Kim * 2003e71b7053SJung-uk Kim * Work out what version we should be using for the initial ClientHello if the 2004e71b7053SJung-uk Kim * version is initially (D)TLS_ANY_VERSION. We apply any explicit SSL_OP_NO_xxx 2005e71b7053SJung-uk Kim * options, the MinProtocol and MaxProtocol configuration commands, any Suite B 2006e71b7053SJung-uk Kim * constraints and any floor imposed by the security level here, 2007e71b7053SJung-uk Kim * so we don't advertise the wrong protocol version to only reject the outcome later. 2008e71b7053SJung-uk Kim * 2009e71b7053SJung-uk Kim * Computing the right floor matters. If, e.g., TLS 1.0 and 1.2 are enabled, 2010e71b7053SJung-uk Kim * TLS 1.1 is disabled, but the security level, Suite-B and/or MinProtocol 2011e71b7053SJung-uk Kim * only allow TLS 1.2, we want to advertise TLS1.2, *not* TLS1. 2012e71b7053SJung-uk Kim * 2013e71b7053SJung-uk Kim * Returns 0 on success or an SSL error reason number on failure. On failure 2014e71b7053SJung-uk Kim * min_version and max_version will also be set to 0. 2015e71b7053SJung-uk Kim */ 2016e71b7053SJung-uk Kim int ssl_get_min_max_version(const SSL *s, int *min_version, int *max_version, 2017e71b7053SJung-uk Kim int *real_max) 2018e71b7053SJung-uk Kim { 2019e71b7053SJung-uk Kim int version, tmp_real_max; 2020e71b7053SJung-uk Kim int hole; 2021e71b7053SJung-uk Kim const SSL_METHOD *single = NULL; 2022e71b7053SJung-uk Kim const SSL_METHOD *method; 2023e71b7053SJung-uk Kim const version_info *table; 2024e71b7053SJung-uk Kim const version_info *vent; 2025e71b7053SJung-uk Kim 2026e71b7053SJung-uk Kim switch (s->method->version) { 2027e71b7053SJung-uk Kim default: 2028e71b7053SJung-uk Kim /* 2029e71b7053SJung-uk Kim * If this SSL handle is not from a version flexible method we don't 2030e71b7053SJung-uk Kim * (and never did) check min/max FIPS or Suite B constraints. Hope 2031e71b7053SJung-uk Kim * that's OK. It is up to the caller to not choose fixed protocol 2032e71b7053SJung-uk Kim * versions they don't want. If not, then easy to fix, just return 2033e71b7053SJung-uk Kim * ssl_method_error(s, s->method) 2034e71b7053SJung-uk Kim */ 2035e71b7053SJung-uk Kim *min_version = *max_version = s->version; 2036e71b7053SJung-uk Kim /* 2037e71b7053SJung-uk Kim * Providing a real_max only makes sense where we're using a version 2038e71b7053SJung-uk Kim * flexible method. 2039e71b7053SJung-uk Kim */ 2040e71b7053SJung-uk Kim if (!ossl_assert(real_max == NULL)) 2041e71b7053SJung-uk Kim return ERR_R_INTERNAL_ERROR; 2042e71b7053SJung-uk Kim return 0; 2043e71b7053SJung-uk Kim case TLS_ANY_VERSION: 2044e71b7053SJung-uk Kim table = tls_version_table; 2045e71b7053SJung-uk Kim break; 2046e71b7053SJung-uk Kim case DTLS_ANY_VERSION: 2047e71b7053SJung-uk Kim table = dtls_version_table; 2048e71b7053SJung-uk Kim break; 2049e71b7053SJung-uk Kim } 2050e71b7053SJung-uk Kim 2051e71b7053SJung-uk Kim /* 2052e71b7053SJung-uk Kim * SSL_OP_NO_X disables all protocols above X *if* there are some protocols 2053e71b7053SJung-uk Kim * below X enabled. This is required in order to maintain the "version 2054e71b7053SJung-uk Kim * capability" vector contiguous. Any versions with a NULL client method 2055e71b7053SJung-uk Kim * (protocol version client is disabled at compile-time) is also a "hole". 2056e71b7053SJung-uk Kim * 2057e71b7053SJung-uk Kim * Our initial state is hole == 1, version == 0. That is, versions above 2058e71b7053SJung-uk Kim * the first version in the method table are disabled (a "hole" above 2059e71b7053SJung-uk Kim * the valid protocol entries) and we don't have a selected version yet. 2060e71b7053SJung-uk Kim * 2061e71b7053SJung-uk Kim * Whenever "hole == 1", and we hit an enabled method, its version becomes 2062e71b7053SJung-uk Kim * the selected version, and the method becomes a candidate "single" 2063e71b7053SJung-uk Kim * method. We're no longer in a hole, so "hole" becomes 0. 2064e71b7053SJung-uk Kim * 2065e71b7053SJung-uk Kim * If "hole == 0" and we hit an enabled method, then "single" is cleared, 2066e71b7053SJung-uk Kim * as we support a contiguous range of at least two methods. If we hit 2067e71b7053SJung-uk Kim * a disabled method, then hole becomes true again, but nothing else 2068e71b7053SJung-uk Kim * changes yet, because all the remaining methods may be disabled too. 2069e71b7053SJung-uk Kim * If we again hit an enabled method after the new hole, it becomes 2070e71b7053SJung-uk Kim * selected, as we start from scratch. 2071e71b7053SJung-uk Kim */ 2072e71b7053SJung-uk Kim *min_version = version = 0; 2073e71b7053SJung-uk Kim hole = 1; 2074e71b7053SJung-uk Kim if (real_max != NULL) 2075e71b7053SJung-uk Kim *real_max = 0; 2076e71b7053SJung-uk Kim tmp_real_max = 0; 2077e71b7053SJung-uk Kim for (vent = table; vent->version != 0; ++vent) { 2078e71b7053SJung-uk Kim /* 2079e71b7053SJung-uk Kim * A table entry with a NULL client method is still a hole in the 2080e71b7053SJung-uk Kim * "version capability" vector. 2081e71b7053SJung-uk Kim */ 2082e71b7053SJung-uk Kim if (vent->cmeth == NULL) { 2083e71b7053SJung-uk Kim hole = 1; 2084e71b7053SJung-uk Kim tmp_real_max = 0; 2085e71b7053SJung-uk Kim continue; 2086e71b7053SJung-uk Kim } 2087e71b7053SJung-uk Kim method = vent->cmeth(); 2088e71b7053SJung-uk Kim 2089e71b7053SJung-uk Kim if (hole == 1 && tmp_real_max == 0) 2090e71b7053SJung-uk Kim tmp_real_max = vent->version; 2091e71b7053SJung-uk Kim 2092e71b7053SJung-uk Kim if (ssl_method_error(s, method) != 0) { 2093e71b7053SJung-uk Kim hole = 1; 2094e71b7053SJung-uk Kim } else if (!hole) { 2095e71b7053SJung-uk Kim single = NULL; 2096e71b7053SJung-uk Kim *min_version = method->version; 2097e71b7053SJung-uk Kim } else { 2098e71b7053SJung-uk Kim if (real_max != NULL && tmp_real_max != 0) 2099e71b7053SJung-uk Kim *real_max = tmp_real_max; 2100e71b7053SJung-uk Kim version = (single = method)->version; 2101e71b7053SJung-uk Kim *min_version = version; 2102e71b7053SJung-uk Kim hole = 0; 2103e71b7053SJung-uk Kim } 2104e71b7053SJung-uk Kim } 2105e71b7053SJung-uk Kim 2106e71b7053SJung-uk Kim *max_version = version; 2107e71b7053SJung-uk Kim 2108e71b7053SJung-uk Kim /* Fail if everything is disabled */ 2109e71b7053SJung-uk Kim if (version == 0) 2110e71b7053SJung-uk Kim return SSL_R_NO_PROTOCOLS_AVAILABLE; 2111e71b7053SJung-uk Kim 2112e71b7053SJung-uk Kim return 0; 2113e71b7053SJung-uk Kim } 2114e71b7053SJung-uk Kim 2115e71b7053SJung-uk Kim /* 2116e71b7053SJung-uk Kim * ssl_set_client_hello_version - Work out what version we should be using for 2117e71b7053SJung-uk Kim * the initial ClientHello.legacy_version field. 2118e71b7053SJung-uk Kim * 2119e71b7053SJung-uk Kim * @s: client SSL handle. 2120e71b7053SJung-uk Kim * 2121e71b7053SJung-uk Kim * Returns 0 on success or an SSL error reason number on failure. 2122e71b7053SJung-uk Kim */ 2123e71b7053SJung-uk Kim int ssl_set_client_hello_version(SSL *s) 2124e71b7053SJung-uk Kim { 2125e71b7053SJung-uk Kim int ver_min, ver_max, ret; 2126e71b7053SJung-uk Kim 2127e71b7053SJung-uk Kim /* 2128e71b7053SJung-uk Kim * In a renegotiation we always send the same client_version that we sent 2129e71b7053SJung-uk Kim * last time, regardless of which version we eventually negotiated. 2130e71b7053SJung-uk Kim */ 2131e71b7053SJung-uk Kim if (!SSL_IS_FIRST_HANDSHAKE(s)) 2132e71b7053SJung-uk Kim return 0; 2133e71b7053SJung-uk Kim 2134e71b7053SJung-uk Kim ret = ssl_get_min_max_version(s, &ver_min, &ver_max, NULL); 2135e71b7053SJung-uk Kim 2136e71b7053SJung-uk Kim if (ret != 0) 2137e71b7053SJung-uk Kim return ret; 2138e71b7053SJung-uk Kim 2139e71b7053SJung-uk Kim s->version = ver_max; 2140e71b7053SJung-uk Kim 2141e71b7053SJung-uk Kim /* TLS1.3 always uses TLS1.2 in the legacy_version field */ 2142e71b7053SJung-uk Kim if (!SSL_IS_DTLS(s) && ver_max > TLS1_2_VERSION) 2143e71b7053SJung-uk Kim ver_max = TLS1_2_VERSION; 2144e71b7053SJung-uk Kim 2145e71b7053SJung-uk Kim s->client_version = ver_max; 2146e71b7053SJung-uk Kim return 0; 2147e71b7053SJung-uk Kim } 2148e71b7053SJung-uk Kim 2149e71b7053SJung-uk Kim /* 2150e71b7053SJung-uk Kim * Checks a list of |groups| to determine if the |group_id| is in it. If it is 2151e71b7053SJung-uk Kim * and |checkallow| is 1 then additionally check if the group is allowed to be 2152e71b7053SJung-uk Kim * used. Returns 1 if the group is in the list (and allowed if |checkallow| is 2153e71b7053SJung-uk Kim * 1) or 0 otherwise. 2154e71b7053SJung-uk Kim */ 2155e71b7053SJung-uk Kim #ifndef OPENSSL_NO_EC 2156e71b7053SJung-uk Kim int check_in_list(SSL *s, uint16_t group_id, const uint16_t *groups, 2157e71b7053SJung-uk Kim size_t num_groups, int checkallow) 2158e71b7053SJung-uk Kim { 2159e71b7053SJung-uk Kim size_t i; 2160e71b7053SJung-uk Kim 2161e71b7053SJung-uk Kim if (groups == NULL || num_groups == 0) 2162e71b7053SJung-uk Kim return 0; 2163e71b7053SJung-uk Kim 2164e71b7053SJung-uk Kim for (i = 0; i < num_groups; i++) { 2165e71b7053SJung-uk Kim uint16_t group = groups[i]; 2166e71b7053SJung-uk Kim 2167e71b7053SJung-uk Kim if (group_id == group 2168e71b7053SJung-uk Kim && (!checkallow 2169e71b7053SJung-uk Kim || tls_curve_allowed(s, group, SSL_SECOP_CURVE_CHECK))) { 2170e71b7053SJung-uk Kim return 1; 2171e71b7053SJung-uk Kim } 2172e71b7053SJung-uk Kim } 2173e71b7053SJung-uk Kim 2174e71b7053SJung-uk Kim return 0; 2175e71b7053SJung-uk Kim } 2176e71b7053SJung-uk Kim #endif 2177e71b7053SJung-uk Kim 2178e71b7053SJung-uk Kim /* Replace ClientHello1 in the transcript hash with a synthetic message */ 2179e71b7053SJung-uk Kim int create_synthetic_message_hash(SSL *s, const unsigned char *hashval, 2180e71b7053SJung-uk Kim size_t hashlen, const unsigned char *hrr, 2181e71b7053SJung-uk Kim size_t hrrlen) 2182e71b7053SJung-uk Kim { 2183e71b7053SJung-uk Kim unsigned char hashvaltmp[EVP_MAX_MD_SIZE]; 2184e71b7053SJung-uk Kim unsigned char msghdr[SSL3_HM_HEADER_LENGTH]; 2185e71b7053SJung-uk Kim 2186e71b7053SJung-uk Kim memset(msghdr, 0, sizeof(msghdr)); 2187e71b7053SJung-uk Kim 2188e71b7053SJung-uk Kim if (hashval == NULL) { 2189e71b7053SJung-uk Kim hashval = hashvaltmp; 2190e71b7053SJung-uk Kim hashlen = 0; 2191e71b7053SJung-uk Kim /* Get the hash of the initial ClientHello */ 2192e71b7053SJung-uk Kim if (!ssl3_digest_cached_records(s, 0) 2193e71b7053SJung-uk Kim || !ssl_handshake_hash(s, hashvaltmp, sizeof(hashvaltmp), 2194e71b7053SJung-uk Kim &hashlen)) { 2195e71b7053SJung-uk Kim /* SSLfatal() already called */ 2196e71b7053SJung-uk Kim return 0; 2197e71b7053SJung-uk Kim } 2198e71b7053SJung-uk Kim } 2199e71b7053SJung-uk Kim 2200e71b7053SJung-uk Kim /* Reinitialise the transcript hash */ 2201e71b7053SJung-uk Kim if (!ssl3_init_finished_mac(s)) { 2202e71b7053SJung-uk Kim /* SSLfatal() already called */ 2203e71b7053SJung-uk Kim return 0; 2204e71b7053SJung-uk Kim } 2205e71b7053SJung-uk Kim 2206e71b7053SJung-uk Kim /* Inject the synthetic message_hash message */ 2207e71b7053SJung-uk Kim msghdr[0] = SSL3_MT_MESSAGE_HASH; 2208e71b7053SJung-uk Kim msghdr[SSL3_HM_HEADER_LENGTH - 1] = (unsigned char)hashlen; 2209e71b7053SJung-uk Kim if (!ssl3_finish_mac(s, msghdr, SSL3_HM_HEADER_LENGTH) 2210e71b7053SJung-uk Kim || !ssl3_finish_mac(s, hashval, hashlen)) { 2211e71b7053SJung-uk Kim /* SSLfatal() already called */ 2212e71b7053SJung-uk Kim return 0; 2213e71b7053SJung-uk Kim } 2214e71b7053SJung-uk Kim 2215e71b7053SJung-uk Kim /* 2216e71b7053SJung-uk Kim * Now re-inject the HRR and current message if appropriate (we just deleted 2217e71b7053SJung-uk Kim * it when we reinitialised the transcript hash above). Only necessary after 2218e71b7053SJung-uk Kim * receiving a ClientHello2 with a cookie. 2219e71b7053SJung-uk Kim */ 2220e71b7053SJung-uk Kim if (hrr != NULL 2221e71b7053SJung-uk Kim && (!ssl3_finish_mac(s, hrr, hrrlen) 2222e71b7053SJung-uk Kim || !ssl3_finish_mac(s, (unsigned char *)s->init_buf->data, 2223e71b7053SJung-uk Kim s->s3->tmp.message_size 2224e71b7053SJung-uk Kim + SSL3_HM_HEADER_LENGTH))) { 2225e71b7053SJung-uk Kim /* SSLfatal() already called */ 2226e71b7053SJung-uk Kim return 0; 2227e71b7053SJung-uk Kim } 2228e71b7053SJung-uk Kim 2229e71b7053SJung-uk Kim return 1; 2230e71b7053SJung-uk Kim } 2231e71b7053SJung-uk Kim 2232e71b7053SJung-uk Kim static int ca_dn_cmp(const X509_NAME *const *a, const X509_NAME *const *b) 2233e71b7053SJung-uk Kim { 2234e71b7053SJung-uk Kim return X509_NAME_cmp(*a, *b); 2235e71b7053SJung-uk Kim } 2236e71b7053SJung-uk Kim 2237e71b7053SJung-uk Kim int parse_ca_names(SSL *s, PACKET *pkt) 2238e71b7053SJung-uk Kim { 2239e71b7053SJung-uk Kim STACK_OF(X509_NAME) *ca_sk = sk_X509_NAME_new(ca_dn_cmp); 2240e71b7053SJung-uk Kim X509_NAME *xn = NULL; 2241e71b7053SJung-uk Kim PACKET cadns; 2242e71b7053SJung-uk Kim 2243e71b7053SJung-uk Kim if (ca_sk == NULL) { 2244e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_PARSE_CA_NAMES, 2245e71b7053SJung-uk Kim ERR_R_MALLOC_FAILURE); 2246e71b7053SJung-uk Kim goto err; 2247e71b7053SJung-uk Kim } 2248e71b7053SJung-uk Kim /* get the CA RDNs */ 2249e71b7053SJung-uk Kim if (!PACKET_get_length_prefixed_2(pkt, &cadns)) { 2250e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_DECODE_ERROR,SSL_F_PARSE_CA_NAMES, 2251e71b7053SJung-uk Kim SSL_R_LENGTH_MISMATCH); 2252e71b7053SJung-uk Kim goto err; 2253e71b7053SJung-uk Kim } 2254e71b7053SJung-uk Kim 2255e71b7053SJung-uk Kim while (PACKET_remaining(&cadns)) { 2256e71b7053SJung-uk Kim const unsigned char *namestart, *namebytes; 2257e71b7053SJung-uk Kim unsigned int name_len; 2258e71b7053SJung-uk Kim 2259e71b7053SJung-uk Kim if (!PACKET_get_net_2(&cadns, &name_len) 2260e71b7053SJung-uk Kim || !PACKET_get_bytes(&cadns, &namebytes, name_len)) { 2261e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_DECODE_ERROR, SSL_F_PARSE_CA_NAMES, 2262e71b7053SJung-uk Kim SSL_R_LENGTH_MISMATCH); 2263e71b7053SJung-uk Kim goto err; 2264e71b7053SJung-uk Kim } 2265e71b7053SJung-uk Kim 2266e71b7053SJung-uk Kim namestart = namebytes; 2267e71b7053SJung-uk Kim if ((xn = d2i_X509_NAME(NULL, &namebytes, name_len)) == NULL) { 2268e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_DECODE_ERROR, SSL_F_PARSE_CA_NAMES, 2269e71b7053SJung-uk Kim ERR_R_ASN1_LIB); 2270e71b7053SJung-uk Kim goto err; 2271e71b7053SJung-uk Kim } 2272e71b7053SJung-uk Kim if (namebytes != (namestart + name_len)) { 2273e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_DECODE_ERROR, SSL_F_PARSE_CA_NAMES, 2274e71b7053SJung-uk Kim SSL_R_CA_DN_LENGTH_MISMATCH); 2275e71b7053SJung-uk Kim goto err; 2276e71b7053SJung-uk Kim } 2277e71b7053SJung-uk Kim 2278e71b7053SJung-uk Kim if (!sk_X509_NAME_push(ca_sk, xn)) { 2279e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_PARSE_CA_NAMES, 2280e71b7053SJung-uk Kim ERR_R_MALLOC_FAILURE); 2281e71b7053SJung-uk Kim goto err; 2282e71b7053SJung-uk Kim } 2283e71b7053SJung-uk Kim xn = NULL; 2284e71b7053SJung-uk Kim } 2285e71b7053SJung-uk Kim 2286e71b7053SJung-uk Kim sk_X509_NAME_pop_free(s->s3->tmp.peer_ca_names, X509_NAME_free); 2287e71b7053SJung-uk Kim s->s3->tmp.peer_ca_names = ca_sk; 2288e71b7053SJung-uk Kim 2289e71b7053SJung-uk Kim return 1; 2290e71b7053SJung-uk Kim 2291e71b7053SJung-uk Kim err: 2292e71b7053SJung-uk Kim sk_X509_NAME_pop_free(ca_sk, X509_NAME_free); 2293e71b7053SJung-uk Kim X509_NAME_free(xn); 2294e71b7053SJung-uk Kim return 0; 2295e71b7053SJung-uk Kim } 2296e71b7053SJung-uk Kim 2297*c9cf7b5cSJung-uk Kim const STACK_OF(X509_NAME) *get_ca_names(SSL *s) 2298e71b7053SJung-uk Kim { 2299*c9cf7b5cSJung-uk Kim const STACK_OF(X509_NAME) *ca_sk = NULL;; 2300e71b7053SJung-uk Kim 2301*c9cf7b5cSJung-uk Kim if (s->server) { 2302*c9cf7b5cSJung-uk Kim ca_sk = SSL_get_client_CA_list(s); 2303*c9cf7b5cSJung-uk Kim if (ca_sk != NULL && sk_X509_NAME_num(ca_sk) == 0) 2304*c9cf7b5cSJung-uk Kim ca_sk = NULL; 2305*c9cf7b5cSJung-uk Kim } 2306*c9cf7b5cSJung-uk Kim 2307*c9cf7b5cSJung-uk Kim if (ca_sk == NULL) 2308*c9cf7b5cSJung-uk Kim ca_sk = SSL_get0_CA_list(s); 2309*c9cf7b5cSJung-uk Kim 2310*c9cf7b5cSJung-uk Kim return ca_sk; 2311*c9cf7b5cSJung-uk Kim } 2312*c9cf7b5cSJung-uk Kim 2313*c9cf7b5cSJung-uk Kim int construct_ca_names(SSL *s, const STACK_OF(X509_NAME) *ca_sk, WPACKET *pkt) 2314*c9cf7b5cSJung-uk Kim { 2315e71b7053SJung-uk Kim /* Start sub-packet for client CA list */ 2316e71b7053SJung-uk Kim if (!WPACKET_start_sub_packet_u16(pkt)) { 2317e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_CONSTRUCT_CA_NAMES, 2318e71b7053SJung-uk Kim ERR_R_INTERNAL_ERROR); 2319e71b7053SJung-uk Kim return 0; 2320e71b7053SJung-uk Kim } 2321e71b7053SJung-uk Kim 2322e71b7053SJung-uk Kim if (ca_sk != NULL) { 2323e71b7053SJung-uk Kim int i; 2324e71b7053SJung-uk Kim 2325e71b7053SJung-uk Kim for (i = 0; i < sk_X509_NAME_num(ca_sk); i++) { 2326e71b7053SJung-uk Kim unsigned char *namebytes; 2327e71b7053SJung-uk Kim X509_NAME *name = sk_X509_NAME_value(ca_sk, i); 2328e71b7053SJung-uk Kim int namelen; 2329e71b7053SJung-uk Kim 2330e71b7053SJung-uk Kim if (name == NULL 2331e71b7053SJung-uk Kim || (namelen = i2d_X509_NAME(name, NULL)) < 0 2332e71b7053SJung-uk Kim || !WPACKET_sub_allocate_bytes_u16(pkt, namelen, 2333e71b7053SJung-uk Kim &namebytes) 2334e71b7053SJung-uk Kim || i2d_X509_NAME(name, &namebytes) != namelen) { 2335e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_CONSTRUCT_CA_NAMES, 2336e71b7053SJung-uk Kim ERR_R_INTERNAL_ERROR); 2337e71b7053SJung-uk Kim return 0; 2338e71b7053SJung-uk Kim } 2339e71b7053SJung-uk Kim } 2340e71b7053SJung-uk Kim } 2341e71b7053SJung-uk Kim 2342e71b7053SJung-uk Kim if (!WPACKET_close(pkt)) { 2343e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_CONSTRUCT_CA_NAMES, 2344e71b7053SJung-uk Kim ERR_R_INTERNAL_ERROR); 2345e71b7053SJung-uk Kim return 0; 2346e71b7053SJung-uk Kim } 2347e71b7053SJung-uk Kim 2348e71b7053SJung-uk Kim return 1; 2349e71b7053SJung-uk Kim } 2350e71b7053SJung-uk Kim 2351e71b7053SJung-uk Kim /* Create a buffer containing data to be signed for server key exchange */ 2352e71b7053SJung-uk Kim size_t construct_key_exchange_tbs(SSL *s, unsigned char **ptbs, 2353e71b7053SJung-uk Kim const void *param, size_t paramlen) 2354e71b7053SJung-uk Kim { 2355e71b7053SJung-uk Kim size_t tbslen = 2 * SSL3_RANDOM_SIZE + paramlen; 2356e71b7053SJung-uk Kim unsigned char *tbs = OPENSSL_malloc(tbslen); 2357e71b7053SJung-uk Kim 2358e71b7053SJung-uk Kim if (tbs == NULL) { 2359e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_CONSTRUCT_KEY_EXCHANGE_TBS, 2360e71b7053SJung-uk Kim ERR_R_MALLOC_FAILURE); 2361e71b7053SJung-uk Kim return 0; 2362e71b7053SJung-uk Kim } 2363e71b7053SJung-uk Kim memcpy(tbs, s->s3->client_random, SSL3_RANDOM_SIZE); 2364e71b7053SJung-uk Kim memcpy(tbs + SSL3_RANDOM_SIZE, s->s3->server_random, SSL3_RANDOM_SIZE); 2365e71b7053SJung-uk Kim 2366e71b7053SJung-uk Kim memcpy(tbs + SSL3_RANDOM_SIZE * 2, param, paramlen); 2367e71b7053SJung-uk Kim 2368e71b7053SJung-uk Kim *ptbs = tbs; 2369e71b7053SJung-uk Kim return tbslen; 2370e71b7053SJung-uk Kim } 2371e71b7053SJung-uk Kim 2372e71b7053SJung-uk Kim /* 2373e71b7053SJung-uk Kim * Saves the current handshake digest for Post-Handshake Auth, 2374e71b7053SJung-uk Kim * Done after ClientFinished is processed, done exactly once 2375e71b7053SJung-uk Kim */ 2376e71b7053SJung-uk Kim int tls13_save_handshake_digest_for_pha(SSL *s) 2377e71b7053SJung-uk Kim { 2378e71b7053SJung-uk Kim if (s->pha_dgst == NULL) { 2379e71b7053SJung-uk Kim if (!ssl3_digest_cached_records(s, 1)) 2380e71b7053SJung-uk Kim /* SSLfatal() already called */ 2381e71b7053SJung-uk Kim return 0; 2382e71b7053SJung-uk Kim 2383e71b7053SJung-uk Kim s->pha_dgst = EVP_MD_CTX_new(); 2384e71b7053SJung-uk Kim if (s->pha_dgst == NULL) { 2385e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_INTERNAL_ERROR, 2386e71b7053SJung-uk Kim SSL_F_TLS13_SAVE_HANDSHAKE_DIGEST_FOR_PHA, 2387e71b7053SJung-uk Kim ERR_R_INTERNAL_ERROR); 2388e71b7053SJung-uk Kim return 0; 2389e71b7053SJung-uk Kim } 2390e71b7053SJung-uk Kim if (!EVP_MD_CTX_copy_ex(s->pha_dgst, 2391e71b7053SJung-uk Kim s->s3->handshake_dgst)) { 2392e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_INTERNAL_ERROR, 2393e71b7053SJung-uk Kim SSL_F_TLS13_SAVE_HANDSHAKE_DIGEST_FOR_PHA, 2394e71b7053SJung-uk Kim ERR_R_INTERNAL_ERROR); 2395e71b7053SJung-uk Kim return 0; 2396e71b7053SJung-uk Kim } 2397e71b7053SJung-uk Kim } 2398e71b7053SJung-uk Kim return 1; 2399e71b7053SJung-uk Kim } 2400e71b7053SJung-uk Kim 2401e71b7053SJung-uk Kim /* 2402e71b7053SJung-uk Kim * Restores the Post-Handshake Auth handshake digest 2403e71b7053SJung-uk Kim * Done just before sending/processing the Cert Request 2404e71b7053SJung-uk Kim */ 2405e71b7053SJung-uk Kim int tls13_restore_handshake_digest_for_pha(SSL *s) 2406e71b7053SJung-uk Kim { 2407e71b7053SJung-uk Kim if (s->pha_dgst == NULL) { 2408e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_INTERNAL_ERROR, 2409e71b7053SJung-uk Kim SSL_F_TLS13_RESTORE_HANDSHAKE_DIGEST_FOR_PHA, 2410e71b7053SJung-uk Kim ERR_R_INTERNAL_ERROR); 2411e71b7053SJung-uk Kim return 0; 2412e71b7053SJung-uk Kim } 2413e71b7053SJung-uk Kim if (!EVP_MD_CTX_copy_ex(s->s3->handshake_dgst, 2414e71b7053SJung-uk Kim s->pha_dgst)) { 2415e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_INTERNAL_ERROR, 2416e71b7053SJung-uk Kim SSL_F_TLS13_RESTORE_HANDSHAKE_DIGEST_FOR_PHA, 2417e71b7053SJung-uk Kim ERR_R_INTERNAL_ERROR); 2418e71b7053SJung-uk Kim return 0; 2419e71b7053SJung-uk Kim } 2420e71b7053SJung-uk Kim return 1; 2421e71b7053SJung-uk Kim } 2422