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 * Copyright 2005 Nokia. All rights reserved. 5e71b7053SJung-uk Kim * 6e71b7053SJung-uk Kim * Licensed under the OpenSSL license (the "License"). You may not use 7e71b7053SJung-uk Kim * this file except in compliance with the License. You can obtain a copy 8e71b7053SJung-uk Kim * in the file LICENSE in the source distribution or at 9e71b7053SJung-uk Kim * https://www.openssl.org/source/license.html 10e71b7053SJung-uk Kim */ 11e71b7053SJung-uk Kim 12e71b7053SJung-uk Kim #include <stdio.h> 13e71b7053SJung-uk Kim #include "../ssl_locl.h" 14e71b7053SJung-uk Kim #include "statem_locl.h" 15e71b7053SJung-uk Kim #include "internal/constant_time_locl.h" 16e71b7053SJung-uk Kim #include "internal/cryptlib.h" 17e71b7053SJung-uk Kim #include <openssl/buffer.h> 18e71b7053SJung-uk Kim #include <openssl/rand.h> 19e71b7053SJung-uk Kim #include <openssl/objects.h> 20e71b7053SJung-uk Kim #include <openssl/evp.h> 21e71b7053SJung-uk Kim #include <openssl/hmac.h> 22e71b7053SJung-uk Kim #include <openssl/x509.h> 23e71b7053SJung-uk Kim #include <openssl/dh.h> 24e71b7053SJung-uk Kim #include <openssl/bn.h> 25e71b7053SJung-uk Kim #include <openssl/md5.h> 26e71b7053SJung-uk Kim 27e71b7053SJung-uk Kim #define TICKET_NONCE_SIZE 8 28e71b7053SJung-uk Kim 29e71b7053SJung-uk Kim static int tls_construct_encrypted_extensions(SSL *s, WPACKET *pkt); 30e71b7053SJung-uk Kim 31e71b7053SJung-uk Kim /* 32e71b7053SJung-uk Kim * ossl_statem_server13_read_transition() encapsulates the logic for the allowed 33e71b7053SJung-uk Kim * handshake state transitions when a TLSv1.3 server is reading messages from 34e71b7053SJung-uk Kim * the client. The message type that the client has sent is provided in |mt|. 35e71b7053SJung-uk Kim * The current state is in |s->statem.hand_state|. 36e71b7053SJung-uk Kim * 37e71b7053SJung-uk Kim * Return values are 1 for success (transition allowed) and 0 on error 38e71b7053SJung-uk Kim * (transition not allowed) 39e71b7053SJung-uk Kim */ 40e71b7053SJung-uk Kim static int ossl_statem_server13_read_transition(SSL *s, int mt) 41e71b7053SJung-uk Kim { 42e71b7053SJung-uk Kim OSSL_STATEM *st = &s->statem; 43e71b7053SJung-uk Kim 44e71b7053SJung-uk Kim /* 45e71b7053SJung-uk Kim * Note: There is no case for TLS_ST_BEFORE because at that stage we have 46e71b7053SJung-uk Kim * not negotiated TLSv1.3 yet, so that case is handled by 47e71b7053SJung-uk Kim * ossl_statem_server_read_transition() 48e71b7053SJung-uk Kim */ 49e71b7053SJung-uk Kim switch (st->hand_state) { 50e71b7053SJung-uk Kim default: 51e71b7053SJung-uk Kim break; 52e71b7053SJung-uk Kim 53e71b7053SJung-uk Kim case TLS_ST_EARLY_DATA: 54e71b7053SJung-uk Kim if (s->hello_retry_request == SSL_HRR_PENDING) { 55e71b7053SJung-uk Kim if (mt == SSL3_MT_CLIENT_HELLO) { 56e71b7053SJung-uk Kim st->hand_state = TLS_ST_SR_CLNT_HELLO; 57e71b7053SJung-uk Kim return 1; 58e71b7053SJung-uk Kim } 59e71b7053SJung-uk Kim break; 60e71b7053SJung-uk Kim } else if (s->ext.early_data == SSL_EARLY_DATA_ACCEPTED) { 61e71b7053SJung-uk Kim if (mt == SSL3_MT_END_OF_EARLY_DATA) { 62e71b7053SJung-uk Kim st->hand_state = TLS_ST_SR_END_OF_EARLY_DATA; 63e71b7053SJung-uk Kim return 1; 64e71b7053SJung-uk Kim } 65e71b7053SJung-uk Kim break; 66e71b7053SJung-uk Kim } 67e71b7053SJung-uk Kim /* Fall through */ 68e71b7053SJung-uk Kim 69e71b7053SJung-uk Kim case TLS_ST_SR_END_OF_EARLY_DATA: 70e71b7053SJung-uk Kim case TLS_ST_SW_FINISHED: 71e71b7053SJung-uk Kim if (s->s3->tmp.cert_request) { 72e71b7053SJung-uk Kim if (mt == SSL3_MT_CERTIFICATE) { 73e71b7053SJung-uk Kim st->hand_state = TLS_ST_SR_CERT; 74e71b7053SJung-uk Kim return 1; 75e71b7053SJung-uk Kim } 76e71b7053SJung-uk Kim } else { 77e71b7053SJung-uk Kim if (mt == SSL3_MT_FINISHED) { 78e71b7053SJung-uk Kim st->hand_state = TLS_ST_SR_FINISHED; 79e71b7053SJung-uk Kim return 1; 80e71b7053SJung-uk Kim } 81e71b7053SJung-uk Kim } 82e71b7053SJung-uk Kim break; 83e71b7053SJung-uk Kim 84e71b7053SJung-uk Kim case TLS_ST_SR_CERT: 85e71b7053SJung-uk Kim if (s->session->peer == NULL) { 86e71b7053SJung-uk Kim if (mt == SSL3_MT_FINISHED) { 87e71b7053SJung-uk Kim st->hand_state = TLS_ST_SR_FINISHED; 88e71b7053SJung-uk Kim return 1; 89e71b7053SJung-uk Kim } 90e71b7053SJung-uk Kim } else { 91e71b7053SJung-uk Kim if (mt == SSL3_MT_CERTIFICATE_VERIFY) { 92e71b7053SJung-uk Kim st->hand_state = TLS_ST_SR_CERT_VRFY; 93e71b7053SJung-uk Kim return 1; 94e71b7053SJung-uk Kim } 95e71b7053SJung-uk Kim } 96e71b7053SJung-uk Kim break; 97e71b7053SJung-uk Kim 98e71b7053SJung-uk Kim case TLS_ST_SR_CERT_VRFY: 99e71b7053SJung-uk Kim if (mt == SSL3_MT_FINISHED) { 100e71b7053SJung-uk Kim st->hand_state = TLS_ST_SR_FINISHED; 101e71b7053SJung-uk Kim return 1; 102e71b7053SJung-uk Kim } 103e71b7053SJung-uk Kim break; 104e71b7053SJung-uk Kim 105e71b7053SJung-uk Kim case TLS_ST_OK: 106e71b7053SJung-uk Kim /* 107e71b7053SJung-uk Kim * Its never ok to start processing handshake messages in the middle of 108e71b7053SJung-uk Kim * early data (i.e. before we've received the end of early data alert) 109e71b7053SJung-uk Kim */ 110e71b7053SJung-uk Kim if (s->early_data_state == SSL_EARLY_DATA_READING) 111e71b7053SJung-uk Kim break; 112e71b7053SJung-uk Kim 113e71b7053SJung-uk Kim if (mt == SSL3_MT_CERTIFICATE 114e71b7053SJung-uk Kim && s->post_handshake_auth == SSL_PHA_REQUESTED) { 115e71b7053SJung-uk Kim st->hand_state = TLS_ST_SR_CERT; 116e71b7053SJung-uk Kim return 1; 117e71b7053SJung-uk Kim } 118e71b7053SJung-uk Kim 119e71b7053SJung-uk Kim if (mt == SSL3_MT_KEY_UPDATE) { 120e71b7053SJung-uk Kim st->hand_state = TLS_ST_SR_KEY_UPDATE; 121e71b7053SJung-uk Kim return 1; 122e71b7053SJung-uk Kim } 123e71b7053SJung-uk Kim break; 124e71b7053SJung-uk Kim } 125e71b7053SJung-uk Kim 126e71b7053SJung-uk Kim /* No valid transition found */ 127e71b7053SJung-uk Kim return 0; 128e71b7053SJung-uk Kim } 129e71b7053SJung-uk Kim 130e71b7053SJung-uk Kim /* 131e71b7053SJung-uk Kim * ossl_statem_server_read_transition() encapsulates the logic for the allowed 132e71b7053SJung-uk Kim * handshake state transitions when the server is reading messages from the 133e71b7053SJung-uk Kim * client. The message type that the client has sent is provided in |mt|. The 134e71b7053SJung-uk Kim * current state is in |s->statem.hand_state|. 135e71b7053SJung-uk Kim * 136e71b7053SJung-uk Kim * Return values are 1 for success (transition allowed) and 0 on error 137e71b7053SJung-uk Kim * (transition not allowed) 138e71b7053SJung-uk Kim */ 139e71b7053SJung-uk Kim int ossl_statem_server_read_transition(SSL *s, int mt) 140e71b7053SJung-uk Kim { 141e71b7053SJung-uk Kim OSSL_STATEM *st = &s->statem; 142e71b7053SJung-uk Kim 143e71b7053SJung-uk Kim if (SSL_IS_TLS13(s)) { 144e71b7053SJung-uk Kim if (!ossl_statem_server13_read_transition(s, mt)) 145e71b7053SJung-uk Kim goto err; 146e71b7053SJung-uk Kim return 1; 147e71b7053SJung-uk Kim } 148e71b7053SJung-uk Kim 149e71b7053SJung-uk Kim switch (st->hand_state) { 150e71b7053SJung-uk Kim default: 151e71b7053SJung-uk Kim break; 152e71b7053SJung-uk Kim 153e71b7053SJung-uk Kim case TLS_ST_BEFORE: 154e71b7053SJung-uk Kim case TLS_ST_OK: 155e71b7053SJung-uk Kim case DTLS_ST_SW_HELLO_VERIFY_REQUEST: 156e71b7053SJung-uk Kim if (mt == SSL3_MT_CLIENT_HELLO) { 157e71b7053SJung-uk Kim st->hand_state = TLS_ST_SR_CLNT_HELLO; 158e71b7053SJung-uk Kim return 1; 159e71b7053SJung-uk Kim } 160e71b7053SJung-uk Kim break; 161e71b7053SJung-uk Kim 162e71b7053SJung-uk Kim case TLS_ST_SW_SRVR_DONE: 163e71b7053SJung-uk Kim /* 164e71b7053SJung-uk Kim * If we get a CKE message after a ServerDone then either 165e71b7053SJung-uk Kim * 1) We didn't request a Certificate 166e71b7053SJung-uk Kim * OR 167e71b7053SJung-uk Kim * 2) If we did request one then 168e71b7053SJung-uk Kim * a) We allow no Certificate to be returned 169e71b7053SJung-uk Kim * AND 170e71b7053SJung-uk Kim * b) We are running SSL3 (in TLS1.0+ the client must return a 0 171e71b7053SJung-uk Kim * list if we requested a certificate) 172e71b7053SJung-uk Kim */ 173e71b7053SJung-uk Kim if (mt == SSL3_MT_CLIENT_KEY_EXCHANGE) { 174e71b7053SJung-uk Kim if (s->s3->tmp.cert_request) { 175e71b7053SJung-uk Kim if (s->version == SSL3_VERSION) { 176e71b7053SJung-uk Kim if ((s->verify_mode & SSL_VERIFY_PEER) 177e71b7053SJung-uk Kim && (s->verify_mode & SSL_VERIFY_FAIL_IF_NO_PEER_CERT)) { 178e71b7053SJung-uk Kim /* 179e71b7053SJung-uk Kim * This isn't an unexpected message as such - we're just 180e71b7053SJung-uk Kim * not going to accept it because we require a client 181e71b7053SJung-uk Kim * cert. 182e71b7053SJung-uk Kim */ 183e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_HANDSHAKE_FAILURE, 184e71b7053SJung-uk Kim SSL_F_OSSL_STATEM_SERVER_READ_TRANSITION, 185e71b7053SJung-uk Kim SSL_R_PEER_DID_NOT_RETURN_A_CERTIFICATE); 186e71b7053SJung-uk Kim return 0; 187e71b7053SJung-uk Kim } 188e71b7053SJung-uk Kim st->hand_state = TLS_ST_SR_KEY_EXCH; 189e71b7053SJung-uk Kim return 1; 190e71b7053SJung-uk Kim } 191e71b7053SJung-uk Kim } else { 192e71b7053SJung-uk Kim st->hand_state = TLS_ST_SR_KEY_EXCH; 193e71b7053SJung-uk Kim return 1; 194e71b7053SJung-uk Kim } 195e71b7053SJung-uk Kim } else if (s->s3->tmp.cert_request) { 196e71b7053SJung-uk Kim if (mt == SSL3_MT_CERTIFICATE) { 197e71b7053SJung-uk Kim st->hand_state = TLS_ST_SR_CERT; 198e71b7053SJung-uk Kim return 1; 199e71b7053SJung-uk Kim } 200e71b7053SJung-uk Kim } 201e71b7053SJung-uk Kim break; 202e71b7053SJung-uk Kim 203e71b7053SJung-uk Kim case TLS_ST_SR_CERT: 204e71b7053SJung-uk Kim if (mt == SSL3_MT_CLIENT_KEY_EXCHANGE) { 205e71b7053SJung-uk Kim st->hand_state = TLS_ST_SR_KEY_EXCH; 206e71b7053SJung-uk Kim return 1; 207e71b7053SJung-uk Kim } 208e71b7053SJung-uk Kim break; 209e71b7053SJung-uk Kim 210e71b7053SJung-uk Kim case TLS_ST_SR_KEY_EXCH: 211e71b7053SJung-uk Kim /* 212e71b7053SJung-uk Kim * We should only process a CertificateVerify message if we have 213e71b7053SJung-uk Kim * received a Certificate from the client. If so then |s->session->peer| 214e71b7053SJung-uk Kim * will be non NULL. In some instances a CertificateVerify message is 215e71b7053SJung-uk Kim * not required even if the peer has sent a Certificate (e.g. such as in 216e71b7053SJung-uk Kim * the case of static DH). In that case |st->no_cert_verify| should be 217e71b7053SJung-uk Kim * set. 218e71b7053SJung-uk Kim */ 219e71b7053SJung-uk Kim if (s->session->peer == NULL || st->no_cert_verify) { 220e71b7053SJung-uk Kim if (mt == SSL3_MT_CHANGE_CIPHER_SPEC) { 221e71b7053SJung-uk Kim /* 222e71b7053SJung-uk Kim * For the ECDH ciphersuites when the client sends its ECDH 223e71b7053SJung-uk Kim * pub key in a certificate, the CertificateVerify message is 224e71b7053SJung-uk Kim * not sent. Also for GOST ciphersuites when the client uses 225e71b7053SJung-uk Kim * its key from the certificate for key exchange. 226e71b7053SJung-uk Kim */ 227e71b7053SJung-uk Kim st->hand_state = TLS_ST_SR_CHANGE; 228e71b7053SJung-uk Kim return 1; 229e71b7053SJung-uk Kim } 230e71b7053SJung-uk Kim } else { 231e71b7053SJung-uk Kim if (mt == SSL3_MT_CERTIFICATE_VERIFY) { 232e71b7053SJung-uk Kim st->hand_state = TLS_ST_SR_CERT_VRFY; 233e71b7053SJung-uk Kim return 1; 234e71b7053SJung-uk Kim } 235e71b7053SJung-uk Kim } 236e71b7053SJung-uk Kim break; 237e71b7053SJung-uk Kim 238e71b7053SJung-uk Kim case TLS_ST_SR_CERT_VRFY: 239e71b7053SJung-uk Kim if (mt == SSL3_MT_CHANGE_CIPHER_SPEC) { 240e71b7053SJung-uk Kim st->hand_state = TLS_ST_SR_CHANGE; 241e71b7053SJung-uk Kim return 1; 242e71b7053SJung-uk Kim } 243e71b7053SJung-uk Kim break; 244e71b7053SJung-uk Kim 245e71b7053SJung-uk Kim case TLS_ST_SR_CHANGE: 246e71b7053SJung-uk Kim #ifndef OPENSSL_NO_NEXTPROTONEG 247e71b7053SJung-uk Kim if (s->s3->npn_seen) { 248e71b7053SJung-uk Kim if (mt == SSL3_MT_NEXT_PROTO) { 249e71b7053SJung-uk Kim st->hand_state = TLS_ST_SR_NEXT_PROTO; 250e71b7053SJung-uk Kim return 1; 251e71b7053SJung-uk Kim } 252e71b7053SJung-uk Kim } else { 253e71b7053SJung-uk Kim #endif 254e71b7053SJung-uk Kim if (mt == SSL3_MT_FINISHED) { 255e71b7053SJung-uk Kim st->hand_state = TLS_ST_SR_FINISHED; 256e71b7053SJung-uk Kim return 1; 257e71b7053SJung-uk Kim } 258e71b7053SJung-uk Kim #ifndef OPENSSL_NO_NEXTPROTONEG 259e71b7053SJung-uk Kim } 260e71b7053SJung-uk Kim #endif 261e71b7053SJung-uk Kim break; 262e71b7053SJung-uk Kim 263e71b7053SJung-uk Kim #ifndef OPENSSL_NO_NEXTPROTONEG 264e71b7053SJung-uk Kim case TLS_ST_SR_NEXT_PROTO: 265e71b7053SJung-uk Kim if (mt == SSL3_MT_FINISHED) { 266e71b7053SJung-uk Kim st->hand_state = TLS_ST_SR_FINISHED; 267e71b7053SJung-uk Kim return 1; 268e71b7053SJung-uk Kim } 269e71b7053SJung-uk Kim break; 270e71b7053SJung-uk Kim #endif 271e71b7053SJung-uk Kim 272e71b7053SJung-uk Kim case TLS_ST_SW_FINISHED: 273e71b7053SJung-uk Kim if (mt == SSL3_MT_CHANGE_CIPHER_SPEC) { 274e71b7053SJung-uk Kim st->hand_state = TLS_ST_SR_CHANGE; 275e71b7053SJung-uk Kim return 1; 276e71b7053SJung-uk Kim } 277e71b7053SJung-uk Kim break; 278e71b7053SJung-uk Kim } 279e71b7053SJung-uk Kim 280e71b7053SJung-uk Kim err: 281e71b7053SJung-uk Kim /* No valid transition found */ 282e71b7053SJung-uk Kim if (SSL_IS_DTLS(s) && mt == SSL3_MT_CHANGE_CIPHER_SPEC) { 283e71b7053SJung-uk Kim BIO *rbio; 284e71b7053SJung-uk Kim 285e71b7053SJung-uk Kim /* 286e71b7053SJung-uk Kim * CCS messages don't have a message sequence number so this is probably 287e71b7053SJung-uk Kim * because of an out-of-order CCS. We'll just drop it. 288e71b7053SJung-uk Kim */ 289e71b7053SJung-uk Kim s->init_num = 0; 290e71b7053SJung-uk Kim s->rwstate = SSL_READING; 291e71b7053SJung-uk Kim rbio = SSL_get_rbio(s); 292e71b7053SJung-uk Kim BIO_clear_retry_flags(rbio); 293e71b7053SJung-uk Kim BIO_set_retry_read(rbio); 294e71b7053SJung-uk Kim return 0; 295e71b7053SJung-uk Kim } 296e71b7053SJung-uk Kim SSLfatal(s, SSL3_AD_UNEXPECTED_MESSAGE, 297e71b7053SJung-uk Kim SSL_F_OSSL_STATEM_SERVER_READ_TRANSITION, 298e71b7053SJung-uk Kim SSL_R_UNEXPECTED_MESSAGE); 299e71b7053SJung-uk Kim return 0; 300e71b7053SJung-uk Kim } 301e71b7053SJung-uk Kim 302e71b7053SJung-uk Kim /* 303e71b7053SJung-uk Kim * Should we send a ServerKeyExchange message? 304e71b7053SJung-uk Kim * 305e71b7053SJung-uk Kim * Valid return values are: 306e71b7053SJung-uk Kim * 1: Yes 307e71b7053SJung-uk Kim * 0: No 308e71b7053SJung-uk Kim */ 309e71b7053SJung-uk Kim static int send_server_key_exchange(SSL *s) 310e71b7053SJung-uk Kim { 311e71b7053SJung-uk Kim unsigned long alg_k = s->s3->tmp.new_cipher->algorithm_mkey; 312e71b7053SJung-uk Kim 313e71b7053SJung-uk Kim /* 314e71b7053SJung-uk Kim * only send a ServerKeyExchange if DH or fortezza but we have a 315e71b7053SJung-uk Kim * sign only certificate PSK: may send PSK identity hints For 316e71b7053SJung-uk Kim * ECC ciphersuites, we send a serverKeyExchange message only if 317e71b7053SJung-uk Kim * the cipher suite is either ECDH-anon or ECDHE. In other cases, 318e71b7053SJung-uk Kim * the server certificate contains the server's public key for 319e71b7053SJung-uk Kim * key exchange. 320e71b7053SJung-uk Kim */ 321e71b7053SJung-uk Kim if (alg_k & (SSL_kDHE | SSL_kECDHE) 322e71b7053SJung-uk Kim /* 323e71b7053SJung-uk Kim * PSK: send ServerKeyExchange if PSK identity hint if 324e71b7053SJung-uk Kim * provided 325e71b7053SJung-uk Kim */ 326e71b7053SJung-uk Kim #ifndef OPENSSL_NO_PSK 327e71b7053SJung-uk Kim /* Only send SKE if we have identity hint for plain PSK */ 328e71b7053SJung-uk Kim || ((alg_k & (SSL_kPSK | SSL_kRSAPSK)) 329e71b7053SJung-uk Kim && s->cert->psk_identity_hint) 330e71b7053SJung-uk Kim /* For other PSK always send SKE */ 331e71b7053SJung-uk Kim || (alg_k & (SSL_PSK & (SSL_kDHEPSK | SSL_kECDHEPSK))) 332e71b7053SJung-uk Kim #endif 333e71b7053SJung-uk Kim #ifndef OPENSSL_NO_SRP 334e71b7053SJung-uk Kim /* SRP: send ServerKeyExchange */ 335e71b7053SJung-uk Kim || (alg_k & SSL_kSRP) 336e71b7053SJung-uk Kim #endif 337e71b7053SJung-uk Kim ) { 338e71b7053SJung-uk Kim return 1; 339e71b7053SJung-uk Kim } 340e71b7053SJung-uk Kim 341e71b7053SJung-uk Kim return 0; 342e71b7053SJung-uk Kim } 343e71b7053SJung-uk Kim 344e71b7053SJung-uk Kim /* 345e71b7053SJung-uk Kim * Should we send a CertificateRequest message? 346e71b7053SJung-uk Kim * 347e71b7053SJung-uk Kim * Valid return values are: 348e71b7053SJung-uk Kim * 1: Yes 349e71b7053SJung-uk Kim * 0: No 350e71b7053SJung-uk Kim */ 351e71b7053SJung-uk Kim int send_certificate_request(SSL *s) 352e71b7053SJung-uk Kim { 353e71b7053SJung-uk Kim if ( 354e71b7053SJung-uk Kim /* don't request cert unless asked for it: */ 355e71b7053SJung-uk Kim s->verify_mode & SSL_VERIFY_PEER 356e71b7053SJung-uk Kim /* 357e71b7053SJung-uk Kim * don't request if post-handshake-only unless doing 358e71b7053SJung-uk Kim * post-handshake in TLSv1.3: 359e71b7053SJung-uk Kim */ 360e71b7053SJung-uk Kim && (!SSL_IS_TLS13(s) || !(s->verify_mode & SSL_VERIFY_POST_HANDSHAKE) 361e71b7053SJung-uk Kim || s->post_handshake_auth == SSL_PHA_REQUEST_PENDING) 362e71b7053SJung-uk Kim /* 363e71b7053SJung-uk Kim * if SSL_VERIFY_CLIENT_ONCE is set, don't request cert 364e71b7053SJung-uk Kim * a second time: 365e71b7053SJung-uk Kim */ 366e71b7053SJung-uk Kim && (s->certreqs_sent < 1 || 367e71b7053SJung-uk Kim !(s->verify_mode & SSL_VERIFY_CLIENT_ONCE)) 368e71b7053SJung-uk Kim /* 369e71b7053SJung-uk Kim * never request cert in anonymous ciphersuites (see 370e71b7053SJung-uk Kim * section "Certificate request" in SSL 3 drafts and in 371e71b7053SJung-uk Kim * RFC 2246): 372e71b7053SJung-uk Kim */ 373e71b7053SJung-uk Kim && (!(s->s3->tmp.new_cipher->algorithm_auth & SSL_aNULL) 374e71b7053SJung-uk Kim /* 375e71b7053SJung-uk Kim * ... except when the application insists on 376e71b7053SJung-uk Kim * verification (against the specs, but statem_clnt.c accepts 377e71b7053SJung-uk Kim * this for SSL 3) 378e71b7053SJung-uk Kim */ 379e71b7053SJung-uk Kim || (s->verify_mode & SSL_VERIFY_FAIL_IF_NO_PEER_CERT)) 380e71b7053SJung-uk Kim /* don't request certificate for SRP auth */ 381e71b7053SJung-uk Kim && !(s->s3->tmp.new_cipher->algorithm_auth & SSL_aSRP) 382e71b7053SJung-uk Kim /* 383e71b7053SJung-uk Kim * With normal PSK Certificates and Certificate Requests 384e71b7053SJung-uk Kim * are omitted 385e71b7053SJung-uk Kim */ 386e71b7053SJung-uk Kim && !(s->s3->tmp.new_cipher->algorithm_auth & SSL_aPSK)) { 387e71b7053SJung-uk Kim return 1; 388e71b7053SJung-uk Kim } 389e71b7053SJung-uk Kim 390e71b7053SJung-uk Kim return 0; 391e71b7053SJung-uk Kim } 392e71b7053SJung-uk Kim 393e71b7053SJung-uk Kim /* 394e71b7053SJung-uk Kim * ossl_statem_server13_write_transition() works out what handshake state to 395e71b7053SJung-uk Kim * move to next when a TLSv1.3 server is writing messages to be sent to the 396e71b7053SJung-uk Kim * client. 397e71b7053SJung-uk Kim */ 398e71b7053SJung-uk Kim static WRITE_TRAN ossl_statem_server13_write_transition(SSL *s) 399e71b7053SJung-uk Kim { 400e71b7053SJung-uk Kim OSSL_STATEM *st = &s->statem; 401e71b7053SJung-uk Kim 402e71b7053SJung-uk Kim /* 403e71b7053SJung-uk Kim * No case for TLS_ST_BEFORE, because at that stage we have not negotiated 404e71b7053SJung-uk Kim * TLSv1.3 yet, so that is handled by ossl_statem_server_write_transition() 405e71b7053SJung-uk Kim */ 406e71b7053SJung-uk Kim 407e71b7053SJung-uk Kim switch (st->hand_state) { 408e71b7053SJung-uk Kim default: 409e71b7053SJung-uk Kim /* Shouldn't happen */ 410e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_INTERNAL_ERROR, 411e71b7053SJung-uk Kim SSL_F_OSSL_STATEM_SERVER13_WRITE_TRANSITION, 412e71b7053SJung-uk Kim ERR_R_INTERNAL_ERROR); 413e71b7053SJung-uk Kim return WRITE_TRAN_ERROR; 414e71b7053SJung-uk Kim 415e71b7053SJung-uk Kim case TLS_ST_OK: 416e71b7053SJung-uk Kim if (s->key_update != SSL_KEY_UPDATE_NONE) { 417e71b7053SJung-uk Kim st->hand_state = TLS_ST_SW_KEY_UPDATE; 418e71b7053SJung-uk Kim return WRITE_TRAN_CONTINUE; 419e71b7053SJung-uk Kim } 420e71b7053SJung-uk Kim if (s->post_handshake_auth == SSL_PHA_REQUEST_PENDING) { 421e71b7053SJung-uk Kim st->hand_state = TLS_ST_SW_CERT_REQ; 422e71b7053SJung-uk Kim return WRITE_TRAN_CONTINUE; 423e71b7053SJung-uk Kim } 424e71b7053SJung-uk Kim /* Try to read from the client instead */ 425e71b7053SJung-uk Kim return WRITE_TRAN_FINISHED; 426e71b7053SJung-uk Kim 427e71b7053SJung-uk Kim case TLS_ST_SR_CLNT_HELLO: 428e71b7053SJung-uk Kim st->hand_state = TLS_ST_SW_SRVR_HELLO; 429e71b7053SJung-uk Kim return WRITE_TRAN_CONTINUE; 430e71b7053SJung-uk Kim 431e71b7053SJung-uk Kim case TLS_ST_SW_SRVR_HELLO: 432e71b7053SJung-uk Kim if ((s->options & SSL_OP_ENABLE_MIDDLEBOX_COMPAT) != 0 433e71b7053SJung-uk Kim && s->hello_retry_request != SSL_HRR_COMPLETE) 434e71b7053SJung-uk Kim st->hand_state = TLS_ST_SW_CHANGE; 435e71b7053SJung-uk Kim else if (s->hello_retry_request == SSL_HRR_PENDING) 436e71b7053SJung-uk Kim st->hand_state = TLS_ST_EARLY_DATA; 437e71b7053SJung-uk Kim else 438e71b7053SJung-uk Kim st->hand_state = TLS_ST_SW_ENCRYPTED_EXTENSIONS; 439e71b7053SJung-uk Kim return WRITE_TRAN_CONTINUE; 440e71b7053SJung-uk Kim 441e71b7053SJung-uk Kim case TLS_ST_SW_CHANGE: 442e71b7053SJung-uk Kim if (s->hello_retry_request == SSL_HRR_PENDING) 443e71b7053SJung-uk Kim st->hand_state = TLS_ST_EARLY_DATA; 444e71b7053SJung-uk Kim else 445e71b7053SJung-uk Kim st->hand_state = TLS_ST_SW_ENCRYPTED_EXTENSIONS; 446e71b7053SJung-uk Kim return WRITE_TRAN_CONTINUE; 447e71b7053SJung-uk Kim 448e71b7053SJung-uk Kim case TLS_ST_SW_ENCRYPTED_EXTENSIONS: 449e71b7053SJung-uk Kim if (s->hit) 450e71b7053SJung-uk Kim st->hand_state = TLS_ST_SW_FINISHED; 451e71b7053SJung-uk Kim else if (send_certificate_request(s)) 452e71b7053SJung-uk Kim st->hand_state = TLS_ST_SW_CERT_REQ; 453e71b7053SJung-uk Kim else 454e71b7053SJung-uk Kim st->hand_state = TLS_ST_SW_CERT; 455e71b7053SJung-uk Kim 456e71b7053SJung-uk Kim return WRITE_TRAN_CONTINUE; 457e71b7053SJung-uk Kim 458e71b7053SJung-uk Kim case TLS_ST_SW_CERT_REQ: 459e71b7053SJung-uk Kim if (s->post_handshake_auth == SSL_PHA_REQUEST_PENDING) { 460e71b7053SJung-uk Kim s->post_handshake_auth = SSL_PHA_REQUESTED; 461e71b7053SJung-uk Kim st->hand_state = TLS_ST_OK; 462e71b7053SJung-uk Kim } else { 463e71b7053SJung-uk Kim st->hand_state = TLS_ST_SW_CERT; 464e71b7053SJung-uk Kim } 465e71b7053SJung-uk Kim return WRITE_TRAN_CONTINUE; 466e71b7053SJung-uk Kim 467e71b7053SJung-uk Kim case TLS_ST_SW_CERT: 468e71b7053SJung-uk Kim st->hand_state = TLS_ST_SW_CERT_VRFY; 469e71b7053SJung-uk Kim return WRITE_TRAN_CONTINUE; 470e71b7053SJung-uk Kim 471e71b7053SJung-uk Kim case TLS_ST_SW_CERT_VRFY: 472e71b7053SJung-uk Kim st->hand_state = TLS_ST_SW_FINISHED; 473e71b7053SJung-uk Kim return WRITE_TRAN_CONTINUE; 474e71b7053SJung-uk Kim 475e71b7053SJung-uk Kim case TLS_ST_SW_FINISHED: 476e71b7053SJung-uk Kim st->hand_state = TLS_ST_EARLY_DATA; 477e71b7053SJung-uk Kim return WRITE_TRAN_CONTINUE; 478e71b7053SJung-uk Kim 479e71b7053SJung-uk Kim case TLS_ST_EARLY_DATA: 480e71b7053SJung-uk Kim return WRITE_TRAN_FINISHED; 481e71b7053SJung-uk Kim 482e71b7053SJung-uk Kim case TLS_ST_SR_FINISHED: 483e71b7053SJung-uk Kim /* 484e71b7053SJung-uk Kim * Technically we have finished the handshake at this point, but we're 485e71b7053SJung-uk Kim * going to remain "in_init" for now and write out any session tickets 486e71b7053SJung-uk Kim * immediately. 487e71b7053SJung-uk Kim */ 488e71b7053SJung-uk Kim if (s->post_handshake_auth == SSL_PHA_REQUESTED) { 489e71b7053SJung-uk Kim s->post_handshake_auth = SSL_PHA_EXT_RECEIVED; 490e71b7053SJung-uk Kim } else if (!s->ext.ticket_expected) { 491e71b7053SJung-uk Kim /* 492e71b7053SJung-uk Kim * If we're not going to renew the ticket then we just finish the 493e71b7053SJung-uk Kim * handshake at this point. 494e71b7053SJung-uk Kim */ 495e71b7053SJung-uk Kim st->hand_state = TLS_ST_OK; 496e71b7053SJung-uk Kim return WRITE_TRAN_CONTINUE; 497e71b7053SJung-uk Kim } 498e71b7053SJung-uk Kim if (s->num_tickets > s->sent_tickets) 499e71b7053SJung-uk Kim st->hand_state = TLS_ST_SW_SESSION_TICKET; 500e71b7053SJung-uk Kim else 501e71b7053SJung-uk Kim st->hand_state = TLS_ST_OK; 502e71b7053SJung-uk Kim return WRITE_TRAN_CONTINUE; 503e71b7053SJung-uk Kim 504e71b7053SJung-uk Kim case TLS_ST_SR_KEY_UPDATE: 505e71b7053SJung-uk Kim if (s->key_update != SSL_KEY_UPDATE_NONE) { 506e71b7053SJung-uk Kim st->hand_state = TLS_ST_SW_KEY_UPDATE; 507e71b7053SJung-uk Kim return WRITE_TRAN_CONTINUE; 508e71b7053SJung-uk Kim } 509e71b7053SJung-uk Kim /* Fall through */ 510e71b7053SJung-uk Kim 511e71b7053SJung-uk Kim case TLS_ST_SW_KEY_UPDATE: 512e71b7053SJung-uk Kim st->hand_state = TLS_ST_OK; 513e71b7053SJung-uk Kim return WRITE_TRAN_CONTINUE; 514e71b7053SJung-uk Kim 515e71b7053SJung-uk Kim case TLS_ST_SW_SESSION_TICKET: 516e71b7053SJung-uk Kim /* In a resumption we only ever send a maximum of one new ticket. 517e71b7053SJung-uk Kim * Following an initial handshake we send the number of tickets we have 518e71b7053SJung-uk Kim * been configured for. 519e71b7053SJung-uk Kim */ 520e71b7053SJung-uk Kim if (s->hit || s->num_tickets <= s->sent_tickets) { 521e71b7053SJung-uk Kim /* We've written enough tickets out. */ 522e71b7053SJung-uk Kim st->hand_state = TLS_ST_OK; 523e71b7053SJung-uk Kim } 524e71b7053SJung-uk Kim return WRITE_TRAN_CONTINUE; 525e71b7053SJung-uk Kim } 526e71b7053SJung-uk Kim } 527e71b7053SJung-uk Kim 528e71b7053SJung-uk Kim /* 529e71b7053SJung-uk Kim * ossl_statem_server_write_transition() works out what handshake state to move 530e71b7053SJung-uk Kim * to next when the server is writing messages to be sent to the client. 531e71b7053SJung-uk Kim */ 532e71b7053SJung-uk Kim WRITE_TRAN ossl_statem_server_write_transition(SSL *s) 533e71b7053SJung-uk Kim { 534e71b7053SJung-uk Kim OSSL_STATEM *st = &s->statem; 535e71b7053SJung-uk Kim 536e71b7053SJung-uk Kim /* 537e71b7053SJung-uk Kim * Note that before the ClientHello we don't know what version we are going 538e71b7053SJung-uk Kim * to negotiate yet, so we don't take this branch until later 539e71b7053SJung-uk Kim */ 540e71b7053SJung-uk Kim 541e71b7053SJung-uk Kim if (SSL_IS_TLS13(s)) 542e71b7053SJung-uk Kim return ossl_statem_server13_write_transition(s); 543e71b7053SJung-uk Kim 544e71b7053SJung-uk Kim switch (st->hand_state) { 545e71b7053SJung-uk Kim default: 546e71b7053SJung-uk Kim /* Shouldn't happen */ 547e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_INTERNAL_ERROR, 548e71b7053SJung-uk Kim SSL_F_OSSL_STATEM_SERVER_WRITE_TRANSITION, 549e71b7053SJung-uk Kim ERR_R_INTERNAL_ERROR); 550e71b7053SJung-uk Kim return WRITE_TRAN_ERROR; 551e71b7053SJung-uk Kim 552e71b7053SJung-uk Kim case TLS_ST_OK: 553e71b7053SJung-uk Kim if (st->request_state == TLS_ST_SW_HELLO_REQ) { 554e71b7053SJung-uk Kim /* We must be trying to renegotiate */ 555e71b7053SJung-uk Kim st->hand_state = TLS_ST_SW_HELLO_REQ; 556e71b7053SJung-uk Kim st->request_state = TLS_ST_BEFORE; 557e71b7053SJung-uk Kim return WRITE_TRAN_CONTINUE; 558e71b7053SJung-uk Kim } 559e71b7053SJung-uk Kim /* Must be an incoming ClientHello */ 560e71b7053SJung-uk Kim if (!tls_setup_handshake(s)) { 561e71b7053SJung-uk Kim /* SSLfatal() already called */ 562e71b7053SJung-uk Kim return WRITE_TRAN_ERROR; 563e71b7053SJung-uk Kim } 564e71b7053SJung-uk Kim /* Fall through */ 565e71b7053SJung-uk Kim 566e71b7053SJung-uk Kim case TLS_ST_BEFORE: 567e71b7053SJung-uk Kim /* Just go straight to trying to read from the client */ 568e71b7053SJung-uk Kim return WRITE_TRAN_FINISHED; 569e71b7053SJung-uk Kim 570e71b7053SJung-uk Kim case TLS_ST_SW_HELLO_REQ: 571e71b7053SJung-uk Kim st->hand_state = TLS_ST_OK; 572e71b7053SJung-uk Kim return WRITE_TRAN_CONTINUE; 573e71b7053SJung-uk Kim 574e71b7053SJung-uk Kim case TLS_ST_SR_CLNT_HELLO: 575e71b7053SJung-uk Kim if (SSL_IS_DTLS(s) && !s->d1->cookie_verified 576e71b7053SJung-uk Kim && (SSL_get_options(s) & SSL_OP_COOKIE_EXCHANGE)) { 577e71b7053SJung-uk Kim st->hand_state = DTLS_ST_SW_HELLO_VERIFY_REQUEST; 578e71b7053SJung-uk Kim } else if (s->renegotiate == 0 && !SSL_IS_FIRST_HANDSHAKE(s)) { 579e71b7053SJung-uk Kim /* We must have rejected the renegotiation */ 580e71b7053SJung-uk Kim st->hand_state = TLS_ST_OK; 581e71b7053SJung-uk Kim return WRITE_TRAN_CONTINUE; 582e71b7053SJung-uk Kim } else { 583e71b7053SJung-uk Kim st->hand_state = TLS_ST_SW_SRVR_HELLO; 584e71b7053SJung-uk Kim } 585e71b7053SJung-uk Kim return WRITE_TRAN_CONTINUE; 586e71b7053SJung-uk Kim 587e71b7053SJung-uk Kim case DTLS_ST_SW_HELLO_VERIFY_REQUEST: 588e71b7053SJung-uk Kim return WRITE_TRAN_FINISHED; 589e71b7053SJung-uk Kim 590e71b7053SJung-uk Kim case TLS_ST_SW_SRVR_HELLO: 591e71b7053SJung-uk Kim if (s->hit) { 592e71b7053SJung-uk Kim if (s->ext.ticket_expected) 593e71b7053SJung-uk Kim st->hand_state = TLS_ST_SW_SESSION_TICKET; 594e71b7053SJung-uk Kim else 595e71b7053SJung-uk Kim st->hand_state = TLS_ST_SW_CHANGE; 596e71b7053SJung-uk Kim } else { 597e71b7053SJung-uk Kim /* Check if it is anon DH or anon ECDH, */ 598e71b7053SJung-uk Kim /* normal PSK or SRP */ 599e71b7053SJung-uk Kim if (!(s->s3->tmp.new_cipher->algorithm_auth & 600e71b7053SJung-uk Kim (SSL_aNULL | SSL_aSRP | SSL_aPSK))) { 601e71b7053SJung-uk Kim st->hand_state = TLS_ST_SW_CERT; 602e71b7053SJung-uk Kim } else if (send_server_key_exchange(s)) { 603e71b7053SJung-uk Kim st->hand_state = TLS_ST_SW_KEY_EXCH; 604e71b7053SJung-uk Kim } else if (send_certificate_request(s)) { 605e71b7053SJung-uk Kim st->hand_state = TLS_ST_SW_CERT_REQ; 606e71b7053SJung-uk Kim } else { 607e71b7053SJung-uk Kim st->hand_state = TLS_ST_SW_SRVR_DONE; 608e71b7053SJung-uk Kim } 609e71b7053SJung-uk Kim } 610e71b7053SJung-uk Kim return WRITE_TRAN_CONTINUE; 611e71b7053SJung-uk Kim 612e71b7053SJung-uk Kim case TLS_ST_SW_CERT: 613e71b7053SJung-uk Kim if (s->ext.status_expected) { 614e71b7053SJung-uk Kim st->hand_state = TLS_ST_SW_CERT_STATUS; 615e71b7053SJung-uk Kim return WRITE_TRAN_CONTINUE; 616e71b7053SJung-uk Kim } 617e71b7053SJung-uk Kim /* Fall through */ 618e71b7053SJung-uk Kim 619e71b7053SJung-uk Kim case TLS_ST_SW_CERT_STATUS: 620e71b7053SJung-uk Kim if (send_server_key_exchange(s)) { 621e71b7053SJung-uk Kim st->hand_state = TLS_ST_SW_KEY_EXCH; 622e71b7053SJung-uk Kim return WRITE_TRAN_CONTINUE; 623e71b7053SJung-uk Kim } 624e71b7053SJung-uk Kim /* Fall through */ 625e71b7053SJung-uk Kim 626e71b7053SJung-uk Kim case TLS_ST_SW_KEY_EXCH: 627e71b7053SJung-uk Kim if (send_certificate_request(s)) { 628e71b7053SJung-uk Kim st->hand_state = TLS_ST_SW_CERT_REQ; 629e71b7053SJung-uk Kim return WRITE_TRAN_CONTINUE; 630e71b7053SJung-uk Kim } 631e71b7053SJung-uk Kim /* Fall through */ 632e71b7053SJung-uk Kim 633e71b7053SJung-uk Kim case TLS_ST_SW_CERT_REQ: 634e71b7053SJung-uk Kim st->hand_state = TLS_ST_SW_SRVR_DONE; 635e71b7053SJung-uk Kim return WRITE_TRAN_CONTINUE; 636e71b7053SJung-uk Kim 637e71b7053SJung-uk Kim case TLS_ST_SW_SRVR_DONE: 638e71b7053SJung-uk Kim return WRITE_TRAN_FINISHED; 639e71b7053SJung-uk Kim 640e71b7053SJung-uk Kim case TLS_ST_SR_FINISHED: 641e71b7053SJung-uk Kim if (s->hit) { 642e71b7053SJung-uk Kim st->hand_state = TLS_ST_OK; 643e71b7053SJung-uk Kim return WRITE_TRAN_CONTINUE; 644e71b7053SJung-uk Kim } else if (s->ext.ticket_expected) { 645e71b7053SJung-uk Kim st->hand_state = TLS_ST_SW_SESSION_TICKET; 646e71b7053SJung-uk Kim } else { 647e71b7053SJung-uk Kim st->hand_state = TLS_ST_SW_CHANGE; 648e71b7053SJung-uk Kim } 649e71b7053SJung-uk Kim return WRITE_TRAN_CONTINUE; 650e71b7053SJung-uk Kim 651e71b7053SJung-uk Kim case TLS_ST_SW_SESSION_TICKET: 652e71b7053SJung-uk Kim st->hand_state = TLS_ST_SW_CHANGE; 653e71b7053SJung-uk Kim return WRITE_TRAN_CONTINUE; 654e71b7053SJung-uk Kim 655e71b7053SJung-uk Kim case TLS_ST_SW_CHANGE: 656e71b7053SJung-uk Kim st->hand_state = TLS_ST_SW_FINISHED; 657e71b7053SJung-uk Kim return WRITE_TRAN_CONTINUE; 658e71b7053SJung-uk Kim 659e71b7053SJung-uk Kim case TLS_ST_SW_FINISHED: 660e71b7053SJung-uk Kim if (s->hit) { 661e71b7053SJung-uk Kim return WRITE_TRAN_FINISHED; 662e71b7053SJung-uk Kim } 663e71b7053SJung-uk Kim st->hand_state = TLS_ST_OK; 664e71b7053SJung-uk Kim return WRITE_TRAN_CONTINUE; 665e71b7053SJung-uk Kim } 666e71b7053SJung-uk Kim } 667e71b7053SJung-uk Kim 668e71b7053SJung-uk Kim /* 669e71b7053SJung-uk Kim * Perform any pre work that needs to be done prior to sending a message from 670e71b7053SJung-uk Kim * the server to the client. 671e71b7053SJung-uk Kim */ 672e71b7053SJung-uk Kim WORK_STATE ossl_statem_server_pre_work(SSL *s, WORK_STATE wst) 673e71b7053SJung-uk Kim { 674e71b7053SJung-uk Kim OSSL_STATEM *st = &s->statem; 675e71b7053SJung-uk Kim 676e71b7053SJung-uk Kim switch (st->hand_state) { 677e71b7053SJung-uk Kim default: 678e71b7053SJung-uk Kim /* No pre work to be done */ 679e71b7053SJung-uk Kim break; 680e71b7053SJung-uk Kim 681e71b7053SJung-uk Kim case TLS_ST_SW_HELLO_REQ: 682e71b7053SJung-uk Kim s->shutdown = 0; 683e71b7053SJung-uk Kim if (SSL_IS_DTLS(s)) 684e71b7053SJung-uk Kim dtls1_clear_sent_buffer(s); 685e71b7053SJung-uk Kim break; 686e71b7053SJung-uk Kim 687e71b7053SJung-uk Kim case DTLS_ST_SW_HELLO_VERIFY_REQUEST: 688e71b7053SJung-uk Kim s->shutdown = 0; 689e71b7053SJung-uk Kim if (SSL_IS_DTLS(s)) { 690e71b7053SJung-uk Kim dtls1_clear_sent_buffer(s); 691e71b7053SJung-uk Kim /* We don't buffer this message so don't use the timer */ 692e71b7053SJung-uk Kim st->use_timer = 0; 693e71b7053SJung-uk Kim } 694e71b7053SJung-uk Kim break; 695e71b7053SJung-uk Kim 696e71b7053SJung-uk Kim case TLS_ST_SW_SRVR_HELLO: 697e71b7053SJung-uk Kim if (SSL_IS_DTLS(s)) { 698e71b7053SJung-uk Kim /* 699e71b7053SJung-uk Kim * Messages we write from now on should be buffered and 700e71b7053SJung-uk Kim * retransmitted if necessary, so we need to use the timer now 701e71b7053SJung-uk Kim */ 702e71b7053SJung-uk Kim st->use_timer = 1; 703e71b7053SJung-uk Kim } 704e71b7053SJung-uk Kim break; 705e71b7053SJung-uk Kim 706e71b7053SJung-uk Kim case TLS_ST_SW_SRVR_DONE: 707e71b7053SJung-uk Kim #ifndef OPENSSL_NO_SCTP 708e71b7053SJung-uk Kim if (SSL_IS_DTLS(s) && BIO_dgram_is_sctp(SSL_get_wbio(s))) { 709e71b7053SJung-uk Kim /* Calls SSLfatal() as required */ 710e71b7053SJung-uk Kim return dtls_wait_for_dry(s); 711e71b7053SJung-uk Kim } 712e71b7053SJung-uk Kim #endif 713e71b7053SJung-uk Kim return WORK_FINISHED_CONTINUE; 714e71b7053SJung-uk Kim 715e71b7053SJung-uk Kim case TLS_ST_SW_SESSION_TICKET: 716e71b7053SJung-uk Kim if (SSL_IS_TLS13(s) && s->sent_tickets == 0) { 717e71b7053SJung-uk Kim /* 718e71b7053SJung-uk Kim * Actually this is the end of the handshake, but we're going 719e71b7053SJung-uk Kim * straight into writing the session ticket out. So we finish off 720e71b7053SJung-uk Kim * the handshake, but keep the various buffers active. 721e71b7053SJung-uk Kim * 722e71b7053SJung-uk Kim * Calls SSLfatal as required. 723e71b7053SJung-uk Kim */ 724e71b7053SJung-uk Kim return tls_finish_handshake(s, wst, 0, 0); 725e71b7053SJung-uk Kim } if (SSL_IS_DTLS(s)) { 726e71b7053SJung-uk Kim /* 727e71b7053SJung-uk Kim * We're into the last flight. We don't retransmit the last flight 728e71b7053SJung-uk Kim * unless we need to, so we don't use the timer 729e71b7053SJung-uk Kim */ 730e71b7053SJung-uk Kim st->use_timer = 0; 731e71b7053SJung-uk Kim } 732e71b7053SJung-uk Kim break; 733e71b7053SJung-uk Kim 734e71b7053SJung-uk Kim case TLS_ST_SW_CHANGE: 735e71b7053SJung-uk Kim if (SSL_IS_TLS13(s)) 736e71b7053SJung-uk Kim break; 737e71b7053SJung-uk Kim s->session->cipher = s->s3->tmp.new_cipher; 738e71b7053SJung-uk Kim if (!s->method->ssl3_enc->setup_key_block(s)) { 739e71b7053SJung-uk Kim /* SSLfatal() already called */ 740e71b7053SJung-uk Kim return WORK_ERROR; 741e71b7053SJung-uk Kim } 742e71b7053SJung-uk Kim if (SSL_IS_DTLS(s)) { 743e71b7053SJung-uk Kim /* 744e71b7053SJung-uk Kim * We're into the last flight. We don't retransmit the last flight 745e71b7053SJung-uk Kim * unless we need to, so we don't use the timer. This might have 746e71b7053SJung-uk Kim * already been set to 0 if we sent a NewSessionTicket message, 747e71b7053SJung-uk Kim * but we'll set it again here in case we didn't. 748e71b7053SJung-uk Kim */ 749e71b7053SJung-uk Kim st->use_timer = 0; 750e71b7053SJung-uk Kim } 751e71b7053SJung-uk Kim return WORK_FINISHED_CONTINUE; 752e71b7053SJung-uk Kim 753e71b7053SJung-uk Kim case TLS_ST_EARLY_DATA: 754e71b7053SJung-uk Kim if (s->early_data_state != SSL_EARLY_DATA_ACCEPTING 755e71b7053SJung-uk Kim && (s->s3->flags & TLS1_FLAGS_STATELESS) == 0) 756e71b7053SJung-uk Kim return WORK_FINISHED_CONTINUE; 757e71b7053SJung-uk Kim /* Fall through */ 758e71b7053SJung-uk Kim 759e71b7053SJung-uk Kim case TLS_ST_OK: 760e71b7053SJung-uk Kim /* Calls SSLfatal() as required */ 761e71b7053SJung-uk Kim return tls_finish_handshake(s, wst, 1, 1); 762e71b7053SJung-uk Kim } 763e71b7053SJung-uk Kim 764e71b7053SJung-uk Kim return WORK_FINISHED_CONTINUE; 765e71b7053SJung-uk Kim } 766e71b7053SJung-uk Kim 767e71b7053SJung-uk Kim static ossl_inline int conn_is_closed(void) 768e71b7053SJung-uk Kim { 769e71b7053SJung-uk Kim switch (get_last_sys_error()) { 770e71b7053SJung-uk Kim #if defined(EPIPE) 771e71b7053SJung-uk Kim case EPIPE: 772e71b7053SJung-uk Kim return 1; 773e71b7053SJung-uk Kim #endif 774e71b7053SJung-uk Kim #if defined(ECONNRESET) 775e71b7053SJung-uk Kim case ECONNRESET: 776e71b7053SJung-uk Kim return 1; 777e71b7053SJung-uk Kim #endif 778e71b7053SJung-uk Kim default: 779e71b7053SJung-uk Kim return 0; 780e71b7053SJung-uk Kim } 781e71b7053SJung-uk Kim } 782e71b7053SJung-uk Kim 783e71b7053SJung-uk Kim /* 784e71b7053SJung-uk Kim * Perform any work that needs to be done after sending a message from the 785e71b7053SJung-uk Kim * server to the client. 786e71b7053SJung-uk Kim */ 787e71b7053SJung-uk Kim WORK_STATE ossl_statem_server_post_work(SSL *s, WORK_STATE wst) 788e71b7053SJung-uk Kim { 789e71b7053SJung-uk Kim OSSL_STATEM *st = &s->statem; 790e71b7053SJung-uk Kim 791e71b7053SJung-uk Kim s->init_num = 0; 792e71b7053SJung-uk Kim 793e71b7053SJung-uk Kim switch (st->hand_state) { 794e71b7053SJung-uk Kim default: 795e71b7053SJung-uk Kim /* No post work to be done */ 796e71b7053SJung-uk Kim break; 797e71b7053SJung-uk Kim 798e71b7053SJung-uk Kim case TLS_ST_SW_HELLO_REQ: 799e71b7053SJung-uk Kim if (statem_flush(s) != 1) 800e71b7053SJung-uk Kim return WORK_MORE_A; 801e71b7053SJung-uk Kim if (!ssl3_init_finished_mac(s)) { 802e71b7053SJung-uk Kim /* SSLfatal() already called */ 803e71b7053SJung-uk Kim return WORK_ERROR; 804e71b7053SJung-uk Kim } 805e71b7053SJung-uk Kim break; 806e71b7053SJung-uk Kim 807e71b7053SJung-uk Kim case DTLS_ST_SW_HELLO_VERIFY_REQUEST: 808e71b7053SJung-uk Kim if (statem_flush(s) != 1) 809e71b7053SJung-uk Kim return WORK_MORE_A; 810e71b7053SJung-uk Kim /* HelloVerifyRequest resets Finished MAC */ 811e71b7053SJung-uk Kim if (s->version != DTLS1_BAD_VER && !ssl3_init_finished_mac(s)) { 812e71b7053SJung-uk Kim /* SSLfatal() already called */ 813e71b7053SJung-uk Kim return WORK_ERROR; 814e71b7053SJung-uk Kim } 815e71b7053SJung-uk Kim /* 816e71b7053SJung-uk Kim * The next message should be another ClientHello which we need to 817e71b7053SJung-uk Kim * treat like it was the first packet 818e71b7053SJung-uk Kim */ 819e71b7053SJung-uk Kim s->first_packet = 1; 820e71b7053SJung-uk Kim break; 821e71b7053SJung-uk Kim 822e71b7053SJung-uk Kim case TLS_ST_SW_SRVR_HELLO: 823e71b7053SJung-uk Kim if (SSL_IS_TLS13(s) && s->hello_retry_request == SSL_HRR_PENDING) { 824e71b7053SJung-uk Kim if ((s->options & SSL_OP_ENABLE_MIDDLEBOX_COMPAT) == 0 825e71b7053SJung-uk Kim && statem_flush(s) != 1) 826e71b7053SJung-uk Kim return WORK_MORE_A; 827e71b7053SJung-uk Kim break; 828e71b7053SJung-uk Kim } 829e71b7053SJung-uk Kim #ifndef OPENSSL_NO_SCTP 830e71b7053SJung-uk Kim if (SSL_IS_DTLS(s) && s->hit) { 831e71b7053SJung-uk Kim unsigned char sctpauthkey[64]; 832e71b7053SJung-uk Kim char labelbuffer[sizeof(DTLS1_SCTP_AUTH_LABEL)]; 833e71b7053SJung-uk Kim 834e71b7053SJung-uk Kim /* 835e71b7053SJung-uk Kim * Add new shared key for SCTP-Auth, will be ignored if no 836e71b7053SJung-uk Kim * SCTP used. 837e71b7053SJung-uk Kim */ 838e71b7053SJung-uk Kim memcpy(labelbuffer, DTLS1_SCTP_AUTH_LABEL, 839e71b7053SJung-uk Kim sizeof(DTLS1_SCTP_AUTH_LABEL)); 840e71b7053SJung-uk Kim 841e71b7053SJung-uk Kim if (SSL_export_keying_material(s, sctpauthkey, 842e71b7053SJung-uk Kim sizeof(sctpauthkey), labelbuffer, 843e71b7053SJung-uk Kim sizeof(labelbuffer), NULL, 0, 844e71b7053SJung-uk Kim 0) <= 0) { 845e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_INTERNAL_ERROR, 846e71b7053SJung-uk Kim SSL_F_OSSL_STATEM_SERVER_POST_WORK, 847e71b7053SJung-uk Kim ERR_R_INTERNAL_ERROR); 848e71b7053SJung-uk Kim return WORK_ERROR; 849e71b7053SJung-uk Kim } 850e71b7053SJung-uk Kim 851e71b7053SJung-uk Kim BIO_ctrl(SSL_get_wbio(s), BIO_CTRL_DGRAM_SCTP_ADD_AUTH_KEY, 852e71b7053SJung-uk Kim sizeof(sctpauthkey), sctpauthkey); 853e71b7053SJung-uk Kim } 854e71b7053SJung-uk Kim #endif 855e71b7053SJung-uk Kim if (!SSL_IS_TLS13(s) 856e71b7053SJung-uk Kim || ((s->options & SSL_OP_ENABLE_MIDDLEBOX_COMPAT) != 0 857e71b7053SJung-uk Kim && s->hello_retry_request != SSL_HRR_COMPLETE)) 858e71b7053SJung-uk Kim break; 859e71b7053SJung-uk Kim /* Fall through */ 860e71b7053SJung-uk Kim 861e71b7053SJung-uk Kim case TLS_ST_SW_CHANGE: 862e71b7053SJung-uk Kim if (s->hello_retry_request == SSL_HRR_PENDING) { 863e71b7053SJung-uk Kim if (!statem_flush(s)) 864e71b7053SJung-uk Kim return WORK_MORE_A; 865e71b7053SJung-uk Kim break; 866e71b7053SJung-uk Kim } 867e71b7053SJung-uk Kim 868e71b7053SJung-uk Kim if (SSL_IS_TLS13(s)) { 869e71b7053SJung-uk Kim if (!s->method->ssl3_enc->setup_key_block(s) 870e71b7053SJung-uk Kim || !s->method->ssl3_enc->change_cipher_state(s, 871e71b7053SJung-uk Kim SSL3_CC_HANDSHAKE | SSL3_CHANGE_CIPHER_SERVER_WRITE)) { 872e71b7053SJung-uk Kim /* SSLfatal() already called */ 873e71b7053SJung-uk Kim return WORK_ERROR; 874e71b7053SJung-uk Kim } 875e71b7053SJung-uk Kim 876e71b7053SJung-uk Kim if (s->ext.early_data != SSL_EARLY_DATA_ACCEPTED 877e71b7053SJung-uk Kim && !s->method->ssl3_enc->change_cipher_state(s, 878e71b7053SJung-uk Kim SSL3_CC_HANDSHAKE |SSL3_CHANGE_CIPHER_SERVER_READ)) { 879e71b7053SJung-uk Kim /* SSLfatal() already called */ 880e71b7053SJung-uk Kim return WORK_ERROR; 881e71b7053SJung-uk Kim } 882e71b7053SJung-uk Kim /* 883e71b7053SJung-uk Kim * We don't yet know whether the next record we are going to receive 884e71b7053SJung-uk Kim * is an unencrypted alert, an encrypted alert, or an encrypted 885e71b7053SJung-uk Kim * handshake message. We temporarily tolerate unencrypted alerts. 886e71b7053SJung-uk Kim */ 887e71b7053SJung-uk Kim s->statem.enc_read_state = ENC_READ_STATE_ALLOW_PLAIN_ALERTS; 888e71b7053SJung-uk Kim break; 889e71b7053SJung-uk Kim } 890e71b7053SJung-uk Kim 891e71b7053SJung-uk Kim #ifndef OPENSSL_NO_SCTP 892e71b7053SJung-uk Kim if (SSL_IS_DTLS(s) && !s->hit) { 893e71b7053SJung-uk Kim /* 894e71b7053SJung-uk Kim * Change to new shared key of SCTP-Auth, will be ignored if 895e71b7053SJung-uk Kim * no SCTP used. 896e71b7053SJung-uk Kim */ 897e71b7053SJung-uk Kim BIO_ctrl(SSL_get_wbio(s), BIO_CTRL_DGRAM_SCTP_NEXT_AUTH_KEY, 898e71b7053SJung-uk Kim 0, NULL); 899e71b7053SJung-uk Kim } 900e71b7053SJung-uk Kim #endif 901e71b7053SJung-uk Kim if (!s->method->ssl3_enc->change_cipher_state(s, 902e71b7053SJung-uk Kim SSL3_CHANGE_CIPHER_SERVER_WRITE)) 903e71b7053SJung-uk Kim { 904e71b7053SJung-uk Kim /* SSLfatal() already called */ 905e71b7053SJung-uk Kim return WORK_ERROR; 906e71b7053SJung-uk Kim } 907e71b7053SJung-uk Kim 908e71b7053SJung-uk Kim if (SSL_IS_DTLS(s)) 909e71b7053SJung-uk Kim dtls1_reset_seq_numbers(s, SSL3_CC_WRITE); 910e71b7053SJung-uk Kim break; 911e71b7053SJung-uk Kim 912e71b7053SJung-uk Kim case TLS_ST_SW_SRVR_DONE: 913e71b7053SJung-uk Kim if (statem_flush(s) != 1) 914e71b7053SJung-uk Kim return WORK_MORE_A; 915e71b7053SJung-uk Kim break; 916e71b7053SJung-uk Kim 917e71b7053SJung-uk Kim case TLS_ST_SW_FINISHED: 918e71b7053SJung-uk Kim if (statem_flush(s) != 1) 919e71b7053SJung-uk Kim return WORK_MORE_A; 920e71b7053SJung-uk Kim #ifndef OPENSSL_NO_SCTP 921e71b7053SJung-uk Kim if (SSL_IS_DTLS(s) && s->hit) { 922e71b7053SJung-uk Kim /* 923e71b7053SJung-uk Kim * Change to new shared key of SCTP-Auth, will be ignored if 924e71b7053SJung-uk Kim * no SCTP used. 925e71b7053SJung-uk Kim */ 926e71b7053SJung-uk Kim BIO_ctrl(SSL_get_wbio(s), BIO_CTRL_DGRAM_SCTP_NEXT_AUTH_KEY, 927e71b7053SJung-uk Kim 0, NULL); 928e71b7053SJung-uk Kim } 929e71b7053SJung-uk Kim #endif 930e71b7053SJung-uk Kim if (SSL_IS_TLS13(s)) { 931e71b7053SJung-uk Kim if (!s->method->ssl3_enc->generate_master_secret(s, 932e71b7053SJung-uk Kim s->master_secret, s->handshake_secret, 0, 933e71b7053SJung-uk Kim &s->session->master_key_length) 934e71b7053SJung-uk Kim || !s->method->ssl3_enc->change_cipher_state(s, 935e71b7053SJung-uk Kim SSL3_CC_APPLICATION | SSL3_CHANGE_CIPHER_SERVER_WRITE)) 936e71b7053SJung-uk Kim /* SSLfatal() already called */ 937e71b7053SJung-uk Kim return WORK_ERROR; 938e71b7053SJung-uk Kim } 939e71b7053SJung-uk Kim break; 940e71b7053SJung-uk Kim 941e71b7053SJung-uk Kim case TLS_ST_SW_CERT_REQ: 942e71b7053SJung-uk Kim if (s->post_handshake_auth == SSL_PHA_REQUEST_PENDING) { 943e71b7053SJung-uk Kim if (statem_flush(s) != 1) 944e71b7053SJung-uk Kim return WORK_MORE_A; 945e71b7053SJung-uk Kim } 946e71b7053SJung-uk Kim break; 947e71b7053SJung-uk Kim 948e71b7053SJung-uk Kim case TLS_ST_SW_KEY_UPDATE: 949e71b7053SJung-uk Kim if (statem_flush(s) != 1) 950e71b7053SJung-uk Kim return WORK_MORE_A; 951e71b7053SJung-uk Kim if (!tls13_update_key(s, 1)) { 952e71b7053SJung-uk Kim /* SSLfatal() already called */ 953e71b7053SJung-uk Kim return WORK_ERROR; 954e71b7053SJung-uk Kim } 955e71b7053SJung-uk Kim break; 956e71b7053SJung-uk Kim 957e71b7053SJung-uk Kim case TLS_ST_SW_SESSION_TICKET: 958e71b7053SJung-uk Kim clear_sys_error(); 959e71b7053SJung-uk Kim if (SSL_IS_TLS13(s) && statem_flush(s) != 1) { 960e71b7053SJung-uk Kim if (SSL_get_error(s, 0) == SSL_ERROR_SYSCALL 961e71b7053SJung-uk Kim && conn_is_closed()) { 962e71b7053SJung-uk Kim /* 963e71b7053SJung-uk Kim * We ignore connection closed errors in TLSv1.3 when sending a 964e71b7053SJung-uk Kim * NewSessionTicket and behave as if we were successful. This is 965e71b7053SJung-uk Kim * so that we are still able to read data sent to us by a client 966e71b7053SJung-uk Kim * that closes soon after the end of the handshake without 967e71b7053SJung-uk Kim * waiting to read our post-handshake NewSessionTickets. 968e71b7053SJung-uk Kim */ 969e71b7053SJung-uk Kim s->rwstate = SSL_NOTHING; 970e71b7053SJung-uk Kim break; 971e71b7053SJung-uk Kim } 972e71b7053SJung-uk Kim 973e71b7053SJung-uk Kim return WORK_MORE_A; 974e71b7053SJung-uk Kim } 975e71b7053SJung-uk Kim break; 976e71b7053SJung-uk Kim } 977e71b7053SJung-uk Kim 978e71b7053SJung-uk Kim return WORK_FINISHED_CONTINUE; 979e71b7053SJung-uk Kim } 980e71b7053SJung-uk Kim 981e71b7053SJung-uk Kim /* 982e71b7053SJung-uk Kim * Get the message construction function and message type for sending from the 983e71b7053SJung-uk Kim * server 984e71b7053SJung-uk Kim * 985e71b7053SJung-uk Kim * Valid return values are: 986e71b7053SJung-uk Kim * 1: Success 987e71b7053SJung-uk Kim * 0: Error 988e71b7053SJung-uk Kim */ 989e71b7053SJung-uk Kim int ossl_statem_server_construct_message(SSL *s, WPACKET *pkt, 990e71b7053SJung-uk Kim confunc_f *confunc, int *mt) 991e71b7053SJung-uk Kim { 992e71b7053SJung-uk Kim OSSL_STATEM *st = &s->statem; 993e71b7053SJung-uk Kim 994e71b7053SJung-uk Kim switch (st->hand_state) { 995e71b7053SJung-uk Kim default: 996e71b7053SJung-uk Kim /* Shouldn't happen */ 997e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_INTERNAL_ERROR, 998e71b7053SJung-uk Kim SSL_F_OSSL_STATEM_SERVER_CONSTRUCT_MESSAGE, 999e71b7053SJung-uk Kim SSL_R_BAD_HANDSHAKE_STATE); 1000e71b7053SJung-uk Kim return 0; 1001e71b7053SJung-uk Kim 1002e71b7053SJung-uk Kim case TLS_ST_SW_CHANGE: 1003e71b7053SJung-uk Kim if (SSL_IS_DTLS(s)) 1004e71b7053SJung-uk Kim *confunc = dtls_construct_change_cipher_spec; 1005e71b7053SJung-uk Kim else 1006e71b7053SJung-uk Kim *confunc = tls_construct_change_cipher_spec; 1007e71b7053SJung-uk Kim *mt = SSL3_MT_CHANGE_CIPHER_SPEC; 1008e71b7053SJung-uk Kim break; 1009e71b7053SJung-uk Kim 1010e71b7053SJung-uk Kim case DTLS_ST_SW_HELLO_VERIFY_REQUEST: 1011e71b7053SJung-uk Kim *confunc = dtls_construct_hello_verify_request; 1012e71b7053SJung-uk Kim *mt = DTLS1_MT_HELLO_VERIFY_REQUEST; 1013e71b7053SJung-uk Kim break; 1014e71b7053SJung-uk Kim 1015e71b7053SJung-uk Kim case TLS_ST_SW_HELLO_REQ: 1016e71b7053SJung-uk Kim /* No construction function needed */ 1017e71b7053SJung-uk Kim *confunc = NULL; 1018e71b7053SJung-uk Kim *mt = SSL3_MT_HELLO_REQUEST; 1019e71b7053SJung-uk Kim break; 1020e71b7053SJung-uk Kim 1021e71b7053SJung-uk Kim case TLS_ST_SW_SRVR_HELLO: 1022e71b7053SJung-uk Kim *confunc = tls_construct_server_hello; 1023e71b7053SJung-uk Kim *mt = SSL3_MT_SERVER_HELLO; 1024e71b7053SJung-uk Kim break; 1025e71b7053SJung-uk Kim 1026e71b7053SJung-uk Kim case TLS_ST_SW_CERT: 1027e71b7053SJung-uk Kim *confunc = tls_construct_server_certificate; 1028e71b7053SJung-uk Kim *mt = SSL3_MT_CERTIFICATE; 1029e71b7053SJung-uk Kim break; 1030e71b7053SJung-uk Kim 1031e71b7053SJung-uk Kim case TLS_ST_SW_CERT_VRFY: 1032e71b7053SJung-uk Kim *confunc = tls_construct_cert_verify; 1033e71b7053SJung-uk Kim *mt = SSL3_MT_CERTIFICATE_VERIFY; 1034e71b7053SJung-uk Kim break; 1035e71b7053SJung-uk Kim 1036e71b7053SJung-uk Kim 1037e71b7053SJung-uk Kim case TLS_ST_SW_KEY_EXCH: 1038e71b7053SJung-uk Kim *confunc = tls_construct_server_key_exchange; 1039e71b7053SJung-uk Kim *mt = SSL3_MT_SERVER_KEY_EXCHANGE; 1040e71b7053SJung-uk Kim break; 1041e71b7053SJung-uk Kim 1042e71b7053SJung-uk Kim case TLS_ST_SW_CERT_REQ: 1043e71b7053SJung-uk Kim *confunc = tls_construct_certificate_request; 1044e71b7053SJung-uk Kim *mt = SSL3_MT_CERTIFICATE_REQUEST; 1045e71b7053SJung-uk Kim break; 1046e71b7053SJung-uk Kim 1047e71b7053SJung-uk Kim case TLS_ST_SW_SRVR_DONE: 1048e71b7053SJung-uk Kim *confunc = tls_construct_server_done; 1049e71b7053SJung-uk Kim *mt = SSL3_MT_SERVER_DONE; 1050e71b7053SJung-uk Kim break; 1051e71b7053SJung-uk Kim 1052e71b7053SJung-uk Kim case TLS_ST_SW_SESSION_TICKET: 1053e71b7053SJung-uk Kim *confunc = tls_construct_new_session_ticket; 1054e71b7053SJung-uk Kim *mt = SSL3_MT_NEWSESSION_TICKET; 1055e71b7053SJung-uk Kim break; 1056e71b7053SJung-uk Kim 1057e71b7053SJung-uk Kim case TLS_ST_SW_CERT_STATUS: 1058e71b7053SJung-uk Kim *confunc = tls_construct_cert_status; 1059e71b7053SJung-uk Kim *mt = SSL3_MT_CERTIFICATE_STATUS; 1060e71b7053SJung-uk Kim break; 1061e71b7053SJung-uk Kim 1062e71b7053SJung-uk Kim case TLS_ST_SW_FINISHED: 1063e71b7053SJung-uk Kim *confunc = tls_construct_finished; 1064e71b7053SJung-uk Kim *mt = SSL3_MT_FINISHED; 1065e71b7053SJung-uk Kim break; 1066e71b7053SJung-uk Kim 1067e71b7053SJung-uk Kim case TLS_ST_EARLY_DATA: 1068e71b7053SJung-uk Kim *confunc = NULL; 1069e71b7053SJung-uk Kim *mt = SSL3_MT_DUMMY; 1070e71b7053SJung-uk Kim break; 1071e71b7053SJung-uk Kim 1072e71b7053SJung-uk Kim case TLS_ST_SW_ENCRYPTED_EXTENSIONS: 1073e71b7053SJung-uk Kim *confunc = tls_construct_encrypted_extensions; 1074e71b7053SJung-uk Kim *mt = SSL3_MT_ENCRYPTED_EXTENSIONS; 1075e71b7053SJung-uk Kim break; 1076e71b7053SJung-uk Kim 1077e71b7053SJung-uk Kim case TLS_ST_SW_KEY_UPDATE: 1078e71b7053SJung-uk Kim *confunc = tls_construct_key_update; 1079e71b7053SJung-uk Kim *mt = SSL3_MT_KEY_UPDATE; 1080e71b7053SJung-uk Kim break; 1081e71b7053SJung-uk Kim } 1082e71b7053SJung-uk Kim 1083e71b7053SJung-uk Kim return 1; 1084e71b7053SJung-uk Kim } 1085e71b7053SJung-uk Kim 1086e71b7053SJung-uk Kim /* 1087e71b7053SJung-uk Kim * Maximum size (excluding the Handshake header) of a ClientHello message, 1088e71b7053SJung-uk Kim * calculated as follows: 1089e71b7053SJung-uk Kim * 1090e71b7053SJung-uk Kim * 2 + # client_version 1091e71b7053SJung-uk Kim * 32 + # only valid length for random 1092e71b7053SJung-uk Kim * 1 + # length of session_id 1093e71b7053SJung-uk Kim * 32 + # maximum size for session_id 1094e71b7053SJung-uk Kim * 2 + # length of cipher suites 1095e71b7053SJung-uk Kim * 2^16-2 + # maximum length of cipher suites array 1096e71b7053SJung-uk Kim * 1 + # length of compression_methods 1097e71b7053SJung-uk Kim * 2^8-1 + # maximum length of compression methods 1098e71b7053SJung-uk Kim * 2 + # length of extensions 1099e71b7053SJung-uk Kim * 2^16-1 # maximum length of extensions 1100e71b7053SJung-uk Kim */ 1101e71b7053SJung-uk Kim #define CLIENT_HELLO_MAX_LENGTH 131396 1102e71b7053SJung-uk Kim 1103e71b7053SJung-uk Kim #define CLIENT_KEY_EXCH_MAX_LENGTH 2048 1104e71b7053SJung-uk Kim #define NEXT_PROTO_MAX_LENGTH 514 1105e71b7053SJung-uk Kim 1106e71b7053SJung-uk Kim /* 1107e71b7053SJung-uk Kim * Returns the maximum allowed length for the current message that we are 1108e71b7053SJung-uk Kim * reading. Excludes the message header. 1109e71b7053SJung-uk Kim */ 1110e71b7053SJung-uk Kim size_t ossl_statem_server_max_message_size(SSL *s) 1111e71b7053SJung-uk Kim { 1112e71b7053SJung-uk Kim OSSL_STATEM *st = &s->statem; 1113e71b7053SJung-uk Kim 1114e71b7053SJung-uk Kim switch (st->hand_state) { 1115e71b7053SJung-uk Kim default: 1116e71b7053SJung-uk Kim /* Shouldn't happen */ 1117e71b7053SJung-uk Kim return 0; 1118e71b7053SJung-uk Kim 1119e71b7053SJung-uk Kim case TLS_ST_SR_CLNT_HELLO: 1120e71b7053SJung-uk Kim return CLIENT_HELLO_MAX_LENGTH; 1121e71b7053SJung-uk Kim 1122e71b7053SJung-uk Kim case TLS_ST_SR_END_OF_EARLY_DATA: 1123e71b7053SJung-uk Kim return END_OF_EARLY_DATA_MAX_LENGTH; 1124e71b7053SJung-uk Kim 1125e71b7053SJung-uk Kim case TLS_ST_SR_CERT: 1126e71b7053SJung-uk Kim return s->max_cert_list; 1127e71b7053SJung-uk Kim 1128e71b7053SJung-uk Kim case TLS_ST_SR_KEY_EXCH: 1129e71b7053SJung-uk Kim return CLIENT_KEY_EXCH_MAX_LENGTH; 1130e71b7053SJung-uk Kim 1131e71b7053SJung-uk Kim case TLS_ST_SR_CERT_VRFY: 1132e71b7053SJung-uk Kim return SSL3_RT_MAX_PLAIN_LENGTH; 1133e71b7053SJung-uk Kim 1134e71b7053SJung-uk Kim #ifndef OPENSSL_NO_NEXTPROTONEG 1135e71b7053SJung-uk Kim case TLS_ST_SR_NEXT_PROTO: 1136e71b7053SJung-uk Kim return NEXT_PROTO_MAX_LENGTH; 1137e71b7053SJung-uk Kim #endif 1138e71b7053SJung-uk Kim 1139e71b7053SJung-uk Kim case TLS_ST_SR_CHANGE: 1140e71b7053SJung-uk Kim return CCS_MAX_LENGTH; 1141e71b7053SJung-uk Kim 1142e71b7053SJung-uk Kim case TLS_ST_SR_FINISHED: 1143e71b7053SJung-uk Kim return FINISHED_MAX_LENGTH; 1144e71b7053SJung-uk Kim 1145e71b7053SJung-uk Kim case TLS_ST_SR_KEY_UPDATE: 1146e71b7053SJung-uk Kim return KEY_UPDATE_MAX_LENGTH; 1147e71b7053SJung-uk Kim } 1148e71b7053SJung-uk Kim } 1149e71b7053SJung-uk Kim 1150e71b7053SJung-uk Kim /* 1151e71b7053SJung-uk Kim * Process a message that the server has received from the client. 1152e71b7053SJung-uk Kim */ 1153e71b7053SJung-uk Kim MSG_PROCESS_RETURN ossl_statem_server_process_message(SSL *s, PACKET *pkt) 1154e71b7053SJung-uk Kim { 1155e71b7053SJung-uk Kim OSSL_STATEM *st = &s->statem; 1156e71b7053SJung-uk Kim 1157e71b7053SJung-uk Kim switch (st->hand_state) { 1158e71b7053SJung-uk Kim default: 1159e71b7053SJung-uk Kim /* Shouldn't happen */ 1160e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_INTERNAL_ERROR, 1161e71b7053SJung-uk Kim SSL_F_OSSL_STATEM_SERVER_PROCESS_MESSAGE, 1162e71b7053SJung-uk Kim ERR_R_INTERNAL_ERROR); 1163e71b7053SJung-uk Kim return MSG_PROCESS_ERROR; 1164e71b7053SJung-uk Kim 1165e71b7053SJung-uk Kim case TLS_ST_SR_CLNT_HELLO: 1166e71b7053SJung-uk Kim return tls_process_client_hello(s, pkt); 1167e71b7053SJung-uk Kim 1168e71b7053SJung-uk Kim case TLS_ST_SR_END_OF_EARLY_DATA: 1169e71b7053SJung-uk Kim return tls_process_end_of_early_data(s, pkt); 1170e71b7053SJung-uk Kim 1171e71b7053SJung-uk Kim case TLS_ST_SR_CERT: 1172e71b7053SJung-uk Kim return tls_process_client_certificate(s, pkt); 1173e71b7053SJung-uk Kim 1174e71b7053SJung-uk Kim case TLS_ST_SR_KEY_EXCH: 1175e71b7053SJung-uk Kim return tls_process_client_key_exchange(s, pkt); 1176e71b7053SJung-uk Kim 1177e71b7053SJung-uk Kim case TLS_ST_SR_CERT_VRFY: 1178e71b7053SJung-uk Kim return tls_process_cert_verify(s, pkt); 1179e71b7053SJung-uk Kim 1180e71b7053SJung-uk Kim #ifndef OPENSSL_NO_NEXTPROTONEG 1181e71b7053SJung-uk Kim case TLS_ST_SR_NEXT_PROTO: 1182e71b7053SJung-uk Kim return tls_process_next_proto(s, pkt); 1183e71b7053SJung-uk Kim #endif 1184e71b7053SJung-uk Kim 1185e71b7053SJung-uk Kim case TLS_ST_SR_CHANGE: 1186e71b7053SJung-uk Kim return tls_process_change_cipher_spec(s, pkt); 1187e71b7053SJung-uk Kim 1188e71b7053SJung-uk Kim case TLS_ST_SR_FINISHED: 1189e71b7053SJung-uk Kim return tls_process_finished(s, pkt); 1190e71b7053SJung-uk Kim 1191e71b7053SJung-uk Kim case TLS_ST_SR_KEY_UPDATE: 1192e71b7053SJung-uk Kim return tls_process_key_update(s, pkt); 1193e71b7053SJung-uk Kim 1194e71b7053SJung-uk Kim } 1195e71b7053SJung-uk Kim } 1196e71b7053SJung-uk Kim 1197e71b7053SJung-uk Kim /* 1198e71b7053SJung-uk Kim * Perform any further processing required following the receipt of a message 1199e71b7053SJung-uk Kim * from the client 1200e71b7053SJung-uk Kim */ 1201e71b7053SJung-uk Kim WORK_STATE ossl_statem_server_post_process_message(SSL *s, WORK_STATE wst) 1202e71b7053SJung-uk Kim { 1203e71b7053SJung-uk Kim OSSL_STATEM *st = &s->statem; 1204e71b7053SJung-uk Kim 1205e71b7053SJung-uk Kim switch (st->hand_state) { 1206e71b7053SJung-uk Kim default: 1207e71b7053SJung-uk Kim /* Shouldn't happen */ 1208e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_INTERNAL_ERROR, 1209e71b7053SJung-uk Kim SSL_F_OSSL_STATEM_SERVER_POST_PROCESS_MESSAGE, 1210e71b7053SJung-uk Kim ERR_R_INTERNAL_ERROR); 1211e71b7053SJung-uk Kim return WORK_ERROR; 1212e71b7053SJung-uk Kim 1213e71b7053SJung-uk Kim case TLS_ST_SR_CLNT_HELLO: 1214e71b7053SJung-uk Kim return tls_post_process_client_hello(s, wst); 1215e71b7053SJung-uk Kim 1216e71b7053SJung-uk Kim case TLS_ST_SR_KEY_EXCH: 1217e71b7053SJung-uk Kim return tls_post_process_client_key_exchange(s, wst); 1218e71b7053SJung-uk Kim } 1219e71b7053SJung-uk Kim } 1220e71b7053SJung-uk Kim 1221e71b7053SJung-uk Kim #ifndef OPENSSL_NO_SRP 1222e71b7053SJung-uk Kim /* Returns 1 on success, 0 for retryable error, -1 for fatal error */ 1223e71b7053SJung-uk Kim static int ssl_check_srp_ext_ClientHello(SSL *s) 1224e71b7053SJung-uk Kim { 1225e71b7053SJung-uk Kim int ret; 1226e71b7053SJung-uk Kim int al = SSL_AD_UNRECOGNIZED_NAME; 1227e71b7053SJung-uk Kim 1228e71b7053SJung-uk Kim if ((s->s3->tmp.new_cipher->algorithm_mkey & SSL_kSRP) && 1229e71b7053SJung-uk Kim (s->srp_ctx.TLS_ext_srp_username_callback != NULL)) { 1230e71b7053SJung-uk Kim if (s->srp_ctx.login == NULL) { 1231e71b7053SJung-uk Kim /* 1232e71b7053SJung-uk Kim * RFC 5054 says SHOULD reject, we do so if There is no srp 1233e71b7053SJung-uk Kim * login name 1234e71b7053SJung-uk Kim */ 1235e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_UNKNOWN_PSK_IDENTITY, 1236e71b7053SJung-uk Kim SSL_F_SSL_CHECK_SRP_EXT_CLIENTHELLO, 1237e71b7053SJung-uk Kim SSL_R_PSK_IDENTITY_NOT_FOUND); 1238e71b7053SJung-uk Kim return -1; 1239e71b7053SJung-uk Kim } else { 1240e71b7053SJung-uk Kim ret = SSL_srp_server_param_with_username(s, &al); 1241e71b7053SJung-uk Kim if (ret < 0) 1242e71b7053SJung-uk Kim return 0; 1243e71b7053SJung-uk Kim if (ret == SSL3_AL_FATAL) { 1244e71b7053SJung-uk Kim SSLfatal(s, al, SSL_F_SSL_CHECK_SRP_EXT_CLIENTHELLO, 1245e71b7053SJung-uk Kim al == SSL_AD_UNKNOWN_PSK_IDENTITY 1246e71b7053SJung-uk Kim ? SSL_R_PSK_IDENTITY_NOT_FOUND 1247e71b7053SJung-uk Kim : SSL_R_CLIENTHELLO_TLSEXT); 1248e71b7053SJung-uk Kim return -1; 1249e71b7053SJung-uk Kim } 1250e71b7053SJung-uk Kim } 1251e71b7053SJung-uk Kim } 1252e71b7053SJung-uk Kim return 1; 1253e71b7053SJung-uk Kim } 1254e71b7053SJung-uk Kim #endif 1255e71b7053SJung-uk Kim 1256e71b7053SJung-uk Kim int dtls_raw_hello_verify_request(WPACKET *pkt, unsigned char *cookie, 1257e71b7053SJung-uk Kim size_t cookie_len) 1258e71b7053SJung-uk Kim { 1259e71b7053SJung-uk Kim /* Always use DTLS 1.0 version: see RFC 6347 */ 1260e71b7053SJung-uk Kim if (!WPACKET_put_bytes_u16(pkt, DTLS1_VERSION) 1261e71b7053SJung-uk Kim || !WPACKET_sub_memcpy_u8(pkt, cookie, cookie_len)) 1262e71b7053SJung-uk Kim return 0; 1263e71b7053SJung-uk Kim 1264e71b7053SJung-uk Kim return 1; 1265e71b7053SJung-uk Kim } 1266e71b7053SJung-uk Kim 1267e71b7053SJung-uk Kim int dtls_construct_hello_verify_request(SSL *s, WPACKET *pkt) 1268e71b7053SJung-uk Kim { 1269e71b7053SJung-uk Kim unsigned int cookie_leni; 1270e71b7053SJung-uk Kim if (s->ctx->app_gen_cookie_cb == NULL || 1271e71b7053SJung-uk Kim s->ctx->app_gen_cookie_cb(s, s->d1->cookie, 1272e71b7053SJung-uk Kim &cookie_leni) == 0 || 1273e71b7053SJung-uk Kim cookie_leni > 255) { 1274e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_NO_ALERT, SSL_F_DTLS_CONSTRUCT_HELLO_VERIFY_REQUEST, 1275e71b7053SJung-uk Kim SSL_R_COOKIE_GEN_CALLBACK_FAILURE); 1276e71b7053SJung-uk Kim return 0; 1277e71b7053SJung-uk Kim } 1278e71b7053SJung-uk Kim s->d1->cookie_len = cookie_leni; 1279e71b7053SJung-uk Kim 1280e71b7053SJung-uk Kim if (!dtls_raw_hello_verify_request(pkt, s->d1->cookie, 1281e71b7053SJung-uk Kim s->d1->cookie_len)) { 1282e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_NO_ALERT, SSL_F_DTLS_CONSTRUCT_HELLO_VERIFY_REQUEST, 1283e71b7053SJung-uk Kim ERR_R_INTERNAL_ERROR); 1284e71b7053SJung-uk Kim return 0; 1285e71b7053SJung-uk Kim } 1286e71b7053SJung-uk Kim 1287e71b7053SJung-uk Kim return 1; 1288e71b7053SJung-uk Kim } 1289e71b7053SJung-uk Kim 1290e71b7053SJung-uk Kim #ifndef OPENSSL_NO_EC 1291e71b7053SJung-uk Kim /*- 1292e71b7053SJung-uk Kim * ssl_check_for_safari attempts to fingerprint Safari using OS X 1293e71b7053SJung-uk Kim * SecureTransport using the TLS extension block in |hello|. 1294e71b7053SJung-uk Kim * Safari, since 10.6, sends exactly these extensions, in this order: 1295e71b7053SJung-uk Kim * SNI, 1296e71b7053SJung-uk Kim * elliptic_curves 1297e71b7053SJung-uk Kim * ec_point_formats 1298e71b7053SJung-uk Kim * signature_algorithms (for TLSv1.2 only) 1299e71b7053SJung-uk Kim * 1300e71b7053SJung-uk Kim * We wish to fingerprint Safari because they broke ECDHE-ECDSA support in 10.8, 1301e71b7053SJung-uk Kim * but they advertise support. So enabling ECDHE-ECDSA ciphers breaks them. 1302e71b7053SJung-uk Kim * Sadly we cannot differentiate 10.6, 10.7 and 10.8.4 (which work), from 1303e71b7053SJung-uk Kim * 10.8..10.8.3 (which don't work). 1304e71b7053SJung-uk Kim */ 1305e71b7053SJung-uk Kim static void ssl_check_for_safari(SSL *s, const CLIENTHELLO_MSG *hello) 1306e71b7053SJung-uk Kim { 1307e71b7053SJung-uk Kim static const unsigned char kSafariExtensionsBlock[] = { 1308e71b7053SJung-uk Kim 0x00, 0x0a, /* elliptic_curves extension */ 1309e71b7053SJung-uk Kim 0x00, 0x08, /* 8 bytes */ 1310e71b7053SJung-uk Kim 0x00, 0x06, /* 6 bytes of curve ids */ 1311e71b7053SJung-uk Kim 0x00, 0x17, /* P-256 */ 1312e71b7053SJung-uk Kim 0x00, 0x18, /* P-384 */ 1313e71b7053SJung-uk Kim 0x00, 0x19, /* P-521 */ 1314e71b7053SJung-uk Kim 1315e71b7053SJung-uk Kim 0x00, 0x0b, /* ec_point_formats */ 1316e71b7053SJung-uk Kim 0x00, 0x02, /* 2 bytes */ 1317e71b7053SJung-uk Kim 0x01, /* 1 point format */ 1318e71b7053SJung-uk Kim 0x00, /* uncompressed */ 1319e71b7053SJung-uk Kim /* The following is only present in TLS 1.2 */ 1320e71b7053SJung-uk Kim 0x00, 0x0d, /* signature_algorithms */ 1321e71b7053SJung-uk Kim 0x00, 0x0c, /* 12 bytes */ 1322e71b7053SJung-uk Kim 0x00, 0x0a, /* 10 bytes */ 1323e71b7053SJung-uk Kim 0x05, 0x01, /* SHA-384/RSA */ 1324e71b7053SJung-uk Kim 0x04, 0x01, /* SHA-256/RSA */ 1325e71b7053SJung-uk Kim 0x02, 0x01, /* SHA-1/RSA */ 1326e71b7053SJung-uk Kim 0x04, 0x03, /* SHA-256/ECDSA */ 1327e71b7053SJung-uk Kim 0x02, 0x03, /* SHA-1/ECDSA */ 1328e71b7053SJung-uk Kim }; 1329e71b7053SJung-uk Kim /* Length of the common prefix (first two extensions). */ 1330e71b7053SJung-uk Kim static const size_t kSafariCommonExtensionsLength = 18; 1331e71b7053SJung-uk Kim unsigned int type; 1332e71b7053SJung-uk Kim PACKET sni, tmppkt; 1333e71b7053SJung-uk Kim size_t ext_len; 1334e71b7053SJung-uk Kim 1335e71b7053SJung-uk Kim tmppkt = hello->extensions; 1336e71b7053SJung-uk Kim 1337e71b7053SJung-uk Kim if (!PACKET_forward(&tmppkt, 2) 1338e71b7053SJung-uk Kim || !PACKET_get_net_2(&tmppkt, &type) 1339e71b7053SJung-uk Kim || !PACKET_get_length_prefixed_2(&tmppkt, &sni)) { 1340e71b7053SJung-uk Kim return; 1341e71b7053SJung-uk Kim } 1342e71b7053SJung-uk Kim 1343e71b7053SJung-uk Kim if (type != TLSEXT_TYPE_server_name) 1344e71b7053SJung-uk Kim return; 1345e71b7053SJung-uk Kim 1346e71b7053SJung-uk Kim ext_len = TLS1_get_client_version(s) >= TLS1_2_VERSION ? 1347e71b7053SJung-uk Kim sizeof(kSafariExtensionsBlock) : kSafariCommonExtensionsLength; 1348e71b7053SJung-uk Kim 1349e71b7053SJung-uk Kim s->s3->is_probably_safari = PACKET_equal(&tmppkt, kSafariExtensionsBlock, 1350e71b7053SJung-uk Kim ext_len); 1351e71b7053SJung-uk Kim } 1352e71b7053SJung-uk Kim #endif /* !OPENSSL_NO_EC */ 1353e71b7053SJung-uk Kim 1354e71b7053SJung-uk Kim MSG_PROCESS_RETURN tls_process_client_hello(SSL *s, PACKET *pkt) 1355e71b7053SJung-uk Kim { 1356e71b7053SJung-uk Kim /* |cookie| will only be initialized for DTLS. */ 1357e71b7053SJung-uk Kim PACKET session_id, compression, extensions, cookie; 1358e71b7053SJung-uk Kim static const unsigned char null_compression = 0; 1359e71b7053SJung-uk Kim CLIENTHELLO_MSG *clienthello = NULL; 1360e71b7053SJung-uk Kim 1361e71b7053SJung-uk Kim /* Check if this is actually an unexpected renegotiation ClientHello */ 1362e71b7053SJung-uk Kim if (s->renegotiate == 0 && !SSL_IS_FIRST_HANDSHAKE(s)) { 1363e71b7053SJung-uk Kim if (!ossl_assert(!SSL_IS_TLS13(s))) { 1364e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_TLS_PROCESS_CLIENT_HELLO, 1365e71b7053SJung-uk Kim ERR_R_INTERNAL_ERROR); 1366e71b7053SJung-uk Kim goto err; 1367e71b7053SJung-uk Kim } 1368e71b7053SJung-uk Kim if ((s->options & SSL_OP_NO_RENEGOTIATION) != 0 1369e71b7053SJung-uk Kim || (!s->s3->send_connection_binding 1370e71b7053SJung-uk Kim && (s->options 1371e71b7053SJung-uk Kim & SSL_OP_ALLOW_UNSAFE_LEGACY_RENEGOTIATION) == 0)) { 1372e71b7053SJung-uk Kim ssl3_send_alert(s, SSL3_AL_WARNING, SSL_AD_NO_RENEGOTIATION); 1373e71b7053SJung-uk Kim return MSG_PROCESS_FINISHED_READING; 1374e71b7053SJung-uk Kim } 1375e71b7053SJung-uk Kim s->renegotiate = 1; 1376e71b7053SJung-uk Kim s->new_session = 1; 1377e71b7053SJung-uk Kim } 1378e71b7053SJung-uk Kim 1379e71b7053SJung-uk Kim clienthello = OPENSSL_zalloc(sizeof(*clienthello)); 1380e71b7053SJung-uk Kim if (clienthello == NULL) { 1381e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_TLS_PROCESS_CLIENT_HELLO, 1382e71b7053SJung-uk Kim ERR_R_INTERNAL_ERROR); 1383e71b7053SJung-uk Kim goto err; 1384e71b7053SJung-uk Kim } 1385e71b7053SJung-uk Kim 1386e71b7053SJung-uk Kim /* 1387e71b7053SJung-uk Kim * First, parse the raw ClientHello data into the CLIENTHELLO_MSG structure. 1388e71b7053SJung-uk Kim */ 1389e71b7053SJung-uk Kim clienthello->isv2 = RECORD_LAYER_is_sslv2_record(&s->rlayer); 1390e71b7053SJung-uk Kim PACKET_null_init(&cookie); 1391e71b7053SJung-uk Kim 1392e71b7053SJung-uk Kim if (clienthello->isv2) { 1393e71b7053SJung-uk Kim unsigned int mt; 1394e71b7053SJung-uk Kim 1395e71b7053SJung-uk Kim if (!SSL_IS_FIRST_HANDSHAKE(s) 1396e71b7053SJung-uk Kim || s->hello_retry_request != SSL_HRR_NONE) { 1397e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_UNEXPECTED_MESSAGE, 1398e71b7053SJung-uk Kim SSL_F_TLS_PROCESS_CLIENT_HELLO, SSL_R_UNEXPECTED_MESSAGE); 1399e71b7053SJung-uk Kim goto err; 1400e71b7053SJung-uk Kim } 1401e71b7053SJung-uk Kim 1402e71b7053SJung-uk Kim /*- 1403e71b7053SJung-uk Kim * An SSLv3/TLSv1 backwards-compatible CLIENT-HELLO in an SSLv2 1404e71b7053SJung-uk Kim * header is sent directly on the wire, not wrapped as a TLS 1405e71b7053SJung-uk Kim * record. Our record layer just processes the message length and passes 1406e71b7053SJung-uk Kim * the rest right through. Its format is: 1407e71b7053SJung-uk Kim * Byte Content 1408e71b7053SJung-uk Kim * 0-1 msg_length - decoded by the record layer 1409e71b7053SJung-uk Kim * 2 msg_type - s->init_msg points here 1410e71b7053SJung-uk Kim * 3-4 version 1411e71b7053SJung-uk Kim * 5-6 cipher_spec_length 1412e71b7053SJung-uk Kim * 7-8 session_id_length 1413e71b7053SJung-uk Kim * 9-10 challenge_length 1414e71b7053SJung-uk Kim * ... ... 1415e71b7053SJung-uk Kim */ 1416e71b7053SJung-uk Kim 1417e71b7053SJung-uk Kim if (!PACKET_get_1(pkt, &mt) 1418e71b7053SJung-uk Kim || mt != SSL2_MT_CLIENT_HELLO) { 1419e71b7053SJung-uk Kim /* 1420e71b7053SJung-uk Kim * Should never happen. We should have tested this in the record 1421e71b7053SJung-uk Kim * layer in order to have determined that this is a SSLv2 record 1422e71b7053SJung-uk Kim * in the first place 1423e71b7053SJung-uk Kim */ 1424e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_TLS_PROCESS_CLIENT_HELLO, 1425e71b7053SJung-uk Kim ERR_R_INTERNAL_ERROR); 1426e71b7053SJung-uk Kim goto err; 1427e71b7053SJung-uk Kim } 1428e71b7053SJung-uk Kim } 1429e71b7053SJung-uk Kim 1430e71b7053SJung-uk Kim if (!PACKET_get_net_2(pkt, &clienthello->legacy_version)) { 1431e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_DECODE_ERROR, SSL_F_TLS_PROCESS_CLIENT_HELLO, 1432e71b7053SJung-uk Kim SSL_R_LENGTH_TOO_SHORT); 1433e71b7053SJung-uk Kim goto err; 1434e71b7053SJung-uk Kim } 1435e71b7053SJung-uk Kim 1436e71b7053SJung-uk Kim /* Parse the message and load client random. */ 1437e71b7053SJung-uk Kim if (clienthello->isv2) { 1438e71b7053SJung-uk Kim /* 1439e71b7053SJung-uk Kim * Handle an SSLv2 backwards compatible ClientHello 1440e71b7053SJung-uk Kim * Note, this is only for SSLv3+ using the backward compatible format. 1441e71b7053SJung-uk Kim * Real SSLv2 is not supported, and is rejected below. 1442e71b7053SJung-uk Kim */ 1443e71b7053SJung-uk Kim unsigned int ciphersuite_len, session_id_len, challenge_len; 1444e71b7053SJung-uk Kim PACKET challenge; 1445e71b7053SJung-uk Kim 1446e71b7053SJung-uk Kim if (!PACKET_get_net_2(pkt, &ciphersuite_len) 1447e71b7053SJung-uk Kim || !PACKET_get_net_2(pkt, &session_id_len) 1448e71b7053SJung-uk Kim || !PACKET_get_net_2(pkt, &challenge_len)) { 1449e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_DECODE_ERROR, SSL_F_TLS_PROCESS_CLIENT_HELLO, 1450e71b7053SJung-uk Kim SSL_R_RECORD_LENGTH_MISMATCH); 1451e71b7053SJung-uk Kim goto err; 1452e71b7053SJung-uk Kim } 1453e71b7053SJung-uk Kim 1454e71b7053SJung-uk Kim if (session_id_len > SSL_MAX_SSL_SESSION_ID_LENGTH) { 1455e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_ILLEGAL_PARAMETER, 1456e71b7053SJung-uk Kim SSL_F_TLS_PROCESS_CLIENT_HELLO, SSL_R_LENGTH_MISMATCH); 1457e71b7053SJung-uk Kim goto err; 1458e71b7053SJung-uk Kim } 1459e71b7053SJung-uk Kim 1460e71b7053SJung-uk Kim if (!PACKET_get_sub_packet(pkt, &clienthello->ciphersuites, 1461e71b7053SJung-uk Kim ciphersuite_len) 1462e71b7053SJung-uk Kim || !PACKET_copy_bytes(pkt, clienthello->session_id, session_id_len) 1463e71b7053SJung-uk Kim || !PACKET_get_sub_packet(pkt, &challenge, challenge_len) 1464e71b7053SJung-uk Kim /* No extensions. */ 1465e71b7053SJung-uk Kim || PACKET_remaining(pkt) != 0) { 1466e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_DECODE_ERROR, SSL_F_TLS_PROCESS_CLIENT_HELLO, 1467e71b7053SJung-uk Kim SSL_R_RECORD_LENGTH_MISMATCH); 1468e71b7053SJung-uk Kim goto err; 1469e71b7053SJung-uk Kim } 1470e71b7053SJung-uk Kim clienthello->session_id_len = session_id_len; 1471e71b7053SJung-uk Kim 1472e71b7053SJung-uk Kim /* Load the client random and compression list. We use SSL3_RANDOM_SIZE 1473e71b7053SJung-uk Kim * here rather than sizeof(clienthello->random) because that is the limit 1474e71b7053SJung-uk Kim * for SSLv3 and it is fixed. It won't change even if 1475e71b7053SJung-uk Kim * sizeof(clienthello->random) does. 1476e71b7053SJung-uk Kim */ 1477e71b7053SJung-uk Kim challenge_len = challenge_len > SSL3_RANDOM_SIZE 1478e71b7053SJung-uk Kim ? SSL3_RANDOM_SIZE : challenge_len; 1479e71b7053SJung-uk Kim memset(clienthello->random, 0, SSL3_RANDOM_SIZE); 1480e71b7053SJung-uk Kim if (!PACKET_copy_bytes(&challenge, 1481e71b7053SJung-uk Kim clienthello->random + SSL3_RANDOM_SIZE - 1482e71b7053SJung-uk Kim challenge_len, challenge_len) 1483e71b7053SJung-uk Kim /* Advertise only null compression. */ 1484e71b7053SJung-uk Kim || !PACKET_buf_init(&compression, &null_compression, 1)) { 1485e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_TLS_PROCESS_CLIENT_HELLO, 1486e71b7053SJung-uk Kim ERR_R_INTERNAL_ERROR); 1487e71b7053SJung-uk Kim goto err; 1488e71b7053SJung-uk Kim } 1489e71b7053SJung-uk Kim 1490e71b7053SJung-uk Kim PACKET_null_init(&clienthello->extensions); 1491e71b7053SJung-uk Kim } else { 1492e71b7053SJung-uk Kim /* Regular ClientHello. */ 1493e71b7053SJung-uk Kim if (!PACKET_copy_bytes(pkt, clienthello->random, SSL3_RANDOM_SIZE) 1494e71b7053SJung-uk Kim || !PACKET_get_length_prefixed_1(pkt, &session_id) 1495e71b7053SJung-uk Kim || !PACKET_copy_all(&session_id, clienthello->session_id, 1496e71b7053SJung-uk Kim SSL_MAX_SSL_SESSION_ID_LENGTH, 1497e71b7053SJung-uk Kim &clienthello->session_id_len)) { 1498e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_DECODE_ERROR, SSL_F_TLS_PROCESS_CLIENT_HELLO, 1499e71b7053SJung-uk Kim SSL_R_LENGTH_MISMATCH); 1500e71b7053SJung-uk Kim goto err; 1501e71b7053SJung-uk Kim } 1502e71b7053SJung-uk Kim 1503e71b7053SJung-uk Kim if (SSL_IS_DTLS(s)) { 1504e71b7053SJung-uk Kim if (!PACKET_get_length_prefixed_1(pkt, &cookie)) { 1505e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_DECODE_ERROR, SSL_F_TLS_PROCESS_CLIENT_HELLO, 1506e71b7053SJung-uk Kim SSL_R_LENGTH_MISMATCH); 1507e71b7053SJung-uk Kim goto err; 1508e71b7053SJung-uk Kim } 1509e71b7053SJung-uk Kim if (!PACKET_copy_all(&cookie, clienthello->dtls_cookie, 1510e71b7053SJung-uk Kim DTLS1_COOKIE_LENGTH, 1511e71b7053SJung-uk Kim &clienthello->dtls_cookie_len)) { 1512e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_INTERNAL_ERROR, 1513e71b7053SJung-uk Kim SSL_F_TLS_PROCESS_CLIENT_HELLO, ERR_R_INTERNAL_ERROR); 1514e71b7053SJung-uk Kim goto err; 1515e71b7053SJung-uk Kim } 1516e71b7053SJung-uk Kim /* 1517e71b7053SJung-uk Kim * If we require cookies and this ClientHello doesn't contain one, 1518e71b7053SJung-uk Kim * just return since we do not want to allocate any memory yet. 1519e71b7053SJung-uk Kim * So check cookie length... 1520e71b7053SJung-uk Kim */ 1521e71b7053SJung-uk Kim if (SSL_get_options(s) & SSL_OP_COOKIE_EXCHANGE) { 1522*c9cf7b5cSJung-uk Kim if (clienthello->dtls_cookie_len == 0) { 1523*c9cf7b5cSJung-uk Kim OPENSSL_free(clienthello); 1524e71b7053SJung-uk Kim return MSG_PROCESS_FINISHED_READING; 1525e71b7053SJung-uk Kim } 1526e71b7053SJung-uk Kim } 1527*c9cf7b5cSJung-uk Kim } 1528e71b7053SJung-uk Kim 1529e71b7053SJung-uk Kim if (!PACKET_get_length_prefixed_2(pkt, &clienthello->ciphersuites)) { 1530e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_DECODE_ERROR, SSL_F_TLS_PROCESS_CLIENT_HELLO, 1531e71b7053SJung-uk Kim SSL_R_LENGTH_MISMATCH); 1532e71b7053SJung-uk Kim goto err; 1533e71b7053SJung-uk Kim } 1534e71b7053SJung-uk Kim 1535e71b7053SJung-uk Kim if (!PACKET_get_length_prefixed_1(pkt, &compression)) { 1536e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_DECODE_ERROR, SSL_F_TLS_PROCESS_CLIENT_HELLO, 1537e71b7053SJung-uk Kim SSL_R_LENGTH_MISMATCH); 1538e71b7053SJung-uk Kim goto err; 1539e71b7053SJung-uk Kim } 1540e71b7053SJung-uk Kim 1541e71b7053SJung-uk Kim /* Could be empty. */ 1542e71b7053SJung-uk Kim if (PACKET_remaining(pkt) == 0) { 1543e71b7053SJung-uk Kim PACKET_null_init(&clienthello->extensions); 1544e71b7053SJung-uk Kim } else { 1545e71b7053SJung-uk Kim if (!PACKET_get_length_prefixed_2(pkt, &clienthello->extensions) 1546e71b7053SJung-uk Kim || PACKET_remaining(pkt) != 0) { 1547e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_DECODE_ERROR, SSL_F_TLS_PROCESS_CLIENT_HELLO, 1548e71b7053SJung-uk Kim SSL_R_LENGTH_MISMATCH); 1549e71b7053SJung-uk Kim goto err; 1550e71b7053SJung-uk Kim } 1551e71b7053SJung-uk Kim } 1552e71b7053SJung-uk Kim } 1553e71b7053SJung-uk Kim 1554e71b7053SJung-uk Kim if (!PACKET_copy_all(&compression, clienthello->compressions, 1555e71b7053SJung-uk Kim MAX_COMPRESSIONS_SIZE, 1556e71b7053SJung-uk Kim &clienthello->compressions_len)) { 1557e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_TLS_PROCESS_CLIENT_HELLO, 1558e71b7053SJung-uk Kim ERR_R_INTERNAL_ERROR); 1559e71b7053SJung-uk Kim goto err; 1560e71b7053SJung-uk Kim } 1561e71b7053SJung-uk Kim 1562e71b7053SJung-uk Kim /* Preserve the raw extensions PACKET for later use */ 1563e71b7053SJung-uk Kim extensions = clienthello->extensions; 1564e71b7053SJung-uk Kim if (!tls_collect_extensions(s, &extensions, SSL_EXT_CLIENT_HELLO, 1565e71b7053SJung-uk Kim &clienthello->pre_proc_exts, 1566e71b7053SJung-uk Kim &clienthello->pre_proc_exts_len, 1)) { 1567e71b7053SJung-uk Kim /* SSLfatal already been called */ 1568e71b7053SJung-uk Kim goto err; 1569e71b7053SJung-uk Kim } 1570e71b7053SJung-uk Kim s->clienthello = clienthello; 1571e71b7053SJung-uk Kim 1572e71b7053SJung-uk Kim return MSG_PROCESS_CONTINUE_PROCESSING; 1573e71b7053SJung-uk Kim 1574e71b7053SJung-uk Kim err: 1575e71b7053SJung-uk Kim if (clienthello != NULL) 1576e71b7053SJung-uk Kim OPENSSL_free(clienthello->pre_proc_exts); 1577e71b7053SJung-uk Kim OPENSSL_free(clienthello); 1578e71b7053SJung-uk Kim 1579e71b7053SJung-uk Kim return MSG_PROCESS_ERROR; 1580e71b7053SJung-uk Kim } 1581e71b7053SJung-uk Kim 1582e71b7053SJung-uk Kim static int tls_early_post_process_client_hello(SSL *s) 1583e71b7053SJung-uk Kim { 1584e71b7053SJung-uk Kim unsigned int j; 1585e71b7053SJung-uk Kim int i, al = SSL_AD_INTERNAL_ERROR; 1586e71b7053SJung-uk Kim int protverr; 1587e71b7053SJung-uk Kim size_t loop; 1588e71b7053SJung-uk Kim unsigned long id; 1589e71b7053SJung-uk Kim #ifndef OPENSSL_NO_COMP 1590e71b7053SJung-uk Kim SSL_COMP *comp = NULL; 1591e71b7053SJung-uk Kim #endif 1592e71b7053SJung-uk Kim const SSL_CIPHER *c; 1593e71b7053SJung-uk Kim STACK_OF(SSL_CIPHER) *ciphers = NULL; 1594e71b7053SJung-uk Kim STACK_OF(SSL_CIPHER) *scsvs = NULL; 1595e71b7053SJung-uk Kim CLIENTHELLO_MSG *clienthello = s->clienthello; 1596e71b7053SJung-uk Kim DOWNGRADE dgrd = DOWNGRADE_NONE; 1597e71b7053SJung-uk Kim 1598e71b7053SJung-uk Kim /* Finished parsing the ClientHello, now we can start processing it */ 1599e71b7053SJung-uk Kim /* Give the ClientHello callback a crack at things */ 1600e71b7053SJung-uk Kim if (s->ctx->client_hello_cb != NULL) { 1601e71b7053SJung-uk Kim /* A failure in the ClientHello callback terminates the connection. */ 1602e71b7053SJung-uk Kim switch (s->ctx->client_hello_cb(s, &al, s->ctx->client_hello_cb_arg)) { 1603e71b7053SJung-uk Kim case SSL_CLIENT_HELLO_SUCCESS: 1604e71b7053SJung-uk Kim break; 1605e71b7053SJung-uk Kim case SSL_CLIENT_HELLO_RETRY: 1606e71b7053SJung-uk Kim s->rwstate = SSL_CLIENT_HELLO_CB; 1607e71b7053SJung-uk Kim return -1; 1608e71b7053SJung-uk Kim case SSL_CLIENT_HELLO_ERROR: 1609e71b7053SJung-uk Kim default: 1610e71b7053SJung-uk Kim SSLfatal(s, al, 1611e71b7053SJung-uk Kim SSL_F_TLS_EARLY_POST_PROCESS_CLIENT_HELLO, 1612e71b7053SJung-uk Kim SSL_R_CALLBACK_FAILED); 1613e71b7053SJung-uk Kim goto err; 1614e71b7053SJung-uk Kim } 1615e71b7053SJung-uk Kim } 1616e71b7053SJung-uk Kim 1617e71b7053SJung-uk Kim /* Set up the client_random */ 1618e71b7053SJung-uk Kim memcpy(s->s3->client_random, clienthello->random, SSL3_RANDOM_SIZE); 1619e71b7053SJung-uk Kim 1620e71b7053SJung-uk Kim /* Choose the version */ 1621e71b7053SJung-uk Kim 1622e71b7053SJung-uk Kim if (clienthello->isv2) { 1623e71b7053SJung-uk Kim if (clienthello->legacy_version == SSL2_VERSION 1624e71b7053SJung-uk Kim || (clienthello->legacy_version & 0xff00) 1625e71b7053SJung-uk Kim != (SSL3_VERSION_MAJOR << 8)) { 1626e71b7053SJung-uk Kim /* 1627e71b7053SJung-uk Kim * This is real SSLv2 or something completely unknown. We don't 1628e71b7053SJung-uk Kim * support it. 1629e71b7053SJung-uk Kim */ 1630e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_PROTOCOL_VERSION, 1631e71b7053SJung-uk Kim SSL_F_TLS_EARLY_POST_PROCESS_CLIENT_HELLO, 1632e71b7053SJung-uk Kim SSL_R_UNKNOWN_PROTOCOL); 1633e71b7053SJung-uk Kim goto err; 1634e71b7053SJung-uk Kim } 1635e71b7053SJung-uk Kim /* SSLv3/TLS */ 1636e71b7053SJung-uk Kim s->client_version = clienthello->legacy_version; 1637e71b7053SJung-uk Kim } 1638e71b7053SJung-uk Kim /* 1639e71b7053SJung-uk Kim * Do SSL/TLS version negotiation if applicable. For DTLS we just check 1640e71b7053SJung-uk Kim * versions are potentially compatible. Version negotiation comes later. 1641e71b7053SJung-uk Kim */ 1642e71b7053SJung-uk Kim if (!SSL_IS_DTLS(s)) { 1643e71b7053SJung-uk Kim protverr = ssl_choose_server_version(s, clienthello, &dgrd); 1644e71b7053SJung-uk Kim } else if (s->method->version != DTLS_ANY_VERSION && 1645e71b7053SJung-uk Kim DTLS_VERSION_LT((int)clienthello->legacy_version, s->version)) { 1646e71b7053SJung-uk Kim protverr = SSL_R_VERSION_TOO_LOW; 1647e71b7053SJung-uk Kim } else { 1648e71b7053SJung-uk Kim protverr = 0; 1649e71b7053SJung-uk Kim } 1650e71b7053SJung-uk Kim 1651e71b7053SJung-uk Kim if (protverr) { 1652e71b7053SJung-uk Kim if (SSL_IS_FIRST_HANDSHAKE(s)) { 1653e71b7053SJung-uk Kim /* like ssl3_get_record, send alert using remote version number */ 1654e71b7053SJung-uk Kim s->version = s->client_version = clienthello->legacy_version; 1655e71b7053SJung-uk Kim } 1656e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_PROTOCOL_VERSION, 1657e71b7053SJung-uk Kim SSL_F_TLS_EARLY_POST_PROCESS_CLIENT_HELLO, protverr); 1658e71b7053SJung-uk Kim goto err; 1659e71b7053SJung-uk Kim } 1660e71b7053SJung-uk Kim 1661e71b7053SJung-uk Kim /* TLSv1.3 specifies that a ClientHello must end on a record boundary */ 1662e71b7053SJung-uk Kim if (SSL_IS_TLS13(s) && RECORD_LAYER_processed_read_pending(&s->rlayer)) { 1663e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_UNEXPECTED_MESSAGE, 1664e71b7053SJung-uk Kim SSL_F_TLS_EARLY_POST_PROCESS_CLIENT_HELLO, 1665e71b7053SJung-uk Kim SSL_R_NOT_ON_RECORD_BOUNDARY); 1666e71b7053SJung-uk Kim goto err; 1667e71b7053SJung-uk Kim } 1668e71b7053SJung-uk Kim 1669e71b7053SJung-uk Kim if (SSL_IS_DTLS(s)) { 1670e71b7053SJung-uk Kim /* Empty cookie was already handled above by returning early. */ 1671e71b7053SJung-uk Kim if (SSL_get_options(s) & SSL_OP_COOKIE_EXCHANGE) { 1672e71b7053SJung-uk Kim if (s->ctx->app_verify_cookie_cb != NULL) { 1673e71b7053SJung-uk Kim if (s->ctx->app_verify_cookie_cb(s, clienthello->dtls_cookie, 1674e71b7053SJung-uk Kim clienthello->dtls_cookie_len) == 0) { 1675e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_HANDSHAKE_FAILURE, 1676e71b7053SJung-uk Kim SSL_F_TLS_EARLY_POST_PROCESS_CLIENT_HELLO, 1677e71b7053SJung-uk Kim SSL_R_COOKIE_MISMATCH); 1678e71b7053SJung-uk Kim goto err; 1679e71b7053SJung-uk Kim /* else cookie verification succeeded */ 1680e71b7053SJung-uk Kim } 1681e71b7053SJung-uk Kim /* default verification */ 1682e71b7053SJung-uk Kim } else if (s->d1->cookie_len != clienthello->dtls_cookie_len 1683e71b7053SJung-uk Kim || memcmp(clienthello->dtls_cookie, s->d1->cookie, 1684e71b7053SJung-uk Kim s->d1->cookie_len) != 0) { 1685e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_HANDSHAKE_FAILURE, 1686e71b7053SJung-uk Kim SSL_F_TLS_EARLY_POST_PROCESS_CLIENT_HELLO, 1687e71b7053SJung-uk Kim SSL_R_COOKIE_MISMATCH); 1688e71b7053SJung-uk Kim goto err; 1689e71b7053SJung-uk Kim } 1690e71b7053SJung-uk Kim s->d1->cookie_verified = 1; 1691e71b7053SJung-uk Kim } 1692e71b7053SJung-uk Kim if (s->method->version == DTLS_ANY_VERSION) { 1693e71b7053SJung-uk Kim protverr = ssl_choose_server_version(s, clienthello, &dgrd); 1694e71b7053SJung-uk Kim if (protverr != 0) { 1695e71b7053SJung-uk Kim s->version = s->client_version; 1696e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_PROTOCOL_VERSION, 1697e71b7053SJung-uk Kim SSL_F_TLS_EARLY_POST_PROCESS_CLIENT_HELLO, protverr); 1698e71b7053SJung-uk Kim goto err; 1699e71b7053SJung-uk Kim } 1700e71b7053SJung-uk Kim } 1701e71b7053SJung-uk Kim } 1702e71b7053SJung-uk Kim 1703e71b7053SJung-uk Kim s->hit = 0; 1704e71b7053SJung-uk Kim 1705e71b7053SJung-uk Kim if (!ssl_cache_cipherlist(s, &clienthello->ciphersuites, 1706e71b7053SJung-uk Kim clienthello->isv2) || 1707e71b7053SJung-uk Kim !bytes_to_cipher_list(s, &clienthello->ciphersuites, &ciphers, &scsvs, 1708e71b7053SJung-uk Kim clienthello->isv2, 1)) { 1709e71b7053SJung-uk Kim /* SSLfatal() already called */ 1710e71b7053SJung-uk Kim goto err; 1711e71b7053SJung-uk Kim } 1712e71b7053SJung-uk Kim 1713e71b7053SJung-uk Kim s->s3->send_connection_binding = 0; 1714e71b7053SJung-uk Kim /* Check what signalling cipher-suite values were received. */ 1715e71b7053SJung-uk Kim if (scsvs != NULL) { 1716e71b7053SJung-uk Kim for(i = 0; i < sk_SSL_CIPHER_num(scsvs); i++) { 1717e71b7053SJung-uk Kim c = sk_SSL_CIPHER_value(scsvs, i); 1718e71b7053SJung-uk Kim if (SSL_CIPHER_get_id(c) == SSL3_CK_SCSV) { 1719e71b7053SJung-uk Kim if (s->renegotiate) { 1720e71b7053SJung-uk Kim /* SCSV is fatal if renegotiating */ 1721e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_HANDSHAKE_FAILURE, 1722e71b7053SJung-uk Kim SSL_F_TLS_EARLY_POST_PROCESS_CLIENT_HELLO, 1723e71b7053SJung-uk Kim SSL_R_SCSV_RECEIVED_WHEN_RENEGOTIATING); 1724e71b7053SJung-uk Kim goto err; 1725e71b7053SJung-uk Kim } 1726e71b7053SJung-uk Kim s->s3->send_connection_binding = 1; 1727e71b7053SJung-uk Kim } else if (SSL_CIPHER_get_id(c) == SSL3_CK_FALLBACK_SCSV && 1728e71b7053SJung-uk Kim !ssl_check_version_downgrade(s)) { 1729e71b7053SJung-uk Kim /* 1730e71b7053SJung-uk Kim * This SCSV indicates that the client previously tried 1731e71b7053SJung-uk Kim * a higher version. We should fail if the current version 1732e71b7053SJung-uk Kim * is an unexpected downgrade, as that indicates that the first 1733e71b7053SJung-uk Kim * connection may have been tampered with in order to trigger 1734e71b7053SJung-uk Kim * an insecure downgrade. 1735e71b7053SJung-uk Kim */ 1736e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_INAPPROPRIATE_FALLBACK, 1737e71b7053SJung-uk Kim SSL_F_TLS_EARLY_POST_PROCESS_CLIENT_HELLO, 1738e71b7053SJung-uk Kim SSL_R_INAPPROPRIATE_FALLBACK); 1739e71b7053SJung-uk Kim goto err; 1740e71b7053SJung-uk Kim } 1741e71b7053SJung-uk Kim } 1742e71b7053SJung-uk Kim } 1743e71b7053SJung-uk Kim 1744e71b7053SJung-uk Kim /* For TLSv1.3 we must select the ciphersuite *before* session resumption */ 1745e71b7053SJung-uk Kim if (SSL_IS_TLS13(s)) { 1746e71b7053SJung-uk Kim const SSL_CIPHER *cipher = 1747e71b7053SJung-uk Kim ssl3_choose_cipher(s, ciphers, SSL_get_ciphers(s)); 1748e71b7053SJung-uk Kim 1749e71b7053SJung-uk Kim if (cipher == NULL) { 1750e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_HANDSHAKE_FAILURE, 1751e71b7053SJung-uk Kim SSL_F_TLS_EARLY_POST_PROCESS_CLIENT_HELLO, 1752e71b7053SJung-uk Kim SSL_R_NO_SHARED_CIPHER); 1753e71b7053SJung-uk Kim goto err; 1754e71b7053SJung-uk Kim } 1755e71b7053SJung-uk Kim if (s->hello_retry_request == SSL_HRR_PENDING 1756e71b7053SJung-uk Kim && (s->s3->tmp.new_cipher == NULL 1757e71b7053SJung-uk Kim || s->s3->tmp.new_cipher->id != cipher->id)) { 1758e71b7053SJung-uk Kim /* 1759e71b7053SJung-uk Kim * A previous HRR picked a different ciphersuite to the one we 1760e71b7053SJung-uk Kim * just selected. Something must have changed. 1761e71b7053SJung-uk Kim */ 1762e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_ILLEGAL_PARAMETER, 1763e71b7053SJung-uk Kim SSL_F_TLS_EARLY_POST_PROCESS_CLIENT_HELLO, 1764e71b7053SJung-uk Kim SSL_R_BAD_CIPHER); 1765e71b7053SJung-uk Kim goto err; 1766e71b7053SJung-uk Kim } 1767e71b7053SJung-uk Kim s->s3->tmp.new_cipher = cipher; 1768e71b7053SJung-uk Kim } 1769e71b7053SJung-uk Kim 1770e71b7053SJung-uk Kim /* We need to do this before getting the session */ 1771e71b7053SJung-uk Kim if (!tls_parse_extension(s, TLSEXT_IDX_extended_master_secret, 1772e71b7053SJung-uk Kim SSL_EXT_CLIENT_HELLO, 1773e71b7053SJung-uk Kim clienthello->pre_proc_exts, NULL, 0)) { 1774e71b7053SJung-uk Kim /* SSLfatal() already called */ 1775e71b7053SJung-uk Kim goto err; 1776e71b7053SJung-uk Kim } 1777e71b7053SJung-uk Kim 1778e71b7053SJung-uk Kim /* 1779e71b7053SJung-uk Kim * We don't allow resumption in a backwards compatible ClientHello. 1780e71b7053SJung-uk Kim * TODO(openssl-team): in TLS1.1+, session_id MUST be empty. 1781e71b7053SJung-uk Kim * 1782e71b7053SJung-uk Kim * Versions before 0.9.7 always allow clients to resume sessions in 1783e71b7053SJung-uk Kim * renegotiation. 0.9.7 and later allow this by default, but optionally 1784e71b7053SJung-uk Kim * ignore resumption requests with flag 1785e71b7053SJung-uk Kim * SSL_OP_NO_SESSION_RESUMPTION_ON_RENEGOTIATION (it's a new flag rather 1786e71b7053SJung-uk Kim * than a change to default behavior so that applications relying on 1787e71b7053SJung-uk Kim * this for security won't even compile against older library versions). 1788e71b7053SJung-uk Kim * 1.0.1 and later also have a function SSL_renegotiate_abbreviated() to 1789e71b7053SJung-uk Kim * request renegotiation but not a new session (s->new_session remains 1790e71b7053SJung-uk Kim * unset): for servers, this essentially just means that the 1791e71b7053SJung-uk Kim * SSL_OP_NO_SESSION_RESUMPTION_ON_RENEGOTIATION setting will be 1792e71b7053SJung-uk Kim * ignored. 1793e71b7053SJung-uk Kim */ 1794e71b7053SJung-uk Kim if (clienthello->isv2 || 1795e71b7053SJung-uk Kim (s->new_session && 1796e71b7053SJung-uk Kim (s->options & SSL_OP_NO_SESSION_RESUMPTION_ON_RENEGOTIATION))) { 1797e71b7053SJung-uk Kim if (!ssl_get_new_session(s, 1)) { 1798e71b7053SJung-uk Kim /* SSLfatal() already called */ 1799e71b7053SJung-uk Kim goto err; 1800e71b7053SJung-uk Kim } 1801e71b7053SJung-uk Kim } else { 1802e71b7053SJung-uk Kim i = ssl_get_prev_session(s, clienthello); 1803e71b7053SJung-uk Kim if (i == 1) { 1804e71b7053SJung-uk Kim /* previous session */ 1805e71b7053SJung-uk Kim s->hit = 1; 1806e71b7053SJung-uk Kim } else if (i == -1) { 1807e71b7053SJung-uk Kim /* SSLfatal() already called */ 1808e71b7053SJung-uk Kim goto err; 1809e71b7053SJung-uk Kim } else { 1810e71b7053SJung-uk Kim /* i == 0 */ 1811e71b7053SJung-uk Kim if (!ssl_get_new_session(s, 1)) { 1812e71b7053SJung-uk Kim /* SSLfatal() already called */ 1813e71b7053SJung-uk Kim goto err; 1814e71b7053SJung-uk Kim } 1815e71b7053SJung-uk Kim } 1816e71b7053SJung-uk Kim } 1817e71b7053SJung-uk Kim 1818e71b7053SJung-uk Kim if (SSL_IS_TLS13(s)) { 1819e71b7053SJung-uk Kim memcpy(s->tmp_session_id, s->clienthello->session_id, 1820e71b7053SJung-uk Kim s->clienthello->session_id_len); 1821e71b7053SJung-uk Kim s->tmp_session_id_len = s->clienthello->session_id_len; 1822e71b7053SJung-uk Kim } 1823e71b7053SJung-uk Kim 1824e71b7053SJung-uk Kim /* 1825e71b7053SJung-uk Kim * If it is a hit, check that the cipher is in the list. In TLSv1.3 we check 1826e71b7053SJung-uk Kim * ciphersuite compatibility with the session as part of resumption. 1827e71b7053SJung-uk Kim */ 1828e71b7053SJung-uk Kim if (!SSL_IS_TLS13(s) && s->hit) { 1829e71b7053SJung-uk Kim j = 0; 1830e71b7053SJung-uk Kim id = s->session->cipher->id; 1831e71b7053SJung-uk Kim 1832e71b7053SJung-uk Kim #ifdef CIPHER_DEBUG 1833e71b7053SJung-uk Kim fprintf(stderr, "client sent %d ciphers\n", sk_SSL_CIPHER_num(ciphers)); 1834e71b7053SJung-uk Kim #endif 1835e71b7053SJung-uk Kim for (i = 0; i < sk_SSL_CIPHER_num(ciphers); i++) { 1836e71b7053SJung-uk Kim c = sk_SSL_CIPHER_value(ciphers, i); 1837e71b7053SJung-uk Kim #ifdef CIPHER_DEBUG 1838e71b7053SJung-uk Kim fprintf(stderr, "client [%2d of %2d]:%s\n", 1839e71b7053SJung-uk Kim i, sk_SSL_CIPHER_num(ciphers), SSL_CIPHER_get_name(c)); 1840e71b7053SJung-uk Kim #endif 1841e71b7053SJung-uk Kim if (c->id == id) { 1842e71b7053SJung-uk Kim j = 1; 1843e71b7053SJung-uk Kim break; 1844e71b7053SJung-uk Kim } 1845e71b7053SJung-uk Kim } 1846e71b7053SJung-uk Kim if (j == 0) { 1847e71b7053SJung-uk Kim /* 1848e71b7053SJung-uk Kim * we need to have the cipher in the cipher list if we are asked 1849e71b7053SJung-uk Kim * to reuse it 1850e71b7053SJung-uk Kim */ 1851e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_ILLEGAL_PARAMETER, 1852e71b7053SJung-uk Kim SSL_F_TLS_EARLY_POST_PROCESS_CLIENT_HELLO, 1853e71b7053SJung-uk Kim SSL_R_REQUIRED_CIPHER_MISSING); 1854e71b7053SJung-uk Kim goto err; 1855e71b7053SJung-uk Kim } 1856e71b7053SJung-uk Kim } 1857e71b7053SJung-uk Kim 1858e71b7053SJung-uk Kim for (loop = 0; loop < clienthello->compressions_len; loop++) { 1859e71b7053SJung-uk Kim if (clienthello->compressions[loop] == 0) 1860e71b7053SJung-uk Kim break; 1861e71b7053SJung-uk Kim } 1862e71b7053SJung-uk Kim 1863e71b7053SJung-uk Kim if (loop >= clienthello->compressions_len) { 1864e71b7053SJung-uk Kim /* no compress */ 1865e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_DECODE_ERROR, 1866e71b7053SJung-uk Kim SSL_F_TLS_EARLY_POST_PROCESS_CLIENT_HELLO, 1867e71b7053SJung-uk Kim SSL_R_NO_COMPRESSION_SPECIFIED); 1868e71b7053SJung-uk Kim goto err; 1869e71b7053SJung-uk Kim } 1870e71b7053SJung-uk Kim 1871e71b7053SJung-uk Kim #ifndef OPENSSL_NO_EC 1872e71b7053SJung-uk Kim if (s->options & SSL_OP_SAFARI_ECDHE_ECDSA_BUG) 1873e71b7053SJung-uk Kim ssl_check_for_safari(s, clienthello); 1874e71b7053SJung-uk Kim #endif /* !OPENSSL_NO_EC */ 1875e71b7053SJung-uk Kim 1876e71b7053SJung-uk Kim /* TLS extensions */ 1877e71b7053SJung-uk Kim if (!tls_parse_all_extensions(s, SSL_EXT_CLIENT_HELLO, 1878e71b7053SJung-uk Kim clienthello->pre_proc_exts, NULL, 0, 1)) { 1879e71b7053SJung-uk Kim /* SSLfatal() already called */ 1880e71b7053SJung-uk Kim goto err; 1881e71b7053SJung-uk Kim } 1882e71b7053SJung-uk Kim 1883e71b7053SJung-uk Kim /* 1884e71b7053SJung-uk Kim * Check if we want to use external pre-shared secret for this handshake 1885e71b7053SJung-uk Kim * for not reused session only. We need to generate server_random before 1886e71b7053SJung-uk Kim * calling tls_session_secret_cb in order to allow SessionTicket 1887e71b7053SJung-uk Kim * processing to use it in key derivation. 1888e71b7053SJung-uk Kim */ 1889e71b7053SJung-uk Kim { 1890e71b7053SJung-uk Kim unsigned char *pos; 1891e71b7053SJung-uk Kim pos = s->s3->server_random; 1892e71b7053SJung-uk Kim if (ssl_fill_hello_random(s, 1, pos, SSL3_RANDOM_SIZE, dgrd) <= 0) { 1893e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_INTERNAL_ERROR, 1894e71b7053SJung-uk Kim SSL_F_TLS_EARLY_POST_PROCESS_CLIENT_HELLO, 1895e71b7053SJung-uk Kim ERR_R_INTERNAL_ERROR); 1896e71b7053SJung-uk Kim goto err; 1897e71b7053SJung-uk Kim } 1898e71b7053SJung-uk Kim } 1899e71b7053SJung-uk Kim 1900e71b7053SJung-uk Kim if (!s->hit 1901e71b7053SJung-uk Kim && s->version >= TLS1_VERSION 1902e71b7053SJung-uk Kim && !SSL_IS_TLS13(s) 1903e71b7053SJung-uk Kim && !SSL_IS_DTLS(s) 1904e71b7053SJung-uk Kim && s->ext.session_secret_cb) { 1905e71b7053SJung-uk Kim const SSL_CIPHER *pref_cipher = NULL; 1906e71b7053SJung-uk Kim /* 1907e71b7053SJung-uk Kim * s->session->master_key_length is a size_t, but this is an int for 1908e71b7053SJung-uk Kim * backwards compat reasons 1909e71b7053SJung-uk Kim */ 1910e71b7053SJung-uk Kim int master_key_length; 1911e71b7053SJung-uk Kim 1912e71b7053SJung-uk Kim master_key_length = sizeof(s->session->master_key); 1913e71b7053SJung-uk Kim if (s->ext.session_secret_cb(s, s->session->master_key, 1914e71b7053SJung-uk Kim &master_key_length, ciphers, 1915e71b7053SJung-uk Kim &pref_cipher, 1916e71b7053SJung-uk Kim s->ext.session_secret_cb_arg) 1917e71b7053SJung-uk Kim && master_key_length > 0) { 1918e71b7053SJung-uk Kim s->session->master_key_length = master_key_length; 1919e71b7053SJung-uk Kim s->hit = 1; 1920e71b7053SJung-uk Kim s->session->ciphers = ciphers; 1921e71b7053SJung-uk Kim s->session->verify_result = X509_V_OK; 1922e71b7053SJung-uk Kim 1923e71b7053SJung-uk Kim ciphers = NULL; 1924e71b7053SJung-uk Kim 1925e71b7053SJung-uk Kim /* check if some cipher was preferred by call back */ 1926e71b7053SJung-uk Kim if (pref_cipher == NULL) 1927e71b7053SJung-uk Kim pref_cipher = ssl3_choose_cipher(s, s->session->ciphers, 1928e71b7053SJung-uk Kim SSL_get_ciphers(s)); 1929e71b7053SJung-uk Kim if (pref_cipher == NULL) { 1930e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_HANDSHAKE_FAILURE, 1931e71b7053SJung-uk Kim SSL_F_TLS_EARLY_POST_PROCESS_CLIENT_HELLO, 1932e71b7053SJung-uk Kim SSL_R_NO_SHARED_CIPHER); 1933e71b7053SJung-uk Kim goto err; 1934e71b7053SJung-uk Kim } 1935e71b7053SJung-uk Kim 1936e71b7053SJung-uk Kim s->session->cipher = pref_cipher; 1937e71b7053SJung-uk Kim sk_SSL_CIPHER_free(s->cipher_list); 1938e71b7053SJung-uk Kim s->cipher_list = sk_SSL_CIPHER_dup(s->session->ciphers); 1939e71b7053SJung-uk Kim sk_SSL_CIPHER_free(s->cipher_list_by_id); 1940e71b7053SJung-uk Kim s->cipher_list_by_id = sk_SSL_CIPHER_dup(s->session->ciphers); 1941e71b7053SJung-uk Kim } 1942e71b7053SJung-uk Kim } 1943e71b7053SJung-uk Kim 1944e71b7053SJung-uk Kim /* 1945e71b7053SJung-uk Kim * Worst case, we will use the NULL compression, but if we have other 1946e71b7053SJung-uk Kim * options, we will now look for them. We have complen-1 compression 1947e71b7053SJung-uk Kim * algorithms from the client, starting at q. 1948e71b7053SJung-uk Kim */ 1949e71b7053SJung-uk Kim s->s3->tmp.new_compression = NULL; 1950e71b7053SJung-uk Kim if (SSL_IS_TLS13(s)) { 1951e71b7053SJung-uk Kim /* 1952e71b7053SJung-uk Kim * We already checked above that the NULL compression method appears in 1953e71b7053SJung-uk Kim * the list. Now we check there aren't any others (which is illegal in 1954e71b7053SJung-uk Kim * a TLSv1.3 ClientHello. 1955e71b7053SJung-uk Kim */ 1956e71b7053SJung-uk Kim if (clienthello->compressions_len != 1) { 1957e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_ILLEGAL_PARAMETER, 1958e71b7053SJung-uk Kim SSL_F_TLS_EARLY_POST_PROCESS_CLIENT_HELLO, 1959e71b7053SJung-uk Kim SSL_R_INVALID_COMPRESSION_ALGORITHM); 1960e71b7053SJung-uk Kim goto err; 1961e71b7053SJung-uk Kim } 1962e71b7053SJung-uk Kim } 1963e71b7053SJung-uk Kim #ifndef OPENSSL_NO_COMP 1964e71b7053SJung-uk Kim /* This only happens if we have a cache hit */ 1965e71b7053SJung-uk Kim else if (s->session->compress_meth != 0) { 1966e71b7053SJung-uk Kim int m, comp_id = s->session->compress_meth; 1967e71b7053SJung-uk Kim unsigned int k; 1968e71b7053SJung-uk Kim /* Perform sanity checks on resumed compression algorithm */ 1969e71b7053SJung-uk Kim /* Can't disable compression */ 1970e71b7053SJung-uk Kim if (!ssl_allow_compression(s)) { 1971e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_HANDSHAKE_FAILURE, 1972e71b7053SJung-uk Kim SSL_F_TLS_EARLY_POST_PROCESS_CLIENT_HELLO, 1973e71b7053SJung-uk Kim SSL_R_INCONSISTENT_COMPRESSION); 1974e71b7053SJung-uk Kim goto err; 1975e71b7053SJung-uk Kim } 1976e71b7053SJung-uk Kim /* Look for resumed compression method */ 1977e71b7053SJung-uk Kim for (m = 0; m < sk_SSL_COMP_num(s->ctx->comp_methods); m++) { 1978e71b7053SJung-uk Kim comp = sk_SSL_COMP_value(s->ctx->comp_methods, m); 1979e71b7053SJung-uk Kim if (comp_id == comp->id) { 1980e71b7053SJung-uk Kim s->s3->tmp.new_compression = comp; 1981e71b7053SJung-uk Kim break; 1982e71b7053SJung-uk Kim } 1983e71b7053SJung-uk Kim } 1984e71b7053SJung-uk Kim if (s->s3->tmp.new_compression == NULL) { 1985e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_HANDSHAKE_FAILURE, 1986e71b7053SJung-uk Kim SSL_F_TLS_EARLY_POST_PROCESS_CLIENT_HELLO, 1987e71b7053SJung-uk Kim SSL_R_INVALID_COMPRESSION_ALGORITHM); 1988e71b7053SJung-uk Kim goto err; 1989e71b7053SJung-uk Kim } 1990e71b7053SJung-uk Kim /* Look for resumed method in compression list */ 1991e71b7053SJung-uk Kim for (k = 0; k < clienthello->compressions_len; k++) { 1992e71b7053SJung-uk Kim if (clienthello->compressions[k] == comp_id) 1993e71b7053SJung-uk Kim break; 1994e71b7053SJung-uk Kim } 1995e71b7053SJung-uk Kim if (k >= clienthello->compressions_len) { 1996e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_ILLEGAL_PARAMETER, 1997e71b7053SJung-uk Kim SSL_F_TLS_EARLY_POST_PROCESS_CLIENT_HELLO, 1998e71b7053SJung-uk Kim SSL_R_REQUIRED_COMPRESSION_ALGORITHM_MISSING); 1999e71b7053SJung-uk Kim goto err; 2000e71b7053SJung-uk Kim } 2001e71b7053SJung-uk Kim } else if (s->hit) { 2002e71b7053SJung-uk Kim comp = NULL; 2003e71b7053SJung-uk Kim } else if (ssl_allow_compression(s) && s->ctx->comp_methods) { 2004e71b7053SJung-uk Kim /* See if we have a match */ 2005e71b7053SJung-uk Kim int m, nn, v, done = 0; 2006e71b7053SJung-uk Kim unsigned int o; 2007e71b7053SJung-uk Kim 2008e71b7053SJung-uk Kim nn = sk_SSL_COMP_num(s->ctx->comp_methods); 2009e71b7053SJung-uk Kim for (m = 0; m < nn; m++) { 2010e71b7053SJung-uk Kim comp = sk_SSL_COMP_value(s->ctx->comp_methods, m); 2011e71b7053SJung-uk Kim v = comp->id; 2012e71b7053SJung-uk Kim for (o = 0; o < clienthello->compressions_len; o++) { 2013e71b7053SJung-uk Kim if (v == clienthello->compressions[o]) { 2014e71b7053SJung-uk Kim done = 1; 2015e71b7053SJung-uk Kim break; 2016e71b7053SJung-uk Kim } 2017e71b7053SJung-uk Kim } 2018e71b7053SJung-uk Kim if (done) 2019e71b7053SJung-uk Kim break; 2020e71b7053SJung-uk Kim } 2021e71b7053SJung-uk Kim if (done) 2022e71b7053SJung-uk Kim s->s3->tmp.new_compression = comp; 2023e71b7053SJung-uk Kim else 2024e71b7053SJung-uk Kim comp = NULL; 2025e71b7053SJung-uk Kim } 2026e71b7053SJung-uk Kim #else 2027e71b7053SJung-uk Kim /* 2028e71b7053SJung-uk Kim * If compression is disabled we'd better not try to resume a session 2029e71b7053SJung-uk Kim * using compression. 2030e71b7053SJung-uk Kim */ 2031e71b7053SJung-uk Kim if (s->session->compress_meth != 0) { 2032e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_HANDSHAKE_FAILURE, 2033e71b7053SJung-uk Kim SSL_F_TLS_EARLY_POST_PROCESS_CLIENT_HELLO, 2034e71b7053SJung-uk Kim SSL_R_INCONSISTENT_COMPRESSION); 2035e71b7053SJung-uk Kim goto err; 2036e71b7053SJung-uk Kim } 2037e71b7053SJung-uk Kim #endif 2038e71b7053SJung-uk Kim 2039e71b7053SJung-uk Kim /* 2040e71b7053SJung-uk Kim * Given s->session->ciphers and SSL_get_ciphers, we must pick a cipher 2041e71b7053SJung-uk Kim */ 2042e71b7053SJung-uk Kim 2043e71b7053SJung-uk Kim if (!s->hit || SSL_IS_TLS13(s)) { 2044e71b7053SJung-uk Kim sk_SSL_CIPHER_free(s->session->ciphers); 2045e71b7053SJung-uk Kim s->session->ciphers = ciphers; 2046e71b7053SJung-uk Kim if (ciphers == NULL) { 2047e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_INTERNAL_ERROR, 2048e71b7053SJung-uk Kim SSL_F_TLS_EARLY_POST_PROCESS_CLIENT_HELLO, 2049e71b7053SJung-uk Kim ERR_R_INTERNAL_ERROR); 2050e71b7053SJung-uk Kim goto err; 2051e71b7053SJung-uk Kim } 2052e71b7053SJung-uk Kim ciphers = NULL; 2053e71b7053SJung-uk Kim } 2054e71b7053SJung-uk Kim 2055e71b7053SJung-uk Kim if (!s->hit) { 2056e71b7053SJung-uk Kim #ifdef OPENSSL_NO_COMP 2057e71b7053SJung-uk Kim s->session->compress_meth = 0; 2058e71b7053SJung-uk Kim #else 2059e71b7053SJung-uk Kim s->session->compress_meth = (comp == NULL) ? 0 : comp->id; 2060e71b7053SJung-uk Kim #endif 2061e71b7053SJung-uk Kim } 2062e71b7053SJung-uk Kim 2063e71b7053SJung-uk Kim sk_SSL_CIPHER_free(ciphers); 2064e71b7053SJung-uk Kim sk_SSL_CIPHER_free(scsvs); 2065e71b7053SJung-uk Kim OPENSSL_free(clienthello->pre_proc_exts); 2066e71b7053SJung-uk Kim OPENSSL_free(s->clienthello); 2067e71b7053SJung-uk Kim s->clienthello = NULL; 2068e71b7053SJung-uk Kim return 1; 2069e71b7053SJung-uk Kim err: 2070e71b7053SJung-uk Kim sk_SSL_CIPHER_free(ciphers); 2071e71b7053SJung-uk Kim sk_SSL_CIPHER_free(scsvs); 2072e71b7053SJung-uk Kim OPENSSL_free(clienthello->pre_proc_exts); 2073e71b7053SJung-uk Kim OPENSSL_free(s->clienthello); 2074e71b7053SJung-uk Kim s->clienthello = NULL; 2075e71b7053SJung-uk Kim 2076e71b7053SJung-uk Kim return 0; 2077e71b7053SJung-uk Kim } 2078e71b7053SJung-uk Kim 2079e71b7053SJung-uk Kim /* 2080e71b7053SJung-uk Kim * Call the status request callback if needed. Upon success, returns 1. 2081e71b7053SJung-uk Kim * Upon failure, returns 0. 2082e71b7053SJung-uk Kim */ 2083e71b7053SJung-uk Kim static int tls_handle_status_request(SSL *s) 2084e71b7053SJung-uk Kim { 2085e71b7053SJung-uk Kim s->ext.status_expected = 0; 2086e71b7053SJung-uk Kim 2087e71b7053SJung-uk Kim /* 2088e71b7053SJung-uk Kim * If status request then ask callback what to do. Note: this must be 2089e71b7053SJung-uk Kim * called after servername callbacks in case the certificate has changed, 2090e71b7053SJung-uk Kim * and must be called after the cipher has been chosen because this may 2091e71b7053SJung-uk Kim * influence which certificate is sent 2092e71b7053SJung-uk Kim */ 2093e71b7053SJung-uk Kim if (s->ext.status_type != TLSEXT_STATUSTYPE_nothing && s->ctx != NULL 2094e71b7053SJung-uk Kim && s->ctx->ext.status_cb != NULL) { 2095e71b7053SJung-uk Kim int ret; 2096e71b7053SJung-uk Kim 2097e71b7053SJung-uk Kim /* If no certificate can't return certificate status */ 2098e71b7053SJung-uk Kim if (s->s3->tmp.cert != NULL) { 2099e71b7053SJung-uk Kim /* 2100e71b7053SJung-uk Kim * Set current certificate to one we will use so SSL_get_certificate 2101e71b7053SJung-uk Kim * et al can pick it up. 2102e71b7053SJung-uk Kim */ 2103e71b7053SJung-uk Kim s->cert->key = s->s3->tmp.cert; 2104e71b7053SJung-uk Kim ret = s->ctx->ext.status_cb(s, s->ctx->ext.status_arg); 2105e71b7053SJung-uk Kim switch (ret) { 2106e71b7053SJung-uk Kim /* We don't want to send a status request response */ 2107e71b7053SJung-uk Kim case SSL_TLSEXT_ERR_NOACK: 2108e71b7053SJung-uk Kim s->ext.status_expected = 0; 2109e71b7053SJung-uk Kim break; 2110e71b7053SJung-uk Kim /* status request response should be sent */ 2111e71b7053SJung-uk Kim case SSL_TLSEXT_ERR_OK: 2112e71b7053SJung-uk Kim if (s->ext.ocsp.resp) 2113e71b7053SJung-uk Kim s->ext.status_expected = 1; 2114e71b7053SJung-uk Kim break; 2115e71b7053SJung-uk Kim /* something bad happened */ 2116e71b7053SJung-uk Kim case SSL_TLSEXT_ERR_ALERT_FATAL: 2117e71b7053SJung-uk Kim default: 2118e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_INTERNAL_ERROR, 2119e71b7053SJung-uk Kim SSL_F_TLS_HANDLE_STATUS_REQUEST, 2120e71b7053SJung-uk Kim SSL_R_CLIENTHELLO_TLSEXT); 2121e71b7053SJung-uk Kim return 0; 2122e71b7053SJung-uk Kim } 2123e71b7053SJung-uk Kim } 2124e71b7053SJung-uk Kim } 2125e71b7053SJung-uk Kim 2126e71b7053SJung-uk Kim return 1; 2127e71b7053SJung-uk Kim } 2128e71b7053SJung-uk Kim 2129e71b7053SJung-uk Kim /* 2130e71b7053SJung-uk Kim * Call the alpn_select callback if needed. Upon success, returns 1. 2131e71b7053SJung-uk Kim * Upon failure, returns 0. 2132e71b7053SJung-uk Kim */ 2133e71b7053SJung-uk Kim int tls_handle_alpn(SSL *s) 2134e71b7053SJung-uk Kim { 2135e71b7053SJung-uk Kim const unsigned char *selected = NULL; 2136e71b7053SJung-uk Kim unsigned char selected_len = 0; 2137e71b7053SJung-uk Kim 2138e71b7053SJung-uk Kim if (s->ctx->ext.alpn_select_cb != NULL && s->s3->alpn_proposed != NULL) { 2139e71b7053SJung-uk Kim int r = s->ctx->ext.alpn_select_cb(s, &selected, &selected_len, 2140e71b7053SJung-uk Kim s->s3->alpn_proposed, 2141e71b7053SJung-uk Kim (unsigned int)s->s3->alpn_proposed_len, 2142e71b7053SJung-uk Kim s->ctx->ext.alpn_select_cb_arg); 2143e71b7053SJung-uk Kim 2144e71b7053SJung-uk Kim if (r == SSL_TLSEXT_ERR_OK) { 2145e71b7053SJung-uk Kim OPENSSL_free(s->s3->alpn_selected); 2146e71b7053SJung-uk Kim s->s3->alpn_selected = OPENSSL_memdup(selected, selected_len); 2147e71b7053SJung-uk Kim if (s->s3->alpn_selected == NULL) { 2148e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_TLS_HANDLE_ALPN, 2149e71b7053SJung-uk Kim ERR_R_INTERNAL_ERROR); 2150e71b7053SJung-uk Kim return 0; 2151e71b7053SJung-uk Kim } 2152e71b7053SJung-uk Kim s->s3->alpn_selected_len = selected_len; 2153e71b7053SJung-uk Kim #ifndef OPENSSL_NO_NEXTPROTONEG 2154e71b7053SJung-uk Kim /* ALPN takes precedence over NPN. */ 2155e71b7053SJung-uk Kim s->s3->npn_seen = 0; 2156e71b7053SJung-uk Kim #endif 2157e71b7053SJung-uk Kim 2158e71b7053SJung-uk Kim /* Check ALPN is consistent with session */ 2159e71b7053SJung-uk Kim if (s->session->ext.alpn_selected == NULL 2160e71b7053SJung-uk Kim || selected_len != s->session->ext.alpn_selected_len 2161e71b7053SJung-uk Kim || memcmp(selected, s->session->ext.alpn_selected, 2162e71b7053SJung-uk Kim selected_len) != 0) { 2163e71b7053SJung-uk Kim /* Not consistent so can't be used for early_data */ 2164e71b7053SJung-uk Kim s->ext.early_data_ok = 0; 2165e71b7053SJung-uk Kim 2166e71b7053SJung-uk Kim if (!s->hit) { 2167e71b7053SJung-uk Kim /* 2168e71b7053SJung-uk Kim * This is a new session and so alpn_selected should have 2169e71b7053SJung-uk Kim * been initialised to NULL. We should update it with the 2170e71b7053SJung-uk Kim * selected ALPN. 2171e71b7053SJung-uk Kim */ 2172e71b7053SJung-uk Kim if (!ossl_assert(s->session->ext.alpn_selected == NULL)) { 2173e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_INTERNAL_ERROR, 2174e71b7053SJung-uk Kim SSL_F_TLS_HANDLE_ALPN, 2175e71b7053SJung-uk Kim ERR_R_INTERNAL_ERROR); 2176e71b7053SJung-uk Kim return 0; 2177e71b7053SJung-uk Kim } 2178e71b7053SJung-uk Kim s->session->ext.alpn_selected = OPENSSL_memdup(selected, 2179e71b7053SJung-uk Kim selected_len); 2180e71b7053SJung-uk Kim if (s->session->ext.alpn_selected == NULL) { 2181e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_INTERNAL_ERROR, 2182e71b7053SJung-uk Kim SSL_F_TLS_HANDLE_ALPN, 2183e71b7053SJung-uk Kim ERR_R_INTERNAL_ERROR); 2184e71b7053SJung-uk Kim return 0; 2185e71b7053SJung-uk Kim } 2186e71b7053SJung-uk Kim s->session->ext.alpn_selected_len = selected_len; 2187e71b7053SJung-uk Kim } 2188e71b7053SJung-uk Kim } 2189e71b7053SJung-uk Kim 2190e71b7053SJung-uk Kim return 1; 2191e71b7053SJung-uk Kim } else if (r != SSL_TLSEXT_ERR_NOACK) { 2192e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_NO_APPLICATION_PROTOCOL, SSL_F_TLS_HANDLE_ALPN, 2193e71b7053SJung-uk Kim SSL_R_NO_APPLICATION_PROTOCOL); 2194e71b7053SJung-uk Kim return 0; 2195e71b7053SJung-uk Kim } 2196e71b7053SJung-uk Kim /* 2197e71b7053SJung-uk Kim * If r == SSL_TLSEXT_ERR_NOACK then behave as if no callback was 2198e71b7053SJung-uk Kim * present. 2199e71b7053SJung-uk Kim */ 2200e71b7053SJung-uk Kim } 2201e71b7053SJung-uk Kim 2202e71b7053SJung-uk Kim /* Check ALPN is consistent with session */ 2203e71b7053SJung-uk Kim if (s->session->ext.alpn_selected != NULL) { 2204e71b7053SJung-uk Kim /* Not consistent so can't be used for early_data */ 2205e71b7053SJung-uk Kim s->ext.early_data_ok = 0; 2206e71b7053SJung-uk Kim } 2207e71b7053SJung-uk Kim 2208e71b7053SJung-uk Kim return 1; 2209e71b7053SJung-uk Kim } 2210e71b7053SJung-uk Kim 2211e71b7053SJung-uk Kim WORK_STATE tls_post_process_client_hello(SSL *s, WORK_STATE wst) 2212e71b7053SJung-uk Kim { 2213e71b7053SJung-uk Kim const SSL_CIPHER *cipher; 2214e71b7053SJung-uk Kim 2215e71b7053SJung-uk Kim if (wst == WORK_MORE_A) { 2216e71b7053SJung-uk Kim int rv = tls_early_post_process_client_hello(s); 2217e71b7053SJung-uk Kim if (rv == 0) { 2218e71b7053SJung-uk Kim /* SSLfatal() was already called */ 2219e71b7053SJung-uk Kim goto err; 2220e71b7053SJung-uk Kim } 2221e71b7053SJung-uk Kim if (rv < 0) 2222e71b7053SJung-uk Kim return WORK_MORE_A; 2223e71b7053SJung-uk Kim wst = WORK_MORE_B; 2224e71b7053SJung-uk Kim } 2225e71b7053SJung-uk Kim if (wst == WORK_MORE_B) { 2226e71b7053SJung-uk Kim if (!s->hit || SSL_IS_TLS13(s)) { 2227e71b7053SJung-uk Kim /* Let cert callback update server certificates if required */ 2228*c9cf7b5cSJung-uk Kim if (!s->hit) { 2229*c9cf7b5cSJung-uk Kim if (s->cert->cert_cb != NULL) { 2230e71b7053SJung-uk Kim int rv = s->cert->cert_cb(s, s->cert->cert_cb_arg); 2231e71b7053SJung-uk Kim if (rv == 0) { 2232e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_INTERNAL_ERROR, 2233e71b7053SJung-uk Kim SSL_F_TLS_POST_PROCESS_CLIENT_HELLO, 2234e71b7053SJung-uk Kim SSL_R_CERT_CB_ERROR); 2235e71b7053SJung-uk Kim goto err; 2236e71b7053SJung-uk Kim } 2237e71b7053SJung-uk Kim if (rv < 0) { 2238e71b7053SJung-uk Kim s->rwstate = SSL_X509_LOOKUP; 2239e71b7053SJung-uk Kim return WORK_MORE_B; 2240e71b7053SJung-uk Kim } 2241e71b7053SJung-uk Kim s->rwstate = SSL_NOTHING; 2242e71b7053SJung-uk Kim } 2243*c9cf7b5cSJung-uk Kim if (!tls1_set_server_sigalgs(s)) { 2244*c9cf7b5cSJung-uk Kim /* SSLfatal already called */ 2245*c9cf7b5cSJung-uk Kim goto err; 2246*c9cf7b5cSJung-uk Kim } 2247*c9cf7b5cSJung-uk Kim } 2248e71b7053SJung-uk Kim 2249e71b7053SJung-uk Kim /* In TLSv1.3 we selected the ciphersuite before resumption */ 2250e71b7053SJung-uk Kim if (!SSL_IS_TLS13(s)) { 2251e71b7053SJung-uk Kim cipher = 2252e71b7053SJung-uk Kim ssl3_choose_cipher(s, s->session->ciphers, SSL_get_ciphers(s)); 2253e71b7053SJung-uk Kim 2254e71b7053SJung-uk Kim if (cipher == NULL) { 2255e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_HANDSHAKE_FAILURE, 2256e71b7053SJung-uk Kim SSL_F_TLS_POST_PROCESS_CLIENT_HELLO, 2257e71b7053SJung-uk Kim SSL_R_NO_SHARED_CIPHER); 2258e71b7053SJung-uk Kim goto err; 2259e71b7053SJung-uk Kim } 2260e71b7053SJung-uk Kim s->s3->tmp.new_cipher = cipher; 2261e71b7053SJung-uk Kim } 2262e71b7053SJung-uk Kim if (!s->hit) { 2263e71b7053SJung-uk Kim if (!tls_choose_sigalg(s, 1)) { 2264e71b7053SJung-uk Kim /* SSLfatal already called */ 2265e71b7053SJung-uk Kim goto err; 2266e71b7053SJung-uk Kim } 2267e71b7053SJung-uk Kim /* check whether we should disable session resumption */ 2268e71b7053SJung-uk Kim if (s->not_resumable_session_cb != NULL) 2269e71b7053SJung-uk Kim s->session->not_resumable = 2270e71b7053SJung-uk Kim s->not_resumable_session_cb(s, 2271e71b7053SJung-uk Kim ((s->s3->tmp.new_cipher->algorithm_mkey 2272e71b7053SJung-uk Kim & (SSL_kDHE | SSL_kECDHE)) != 0)); 2273e71b7053SJung-uk Kim if (s->session->not_resumable) 2274e71b7053SJung-uk Kim /* do not send a session ticket */ 2275e71b7053SJung-uk Kim s->ext.ticket_expected = 0; 2276e71b7053SJung-uk Kim } 2277e71b7053SJung-uk Kim } else { 2278e71b7053SJung-uk Kim /* Session-id reuse */ 2279e71b7053SJung-uk Kim s->s3->tmp.new_cipher = s->session->cipher; 2280e71b7053SJung-uk Kim } 2281e71b7053SJung-uk Kim 2282e71b7053SJung-uk Kim /*- 2283e71b7053SJung-uk Kim * we now have the following setup. 2284e71b7053SJung-uk Kim * client_random 2285e71b7053SJung-uk Kim * cipher_list - our preferred list of ciphers 2286e71b7053SJung-uk Kim * ciphers - the clients preferred list of ciphers 2287e71b7053SJung-uk Kim * compression - basically ignored right now 2288e71b7053SJung-uk Kim * ssl version is set - sslv3 2289e71b7053SJung-uk Kim * s->session - The ssl session has been setup. 2290e71b7053SJung-uk Kim * s->hit - session reuse flag 2291e71b7053SJung-uk Kim * s->s3->tmp.new_cipher- the new cipher to use. 2292e71b7053SJung-uk Kim */ 2293e71b7053SJung-uk Kim 2294e71b7053SJung-uk Kim /* 2295e71b7053SJung-uk Kim * Call status_request callback if needed. Has to be done after the 2296e71b7053SJung-uk Kim * certificate callbacks etc above. 2297e71b7053SJung-uk Kim */ 2298e71b7053SJung-uk Kim if (!tls_handle_status_request(s)) { 2299e71b7053SJung-uk Kim /* SSLfatal() already called */ 2300e71b7053SJung-uk Kim goto err; 2301e71b7053SJung-uk Kim } 2302e71b7053SJung-uk Kim /* 2303e71b7053SJung-uk Kim * Call alpn_select callback if needed. Has to be done after SNI and 2304e71b7053SJung-uk Kim * cipher negotiation (HTTP/2 restricts permitted ciphers). In TLSv1.3 2305e71b7053SJung-uk Kim * we already did this because cipher negotiation happens earlier, and 2306e71b7053SJung-uk Kim * we must handle ALPN before we decide whether to accept early_data. 2307e71b7053SJung-uk Kim */ 2308e71b7053SJung-uk Kim if (!SSL_IS_TLS13(s) && !tls_handle_alpn(s)) { 2309e71b7053SJung-uk Kim /* SSLfatal() already called */ 2310e71b7053SJung-uk Kim goto err; 2311e71b7053SJung-uk Kim } 2312e71b7053SJung-uk Kim 2313e71b7053SJung-uk Kim wst = WORK_MORE_C; 2314e71b7053SJung-uk Kim } 2315e71b7053SJung-uk Kim #ifndef OPENSSL_NO_SRP 2316e71b7053SJung-uk Kim if (wst == WORK_MORE_C) { 2317e71b7053SJung-uk Kim int ret; 2318e71b7053SJung-uk Kim if ((ret = ssl_check_srp_ext_ClientHello(s)) == 0) { 2319e71b7053SJung-uk Kim /* 2320e71b7053SJung-uk Kim * callback indicates further work to be done 2321e71b7053SJung-uk Kim */ 2322e71b7053SJung-uk Kim s->rwstate = SSL_X509_LOOKUP; 2323e71b7053SJung-uk Kim return WORK_MORE_C; 2324e71b7053SJung-uk Kim } 2325e71b7053SJung-uk Kim if (ret < 0) { 2326e71b7053SJung-uk Kim /* SSLfatal() already called */ 2327e71b7053SJung-uk Kim goto err; 2328e71b7053SJung-uk Kim } 2329e71b7053SJung-uk Kim } 2330e71b7053SJung-uk Kim #endif 2331e71b7053SJung-uk Kim 2332e71b7053SJung-uk Kim return WORK_FINISHED_STOP; 2333e71b7053SJung-uk Kim err: 2334e71b7053SJung-uk Kim return WORK_ERROR; 2335e71b7053SJung-uk Kim } 2336e71b7053SJung-uk Kim 2337e71b7053SJung-uk Kim int tls_construct_server_hello(SSL *s, WPACKET *pkt) 2338e71b7053SJung-uk Kim { 2339e71b7053SJung-uk Kim int compm; 2340e71b7053SJung-uk Kim size_t sl, len; 2341e71b7053SJung-uk Kim int version; 2342e71b7053SJung-uk Kim unsigned char *session_id; 2343e71b7053SJung-uk Kim int usetls13 = SSL_IS_TLS13(s) || s->hello_retry_request == SSL_HRR_PENDING; 2344e71b7053SJung-uk Kim 2345e71b7053SJung-uk Kim version = usetls13 ? TLS1_2_VERSION : s->version; 2346e71b7053SJung-uk Kim if (!WPACKET_put_bytes_u16(pkt, version) 2347e71b7053SJung-uk Kim /* 2348e71b7053SJung-uk Kim * Random stuff. Filling of the server_random takes place in 2349e71b7053SJung-uk Kim * tls_process_client_hello() 2350e71b7053SJung-uk Kim */ 2351e71b7053SJung-uk Kim || !WPACKET_memcpy(pkt, 2352e71b7053SJung-uk Kim s->hello_retry_request == SSL_HRR_PENDING 2353e71b7053SJung-uk Kim ? hrrrandom : s->s3->server_random, 2354e71b7053SJung-uk Kim SSL3_RANDOM_SIZE)) { 2355e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_TLS_CONSTRUCT_SERVER_HELLO, 2356e71b7053SJung-uk Kim ERR_R_INTERNAL_ERROR); 2357e71b7053SJung-uk Kim return 0; 2358e71b7053SJung-uk Kim } 2359e71b7053SJung-uk Kim 2360e71b7053SJung-uk Kim /*- 2361e71b7053SJung-uk Kim * There are several cases for the session ID to send 2362e71b7053SJung-uk Kim * back in the server hello: 2363e71b7053SJung-uk Kim * - For session reuse from the session cache, 2364e71b7053SJung-uk Kim * we send back the old session ID. 2365e71b7053SJung-uk Kim * - If stateless session reuse (using a session ticket) 2366e71b7053SJung-uk Kim * is successful, we send back the client's "session ID" 2367e71b7053SJung-uk Kim * (which doesn't actually identify the session). 2368e71b7053SJung-uk Kim * - If it is a new session, we send back the new 2369e71b7053SJung-uk Kim * session ID. 2370e71b7053SJung-uk Kim * - However, if we want the new session to be single-use, 2371e71b7053SJung-uk Kim * we send back a 0-length session ID. 2372e71b7053SJung-uk Kim * - In TLSv1.3 we echo back the session id sent to us by the client 2373e71b7053SJung-uk Kim * regardless 2374e71b7053SJung-uk Kim * s->hit is non-zero in either case of session reuse, 2375e71b7053SJung-uk Kim * so the following won't overwrite an ID that we're supposed 2376e71b7053SJung-uk Kim * to send back. 2377e71b7053SJung-uk Kim */ 2378e71b7053SJung-uk Kim if (s->session->not_resumable || 2379e71b7053SJung-uk Kim (!(s->ctx->session_cache_mode & SSL_SESS_CACHE_SERVER) 2380e71b7053SJung-uk Kim && !s->hit)) 2381e71b7053SJung-uk Kim s->session->session_id_length = 0; 2382e71b7053SJung-uk Kim 2383e71b7053SJung-uk Kim if (usetls13) { 2384e71b7053SJung-uk Kim sl = s->tmp_session_id_len; 2385e71b7053SJung-uk Kim session_id = s->tmp_session_id; 2386e71b7053SJung-uk Kim } else { 2387e71b7053SJung-uk Kim sl = s->session->session_id_length; 2388e71b7053SJung-uk Kim session_id = s->session->session_id; 2389e71b7053SJung-uk Kim } 2390e71b7053SJung-uk Kim 2391e71b7053SJung-uk Kim if (sl > sizeof(s->session->session_id)) { 2392e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_TLS_CONSTRUCT_SERVER_HELLO, 2393e71b7053SJung-uk Kim ERR_R_INTERNAL_ERROR); 2394e71b7053SJung-uk Kim return 0; 2395e71b7053SJung-uk Kim } 2396e71b7053SJung-uk Kim 2397e71b7053SJung-uk Kim /* set up the compression method */ 2398e71b7053SJung-uk Kim #ifdef OPENSSL_NO_COMP 2399e71b7053SJung-uk Kim compm = 0; 2400e71b7053SJung-uk Kim #else 2401e71b7053SJung-uk Kim if (usetls13 || s->s3->tmp.new_compression == NULL) 2402e71b7053SJung-uk Kim compm = 0; 2403e71b7053SJung-uk Kim else 2404e71b7053SJung-uk Kim compm = s->s3->tmp.new_compression->id; 2405e71b7053SJung-uk Kim #endif 2406e71b7053SJung-uk Kim 2407e71b7053SJung-uk Kim if (!WPACKET_sub_memcpy_u8(pkt, session_id, sl) 2408e71b7053SJung-uk Kim || !s->method->put_cipher_by_char(s->s3->tmp.new_cipher, pkt, &len) 2409e71b7053SJung-uk Kim || !WPACKET_put_bytes_u8(pkt, compm)) { 2410e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_TLS_CONSTRUCT_SERVER_HELLO, 2411e71b7053SJung-uk Kim ERR_R_INTERNAL_ERROR); 2412e71b7053SJung-uk Kim return 0; 2413e71b7053SJung-uk Kim } 2414e71b7053SJung-uk Kim 2415e71b7053SJung-uk Kim if (!tls_construct_extensions(s, pkt, 2416e71b7053SJung-uk Kim s->hello_retry_request == SSL_HRR_PENDING 2417e71b7053SJung-uk Kim ? SSL_EXT_TLS1_3_HELLO_RETRY_REQUEST 2418e71b7053SJung-uk Kim : (SSL_IS_TLS13(s) 2419e71b7053SJung-uk Kim ? SSL_EXT_TLS1_3_SERVER_HELLO 2420e71b7053SJung-uk Kim : SSL_EXT_TLS1_2_SERVER_HELLO), 2421e71b7053SJung-uk Kim NULL, 0)) { 2422e71b7053SJung-uk Kim /* SSLfatal() already called */ 2423e71b7053SJung-uk Kim return 0; 2424e71b7053SJung-uk Kim } 2425e71b7053SJung-uk Kim 2426e71b7053SJung-uk Kim if (s->hello_retry_request == SSL_HRR_PENDING) { 2427e71b7053SJung-uk Kim /* Ditch the session. We'll create a new one next time around */ 2428e71b7053SJung-uk Kim SSL_SESSION_free(s->session); 2429e71b7053SJung-uk Kim s->session = NULL; 2430e71b7053SJung-uk Kim s->hit = 0; 2431e71b7053SJung-uk Kim 2432e71b7053SJung-uk Kim /* 2433e71b7053SJung-uk Kim * Re-initialise the Transcript Hash. We're going to prepopulate it with 2434e71b7053SJung-uk Kim * a synthetic message_hash in place of ClientHello1. 2435e71b7053SJung-uk Kim */ 2436e71b7053SJung-uk Kim if (!create_synthetic_message_hash(s, NULL, 0, NULL, 0)) { 2437e71b7053SJung-uk Kim /* SSLfatal() already called */ 2438e71b7053SJung-uk Kim return 0; 2439e71b7053SJung-uk Kim } 2440e71b7053SJung-uk Kim } else if (!(s->verify_mode & SSL_VERIFY_PEER) 2441e71b7053SJung-uk Kim && !ssl3_digest_cached_records(s, 0)) { 2442e71b7053SJung-uk Kim /* SSLfatal() already called */; 2443e71b7053SJung-uk Kim return 0; 2444e71b7053SJung-uk Kim } 2445e71b7053SJung-uk Kim 2446e71b7053SJung-uk Kim return 1; 2447e71b7053SJung-uk Kim } 2448e71b7053SJung-uk Kim 2449e71b7053SJung-uk Kim int tls_construct_server_done(SSL *s, WPACKET *pkt) 2450e71b7053SJung-uk Kim { 2451e71b7053SJung-uk Kim if (!s->s3->tmp.cert_request) { 2452e71b7053SJung-uk Kim if (!ssl3_digest_cached_records(s, 0)) { 2453e71b7053SJung-uk Kim /* SSLfatal() already called */ 2454e71b7053SJung-uk Kim return 0; 2455e71b7053SJung-uk Kim } 2456e71b7053SJung-uk Kim } 2457e71b7053SJung-uk Kim return 1; 2458e71b7053SJung-uk Kim } 2459e71b7053SJung-uk Kim 2460e71b7053SJung-uk Kim int tls_construct_server_key_exchange(SSL *s, WPACKET *pkt) 2461e71b7053SJung-uk Kim { 2462e71b7053SJung-uk Kim #ifndef OPENSSL_NO_DH 2463e71b7053SJung-uk Kim EVP_PKEY *pkdh = NULL; 2464e71b7053SJung-uk Kim #endif 2465e71b7053SJung-uk Kim #ifndef OPENSSL_NO_EC 2466e71b7053SJung-uk Kim unsigned char *encodedPoint = NULL; 2467e71b7053SJung-uk Kim size_t encodedlen = 0; 2468e71b7053SJung-uk Kim int curve_id = 0; 2469e71b7053SJung-uk Kim #endif 2470e71b7053SJung-uk Kim const SIGALG_LOOKUP *lu = s->s3->tmp.sigalg; 2471e71b7053SJung-uk Kim int i; 2472e71b7053SJung-uk Kim unsigned long type; 2473e71b7053SJung-uk Kim const BIGNUM *r[4]; 2474e71b7053SJung-uk Kim EVP_MD_CTX *md_ctx = EVP_MD_CTX_new(); 2475e71b7053SJung-uk Kim EVP_PKEY_CTX *pctx = NULL; 2476e71b7053SJung-uk Kim size_t paramlen, paramoffset; 2477e71b7053SJung-uk Kim 2478e71b7053SJung-uk Kim if (!WPACKET_get_total_written(pkt, ¶moffset)) { 2479e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_INTERNAL_ERROR, 2480e71b7053SJung-uk Kim SSL_F_TLS_CONSTRUCT_SERVER_KEY_EXCHANGE, ERR_R_INTERNAL_ERROR); 2481e71b7053SJung-uk Kim goto err; 2482e71b7053SJung-uk Kim } 2483e71b7053SJung-uk Kim 2484e71b7053SJung-uk Kim if (md_ctx == NULL) { 2485e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_INTERNAL_ERROR, 2486e71b7053SJung-uk Kim SSL_F_TLS_CONSTRUCT_SERVER_KEY_EXCHANGE, ERR_R_MALLOC_FAILURE); 2487e71b7053SJung-uk Kim goto err; 2488e71b7053SJung-uk Kim } 2489e71b7053SJung-uk Kim 2490e71b7053SJung-uk Kim type = s->s3->tmp.new_cipher->algorithm_mkey; 2491e71b7053SJung-uk Kim 2492e71b7053SJung-uk Kim r[0] = r[1] = r[2] = r[3] = NULL; 2493e71b7053SJung-uk Kim #ifndef OPENSSL_NO_PSK 2494e71b7053SJung-uk Kim /* Plain PSK or RSAPSK nothing to do */ 2495e71b7053SJung-uk Kim if (type & (SSL_kPSK | SSL_kRSAPSK)) { 2496e71b7053SJung-uk Kim } else 2497e71b7053SJung-uk Kim #endif /* !OPENSSL_NO_PSK */ 2498e71b7053SJung-uk Kim #ifndef OPENSSL_NO_DH 2499e71b7053SJung-uk Kim if (type & (SSL_kDHE | SSL_kDHEPSK)) { 2500e71b7053SJung-uk Kim CERT *cert = s->cert; 2501e71b7053SJung-uk Kim 2502e71b7053SJung-uk Kim EVP_PKEY *pkdhp = NULL; 2503e71b7053SJung-uk Kim DH *dh; 2504e71b7053SJung-uk Kim 2505e71b7053SJung-uk Kim if (s->cert->dh_tmp_auto) { 2506e71b7053SJung-uk Kim DH *dhp = ssl_get_auto_dh(s); 2507e71b7053SJung-uk Kim pkdh = EVP_PKEY_new(); 2508e71b7053SJung-uk Kim if (pkdh == NULL || dhp == NULL) { 2509e71b7053SJung-uk Kim DH_free(dhp); 2510e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_INTERNAL_ERROR, 2511e71b7053SJung-uk Kim SSL_F_TLS_CONSTRUCT_SERVER_KEY_EXCHANGE, 2512e71b7053SJung-uk Kim ERR_R_INTERNAL_ERROR); 2513e71b7053SJung-uk Kim goto err; 2514e71b7053SJung-uk Kim } 2515e71b7053SJung-uk Kim EVP_PKEY_assign_DH(pkdh, dhp); 2516e71b7053SJung-uk Kim pkdhp = pkdh; 2517e71b7053SJung-uk Kim } else { 2518e71b7053SJung-uk Kim pkdhp = cert->dh_tmp; 2519e71b7053SJung-uk Kim } 2520e71b7053SJung-uk Kim if ((pkdhp == NULL) && (s->cert->dh_tmp_cb != NULL)) { 2521e71b7053SJung-uk Kim DH *dhp = s->cert->dh_tmp_cb(s, 0, 1024); 2522e71b7053SJung-uk Kim pkdh = ssl_dh_to_pkey(dhp); 2523e71b7053SJung-uk Kim if (pkdh == NULL) { 2524e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_INTERNAL_ERROR, 2525e71b7053SJung-uk Kim SSL_F_TLS_CONSTRUCT_SERVER_KEY_EXCHANGE, 2526e71b7053SJung-uk Kim ERR_R_INTERNAL_ERROR); 2527e71b7053SJung-uk Kim goto err; 2528e71b7053SJung-uk Kim } 2529e71b7053SJung-uk Kim pkdhp = pkdh; 2530e71b7053SJung-uk Kim } 2531e71b7053SJung-uk Kim if (pkdhp == NULL) { 2532e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_INTERNAL_ERROR, 2533e71b7053SJung-uk Kim SSL_F_TLS_CONSTRUCT_SERVER_KEY_EXCHANGE, 2534e71b7053SJung-uk Kim SSL_R_MISSING_TMP_DH_KEY); 2535e71b7053SJung-uk Kim goto err; 2536e71b7053SJung-uk Kim } 2537e71b7053SJung-uk Kim if (!ssl_security(s, SSL_SECOP_TMP_DH, 2538e71b7053SJung-uk Kim EVP_PKEY_security_bits(pkdhp), 0, pkdhp)) { 2539e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_HANDSHAKE_FAILURE, 2540e71b7053SJung-uk Kim SSL_F_TLS_CONSTRUCT_SERVER_KEY_EXCHANGE, 2541e71b7053SJung-uk Kim SSL_R_DH_KEY_TOO_SMALL); 2542e71b7053SJung-uk Kim goto err; 2543e71b7053SJung-uk Kim } 2544e71b7053SJung-uk Kim if (s->s3->tmp.pkey != NULL) { 2545e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_INTERNAL_ERROR, 2546e71b7053SJung-uk Kim SSL_F_TLS_CONSTRUCT_SERVER_KEY_EXCHANGE, 2547e71b7053SJung-uk Kim ERR_R_INTERNAL_ERROR); 2548e71b7053SJung-uk Kim goto err; 2549e71b7053SJung-uk Kim } 2550e71b7053SJung-uk Kim 2551e71b7053SJung-uk Kim s->s3->tmp.pkey = ssl_generate_pkey(pkdhp); 2552e71b7053SJung-uk Kim if (s->s3->tmp.pkey == NULL) { 2553e71b7053SJung-uk Kim /* SSLfatal() already called */ 2554e71b7053SJung-uk Kim goto err; 2555e71b7053SJung-uk Kim } 2556e71b7053SJung-uk Kim 2557e71b7053SJung-uk Kim dh = EVP_PKEY_get0_DH(s->s3->tmp.pkey); 2558e71b7053SJung-uk Kim if (dh == NULL) { 2559e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_INTERNAL_ERROR, 2560e71b7053SJung-uk Kim SSL_F_TLS_CONSTRUCT_SERVER_KEY_EXCHANGE, 2561e71b7053SJung-uk Kim ERR_R_INTERNAL_ERROR); 2562e71b7053SJung-uk Kim goto err; 2563e71b7053SJung-uk Kim } 2564e71b7053SJung-uk Kim 2565e71b7053SJung-uk Kim EVP_PKEY_free(pkdh); 2566e71b7053SJung-uk Kim pkdh = NULL; 2567e71b7053SJung-uk Kim 2568e71b7053SJung-uk Kim DH_get0_pqg(dh, &r[0], NULL, &r[1]); 2569e71b7053SJung-uk Kim DH_get0_key(dh, &r[2], NULL); 2570e71b7053SJung-uk Kim } else 2571e71b7053SJung-uk Kim #endif 2572e71b7053SJung-uk Kim #ifndef OPENSSL_NO_EC 2573e71b7053SJung-uk Kim if (type & (SSL_kECDHE | SSL_kECDHEPSK)) { 2574e71b7053SJung-uk Kim 2575e71b7053SJung-uk Kim if (s->s3->tmp.pkey != NULL) { 2576e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_INTERNAL_ERROR, 2577e71b7053SJung-uk Kim SSL_F_TLS_CONSTRUCT_SERVER_KEY_EXCHANGE, 2578e71b7053SJung-uk Kim ERR_R_INTERNAL_ERROR); 2579e71b7053SJung-uk Kim goto err; 2580e71b7053SJung-uk Kim } 2581e71b7053SJung-uk Kim 2582e71b7053SJung-uk Kim /* Get NID of appropriate shared curve */ 2583e71b7053SJung-uk Kim curve_id = tls1_shared_group(s, -2); 2584e71b7053SJung-uk Kim if (curve_id == 0) { 2585e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_HANDSHAKE_FAILURE, 2586e71b7053SJung-uk Kim SSL_F_TLS_CONSTRUCT_SERVER_KEY_EXCHANGE, 2587e71b7053SJung-uk Kim SSL_R_UNSUPPORTED_ELLIPTIC_CURVE); 2588e71b7053SJung-uk Kim goto err; 2589e71b7053SJung-uk Kim } 2590e71b7053SJung-uk Kim s->s3->tmp.pkey = ssl_generate_pkey_group(s, curve_id); 2591e71b7053SJung-uk Kim /* Generate a new key for this curve */ 2592e71b7053SJung-uk Kim if (s->s3->tmp.pkey == NULL) { 2593e71b7053SJung-uk Kim /* SSLfatal() already called */ 2594e71b7053SJung-uk Kim goto err; 2595e71b7053SJung-uk Kim } 2596e71b7053SJung-uk Kim 2597e71b7053SJung-uk Kim /* Encode the public key. */ 2598e71b7053SJung-uk Kim encodedlen = EVP_PKEY_get1_tls_encodedpoint(s->s3->tmp.pkey, 2599e71b7053SJung-uk Kim &encodedPoint); 2600e71b7053SJung-uk Kim if (encodedlen == 0) { 2601e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_INTERNAL_ERROR, 2602e71b7053SJung-uk Kim SSL_F_TLS_CONSTRUCT_SERVER_KEY_EXCHANGE, ERR_R_EC_LIB); 2603e71b7053SJung-uk Kim goto err; 2604e71b7053SJung-uk Kim } 2605e71b7053SJung-uk Kim 2606e71b7053SJung-uk Kim /* 2607e71b7053SJung-uk Kim * We'll generate the serverKeyExchange message explicitly so we 2608e71b7053SJung-uk Kim * can set these to NULLs 2609e71b7053SJung-uk Kim */ 2610e71b7053SJung-uk Kim r[0] = NULL; 2611e71b7053SJung-uk Kim r[1] = NULL; 2612e71b7053SJung-uk Kim r[2] = NULL; 2613e71b7053SJung-uk Kim r[3] = NULL; 2614e71b7053SJung-uk Kim } else 2615e71b7053SJung-uk Kim #endif /* !OPENSSL_NO_EC */ 2616e71b7053SJung-uk Kim #ifndef OPENSSL_NO_SRP 2617e71b7053SJung-uk Kim if (type & SSL_kSRP) { 2618e71b7053SJung-uk Kim if ((s->srp_ctx.N == NULL) || 2619e71b7053SJung-uk Kim (s->srp_ctx.g == NULL) || 2620e71b7053SJung-uk Kim (s->srp_ctx.s == NULL) || (s->srp_ctx.B == NULL)) { 2621e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_INTERNAL_ERROR, 2622e71b7053SJung-uk Kim SSL_F_TLS_CONSTRUCT_SERVER_KEY_EXCHANGE, 2623e71b7053SJung-uk Kim SSL_R_MISSING_SRP_PARAM); 2624e71b7053SJung-uk Kim goto err; 2625e71b7053SJung-uk Kim } 2626e71b7053SJung-uk Kim r[0] = s->srp_ctx.N; 2627e71b7053SJung-uk Kim r[1] = s->srp_ctx.g; 2628e71b7053SJung-uk Kim r[2] = s->srp_ctx.s; 2629e71b7053SJung-uk Kim r[3] = s->srp_ctx.B; 2630e71b7053SJung-uk Kim } else 2631e71b7053SJung-uk Kim #endif 2632e71b7053SJung-uk Kim { 2633e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_INTERNAL_ERROR, 2634e71b7053SJung-uk Kim SSL_F_TLS_CONSTRUCT_SERVER_KEY_EXCHANGE, 2635e71b7053SJung-uk Kim SSL_R_UNKNOWN_KEY_EXCHANGE_TYPE); 2636e71b7053SJung-uk Kim goto err; 2637e71b7053SJung-uk Kim } 2638e71b7053SJung-uk Kim 2639e71b7053SJung-uk Kim if (((s->s3->tmp.new_cipher->algorithm_auth & (SSL_aNULL | SSL_aSRP)) != 0) 2640e71b7053SJung-uk Kim || ((s->s3->tmp.new_cipher->algorithm_mkey & SSL_PSK)) != 0) { 2641e71b7053SJung-uk Kim lu = NULL; 2642e71b7053SJung-uk Kim } else if (lu == NULL) { 2643e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_DECODE_ERROR, 2644e71b7053SJung-uk Kim SSL_F_TLS_CONSTRUCT_SERVER_KEY_EXCHANGE, ERR_R_INTERNAL_ERROR); 2645e71b7053SJung-uk Kim goto err; 2646e71b7053SJung-uk Kim } 2647e71b7053SJung-uk Kim 2648e71b7053SJung-uk Kim #ifndef OPENSSL_NO_PSK 2649e71b7053SJung-uk Kim if (type & SSL_PSK) { 2650e71b7053SJung-uk Kim size_t len = (s->cert->psk_identity_hint == NULL) 2651e71b7053SJung-uk Kim ? 0 : strlen(s->cert->psk_identity_hint); 2652e71b7053SJung-uk Kim 2653e71b7053SJung-uk Kim /* 2654e71b7053SJung-uk Kim * It should not happen that len > PSK_MAX_IDENTITY_LEN - we already 2655e71b7053SJung-uk Kim * checked this when we set the identity hint - but just in case 2656e71b7053SJung-uk Kim */ 2657e71b7053SJung-uk Kim if (len > PSK_MAX_IDENTITY_LEN 2658e71b7053SJung-uk Kim || !WPACKET_sub_memcpy_u16(pkt, s->cert->psk_identity_hint, 2659e71b7053SJung-uk Kim len)) { 2660e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_INTERNAL_ERROR, 2661e71b7053SJung-uk Kim SSL_F_TLS_CONSTRUCT_SERVER_KEY_EXCHANGE, 2662e71b7053SJung-uk Kim ERR_R_INTERNAL_ERROR); 2663e71b7053SJung-uk Kim goto err; 2664e71b7053SJung-uk Kim } 2665e71b7053SJung-uk Kim } 2666e71b7053SJung-uk Kim #endif 2667e71b7053SJung-uk Kim 2668e71b7053SJung-uk Kim for (i = 0; i < 4 && r[i] != NULL; i++) { 2669e71b7053SJung-uk Kim unsigned char *binval; 2670e71b7053SJung-uk Kim int res; 2671e71b7053SJung-uk Kim 2672e71b7053SJung-uk Kim #ifndef OPENSSL_NO_SRP 2673e71b7053SJung-uk Kim if ((i == 2) && (type & SSL_kSRP)) { 2674e71b7053SJung-uk Kim res = WPACKET_start_sub_packet_u8(pkt); 2675e71b7053SJung-uk Kim } else 2676e71b7053SJung-uk Kim #endif 2677e71b7053SJung-uk Kim res = WPACKET_start_sub_packet_u16(pkt); 2678e71b7053SJung-uk Kim 2679e71b7053SJung-uk Kim if (!res) { 2680e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_INTERNAL_ERROR, 2681e71b7053SJung-uk Kim SSL_F_TLS_CONSTRUCT_SERVER_KEY_EXCHANGE, 2682e71b7053SJung-uk Kim ERR_R_INTERNAL_ERROR); 2683e71b7053SJung-uk Kim goto err; 2684e71b7053SJung-uk Kim } 2685e71b7053SJung-uk Kim 2686e71b7053SJung-uk Kim #ifndef OPENSSL_NO_DH 2687e71b7053SJung-uk Kim /*- 2688e71b7053SJung-uk Kim * for interoperability with some versions of the Microsoft TLS 2689e71b7053SJung-uk Kim * stack, we need to zero pad the DHE pub key to the same length 2690e71b7053SJung-uk Kim * as the prime 2691e71b7053SJung-uk Kim */ 2692e71b7053SJung-uk Kim if ((i == 2) && (type & (SSL_kDHE | SSL_kDHEPSK))) { 2693e71b7053SJung-uk Kim size_t len = BN_num_bytes(r[0]) - BN_num_bytes(r[2]); 2694e71b7053SJung-uk Kim 2695e71b7053SJung-uk Kim if (len > 0) { 2696e71b7053SJung-uk Kim if (!WPACKET_allocate_bytes(pkt, len, &binval)) { 2697e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_INTERNAL_ERROR, 2698e71b7053SJung-uk Kim SSL_F_TLS_CONSTRUCT_SERVER_KEY_EXCHANGE, 2699e71b7053SJung-uk Kim ERR_R_INTERNAL_ERROR); 2700e71b7053SJung-uk Kim goto err; 2701e71b7053SJung-uk Kim } 2702e71b7053SJung-uk Kim memset(binval, 0, len); 2703e71b7053SJung-uk Kim } 2704e71b7053SJung-uk Kim } 2705e71b7053SJung-uk Kim #endif 2706e71b7053SJung-uk Kim if (!WPACKET_allocate_bytes(pkt, BN_num_bytes(r[i]), &binval) 2707e71b7053SJung-uk Kim || !WPACKET_close(pkt)) { 2708e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_INTERNAL_ERROR, 2709e71b7053SJung-uk Kim SSL_F_TLS_CONSTRUCT_SERVER_KEY_EXCHANGE, 2710e71b7053SJung-uk Kim ERR_R_INTERNAL_ERROR); 2711e71b7053SJung-uk Kim goto err; 2712e71b7053SJung-uk Kim } 2713e71b7053SJung-uk Kim 2714e71b7053SJung-uk Kim BN_bn2bin(r[i], binval); 2715e71b7053SJung-uk Kim } 2716e71b7053SJung-uk Kim 2717e71b7053SJung-uk Kim #ifndef OPENSSL_NO_EC 2718e71b7053SJung-uk Kim if (type & (SSL_kECDHE | SSL_kECDHEPSK)) { 2719e71b7053SJung-uk Kim /* 2720e71b7053SJung-uk Kim * We only support named (not generic) curves. In this situation, the 2721e71b7053SJung-uk Kim * ServerKeyExchange message has: [1 byte CurveType], [2 byte CurveName] 2722e71b7053SJung-uk Kim * [1 byte length of encoded point], followed by the actual encoded 2723e71b7053SJung-uk Kim * point itself 2724e71b7053SJung-uk Kim */ 2725e71b7053SJung-uk Kim if (!WPACKET_put_bytes_u8(pkt, NAMED_CURVE_TYPE) 2726e71b7053SJung-uk Kim || !WPACKET_put_bytes_u8(pkt, 0) 2727e71b7053SJung-uk Kim || !WPACKET_put_bytes_u8(pkt, curve_id) 2728e71b7053SJung-uk Kim || !WPACKET_sub_memcpy_u8(pkt, encodedPoint, encodedlen)) { 2729e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_INTERNAL_ERROR, 2730e71b7053SJung-uk Kim SSL_F_TLS_CONSTRUCT_SERVER_KEY_EXCHANGE, 2731e71b7053SJung-uk Kim ERR_R_INTERNAL_ERROR); 2732e71b7053SJung-uk Kim goto err; 2733e71b7053SJung-uk Kim } 2734e71b7053SJung-uk Kim OPENSSL_free(encodedPoint); 2735e71b7053SJung-uk Kim encodedPoint = NULL; 2736e71b7053SJung-uk Kim } 2737e71b7053SJung-uk Kim #endif 2738e71b7053SJung-uk Kim 2739e71b7053SJung-uk Kim /* not anonymous */ 2740e71b7053SJung-uk Kim if (lu != NULL) { 2741e71b7053SJung-uk Kim EVP_PKEY *pkey = s->s3->tmp.cert->privatekey; 2742e71b7053SJung-uk Kim const EVP_MD *md; 2743e71b7053SJung-uk Kim unsigned char *sigbytes1, *sigbytes2, *tbs; 2744e71b7053SJung-uk Kim size_t siglen, tbslen; 2745e71b7053SJung-uk Kim int rv; 2746e71b7053SJung-uk Kim 2747e71b7053SJung-uk Kim if (pkey == NULL || !tls1_lookup_md(lu, &md)) { 2748e71b7053SJung-uk Kim /* Should never happen */ 2749e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_INTERNAL_ERROR, 2750e71b7053SJung-uk Kim SSL_F_TLS_CONSTRUCT_SERVER_KEY_EXCHANGE, 2751e71b7053SJung-uk Kim ERR_R_INTERNAL_ERROR); 2752e71b7053SJung-uk Kim goto err; 2753e71b7053SJung-uk Kim } 2754e71b7053SJung-uk Kim /* Get length of the parameters we have written above */ 2755e71b7053SJung-uk Kim if (!WPACKET_get_length(pkt, ¶mlen)) { 2756e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_INTERNAL_ERROR, 2757e71b7053SJung-uk Kim SSL_F_TLS_CONSTRUCT_SERVER_KEY_EXCHANGE, 2758e71b7053SJung-uk Kim ERR_R_INTERNAL_ERROR); 2759e71b7053SJung-uk Kim goto err; 2760e71b7053SJung-uk Kim } 2761e71b7053SJung-uk Kim /* send signature algorithm */ 2762e71b7053SJung-uk Kim if (SSL_USE_SIGALGS(s) && !WPACKET_put_bytes_u16(pkt, lu->sigalg)) { 2763e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_INTERNAL_ERROR, 2764e71b7053SJung-uk Kim SSL_F_TLS_CONSTRUCT_SERVER_KEY_EXCHANGE, 2765e71b7053SJung-uk Kim ERR_R_INTERNAL_ERROR); 2766e71b7053SJung-uk Kim goto err; 2767e71b7053SJung-uk Kim } 2768e71b7053SJung-uk Kim /* 2769e71b7053SJung-uk Kim * Create the signature. We don't know the actual length of the sig 2770e71b7053SJung-uk Kim * until after we've created it, so we reserve enough bytes for it 2771e71b7053SJung-uk Kim * up front, and then properly allocate them in the WPACKET 2772e71b7053SJung-uk Kim * afterwards. 2773e71b7053SJung-uk Kim */ 2774e71b7053SJung-uk Kim siglen = EVP_PKEY_size(pkey); 2775e71b7053SJung-uk Kim if (!WPACKET_sub_reserve_bytes_u16(pkt, siglen, &sigbytes1) 2776e71b7053SJung-uk Kim || EVP_DigestSignInit(md_ctx, &pctx, md, NULL, pkey) <= 0) { 2777e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_INTERNAL_ERROR, 2778e71b7053SJung-uk Kim SSL_F_TLS_CONSTRUCT_SERVER_KEY_EXCHANGE, 2779e71b7053SJung-uk Kim ERR_R_INTERNAL_ERROR); 2780e71b7053SJung-uk Kim goto err; 2781e71b7053SJung-uk Kim } 2782e71b7053SJung-uk Kim if (lu->sig == EVP_PKEY_RSA_PSS) { 2783e71b7053SJung-uk Kim if (EVP_PKEY_CTX_set_rsa_padding(pctx, RSA_PKCS1_PSS_PADDING) <= 0 2784e71b7053SJung-uk Kim || EVP_PKEY_CTX_set_rsa_pss_saltlen(pctx, RSA_PSS_SALTLEN_DIGEST) <= 0) { 2785e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_INTERNAL_ERROR, 2786e71b7053SJung-uk Kim SSL_F_TLS_CONSTRUCT_SERVER_KEY_EXCHANGE, 2787e71b7053SJung-uk Kim ERR_R_EVP_LIB); 2788e71b7053SJung-uk Kim goto err; 2789e71b7053SJung-uk Kim } 2790e71b7053SJung-uk Kim } 2791e71b7053SJung-uk Kim tbslen = construct_key_exchange_tbs(s, &tbs, 2792e71b7053SJung-uk Kim s->init_buf->data + paramoffset, 2793e71b7053SJung-uk Kim paramlen); 2794e71b7053SJung-uk Kim if (tbslen == 0) { 2795e71b7053SJung-uk Kim /* SSLfatal() already called */ 2796e71b7053SJung-uk Kim goto err; 2797e71b7053SJung-uk Kim } 2798e71b7053SJung-uk Kim rv = EVP_DigestSign(md_ctx, sigbytes1, &siglen, tbs, tbslen); 2799e71b7053SJung-uk Kim OPENSSL_free(tbs); 2800e71b7053SJung-uk Kim if (rv <= 0 || !WPACKET_sub_allocate_bytes_u16(pkt, siglen, &sigbytes2) 2801e71b7053SJung-uk Kim || sigbytes1 != sigbytes2) { 2802e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_INTERNAL_ERROR, 2803e71b7053SJung-uk Kim SSL_F_TLS_CONSTRUCT_SERVER_KEY_EXCHANGE, 2804e71b7053SJung-uk Kim ERR_R_INTERNAL_ERROR); 2805e71b7053SJung-uk Kim goto err; 2806e71b7053SJung-uk Kim } 2807e71b7053SJung-uk Kim } 2808e71b7053SJung-uk Kim 2809e71b7053SJung-uk Kim EVP_MD_CTX_free(md_ctx); 2810e71b7053SJung-uk Kim return 1; 2811e71b7053SJung-uk Kim err: 2812e71b7053SJung-uk Kim #ifndef OPENSSL_NO_DH 2813e71b7053SJung-uk Kim EVP_PKEY_free(pkdh); 2814e71b7053SJung-uk Kim #endif 2815e71b7053SJung-uk Kim #ifndef OPENSSL_NO_EC 2816e71b7053SJung-uk Kim OPENSSL_free(encodedPoint); 2817e71b7053SJung-uk Kim #endif 2818e71b7053SJung-uk Kim EVP_MD_CTX_free(md_ctx); 2819e71b7053SJung-uk Kim return 0; 2820e71b7053SJung-uk Kim } 2821e71b7053SJung-uk Kim 2822e71b7053SJung-uk Kim int tls_construct_certificate_request(SSL *s, WPACKET *pkt) 2823e71b7053SJung-uk Kim { 2824e71b7053SJung-uk Kim if (SSL_IS_TLS13(s)) { 2825e71b7053SJung-uk Kim /* Send random context when doing post-handshake auth */ 2826e71b7053SJung-uk Kim if (s->post_handshake_auth == SSL_PHA_REQUEST_PENDING) { 2827e71b7053SJung-uk Kim OPENSSL_free(s->pha_context); 2828e71b7053SJung-uk Kim s->pha_context_len = 32; 2829e71b7053SJung-uk Kim if ((s->pha_context = OPENSSL_malloc(s->pha_context_len)) == NULL 2830e71b7053SJung-uk Kim || RAND_bytes(s->pha_context, s->pha_context_len) <= 0 2831e71b7053SJung-uk Kim || !WPACKET_sub_memcpy_u8(pkt, s->pha_context, s->pha_context_len)) { 2832e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_INTERNAL_ERROR, 2833e71b7053SJung-uk Kim SSL_F_TLS_CONSTRUCT_CERTIFICATE_REQUEST, 2834e71b7053SJung-uk Kim ERR_R_INTERNAL_ERROR); 2835e71b7053SJung-uk Kim return 0; 2836e71b7053SJung-uk Kim } 2837e71b7053SJung-uk Kim /* reset the handshake hash back to just after the ClientFinished */ 2838e71b7053SJung-uk Kim if (!tls13_restore_handshake_digest_for_pha(s)) { 2839e71b7053SJung-uk Kim /* SSLfatal() already called */ 2840e71b7053SJung-uk Kim return 0; 2841e71b7053SJung-uk Kim } 2842e71b7053SJung-uk Kim } else { 2843e71b7053SJung-uk Kim if (!WPACKET_put_bytes_u8(pkt, 0)) { 2844e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_INTERNAL_ERROR, 2845e71b7053SJung-uk Kim SSL_F_TLS_CONSTRUCT_CERTIFICATE_REQUEST, 2846e71b7053SJung-uk Kim ERR_R_INTERNAL_ERROR); 2847e71b7053SJung-uk Kim return 0; 2848e71b7053SJung-uk Kim } 2849e71b7053SJung-uk Kim } 2850e71b7053SJung-uk Kim 2851e71b7053SJung-uk Kim if (!tls_construct_extensions(s, pkt, 2852e71b7053SJung-uk Kim SSL_EXT_TLS1_3_CERTIFICATE_REQUEST, NULL, 2853e71b7053SJung-uk Kim 0)) { 2854e71b7053SJung-uk Kim /* SSLfatal() already called */ 2855e71b7053SJung-uk Kim return 0; 2856e71b7053SJung-uk Kim } 2857e71b7053SJung-uk Kim goto done; 2858e71b7053SJung-uk Kim } 2859e71b7053SJung-uk Kim 2860e71b7053SJung-uk Kim /* get the list of acceptable cert types */ 2861e71b7053SJung-uk Kim if (!WPACKET_start_sub_packet_u8(pkt) 2862e71b7053SJung-uk Kim || !ssl3_get_req_cert_type(s, pkt) || !WPACKET_close(pkt)) { 2863e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_INTERNAL_ERROR, 2864e71b7053SJung-uk Kim SSL_F_TLS_CONSTRUCT_CERTIFICATE_REQUEST, ERR_R_INTERNAL_ERROR); 2865e71b7053SJung-uk Kim return 0; 2866e71b7053SJung-uk Kim } 2867e71b7053SJung-uk Kim 2868e71b7053SJung-uk Kim if (SSL_USE_SIGALGS(s)) { 2869e71b7053SJung-uk Kim const uint16_t *psigs; 2870e71b7053SJung-uk Kim size_t nl = tls12_get_psigalgs(s, 1, &psigs); 2871e71b7053SJung-uk Kim 2872e71b7053SJung-uk Kim if (!WPACKET_start_sub_packet_u16(pkt) 2873e71b7053SJung-uk Kim || !WPACKET_set_flags(pkt, WPACKET_FLAGS_NON_ZERO_LENGTH) 2874e71b7053SJung-uk Kim || !tls12_copy_sigalgs(s, pkt, psigs, nl) 2875e71b7053SJung-uk Kim || !WPACKET_close(pkt)) { 2876e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_INTERNAL_ERROR, 2877e71b7053SJung-uk Kim SSL_F_TLS_CONSTRUCT_CERTIFICATE_REQUEST, 2878e71b7053SJung-uk Kim ERR_R_INTERNAL_ERROR); 2879e71b7053SJung-uk Kim return 0; 2880e71b7053SJung-uk Kim } 2881e71b7053SJung-uk Kim } 2882e71b7053SJung-uk Kim 2883*c9cf7b5cSJung-uk Kim if (!construct_ca_names(s, get_ca_names(s), pkt)) { 2884e71b7053SJung-uk Kim /* SSLfatal() already called */ 2885e71b7053SJung-uk Kim return 0; 2886e71b7053SJung-uk Kim } 2887e71b7053SJung-uk Kim 2888e71b7053SJung-uk Kim done: 2889e71b7053SJung-uk Kim s->certreqs_sent++; 2890e71b7053SJung-uk Kim s->s3->tmp.cert_request = 1; 2891e71b7053SJung-uk Kim return 1; 2892e71b7053SJung-uk Kim } 2893e71b7053SJung-uk Kim 2894e71b7053SJung-uk Kim static int tls_process_cke_psk_preamble(SSL *s, PACKET *pkt) 2895e71b7053SJung-uk Kim { 2896e71b7053SJung-uk Kim #ifndef OPENSSL_NO_PSK 2897e71b7053SJung-uk Kim unsigned char psk[PSK_MAX_PSK_LEN]; 2898e71b7053SJung-uk Kim size_t psklen; 2899e71b7053SJung-uk Kim PACKET psk_identity; 2900e71b7053SJung-uk Kim 2901e71b7053SJung-uk Kim if (!PACKET_get_length_prefixed_2(pkt, &psk_identity)) { 2902e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_DECODE_ERROR, SSL_F_TLS_PROCESS_CKE_PSK_PREAMBLE, 2903e71b7053SJung-uk Kim SSL_R_LENGTH_MISMATCH); 2904e71b7053SJung-uk Kim return 0; 2905e71b7053SJung-uk Kim } 2906e71b7053SJung-uk Kim if (PACKET_remaining(&psk_identity) > PSK_MAX_IDENTITY_LEN) { 2907e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_DECODE_ERROR, SSL_F_TLS_PROCESS_CKE_PSK_PREAMBLE, 2908e71b7053SJung-uk Kim SSL_R_DATA_LENGTH_TOO_LONG); 2909e71b7053SJung-uk Kim return 0; 2910e71b7053SJung-uk Kim } 2911e71b7053SJung-uk Kim if (s->psk_server_callback == NULL) { 2912e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_TLS_PROCESS_CKE_PSK_PREAMBLE, 2913e71b7053SJung-uk Kim SSL_R_PSK_NO_SERVER_CB); 2914e71b7053SJung-uk Kim return 0; 2915e71b7053SJung-uk Kim } 2916e71b7053SJung-uk Kim 2917e71b7053SJung-uk Kim if (!PACKET_strndup(&psk_identity, &s->session->psk_identity)) { 2918e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_TLS_PROCESS_CKE_PSK_PREAMBLE, 2919e71b7053SJung-uk Kim ERR_R_INTERNAL_ERROR); 2920e71b7053SJung-uk Kim return 0; 2921e71b7053SJung-uk Kim } 2922e71b7053SJung-uk Kim 2923e71b7053SJung-uk Kim psklen = s->psk_server_callback(s, s->session->psk_identity, 2924e71b7053SJung-uk Kim psk, sizeof(psk)); 2925e71b7053SJung-uk Kim 2926e71b7053SJung-uk Kim if (psklen > PSK_MAX_PSK_LEN) { 2927e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_TLS_PROCESS_CKE_PSK_PREAMBLE, 2928e71b7053SJung-uk Kim ERR_R_INTERNAL_ERROR); 2929e71b7053SJung-uk Kim return 0; 2930e71b7053SJung-uk Kim } else if (psklen == 0) { 2931e71b7053SJung-uk Kim /* 2932e71b7053SJung-uk Kim * PSK related to the given identity not found 2933e71b7053SJung-uk Kim */ 2934e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_UNKNOWN_PSK_IDENTITY, 2935e71b7053SJung-uk Kim SSL_F_TLS_PROCESS_CKE_PSK_PREAMBLE, 2936e71b7053SJung-uk Kim SSL_R_PSK_IDENTITY_NOT_FOUND); 2937e71b7053SJung-uk Kim return 0; 2938e71b7053SJung-uk Kim } 2939e71b7053SJung-uk Kim 2940e71b7053SJung-uk Kim OPENSSL_free(s->s3->tmp.psk); 2941e71b7053SJung-uk Kim s->s3->tmp.psk = OPENSSL_memdup(psk, psklen); 2942e71b7053SJung-uk Kim OPENSSL_cleanse(psk, psklen); 2943e71b7053SJung-uk Kim 2944e71b7053SJung-uk Kim if (s->s3->tmp.psk == NULL) { 2945e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_INTERNAL_ERROR, 2946e71b7053SJung-uk Kim SSL_F_TLS_PROCESS_CKE_PSK_PREAMBLE, ERR_R_MALLOC_FAILURE); 2947e71b7053SJung-uk Kim return 0; 2948e71b7053SJung-uk Kim } 2949e71b7053SJung-uk Kim 2950e71b7053SJung-uk Kim s->s3->tmp.psklen = psklen; 2951e71b7053SJung-uk Kim 2952e71b7053SJung-uk Kim return 1; 2953e71b7053SJung-uk Kim #else 2954e71b7053SJung-uk Kim /* Should never happen */ 2955e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_TLS_PROCESS_CKE_PSK_PREAMBLE, 2956e71b7053SJung-uk Kim ERR_R_INTERNAL_ERROR); 2957e71b7053SJung-uk Kim return 0; 2958e71b7053SJung-uk Kim #endif 2959e71b7053SJung-uk Kim } 2960e71b7053SJung-uk Kim 2961e71b7053SJung-uk Kim static int tls_process_cke_rsa(SSL *s, PACKET *pkt) 2962e71b7053SJung-uk Kim { 2963e71b7053SJung-uk Kim #ifndef OPENSSL_NO_RSA 2964e71b7053SJung-uk Kim unsigned char rand_premaster_secret[SSL_MAX_MASTER_KEY_LENGTH]; 2965e71b7053SJung-uk Kim int decrypt_len; 2966e71b7053SJung-uk Kim unsigned char decrypt_good, version_good; 2967e71b7053SJung-uk Kim size_t j, padding_len; 2968e71b7053SJung-uk Kim PACKET enc_premaster; 2969e71b7053SJung-uk Kim RSA *rsa = NULL; 2970e71b7053SJung-uk Kim unsigned char *rsa_decrypt = NULL; 2971e71b7053SJung-uk Kim int ret = 0; 2972e71b7053SJung-uk Kim 2973e71b7053SJung-uk Kim rsa = EVP_PKEY_get0_RSA(s->cert->pkeys[SSL_PKEY_RSA].privatekey); 2974e71b7053SJung-uk Kim if (rsa == NULL) { 2975e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_TLS_PROCESS_CKE_RSA, 2976e71b7053SJung-uk Kim SSL_R_MISSING_RSA_CERTIFICATE); 2977e71b7053SJung-uk Kim return 0; 2978e71b7053SJung-uk Kim } 2979e71b7053SJung-uk Kim 2980e71b7053SJung-uk Kim /* SSLv3 and pre-standard DTLS omit the length bytes. */ 2981e71b7053SJung-uk Kim if (s->version == SSL3_VERSION || s->version == DTLS1_BAD_VER) { 2982e71b7053SJung-uk Kim enc_premaster = *pkt; 2983e71b7053SJung-uk Kim } else { 2984e71b7053SJung-uk Kim if (!PACKET_get_length_prefixed_2(pkt, &enc_premaster) 2985e71b7053SJung-uk Kim || PACKET_remaining(pkt) != 0) { 2986e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_DECODE_ERROR, SSL_F_TLS_PROCESS_CKE_RSA, 2987e71b7053SJung-uk Kim SSL_R_LENGTH_MISMATCH); 2988e71b7053SJung-uk Kim return 0; 2989e71b7053SJung-uk Kim } 2990e71b7053SJung-uk Kim } 2991e71b7053SJung-uk Kim 2992e71b7053SJung-uk Kim /* 2993e71b7053SJung-uk Kim * We want to be sure that the plaintext buffer size makes it safe to 2994e71b7053SJung-uk Kim * iterate over the entire size of a premaster secret 2995e71b7053SJung-uk Kim * (SSL_MAX_MASTER_KEY_LENGTH). Reject overly short RSA keys because 2996e71b7053SJung-uk Kim * their ciphertext cannot accommodate a premaster secret anyway. 2997e71b7053SJung-uk Kim */ 2998e71b7053SJung-uk Kim if (RSA_size(rsa) < SSL_MAX_MASTER_KEY_LENGTH) { 2999e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_TLS_PROCESS_CKE_RSA, 3000e71b7053SJung-uk Kim RSA_R_KEY_SIZE_TOO_SMALL); 3001e71b7053SJung-uk Kim return 0; 3002e71b7053SJung-uk Kim } 3003e71b7053SJung-uk Kim 3004e71b7053SJung-uk Kim rsa_decrypt = OPENSSL_malloc(RSA_size(rsa)); 3005e71b7053SJung-uk Kim if (rsa_decrypt == NULL) { 3006e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_TLS_PROCESS_CKE_RSA, 3007e71b7053SJung-uk Kim ERR_R_MALLOC_FAILURE); 3008e71b7053SJung-uk Kim return 0; 3009e71b7053SJung-uk Kim } 3010e71b7053SJung-uk Kim 3011e71b7053SJung-uk Kim /* 3012e71b7053SJung-uk Kim * We must not leak whether a decryption failure occurs because of 3013e71b7053SJung-uk Kim * Bleichenbacher's attack on PKCS #1 v1.5 RSA padding (see RFC 2246, 3014e71b7053SJung-uk Kim * section 7.4.7.1). The code follows that advice of the TLS RFC and 3015e71b7053SJung-uk Kim * generates a random premaster secret for the case that the decrypt 3016e71b7053SJung-uk Kim * fails. See https://tools.ietf.org/html/rfc5246#section-7.4.7.1 3017e71b7053SJung-uk Kim */ 3018e71b7053SJung-uk Kim 3019e71b7053SJung-uk Kim if (RAND_priv_bytes(rand_premaster_secret, 3020e71b7053SJung-uk Kim sizeof(rand_premaster_secret)) <= 0) { 3021e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_TLS_PROCESS_CKE_RSA, 3022e71b7053SJung-uk Kim ERR_R_INTERNAL_ERROR); 3023e71b7053SJung-uk Kim goto err; 3024e71b7053SJung-uk Kim } 3025e71b7053SJung-uk Kim 3026e71b7053SJung-uk Kim /* 3027e71b7053SJung-uk Kim * Decrypt with no padding. PKCS#1 padding will be removed as part of 3028e71b7053SJung-uk Kim * the timing-sensitive code below. 3029e71b7053SJung-uk Kim */ 3030e71b7053SJung-uk Kim /* TODO(size_t): Convert this function */ 3031e71b7053SJung-uk Kim decrypt_len = (int)RSA_private_decrypt((int)PACKET_remaining(&enc_premaster), 3032e71b7053SJung-uk Kim PACKET_data(&enc_premaster), 3033e71b7053SJung-uk Kim rsa_decrypt, rsa, RSA_NO_PADDING); 3034e71b7053SJung-uk Kim if (decrypt_len < 0) { 3035e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_DECRYPT_ERROR, SSL_F_TLS_PROCESS_CKE_RSA, 3036e71b7053SJung-uk Kim ERR_R_INTERNAL_ERROR); 3037e71b7053SJung-uk Kim goto err; 3038e71b7053SJung-uk Kim } 3039e71b7053SJung-uk Kim 3040e71b7053SJung-uk Kim /* Check the padding. See RFC 3447, section 7.2.2. */ 3041e71b7053SJung-uk Kim 3042e71b7053SJung-uk Kim /* 3043e71b7053SJung-uk Kim * The smallest padded premaster is 11 bytes of overhead. Small keys 3044e71b7053SJung-uk Kim * are publicly invalid, so this may return immediately. This ensures 3045e71b7053SJung-uk Kim * PS is at least 8 bytes. 3046e71b7053SJung-uk Kim */ 3047e71b7053SJung-uk Kim if (decrypt_len < 11 + SSL_MAX_MASTER_KEY_LENGTH) { 3048e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_DECRYPT_ERROR, SSL_F_TLS_PROCESS_CKE_RSA, 3049e71b7053SJung-uk Kim SSL_R_DECRYPTION_FAILED); 3050e71b7053SJung-uk Kim goto err; 3051e71b7053SJung-uk Kim } 3052e71b7053SJung-uk Kim 3053e71b7053SJung-uk Kim padding_len = decrypt_len - SSL_MAX_MASTER_KEY_LENGTH; 3054e71b7053SJung-uk Kim decrypt_good = constant_time_eq_int_8(rsa_decrypt[0], 0) & 3055e71b7053SJung-uk Kim constant_time_eq_int_8(rsa_decrypt[1], 2); 3056e71b7053SJung-uk Kim for (j = 2; j < padding_len - 1; j++) { 3057e71b7053SJung-uk Kim decrypt_good &= ~constant_time_is_zero_8(rsa_decrypt[j]); 3058e71b7053SJung-uk Kim } 3059e71b7053SJung-uk Kim decrypt_good &= constant_time_is_zero_8(rsa_decrypt[padding_len - 1]); 3060e71b7053SJung-uk Kim 3061e71b7053SJung-uk Kim /* 3062e71b7053SJung-uk Kim * If the version in the decrypted pre-master secret is correct then 3063e71b7053SJung-uk Kim * version_good will be 0xff, otherwise it'll be zero. The 3064e71b7053SJung-uk Kim * Klima-Pokorny-Rosa extension of Bleichenbacher's attack 3065e71b7053SJung-uk Kim * (http://eprint.iacr.org/2003/052/) exploits the version number 3066e71b7053SJung-uk Kim * check as a "bad version oracle". Thus version checks are done in 3067e71b7053SJung-uk Kim * constant time and are treated like any other decryption error. 3068e71b7053SJung-uk Kim */ 3069e71b7053SJung-uk Kim version_good = 3070e71b7053SJung-uk Kim constant_time_eq_8(rsa_decrypt[padding_len], 3071e71b7053SJung-uk Kim (unsigned)(s->client_version >> 8)); 3072e71b7053SJung-uk Kim version_good &= 3073e71b7053SJung-uk Kim constant_time_eq_8(rsa_decrypt[padding_len + 1], 3074e71b7053SJung-uk Kim (unsigned)(s->client_version & 0xff)); 3075e71b7053SJung-uk Kim 3076e71b7053SJung-uk Kim /* 3077e71b7053SJung-uk Kim * The premaster secret must contain the same version number as the 3078e71b7053SJung-uk Kim * ClientHello to detect version rollback attacks (strangely, the 3079e71b7053SJung-uk Kim * protocol does not offer such protection for DH ciphersuites). 3080e71b7053SJung-uk Kim * However, buggy clients exist that send the negotiated protocol 3081e71b7053SJung-uk Kim * version instead if the server does not support the requested 3082e71b7053SJung-uk Kim * protocol version. If SSL_OP_TLS_ROLLBACK_BUG is set, tolerate such 3083e71b7053SJung-uk Kim * clients. 3084e71b7053SJung-uk Kim */ 3085e71b7053SJung-uk Kim if (s->options & SSL_OP_TLS_ROLLBACK_BUG) { 3086e71b7053SJung-uk Kim unsigned char workaround_good; 3087e71b7053SJung-uk Kim workaround_good = constant_time_eq_8(rsa_decrypt[padding_len], 3088e71b7053SJung-uk Kim (unsigned)(s->version >> 8)); 3089e71b7053SJung-uk Kim workaround_good &= 3090e71b7053SJung-uk Kim constant_time_eq_8(rsa_decrypt[padding_len + 1], 3091e71b7053SJung-uk Kim (unsigned)(s->version & 0xff)); 3092e71b7053SJung-uk Kim version_good |= workaround_good; 3093e71b7053SJung-uk Kim } 3094e71b7053SJung-uk Kim 3095e71b7053SJung-uk Kim /* 3096e71b7053SJung-uk Kim * Both decryption and version must be good for decrypt_good to 3097e71b7053SJung-uk Kim * remain non-zero (0xff). 3098e71b7053SJung-uk Kim */ 3099e71b7053SJung-uk Kim decrypt_good &= version_good; 3100e71b7053SJung-uk Kim 3101e71b7053SJung-uk Kim /* 3102e71b7053SJung-uk Kim * Now copy rand_premaster_secret over from p using 3103e71b7053SJung-uk Kim * decrypt_good_mask. If decryption failed, then p does not 3104e71b7053SJung-uk Kim * contain valid plaintext, however, a check above guarantees 3105e71b7053SJung-uk Kim * it is still sufficiently large to read from. 3106e71b7053SJung-uk Kim */ 3107e71b7053SJung-uk Kim for (j = 0; j < sizeof(rand_premaster_secret); j++) { 3108e71b7053SJung-uk Kim rsa_decrypt[padding_len + j] = 3109e71b7053SJung-uk Kim constant_time_select_8(decrypt_good, 3110e71b7053SJung-uk Kim rsa_decrypt[padding_len + j], 3111e71b7053SJung-uk Kim rand_premaster_secret[j]); 3112e71b7053SJung-uk Kim } 3113e71b7053SJung-uk Kim 3114e71b7053SJung-uk Kim if (!ssl_generate_master_secret(s, rsa_decrypt + padding_len, 3115e71b7053SJung-uk Kim sizeof(rand_premaster_secret), 0)) { 3116e71b7053SJung-uk Kim /* SSLfatal() already called */ 3117e71b7053SJung-uk Kim goto err; 3118e71b7053SJung-uk Kim } 3119e71b7053SJung-uk Kim 3120e71b7053SJung-uk Kim ret = 1; 3121e71b7053SJung-uk Kim err: 3122e71b7053SJung-uk Kim OPENSSL_free(rsa_decrypt); 3123e71b7053SJung-uk Kim return ret; 3124e71b7053SJung-uk Kim #else 3125e71b7053SJung-uk Kim /* Should never happen */ 3126e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_TLS_PROCESS_CKE_RSA, 3127e71b7053SJung-uk Kim ERR_R_INTERNAL_ERROR); 3128e71b7053SJung-uk Kim return 0; 3129e71b7053SJung-uk Kim #endif 3130e71b7053SJung-uk Kim } 3131e71b7053SJung-uk Kim 3132e71b7053SJung-uk Kim static int tls_process_cke_dhe(SSL *s, PACKET *pkt) 3133e71b7053SJung-uk Kim { 3134e71b7053SJung-uk Kim #ifndef OPENSSL_NO_DH 3135e71b7053SJung-uk Kim EVP_PKEY *skey = NULL; 3136e71b7053SJung-uk Kim DH *cdh; 3137e71b7053SJung-uk Kim unsigned int i; 3138e71b7053SJung-uk Kim BIGNUM *pub_key; 3139e71b7053SJung-uk Kim const unsigned char *data; 3140e71b7053SJung-uk Kim EVP_PKEY *ckey = NULL; 3141e71b7053SJung-uk Kim int ret = 0; 3142e71b7053SJung-uk Kim 3143e71b7053SJung-uk Kim if (!PACKET_get_net_2(pkt, &i) || PACKET_remaining(pkt) != i) { 3144e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_DECODE_ERROR, SSL_F_TLS_PROCESS_CKE_DHE, 3145e71b7053SJung-uk Kim SSL_R_DH_PUBLIC_VALUE_LENGTH_IS_WRONG); 3146e71b7053SJung-uk Kim goto err; 3147e71b7053SJung-uk Kim } 3148e71b7053SJung-uk Kim skey = s->s3->tmp.pkey; 3149e71b7053SJung-uk Kim if (skey == NULL) { 3150e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_TLS_PROCESS_CKE_DHE, 3151e71b7053SJung-uk Kim SSL_R_MISSING_TMP_DH_KEY); 3152e71b7053SJung-uk Kim goto err; 3153e71b7053SJung-uk Kim } 3154e71b7053SJung-uk Kim 3155e71b7053SJung-uk Kim if (PACKET_remaining(pkt) == 0L) { 3156e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_DECODE_ERROR, SSL_F_TLS_PROCESS_CKE_DHE, 3157e71b7053SJung-uk Kim SSL_R_MISSING_TMP_DH_KEY); 3158e71b7053SJung-uk Kim goto err; 3159e71b7053SJung-uk Kim } 3160e71b7053SJung-uk Kim if (!PACKET_get_bytes(pkt, &data, i)) { 3161e71b7053SJung-uk Kim /* We already checked we have enough data */ 3162e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_TLS_PROCESS_CKE_DHE, 3163e71b7053SJung-uk Kim ERR_R_INTERNAL_ERROR); 3164e71b7053SJung-uk Kim goto err; 3165e71b7053SJung-uk Kim } 3166e71b7053SJung-uk Kim ckey = EVP_PKEY_new(); 3167e71b7053SJung-uk Kim if (ckey == NULL || EVP_PKEY_copy_parameters(ckey, skey) == 0) { 3168e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_TLS_PROCESS_CKE_DHE, 3169e71b7053SJung-uk Kim SSL_R_BN_LIB); 3170e71b7053SJung-uk Kim goto err; 3171e71b7053SJung-uk Kim } 3172e71b7053SJung-uk Kim 3173e71b7053SJung-uk Kim cdh = EVP_PKEY_get0_DH(ckey); 3174e71b7053SJung-uk Kim pub_key = BN_bin2bn(data, i, NULL); 3175e71b7053SJung-uk Kim if (pub_key == NULL || cdh == NULL || !DH_set0_key(cdh, pub_key, NULL)) { 3176e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_TLS_PROCESS_CKE_DHE, 3177e71b7053SJung-uk Kim ERR_R_INTERNAL_ERROR); 3178e71b7053SJung-uk Kim BN_free(pub_key); 3179e71b7053SJung-uk Kim goto err; 3180e71b7053SJung-uk Kim } 3181e71b7053SJung-uk Kim 3182e71b7053SJung-uk Kim if (ssl_derive(s, skey, ckey, 1) == 0) { 3183e71b7053SJung-uk Kim /* SSLfatal() already called */ 3184e71b7053SJung-uk Kim goto err; 3185e71b7053SJung-uk Kim } 3186e71b7053SJung-uk Kim 3187e71b7053SJung-uk Kim ret = 1; 3188e71b7053SJung-uk Kim EVP_PKEY_free(s->s3->tmp.pkey); 3189e71b7053SJung-uk Kim s->s3->tmp.pkey = NULL; 3190e71b7053SJung-uk Kim err: 3191e71b7053SJung-uk Kim EVP_PKEY_free(ckey); 3192e71b7053SJung-uk Kim return ret; 3193e71b7053SJung-uk Kim #else 3194e71b7053SJung-uk Kim /* Should never happen */ 3195e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_TLS_PROCESS_CKE_DHE, 3196e71b7053SJung-uk Kim ERR_R_INTERNAL_ERROR); 3197e71b7053SJung-uk Kim return 0; 3198e71b7053SJung-uk Kim #endif 3199e71b7053SJung-uk Kim } 3200e71b7053SJung-uk Kim 3201e71b7053SJung-uk Kim static int tls_process_cke_ecdhe(SSL *s, PACKET *pkt) 3202e71b7053SJung-uk Kim { 3203e71b7053SJung-uk Kim #ifndef OPENSSL_NO_EC 3204e71b7053SJung-uk Kim EVP_PKEY *skey = s->s3->tmp.pkey; 3205e71b7053SJung-uk Kim EVP_PKEY *ckey = NULL; 3206e71b7053SJung-uk Kim int ret = 0; 3207e71b7053SJung-uk Kim 3208e71b7053SJung-uk Kim if (PACKET_remaining(pkt) == 0L) { 3209e71b7053SJung-uk Kim /* We don't support ECDH client auth */ 3210e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_HANDSHAKE_FAILURE, SSL_F_TLS_PROCESS_CKE_ECDHE, 3211e71b7053SJung-uk Kim SSL_R_MISSING_TMP_ECDH_KEY); 3212e71b7053SJung-uk Kim goto err; 3213e71b7053SJung-uk Kim } else { 3214e71b7053SJung-uk Kim unsigned int i; 3215e71b7053SJung-uk Kim const unsigned char *data; 3216e71b7053SJung-uk Kim 3217e71b7053SJung-uk Kim /* 3218e71b7053SJung-uk Kim * Get client's public key from encoded point in the 3219e71b7053SJung-uk Kim * ClientKeyExchange message. 3220e71b7053SJung-uk Kim */ 3221e71b7053SJung-uk Kim 3222e71b7053SJung-uk Kim /* Get encoded point length */ 3223e71b7053SJung-uk Kim if (!PACKET_get_1(pkt, &i) || !PACKET_get_bytes(pkt, &data, i) 3224e71b7053SJung-uk Kim || PACKET_remaining(pkt) != 0) { 3225e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_DECODE_ERROR, SSL_F_TLS_PROCESS_CKE_ECDHE, 3226e71b7053SJung-uk Kim SSL_R_LENGTH_MISMATCH); 3227e71b7053SJung-uk Kim goto err; 3228e71b7053SJung-uk Kim } 3229*c9cf7b5cSJung-uk Kim if (skey == NULL) { 3230*c9cf7b5cSJung-uk Kim SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_TLS_PROCESS_CKE_ECDHE, 3231*c9cf7b5cSJung-uk Kim SSL_R_MISSING_TMP_ECDH_KEY); 3232*c9cf7b5cSJung-uk Kim goto err; 3233*c9cf7b5cSJung-uk Kim } 3234*c9cf7b5cSJung-uk Kim 3235e71b7053SJung-uk Kim ckey = EVP_PKEY_new(); 3236e71b7053SJung-uk Kim if (ckey == NULL || EVP_PKEY_copy_parameters(ckey, skey) <= 0) { 3237e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_TLS_PROCESS_CKE_ECDHE, 3238e71b7053SJung-uk Kim ERR_R_EVP_LIB); 3239e71b7053SJung-uk Kim goto err; 3240e71b7053SJung-uk Kim } 3241e71b7053SJung-uk Kim if (EVP_PKEY_set1_tls_encodedpoint(ckey, data, i) == 0) { 3242e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_TLS_PROCESS_CKE_ECDHE, 3243e71b7053SJung-uk Kim ERR_R_EC_LIB); 3244e71b7053SJung-uk Kim goto err; 3245e71b7053SJung-uk Kim } 3246e71b7053SJung-uk Kim } 3247e71b7053SJung-uk Kim 3248e71b7053SJung-uk Kim if (ssl_derive(s, skey, ckey, 1) == 0) { 3249e71b7053SJung-uk Kim /* SSLfatal() already called */ 3250e71b7053SJung-uk Kim goto err; 3251e71b7053SJung-uk Kim } 3252e71b7053SJung-uk Kim 3253e71b7053SJung-uk Kim ret = 1; 3254e71b7053SJung-uk Kim EVP_PKEY_free(s->s3->tmp.pkey); 3255e71b7053SJung-uk Kim s->s3->tmp.pkey = NULL; 3256e71b7053SJung-uk Kim err: 3257e71b7053SJung-uk Kim EVP_PKEY_free(ckey); 3258e71b7053SJung-uk Kim 3259e71b7053SJung-uk Kim return ret; 3260e71b7053SJung-uk Kim #else 3261e71b7053SJung-uk Kim /* Should never happen */ 3262e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_TLS_PROCESS_CKE_ECDHE, 3263e71b7053SJung-uk Kim ERR_R_INTERNAL_ERROR); 3264e71b7053SJung-uk Kim return 0; 3265e71b7053SJung-uk Kim #endif 3266e71b7053SJung-uk Kim } 3267e71b7053SJung-uk Kim 3268e71b7053SJung-uk Kim static int tls_process_cke_srp(SSL *s, PACKET *pkt) 3269e71b7053SJung-uk Kim { 3270e71b7053SJung-uk Kim #ifndef OPENSSL_NO_SRP 3271e71b7053SJung-uk Kim unsigned int i; 3272e71b7053SJung-uk Kim const unsigned char *data; 3273e71b7053SJung-uk Kim 3274e71b7053SJung-uk Kim if (!PACKET_get_net_2(pkt, &i) 3275e71b7053SJung-uk Kim || !PACKET_get_bytes(pkt, &data, i)) { 3276e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_DECODE_ERROR, SSL_F_TLS_PROCESS_CKE_SRP, 3277e71b7053SJung-uk Kim SSL_R_BAD_SRP_A_LENGTH); 3278e71b7053SJung-uk Kim return 0; 3279e71b7053SJung-uk Kim } 3280e71b7053SJung-uk Kim if ((s->srp_ctx.A = BN_bin2bn(data, i, NULL)) == NULL) { 3281e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_TLS_PROCESS_CKE_SRP, 3282e71b7053SJung-uk Kim ERR_R_BN_LIB); 3283e71b7053SJung-uk Kim return 0; 3284e71b7053SJung-uk Kim } 3285e71b7053SJung-uk Kim if (BN_ucmp(s->srp_ctx.A, s->srp_ctx.N) >= 0 || BN_is_zero(s->srp_ctx.A)) { 3286e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_ILLEGAL_PARAMETER, SSL_F_TLS_PROCESS_CKE_SRP, 3287e71b7053SJung-uk Kim SSL_R_BAD_SRP_PARAMETERS); 3288e71b7053SJung-uk Kim return 0; 3289e71b7053SJung-uk Kim } 3290e71b7053SJung-uk Kim OPENSSL_free(s->session->srp_username); 3291e71b7053SJung-uk Kim s->session->srp_username = OPENSSL_strdup(s->srp_ctx.login); 3292e71b7053SJung-uk Kim if (s->session->srp_username == NULL) { 3293e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_TLS_PROCESS_CKE_SRP, 3294e71b7053SJung-uk Kim ERR_R_MALLOC_FAILURE); 3295e71b7053SJung-uk Kim return 0; 3296e71b7053SJung-uk Kim } 3297e71b7053SJung-uk Kim 3298e71b7053SJung-uk Kim if (!srp_generate_server_master_secret(s)) { 3299e71b7053SJung-uk Kim /* SSLfatal() already called */ 3300e71b7053SJung-uk Kim return 0; 3301e71b7053SJung-uk Kim } 3302e71b7053SJung-uk Kim 3303e71b7053SJung-uk Kim return 1; 3304e71b7053SJung-uk Kim #else 3305e71b7053SJung-uk Kim /* Should never happen */ 3306e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_TLS_PROCESS_CKE_SRP, 3307e71b7053SJung-uk Kim ERR_R_INTERNAL_ERROR); 3308e71b7053SJung-uk Kim return 0; 3309e71b7053SJung-uk Kim #endif 3310e71b7053SJung-uk Kim } 3311e71b7053SJung-uk Kim 3312e71b7053SJung-uk Kim static int tls_process_cke_gost(SSL *s, PACKET *pkt) 3313e71b7053SJung-uk Kim { 3314e71b7053SJung-uk Kim #ifndef OPENSSL_NO_GOST 3315e71b7053SJung-uk Kim EVP_PKEY_CTX *pkey_ctx; 3316e71b7053SJung-uk Kim EVP_PKEY *client_pub_pkey = NULL, *pk = NULL; 3317e71b7053SJung-uk Kim unsigned char premaster_secret[32]; 3318e71b7053SJung-uk Kim const unsigned char *start; 3319e71b7053SJung-uk Kim size_t outlen = 32, inlen; 3320e71b7053SJung-uk Kim unsigned long alg_a; 3321e71b7053SJung-uk Kim unsigned int asn1id, asn1len; 3322e71b7053SJung-uk Kim int ret = 0; 3323e71b7053SJung-uk Kim PACKET encdata; 3324e71b7053SJung-uk Kim 3325e71b7053SJung-uk Kim /* Get our certificate private key */ 3326e71b7053SJung-uk Kim alg_a = s->s3->tmp.new_cipher->algorithm_auth; 3327e71b7053SJung-uk Kim if (alg_a & SSL_aGOST12) { 3328e71b7053SJung-uk Kim /* 3329e71b7053SJung-uk Kim * New GOST ciphersuites have SSL_aGOST01 bit too 3330e71b7053SJung-uk Kim */ 3331e71b7053SJung-uk Kim pk = s->cert->pkeys[SSL_PKEY_GOST12_512].privatekey; 3332e71b7053SJung-uk Kim if (pk == NULL) { 3333e71b7053SJung-uk Kim pk = s->cert->pkeys[SSL_PKEY_GOST12_256].privatekey; 3334e71b7053SJung-uk Kim } 3335e71b7053SJung-uk Kim if (pk == NULL) { 3336e71b7053SJung-uk Kim pk = s->cert->pkeys[SSL_PKEY_GOST01].privatekey; 3337e71b7053SJung-uk Kim } 3338e71b7053SJung-uk Kim } else if (alg_a & SSL_aGOST01) { 3339e71b7053SJung-uk Kim pk = s->cert->pkeys[SSL_PKEY_GOST01].privatekey; 3340e71b7053SJung-uk Kim } 3341e71b7053SJung-uk Kim 3342e71b7053SJung-uk Kim pkey_ctx = EVP_PKEY_CTX_new(pk, NULL); 3343e71b7053SJung-uk Kim if (pkey_ctx == NULL) { 3344e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_TLS_PROCESS_CKE_GOST, 3345e71b7053SJung-uk Kim ERR_R_MALLOC_FAILURE); 3346e71b7053SJung-uk Kim return 0; 3347e71b7053SJung-uk Kim } 3348e71b7053SJung-uk Kim if (EVP_PKEY_decrypt_init(pkey_ctx) <= 0) { 3349e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_TLS_PROCESS_CKE_GOST, 3350e71b7053SJung-uk Kim ERR_R_INTERNAL_ERROR); 3351e71b7053SJung-uk Kim return 0; 3352e71b7053SJung-uk Kim } 3353e71b7053SJung-uk Kim /* 3354e71b7053SJung-uk Kim * If client certificate is present and is of the same type, maybe 3355e71b7053SJung-uk Kim * use it for key exchange. Don't mind errors from 3356e71b7053SJung-uk Kim * EVP_PKEY_derive_set_peer, because it is completely valid to use a 3357e71b7053SJung-uk Kim * client certificate for authorization only. 3358e71b7053SJung-uk Kim */ 3359e71b7053SJung-uk Kim client_pub_pkey = X509_get0_pubkey(s->session->peer); 3360e71b7053SJung-uk Kim if (client_pub_pkey) { 3361e71b7053SJung-uk Kim if (EVP_PKEY_derive_set_peer(pkey_ctx, client_pub_pkey) <= 0) 3362e71b7053SJung-uk Kim ERR_clear_error(); 3363e71b7053SJung-uk Kim } 3364e71b7053SJung-uk Kim /* Decrypt session key */ 3365e71b7053SJung-uk Kim if (!PACKET_get_1(pkt, &asn1id) 3366e71b7053SJung-uk Kim || asn1id != (V_ASN1_SEQUENCE | V_ASN1_CONSTRUCTED) 3367e71b7053SJung-uk Kim || !PACKET_peek_1(pkt, &asn1len)) { 3368e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_DECODE_ERROR, SSL_F_TLS_PROCESS_CKE_GOST, 3369e71b7053SJung-uk Kim SSL_R_DECRYPTION_FAILED); 3370e71b7053SJung-uk Kim goto err; 3371e71b7053SJung-uk Kim } 3372e71b7053SJung-uk Kim if (asn1len == 0x81) { 3373e71b7053SJung-uk Kim /* 3374e71b7053SJung-uk Kim * Long form length. Should only be one byte of length. Anything else 3375e71b7053SJung-uk Kim * isn't supported. 3376e71b7053SJung-uk Kim * We did a successful peek before so this shouldn't fail 3377e71b7053SJung-uk Kim */ 3378e71b7053SJung-uk Kim if (!PACKET_forward(pkt, 1)) { 3379e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_TLS_PROCESS_CKE_GOST, 3380e71b7053SJung-uk Kim SSL_R_DECRYPTION_FAILED); 3381e71b7053SJung-uk Kim goto err; 3382e71b7053SJung-uk Kim } 3383e71b7053SJung-uk Kim } else if (asn1len >= 0x80) { 3384e71b7053SJung-uk Kim /* 3385e71b7053SJung-uk Kim * Indefinite length, or more than one long form length bytes. We don't 3386e71b7053SJung-uk Kim * support it 3387e71b7053SJung-uk Kim */ 3388e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_DECODE_ERROR, SSL_F_TLS_PROCESS_CKE_GOST, 3389e71b7053SJung-uk Kim SSL_R_DECRYPTION_FAILED); 3390e71b7053SJung-uk Kim goto err; 3391e71b7053SJung-uk Kim } /* else short form length */ 3392e71b7053SJung-uk Kim 3393e71b7053SJung-uk Kim if (!PACKET_as_length_prefixed_1(pkt, &encdata)) { 3394e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_DECODE_ERROR, SSL_F_TLS_PROCESS_CKE_GOST, 3395e71b7053SJung-uk Kim SSL_R_DECRYPTION_FAILED); 3396e71b7053SJung-uk Kim goto err; 3397e71b7053SJung-uk Kim } 3398e71b7053SJung-uk Kim inlen = PACKET_remaining(&encdata); 3399e71b7053SJung-uk Kim start = PACKET_data(&encdata); 3400e71b7053SJung-uk Kim 3401e71b7053SJung-uk Kim if (EVP_PKEY_decrypt(pkey_ctx, premaster_secret, &outlen, start, 3402e71b7053SJung-uk Kim inlen) <= 0) { 3403e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_DECODE_ERROR, SSL_F_TLS_PROCESS_CKE_GOST, 3404e71b7053SJung-uk Kim SSL_R_DECRYPTION_FAILED); 3405e71b7053SJung-uk Kim goto err; 3406e71b7053SJung-uk Kim } 3407e71b7053SJung-uk Kim /* Generate master secret */ 3408e71b7053SJung-uk Kim if (!ssl_generate_master_secret(s, premaster_secret, 3409e71b7053SJung-uk Kim sizeof(premaster_secret), 0)) { 3410e71b7053SJung-uk Kim /* SSLfatal() already called */ 3411e71b7053SJung-uk Kim goto err; 3412e71b7053SJung-uk Kim } 3413e71b7053SJung-uk Kim /* Check if pubkey from client certificate was used */ 3414e71b7053SJung-uk Kim if (EVP_PKEY_CTX_ctrl(pkey_ctx, -1, -1, EVP_PKEY_CTRL_PEER_KEY, 2, 3415e71b7053SJung-uk Kim NULL) > 0) 3416e71b7053SJung-uk Kim s->statem.no_cert_verify = 1; 3417e71b7053SJung-uk Kim 3418e71b7053SJung-uk Kim ret = 1; 3419e71b7053SJung-uk Kim err: 3420e71b7053SJung-uk Kim EVP_PKEY_CTX_free(pkey_ctx); 3421e71b7053SJung-uk Kim return ret; 3422e71b7053SJung-uk Kim #else 3423e71b7053SJung-uk Kim /* Should never happen */ 3424e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_TLS_PROCESS_CKE_GOST, 3425e71b7053SJung-uk Kim ERR_R_INTERNAL_ERROR); 3426e71b7053SJung-uk Kim return 0; 3427e71b7053SJung-uk Kim #endif 3428e71b7053SJung-uk Kim } 3429e71b7053SJung-uk Kim 3430e71b7053SJung-uk Kim MSG_PROCESS_RETURN tls_process_client_key_exchange(SSL *s, PACKET *pkt) 3431e71b7053SJung-uk Kim { 3432e71b7053SJung-uk Kim unsigned long alg_k; 3433e71b7053SJung-uk Kim 3434e71b7053SJung-uk Kim alg_k = s->s3->tmp.new_cipher->algorithm_mkey; 3435e71b7053SJung-uk Kim 3436e71b7053SJung-uk Kim /* For PSK parse and retrieve identity, obtain PSK key */ 3437e71b7053SJung-uk Kim if ((alg_k & SSL_PSK) && !tls_process_cke_psk_preamble(s, pkt)) { 3438e71b7053SJung-uk Kim /* SSLfatal() already called */ 3439e71b7053SJung-uk Kim goto err; 3440e71b7053SJung-uk Kim } 3441e71b7053SJung-uk Kim 3442e71b7053SJung-uk Kim if (alg_k & SSL_kPSK) { 3443e71b7053SJung-uk Kim /* Identity extracted earlier: should be nothing left */ 3444e71b7053SJung-uk Kim if (PACKET_remaining(pkt) != 0) { 3445e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_DECODE_ERROR, 3446e71b7053SJung-uk Kim SSL_F_TLS_PROCESS_CLIENT_KEY_EXCHANGE, 3447e71b7053SJung-uk Kim SSL_R_LENGTH_MISMATCH); 3448e71b7053SJung-uk Kim goto err; 3449e71b7053SJung-uk Kim } 3450e71b7053SJung-uk Kim /* PSK handled by ssl_generate_master_secret */ 3451e71b7053SJung-uk Kim if (!ssl_generate_master_secret(s, NULL, 0, 0)) { 3452e71b7053SJung-uk Kim /* SSLfatal() already called */ 3453e71b7053SJung-uk Kim goto err; 3454e71b7053SJung-uk Kim } 3455e71b7053SJung-uk Kim } else if (alg_k & (SSL_kRSA | SSL_kRSAPSK)) { 3456e71b7053SJung-uk Kim if (!tls_process_cke_rsa(s, pkt)) { 3457e71b7053SJung-uk Kim /* SSLfatal() already called */ 3458e71b7053SJung-uk Kim goto err; 3459e71b7053SJung-uk Kim } 3460e71b7053SJung-uk Kim } else if (alg_k & (SSL_kDHE | SSL_kDHEPSK)) { 3461e71b7053SJung-uk Kim if (!tls_process_cke_dhe(s, pkt)) { 3462e71b7053SJung-uk Kim /* SSLfatal() already called */ 3463e71b7053SJung-uk Kim goto err; 3464e71b7053SJung-uk Kim } 3465e71b7053SJung-uk Kim } else if (alg_k & (SSL_kECDHE | SSL_kECDHEPSK)) { 3466e71b7053SJung-uk Kim if (!tls_process_cke_ecdhe(s, pkt)) { 3467e71b7053SJung-uk Kim /* SSLfatal() already called */ 3468e71b7053SJung-uk Kim goto err; 3469e71b7053SJung-uk Kim } 3470e71b7053SJung-uk Kim } else if (alg_k & SSL_kSRP) { 3471e71b7053SJung-uk Kim if (!tls_process_cke_srp(s, pkt)) { 3472e71b7053SJung-uk Kim /* SSLfatal() already called */ 3473e71b7053SJung-uk Kim goto err; 3474e71b7053SJung-uk Kim } 3475e71b7053SJung-uk Kim } else if (alg_k & SSL_kGOST) { 3476e71b7053SJung-uk Kim if (!tls_process_cke_gost(s, pkt)) { 3477e71b7053SJung-uk Kim /* SSLfatal() already called */ 3478e71b7053SJung-uk Kim goto err; 3479e71b7053SJung-uk Kim } 3480e71b7053SJung-uk Kim } else { 3481e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_INTERNAL_ERROR, 3482e71b7053SJung-uk Kim SSL_F_TLS_PROCESS_CLIENT_KEY_EXCHANGE, 3483e71b7053SJung-uk Kim SSL_R_UNKNOWN_CIPHER_TYPE); 3484e71b7053SJung-uk Kim goto err; 3485e71b7053SJung-uk Kim } 3486e71b7053SJung-uk Kim 3487e71b7053SJung-uk Kim return MSG_PROCESS_CONTINUE_PROCESSING; 3488e71b7053SJung-uk Kim err: 3489e71b7053SJung-uk Kim #ifndef OPENSSL_NO_PSK 3490e71b7053SJung-uk Kim OPENSSL_clear_free(s->s3->tmp.psk, s->s3->tmp.psklen); 3491e71b7053SJung-uk Kim s->s3->tmp.psk = NULL; 3492e71b7053SJung-uk Kim #endif 3493e71b7053SJung-uk Kim return MSG_PROCESS_ERROR; 3494e71b7053SJung-uk Kim } 3495e71b7053SJung-uk Kim 3496e71b7053SJung-uk Kim WORK_STATE tls_post_process_client_key_exchange(SSL *s, WORK_STATE wst) 3497e71b7053SJung-uk Kim { 3498e71b7053SJung-uk Kim #ifndef OPENSSL_NO_SCTP 3499e71b7053SJung-uk Kim if (wst == WORK_MORE_A) { 3500e71b7053SJung-uk Kim if (SSL_IS_DTLS(s)) { 3501e71b7053SJung-uk Kim unsigned char sctpauthkey[64]; 3502e71b7053SJung-uk Kim char labelbuffer[sizeof(DTLS1_SCTP_AUTH_LABEL)]; 3503e71b7053SJung-uk Kim /* 3504e71b7053SJung-uk Kim * Add new shared key for SCTP-Auth, will be ignored if no SCTP 3505e71b7053SJung-uk Kim * used. 3506e71b7053SJung-uk Kim */ 3507e71b7053SJung-uk Kim memcpy(labelbuffer, DTLS1_SCTP_AUTH_LABEL, 3508e71b7053SJung-uk Kim sizeof(DTLS1_SCTP_AUTH_LABEL)); 3509e71b7053SJung-uk Kim 3510e71b7053SJung-uk Kim if (SSL_export_keying_material(s, sctpauthkey, 3511e71b7053SJung-uk Kim sizeof(sctpauthkey), labelbuffer, 3512e71b7053SJung-uk Kim sizeof(labelbuffer), NULL, 0, 3513e71b7053SJung-uk Kim 0) <= 0) { 3514e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_INTERNAL_ERROR, 3515e71b7053SJung-uk Kim SSL_F_TLS_POST_PROCESS_CLIENT_KEY_EXCHANGE, 3516e71b7053SJung-uk Kim ERR_R_INTERNAL_ERROR); 3517e71b7053SJung-uk Kim return WORK_ERROR; 3518e71b7053SJung-uk Kim } 3519e71b7053SJung-uk Kim 3520e71b7053SJung-uk Kim BIO_ctrl(SSL_get_wbio(s), BIO_CTRL_DGRAM_SCTP_ADD_AUTH_KEY, 3521e71b7053SJung-uk Kim sizeof(sctpauthkey), sctpauthkey); 3522e71b7053SJung-uk Kim } 3523e71b7053SJung-uk Kim } 3524e71b7053SJung-uk Kim #endif 3525e71b7053SJung-uk Kim 3526e71b7053SJung-uk Kim if (s->statem.no_cert_verify || !s->session->peer) { 3527e71b7053SJung-uk Kim /* 3528e71b7053SJung-uk Kim * No certificate verify or no peer certificate so we no longer need 3529e71b7053SJung-uk Kim * the handshake_buffer 3530e71b7053SJung-uk Kim */ 3531e71b7053SJung-uk Kim if (!ssl3_digest_cached_records(s, 0)) { 3532e71b7053SJung-uk Kim /* SSLfatal() already called */ 3533e71b7053SJung-uk Kim return WORK_ERROR; 3534e71b7053SJung-uk Kim } 3535e71b7053SJung-uk Kim return WORK_FINISHED_CONTINUE; 3536e71b7053SJung-uk Kim } else { 3537e71b7053SJung-uk Kim if (!s->s3->handshake_buffer) { 3538e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_INTERNAL_ERROR, 3539e71b7053SJung-uk Kim SSL_F_TLS_POST_PROCESS_CLIENT_KEY_EXCHANGE, 3540e71b7053SJung-uk Kim ERR_R_INTERNAL_ERROR); 3541e71b7053SJung-uk Kim return WORK_ERROR; 3542e71b7053SJung-uk Kim } 3543e71b7053SJung-uk Kim /* 3544e71b7053SJung-uk Kim * For sigalgs freeze the handshake buffer. If we support 3545e71b7053SJung-uk Kim * extms we've done this already so this is a no-op 3546e71b7053SJung-uk Kim */ 3547e71b7053SJung-uk Kim if (!ssl3_digest_cached_records(s, 1)) { 3548e71b7053SJung-uk Kim /* SSLfatal() already called */ 3549e71b7053SJung-uk Kim return WORK_ERROR; 3550e71b7053SJung-uk Kim } 3551e71b7053SJung-uk Kim } 3552e71b7053SJung-uk Kim 3553e71b7053SJung-uk Kim return WORK_FINISHED_CONTINUE; 3554e71b7053SJung-uk Kim } 3555e71b7053SJung-uk Kim 3556e71b7053SJung-uk Kim MSG_PROCESS_RETURN tls_process_client_certificate(SSL *s, PACKET *pkt) 3557e71b7053SJung-uk Kim { 3558e71b7053SJung-uk Kim int i; 3559e71b7053SJung-uk Kim MSG_PROCESS_RETURN ret = MSG_PROCESS_ERROR; 3560e71b7053SJung-uk Kim X509 *x = NULL; 3561e71b7053SJung-uk Kim unsigned long l; 3562e71b7053SJung-uk Kim const unsigned char *certstart, *certbytes; 3563e71b7053SJung-uk Kim STACK_OF(X509) *sk = NULL; 3564e71b7053SJung-uk Kim PACKET spkt, context; 3565e71b7053SJung-uk Kim size_t chainidx; 3566e71b7053SJung-uk Kim SSL_SESSION *new_sess = NULL; 3567e71b7053SJung-uk Kim 3568e71b7053SJung-uk Kim /* 3569e71b7053SJung-uk Kim * To get this far we must have read encrypted data from the client. We no 3570e71b7053SJung-uk Kim * longer tolerate unencrypted alerts. This value is ignored if less than 3571e71b7053SJung-uk Kim * TLSv1.3 3572e71b7053SJung-uk Kim */ 3573e71b7053SJung-uk Kim s->statem.enc_read_state = ENC_READ_STATE_VALID; 3574e71b7053SJung-uk Kim 3575e71b7053SJung-uk Kim if ((sk = sk_X509_new_null()) == NULL) { 3576e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_TLS_PROCESS_CLIENT_CERTIFICATE, 3577e71b7053SJung-uk Kim ERR_R_MALLOC_FAILURE); 3578e71b7053SJung-uk Kim goto err; 3579e71b7053SJung-uk Kim } 3580e71b7053SJung-uk Kim 3581e71b7053SJung-uk Kim if (SSL_IS_TLS13(s) && (!PACKET_get_length_prefixed_1(pkt, &context) 3582e71b7053SJung-uk Kim || (s->pha_context == NULL && PACKET_remaining(&context) != 0) 3583e71b7053SJung-uk Kim || (s->pha_context != NULL && 3584e71b7053SJung-uk Kim !PACKET_equal(&context, s->pha_context, s->pha_context_len)))) { 3585e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_DECODE_ERROR, SSL_F_TLS_PROCESS_CLIENT_CERTIFICATE, 3586e71b7053SJung-uk Kim SSL_R_INVALID_CONTEXT); 3587e71b7053SJung-uk Kim goto err; 3588e71b7053SJung-uk Kim } 3589e71b7053SJung-uk Kim 3590e71b7053SJung-uk Kim if (!PACKET_get_length_prefixed_3(pkt, &spkt) 3591e71b7053SJung-uk Kim || PACKET_remaining(pkt) != 0) { 3592e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_DECODE_ERROR, SSL_F_TLS_PROCESS_CLIENT_CERTIFICATE, 3593e71b7053SJung-uk Kim SSL_R_LENGTH_MISMATCH); 3594e71b7053SJung-uk Kim goto err; 3595e71b7053SJung-uk Kim } 3596e71b7053SJung-uk Kim 3597e71b7053SJung-uk Kim for (chainidx = 0; PACKET_remaining(&spkt) > 0; chainidx++) { 3598e71b7053SJung-uk Kim if (!PACKET_get_net_3(&spkt, &l) 3599e71b7053SJung-uk Kim || !PACKET_get_bytes(&spkt, &certbytes, l)) { 3600e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_DECODE_ERROR, 3601e71b7053SJung-uk Kim SSL_F_TLS_PROCESS_CLIENT_CERTIFICATE, 3602e71b7053SJung-uk Kim SSL_R_CERT_LENGTH_MISMATCH); 3603e71b7053SJung-uk Kim goto err; 3604e71b7053SJung-uk Kim } 3605e71b7053SJung-uk Kim 3606e71b7053SJung-uk Kim certstart = certbytes; 3607e71b7053SJung-uk Kim x = d2i_X509(NULL, (const unsigned char **)&certbytes, l); 3608e71b7053SJung-uk Kim if (x == NULL) { 3609e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_DECODE_ERROR, 3610e71b7053SJung-uk Kim SSL_F_TLS_PROCESS_CLIENT_CERTIFICATE, ERR_R_ASN1_LIB); 3611e71b7053SJung-uk Kim goto err; 3612e71b7053SJung-uk Kim } 3613e71b7053SJung-uk Kim if (certbytes != (certstart + l)) { 3614e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_DECODE_ERROR, 3615e71b7053SJung-uk Kim SSL_F_TLS_PROCESS_CLIENT_CERTIFICATE, 3616e71b7053SJung-uk Kim SSL_R_CERT_LENGTH_MISMATCH); 3617e71b7053SJung-uk Kim goto err; 3618e71b7053SJung-uk Kim } 3619e71b7053SJung-uk Kim 3620e71b7053SJung-uk Kim if (SSL_IS_TLS13(s)) { 3621e71b7053SJung-uk Kim RAW_EXTENSION *rawexts = NULL; 3622e71b7053SJung-uk Kim PACKET extensions; 3623e71b7053SJung-uk Kim 3624e71b7053SJung-uk Kim if (!PACKET_get_length_prefixed_2(&spkt, &extensions)) { 3625e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_DECODE_ERROR, 3626e71b7053SJung-uk Kim SSL_F_TLS_PROCESS_CLIENT_CERTIFICATE, 3627e71b7053SJung-uk Kim SSL_R_BAD_LENGTH); 3628e71b7053SJung-uk Kim goto err; 3629e71b7053SJung-uk Kim } 3630e71b7053SJung-uk Kim if (!tls_collect_extensions(s, &extensions, 3631e71b7053SJung-uk Kim SSL_EXT_TLS1_3_CERTIFICATE, &rawexts, 3632e71b7053SJung-uk Kim NULL, chainidx == 0) 3633e71b7053SJung-uk Kim || !tls_parse_all_extensions(s, SSL_EXT_TLS1_3_CERTIFICATE, 3634e71b7053SJung-uk Kim rawexts, x, chainidx, 3635e71b7053SJung-uk Kim PACKET_remaining(&spkt) == 0)) { 3636e71b7053SJung-uk Kim OPENSSL_free(rawexts); 3637e71b7053SJung-uk Kim goto err; 3638e71b7053SJung-uk Kim } 3639e71b7053SJung-uk Kim OPENSSL_free(rawexts); 3640e71b7053SJung-uk Kim } 3641e71b7053SJung-uk Kim 3642e71b7053SJung-uk Kim if (!sk_X509_push(sk, x)) { 3643e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_INTERNAL_ERROR, 3644e71b7053SJung-uk Kim SSL_F_TLS_PROCESS_CLIENT_CERTIFICATE, 3645e71b7053SJung-uk Kim ERR_R_MALLOC_FAILURE); 3646e71b7053SJung-uk Kim goto err; 3647e71b7053SJung-uk Kim } 3648e71b7053SJung-uk Kim x = NULL; 3649e71b7053SJung-uk Kim } 3650e71b7053SJung-uk Kim 3651e71b7053SJung-uk Kim if (sk_X509_num(sk) <= 0) { 3652e71b7053SJung-uk Kim /* TLS does not mind 0 certs returned */ 3653e71b7053SJung-uk Kim if (s->version == SSL3_VERSION) { 3654e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_HANDSHAKE_FAILURE, 3655e71b7053SJung-uk Kim SSL_F_TLS_PROCESS_CLIENT_CERTIFICATE, 3656e71b7053SJung-uk Kim SSL_R_NO_CERTIFICATES_RETURNED); 3657e71b7053SJung-uk Kim goto err; 3658e71b7053SJung-uk Kim } 3659e71b7053SJung-uk Kim /* Fail for TLS only if we required a certificate */ 3660e71b7053SJung-uk Kim else if ((s->verify_mode & SSL_VERIFY_PEER) && 3661e71b7053SJung-uk Kim (s->verify_mode & SSL_VERIFY_FAIL_IF_NO_PEER_CERT)) { 3662e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_CERTIFICATE_REQUIRED, 3663e71b7053SJung-uk Kim SSL_F_TLS_PROCESS_CLIENT_CERTIFICATE, 3664e71b7053SJung-uk Kim SSL_R_PEER_DID_NOT_RETURN_A_CERTIFICATE); 3665e71b7053SJung-uk Kim goto err; 3666e71b7053SJung-uk Kim } 3667e71b7053SJung-uk Kim /* No client certificate so digest cached records */ 3668e71b7053SJung-uk Kim if (s->s3->handshake_buffer && !ssl3_digest_cached_records(s, 0)) { 3669e71b7053SJung-uk Kim /* SSLfatal() already called */ 3670e71b7053SJung-uk Kim goto err; 3671e71b7053SJung-uk Kim } 3672e71b7053SJung-uk Kim } else { 3673e71b7053SJung-uk Kim EVP_PKEY *pkey; 3674e71b7053SJung-uk Kim i = ssl_verify_cert_chain(s, sk); 3675e71b7053SJung-uk Kim if (i <= 0) { 3676e71b7053SJung-uk Kim SSLfatal(s, ssl_x509err2alert(s->verify_result), 3677e71b7053SJung-uk Kim SSL_F_TLS_PROCESS_CLIENT_CERTIFICATE, 3678e71b7053SJung-uk Kim SSL_R_CERTIFICATE_VERIFY_FAILED); 3679e71b7053SJung-uk Kim goto err; 3680e71b7053SJung-uk Kim } 3681e71b7053SJung-uk Kim if (i > 1) { 3682e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_HANDSHAKE_FAILURE, 3683e71b7053SJung-uk Kim SSL_F_TLS_PROCESS_CLIENT_CERTIFICATE, i); 3684e71b7053SJung-uk Kim goto err; 3685e71b7053SJung-uk Kim } 3686e71b7053SJung-uk Kim pkey = X509_get0_pubkey(sk_X509_value(sk, 0)); 3687e71b7053SJung-uk Kim if (pkey == NULL) { 3688e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_HANDSHAKE_FAILURE, 3689e71b7053SJung-uk Kim SSL_F_TLS_PROCESS_CLIENT_CERTIFICATE, 3690e71b7053SJung-uk Kim SSL_R_UNKNOWN_CERTIFICATE_TYPE); 3691e71b7053SJung-uk Kim goto err; 3692e71b7053SJung-uk Kim } 3693e71b7053SJung-uk Kim } 3694e71b7053SJung-uk Kim 3695e71b7053SJung-uk Kim /* 3696e71b7053SJung-uk Kim * Sessions must be immutable once they go into the session cache. Otherwise 3697e71b7053SJung-uk Kim * we can get multi-thread problems. Therefore we don't "update" sessions, 3698e71b7053SJung-uk Kim * we replace them with a duplicate. Here, we need to do this every time 3699e71b7053SJung-uk Kim * a new certificate is received via post-handshake authentication, as the 3700e71b7053SJung-uk Kim * session may have already gone into the session cache. 3701e71b7053SJung-uk Kim */ 3702e71b7053SJung-uk Kim 3703e71b7053SJung-uk Kim if (s->post_handshake_auth == SSL_PHA_REQUESTED) { 3704e71b7053SJung-uk Kim if ((new_sess = ssl_session_dup(s->session, 0)) == 0) { 3705e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_INTERNAL_ERROR, 3706e71b7053SJung-uk Kim SSL_F_TLS_PROCESS_CLIENT_CERTIFICATE, 3707e71b7053SJung-uk Kim ERR_R_MALLOC_FAILURE); 3708e71b7053SJung-uk Kim goto err; 3709e71b7053SJung-uk Kim } 3710e71b7053SJung-uk Kim 3711e71b7053SJung-uk Kim SSL_SESSION_free(s->session); 3712e71b7053SJung-uk Kim s->session = new_sess; 3713e71b7053SJung-uk Kim } 3714e71b7053SJung-uk Kim 3715e71b7053SJung-uk Kim X509_free(s->session->peer); 3716e71b7053SJung-uk Kim s->session->peer = sk_X509_shift(sk); 3717e71b7053SJung-uk Kim s->session->verify_result = s->verify_result; 3718e71b7053SJung-uk Kim 3719e71b7053SJung-uk Kim sk_X509_pop_free(s->session->peer_chain, X509_free); 3720e71b7053SJung-uk Kim s->session->peer_chain = sk; 3721e71b7053SJung-uk Kim 3722e71b7053SJung-uk Kim /* 3723e71b7053SJung-uk Kim * Freeze the handshake buffer. For <TLS1.3 we do this after the CKE 3724e71b7053SJung-uk Kim * message 3725e71b7053SJung-uk Kim */ 3726e71b7053SJung-uk Kim if (SSL_IS_TLS13(s) && !ssl3_digest_cached_records(s, 1)) { 3727e71b7053SJung-uk Kim /* SSLfatal() already called */ 3728e71b7053SJung-uk Kim goto err; 3729e71b7053SJung-uk Kim } 3730e71b7053SJung-uk Kim 3731e71b7053SJung-uk Kim /* 3732e71b7053SJung-uk Kim * Inconsistency alert: cert_chain does *not* include the peer's own 3733e71b7053SJung-uk Kim * certificate, while we do include it in statem_clnt.c 3734e71b7053SJung-uk Kim */ 3735e71b7053SJung-uk Kim sk = NULL; 3736e71b7053SJung-uk Kim 3737e71b7053SJung-uk Kim /* Save the current hash state for when we receive the CertificateVerify */ 3738e71b7053SJung-uk Kim if (SSL_IS_TLS13(s)) { 3739e71b7053SJung-uk Kim if (!ssl_handshake_hash(s, s->cert_verify_hash, 3740e71b7053SJung-uk Kim sizeof(s->cert_verify_hash), 3741e71b7053SJung-uk Kim &s->cert_verify_hash_len)) { 3742e71b7053SJung-uk Kim /* SSLfatal() already called */ 3743e71b7053SJung-uk Kim goto err; 3744e71b7053SJung-uk Kim } 3745e71b7053SJung-uk Kim 3746e71b7053SJung-uk Kim /* Resend session tickets */ 3747e71b7053SJung-uk Kim s->sent_tickets = 0; 3748e71b7053SJung-uk Kim } 3749e71b7053SJung-uk Kim 3750e71b7053SJung-uk Kim ret = MSG_PROCESS_CONTINUE_READING; 3751e71b7053SJung-uk Kim 3752e71b7053SJung-uk Kim err: 3753e71b7053SJung-uk Kim X509_free(x); 3754e71b7053SJung-uk Kim sk_X509_pop_free(sk, X509_free); 3755e71b7053SJung-uk Kim return ret; 3756e71b7053SJung-uk Kim } 3757e71b7053SJung-uk Kim 3758e71b7053SJung-uk Kim int tls_construct_server_certificate(SSL *s, WPACKET *pkt) 3759e71b7053SJung-uk Kim { 3760e71b7053SJung-uk Kim CERT_PKEY *cpk = s->s3->tmp.cert; 3761e71b7053SJung-uk Kim 3762e71b7053SJung-uk Kim if (cpk == NULL) { 3763e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_INTERNAL_ERROR, 3764e71b7053SJung-uk Kim SSL_F_TLS_CONSTRUCT_SERVER_CERTIFICATE, ERR_R_INTERNAL_ERROR); 3765e71b7053SJung-uk Kim return 0; 3766e71b7053SJung-uk Kim } 3767e71b7053SJung-uk Kim 3768e71b7053SJung-uk Kim /* 3769e71b7053SJung-uk Kim * In TLSv1.3 the certificate chain is always preceded by a 0 length context 3770e71b7053SJung-uk Kim * for the server Certificate message 3771e71b7053SJung-uk Kim */ 3772e71b7053SJung-uk Kim if (SSL_IS_TLS13(s) && !WPACKET_put_bytes_u8(pkt, 0)) { 3773e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_INTERNAL_ERROR, 3774e71b7053SJung-uk Kim SSL_F_TLS_CONSTRUCT_SERVER_CERTIFICATE, ERR_R_INTERNAL_ERROR); 3775e71b7053SJung-uk Kim return 0; 3776e71b7053SJung-uk Kim } 3777e71b7053SJung-uk Kim if (!ssl3_output_cert_chain(s, pkt, cpk)) { 3778e71b7053SJung-uk Kim /* SSLfatal() already called */ 3779e71b7053SJung-uk Kim return 0; 3780e71b7053SJung-uk Kim } 3781e71b7053SJung-uk Kim 3782e71b7053SJung-uk Kim return 1; 3783e71b7053SJung-uk Kim } 3784e71b7053SJung-uk Kim 3785e71b7053SJung-uk Kim static int create_ticket_prequel(SSL *s, WPACKET *pkt, uint32_t age_add, 3786e71b7053SJung-uk Kim unsigned char *tick_nonce) 3787e71b7053SJung-uk Kim { 3788e71b7053SJung-uk Kim /* 3789e71b7053SJung-uk Kim * Ticket lifetime hint: For TLSv1.2 this is advisory only and we leave this 3790e71b7053SJung-uk Kim * unspecified for resumed session (for simplicity). 3791e71b7053SJung-uk Kim * In TLSv1.3 we reset the "time" field above, and always specify the 3792e71b7053SJung-uk Kim * timeout. 3793e71b7053SJung-uk Kim */ 3794e71b7053SJung-uk Kim if (!WPACKET_put_bytes_u32(pkt, 3795e71b7053SJung-uk Kim (s->hit && !SSL_IS_TLS13(s)) 3796e71b7053SJung-uk Kim ? 0 : s->session->timeout)) { 3797e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_CREATE_TICKET_PREQUEL, 3798e71b7053SJung-uk Kim ERR_R_INTERNAL_ERROR); 3799e71b7053SJung-uk Kim return 0; 3800e71b7053SJung-uk Kim } 3801e71b7053SJung-uk Kim 3802e71b7053SJung-uk Kim if (SSL_IS_TLS13(s)) { 3803e71b7053SJung-uk Kim if (!WPACKET_put_bytes_u32(pkt, age_add) 3804e71b7053SJung-uk Kim || !WPACKET_sub_memcpy_u8(pkt, tick_nonce, TICKET_NONCE_SIZE)) { 3805e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_CREATE_TICKET_PREQUEL, 3806e71b7053SJung-uk Kim ERR_R_INTERNAL_ERROR); 3807e71b7053SJung-uk Kim return 0; 3808e71b7053SJung-uk Kim } 3809e71b7053SJung-uk Kim } 3810e71b7053SJung-uk Kim 3811e71b7053SJung-uk Kim /* Start the sub-packet for the actual ticket data */ 3812e71b7053SJung-uk Kim if (!WPACKET_start_sub_packet_u16(pkt)) { 3813e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_CREATE_TICKET_PREQUEL, 3814e71b7053SJung-uk Kim ERR_R_INTERNAL_ERROR); 3815e71b7053SJung-uk Kim return 0; 3816e71b7053SJung-uk Kim } 3817e71b7053SJung-uk Kim 3818e71b7053SJung-uk Kim return 1; 3819e71b7053SJung-uk Kim } 3820e71b7053SJung-uk Kim 3821e71b7053SJung-uk Kim static int construct_stateless_ticket(SSL *s, WPACKET *pkt, uint32_t age_add, 3822e71b7053SJung-uk Kim unsigned char *tick_nonce) 3823e71b7053SJung-uk Kim { 3824e71b7053SJung-uk Kim unsigned char *senc = NULL; 3825e71b7053SJung-uk Kim EVP_CIPHER_CTX *ctx = NULL; 3826e71b7053SJung-uk Kim HMAC_CTX *hctx = NULL; 3827e71b7053SJung-uk Kim unsigned char *p, *encdata1, *encdata2, *macdata1, *macdata2; 3828e71b7053SJung-uk Kim const unsigned char *const_p; 3829e71b7053SJung-uk Kim int len, slen_full, slen, lenfinal; 3830e71b7053SJung-uk Kim SSL_SESSION *sess; 3831e71b7053SJung-uk Kim unsigned int hlen; 3832e71b7053SJung-uk Kim SSL_CTX *tctx = s->session_ctx; 3833e71b7053SJung-uk Kim unsigned char iv[EVP_MAX_IV_LENGTH]; 3834e71b7053SJung-uk Kim unsigned char key_name[TLSEXT_KEYNAME_LENGTH]; 3835e71b7053SJung-uk Kim int iv_len, ok = 0; 3836e71b7053SJung-uk Kim size_t macoffset, macendoffset; 3837e71b7053SJung-uk Kim 3838e71b7053SJung-uk Kim /* get session encoding length */ 3839e71b7053SJung-uk Kim slen_full = i2d_SSL_SESSION(s->session, NULL); 3840e71b7053SJung-uk Kim /* 3841e71b7053SJung-uk Kim * Some length values are 16 bits, so forget it if session is too 3842e71b7053SJung-uk Kim * long 3843e71b7053SJung-uk Kim */ 3844e71b7053SJung-uk Kim if (slen_full == 0 || slen_full > 0xFF00) { 3845e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_CONSTRUCT_STATELESS_TICKET, 3846e71b7053SJung-uk Kim ERR_R_INTERNAL_ERROR); 3847e71b7053SJung-uk Kim goto err; 3848e71b7053SJung-uk Kim } 3849e71b7053SJung-uk Kim senc = OPENSSL_malloc(slen_full); 3850e71b7053SJung-uk Kim if (senc == NULL) { 3851e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_INTERNAL_ERROR, 3852e71b7053SJung-uk Kim SSL_F_CONSTRUCT_STATELESS_TICKET, ERR_R_MALLOC_FAILURE); 3853e71b7053SJung-uk Kim goto err; 3854e71b7053SJung-uk Kim } 3855e71b7053SJung-uk Kim 3856e71b7053SJung-uk Kim ctx = EVP_CIPHER_CTX_new(); 3857e71b7053SJung-uk Kim hctx = HMAC_CTX_new(); 3858e71b7053SJung-uk Kim if (ctx == NULL || hctx == NULL) { 3859e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_CONSTRUCT_STATELESS_TICKET, 3860e71b7053SJung-uk Kim ERR_R_MALLOC_FAILURE); 3861e71b7053SJung-uk Kim goto err; 3862e71b7053SJung-uk Kim } 3863e71b7053SJung-uk Kim 3864e71b7053SJung-uk Kim p = senc; 3865e71b7053SJung-uk Kim if (!i2d_SSL_SESSION(s->session, &p)) { 3866e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_CONSTRUCT_STATELESS_TICKET, 3867e71b7053SJung-uk Kim ERR_R_INTERNAL_ERROR); 3868e71b7053SJung-uk Kim goto err; 3869e71b7053SJung-uk Kim } 3870e71b7053SJung-uk Kim 3871e71b7053SJung-uk Kim /* 3872e71b7053SJung-uk Kim * create a fresh copy (not shared with other threads) to clean up 3873e71b7053SJung-uk Kim */ 3874e71b7053SJung-uk Kim const_p = senc; 3875e71b7053SJung-uk Kim sess = d2i_SSL_SESSION(NULL, &const_p, slen_full); 3876e71b7053SJung-uk Kim if (sess == NULL) { 3877e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_CONSTRUCT_STATELESS_TICKET, 3878e71b7053SJung-uk Kim ERR_R_INTERNAL_ERROR); 3879e71b7053SJung-uk Kim goto err; 3880e71b7053SJung-uk Kim } 3881e71b7053SJung-uk Kim 3882e71b7053SJung-uk Kim slen = i2d_SSL_SESSION(sess, NULL); 3883e71b7053SJung-uk Kim if (slen == 0 || slen > slen_full) { 3884e71b7053SJung-uk Kim /* shouldn't ever happen */ 3885e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_CONSTRUCT_STATELESS_TICKET, 3886e71b7053SJung-uk Kim ERR_R_INTERNAL_ERROR); 3887e71b7053SJung-uk Kim SSL_SESSION_free(sess); 3888e71b7053SJung-uk Kim goto err; 3889e71b7053SJung-uk Kim } 3890e71b7053SJung-uk Kim p = senc; 3891e71b7053SJung-uk Kim if (!i2d_SSL_SESSION(sess, &p)) { 3892e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_CONSTRUCT_STATELESS_TICKET, 3893e71b7053SJung-uk Kim ERR_R_INTERNAL_ERROR); 3894e71b7053SJung-uk Kim SSL_SESSION_free(sess); 3895e71b7053SJung-uk Kim goto err; 3896e71b7053SJung-uk Kim } 3897e71b7053SJung-uk Kim SSL_SESSION_free(sess); 3898e71b7053SJung-uk Kim 3899e71b7053SJung-uk Kim /* 3900e71b7053SJung-uk Kim * Initialize HMAC and cipher contexts. If callback present it does 3901e71b7053SJung-uk Kim * all the work otherwise use generated values from parent ctx. 3902e71b7053SJung-uk Kim */ 3903e71b7053SJung-uk Kim if (tctx->ext.ticket_key_cb) { 3904e71b7053SJung-uk Kim /* if 0 is returned, write an empty ticket */ 3905e71b7053SJung-uk Kim int ret = tctx->ext.ticket_key_cb(s, key_name, iv, ctx, 3906e71b7053SJung-uk Kim hctx, 1); 3907e71b7053SJung-uk Kim 3908e71b7053SJung-uk Kim if (ret == 0) { 3909e71b7053SJung-uk Kim 3910e71b7053SJung-uk Kim /* Put timeout and length */ 3911e71b7053SJung-uk Kim if (!WPACKET_put_bytes_u32(pkt, 0) 3912e71b7053SJung-uk Kim || !WPACKET_put_bytes_u16(pkt, 0)) { 3913e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_INTERNAL_ERROR, 3914e71b7053SJung-uk Kim SSL_F_CONSTRUCT_STATELESS_TICKET, 3915e71b7053SJung-uk Kim ERR_R_INTERNAL_ERROR); 3916e71b7053SJung-uk Kim goto err; 3917e71b7053SJung-uk Kim } 3918e71b7053SJung-uk Kim OPENSSL_free(senc); 3919e71b7053SJung-uk Kim EVP_CIPHER_CTX_free(ctx); 3920e71b7053SJung-uk Kim HMAC_CTX_free(hctx); 3921e71b7053SJung-uk Kim return 1; 3922e71b7053SJung-uk Kim } 3923e71b7053SJung-uk Kim if (ret < 0) { 3924e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_CONSTRUCT_STATELESS_TICKET, 3925e71b7053SJung-uk Kim SSL_R_CALLBACK_FAILED); 3926e71b7053SJung-uk Kim goto err; 3927e71b7053SJung-uk Kim } 3928e71b7053SJung-uk Kim iv_len = EVP_CIPHER_CTX_iv_length(ctx); 3929e71b7053SJung-uk Kim } else { 3930e71b7053SJung-uk Kim const EVP_CIPHER *cipher = EVP_aes_256_cbc(); 3931e71b7053SJung-uk Kim 3932e71b7053SJung-uk Kim iv_len = EVP_CIPHER_iv_length(cipher); 3933e71b7053SJung-uk Kim if (RAND_bytes(iv, iv_len) <= 0 3934e71b7053SJung-uk Kim || !EVP_EncryptInit_ex(ctx, cipher, NULL, 3935e71b7053SJung-uk Kim tctx->ext.secure->tick_aes_key, iv) 3936e71b7053SJung-uk Kim || !HMAC_Init_ex(hctx, tctx->ext.secure->tick_hmac_key, 3937e71b7053SJung-uk Kim sizeof(tctx->ext.secure->tick_hmac_key), 3938e71b7053SJung-uk Kim EVP_sha256(), NULL)) { 3939e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_CONSTRUCT_STATELESS_TICKET, 3940e71b7053SJung-uk Kim ERR_R_INTERNAL_ERROR); 3941e71b7053SJung-uk Kim goto err; 3942e71b7053SJung-uk Kim } 3943e71b7053SJung-uk Kim memcpy(key_name, tctx->ext.tick_key_name, 3944e71b7053SJung-uk Kim sizeof(tctx->ext.tick_key_name)); 3945e71b7053SJung-uk Kim } 3946e71b7053SJung-uk Kim 3947e71b7053SJung-uk Kim if (!create_ticket_prequel(s, pkt, age_add, tick_nonce)) { 3948e71b7053SJung-uk Kim /* SSLfatal() already called */ 3949e71b7053SJung-uk Kim goto err; 3950e71b7053SJung-uk Kim } 3951e71b7053SJung-uk Kim 3952e71b7053SJung-uk Kim if (!WPACKET_get_total_written(pkt, &macoffset) 3953e71b7053SJung-uk Kim /* Output key name */ 3954e71b7053SJung-uk Kim || !WPACKET_memcpy(pkt, key_name, sizeof(key_name)) 3955e71b7053SJung-uk Kim /* output IV */ 3956e71b7053SJung-uk Kim || !WPACKET_memcpy(pkt, iv, iv_len) 3957e71b7053SJung-uk Kim || !WPACKET_reserve_bytes(pkt, slen + EVP_MAX_BLOCK_LENGTH, 3958e71b7053SJung-uk Kim &encdata1) 3959e71b7053SJung-uk Kim /* Encrypt session data */ 3960e71b7053SJung-uk Kim || !EVP_EncryptUpdate(ctx, encdata1, &len, senc, slen) 3961e71b7053SJung-uk Kim || !WPACKET_allocate_bytes(pkt, len, &encdata2) 3962e71b7053SJung-uk Kim || encdata1 != encdata2 3963e71b7053SJung-uk Kim || !EVP_EncryptFinal(ctx, encdata1 + len, &lenfinal) 3964e71b7053SJung-uk Kim || !WPACKET_allocate_bytes(pkt, lenfinal, &encdata2) 3965e71b7053SJung-uk Kim || encdata1 + len != encdata2 3966e71b7053SJung-uk Kim || len + lenfinal > slen + EVP_MAX_BLOCK_LENGTH 3967e71b7053SJung-uk Kim || !WPACKET_get_total_written(pkt, &macendoffset) 3968e71b7053SJung-uk Kim || !HMAC_Update(hctx, 3969e71b7053SJung-uk Kim (unsigned char *)s->init_buf->data + macoffset, 3970e71b7053SJung-uk Kim macendoffset - macoffset) 3971e71b7053SJung-uk Kim || !WPACKET_reserve_bytes(pkt, EVP_MAX_MD_SIZE, &macdata1) 3972e71b7053SJung-uk Kim || !HMAC_Final(hctx, macdata1, &hlen) 3973e71b7053SJung-uk Kim || hlen > EVP_MAX_MD_SIZE 3974e71b7053SJung-uk Kim || !WPACKET_allocate_bytes(pkt, hlen, &macdata2) 3975e71b7053SJung-uk Kim || macdata1 != macdata2) { 3976e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_INTERNAL_ERROR, 3977e71b7053SJung-uk Kim SSL_F_CONSTRUCT_STATELESS_TICKET, ERR_R_INTERNAL_ERROR); 3978e71b7053SJung-uk Kim goto err; 3979e71b7053SJung-uk Kim } 3980e71b7053SJung-uk Kim 3981e71b7053SJung-uk Kim /* Close the sub-packet created by create_ticket_prequel() */ 3982e71b7053SJung-uk Kim if (!WPACKET_close(pkt)) { 3983e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_CONSTRUCT_STATELESS_TICKET, 3984e71b7053SJung-uk Kim ERR_R_INTERNAL_ERROR); 3985e71b7053SJung-uk Kim goto err; 3986e71b7053SJung-uk Kim } 3987e71b7053SJung-uk Kim 3988e71b7053SJung-uk Kim ok = 1; 3989e71b7053SJung-uk Kim err: 3990e71b7053SJung-uk Kim OPENSSL_free(senc); 3991e71b7053SJung-uk Kim EVP_CIPHER_CTX_free(ctx); 3992e71b7053SJung-uk Kim HMAC_CTX_free(hctx); 3993e71b7053SJung-uk Kim return ok; 3994e71b7053SJung-uk Kim } 3995e71b7053SJung-uk Kim 3996e71b7053SJung-uk Kim static int construct_stateful_ticket(SSL *s, WPACKET *pkt, uint32_t age_add, 3997e71b7053SJung-uk Kim unsigned char *tick_nonce) 3998e71b7053SJung-uk Kim { 3999e71b7053SJung-uk Kim if (!create_ticket_prequel(s, pkt, age_add, tick_nonce)) { 4000e71b7053SJung-uk Kim /* SSLfatal() already called */ 4001e71b7053SJung-uk Kim return 0; 4002e71b7053SJung-uk Kim } 4003e71b7053SJung-uk Kim 4004e71b7053SJung-uk Kim if (!WPACKET_memcpy(pkt, s->session->session_id, 4005e71b7053SJung-uk Kim s->session->session_id_length) 4006e71b7053SJung-uk Kim || !WPACKET_close(pkt)) { 4007e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_CONSTRUCT_STATEFUL_TICKET, 4008e71b7053SJung-uk Kim ERR_R_INTERNAL_ERROR); 4009e71b7053SJung-uk Kim return 0; 4010e71b7053SJung-uk Kim } 4011e71b7053SJung-uk Kim 4012e71b7053SJung-uk Kim return 1; 4013e71b7053SJung-uk Kim } 4014e71b7053SJung-uk Kim 4015e71b7053SJung-uk Kim int tls_construct_new_session_ticket(SSL *s, WPACKET *pkt) 4016e71b7053SJung-uk Kim { 4017e71b7053SJung-uk Kim SSL_CTX *tctx = s->session_ctx; 4018e71b7053SJung-uk Kim unsigned char tick_nonce[TICKET_NONCE_SIZE]; 4019e71b7053SJung-uk Kim union { 4020e71b7053SJung-uk Kim unsigned char age_add_c[sizeof(uint32_t)]; 4021e71b7053SJung-uk Kim uint32_t age_add; 4022e71b7053SJung-uk Kim } age_add_u; 4023e71b7053SJung-uk Kim 4024e71b7053SJung-uk Kim age_add_u.age_add = 0; 4025e71b7053SJung-uk Kim 4026e71b7053SJung-uk Kim if (SSL_IS_TLS13(s)) { 4027e71b7053SJung-uk Kim size_t i, hashlen; 4028e71b7053SJung-uk Kim uint64_t nonce; 4029e71b7053SJung-uk Kim static const unsigned char nonce_label[] = "resumption"; 4030e71b7053SJung-uk Kim const EVP_MD *md = ssl_handshake_md(s); 4031e71b7053SJung-uk Kim void (*cb) (const SSL *ssl, int type, int val) = NULL; 4032e71b7053SJung-uk Kim int hashleni = EVP_MD_size(md); 4033e71b7053SJung-uk Kim 4034e71b7053SJung-uk Kim /* Ensure cast to size_t is safe */ 4035e71b7053SJung-uk Kim if (!ossl_assert(hashleni >= 0)) { 4036e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_INTERNAL_ERROR, 4037e71b7053SJung-uk Kim SSL_F_TLS_CONSTRUCT_NEW_SESSION_TICKET, 4038e71b7053SJung-uk Kim ERR_R_INTERNAL_ERROR); 4039e71b7053SJung-uk Kim goto err; 4040e71b7053SJung-uk Kim } 4041e71b7053SJung-uk Kim hashlen = (size_t)hashleni; 4042e71b7053SJung-uk Kim 4043e71b7053SJung-uk Kim if (s->info_callback != NULL) 4044e71b7053SJung-uk Kim cb = s->info_callback; 4045e71b7053SJung-uk Kim else if (s->ctx->info_callback != NULL) 4046e71b7053SJung-uk Kim cb = s->ctx->info_callback; 4047e71b7053SJung-uk Kim 4048e71b7053SJung-uk Kim if (cb != NULL) { 4049e71b7053SJung-uk Kim /* 4050e71b7053SJung-uk Kim * We don't start and stop the handshake in between each ticket when 4051e71b7053SJung-uk Kim * sending more than one - but it should appear that way to the info 4052e71b7053SJung-uk Kim * callback. 4053e71b7053SJung-uk Kim */ 4054e71b7053SJung-uk Kim if (s->sent_tickets != 0) { 4055e71b7053SJung-uk Kim ossl_statem_set_in_init(s, 0); 4056e71b7053SJung-uk Kim cb(s, SSL_CB_HANDSHAKE_DONE, 1); 4057e71b7053SJung-uk Kim ossl_statem_set_in_init(s, 1); 4058e71b7053SJung-uk Kim } 4059e71b7053SJung-uk Kim cb(s, SSL_CB_HANDSHAKE_START, 1); 4060e71b7053SJung-uk Kim } 4061e71b7053SJung-uk Kim /* 4062e71b7053SJung-uk Kim * If we already sent one NewSessionTicket, or we resumed then 4063e71b7053SJung-uk Kim * s->session may already be in a cache and so we must not modify it. 4064e71b7053SJung-uk Kim * Instead we need to take a copy of it and modify that. 4065e71b7053SJung-uk Kim */ 4066e71b7053SJung-uk Kim if (s->sent_tickets != 0 || s->hit) { 4067e71b7053SJung-uk Kim SSL_SESSION *new_sess = ssl_session_dup(s->session, 0); 4068e71b7053SJung-uk Kim 4069e71b7053SJung-uk Kim if (new_sess == NULL) { 4070e71b7053SJung-uk Kim /* SSLfatal already called */ 4071e71b7053SJung-uk Kim goto err; 4072e71b7053SJung-uk Kim } 4073e71b7053SJung-uk Kim 4074e71b7053SJung-uk Kim SSL_SESSION_free(s->session); 4075e71b7053SJung-uk Kim s->session = new_sess; 4076e71b7053SJung-uk Kim } 4077e71b7053SJung-uk Kim 4078e71b7053SJung-uk Kim if (!ssl_generate_session_id(s, s->session)) { 4079e71b7053SJung-uk Kim /* SSLfatal() already called */ 4080e71b7053SJung-uk Kim goto err; 4081e71b7053SJung-uk Kim } 4082e71b7053SJung-uk Kim if (RAND_bytes(age_add_u.age_add_c, sizeof(age_add_u)) <= 0) { 4083e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_INTERNAL_ERROR, 4084e71b7053SJung-uk Kim SSL_F_TLS_CONSTRUCT_NEW_SESSION_TICKET, 4085e71b7053SJung-uk Kim ERR_R_INTERNAL_ERROR); 4086e71b7053SJung-uk Kim goto err; 4087e71b7053SJung-uk Kim } 4088e71b7053SJung-uk Kim s->session->ext.tick_age_add = age_add_u.age_add; 4089e71b7053SJung-uk Kim 4090e71b7053SJung-uk Kim nonce = s->next_ticket_nonce; 4091e71b7053SJung-uk Kim for (i = TICKET_NONCE_SIZE; i > 0; i--) { 4092e71b7053SJung-uk Kim tick_nonce[i - 1] = (unsigned char)(nonce & 0xff); 4093e71b7053SJung-uk Kim nonce >>= 8; 4094e71b7053SJung-uk Kim } 4095e71b7053SJung-uk Kim 4096e71b7053SJung-uk Kim if (!tls13_hkdf_expand(s, md, s->resumption_master_secret, 4097e71b7053SJung-uk Kim nonce_label, 4098e71b7053SJung-uk Kim sizeof(nonce_label) - 1, 4099e71b7053SJung-uk Kim tick_nonce, 4100e71b7053SJung-uk Kim TICKET_NONCE_SIZE, 4101e71b7053SJung-uk Kim s->session->master_key, 4102e71b7053SJung-uk Kim hashlen)) { 4103e71b7053SJung-uk Kim /* SSLfatal() already called */ 4104e71b7053SJung-uk Kim goto err; 4105e71b7053SJung-uk Kim } 4106e71b7053SJung-uk Kim s->session->master_key_length = hashlen; 4107e71b7053SJung-uk Kim 4108e71b7053SJung-uk Kim s->session->time = (long)time(NULL); 4109e71b7053SJung-uk Kim if (s->s3->alpn_selected != NULL) { 4110e71b7053SJung-uk Kim OPENSSL_free(s->session->ext.alpn_selected); 4111e71b7053SJung-uk Kim s->session->ext.alpn_selected = 4112e71b7053SJung-uk Kim OPENSSL_memdup(s->s3->alpn_selected, s->s3->alpn_selected_len); 4113e71b7053SJung-uk Kim if (s->session->ext.alpn_selected == NULL) { 4114e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_INTERNAL_ERROR, 4115e71b7053SJung-uk Kim SSL_F_TLS_CONSTRUCT_NEW_SESSION_TICKET, 4116e71b7053SJung-uk Kim ERR_R_MALLOC_FAILURE); 4117e71b7053SJung-uk Kim goto err; 4118e71b7053SJung-uk Kim } 4119e71b7053SJung-uk Kim s->session->ext.alpn_selected_len = s->s3->alpn_selected_len; 4120e71b7053SJung-uk Kim } 4121e71b7053SJung-uk Kim s->session->ext.max_early_data = s->max_early_data; 4122e71b7053SJung-uk Kim } 4123e71b7053SJung-uk Kim 4124e71b7053SJung-uk Kim if (tctx->generate_ticket_cb != NULL && 4125e71b7053SJung-uk Kim tctx->generate_ticket_cb(s, tctx->ticket_cb_data) == 0) 4126e71b7053SJung-uk Kim goto err; 4127e71b7053SJung-uk Kim 4128e71b7053SJung-uk Kim /* 4129e71b7053SJung-uk Kim * If we are using anti-replay protection then we behave as if 4130e71b7053SJung-uk Kim * SSL_OP_NO_TICKET is set - we are caching tickets anyway so there 4131e71b7053SJung-uk Kim * is no point in using full stateless tickets. 4132e71b7053SJung-uk Kim */ 4133e71b7053SJung-uk Kim if (SSL_IS_TLS13(s) 4134e71b7053SJung-uk Kim && ((s->options & SSL_OP_NO_TICKET) != 0 4135e71b7053SJung-uk Kim || (s->max_early_data > 0 4136e71b7053SJung-uk Kim && (s->options & SSL_OP_NO_ANTI_REPLAY) == 0))) { 4137e71b7053SJung-uk Kim if (!construct_stateful_ticket(s, pkt, age_add_u.age_add, tick_nonce)) { 4138e71b7053SJung-uk Kim /* SSLfatal() already called */ 4139e71b7053SJung-uk Kim goto err; 4140e71b7053SJung-uk Kim } 4141e71b7053SJung-uk Kim } else if (!construct_stateless_ticket(s, pkt, age_add_u.age_add, 4142e71b7053SJung-uk Kim tick_nonce)) { 4143e71b7053SJung-uk Kim /* SSLfatal() already called */ 4144e71b7053SJung-uk Kim goto err; 4145e71b7053SJung-uk Kim } 4146e71b7053SJung-uk Kim 4147e71b7053SJung-uk Kim if (SSL_IS_TLS13(s)) { 4148e71b7053SJung-uk Kim if (!tls_construct_extensions(s, pkt, 4149e71b7053SJung-uk Kim SSL_EXT_TLS1_3_NEW_SESSION_TICKET, 4150e71b7053SJung-uk Kim NULL, 0)) { 4151e71b7053SJung-uk Kim /* SSLfatal() already called */ 4152e71b7053SJung-uk Kim goto err; 4153e71b7053SJung-uk Kim } 4154e71b7053SJung-uk Kim /* 4155e71b7053SJung-uk Kim * Increment both |sent_tickets| and |next_ticket_nonce|. |sent_tickets| 4156e71b7053SJung-uk Kim * gets reset to 0 if we send more tickets following a post-handshake 4157e71b7053SJung-uk Kim * auth, but |next_ticket_nonce| does not. 4158e71b7053SJung-uk Kim */ 4159e71b7053SJung-uk Kim s->sent_tickets++; 4160e71b7053SJung-uk Kim s->next_ticket_nonce++; 4161e71b7053SJung-uk Kim ssl_update_cache(s, SSL_SESS_CACHE_SERVER); 4162e71b7053SJung-uk Kim } 4163e71b7053SJung-uk Kim 4164e71b7053SJung-uk Kim return 1; 4165e71b7053SJung-uk Kim err: 4166e71b7053SJung-uk Kim return 0; 4167e71b7053SJung-uk Kim } 4168e71b7053SJung-uk Kim 4169e71b7053SJung-uk Kim /* 4170e71b7053SJung-uk Kim * In TLSv1.3 this is called from the extensions code, otherwise it is used to 4171e71b7053SJung-uk Kim * create a separate message. Returns 1 on success or 0 on failure. 4172e71b7053SJung-uk Kim */ 4173e71b7053SJung-uk Kim int tls_construct_cert_status_body(SSL *s, WPACKET *pkt) 4174e71b7053SJung-uk Kim { 4175e71b7053SJung-uk Kim if (!WPACKET_put_bytes_u8(pkt, s->ext.status_type) 4176e71b7053SJung-uk Kim || !WPACKET_sub_memcpy_u24(pkt, s->ext.ocsp.resp, 4177e71b7053SJung-uk Kim s->ext.ocsp.resp_len)) { 4178e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_TLS_CONSTRUCT_CERT_STATUS_BODY, 4179e71b7053SJung-uk Kim ERR_R_INTERNAL_ERROR); 4180e71b7053SJung-uk Kim return 0; 4181e71b7053SJung-uk Kim } 4182e71b7053SJung-uk Kim 4183e71b7053SJung-uk Kim return 1; 4184e71b7053SJung-uk Kim } 4185e71b7053SJung-uk Kim 4186e71b7053SJung-uk Kim int tls_construct_cert_status(SSL *s, WPACKET *pkt) 4187e71b7053SJung-uk Kim { 4188e71b7053SJung-uk Kim if (!tls_construct_cert_status_body(s, pkt)) { 4189e71b7053SJung-uk Kim /* SSLfatal() already called */ 4190e71b7053SJung-uk Kim return 0; 4191e71b7053SJung-uk Kim } 4192e71b7053SJung-uk Kim 4193e71b7053SJung-uk Kim return 1; 4194e71b7053SJung-uk Kim } 4195e71b7053SJung-uk Kim 4196e71b7053SJung-uk Kim #ifndef OPENSSL_NO_NEXTPROTONEG 4197e71b7053SJung-uk Kim /* 4198e71b7053SJung-uk Kim * tls_process_next_proto reads a Next Protocol Negotiation handshake message. 4199e71b7053SJung-uk Kim * It sets the next_proto member in s if found 4200e71b7053SJung-uk Kim */ 4201e71b7053SJung-uk Kim MSG_PROCESS_RETURN tls_process_next_proto(SSL *s, PACKET *pkt) 4202e71b7053SJung-uk Kim { 4203e71b7053SJung-uk Kim PACKET next_proto, padding; 4204e71b7053SJung-uk Kim size_t next_proto_len; 4205e71b7053SJung-uk Kim 4206e71b7053SJung-uk Kim /*- 4207e71b7053SJung-uk Kim * The payload looks like: 4208e71b7053SJung-uk Kim * uint8 proto_len; 4209e71b7053SJung-uk Kim * uint8 proto[proto_len]; 4210e71b7053SJung-uk Kim * uint8 padding_len; 4211e71b7053SJung-uk Kim * uint8 padding[padding_len]; 4212e71b7053SJung-uk Kim */ 4213e71b7053SJung-uk Kim if (!PACKET_get_length_prefixed_1(pkt, &next_proto) 4214e71b7053SJung-uk Kim || !PACKET_get_length_prefixed_1(pkt, &padding) 4215e71b7053SJung-uk Kim || PACKET_remaining(pkt) > 0) { 4216e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_DECODE_ERROR, SSL_F_TLS_PROCESS_NEXT_PROTO, 4217e71b7053SJung-uk Kim SSL_R_LENGTH_MISMATCH); 4218e71b7053SJung-uk Kim return MSG_PROCESS_ERROR; 4219e71b7053SJung-uk Kim } 4220e71b7053SJung-uk Kim 4221e71b7053SJung-uk Kim if (!PACKET_memdup(&next_proto, &s->ext.npn, &next_proto_len)) { 4222e71b7053SJung-uk Kim s->ext.npn_len = 0; 4223e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_TLS_PROCESS_NEXT_PROTO, 4224e71b7053SJung-uk Kim ERR_R_INTERNAL_ERROR); 4225e71b7053SJung-uk Kim return MSG_PROCESS_ERROR; 4226e71b7053SJung-uk Kim } 4227e71b7053SJung-uk Kim 4228e71b7053SJung-uk Kim s->ext.npn_len = (unsigned char)next_proto_len; 4229e71b7053SJung-uk Kim 4230e71b7053SJung-uk Kim return MSG_PROCESS_CONTINUE_READING; 4231e71b7053SJung-uk Kim } 4232e71b7053SJung-uk Kim #endif 4233e71b7053SJung-uk Kim 4234e71b7053SJung-uk Kim static int tls_construct_encrypted_extensions(SSL *s, WPACKET *pkt) 4235e71b7053SJung-uk Kim { 4236e71b7053SJung-uk Kim if (!tls_construct_extensions(s, pkt, SSL_EXT_TLS1_3_ENCRYPTED_EXTENSIONS, 4237e71b7053SJung-uk Kim NULL, 0)) { 4238e71b7053SJung-uk Kim /* SSLfatal() already called */ 4239e71b7053SJung-uk Kim return 0; 4240e71b7053SJung-uk Kim } 4241e71b7053SJung-uk Kim 4242e71b7053SJung-uk Kim return 1; 4243e71b7053SJung-uk Kim } 4244e71b7053SJung-uk Kim 4245e71b7053SJung-uk Kim MSG_PROCESS_RETURN tls_process_end_of_early_data(SSL *s, PACKET *pkt) 4246e71b7053SJung-uk Kim { 4247e71b7053SJung-uk Kim if (PACKET_remaining(pkt) != 0) { 4248e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_DECODE_ERROR, SSL_F_TLS_PROCESS_END_OF_EARLY_DATA, 4249e71b7053SJung-uk Kim SSL_R_LENGTH_MISMATCH); 4250e71b7053SJung-uk Kim return MSG_PROCESS_ERROR; 4251e71b7053SJung-uk Kim } 4252e71b7053SJung-uk Kim 4253e71b7053SJung-uk Kim if (s->early_data_state != SSL_EARLY_DATA_READING 4254e71b7053SJung-uk Kim && s->early_data_state != SSL_EARLY_DATA_READ_RETRY) { 4255e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_TLS_PROCESS_END_OF_EARLY_DATA, 4256e71b7053SJung-uk Kim ERR_R_INTERNAL_ERROR); 4257e71b7053SJung-uk Kim return MSG_PROCESS_ERROR; 4258e71b7053SJung-uk Kim } 4259e71b7053SJung-uk Kim 4260e71b7053SJung-uk Kim /* 4261e71b7053SJung-uk Kim * EndOfEarlyData signals a key change so the end of the message must be on 4262e71b7053SJung-uk Kim * a record boundary. 4263e71b7053SJung-uk Kim */ 4264e71b7053SJung-uk Kim if (RECORD_LAYER_processed_read_pending(&s->rlayer)) { 4265e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_UNEXPECTED_MESSAGE, 4266e71b7053SJung-uk Kim SSL_F_TLS_PROCESS_END_OF_EARLY_DATA, 4267e71b7053SJung-uk Kim SSL_R_NOT_ON_RECORD_BOUNDARY); 4268e71b7053SJung-uk Kim return MSG_PROCESS_ERROR; 4269e71b7053SJung-uk Kim } 4270e71b7053SJung-uk Kim 4271e71b7053SJung-uk Kim s->early_data_state = SSL_EARLY_DATA_FINISHED_READING; 4272e71b7053SJung-uk Kim if (!s->method->ssl3_enc->change_cipher_state(s, 4273e71b7053SJung-uk Kim SSL3_CC_HANDSHAKE | SSL3_CHANGE_CIPHER_SERVER_READ)) { 4274e71b7053SJung-uk Kim /* SSLfatal() already called */ 4275e71b7053SJung-uk Kim return MSG_PROCESS_ERROR; 4276e71b7053SJung-uk Kim } 4277e71b7053SJung-uk Kim 4278e71b7053SJung-uk Kim return MSG_PROCESS_CONTINUE_READING; 4279e71b7053SJung-uk Kim } 4280