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 <time.h> 14e71b7053SJung-uk Kim #include <assert.h> 15e71b7053SJung-uk Kim #include "../ssl_locl.h" 16e71b7053SJung-uk Kim #include "statem_locl.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/md5.h> 22e71b7053SJung-uk Kim #include <openssl/dh.h> 23e71b7053SJung-uk Kim #include <openssl/bn.h> 24e71b7053SJung-uk Kim #include <openssl/engine.h> 25e71b7053SJung-uk Kim #include <internal/cryptlib.h> 26e71b7053SJung-uk Kim 27e71b7053SJung-uk Kim static MSG_PROCESS_RETURN tls_process_as_hello_retry_request(SSL *s, PACKET *pkt); 28e71b7053SJung-uk Kim static MSG_PROCESS_RETURN tls_process_encrypted_extensions(SSL *s, PACKET *pkt); 29e71b7053SJung-uk Kim 30e71b7053SJung-uk Kim static ossl_inline int cert_req_allowed(SSL *s); 31e71b7053SJung-uk Kim static int key_exchange_expected(SSL *s); 32e71b7053SJung-uk Kim static int ssl_cipher_list_to_bytes(SSL *s, STACK_OF(SSL_CIPHER) *sk, 33e71b7053SJung-uk Kim WPACKET *pkt); 34e71b7053SJung-uk Kim 35e71b7053SJung-uk Kim /* 36e71b7053SJung-uk Kim * Is a CertificateRequest message allowed at the moment or not? 37e71b7053SJung-uk Kim * 38e71b7053SJung-uk Kim * Return values are: 39e71b7053SJung-uk Kim * 1: Yes 40e71b7053SJung-uk Kim * 0: No 41e71b7053SJung-uk Kim */ 42e71b7053SJung-uk Kim static ossl_inline int cert_req_allowed(SSL *s) 43e71b7053SJung-uk Kim { 44e71b7053SJung-uk Kim /* TLS does not like anon-DH with client cert */ 45e71b7053SJung-uk Kim if ((s->version > SSL3_VERSION 46e71b7053SJung-uk Kim && (s->s3->tmp.new_cipher->algorithm_auth & SSL_aNULL)) 47e71b7053SJung-uk Kim || (s->s3->tmp.new_cipher->algorithm_auth & (SSL_aSRP | SSL_aPSK))) 48e71b7053SJung-uk Kim return 0; 49e71b7053SJung-uk Kim 50e71b7053SJung-uk Kim return 1; 51e71b7053SJung-uk Kim } 52e71b7053SJung-uk Kim 53e71b7053SJung-uk Kim /* 54e71b7053SJung-uk Kim * Should we expect the ServerKeyExchange message or not? 55e71b7053SJung-uk Kim * 56e71b7053SJung-uk Kim * Return values are: 57e71b7053SJung-uk Kim * 1: Yes 58e71b7053SJung-uk Kim * 0: No 59e71b7053SJung-uk Kim */ 60e71b7053SJung-uk Kim static int key_exchange_expected(SSL *s) 61e71b7053SJung-uk Kim { 62e71b7053SJung-uk Kim long alg_k = s->s3->tmp.new_cipher->algorithm_mkey; 63e71b7053SJung-uk Kim 64e71b7053SJung-uk Kim /* 65e71b7053SJung-uk Kim * Can't skip server key exchange if this is an ephemeral 66e71b7053SJung-uk Kim * ciphersuite or for SRP 67e71b7053SJung-uk Kim */ 68e71b7053SJung-uk Kim if (alg_k & (SSL_kDHE | SSL_kECDHE | SSL_kDHEPSK | SSL_kECDHEPSK 69e71b7053SJung-uk Kim | SSL_kSRP)) { 70e71b7053SJung-uk Kim return 1; 71e71b7053SJung-uk Kim } 72e71b7053SJung-uk Kim 73e71b7053SJung-uk Kim return 0; 74e71b7053SJung-uk Kim } 75e71b7053SJung-uk Kim 76e71b7053SJung-uk Kim /* 77e71b7053SJung-uk Kim * ossl_statem_client_read_transition() encapsulates the logic for the allowed 78e71b7053SJung-uk Kim * handshake state transitions when a TLS1.3 client is reading messages from the 79e71b7053SJung-uk Kim * server. The message type that the server has sent is provided in |mt|. The 80e71b7053SJung-uk Kim * current state is in |s->statem.hand_state|. 81e71b7053SJung-uk Kim * 82e71b7053SJung-uk Kim * Return values are 1 for success (transition allowed) and 0 on error 83e71b7053SJung-uk Kim * (transition not allowed) 84e71b7053SJung-uk Kim */ 85e71b7053SJung-uk Kim static int ossl_statem_client13_read_transition(SSL *s, int mt) 86e71b7053SJung-uk Kim { 87e71b7053SJung-uk Kim OSSL_STATEM *st = &s->statem; 88e71b7053SJung-uk Kim 89e71b7053SJung-uk Kim /* 90e71b7053SJung-uk Kim * Note: There is no case for TLS_ST_CW_CLNT_HELLO, because we haven't 91e71b7053SJung-uk Kim * yet negotiated TLSv1.3 at that point so that is handled by 92e71b7053SJung-uk Kim * ossl_statem_client_read_transition() 93e71b7053SJung-uk Kim */ 94e71b7053SJung-uk Kim 95e71b7053SJung-uk Kim switch (st->hand_state) { 96e71b7053SJung-uk Kim default: 97e71b7053SJung-uk Kim break; 98e71b7053SJung-uk Kim 99e71b7053SJung-uk Kim case TLS_ST_CW_CLNT_HELLO: 100e71b7053SJung-uk Kim /* 101e71b7053SJung-uk Kim * This must a ClientHello following a HelloRetryRequest, so the only 102e71b7053SJung-uk Kim * thing we can get now is a ServerHello. 103e71b7053SJung-uk Kim */ 104e71b7053SJung-uk Kim if (mt == SSL3_MT_SERVER_HELLO) { 105e71b7053SJung-uk Kim st->hand_state = TLS_ST_CR_SRVR_HELLO; 106e71b7053SJung-uk Kim return 1; 107e71b7053SJung-uk Kim } 108e71b7053SJung-uk Kim break; 109e71b7053SJung-uk Kim 110e71b7053SJung-uk Kim case TLS_ST_CR_SRVR_HELLO: 111e71b7053SJung-uk Kim if (mt == SSL3_MT_ENCRYPTED_EXTENSIONS) { 112e71b7053SJung-uk Kim st->hand_state = TLS_ST_CR_ENCRYPTED_EXTENSIONS; 113e71b7053SJung-uk Kim return 1; 114e71b7053SJung-uk Kim } 115e71b7053SJung-uk Kim break; 116e71b7053SJung-uk Kim 117e71b7053SJung-uk Kim case TLS_ST_CR_ENCRYPTED_EXTENSIONS: 118e71b7053SJung-uk Kim if (s->hit) { 119e71b7053SJung-uk Kim if (mt == SSL3_MT_FINISHED) { 120e71b7053SJung-uk Kim st->hand_state = TLS_ST_CR_FINISHED; 121e71b7053SJung-uk Kim return 1; 122e71b7053SJung-uk Kim } 123e71b7053SJung-uk Kim } else { 124e71b7053SJung-uk Kim if (mt == SSL3_MT_CERTIFICATE_REQUEST) { 125e71b7053SJung-uk Kim st->hand_state = TLS_ST_CR_CERT_REQ; 126e71b7053SJung-uk Kim return 1; 127e71b7053SJung-uk Kim } 128e71b7053SJung-uk Kim if (mt == SSL3_MT_CERTIFICATE) { 129e71b7053SJung-uk Kim st->hand_state = TLS_ST_CR_CERT; 130e71b7053SJung-uk Kim return 1; 131e71b7053SJung-uk Kim } 132e71b7053SJung-uk Kim } 133e71b7053SJung-uk Kim break; 134e71b7053SJung-uk Kim 135e71b7053SJung-uk Kim case TLS_ST_CR_CERT_REQ: 136e71b7053SJung-uk Kim if (mt == SSL3_MT_CERTIFICATE) { 137e71b7053SJung-uk Kim st->hand_state = TLS_ST_CR_CERT; 138e71b7053SJung-uk Kim return 1; 139e71b7053SJung-uk Kim } 140e71b7053SJung-uk Kim break; 141e71b7053SJung-uk Kim 142e71b7053SJung-uk Kim case TLS_ST_CR_CERT: 143e71b7053SJung-uk Kim if (mt == SSL3_MT_CERTIFICATE_VERIFY) { 144e71b7053SJung-uk Kim st->hand_state = TLS_ST_CR_CERT_VRFY; 145e71b7053SJung-uk Kim return 1; 146e71b7053SJung-uk Kim } 147e71b7053SJung-uk Kim break; 148e71b7053SJung-uk Kim 149e71b7053SJung-uk Kim case TLS_ST_CR_CERT_VRFY: 150e71b7053SJung-uk Kim if (mt == SSL3_MT_FINISHED) { 151e71b7053SJung-uk Kim st->hand_state = TLS_ST_CR_FINISHED; 152e71b7053SJung-uk Kim return 1; 153e71b7053SJung-uk Kim } 154e71b7053SJung-uk Kim break; 155e71b7053SJung-uk Kim 156e71b7053SJung-uk Kim case TLS_ST_OK: 157e71b7053SJung-uk Kim if (mt == SSL3_MT_NEWSESSION_TICKET) { 158e71b7053SJung-uk Kim st->hand_state = TLS_ST_CR_SESSION_TICKET; 159e71b7053SJung-uk Kim return 1; 160e71b7053SJung-uk Kim } 161e71b7053SJung-uk Kim if (mt == SSL3_MT_KEY_UPDATE) { 162e71b7053SJung-uk Kim st->hand_state = TLS_ST_CR_KEY_UPDATE; 163e71b7053SJung-uk Kim return 1; 164e71b7053SJung-uk Kim } 165e71b7053SJung-uk Kim if (mt == SSL3_MT_CERTIFICATE_REQUEST) { 166e71b7053SJung-uk Kim #if DTLS_MAX_VERSION != DTLS1_2_VERSION 167e71b7053SJung-uk Kim # error TODO(DTLS1.3): Restore digest for PHA before adding message. 168e71b7053SJung-uk Kim #endif 169e71b7053SJung-uk Kim if (!SSL_IS_DTLS(s) && s->post_handshake_auth == SSL_PHA_EXT_SENT) { 170e71b7053SJung-uk Kim s->post_handshake_auth = SSL_PHA_REQUESTED; 171e71b7053SJung-uk Kim /* 172e71b7053SJung-uk Kim * In TLS, this is called before the message is added to the 173e71b7053SJung-uk Kim * digest. In DTLS, this is expected to be called after adding 174e71b7053SJung-uk Kim * to the digest. Either move the digest restore, or add the 175e71b7053SJung-uk Kim * message here after the swap, or do it after the clientFinished? 176e71b7053SJung-uk Kim */ 177e71b7053SJung-uk Kim if (!tls13_restore_handshake_digest_for_pha(s)) { 178e71b7053SJung-uk Kim /* SSLfatal() already called */ 179e71b7053SJung-uk Kim return 0; 180e71b7053SJung-uk Kim } 181e71b7053SJung-uk Kim st->hand_state = TLS_ST_CR_CERT_REQ; 182e71b7053SJung-uk Kim return 1; 183e71b7053SJung-uk Kim } 184e71b7053SJung-uk Kim } 185e71b7053SJung-uk Kim break; 186e71b7053SJung-uk Kim } 187e71b7053SJung-uk Kim 188e71b7053SJung-uk Kim /* No valid transition found */ 189e71b7053SJung-uk Kim return 0; 190e71b7053SJung-uk Kim } 191e71b7053SJung-uk Kim 192e71b7053SJung-uk Kim /* 193e71b7053SJung-uk Kim * ossl_statem_client_read_transition() encapsulates the logic for the allowed 194e71b7053SJung-uk Kim * handshake state transitions when the client is reading messages from the 195e71b7053SJung-uk Kim * server. The message type that the server has sent is provided in |mt|. The 196e71b7053SJung-uk Kim * current state is in |s->statem.hand_state|. 197e71b7053SJung-uk Kim * 198e71b7053SJung-uk Kim * Return values are 1 for success (transition allowed) and 0 on error 199e71b7053SJung-uk Kim * (transition not allowed) 200e71b7053SJung-uk Kim */ 201e71b7053SJung-uk Kim int ossl_statem_client_read_transition(SSL *s, int mt) 202e71b7053SJung-uk Kim { 203e71b7053SJung-uk Kim OSSL_STATEM *st = &s->statem; 204e71b7053SJung-uk Kim int ske_expected; 205e71b7053SJung-uk Kim 206e71b7053SJung-uk Kim /* 207e71b7053SJung-uk Kim * Note that after writing the first ClientHello we don't know what version 208e71b7053SJung-uk Kim * we are going to negotiate yet, so we don't take this branch until later. 209e71b7053SJung-uk Kim */ 210e71b7053SJung-uk Kim if (SSL_IS_TLS13(s)) { 211e71b7053SJung-uk Kim if (!ossl_statem_client13_read_transition(s, mt)) 212e71b7053SJung-uk Kim goto err; 213e71b7053SJung-uk Kim return 1; 214e71b7053SJung-uk Kim } 215e71b7053SJung-uk Kim 216e71b7053SJung-uk Kim switch (st->hand_state) { 217e71b7053SJung-uk Kim default: 218e71b7053SJung-uk Kim break; 219e71b7053SJung-uk Kim 220e71b7053SJung-uk Kim case TLS_ST_CW_CLNT_HELLO: 221e71b7053SJung-uk Kim if (mt == SSL3_MT_SERVER_HELLO) { 222e71b7053SJung-uk Kim st->hand_state = TLS_ST_CR_SRVR_HELLO; 223e71b7053SJung-uk Kim return 1; 224e71b7053SJung-uk Kim } 225e71b7053SJung-uk Kim 226e71b7053SJung-uk Kim if (SSL_IS_DTLS(s)) { 227e71b7053SJung-uk Kim if (mt == DTLS1_MT_HELLO_VERIFY_REQUEST) { 228e71b7053SJung-uk Kim st->hand_state = DTLS_ST_CR_HELLO_VERIFY_REQUEST; 229e71b7053SJung-uk Kim return 1; 230e71b7053SJung-uk Kim } 231e71b7053SJung-uk Kim } 232e71b7053SJung-uk Kim break; 233e71b7053SJung-uk Kim 234e71b7053SJung-uk Kim case TLS_ST_EARLY_DATA: 235e71b7053SJung-uk Kim /* 236e71b7053SJung-uk Kim * We've not actually selected TLSv1.3 yet, but we have sent early 237e71b7053SJung-uk Kim * data. The only thing allowed now is a ServerHello or a 238e71b7053SJung-uk Kim * HelloRetryRequest. 239e71b7053SJung-uk Kim */ 240e71b7053SJung-uk Kim if (mt == SSL3_MT_SERVER_HELLO) { 241e71b7053SJung-uk Kim st->hand_state = TLS_ST_CR_SRVR_HELLO; 242e71b7053SJung-uk Kim return 1; 243e71b7053SJung-uk Kim } 244e71b7053SJung-uk Kim break; 245e71b7053SJung-uk Kim 246e71b7053SJung-uk Kim case TLS_ST_CR_SRVR_HELLO: 247e71b7053SJung-uk Kim if (s->hit) { 248e71b7053SJung-uk Kim if (s->ext.ticket_expected) { 249e71b7053SJung-uk Kim if (mt == SSL3_MT_NEWSESSION_TICKET) { 250e71b7053SJung-uk Kim st->hand_state = TLS_ST_CR_SESSION_TICKET; 251e71b7053SJung-uk Kim return 1; 252e71b7053SJung-uk Kim } 253e71b7053SJung-uk Kim } else if (mt == SSL3_MT_CHANGE_CIPHER_SPEC) { 254e71b7053SJung-uk Kim st->hand_state = TLS_ST_CR_CHANGE; 255e71b7053SJung-uk Kim return 1; 256e71b7053SJung-uk Kim } 257e71b7053SJung-uk Kim } else { 258e71b7053SJung-uk Kim if (SSL_IS_DTLS(s) && mt == DTLS1_MT_HELLO_VERIFY_REQUEST) { 259e71b7053SJung-uk Kim st->hand_state = DTLS_ST_CR_HELLO_VERIFY_REQUEST; 260e71b7053SJung-uk Kim return 1; 261e71b7053SJung-uk Kim } else if (s->version >= TLS1_VERSION 262e71b7053SJung-uk Kim && s->ext.session_secret_cb != NULL 263e71b7053SJung-uk Kim && s->session->ext.tick != NULL 264e71b7053SJung-uk Kim && mt == SSL3_MT_CHANGE_CIPHER_SPEC) { 265e71b7053SJung-uk Kim /* 266e71b7053SJung-uk Kim * Normally, we can tell if the server is resuming the session 267e71b7053SJung-uk Kim * from the session ID. EAP-FAST (RFC 4851), however, relies on 268e71b7053SJung-uk Kim * the next server message after the ServerHello to determine if 269e71b7053SJung-uk Kim * the server is resuming. 270e71b7053SJung-uk Kim */ 271e71b7053SJung-uk Kim s->hit = 1; 272e71b7053SJung-uk Kim st->hand_state = TLS_ST_CR_CHANGE; 273e71b7053SJung-uk Kim return 1; 274e71b7053SJung-uk Kim } else if (!(s->s3->tmp.new_cipher->algorithm_auth 275e71b7053SJung-uk Kim & (SSL_aNULL | SSL_aSRP | SSL_aPSK))) { 276e71b7053SJung-uk Kim if (mt == SSL3_MT_CERTIFICATE) { 277e71b7053SJung-uk Kim st->hand_state = TLS_ST_CR_CERT; 278e71b7053SJung-uk Kim return 1; 279e71b7053SJung-uk Kim } 280e71b7053SJung-uk Kim } else { 281e71b7053SJung-uk Kim ske_expected = key_exchange_expected(s); 282e71b7053SJung-uk Kim /* SKE is optional for some PSK ciphersuites */ 283e71b7053SJung-uk Kim if (ske_expected 284e71b7053SJung-uk Kim || ((s->s3->tmp.new_cipher->algorithm_mkey & SSL_PSK) 285e71b7053SJung-uk Kim && mt == SSL3_MT_SERVER_KEY_EXCHANGE)) { 286e71b7053SJung-uk Kim if (mt == SSL3_MT_SERVER_KEY_EXCHANGE) { 287e71b7053SJung-uk Kim st->hand_state = TLS_ST_CR_KEY_EXCH; 288e71b7053SJung-uk Kim return 1; 289e71b7053SJung-uk Kim } 290e71b7053SJung-uk Kim } else if (mt == SSL3_MT_CERTIFICATE_REQUEST 291e71b7053SJung-uk Kim && cert_req_allowed(s)) { 292e71b7053SJung-uk Kim st->hand_state = TLS_ST_CR_CERT_REQ; 293e71b7053SJung-uk Kim return 1; 294e71b7053SJung-uk Kim } else if (mt == SSL3_MT_SERVER_DONE) { 295e71b7053SJung-uk Kim st->hand_state = TLS_ST_CR_SRVR_DONE; 296e71b7053SJung-uk Kim return 1; 297e71b7053SJung-uk Kim } 298e71b7053SJung-uk Kim } 299e71b7053SJung-uk Kim } 300e71b7053SJung-uk Kim break; 301e71b7053SJung-uk Kim 302e71b7053SJung-uk Kim case TLS_ST_CR_CERT: 303e71b7053SJung-uk Kim /* 304e71b7053SJung-uk Kim * The CertificateStatus message is optional even if 305e71b7053SJung-uk Kim * |ext.status_expected| is set 306e71b7053SJung-uk Kim */ 307e71b7053SJung-uk Kim if (s->ext.status_expected && mt == SSL3_MT_CERTIFICATE_STATUS) { 308e71b7053SJung-uk Kim st->hand_state = TLS_ST_CR_CERT_STATUS; 309e71b7053SJung-uk Kim return 1; 310e71b7053SJung-uk Kim } 311e71b7053SJung-uk Kim /* Fall through */ 312e71b7053SJung-uk Kim 313e71b7053SJung-uk Kim case TLS_ST_CR_CERT_STATUS: 314e71b7053SJung-uk Kim ske_expected = key_exchange_expected(s); 315e71b7053SJung-uk Kim /* SKE is optional for some PSK ciphersuites */ 316e71b7053SJung-uk Kim if (ske_expected || ((s->s3->tmp.new_cipher->algorithm_mkey & SSL_PSK) 317e71b7053SJung-uk Kim && mt == SSL3_MT_SERVER_KEY_EXCHANGE)) { 318e71b7053SJung-uk Kim if (mt == SSL3_MT_SERVER_KEY_EXCHANGE) { 319e71b7053SJung-uk Kim st->hand_state = TLS_ST_CR_KEY_EXCH; 320e71b7053SJung-uk Kim return 1; 321e71b7053SJung-uk Kim } 322e71b7053SJung-uk Kim goto err; 323e71b7053SJung-uk Kim } 324e71b7053SJung-uk Kim /* Fall through */ 325e71b7053SJung-uk Kim 326e71b7053SJung-uk Kim case TLS_ST_CR_KEY_EXCH: 327e71b7053SJung-uk Kim if (mt == SSL3_MT_CERTIFICATE_REQUEST) { 328e71b7053SJung-uk Kim if (cert_req_allowed(s)) { 329e71b7053SJung-uk Kim st->hand_state = TLS_ST_CR_CERT_REQ; 330e71b7053SJung-uk Kim return 1; 331e71b7053SJung-uk Kim } 332e71b7053SJung-uk Kim goto err; 333e71b7053SJung-uk Kim } 334e71b7053SJung-uk Kim /* Fall through */ 335e71b7053SJung-uk Kim 336e71b7053SJung-uk Kim case TLS_ST_CR_CERT_REQ: 337e71b7053SJung-uk Kim if (mt == SSL3_MT_SERVER_DONE) { 338e71b7053SJung-uk Kim st->hand_state = TLS_ST_CR_SRVR_DONE; 339e71b7053SJung-uk Kim return 1; 340e71b7053SJung-uk Kim } 341e71b7053SJung-uk Kim break; 342e71b7053SJung-uk Kim 343e71b7053SJung-uk Kim case TLS_ST_CW_FINISHED: 344e71b7053SJung-uk Kim if (s->ext.ticket_expected) { 345e71b7053SJung-uk Kim if (mt == SSL3_MT_NEWSESSION_TICKET) { 346e71b7053SJung-uk Kim st->hand_state = TLS_ST_CR_SESSION_TICKET; 347e71b7053SJung-uk Kim return 1; 348e71b7053SJung-uk Kim } 349e71b7053SJung-uk Kim } else if (mt == SSL3_MT_CHANGE_CIPHER_SPEC) { 350e71b7053SJung-uk Kim st->hand_state = TLS_ST_CR_CHANGE; 351e71b7053SJung-uk Kim return 1; 352e71b7053SJung-uk Kim } 353e71b7053SJung-uk Kim break; 354e71b7053SJung-uk Kim 355e71b7053SJung-uk Kim case TLS_ST_CR_SESSION_TICKET: 356e71b7053SJung-uk Kim if (mt == SSL3_MT_CHANGE_CIPHER_SPEC) { 357e71b7053SJung-uk Kim st->hand_state = TLS_ST_CR_CHANGE; 358e71b7053SJung-uk Kim return 1; 359e71b7053SJung-uk Kim } 360e71b7053SJung-uk Kim break; 361e71b7053SJung-uk Kim 362e71b7053SJung-uk Kim case TLS_ST_CR_CHANGE: 363e71b7053SJung-uk Kim if (mt == SSL3_MT_FINISHED) { 364e71b7053SJung-uk Kim st->hand_state = TLS_ST_CR_FINISHED; 365e71b7053SJung-uk Kim return 1; 366e71b7053SJung-uk Kim } 367e71b7053SJung-uk Kim break; 368e71b7053SJung-uk Kim 369e71b7053SJung-uk Kim case TLS_ST_OK: 370e71b7053SJung-uk Kim if (mt == SSL3_MT_HELLO_REQUEST) { 371e71b7053SJung-uk Kim st->hand_state = TLS_ST_CR_HELLO_REQ; 372e71b7053SJung-uk Kim return 1; 373e71b7053SJung-uk Kim } 374e71b7053SJung-uk Kim break; 375e71b7053SJung-uk Kim } 376e71b7053SJung-uk Kim 377e71b7053SJung-uk Kim err: 378e71b7053SJung-uk Kim /* No valid transition found */ 379e71b7053SJung-uk Kim if (SSL_IS_DTLS(s) && mt == SSL3_MT_CHANGE_CIPHER_SPEC) { 380e71b7053SJung-uk Kim BIO *rbio; 381e71b7053SJung-uk Kim 382e71b7053SJung-uk Kim /* 383e71b7053SJung-uk Kim * CCS messages don't have a message sequence number so this is probably 384e71b7053SJung-uk Kim * because of an out-of-order CCS. We'll just drop it. 385e71b7053SJung-uk Kim */ 386e71b7053SJung-uk Kim s->init_num = 0; 387e71b7053SJung-uk Kim s->rwstate = SSL_READING; 388e71b7053SJung-uk Kim rbio = SSL_get_rbio(s); 389e71b7053SJung-uk Kim BIO_clear_retry_flags(rbio); 390e71b7053SJung-uk Kim BIO_set_retry_read(rbio); 391e71b7053SJung-uk Kim return 0; 392e71b7053SJung-uk Kim } 393e71b7053SJung-uk Kim SSLfatal(s, SSL3_AD_UNEXPECTED_MESSAGE, 394e71b7053SJung-uk Kim SSL_F_OSSL_STATEM_CLIENT_READ_TRANSITION, 395e71b7053SJung-uk Kim SSL_R_UNEXPECTED_MESSAGE); 396e71b7053SJung-uk Kim return 0; 397e71b7053SJung-uk Kim } 398e71b7053SJung-uk Kim 399e71b7053SJung-uk Kim /* 400e71b7053SJung-uk Kim * ossl_statem_client13_write_transition() works out what handshake state to 401e71b7053SJung-uk Kim * move to next when the TLSv1.3 client is writing messages to be sent to the 402e71b7053SJung-uk Kim * server. 403e71b7053SJung-uk Kim */ 404e71b7053SJung-uk Kim static WRITE_TRAN ossl_statem_client13_write_transition(SSL *s) 405e71b7053SJung-uk Kim { 406e71b7053SJung-uk Kim OSSL_STATEM *st = &s->statem; 407e71b7053SJung-uk Kim 408e71b7053SJung-uk Kim /* 409e71b7053SJung-uk Kim * Note: There are no cases for TLS_ST_BEFORE because we haven't negotiated 410e71b7053SJung-uk Kim * TLSv1.3 yet at that point. They are handled by 411e71b7053SJung-uk Kim * ossl_statem_client_write_transition(). 412e71b7053SJung-uk Kim */ 413e71b7053SJung-uk Kim switch (st->hand_state) { 414e71b7053SJung-uk Kim default: 415e71b7053SJung-uk Kim /* Shouldn't happen */ 416e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_INTERNAL_ERROR, 417e71b7053SJung-uk Kim SSL_F_OSSL_STATEM_CLIENT13_WRITE_TRANSITION, 418e71b7053SJung-uk Kim ERR_R_INTERNAL_ERROR); 419e71b7053SJung-uk Kim return WRITE_TRAN_ERROR; 420e71b7053SJung-uk Kim 421e71b7053SJung-uk Kim case TLS_ST_CR_CERT_REQ: 422e71b7053SJung-uk Kim if (s->post_handshake_auth == SSL_PHA_REQUESTED) { 423e71b7053SJung-uk Kim st->hand_state = TLS_ST_CW_CERT; 424e71b7053SJung-uk Kim return WRITE_TRAN_CONTINUE; 425e71b7053SJung-uk Kim } 426e71b7053SJung-uk Kim /* 427e71b7053SJung-uk Kim * We should only get here if we received a CertificateRequest after 428e71b7053SJung-uk Kim * we already sent close_notify 429e71b7053SJung-uk Kim */ 430e71b7053SJung-uk Kim if (!ossl_assert((s->shutdown & SSL_SENT_SHUTDOWN) != 0)) { 431e71b7053SJung-uk Kim /* Shouldn't happen - same as default case */ 432e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_INTERNAL_ERROR, 433e71b7053SJung-uk Kim SSL_F_OSSL_STATEM_CLIENT13_WRITE_TRANSITION, 434e71b7053SJung-uk Kim ERR_R_INTERNAL_ERROR); 435e71b7053SJung-uk Kim return WRITE_TRAN_ERROR; 436e71b7053SJung-uk Kim } 437e71b7053SJung-uk Kim st->hand_state = TLS_ST_OK; 438e71b7053SJung-uk Kim return WRITE_TRAN_CONTINUE; 439e71b7053SJung-uk Kim 440e71b7053SJung-uk Kim case TLS_ST_CR_FINISHED: 441e71b7053SJung-uk Kim if (s->early_data_state == SSL_EARLY_DATA_WRITE_RETRY 442e71b7053SJung-uk Kim || s->early_data_state == SSL_EARLY_DATA_FINISHED_WRITING) 443e71b7053SJung-uk Kim st->hand_state = TLS_ST_PENDING_EARLY_DATA_END; 444e71b7053SJung-uk Kim else if ((s->options & SSL_OP_ENABLE_MIDDLEBOX_COMPAT) != 0 445e71b7053SJung-uk Kim && s->hello_retry_request == SSL_HRR_NONE) 446e71b7053SJung-uk Kim st->hand_state = TLS_ST_CW_CHANGE; 447e71b7053SJung-uk Kim else 448e71b7053SJung-uk Kim st->hand_state = (s->s3->tmp.cert_req != 0) ? TLS_ST_CW_CERT 449e71b7053SJung-uk Kim : TLS_ST_CW_FINISHED; 450e71b7053SJung-uk Kim return WRITE_TRAN_CONTINUE; 451e71b7053SJung-uk Kim 452e71b7053SJung-uk Kim case TLS_ST_PENDING_EARLY_DATA_END: 453e71b7053SJung-uk Kim if (s->ext.early_data == SSL_EARLY_DATA_ACCEPTED) { 454e71b7053SJung-uk Kim st->hand_state = TLS_ST_CW_END_OF_EARLY_DATA; 455e71b7053SJung-uk Kim return WRITE_TRAN_CONTINUE; 456e71b7053SJung-uk Kim } 457e71b7053SJung-uk Kim /* Fall through */ 458e71b7053SJung-uk Kim 459e71b7053SJung-uk Kim case TLS_ST_CW_END_OF_EARLY_DATA: 460e71b7053SJung-uk Kim case TLS_ST_CW_CHANGE: 461e71b7053SJung-uk Kim st->hand_state = (s->s3->tmp.cert_req != 0) ? TLS_ST_CW_CERT 462e71b7053SJung-uk Kim : TLS_ST_CW_FINISHED; 463e71b7053SJung-uk Kim return WRITE_TRAN_CONTINUE; 464e71b7053SJung-uk Kim 465e71b7053SJung-uk Kim case TLS_ST_CW_CERT: 466e71b7053SJung-uk Kim /* If a non-empty Certificate we also send CertificateVerify */ 467e71b7053SJung-uk Kim st->hand_state = (s->s3->tmp.cert_req == 1) ? TLS_ST_CW_CERT_VRFY 468e71b7053SJung-uk Kim : TLS_ST_CW_FINISHED; 469e71b7053SJung-uk Kim return WRITE_TRAN_CONTINUE; 470e71b7053SJung-uk Kim 471e71b7053SJung-uk Kim case TLS_ST_CW_CERT_VRFY: 472e71b7053SJung-uk Kim st->hand_state = TLS_ST_CW_FINISHED; 473e71b7053SJung-uk Kim return WRITE_TRAN_CONTINUE; 474e71b7053SJung-uk Kim 475e71b7053SJung-uk Kim case TLS_ST_CR_KEY_UPDATE: 476e71b7053SJung-uk Kim if (s->key_update != SSL_KEY_UPDATE_NONE) { 477e71b7053SJung-uk Kim st->hand_state = TLS_ST_CW_KEY_UPDATE; 478e71b7053SJung-uk Kim return WRITE_TRAN_CONTINUE; 479e71b7053SJung-uk Kim } 480e71b7053SJung-uk Kim /* Fall through */ 481e71b7053SJung-uk Kim 482e71b7053SJung-uk Kim case TLS_ST_CW_KEY_UPDATE: 483e71b7053SJung-uk Kim case TLS_ST_CR_SESSION_TICKET: 484e71b7053SJung-uk Kim case TLS_ST_CW_FINISHED: 485e71b7053SJung-uk Kim st->hand_state = TLS_ST_OK; 486e71b7053SJung-uk Kim return WRITE_TRAN_CONTINUE; 487e71b7053SJung-uk Kim 488e71b7053SJung-uk Kim case TLS_ST_OK: 489e71b7053SJung-uk Kim if (s->key_update != SSL_KEY_UPDATE_NONE) { 490e71b7053SJung-uk Kim st->hand_state = TLS_ST_CW_KEY_UPDATE; 491e71b7053SJung-uk Kim return WRITE_TRAN_CONTINUE; 492e71b7053SJung-uk Kim } 493e71b7053SJung-uk Kim 494e71b7053SJung-uk Kim /* Try to read from the server instead */ 495e71b7053SJung-uk Kim return WRITE_TRAN_FINISHED; 496e71b7053SJung-uk Kim } 497e71b7053SJung-uk Kim } 498e71b7053SJung-uk Kim 499e71b7053SJung-uk Kim /* 500e71b7053SJung-uk Kim * ossl_statem_client_write_transition() works out what handshake state to 501e71b7053SJung-uk Kim * move to next when the client is writing messages to be sent to the server. 502e71b7053SJung-uk Kim */ 503e71b7053SJung-uk Kim WRITE_TRAN ossl_statem_client_write_transition(SSL *s) 504e71b7053SJung-uk Kim { 505e71b7053SJung-uk Kim OSSL_STATEM *st = &s->statem; 506e71b7053SJung-uk Kim 507e71b7053SJung-uk Kim /* 508e71b7053SJung-uk Kim * Note that immediately before/after a ClientHello we don't know what 509e71b7053SJung-uk Kim * version we are going to negotiate yet, so we don't take this branch until 510e71b7053SJung-uk Kim * later 511e71b7053SJung-uk Kim */ 512e71b7053SJung-uk Kim if (SSL_IS_TLS13(s)) 513e71b7053SJung-uk Kim return ossl_statem_client13_write_transition(s); 514e71b7053SJung-uk Kim 515e71b7053SJung-uk Kim switch (st->hand_state) { 516e71b7053SJung-uk Kim default: 517e71b7053SJung-uk Kim /* Shouldn't happen */ 518e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_INTERNAL_ERROR, 519e71b7053SJung-uk Kim SSL_F_OSSL_STATEM_CLIENT_WRITE_TRANSITION, 520e71b7053SJung-uk Kim ERR_R_INTERNAL_ERROR); 521e71b7053SJung-uk Kim return WRITE_TRAN_ERROR; 522e71b7053SJung-uk Kim 523e71b7053SJung-uk Kim case TLS_ST_OK: 524e71b7053SJung-uk Kim if (!s->renegotiate) { 525e71b7053SJung-uk Kim /* 526e71b7053SJung-uk Kim * We haven't requested a renegotiation ourselves so we must have 527e71b7053SJung-uk Kim * received a message from the server. Better read it. 528e71b7053SJung-uk Kim */ 529e71b7053SJung-uk Kim return WRITE_TRAN_FINISHED; 530e71b7053SJung-uk Kim } 531e71b7053SJung-uk Kim /* Renegotiation */ 532e71b7053SJung-uk Kim /* fall thru */ 533e71b7053SJung-uk Kim case TLS_ST_BEFORE: 534e71b7053SJung-uk Kim st->hand_state = TLS_ST_CW_CLNT_HELLO; 535e71b7053SJung-uk Kim return WRITE_TRAN_CONTINUE; 536e71b7053SJung-uk Kim 537e71b7053SJung-uk Kim case TLS_ST_CW_CLNT_HELLO: 538e71b7053SJung-uk Kim if (s->early_data_state == SSL_EARLY_DATA_CONNECTING) { 539e71b7053SJung-uk Kim /* 540e71b7053SJung-uk Kim * We are assuming this is a TLSv1.3 connection, although we haven't 541e71b7053SJung-uk Kim * actually selected a version yet. 542e71b7053SJung-uk Kim */ 543e71b7053SJung-uk Kim if ((s->options & SSL_OP_ENABLE_MIDDLEBOX_COMPAT) != 0) 544e71b7053SJung-uk Kim st->hand_state = TLS_ST_CW_CHANGE; 545e71b7053SJung-uk Kim else 546e71b7053SJung-uk Kim st->hand_state = TLS_ST_EARLY_DATA; 547e71b7053SJung-uk Kim return WRITE_TRAN_CONTINUE; 548e71b7053SJung-uk Kim } 549e71b7053SJung-uk Kim /* 550e71b7053SJung-uk Kim * No transition at the end of writing because we don't know what 551e71b7053SJung-uk Kim * we will be sent 552e71b7053SJung-uk Kim */ 553e71b7053SJung-uk Kim return WRITE_TRAN_FINISHED; 554e71b7053SJung-uk Kim 555e71b7053SJung-uk Kim case TLS_ST_CR_SRVR_HELLO: 556e71b7053SJung-uk Kim /* 557e71b7053SJung-uk Kim * We only get here in TLSv1.3. We just received an HRR, so issue a 558e71b7053SJung-uk Kim * CCS unless middlebox compat mode is off, or we already issued one 559e71b7053SJung-uk Kim * because we did early data. 560e71b7053SJung-uk Kim */ 561e71b7053SJung-uk Kim if ((s->options & SSL_OP_ENABLE_MIDDLEBOX_COMPAT) != 0 562e71b7053SJung-uk Kim && s->early_data_state != SSL_EARLY_DATA_FINISHED_WRITING) 563e71b7053SJung-uk Kim st->hand_state = TLS_ST_CW_CHANGE; 564e71b7053SJung-uk Kim else 565e71b7053SJung-uk Kim st->hand_state = TLS_ST_CW_CLNT_HELLO; 566e71b7053SJung-uk Kim return WRITE_TRAN_CONTINUE; 567e71b7053SJung-uk Kim 568e71b7053SJung-uk Kim case TLS_ST_EARLY_DATA: 569e71b7053SJung-uk Kim return WRITE_TRAN_FINISHED; 570e71b7053SJung-uk Kim 571e71b7053SJung-uk Kim case DTLS_ST_CR_HELLO_VERIFY_REQUEST: 572e71b7053SJung-uk Kim st->hand_state = TLS_ST_CW_CLNT_HELLO; 573e71b7053SJung-uk Kim return WRITE_TRAN_CONTINUE; 574e71b7053SJung-uk Kim 575e71b7053SJung-uk Kim case TLS_ST_CR_SRVR_DONE: 576e71b7053SJung-uk Kim if (s->s3->tmp.cert_req) 577e71b7053SJung-uk Kim st->hand_state = TLS_ST_CW_CERT; 578e71b7053SJung-uk Kim else 579e71b7053SJung-uk Kim st->hand_state = TLS_ST_CW_KEY_EXCH; 580e71b7053SJung-uk Kim return WRITE_TRAN_CONTINUE; 581e71b7053SJung-uk Kim 582e71b7053SJung-uk Kim case TLS_ST_CW_CERT: 583e71b7053SJung-uk Kim st->hand_state = TLS_ST_CW_KEY_EXCH; 584e71b7053SJung-uk Kim return WRITE_TRAN_CONTINUE; 585e71b7053SJung-uk Kim 586e71b7053SJung-uk Kim case TLS_ST_CW_KEY_EXCH: 587e71b7053SJung-uk Kim /* 588e71b7053SJung-uk Kim * For TLS, cert_req is set to 2, so a cert chain of nothing is 589e71b7053SJung-uk Kim * sent, but no verify packet is sent 590e71b7053SJung-uk Kim */ 591e71b7053SJung-uk Kim /* 592e71b7053SJung-uk Kim * XXX: For now, we do not support client authentication in ECDH 593e71b7053SJung-uk Kim * cipher suites with ECDH (rather than ECDSA) certificates. We 594e71b7053SJung-uk Kim * need to skip the certificate verify message when client's 595e71b7053SJung-uk Kim * ECDH public key is sent inside the client certificate. 596e71b7053SJung-uk Kim */ 597e71b7053SJung-uk Kim if (s->s3->tmp.cert_req == 1) { 598e71b7053SJung-uk Kim st->hand_state = TLS_ST_CW_CERT_VRFY; 599e71b7053SJung-uk Kim } else { 600e71b7053SJung-uk Kim st->hand_state = TLS_ST_CW_CHANGE; 601e71b7053SJung-uk Kim } 602e71b7053SJung-uk Kim if (s->s3->flags & TLS1_FLAGS_SKIP_CERT_VERIFY) { 603e71b7053SJung-uk Kim st->hand_state = TLS_ST_CW_CHANGE; 604e71b7053SJung-uk Kim } 605e71b7053SJung-uk Kim return WRITE_TRAN_CONTINUE; 606e71b7053SJung-uk Kim 607e71b7053SJung-uk Kim case TLS_ST_CW_CERT_VRFY: 608e71b7053SJung-uk Kim st->hand_state = TLS_ST_CW_CHANGE; 609e71b7053SJung-uk Kim return WRITE_TRAN_CONTINUE; 610e71b7053SJung-uk Kim 611e71b7053SJung-uk Kim case TLS_ST_CW_CHANGE: 612e71b7053SJung-uk Kim if (s->hello_retry_request == SSL_HRR_PENDING) { 613e71b7053SJung-uk Kim st->hand_state = TLS_ST_CW_CLNT_HELLO; 614e71b7053SJung-uk Kim } else if (s->early_data_state == SSL_EARLY_DATA_CONNECTING) { 615e71b7053SJung-uk Kim st->hand_state = TLS_ST_EARLY_DATA; 616e71b7053SJung-uk Kim } else { 617e71b7053SJung-uk Kim #if defined(OPENSSL_NO_NEXTPROTONEG) 618e71b7053SJung-uk Kim st->hand_state = TLS_ST_CW_FINISHED; 619e71b7053SJung-uk Kim #else 620e71b7053SJung-uk Kim if (!SSL_IS_DTLS(s) && s->s3->npn_seen) 621e71b7053SJung-uk Kim st->hand_state = TLS_ST_CW_NEXT_PROTO; 622e71b7053SJung-uk Kim else 623e71b7053SJung-uk Kim st->hand_state = TLS_ST_CW_FINISHED; 624e71b7053SJung-uk Kim #endif 625e71b7053SJung-uk Kim } 626e71b7053SJung-uk Kim return WRITE_TRAN_CONTINUE; 627e71b7053SJung-uk Kim 628e71b7053SJung-uk Kim #if !defined(OPENSSL_NO_NEXTPROTONEG) 629e71b7053SJung-uk Kim case TLS_ST_CW_NEXT_PROTO: 630e71b7053SJung-uk Kim st->hand_state = TLS_ST_CW_FINISHED; 631e71b7053SJung-uk Kim return WRITE_TRAN_CONTINUE; 632e71b7053SJung-uk Kim #endif 633e71b7053SJung-uk Kim 634e71b7053SJung-uk Kim case TLS_ST_CW_FINISHED: 635e71b7053SJung-uk Kim if (s->hit) { 636e71b7053SJung-uk Kim st->hand_state = TLS_ST_OK; 637e71b7053SJung-uk Kim return WRITE_TRAN_CONTINUE; 638e71b7053SJung-uk Kim } else { 639e71b7053SJung-uk Kim return WRITE_TRAN_FINISHED; 640e71b7053SJung-uk Kim } 641e71b7053SJung-uk Kim 642e71b7053SJung-uk Kim case TLS_ST_CR_FINISHED: 643e71b7053SJung-uk Kim if (s->hit) { 644e71b7053SJung-uk Kim st->hand_state = TLS_ST_CW_CHANGE; 645e71b7053SJung-uk Kim return WRITE_TRAN_CONTINUE; 646e71b7053SJung-uk Kim } else { 647e71b7053SJung-uk Kim st->hand_state = TLS_ST_OK; 648e71b7053SJung-uk Kim return WRITE_TRAN_CONTINUE; 649e71b7053SJung-uk Kim } 650e71b7053SJung-uk Kim 651e71b7053SJung-uk Kim case TLS_ST_CR_HELLO_REQ: 652e71b7053SJung-uk Kim /* 653e71b7053SJung-uk Kim * If we can renegotiate now then do so, otherwise wait for a more 654e71b7053SJung-uk Kim * convenient time. 655e71b7053SJung-uk Kim */ 656e71b7053SJung-uk Kim if (ssl3_renegotiate_check(s, 1)) { 657e71b7053SJung-uk Kim if (!tls_setup_handshake(s)) { 658e71b7053SJung-uk Kim /* SSLfatal() already called */ 659e71b7053SJung-uk Kim return WRITE_TRAN_ERROR; 660e71b7053SJung-uk Kim } 661e71b7053SJung-uk Kim st->hand_state = TLS_ST_CW_CLNT_HELLO; 662e71b7053SJung-uk Kim return WRITE_TRAN_CONTINUE; 663e71b7053SJung-uk Kim } 664e71b7053SJung-uk Kim st->hand_state = TLS_ST_OK; 665e71b7053SJung-uk Kim return WRITE_TRAN_CONTINUE; 666e71b7053SJung-uk Kim } 667e71b7053SJung-uk Kim } 668e71b7053SJung-uk Kim 669e71b7053SJung-uk Kim /* 670e71b7053SJung-uk Kim * Perform any pre work that needs to be done prior to sending a message from 671e71b7053SJung-uk Kim * the client to the server. 672e71b7053SJung-uk Kim */ 673e71b7053SJung-uk Kim WORK_STATE ossl_statem_client_pre_work(SSL *s, WORK_STATE wst) 674e71b7053SJung-uk Kim { 675e71b7053SJung-uk Kim OSSL_STATEM *st = &s->statem; 676e71b7053SJung-uk Kim 677e71b7053SJung-uk Kim switch (st->hand_state) { 678e71b7053SJung-uk Kim default: 679e71b7053SJung-uk Kim /* No pre work to be done */ 680e71b7053SJung-uk Kim break; 681e71b7053SJung-uk Kim 682e71b7053SJung-uk Kim case TLS_ST_CW_CLNT_HELLO: 683e71b7053SJung-uk Kim s->shutdown = 0; 684e71b7053SJung-uk Kim if (SSL_IS_DTLS(s)) { 685e71b7053SJung-uk Kim /* every DTLS ClientHello resets Finished MAC */ 686e71b7053SJung-uk Kim if (!ssl3_init_finished_mac(s)) { 687e71b7053SJung-uk Kim /* SSLfatal() already called */ 688e71b7053SJung-uk Kim return WORK_ERROR; 689e71b7053SJung-uk Kim } 690e71b7053SJung-uk Kim } 691e71b7053SJung-uk Kim break; 692e71b7053SJung-uk Kim 693e71b7053SJung-uk Kim case TLS_ST_CW_CHANGE: 694e71b7053SJung-uk Kim if (SSL_IS_DTLS(s)) { 695e71b7053SJung-uk Kim if (s->hit) { 696e71b7053SJung-uk Kim /* 697e71b7053SJung-uk Kim * We're into the last flight so we don't retransmit these 698e71b7053SJung-uk Kim * messages unless we need to. 699e71b7053SJung-uk Kim */ 700e71b7053SJung-uk Kim st->use_timer = 0; 701e71b7053SJung-uk Kim } 702e71b7053SJung-uk Kim #ifndef OPENSSL_NO_SCTP 703e71b7053SJung-uk Kim if (BIO_dgram_is_sctp(SSL_get_wbio(s))) { 704e71b7053SJung-uk Kim /* Calls SSLfatal() as required */ 705e71b7053SJung-uk Kim return dtls_wait_for_dry(s); 706e71b7053SJung-uk Kim } 707e71b7053SJung-uk Kim #endif 708e71b7053SJung-uk Kim } 709e71b7053SJung-uk Kim break; 710e71b7053SJung-uk Kim 711e71b7053SJung-uk Kim case TLS_ST_PENDING_EARLY_DATA_END: 712e71b7053SJung-uk Kim /* 713e71b7053SJung-uk Kim * If we've been called by SSL_do_handshake()/SSL_write(), or we did not 714e71b7053SJung-uk Kim * attempt to write early data before calling SSL_read() then we press 715e71b7053SJung-uk Kim * on with the handshake. Otherwise we pause here. 716e71b7053SJung-uk Kim */ 717e71b7053SJung-uk Kim if (s->early_data_state == SSL_EARLY_DATA_FINISHED_WRITING 718e71b7053SJung-uk Kim || s->early_data_state == SSL_EARLY_DATA_NONE) 719e71b7053SJung-uk Kim return WORK_FINISHED_CONTINUE; 720e71b7053SJung-uk Kim /* Fall through */ 721e71b7053SJung-uk Kim 722e71b7053SJung-uk Kim case TLS_ST_EARLY_DATA: 723e71b7053SJung-uk Kim return tls_finish_handshake(s, wst, 0, 1); 724e71b7053SJung-uk Kim 725e71b7053SJung-uk Kim case TLS_ST_OK: 726e71b7053SJung-uk Kim /* Calls SSLfatal() as required */ 727e71b7053SJung-uk Kim return tls_finish_handshake(s, wst, 1, 1); 728e71b7053SJung-uk Kim } 729e71b7053SJung-uk Kim 730e71b7053SJung-uk Kim return WORK_FINISHED_CONTINUE; 731e71b7053SJung-uk Kim } 732e71b7053SJung-uk Kim 733e71b7053SJung-uk Kim /* 734e71b7053SJung-uk Kim * Perform any work that needs to be done after sending a message from the 735e71b7053SJung-uk Kim * client to the server. 736e71b7053SJung-uk Kim */ 737e71b7053SJung-uk Kim WORK_STATE ossl_statem_client_post_work(SSL *s, WORK_STATE wst) 738e71b7053SJung-uk Kim { 739e71b7053SJung-uk Kim OSSL_STATEM *st = &s->statem; 740e71b7053SJung-uk Kim 741e71b7053SJung-uk Kim s->init_num = 0; 742e71b7053SJung-uk Kim 743e71b7053SJung-uk Kim switch (st->hand_state) { 744e71b7053SJung-uk Kim default: 745e71b7053SJung-uk Kim /* No post work to be done */ 746e71b7053SJung-uk Kim break; 747e71b7053SJung-uk Kim 748e71b7053SJung-uk Kim case TLS_ST_CW_CLNT_HELLO: 749e71b7053SJung-uk Kim if (s->early_data_state == SSL_EARLY_DATA_CONNECTING 750e71b7053SJung-uk Kim && s->max_early_data > 0) { 751e71b7053SJung-uk Kim /* 752e71b7053SJung-uk Kim * We haven't selected TLSv1.3 yet so we don't call the change 753e71b7053SJung-uk Kim * cipher state function associated with the SSL_METHOD. Instead 754e71b7053SJung-uk Kim * we call tls13_change_cipher_state() directly. 755e71b7053SJung-uk Kim */ 756e71b7053SJung-uk Kim if ((s->options & SSL_OP_ENABLE_MIDDLEBOX_COMPAT) == 0) { 757e71b7053SJung-uk Kim if (!tls13_change_cipher_state(s, 758e71b7053SJung-uk Kim SSL3_CC_EARLY | SSL3_CHANGE_CIPHER_CLIENT_WRITE)) { 759e71b7053SJung-uk Kim /* SSLfatal() already called */ 760e71b7053SJung-uk Kim return WORK_ERROR; 761e71b7053SJung-uk Kim } 762e71b7053SJung-uk Kim } 763e71b7053SJung-uk Kim /* else we're in compat mode so we delay flushing until after CCS */ 764e71b7053SJung-uk Kim } else if (!statem_flush(s)) { 765e71b7053SJung-uk Kim return WORK_MORE_A; 766e71b7053SJung-uk Kim } 767e71b7053SJung-uk Kim 768e71b7053SJung-uk Kim if (SSL_IS_DTLS(s)) { 769e71b7053SJung-uk Kim /* Treat the next message as the first packet */ 770e71b7053SJung-uk Kim s->first_packet = 1; 771e71b7053SJung-uk Kim } 772e71b7053SJung-uk Kim break; 773e71b7053SJung-uk Kim 774e71b7053SJung-uk Kim case TLS_ST_CW_END_OF_EARLY_DATA: 775e71b7053SJung-uk Kim /* 776e71b7053SJung-uk Kim * We set the enc_write_ctx back to NULL because we may end up writing 777e71b7053SJung-uk Kim * in cleartext again if we get a HelloRetryRequest from the server. 778e71b7053SJung-uk Kim */ 779e71b7053SJung-uk Kim EVP_CIPHER_CTX_free(s->enc_write_ctx); 780e71b7053SJung-uk Kim s->enc_write_ctx = NULL; 781e71b7053SJung-uk Kim break; 782e71b7053SJung-uk Kim 783e71b7053SJung-uk Kim case TLS_ST_CW_KEY_EXCH: 784e71b7053SJung-uk Kim if (tls_client_key_exchange_post_work(s) == 0) { 785e71b7053SJung-uk Kim /* SSLfatal() already called */ 786e71b7053SJung-uk Kim return WORK_ERROR; 787e71b7053SJung-uk Kim } 788e71b7053SJung-uk Kim break; 789e71b7053SJung-uk Kim 790e71b7053SJung-uk Kim case TLS_ST_CW_CHANGE: 791e71b7053SJung-uk Kim if (SSL_IS_TLS13(s) || s->hello_retry_request == SSL_HRR_PENDING) 792e71b7053SJung-uk Kim break; 793e71b7053SJung-uk Kim if (s->early_data_state == SSL_EARLY_DATA_CONNECTING 794e71b7053SJung-uk Kim && s->max_early_data > 0) { 795e71b7053SJung-uk Kim /* 796e71b7053SJung-uk Kim * We haven't selected TLSv1.3 yet so we don't call the change 797e71b7053SJung-uk Kim * cipher state function associated with the SSL_METHOD. Instead 798e71b7053SJung-uk Kim * we call tls13_change_cipher_state() directly. 799e71b7053SJung-uk Kim */ 800e71b7053SJung-uk Kim if (!tls13_change_cipher_state(s, 801e71b7053SJung-uk Kim SSL3_CC_EARLY | SSL3_CHANGE_CIPHER_CLIENT_WRITE)) 802e71b7053SJung-uk Kim return WORK_ERROR; 803e71b7053SJung-uk Kim break; 804e71b7053SJung-uk Kim } 805e71b7053SJung-uk Kim s->session->cipher = s->s3->tmp.new_cipher; 806e71b7053SJung-uk Kim #ifdef OPENSSL_NO_COMP 807e71b7053SJung-uk Kim s->session->compress_meth = 0; 808e71b7053SJung-uk Kim #else 809e71b7053SJung-uk Kim if (s->s3->tmp.new_compression == NULL) 810e71b7053SJung-uk Kim s->session->compress_meth = 0; 811e71b7053SJung-uk Kim else 812e71b7053SJung-uk Kim s->session->compress_meth = s->s3->tmp.new_compression->id; 813e71b7053SJung-uk Kim #endif 814e71b7053SJung-uk Kim if (!s->method->ssl3_enc->setup_key_block(s)) { 815e71b7053SJung-uk Kim /* SSLfatal() already called */ 816e71b7053SJung-uk Kim return WORK_ERROR; 817e71b7053SJung-uk Kim } 818e71b7053SJung-uk Kim 819e71b7053SJung-uk Kim if (!s->method->ssl3_enc->change_cipher_state(s, 820e71b7053SJung-uk Kim SSL3_CHANGE_CIPHER_CLIENT_WRITE)) { 821e71b7053SJung-uk Kim /* SSLfatal() already called */ 822e71b7053SJung-uk Kim return WORK_ERROR; 823e71b7053SJung-uk Kim } 824e71b7053SJung-uk Kim 825e71b7053SJung-uk Kim if (SSL_IS_DTLS(s)) { 826e71b7053SJung-uk Kim #ifndef OPENSSL_NO_SCTP 827e71b7053SJung-uk Kim if (s->hit) { 828e71b7053SJung-uk Kim /* 829e71b7053SJung-uk Kim * Change to new shared key of SCTP-Auth, will be ignored if 830e71b7053SJung-uk Kim * no SCTP used. 831e71b7053SJung-uk Kim */ 832e71b7053SJung-uk Kim BIO_ctrl(SSL_get_wbio(s), BIO_CTRL_DGRAM_SCTP_NEXT_AUTH_KEY, 833e71b7053SJung-uk Kim 0, NULL); 834e71b7053SJung-uk Kim } 835e71b7053SJung-uk Kim #endif 836e71b7053SJung-uk Kim 837e71b7053SJung-uk Kim dtls1_reset_seq_numbers(s, SSL3_CC_WRITE); 838e71b7053SJung-uk Kim } 839e71b7053SJung-uk Kim break; 840e71b7053SJung-uk Kim 841e71b7053SJung-uk Kim case TLS_ST_CW_FINISHED: 842e71b7053SJung-uk Kim #ifndef OPENSSL_NO_SCTP 843e71b7053SJung-uk Kim if (wst == WORK_MORE_A && SSL_IS_DTLS(s) && s->hit == 0) { 844e71b7053SJung-uk Kim /* 845e71b7053SJung-uk Kim * Change to new shared key of SCTP-Auth, will be ignored if 846e71b7053SJung-uk Kim * no SCTP used. 847e71b7053SJung-uk Kim */ 848e71b7053SJung-uk Kim BIO_ctrl(SSL_get_wbio(s), BIO_CTRL_DGRAM_SCTP_NEXT_AUTH_KEY, 849e71b7053SJung-uk Kim 0, NULL); 850e71b7053SJung-uk Kim } 851e71b7053SJung-uk Kim #endif 852e71b7053SJung-uk Kim if (statem_flush(s) != 1) 853e71b7053SJung-uk Kim return WORK_MORE_B; 854e71b7053SJung-uk Kim 855e71b7053SJung-uk Kim if (SSL_IS_TLS13(s)) { 856e71b7053SJung-uk Kim if (!tls13_save_handshake_digest_for_pha(s)) { 857e71b7053SJung-uk Kim /* SSLfatal() already called */ 858e71b7053SJung-uk Kim return WORK_ERROR; 859e71b7053SJung-uk Kim } 860e71b7053SJung-uk Kim if (s->post_handshake_auth != SSL_PHA_REQUESTED) { 861e71b7053SJung-uk Kim if (!s->method->ssl3_enc->change_cipher_state(s, 862e71b7053SJung-uk Kim SSL3_CC_APPLICATION | SSL3_CHANGE_CIPHER_CLIENT_WRITE)) { 863e71b7053SJung-uk Kim /* SSLfatal() already called */ 864e71b7053SJung-uk Kim return WORK_ERROR; 865e71b7053SJung-uk Kim } 866e71b7053SJung-uk Kim } 867e71b7053SJung-uk Kim } 868e71b7053SJung-uk Kim break; 869e71b7053SJung-uk Kim 870e71b7053SJung-uk Kim case TLS_ST_CW_KEY_UPDATE: 871e71b7053SJung-uk Kim if (statem_flush(s) != 1) 872e71b7053SJung-uk Kim return WORK_MORE_A; 873e71b7053SJung-uk Kim if (!tls13_update_key(s, 1)) { 874e71b7053SJung-uk Kim /* SSLfatal() already called */ 875e71b7053SJung-uk Kim return WORK_ERROR; 876e71b7053SJung-uk Kim } 877e71b7053SJung-uk Kim break; 878e71b7053SJung-uk Kim } 879e71b7053SJung-uk Kim 880e71b7053SJung-uk Kim return WORK_FINISHED_CONTINUE; 881e71b7053SJung-uk Kim } 882e71b7053SJung-uk Kim 883e71b7053SJung-uk Kim /* 884e71b7053SJung-uk Kim * Get the message construction function and message type for sending from the 885e71b7053SJung-uk Kim * client 886e71b7053SJung-uk Kim * 887e71b7053SJung-uk Kim * Valid return values are: 888e71b7053SJung-uk Kim * 1: Success 889e71b7053SJung-uk Kim * 0: Error 890e71b7053SJung-uk Kim */ 891e71b7053SJung-uk Kim int ossl_statem_client_construct_message(SSL *s, WPACKET *pkt, 892e71b7053SJung-uk Kim confunc_f *confunc, int *mt) 893e71b7053SJung-uk Kim { 894e71b7053SJung-uk Kim OSSL_STATEM *st = &s->statem; 895e71b7053SJung-uk Kim 896e71b7053SJung-uk Kim switch (st->hand_state) { 897e71b7053SJung-uk Kim default: 898e71b7053SJung-uk Kim /* Shouldn't happen */ 899e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_INTERNAL_ERROR, 900e71b7053SJung-uk Kim SSL_F_OSSL_STATEM_CLIENT_CONSTRUCT_MESSAGE, 901e71b7053SJung-uk Kim SSL_R_BAD_HANDSHAKE_STATE); 902e71b7053SJung-uk Kim return 0; 903e71b7053SJung-uk Kim 904e71b7053SJung-uk Kim case TLS_ST_CW_CHANGE: 905e71b7053SJung-uk Kim if (SSL_IS_DTLS(s)) 906e71b7053SJung-uk Kim *confunc = dtls_construct_change_cipher_spec; 907e71b7053SJung-uk Kim else 908e71b7053SJung-uk Kim *confunc = tls_construct_change_cipher_spec; 909e71b7053SJung-uk Kim *mt = SSL3_MT_CHANGE_CIPHER_SPEC; 910e71b7053SJung-uk Kim break; 911e71b7053SJung-uk Kim 912e71b7053SJung-uk Kim case TLS_ST_CW_CLNT_HELLO: 913e71b7053SJung-uk Kim *confunc = tls_construct_client_hello; 914e71b7053SJung-uk Kim *mt = SSL3_MT_CLIENT_HELLO; 915e71b7053SJung-uk Kim break; 916e71b7053SJung-uk Kim 917e71b7053SJung-uk Kim case TLS_ST_CW_END_OF_EARLY_DATA: 918e71b7053SJung-uk Kim *confunc = tls_construct_end_of_early_data; 919e71b7053SJung-uk Kim *mt = SSL3_MT_END_OF_EARLY_DATA; 920e71b7053SJung-uk Kim break; 921e71b7053SJung-uk Kim 922e71b7053SJung-uk Kim case TLS_ST_PENDING_EARLY_DATA_END: 923e71b7053SJung-uk Kim *confunc = NULL; 924e71b7053SJung-uk Kim *mt = SSL3_MT_DUMMY; 925e71b7053SJung-uk Kim break; 926e71b7053SJung-uk Kim 927e71b7053SJung-uk Kim case TLS_ST_CW_CERT: 928e71b7053SJung-uk Kim *confunc = tls_construct_client_certificate; 929e71b7053SJung-uk Kim *mt = SSL3_MT_CERTIFICATE; 930e71b7053SJung-uk Kim break; 931e71b7053SJung-uk Kim 932e71b7053SJung-uk Kim case TLS_ST_CW_KEY_EXCH: 933e71b7053SJung-uk Kim *confunc = tls_construct_client_key_exchange; 934e71b7053SJung-uk Kim *mt = SSL3_MT_CLIENT_KEY_EXCHANGE; 935e71b7053SJung-uk Kim break; 936e71b7053SJung-uk Kim 937e71b7053SJung-uk Kim case TLS_ST_CW_CERT_VRFY: 938e71b7053SJung-uk Kim *confunc = tls_construct_cert_verify; 939e71b7053SJung-uk Kim *mt = SSL3_MT_CERTIFICATE_VERIFY; 940e71b7053SJung-uk Kim break; 941e71b7053SJung-uk Kim 942e71b7053SJung-uk Kim #if !defined(OPENSSL_NO_NEXTPROTONEG) 943e71b7053SJung-uk Kim case TLS_ST_CW_NEXT_PROTO: 944e71b7053SJung-uk Kim *confunc = tls_construct_next_proto; 945e71b7053SJung-uk Kim *mt = SSL3_MT_NEXT_PROTO; 946e71b7053SJung-uk Kim break; 947e71b7053SJung-uk Kim #endif 948e71b7053SJung-uk Kim case TLS_ST_CW_FINISHED: 949e71b7053SJung-uk Kim *confunc = tls_construct_finished; 950e71b7053SJung-uk Kim *mt = SSL3_MT_FINISHED; 951e71b7053SJung-uk Kim break; 952e71b7053SJung-uk Kim 953e71b7053SJung-uk Kim case TLS_ST_CW_KEY_UPDATE: 954e71b7053SJung-uk Kim *confunc = tls_construct_key_update; 955e71b7053SJung-uk Kim *mt = SSL3_MT_KEY_UPDATE; 956e71b7053SJung-uk Kim break; 957e71b7053SJung-uk Kim } 958e71b7053SJung-uk Kim 959e71b7053SJung-uk Kim return 1; 960e71b7053SJung-uk Kim } 961e71b7053SJung-uk Kim 962e71b7053SJung-uk Kim /* 963e71b7053SJung-uk Kim * Returns the maximum allowed length for the current message that we are 964e71b7053SJung-uk Kim * reading. Excludes the message header. 965e71b7053SJung-uk Kim */ 966e71b7053SJung-uk Kim size_t ossl_statem_client_max_message_size(SSL *s) 967e71b7053SJung-uk Kim { 968e71b7053SJung-uk Kim OSSL_STATEM *st = &s->statem; 969e71b7053SJung-uk Kim 970e71b7053SJung-uk Kim switch (st->hand_state) { 971e71b7053SJung-uk Kim default: 972e71b7053SJung-uk Kim /* Shouldn't happen */ 973e71b7053SJung-uk Kim return 0; 974e71b7053SJung-uk Kim 975e71b7053SJung-uk Kim case TLS_ST_CR_SRVR_HELLO: 976e71b7053SJung-uk Kim return SERVER_HELLO_MAX_LENGTH; 977e71b7053SJung-uk Kim 978e71b7053SJung-uk Kim case DTLS_ST_CR_HELLO_VERIFY_REQUEST: 979e71b7053SJung-uk Kim return HELLO_VERIFY_REQUEST_MAX_LENGTH; 980e71b7053SJung-uk Kim 981e71b7053SJung-uk Kim case TLS_ST_CR_CERT: 982e71b7053SJung-uk Kim return s->max_cert_list; 983e71b7053SJung-uk Kim 984e71b7053SJung-uk Kim case TLS_ST_CR_CERT_VRFY: 985e71b7053SJung-uk Kim return SSL3_RT_MAX_PLAIN_LENGTH; 986e71b7053SJung-uk Kim 987e71b7053SJung-uk Kim case TLS_ST_CR_CERT_STATUS: 988e71b7053SJung-uk Kim return SSL3_RT_MAX_PLAIN_LENGTH; 989e71b7053SJung-uk Kim 990e71b7053SJung-uk Kim case TLS_ST_CR_KEY_EXCH: 991e71b7053SJung-uk Kim return SERVER_KEY_EXCH_MAX_LENGTH; 992e71b7053SJung-uk Kim 993e71b7053SJung-uk Kim case TLS_ST_CR_CERT_REQ: 994e71b7053SJung-uk Kim /* 995e71b7053SJung-uk Kim * Set to s->max_cert_list for compatibility with previous releases. In 996e71b7053SJung-uk Kim * practice these messages can get quite long if servers are configured 997e71b7053SJung-uk Kim * to provide a long list of acceptable CAs 998e71b7053SJung-uk Kim */ 999e71b7053SJung-uk Kim return s->max_cert_list; 1000e71b7053SJung-uk Kim 1001e71b7053SJung-uk Kim case TLS_ST_CR_SRVR_DONE: 1002e71b7053SJung-uk Kim return SERVER_HELLO_DONE_MAX_LENGTH; 1003e71b7053SJung-uk Kim 1004e71b7053SJung-uk Kim case TLS_ST_CR_CHANGE: 1005e71b7053SJung-uk Kim if (s->version == DTLS1_BAD_VER) 1006e71b7053SJung-uk Kim return 3; 1007e71b7053SJung-uk Kim return CCS_MAX_LENGTH; 1008e71b7053SJung-uk Kim 1009e71b7053SJung-uk Kim case TLS_ST_CR_SESSION_TICKET: 1010e71b7053SJung-uk Kim return SSL3_RT_MAX_PLAIN_LENGTH; 1011e71b7053SJung-uk Kim 1012e71b7053SJung-uk Kim case TLS_ST_CR_FINISHED: 1013e71b7053SJung-uk Kim return FINISHED_MAX_LENGTH; 1014e71b7053SJung-uk Kim 1015e71b7053SJung-uk Kim case TLS_ST_CR_ENCRYPTED_EXTENSIONS: 1016e71b7053SJung-uk Kim return ENCRYPTED_EXTENSIONS_MAX_LENGTH; 1017e71b7053SJung-uk Kim 1018e71b7053SJung-uk Kim case TLS_ST_CR_KEY_UPDATE: 1019e71b7053SJung-uk Kim return KEY_UPDATE_MAX_LENGTH; 1020e71b7053SJung-uk Kim } 1021e71b7053SJung-uk Kim } 1022e71b7053SJung-uk Kim 1023e71b7053SJung-uk Kim /* 1024e71b7053SJung-uk Kim * Process a message that the client has been received from the server. 1025e71b7053SJung-uk Kim */ 1026e71b7053SJung-uk Kim MSG_PROCESS_RETURN ossl_statem_client_process_message(SSL *s, PACKET *pkt) 1027e71b7053SJung-uk Kim { 1028e71b7053SJung-uk Kim OSSL_STATEM *st = &s->statem; 1029e71b7053SJung-uk Kim 1030e71b7053SJung-uk Kim switch (st->hand_state) { 1031e71b7053SJung-uk Kim default: 1032e71b7053SJung-uk Kim /* Shouldn't happen */ 1033e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_INTERNAL_ERROR, 1034e71b7053SJung-uk Kim SSL_F_OSSL_STATEM_CLIENT_PROCESS_MESSAGE, 1035e71b7053SJung-uk Kim ERR_R_INTERNAL_ERROR); 1036e71b7053SJung-uk Kim return MSG_PROCESS_ERROR; 1037e71b7053SJung-uk Kim 1038e71b7053SJung-uk Kim case TLS_ST_CR_SRVR_HELLO: 1039e71b7053SJung-uk Kim return tls_process_server_hello(s, pkt); 1040e71b7053SJung-uk Kim 1041e71b7053SJung-uk Kim case DTLS_ST_CR_HELLO_VERIFY_REQUEST: 1042e71b7053SJung-uk Kim return dtls_process_hello_verify(s, pkt); 1043e71b7053SJung-uk Kim 1044e71b7053SJung-uk Kim case TLS_ST_CR_CERT: 1045e71b7053SJung-uk Kim return tls_process_server_certificate(s, pkt); 1046e71b7053SJung-uk Kim 1047e71b7053SJung-uk Kim case TLS_ST_CR_CERT_VRFY: 1048e71b7053SJung-uk Kim return tls_process_cert_verify(s, pkt); 1049e71b7053SJung-uk Kim 1050e71b7053SJung-uk Kim case TLS_ST_CR_CERT_STATUS: 1051e71b7053SJung-uk Kim return tls_process_cert_status(s, pkt); 1052e71b7053SJung-uk Kim 1053e71b7053SJung-uk Kim case TLS_ST_CR_KEY_EXCH: 1054e71b7053SJung-uk Kim return tls_process_key_exchange(s, pkt); 1055e71b7053SJung-uk Kim 1056e71b7053SJung-uk Kim case TLS_ST_CR_CERT_REQ: 1057e71b7053SJung-uk Kim return tls_process_certificate_request(s, pkt); 1058e71b7053SJung-uk Kim 1059e71b7053SJung-uk Kim case TLS_ST_CR_SRVR_DONE: 1060e71b7053SJung-uk Kim return tls_process_server_done(s, pkt); 1061e71b7053SJung-uk Kim 1062e71b7053SJung-uk Kim case TLS_ST_CR_CHANGE: 1063e71b7053SJung-uk Kim return tls_process_change_cipher_spec(s, pkt); 1064e71b7053SJung-uk Kim 1065e71b7053SJung-uk Kim case TLS_ST_CR_SESSION_TICKET: 1066e71b7053SJung-uk Kim return tls_process_new_session_ticket(s, pkt); 1067e71b7053SJung-uk Kim 1068e71b7053SJung-uk Kim case TLS_ST_CR_FINISHED: 1069e71b7053SJung-uk Kim return tls_process_finished(s, pkt); 1070e71b7053SJung-uk Kim 1071e71b7053SJung-uk Kim case TLS_ST_CR_HELLO_REQ: 1072e71b7053SJung-uk Kim return tls_process_hello_req(s, pkt); 1073e71b7053SJung-uk Kim 1074e71b7053SJung-uk Kim case TLS_ST_CR_ENCRYPTED_EXTENSIONS: 1075e71b7053SJung-uk Kim return tls_process_encrypted_extensions(s, pkt); 1076e71b7053SJung-uk Kim 1077e71b7053SJung-uk Kim case TLS_ST_CR_KEY_UPDATE: 1078e71b7053SJung-uk Kim return tls_process_key_update(s, pkt); 1079e71b7053SJung-uk Kim } 1080e71b7053SJung-uk Kim } 1081e71b7053SJung-uk Kim 1082e71b7053SJung-uk Kim /* 1083e71b7053SJung-uk Kim * Perform any further processing required following the receipt of a message 1084e71b7053SJung-uk Kim * from the server 1085e71b7053SJung-uk Kim */ 1086e71b7053SJung-uk Kim WORK_STATE ossl_statem_client_post_process_message(SSL *s, WORK_STATE wst) 1087e71b7053SJung-uk Kim { 1088e71b7053SJung-uk Kim OSSL_STATEM *st = &s->statem; 1089e71b7053SJung-uk Kim 1090e71b7053SJung-uk Kim switch (st->hand_state) { 1091e71b7053SJung-uk Kim default: 1092e71b7053SJung-uk Kim /* Shouldn't happen */ 1093e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_INTERNAL_ERROR, 1094e71b7053SJung-uk Kim SSL_F_OSSL_STATEM_CLIENT_POST_PROCESS_MESSAGE, 1095e71b7053SJung-uk Kim ERR_R_INTERNAL_ERROR); 1096e71b7053SJung-uk Kim return WORK_ERROR; 1097e71b7053SJung-uk Kim 1098*c9cf7b5cSJung-uk Kim case TLS_ST_CR_CERT_VRFY: 1099e71b7053SJung-uk Kim case TLS_ST_CR_CERT_REQ: 1100e71b7053SJung-uk Kim return tls_prepare_client_certificate(s, wst); 1101e71b7053SJung-uk Kim } 1102e71b7053SJung-uk Kim } 1103e71b7053SJung-uk Kim 1104e71b7053SJung-uk Kim int tls_construct_client_hello(SSL *s, WPACKET *pkt) 1105e71b7053SJung-uk Kim { 1106e71b7053SJung-uk Kim unsigned char *p; 1107e71b7053SJung-uk Kim size_t sess_id_len; 1108e71b7053SJung-uk Kim int i, protverr; 1109e71b7053SJung-uk Kim #ifndef OPENSSL_NO_COMP 1110e71b7053SJung-uk Kim SSL_COMP *comp; 1111e71b7053SJung-uk Kim #endif 1112e71b7053SJung-uk Kim SSL_SESSION *sess = s->session; 1113e71b7053SJung-uk Kim unsigned char *session_id; 1114e71b7053SJung-uk Kim 1115e71b7053SJung-uk Kim if (!WPACKET_set_max_size(pkt, SSL3_RT_MAX_PLAIN_LENGTH)) { 1116e71b7053SJung-uk Kim /* Should not happen */ 1117e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_INTERNAL_ERROR, 1118e71b7053SJung-uk Kim SSL_F_TLS_CONSTRUCT_CLIENT_HELLO, ERR_R_INTERNAL_ERROR); 1119e71b7053SJung-uk Kim return 0; 1120e71b7053SJung-uk Kim } 1121e71b7053SJung-uk Kim 1122e71b7053SJung-uk Kim /* Work out what SSL/TLS/DTLS version to use */ 1123e71b7053SJung-uk Kim protverr = ssl_set_client_hello_version(s); 1124e71b7053SJung-uk Kim if (protverr != 0) { 1125e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_TLS_CONSTRUCT_CLIENT_HELLO, 1126e71b7053SJung-uk Kim protverr); 1127e71b7053SJung-uk Kim return 0; 1128e71b7053SJung-uk Kim } 1129e71b7053SJung-uk Kim 1130e71b7053SJung-uk Kim if (sess == NULL 1131e71b7053SJung-uk Kim || !ssl_version_supported(s, sess->ssl_version, NULL) 1132e71b7053SJung-uk Kim || !SSL_SESSION_is_resumable(sess)) { 1133e71b7053SJung-uk Kim if (s->hello_retry_request == SSL_HRR_NONE 1134e71b7053SJung-uk Kim && !ssl_get_new_session(s, 0)) { 1135e71b7053SJung-uk Kim /* SSLfatal() already called */ 1136e71b7053SJung-uk Kim return 0; 1137e71b7053SJung-uk Kim } 1138e71b7053SJung-uk Kim } 1139e71b7053SJung-uk Kim /* else use the pre-loaded session */ 1140e71b7053SJung-uk Kim 1141e71b7053SJung-uk Kim p = s->s3->client_random; 1142e71b7053SJung-uk Kim 1143e71b7053SJung-uk Kim /* 1144e71b7053SJung-uk Kim * for DTLS if client_random is initialized, reuse it, we are 1145e71b7053SJung-uk Kim * required to use same upon reply to HelloVerify 1146e71b7053SJung-uk Kim */ 1147e71b7053SJung-uk Kim if (SSL_IS_DTLS(s)) { 1148e71b7053SJung-uk Kim size_t idx; 1149e71b7053SJung-uk Kim i = 1; 1150e71b7053SJung-uk Kim for (idx = 0; idx < sizeof(s->s3->client_random); idx++) { 1151e71b7053SJung-uk Kim if (p[idx]) { 1152e71b7053SJung-uk Kim i = 0; 1153e71b7053SJung-uk Kim break; 1154e71b7053SJung-uk Kim } 1155e71b7053SJung-uk Kim } 1156e71b7053SJung-uk Kim } else { 1157e71b7053SJung-uk Kim i = (s->hello_retry_request == SSL_HRR_NONE); 1158e71b7053SJung-uk Kim } 1159e71b7053SJung-uk Kim 1160e71b7053SJung-uk Kim if (i && ssl_fill_hello_random(s, 0, p, sizeof(s->s3->client_random), 1161e71b7053SJung-uk Kim DOWNGRADE_NONE) <= 0) { 1162e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_TLS_CONSTRUCT_CLIENT_HELLO, 1163e71b7053SJung-uk Kim ERR_R_INTERNAL_ERROR); 1164e71b7053SJung-uk Kim return 0; 1165e71b7053SJung-uk Kim } 1166e71b7053SJung-uk Kim 1167e71b7053SJung-uk Kim /*- 1168e71b7053SJung-uk Kim * version indicates the negotiated version: for example from 1169e71b7053SJung-uk Kim * an SSLv2/v3 compatible client hello). The client_version 1170e71b7053SJung-uk Kim * field is the maximum version we permit and it is also 1171e71b7053SJung-uk Kim * used in RSA encrypted premaster secrets. Some servers can 1172e71b7053SJung-uk Kim * choke if we initially report a higher version then 1173e71b7053SJung-uk Kim * renegotiate to a lower one in the premaster secret. This 1174e71b7053SJung-uk Kim * didn't happen with TLS 1.0 as most servers supported it 1175e71b7053SJung-uk Kim * but it can with TLS 1.1 or later if the server only supports 1176e71b7053SJung-uk Kim * 1.0. 1177e71b7053SJung-uk Kim * 1178e71b7053SJung-uk Kim * Possible scenario with previous logic: 1179e71b7053SJung-uk Kim * 1. Client hello indicates TLS 1.2 1180e71b7053SJung-uk Kim * 2. Server hello says TLS 1.0 1181e71b7053SJung-uk Kim * 3. RSA encrypted premaster secret uses 1.2. 1182e71b7053SJung-uk Kim * 4. Handshake proceeds using TLS 1.0. 1183e71b7053SJung-uk Kim * 5. Server sends hello request to renegotiate. 1184e71b7053SJung-uk Kim * 6. Client hello indicates TLS v1.0 as we now 1185e71b7053SJung-uk Kim * know that is maximum server supports. 1186e71b7053SJung-uk Kim * 7. Server chokes on RSA encrypted premaster secret 1187e71b7053SJung-uk Kim * containing version 1.0. 1188e71b7053SJung-uk Kim * 1189e71b7053SJung-uk Kim * For interoperability it should be OK to always use the 1190e71b7053SJung-uk Kim * maximum version we support in client hello and then rely 1191e71b7053SJung-uk Kim * on the checking of version to ensure the servers isn't 1192e71b7053SJung-uk Kim * being inconsistent: for example initially negotiating with 1193e71b7053SJung-uk Kim * TLS 1.0 and renegotiating with TLS 1.2. We do this by using 1194e71b7053SJung-uk Kim * client_version in client hello and not resetting it to 1195e71b7053SJung-uk Kim * the negotiated version. 1196e71b7053SJung-uk Kim * 1197e71b7053SJung-uk Kim * For TLS 1.3 we always set the ClientHello version to 1.2 and rely on the 1198e71b7053SJung-uk Kim * supported_versions extension for the real supported versions. 1199e71b7053SJung-uk Kim */ 1200e71b7053SJung-uk Kim if (!WPACKET_put_bytes_u16(pkt, s->client_version) 1201e71b7053SJung-uk Kim || !WPACKET_memcpy(pkt, s->s3->client_random, SSL3_RANDOM_SIZE)) { 1202e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_TLS_CONSTRUCT_CLIENT_HELLO, 1203e71b7053SJung-uk Kim ERR_R_INTERNAL_ERROR); 1204e71b7053SJung-uk Kim return 0; 1205e71b7053SJung-uk Kim } 1206e71b7053SJung-uk Kim 1207e71b7053SJung-uk Kim /* Session ID */ 1208e71b7053SJung-uk Kim session_id = s->session->session_id; 1209e71b7053SJung-uk Kim if (s->new_session || s->session->ssl_version == TLS1_3_VERSION) { 1210e71b7053SJung-uk Kim if (s->version == TLS1_3_VERSION 1211e71b7053SJung-uk Kim && (s->options & SSL_OP_ENABLE_MIDDLEBOX_COMPAT) != 0) { 1212e71b7053SJung-uk Kim sess_id_len = sizeof(s->tmp_session_id); 1213e71b7053SJung-uk Kim s->tmp_session_id_len = sess_id_len; 1214e71b7053SJung-uk Kim session_id = s->tmp_session_id; 1215e71b7053SJung-uk Kim if (s->hello_retry_request == SSL_HRR_NONE 1216e71b7053SJung-uk Kim && RAND_bytes(s->tmp_session_id, sess_id_len) <= 0) { 1217e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_INTERNAL_ERROR, 1218e71b7053SJung-uk Kim SSL_F_TLS_CONSTRUCT_CLIENT_HELLO, 1219e71b7053SJung-uk Kim ERR_R_INTERNAL_ERROR); 1220e71b7053SJung-uk Kim return 0; 1221e71b7053SJung-uk Kim } 1222e71b7053SJung-uk Kim } else { 1223e71b7053SJung-uk Kim sess_id_len = 0; 1224e71b7053SJung-uk Kim } 1225e71b7053SJung-uk Kim } else { 1226e71b7053SJung-uk Kim assert(s->session->session_id_length <= sizeof(s->session->session_id)); 1227e71b7053SJung-uk Kim sess_id_len = s->session->session_id_length; 1228e71b7053SJung-uk Kim if (s->version == TLS1_3_VERSION) { 1229e71b7053SJung-uk Kim s->tmp_session_id_len = sess_id_len; 1230e71b7053SJung-uk Kim memcpy(s->tmp_session_id, s->session->session_id, sess_id_len); 1231e71b7053SJung-uk Kim } 1232e71b7053SJung-uk Kim } 1233e71b7053SJung-uk Kim if (!WPACKET_start_sub_packet_u8(pkt) 1234e71b7053SJung-uk Kim || (sess_id_len != 0 && !WPACKET_memcpy(pkt, session_id, 1235e71b7053SJung-uk Kim sess_id_len)) 1236e71b7053SJung-uk Kim || !WPACKET_close(pkt)) { 1237e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_TLS_CONSTRUCT_CLIENT_HELLO, 1238e71b7053SJung-uk Kim ERR_R_INTERNAL_ERROR); 1239e71b7053SJung-uk Kim return 0; 1240e71b7053SJung-uk Kim } 1241e71b7053SJung-uk Kim 1242e71b7053SJung-uk Kim /* cookie stuff for DTLS */ 1243e71b7053SJung-uk Kim if (SSL_IS_DTLS(s)) { 1244e71b7053SJung-uk Kim if (s->d1->cookie_len > sizeof(s->d1->cookie) 1245e71b7053SJung-uk Kim || !WPACKET_sub_memcpy_u8(pkt, s->d1->cookie, 1246e71b7053SJung-uk Kim s->d1->cookie_len)) { 1247e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_TLS_CONSTRUCT_CLIENT_HELLO, 1248e71b7053SJung-uk Kim ERR_R_INTERNAL_ERROR); 1249e71b7053SJung-uk Kim return 0; 1250e71b7053SJung-uk Kim } 1251e71b7053SJung-uk Kim } 1252e71b7053SJung-uk Kim 1253e71b7053SJung-uk Kim /* Ciphers supported */ 1254e71b7053SJung-uk Kim if (!WPACKET_start_sub_packet_u16(pkt)) { 1255e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_TLS_CONSTRUCT_CLIENT_HELLO, 1256e71b7053SJung-uk Kim ERR_R_INTERNAL_ERROR); 1257e71b7053SJung-uk Kim return 0; 1258e71b7053SJung-uk Kim } 1259e71b7053SJung-uk Kim 1260e71b7053SJung-uk Kim if (!ssl_cipher_list_to_bytes(s, SSL_get_ciphers(s), pkt)) { 1261e71b7053SJung-uk Kim /* SSLfatal() already called */ 1262e71b7053SJung-uk Kim return 0; 1263e71b7053SJung-uk Kim } 1264e71b7053SJung-uk Kim if (!WPACKET_close(pkt)) { 1265e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_TLS_CONSTRUCT_CLIENT_HELLO, 1266e71b7053SJung-uk Kim ERR_R_INTERNAL_ERROR); 1267e71b7053SJung-uk Kim return 0; 1268e71b7053SJung-uk Kim } 1269e71b7053SJung-uk Kim 1270e71b7053SJung-uk Kim /* COMPRESSION */ 1271e71b7053SJung-uk Kim if (!WPACKET_start_sub_packet_u8(pkt)) { 1272e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_TLS_CONSTRUCT_CLIENT_HELLO, 1273e71b7053SJung-uk Kim ERR_R_INTERNAL_ERROR); 1274e71b7053SJung-uk Kim return 0; 1275e71b7053SJung-uk Kim } 1276e71b7053SJung-uk Kim #ifndef OPENSSL_NO_COMP 1277e71b7053SJung-uk Kim if (ssl_allow_compression(s) 1278e71b7053SJung-uk Kim && s->ctx->comp_methods 1279e71b7053SJung-uk Kim && (SSL_IS_DTLS(s) || s->s3->tmp.max_ver < TLS1_3_VERSION)) { 1280e71b7053SJung-uk Kim int compnum = sk_SSL_COMP_num(s->ctx->comp_methods); 1281e71b7053SJung-uk Kim for (i = 0; i < compnum; i++) { 1282e71b7053SJung-uk Kim comp = sk_SSL_COMP_value(s->ctx->comp_methods, i); 1283e71b7053SJung-uk Kim if (!WPACKET_put_bytes_u8(pkt, comp->id)) { 1284e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_INTERNAL_ERROR, 1285e71b7053SJung-uk Kim SSL_F_TLS_CONSTRUCT_CLIENT_HELLO, 1286e71b7053SJung-uk Kim ERR_R_INTERNAL_ERROR); 1287e71b7053SJung-uk Kim return 0; 1288e71b7053SJung-uk Kim } 1289e71b7053SJung-uk Kim } 1290e71b7053SJung-uk Kim } 1291e71b7053SJung-uk Kim #endif 1292e71b7053SJung-uk Kim /* Add the NULL method */ 1293e71b7053SJung-uk Kim if (!WPACKET_put_bytes_u8(pkt, 0) || !WPACKET_close(pkt)) { 1294e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_TLS_CONSTRUCT_CLIENT_HELLO, 1295e71b7053SJung-uk Kim ERR_R_INTERNAL_ERROR); 1296e71b7053SJung-uk Kim return 0; 1297e71b7053SJung-uk Kim } 1298e71b7053SJung-uk Kim 1299e71b7053SJung-uk Kim /* TLS extensions */ 1300e71b7053SJung-uk Kim if (!tls_construct_extensions(s, pkt, SSL_EXT_CLIENT_HELLO, NULL, 0)) { 1301e71b7053SJung-uk Kim /* SSLfatal() already called */ 1302e71b7053SJung-uk Kim return 0; 1303e71b7053SJung-uk Kim } 1304e71b7053SJung-uk Kim 1305e71b7053SJung-uk Kim return 1; 1306e71b7053SJung-uk Kim } 1307e71b7053SJung-uk Kim 1308e71b7053SJung-uk Kim MSG_PROCESS_RETURN dtls_process_hello_verify(SSL *s, PACKET *pkt) 1309e71b7053SJung-uk Kim { 1310e71b7053SJung-uk Kim size_t cookie_len; 1311e71b7053SJung-uk Kim PACKET cookiepkt; 1312e71b7053SJung-uk Kim 1313e71b7053SJung-uk Kim if (!PACKET_forward(pkt, 2) 1314e71b7053SJung-uk Kim || !PACKET_get_length_prefixed_1(pkt, &cookiepkt)) { 1315e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_DECODE_ERROR, SSL_F_DTLS_PROCESS_HELLO_VERIFY, 1316e71b7053SJung-uk Kim SSL_R_LENGTH_MISMATCH); 1317e71b7053SJung-uk Kim return MSG_PROCESS_ERROR; 1318e71b7053SJung-uk Kim } 1319e71b7053SJung-uk Kim 1320e71b7053SJung-uk Kim cookie_len = PACKET_remaining(&cookiepkt); 1321e71b7053SJung-uk Kim if (cookie_len > sizeof(s->d1->cookie)) { 1322e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_ILLEGAL_PARAMETER, SSL_F_DTLS_PROCESS_HELLO_VERIFY, 1323e71b7053SJung-uk Kim SSL_R_LENGTH_TOO_LONG); 1324e71b7053SJung-uk Kim return MSG_PROCESS_ERROR; 1325e71b7053SJung-uk Kim } 1326e71b7053SJung-uk Kim 1327e71b7053SJung-uk Kim if (!PACKET_copy_bytes(&cookiepkt, s->d1->cookie, cookie_len)) { 1328e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_DECODE_ERROR, SSL_F_DTLS_PROCESS_HELLO_VERIFY, 1329e71b7053SJung-uk Kim SSL_R_LENGTH_MISMATCH); 1330e71b7053SJung-uk Kim return MSG_PROCESS_ERROR; 1331e71b7053SJung-uk Kim } 1332e71b7053SJung-uk Kim s->d1->cookie_len = cookie_len; 1333e71b7053SJung-uk Kim 1334e71b7053SJung-uk Kim return MSG_PROCESS_FINISHED_READING; 1335e71b7053SJung-uk Kim } 1336e71b7053SJung-uk Kim 1337e71b7053SJung-uk Kim static int set_client_ciphersuite(SSL *s, const unsigned char *cipherchars) 1338e71b7053SJung-uk Kim { 1339e71b7053SJung-uk Kim STACK_OF(SSL_CIPHER) *sk; 1340e71b7053SJung-uk Kim const SSL_CIPHER *c; 1341e71b7053SJung-uk Kim int i; 1342e71b7053SJung-uk Kim 1343e71b7053SJung-uk Kim c = ssl_get_cipher_by_char(s, cipherchars, 0); 1344e71b7053SJung-uk Kim if (c == NULL) { 1345e71b7053SJung-uk Kim /* unknown cipher */ 1346e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_ILLEGAL_PARAMETER, SSL_F_SET_CLIENT_CIPHERSUITE, 1347e71b7053SJung-uk Kim SSL_R_UNKNOWN_CIPHER_RETURNED); 1348e71b7053SJung-uk Kim return 0; 1349e71b7053SJung-uk Kim } 1350e71b7053SJung-uk Kim /* 1351e71b7053SJung-uk Kim * If it is a disabled cipher we either didn't send it in client hello, 1352e71b7053SJung-uk Kim * or it's not allowed for the selected protocol. So we return an error. 1353e71b7053SJung-uk Kim */ 1354e71b7053SJung-uk Kim if (ssl_cipher_disabled(s, c, SSL_SECOP_CIPHER_CHECK, 1)) { 1355e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_ILLEGAL_PARAMETER, SSL_F_SET_CLIENT_CIPHERSUITE, 1356e71b7053SJung-uk Kim SSL_R_WRONG_CIPHER_RETURNED); 1357e71b7053SJung-uk Kim return 0; 1358e71b7053SJung-uk Kim } 1359e71b7053SJung-uk Kim 1360e71b7053SJung-uk Kim sk = ssl_get_ciphers_by_id(s); 1361e71b7053SJung-uk Kim i = sk_SSL_CIPHER_find(sk, c); 1362e71b7053SJung-uk Kim if (i < 0) { 1363e71b7053SJung-uk Kim /* we did not say we would use this cipher */ 1364e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_ILLEGAL_PARAMETER, SSL_F_SET_CLIENT_CIPHERSUITE, 1365e71b7053SJung-uk Kim SSL_R_WRONG_CIPHER_RETURNED); 1366e71b7053SJung-uk Kim return 0; 1367e71b7053SJung-uk Kim } 1368e71b7053SJung-uk Kim 1369e71b7053SJung-uk Kim if (SSL_IS_TLS13(s) && s->s3->tmp.new_cipher != NULL 1370e71b7053SJung-uk Kim && s->s3->tmp.new_cipher->id != c->id) { 1371e71b7053SJung-uk Kim /* ServerHello selected a different ciphersuite to that in the HRR */ 1372e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_ILLEGAL_PARAMETER, SSL_F_SET_CLIENT_CIPHERSUITE, 1373e71b7053SJung-uk Kim SSL_R_WRONG_CIPHER_RETURNED); 1374e71b7053SJung-uk Kim return 0; 1375e71b7053SJung-uk Kim } 1376e71b7053SJung-uk Kim 1377e71b7053SJung-uk Kim /* 1378e71b7053SJung-uk Kim * Depending on the session caching (internal/external), the cipher 1379e71b7053SJung-uk Kim * and/or cipher_id values may not be set. Make sure that cipher_id is 1380e71b7053SJung-uk Kim * set and use it for comparison. 1381e71b7053SJung-uk Kim */ 1382e71b7053SJung-uk Kim if (s->session->cipher != NULL) 1383e71b7053SJung-uk Kim s->session->cipher_id = s->session->cipher->id; 1384e71b7053SJung-uk Kim if (s->hit && (s->session->cipher_id != c->id)) { 1385e71b7053SJung-uk Kim if (SSL_IS_TLS13(s)) { 1386e71b7053SJung-uk Kim /* 1387e71b7053SJung-uk Kim * In TLSv1.3 it is valid for the server to select a different 1388e71b7053SJung-uk Kim * ciphersuite as long as the hash is the same. 1389e71b7053SJung-uk Kim */ 1390e71b7053SJung-uk Kim if (ssl_md(c->algorithm2) 1391e71b7053SJung-uk Kim != ssl_md(s->session->cipher->algorithm2)) { 1392e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_ILLEGAL_PARAMETER, 1393e71b7053SJung-uk Kim SSL_F_SET_CLIENT_CIPHERSUITE, 1394e71b7053SJung-uk Kim SSL_R_CIPHERSUITE_DIGEST_HAS_CHANGED); 1395e71b7053SJung-uk Kim return 0; 1396e71b7053SJung-uk Kim } 1397e71b7053SJung-uk Kim } else { 1398e71b7053SJung-uk Kim /* 1399e71b7053SJung-uk Kim * Prior to TLSv1.3 resuming a session always meant using the same 1400e71b7053SJung-uk Kim * ciphersuite. 1401e71b7053SJung-uk Kim */ 1402e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_ILLEGAL_PARAMETER, SSL_F_SET_CLIENT_CIPHERSUITE, 1403e71b7053SJung-uk Kim SSL_R_OLD_SESSION_CIPHER_NOT_RETURNED); 1404e71b7053SJung-uk Kim return 0; 1405e71b7053SJung-uk Kim } 1406e71b7053SJung-uk Kim } 1407e71b7053SJung-uk Kim s->s3->tmp.new_cipher = c; 1408e71b7053SJung-uk Kim 1409e71b7053SJung-uk Kim return 1; 1410e71b7053SJung-uk Kim } 1411e71b7053SJung-uk Kim 1412e71b7053SJung-uk Kim MSG_PROCESS_RETURN tls_process_server_hello(SSL *s, PACKET *pkt) 1413e71b7053SJung-uk Kim { 1414e71b7053SJung-uk Kim PACKET session_id, extpkt; 1415e71b7053SJung-uk Kim size_t session_id_len; 1416e71b7053SJung-uk Kim const unsigned char *cipherchars; 1417e71b7053SJung-uk Kim int hrr = 0; 1418e71b7053SJung-uk Kim unsigned int compression; 1419e71b7053SJung-uk Kim unsigned int sversion; 1420e71b7053SJung-uk Kim unsigned int context; 1421e71b7053SJung-uk Kim RAW_EXTENSION *extensions = NULL; 1422e71b7053SJung-uk Kim #ifndef OPENSSL_NO_COMP 1423e71b7053SJung-uk Kim SSL_COMP *comp; 1424e71b7053SJung-uk Kim #endif 1425e71b7053SJung-uk Kim 1426e71b7053SJung-uk Kim if (!PACKET_get_net_2(pkt, &sversion)) { 1427e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_DECODE_ERROR, SSL_F_TLS_PROCESS_SERVER_HELLO, 1428e71b7053SJung-uk Kim SSL_R_LENGTH_MISMATCH); 1429e71b7053SJung-uk Kim goto err; 1430e71b7053SJung-uk Kim } 1431e71b7053SJung-uk Kim 1432e71b7053SJung-uk Kim /* load the server random */ 1433e71b7053SJung-uk Kim if (s->version == TLS1_3_VERSION 1434e71b7053SJung-uk Kim && sversion == TLS1_2_VERSION 1435e71b7053SJung-uk Kim && PACKET_remaining(pkt) >= SSL3_RANDOM_SIZE 1436e71b7053SJung-uk Kim && memcmp(hrrrandom, PACKET_data(pkt), SSL3_RANDOM_SIZE) == 0) { 1437e71b7053SJung-uk Kim s->hello_retry_request = SSL_HRR_PENDING; 1438e71b7053SJung-uk Kim hrr = 1; 1439e71b7053SJung-uk Kim if (!PACKET_forward(pkt, SSL3_RANDOM_SIZE)) { 1440e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_DECODE_ERROR, SSL_F_TLS_PROCESS_SERVER_HELLO, 1441e71b7053SJung-uk Kim SSL_R_LENGTH_MISMATCH); 1442e71b7053SJung-uk Kim goto err; 1443e71b7053SJung-uk Kim } 1444e71b7053SJung-uk Kim } else { 1445e71b7053SJung-uk Kim if (!PACKET_copy_bytes(pkt, s->s3->server_random, SSL3_RANDOM_SIZE)) { 1446e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_DECODE_ERROR, SSL_F_TLS_PROCESS_SERVER_HELLO, 1447e71b7053SJung-uk Kim SSL_R_LENGTH_MISMATCH); 1448e71b7053SJung-uk Kim goto err; 1449e71b7053SJung-uk Kim } 1450e71b7053SJung-uk Kim } 1451e71b7053SJung-uk Kim 1452e71b7053SJung-uk Kim /* Get the session-id. */ 1453e71b7053SJung-uk Kim if (!PACKET_get_length_prefixed_1(pkt, &session_id)) { 1454e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_DECODE_ERROR, SSL_F_TLS_PROCESS_SERVER_HELLO, 1455e71b7053SJung-uk Kim SSL_R_LENGTH_MISMATCH); 1456e71b7053SJung-uk Kim goto err; 1457e71b7053SJung-uk Kim } 1458e71b7053SJung-uk Kim session_id_len = PACKET_remaining(&session_id); 1459e71b7053SJung-uk Kim if (session_id_len > sizeof(s->session->session_id) 1460e71b7053SJung-uk Kim || session_id_len > SSL3_SESSION_ID_SIZE) { 1461e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_ILLEGAL_PARAMETER, SSL_F_TLS_PROCESS_SERVER_HELLO, 1462e71b7053SJung-uk Kim SSL_R_SSL3_SESSION_ID_TOO_LONG); 1463e71b7053SJung-uk Kim goto err; 1464e71b7053SJung-uk Kim } 1465e71b7053SJung-uk Kim 1466e71b7053SJung-uk Kim if (!PACKET_get_bytes(pkt, &cipherchars, TLS_CIPHER_LEN)) { 1467e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_DECODE_ERROR, SSL_F_TLS_PROCESS_SERVER_HELLO, 1468e71b7053SJung-uk Kim SSL_R_LENGTH_MISMATCH); 1469e71b7053SJung-uk Kim goto err; 1470e71b7053SJung-uk Kim } 1471e71b7053SJung-uk Kim 1472e71b7053SJung-uk Kim if (!PACKET_get_1(pkt, &compression)) { 1473e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_DECODE_ERROR, SSL_F_TLS_PROCESS_SERVER_HELLO, 1474e71b7053SJung-uk Kim SSL_R_LENGTH_MISMATCH); 1475e71b7053SJung-uk Kim goto err; 1476e71b7053SJung-uk Kim } 1477e71b7053SJung-uk Kim 1478e71b7053SJung-uk Kim /* TLS extensions */ 1479e71b7053SJung-uk Kim if (PACKET_remaining(pkt) == 0 && !hrr) { 1480e71b7053SJung-uk Kim PACKET_null_init(&extpkt); 1481e71b7053SJung-uk Kim } else if (!PACKET_as_length_prefixed_2(pkt, &extpkt) 1482e71b7053SJung-uk Kim || PACKET_remaining(pkt) != 0) { 1483e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_DECODE_ERROR, SSL_F_TLS_PROCESS_SERVER_HELLO, 1484e71b7053SJung-uk Kim SSL_R_BAD_LENGTH); 1485e71b7053SJung-uk Kim goto err; 1486e71b7053SJung-uk Kim } 1487e71b7053SJung-uk Kim 1488e71b7053SJung-uk Kim if (!hrr) { 1489e71b7053SJung-uk Kim if (!tls_collect_extensions(s, &extpkt, 1490e71b7053SJung-uk Kim SSL_EXT_TLS1_2_SERVER_HELLO 1491e71b7053SJung-uk Kim | SSL_EXT_TLS1_3_SERVER_HELLO, 1492e71b7053SJung-uk Kim &extensions, NULL, 1)) { 1493e71b7053SJung-uk Kim /* SSLfatal() already called */ 1494e71b7053SJung-uk Kim goto err; 1495e71b7053SJung-uk Kim } 1496e71b7053SJung-uk Kim 1497e71b7053SJung-uk Kim if (!ssl_choose_client_version(s, sversion, extensions)) { 1498e71b7053SJung-uk Kim /* SSLfatal() already called */ 1499e71b7053SJung-uk Kim goto err; 1500e71b7053SJung-uk Kim } 1501e71b7053SJung-uk Kim } 1502e71b7053SJung-uk Kim 1503e71b7053SJung-uk Kim if (SSL_IS_TLS13(s) || hrr) { 1504e71b7053SJung-uk Kim if (compression != 0) { 1505e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_ILLEGAL_PARAMETER, 1506e71b7053SJung-uk Kim SSL_F_TLS_PROCESS_SERVER_HELLO, 1507e71b7053SJung-uk Kim SSL_R_INVALID_COMPRESSION_ALGORITHM); 1508e71b7053SJung-uk Kim goto err; 1509e71b7053SJung-uk Kim } 1510e71b7053SJung-uk Kim 1511e71b7053SJung-uk Kim if (session_id_len != s->tmp_session_id_len 1512e71b7053SJung-uk Kim || memcmp(PACKET_data(&session_id), s->tmp_session_id, 1513e71b7053SJung-uk Kim session_id_len) != 0) { 1514e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_ILLEGAL_PARAMETER, 1515e71b7053SJung-uk Kim SSL_F_TLS_PROCESS_SERVER_HELLO, SSL_R_INVALID_SESSION_ID); 1516e71b7053SJung-uk Kim goto err; 1517e71b7053SJung-uk Kim } 1518e71b7053SJung-uk Kim } 1519e71b7053SJung-uk Kim 1520e71b7053SJung-uk Kim if (hrr) { 1521e71b7053SJung-uk Kim if (!set_client_ciphersuite(s, cipherchars)) { 1522e71b7053SJung-uk Kim /* SSLfatal() already called */ 1523e71b7053SJung-uk Kim goto err; 1524e71b7053SJung-uk Kim } 1525e71b7053SJung-uk Kim 1526e71b7053SJung-uk Kim return tls_process_as_hello_retry_request(s, &extpkt); 1527e71b7053SJung-uk Kim } 1528e71b7053SJung-uk Kim 1529e71b7053SJung-uk Kim /* 1530e71b7053SJung-uk Kim * Now we have chosen the version we need to check again that the extensions 1531e71b7053SJung-uk Kim * are appropriate for this version. 1532e71b7053SJung-uk Kim */ 1533e71b7053SJung-uk Kim context = SSL_IS_TLS13(s) ? SSL_EXT_TLS1_3_SERVER_HELLO 1534e71b7053SJung-uk Kim : SSL_EXT_TLS1_2_SERVER_HELLO; 1535e71b7053SJung-uk Kim if (!tls_validate_all_contexts(s, context, extensions)) { 1536e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_ILLEGAL_PARAMETER, SSL_F_TLS_PROCESS_SERVER_HELLO, 1537e71b7053SJung-uk Kim SSL_R_BAD_EXTENSION); 1538e71b7053SJung-uk Kim goto err; 1539e71b7053SJung-uk Kim } 1540e71b7053SJung-uk Kim 1541e71b7053SJung-uk Kim s->hit = 0; 1542e71b7053SJung-uk Kim 1543e71b7053SJung-uk Kim if (SSL_IS_TLS13(s)) { 1544e71b7053SJung-uk Kim /* 1545e71b7053SJung-uk Kim * In TLSv1.3 a ServerHello message signals a key change so the end of 1546e71b7053SJung-uk Kim * the message must be on a record boundary. 1547e71b7053SJung-uk Kim */ 1548e71b7053SJung-uk Kim if (RECORD_LAYER_processed_read_pending(&s->rlayer)) { 1549e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_UNEXPECTED_MESSAGE, 1550e71b7053SJung-uk Kim SSL_F_TLS_PROCESS_SERVER_HELLO, 1551e71b7053SJung-uk Kim SSL_R_NOT_ON_RECORD_BOUNDARY); 1552e71b7053SJung-uk Kim goto err; 1553e71b7053SJung-uk Kim } 1554e71b7053SJung-uk Kim 1555e71b7053SJung-uk Kim /* This will set s->hit if we are resuming */ 1556e71b7053SJung-uk Kim if (!tls_parse_extension(s, TLSEXT_IDX_psk, 1557e71b7053SJung-uk Kim SSL_EXT_TLS1_3_SERVER_HELLO, 1558e71b7053SJung-uk Kim extensions, NULL, 0)) { 1559e71b7053SJung-uk Kim /* SSLfatal() already called */ 1560e71b7053SJung-uk Kim goto err; 1561e71b7053SJung-uk Kim } 1562e71b7053SJung-uk Kim } else { 1563e71b7053SJung-uk Kim /* 1564e71b7053SJung-uk Kim * Check if we can resume the session based on external pre-shared 1565e71b7053SJung-uk Kim * secret. EAP-FAST (RFC 4851) supports two types of session resumption. 1566e71b7053SJung-uk Kim * Resumption based on server-side state works with session IDs. 1567e71b7053SJung-uk Kim * Resumption based on pre-shared Protected Access Credentials (PACs) 1568e71b7053SJung-uk Kim * works by overriding the SessionTicket extension at the application 1569e71b7053SJung-uk Kim * layer, and does not send a session ID. (We do not know whether 1570e71b7053SJung-uk Kim * EAP-FAST servers would honour the session ID.) Therefore, the session 1571e71b7053SJung-uk Kim * ID alone is not a reliable indicator of session resumption, so we 1572e71b7053SJung-uk Kim * first check if we can resume, and later peek at the next handshake 1573e71b7053SJung-uk Kim * message to see if the server wants to resume. 1574e71b7053SJung-uk Kim */ 1575e71b7053SJung-uk Kim if (s->version >= TLS1_VERSION 1576e71b7053SJung-uk Kim && s->ext.session_secret_cb != NULL && s->session->ext.tick) { 1577e71b7053SJung-uk Kim const SSL_CIPHER *pref_cipher = NULL; 1578e71b7053SJung-uk Kim /* 1579e71b7053SJung-uk Kim * s->session->master_key_length is a size_t, but this is an int for 1580e71b7053SJung-uk Kim * backwards compat reasons 1581e71b7053SJung-uk Kim */ 1582e71b7053SJung-uk Kim int master_key_length; 1583e71b7053SJung-uk Kim master_key_length = sizeof(s->session->master_key); 1584e71b7053SJung-uk Kim if (s->ext.session_secret_cb(s, s->session->master_key, 1585e71b7053SJung-uk Kim &master_key_length, 1586e71b7053SJung-uk Kim NULL, &pref_cipher, 1587e71b7053SJung-uk Kim s->ext.session_secret_cb_arg) 1588e71b7053SJung-uk Kim && master_key_length > 0) { 1589e71b7053SJung-uk Kim s->session->master_key_length = master_key_length; 1590e71b7053SJung-uk Kim s->session->cipher = pref_cipher ? 1591e71b7053SJung-uk Kim pref_cipher : ssl_get_cipher_by_char(s, cipherchars, 0); 1592e71b7053SJung-uk Kim } else { 1593e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_INTERNAL_ERROR, 1594e71b7053SJung-uk Kim SSL_F_TLS_PROCESS_SERVER_HELLO, ERR_R_INTERNAL_ERROR); 1595e71b7053SJung-uk Kim goto err; 1596e71b7053SJung-uk Kim } 1597e71b7053SJung-uk Kim } 1598e71b7053SJung-uk Kim 1599e71b7053SJung-uk Kim if (session_id_len != 0 1600e71b7053SJung-uk Kim && session_id_len == s->session->session_id_length 1601e71b7053SJung-uk Kim && memcmp(PACKET_data(&session_id), s->session->session_id, 1602e71b7053SJung-uk Kim session_id_len) == 0) 1603e71b7053SJung-uk Kim s->hit = 1; 1604e71b7053SJung-uk Kim } 1605e71b7053SJung-uk Kim 1606e71b7053SJung-uk Kim if (s->hit) { 1607e71b7053SJung-uk Kim if (s->sid_ctx_length != s->session->sid_ctx_length 1608e71b7053SJung-uk Kim || memcmp(s->session->sid_ctx, s->sid_ctx, s->sid_ctx_length)) { 1609e71b7053SJung-uk Kim /* actually a client application bug */ 1610e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_ILLEGAL_PARAMETER, 1611e71b7053SJung-uk Kim SSL_F_TLS_PROCESS_SERVER_HELLO, 1612e71b7053SJung-uk Kim SSL_R_ATTEMPT_TO_REUSE_SESSION_IN_DIFFERENT_CONTEXT); 1613e71b7053SJung-uk Kim goto err; 1614e71b7053SJung-uk Kim } 1615e71b7053SJung-uk Kim } else { 1616e71b7053SJung-uk Kim /* 1617e71b7053SJung-uk Kim * If we were trying for session-id reuse but the server 1618e71b7053SJung-uk Kim * didn't resume, make a new SSL_SESSION. 1619e71b7053SJung-uk Kim * In the case of EAP-FAST and PAC, we do not send a session ID, 1620e71b7053SJung-uk Kim * so the PAC-based session secret is always preserved. It'll be 1621e71b7053SJung-uk Kim * overwritten if the server refuses resumption. 1622e71b7053SJung-uk Kim */ 1623e71b7053SJung-uk Kim if (s->session->session_id_length > 0 1624e71b7053SJung-uk Kim || (SSL_IS_TLS13(s) 1625e71b7053SJung-uk Kim && s->session->ext.tick_identity 1626e71b7053SJung-uk Kim != TLSEXT_PSK_BAD_IDENTITY)) { 1627e71b7053SJung-uk Kim tsan_counter(&s->session_ctx->stats.sess_miss); 1628e71b7053SJung-uk Kim if (!ssl_get_new_session(s, 0)) { 1629e71b7053SJung-uk Kim /* SSLfatal() already called */ 1630e71b7053SJung-uk Kim goto err; 1631e71b7053SJung-uk Kim } 1632e71b7053SJung-uk Kim } 1633e71b7053SJung-uk Kim 1634e71b7053SJung-uk Kim s->session->ssl_version = s->version; 1635e71b7053SJung-uk Kim /* 1636e71b7053SJung-uk Kim * In TLSv1.2 and below we save the session id we were sent so we can 1637e71b7053SJung-uk Kim * resume it later. In TLSv1.3 the session id we were sent is just an 1638e71b7053SJung-uk Kim * echo of what we originally sent in the ClientHello and should not be 1639e71b7053SJung-uk Kim * used for resumption. 1640e71b7053SJung-uk Kim */ 1641e71b7053SJung-uk Kim if (!SSL_IS_TLS13(s)) { 1642e71b7053SJung-uk Kim s->session->session_id_length = session_id_len; 1643e71b7053SJung-uk Kim /* session_id_len could be 0 */ 1644e71b7053SJung-uk Kim if (session_id_len > 0) 1645e71b7053SJung-uk Kim memcpy(s->session->session_id, PACKET_data(&session_id), 1646e71b7053SJung-uk Kim session_id_len); 1647e71b7053SJung-uk Kim } 1648e71b7053SJung-uk Kim } 1649e71b7053SJung-uk Kim 1650e71b7053SJung-uk Kim /* Session version and negotiated protocol version should match */ 1651e71b7053SJung-uk Kim if (s->version != s->session->ssl_version) { 1652e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_PROTOCOL_VERSION, SSL_F_TLS_PROCESS_SERVER_HELLO, 1653e71b7053SJung-uk Kim SSL_R_SSL_SESSION_VERSION_MISMATCH); 1654e71b7053SJung-uk Kim goto err; 1655e71b7053SJung-uk Kim } 1656e71b7053SJung-uk Kim /* 1657e71b7053SJung-uk Kim * Now that we know the version, update the check to see if it's an allowed 1658e71b7053SJung-uk Kim * version. 1659e71b7053SJung-uk Kim */ 1660e71b7053SJung-uk Kim s->s3->tmp.min_ver = s->version; 1661e71b7053SJung-uk Kim s->s3->tmp.max_ver = s->version; 1662e71b7053SJung-uk Kim 1663e71b7053SJung-uk Kim if (!set_client_ciphersuite(s, cipherchars)) { 1664e71b7053SJung-uk Kim /* SSLfatal() already called */ 1665e71b7053SJung-uk Kim goto err; 1666e71b7053SJung-uk Kim } 1667e71b7053SJung-uk Kim 1668e71b7053SJung-uk Kim #ifdef OPENSSL_NO_COMP 1669e71b7053SJung-uk Kim if (compression != 0) { 1670e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_ILLEGAL_PARAMETER, SSL_F_TLS_PROCESS_SERVER_HELLO, 1671e71b7053SJung-uk Kim SSL_R_UNSUPPORTED_COMPRESSION_ALGORITHM); 1672e71b7053SJung-uk Kim goto err; 1673e71b7053SJung-uk Kim } 1674e71b7053SJung-uk Kim /* 1675e71b7053SJung-uk Kim * If compression is disabled we'd better not try to resume a session 1676e71b7053SJung-uk Kim * using compression. 1677e71b7053SJung-uk Kim */ 1678e71b7053SJung-uk Kim if (s->session->compress_meth != 0) { 1679e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_HANDSHAKE_FAILURE, SSL_F_TLS_PROCESS_SERVER_HELLO, 1680e71b7053SJung-uk Kim SSL_R_INCONSISTENT_COMPRESSION); 1681e71b7053SJung-uk Kim goto err; 1682e71b7053SJung-uk Kim } 1683e71b7053SJung-uk Kim #else 1684e71b7053SJung-uk Kim if (s->hit && compression != s->session->compress_meth) { 1685e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_ILLEGAL_PARAMETER, SSL_F_TLS_PROCESS_SERVER_HELLO, 1686e71b7053SJung-uk Kim SSL_R_OLD_SESSION_COMPRESSION_ALGORITHM_NOT_RETURNED); 1687e71b7053SJung-uk Kim goto err; 1688e71b7053SJung-uk Kim } 1689e71b7053SJung-uk Kim if (compression == 0) 1690e71b7053SJung-uk Kim comp = NULL; 1691e71b7053SJung-uk Kim else if (!ssl_allow_compression(s)) { 1692e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_ILLEGAL_PARAMETER, SSL_F_TLS_PROCESS_SERVER_HELLO, 1693e71b7053SJung-uk Kim SSL_R_COMPRESSION_DISABLED); 1694e71b7053SJung-uk Kim goto err; 1695e71b7053SJung-uk Kim } else { 1696e71b7053SJung-uk Kim comp = ssl3_comp_find(s->ctx->comp_methods, compression); 1697e71b7053SJung-uk Kim } 1698e71b7053SJung-uk Kim 1699e71b7053SJung-uk Kim if (compression != 0 && comp == NULL) { 1700e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_ILLEGAL_PARAMETER, SSL_F_TLS_PROCESS_SERVER_HELLO, 1701e71b7053SJung-uk Kim SSL_R_UNSUPPORTED_COMPRESSION_ALGORITHM); 1702e71b7053SJung-uk Kim goto err; 1703e71b7053SJung-uk Kim } else { 1704e71b7053SJung-uk Kim s->s3->tmp.new_compression = comp; 1705e71b7053SJung-uk Kim } 1706e71b7053SJung-uk Kim #endif 1707e71b7053SJung-uk Kim 1708e71b7053SJung-uk Kim if (!tls_parse_all_extensions(s, context, extensions, NULL, 0, 1)) { 1709e71b7053SJung-uk Kim /* SSLfatal() already called */ 1710e71b7053SJung-uk Kim goto err; 1711e71b7053SJung-uk Kim } 1712e71b7053SJung-uk Kim 1713e71b7053SJung-uk Kim #ifndef OPENSSL_NO_SCTP 1714e71b7053SJung-uk Kim if (SSL_IS_DTLS(s) && s->hit) { 1715e71b7053SJung-uk Kim unsigned char sctpauthkey[64]; 1716e71b7053SJung-uk Kim char labelbuffer[sizeof(DTLS1_SCTP_AUTH_LABEL)]; 1717e71b7053SJung-uk Kim 1718e71b7053SJung-uk Kim /* 1719e71b7053SJung-uk Kim * Add new shared key for SCTP-Auth, will be ignored if 1720e71b7053SJung-uk Kim * no SCTP used. 1721e71b7053SJung-uk Kim */ 1722e71b7053SJung-uk Kim memcpy(labelbuffer, DTLS1_SCTP_AUTH_LABEL, 1723e71b7053SJung-uk Kim sizeof(DTLS1_SCTP_AUTH_LABEL)); 1724e71b7053SJung-uk Kim 1725e71b7053SJung-uk Kim if (SSL_export_keying_material(s, sctpauthkey, 1726e71b7053SJung-uk Kim sizeof(sctpauthkey), 1727e71b7053SJung-uk Kim labelbuffer, 1728e71b7053SJung-uk Kim sizeof(labelbuffer), NULL, 0, 0) <= 0) { 1729e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_TLS_PROCESS_SERVER_HELLO, 1730e71b7053SJung-uk Kim ERR_R_INTERNAL_ERROR); 1731e71b7053SJung-uk Kim goto err; 1732e71b7053SJung-uk Kim } 1733e71b7053SJung-uk Kim 1734e71b7053SJung-uk Kim BIO_ctrl(SSL_get_wbio(s), 1735e71b7053SJung-uk Kim BIO_CTRL_DGRAM_SCTP_ADD_AUTH_KEY, 1736e71b7053SJung-uk Kim sizeof(sctpauthkey), sctpauthkey); 1737e71b7053SJung-uk Kim } 1738e71b7053SJung-uk Kim #endif 1739e71b7053SJung-uk Kim 1740e71b7053SJung-uk Kim /* 1741e71b7053SJung-uk Kim * In TLSv1.3 we have some post-processing to change cipher state, otherwise 1742e71b7053SJung-uk Kim * we're done with this message 1743e71b7053SJung-uk Kim */ 1744e71b7053SJung-uk Kim if (SSL_IS_TLS13(s) 1745e71b7053SJung-uk Kim && (!s->method->ssl3_enc->setup_key_block(s) 1746e71b7053SJung-uk Kim || !s->method->ssl3_enc->change_cipher_state(s, 1747e71b7053SJung-uk Kim SSL3_CC_HANDSHAKE | SSL3_CHANGE_CIPHER_CLIENT_READ))) { 1748e71b7053SJung-uk Kim /* SSLfatal() already called */ 1749e71b7053SJung-uk Kim goto err; 1750e71b7053SJung-uk Kim } 1751e71b7053SJung-uk Kim 1752e71b7053SJung-uk Kim OPENSSL_free(extensions); 1753e71b7053SJung-uk Kim return MSG_PROCESS_CONTINUE_READING; 1754e71b7053SJung-uk Kim err: 1755e71b7053SJung-uk Kim OPENSSL_free(extensions); 1756e71b7053SJung-uk Kim return MSG_PROCESS_ERROR; 1757e71b7053SJung-uk Kim } 1758e71b7053SJung-uk Kim 1759e71b7053SJung-uk Kim static MSG_PROCESS_RETURN tls_process_as_hello_retry_request(SSL *s, 1760e71b7053SJung-uk Kim PACKET *extpkt) 1761e71b7053SJung-uk Kim { 1762e71b7053SJung-uk Kim RAW_EXTENSION *extensions = NULL; 1763e71b7053SJung-uk Kim 1764e71b7053SJung-uk Kim /* 1765e71b7053SJung-uk Kim * If we were sending early_data then the enc_write_ctx is now invalid and 1766e71b7053SJung-uk Kim * should not be used. 1767e71b7053SJung-uk Kim */ 1768e71b7053SJung-uk Kim EVP_CIPHER_CTX_free(s->enc_write_ctx); 1769e71b7053SJung-uk Kim s->enc_write_ctx = NULL; 1770e71b7053SJung-uk Kim 1771e71b7053SJung-uk Kim if (!tls_collect_extensions(s, extpkt, SSL_EXT_TLS1_3_HELLO_RETRY_REQUEST, 1772e71b7053SJung-uk Kim &extensions, NULL, 1) 1773e71b7053SJung-uk Kim || !tls_parse_all_extensions(s, SSL_EXT_TLS1_3_HELLO_RETRY_REQUEST, 1774e71b7053SJung-uk Kim extensions, NULL, 0, 1)) { 1775e71b7053SJung-uk Kim /* SSLfatal() already called */ 1776e71b7053SJung-uk Kim goto err; 1777e71b7053SJung-uk Kim } 1778e71b7053SJung-uk Kim 1779e71b7053SJung-uk Kim OPENSSL_free(extensions); 1780e71b7053SJung-uk Kim extensions = NULL; 1781e71b7053SJung-uk Kim 1782e71b7053SJung-uk Kim if (s->ext.tls13_cookie_len == 0 1783e71b7053SJung-uk Kim #if !defined(OPENSSL_NO_EC) || !defined(OPENSSL_NO_DH) 1784e71b7053SJung-uk Kim && s->s3->tmp.pkey != NULL 1785e71b7053SJung-uk Kim #endif 1786e71b7053SJung-uk Kim ) { 1787e71b7053SJung-uk Kim /* 1788e71b7053SJung-uk Kim * We didn't receive a cookie or a new key_share so the next 1789e71b7053SJung-uk Kim * ClientHello will not change 1790e71b7053SJung-uk Kim */ 1791e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_ILLEGAL_PARAMETER, 1792e71b7053SJung-uk Kim SSL_F_TLS_PROCESS_AS_HELLO_RETRY_REQUEST, 1793e71b7053SJung-uk Kim SSL_R_NO_CHANGE_FOLLOWING_HRR); 1794e71b7053SJung-uk Kim goto err; 1795e71b7053SJung-uk Kim } 1796e71b7053SJung-uk Kim 1797e71b7053SJung-uk Kim /* 1798e71b7053SJung-uk Kim * Re-initialise the Transcript Hash. We're going to prepopulate it with 1799e71b7053SJung-uk Kim * a synthetic message_hash in place of ClientHello1. 1800e71b7053SJung-uk Kim */ 1801e71b7053SJung-uk Kim if (!create_synthetic_message_hash(s, NULL, 0, NULL, 0)) { 1802e71b7053SJung-uk Kim /* SSLfatal() already called */ 1803e71b7053SJung-uk Kim goto err; 1804e71b7053SJung-uk Kim } 1805e71b7053SJung-uk Kim 1806e71b7053SJung-uk Kim /* 1807e71b7053SJung-uk Kim * Add this message to the Transcript Hash. Normally this is done 1808e71b7053SJung-uk Kim * automatically prior to the message processing stage. However due to the 1809e71b7053SJung-uk Kim * need to create the synthetic message hash, we defer that step until now 1810e71b7053SJung-uk Kim * for HRR messages. 1811e71b7053SJung-uk Kim */ 1812e71b7053SJung-uk Kim if (!ssl3_finish_mac(s, (unsigned char *)s->init_buf->data, 1813e71b7053SJung-uk Kim s->init_num + SSL3_HM_HEADER_LENGTH)) { 1814e71b7053SJung-uk Kim /* SSLfatal() already called */ 1815e71b7053SJung-uk Kim goto err; 1816e71b7053SJung-uk Kim } 1817e71b7053SJung-uk Kim 1818e71b7053SJung-uk Kim return MSG_PROCESS_FINISHED_READING; 1819e71b7053SJung-uk Kim err: 1820e71b7053SJung-uk Kim OPENSSL_free(extensions); 1821e71b7053SJung-uk Kim return MSG_PROCESS_ERROR; 1822e71b7053SJung-uk Kim } 1823e71b7053SJung-uk Kim 1824e71b7053SJung-uk Kim MSG_PROCESS_RETURN tls_process_server_certificate(SSL *s, PACKET *pkt) 1825e71b7053SJung-uk Kim { 1826e71b7053SJung-uk Kim int i; 1827e71b7053SJung-uk Kim MSG_PROCESS_RETURN ret = MSG_PROCESS_ERROR; 1828e71b7053SJung-uk Kim unsigned long cert_list_len, cert_len; 1829e71b7053SJung-uk Kim X509 *x = NULL; 1830e71b7053SJung-uk Kim const unsigned char *certstart, *certbytes; 1831e71b7053SJung-uk Kim STACK_OF(X509) *sk = NULL; 1832e71b7053SJung-uk Kim EVP_PKEY *pkey = NULL; 1833e71b7053SJung-uk Kim size_t chainidx, certidx; 1834e71b7053SJung-uk Kim unsigned int context = 0; 1835e71b7053SJung-uk Kim const SSL_CERT_LOOKUP *clu; 1836e71b7053SJung-uk Kim 1837e71b7053SJung-uk Kim if ((sk = sk_X509_new_null()) == NULL) { 1838e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_TLS_PROCESS_SERVER_CERTIFICATE, 1839e71b7053SJung-uk Kim ERR_R_MALLOC_FAILURE); 1840e71b7053SJung-uk Kim goto err; 1841e71b7053SJung-uk Kim } 1842e71b7053SJung-uk Kim 1843e71b7053SJung-uk Kim if ((SSL_IS_TLS13(s) && !PACKET_get_1(pkt, &context)) 1844e71b7053SJung-uk Kim || context != 0 1845e71b7053SJung-uk Kim || !PACKET_get_net_3(pkt, &cert_list_len) 1846e71b7053SJung-uk Kim || PACKET_remaining(pkt) != cert_list_len 1847e71b7053SJung-uk Kim || PACKET_remaining(pkt) == 0) { 1848e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_DECODE_ERROR, SSL_F_TLS_PROCESS_SERVER_CERTIFICATE, 1849e71b7053SJung-uk Kim SSL_R_LENGTH_MISMATCH); 1850e71b7053SJung-uk Kim goto err; 1851e71b7053SJung-uk Kim } 1852e71b7053SJung-uk Kim for (chainidx = 0; PACKET_remaining(pkt); chainidx++) { 1853e71b7053SJung-uk Kim if (!PACKET_get_net_3(pkt, &cert_len) 1854e71b7053SJung-uk Kim || !PACKET_get_bytes(pkt, &certbytes, cert_len)) { 1855e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_DECODE_ERROR, 1856e71b7053SJung-uk Kim SSL_F_TLS_PROCESS_SERVER_CERTIFICATE, 1857e71b7053SJung-uk Kim SSL_R_CERT_LENGTH_MISMATCH); 1858e71b7053SJung-uk Kim goto err; 1859e71b7053SJung-uk Kim } 1860e71b7053SJung-uk Kim 1861e71b7053SJung-uk Kim certstart = certbytes; 1862e71b7053SJung-uk Kim x = d2i_X509(NULL, (const unsigned char **)&certbytes, cert_len); 1863e71b7053SJung-uk Kim if (x == NULL) { 1864e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_BAD_CERTIFICATE, 1865e71b7053SJung-uk Kim SSL_F_TLS_PROCESS_SERVER_CERTIFICATE, ERR_R_ASN1_LIB); 1866e71b7053SJung-uk Kim goto err; 1867e71b7053SJung-uk Kim } 1868e71b7053SJung-uk Kim if (certbytes != (certstart + cert_len)) { 1869e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_DECODE_ERROR, 1870e71b7053SJung-uk Kim SSL_F_TLS_PROCESS_SERVER_CERTIFICATE, 1871e71b7053SJung-uk Kim SSL_R_CERT_LENGTH_MISMATCH); 1872e71b7053SJung-uk Kim goto err; 1873e71b7053SJung-uk Kim } 1874e71b7053SJung-uk Kim 1875e71b7053SJung-uk Kim if (SSL_IS_TLS13(s)) { 1876e71b7053SJung-uk Kim RAW_EXTENSION *rawexts = NULL; 1877e71b7053SJung-uk Kim PACKET extensions; 1878e71b7053SJung-uk Kim 1879e71b7053SJung-uk Kim if (!PACKET_get_length_prefixed_2(pkt, &extensions)) { 1880e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_DECODE_ERROR, 1881e71b7053SJung-uk Kim SSL_F_TLS_PROCESS_SERVER_CERTIFICATE, 1882e71b7053SJung-uk Kim SSL_R_BAD_LENGTH); 1883e71b7053SJung-uk Kim goto err; 1884e71b7053SJung-uk Kim } 1885e71b7053SJung-uk Kim if (!tls_collect_extensions(s, &extensions, 1886e71b7053SJung-uk Kim SSL_EXT_TLS1_3_CERTIFICATE, &rawexts, 1887e71b7053SJung-uk Kim NULL, chainidx == 0) 1888e71b7053SJung-uk Kim || !tls_parse_all_extensions(s, SSL_EXT_TLS1_3_CERTIFICATE, 1889e71b7053SJung-uk Kim rawexts, x, chainidx, 1890e71b7053SJung-uk Kim PACKET_remaining(pkt) == 0)) { 1891e71b7053SJung-uk Kim OPENSSL_free(rawexts); 1892e71b7053SJung-uk Kim /* SSLfatal already called */ 1893e71b7053SJung-uk Kim goto err; 1894e71b7053SJung-uk Kim } 1895e71b7053SJung-uk Kim OPENSSL_free(rawexts); 1896e71b7053SJung-uk Kim } 1897e71b7053SJung-uk Kim 1898e71b7053SJung-uk Kim if (!sk_X509_push(sk, x)) { 1899e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_INTERNAL_ERROR, 1900e71b7053SJung-uk Kim SSL_F_TLS_PROCESS_SERVER_CERTIFICATE, 1901e71b7053SJung-uk Kim ERR_R_MALLOC_FAILURE); 1902e71b7053SJung-uk Kim goto err; 1903e71b7053SJung-uk Kim } 1904e71b7053SJung-uk Kim x = NULL; 1905e71b7053SJung-uk Kim } 1906e71b7053SJung-uk Kim 1907e71b7053SJung-uk Kim i = ssl_verify_cert_chain(s, sk); 1908e71b7053SJung-uk Kim /* 1909e71b7053SJung-uk Kim * The documented interface is that SSL_VERIFY_PEER should be set in order 1910e71b7053SJung-uk Kim * for client side verification of the server certificate to take place. 1911e71b7053SJung-uk Kim * However, historically the code has only checked that *any* flag is set 1912e71b7053SJung-uk Kim * to cause server verification to take place. Use of the other flags makes 1913e71b7053SJung-uk Kim * no sense in client mode. An attempt to clean up the semantics was 1914e71b7053SJung-uk Kim * reverted because at least one application *only* set 1915e71b7053SJung-uk Kim * SSL_VERIFY_FAIL_IF_NO_PEER_CERT. Prior to the clean up this still caused 1916e71b7053SJung-uk Kim * server verification to take place, after the clean up it silently did 1917e71b7053SJung-uk Kim * nothing. SSL_CTX_set_verify()/SSL_set_verify() cannot validate the flags 1918e71b7053SJung-uk Kim * sent to them because they are void functions. Therefore, we now use the 1919e71b7053SJung-uk Kim * (less clean) historic behaviour of performing validation if any flag is 1920e71b7053SJung-uk Kim * set. The *documented* interface remains the same. 1921e71b7053SJung-uk Kim */ 1922e71b7053SJung-uk Kim if (s->verify_mode != SSL_VERIFY_NONE && i <= 0) { 1923e71b7053SJung-uk Kim SSLfatal(s, ssl_x509err2alert(s->verify_result), 1924e71b7053SJung-uk Kim SSL_F_TLS_PROCESS_SERVER_CERTIFICATE, 1925e71b7053SJung-uk Kim SSL_R_CERTIFICATE_VERIFY_FAILED); 1926e71b7053SJung-uk Kim goto err; 1927e71b7053SJung-uk Kim } 1928e71b7053SJung-uk Kim ERR_clear_error(); /* but we keep s->verify_result */ 1929e71b7053SJung-uk Kim if (i > 1) { 1930e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_HANDSHAKE_FAILURE, 1931e71b7053SJung-uk Kim SSL_F_TLS_PROCESS_SERVER_CERTIFICATE, i); 1932e71b7053SJung-uk Kim goto err; 1933e71b7053SJung-uk Kim } 1934e71b7053SJung-uk Kim 1935e71b7053SJung-uk Kim s->session->peer_chain = sk; 1936e71b7053SJung-uk Kim /* 1937e71b7053SJung-uk Kim * Inconsistency alert: cert_chain does include the peer's certificate, 1938e71b7053SJung-uk Kim * which we don't include in statem_srvr.c 1939e71b7053SJung-uk Kim */ 1940e71b7053SJung-uk Kim x = sk_X509_value(sk, 0); 1941e71b7053SJung-uk Kim sk = NULL; 1942e71b7053SJung-uk Kim 1943e71b7053SJung-uk Kim pkey = X509_get0_pubkey(x); 1944e71b7053SJung-uk Kim 1945e71b7053SJung-uk Kim if (pkey == NULL || EVP_PKEY_missing_parameters(pkey)) { 1946e71b7053SJung-uk Kim x = NULL; 1947e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_TLS_PROCESS_SERVER_CERTIFICATE, 1948e71b7053SJung-uk Kim SSL_R_UNABLE_TO_FIND_PUBLIC_KEY_PARAMETERS); 1949e71b7053SJung-uk Kim goto err; 1950e71b7053SJung-uk Kim } 1951e71b7053SJung-uk Kim 1952e71b7053SJung-uk Kim if ((clu = ssl_cert_lookup_by_pkey(pkey, &certidx)) == NULL) { 1953e71b7053SJung-uk Kim x = NULL; 1954e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_ILLEGAL_PARAMETER, 1955e71b7053SJung-uk Kim SSL_F_TLS_PROCESS_SERVER_CERTIFICATE, 1956e71b7053SJung-uk Kim SSL_R_UNKNOWN_CERTIFICATE_TYPE); 1957e71b7053SJung-uk Kim goto err; 1958e71b7053SJung-uk Kim } 1959e71b7053SJung-uk Kim /* 1960e71b7053SJung-uk Kim * Check certificate type is consistent with ciphersuite. For TLS 1.3 1961e71b7053SJung-uk Kim * skip check since TLS 1.3 ciphersuites can be used with any certificate 1962e71b7053SJung-uk Kim * type. 1963e71b7053SJung-uk Kim */ 1964e71b7053SJung-uk Kim if (!SSL_IS_TLS13(s)) { 1965e71b7053SJung-uk Kim if ((clu->amask & s->s3->tmp.new_cipher->algorithm_auth) == 0) { 1966e71b7053SJung-uk Kim x = NULL; 1967e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_ILLEGAL_PARAMETER, 1968e71b7053SJung-uk Kim SSL_F_TLS_PROCESS_SERVER_CERTIFICATE, 1969e71b7053SJung-uk Kim SSL_R_WRONG_CERTIFICATE_TYPE); 1970e71b7053SJung-uk Kim goto err; 1971e71b7053SJung-uk Kim } 1972e71b7053SJung-uk Kim } 1973e71b7053SJung-uk Kim s->session->peer_type = certidx; 1974e71b7053SJung-uk Kim 1975e71b7053SJung-uk Kim X509_free(s->session->peer); 1976e71b7053SJung-uk Kim X509_up_ref(x); 1977e71b7053SJung-uk Kim s->session->peer = x; 1978e71b7053SJung-uk Kim s->session->verify_result = s->verify_result; 1979e71b7053SJung-uk Kim x = NULL; 1980e71b7053SJung-uk Kim 1981e71b7053SJung-uk Kim /* Save the current hash state for when we receive the CertificateVerify */ 1982e71b7053SJung-uk Kim if (SSL_IS_TLS13(s) 1983e71b7053SJung-uk Kim && !ssl_handshake_hash(s, s->cert_verify_hash, 1984e71b7053SJung-uk Kim sizeof(s->cert_verify_hash), 1985e71b7053SJung-uk Kim &s->cert_verify_hash_len)) { 1986e71b7053SJung-uk Kim /* SSLfatal() already called */; 1987e71b7053SJung-uk Kim goto err; 1988e71b7053SJung-uk Kim } 1989e71b7053SJung-uk Kim 1990e71b7053SJung-uk Kim ret = MSG_PROCESS_CONTINUE_READING; 1991e71b7053SJung-uk Kim 1992e71b7053SJung-uk Kim err: 1993e71b7053SJung-uk Kim X509_free(x); 1994e71b7053SJung-uk Kim sk_X509_pop_free(sk, X509_free); 1995e71b7053SJung-uk Kim return ret; 1996e71b7053SJung-uk Kim } 1997e71b7053SJung-uk Kim 1998e71b7053SJung-uk Kim static int tls_process_ske_psk_preamble(SSL *s, PACKET *pkt) 1999e71b7053SJung-uk Kim { 2000e71b7053SJung-uk Kim #ifndef OPENSSL_NO_PSK 2001e71b7053SJung-uk Kim PACKET psk_identity_hint; 2002e71b7053SJung-uk Kim 2003e71b7053SJung-uk Kim /* PSK ciphersuites are preceded by an identity hint */ 2004e71b7053SJung-uk Kim 2005e71b7053SJung-uk Kim if (!PACKET_get_length_prefixed_2(pkt, &psk_identity_hint)) { 2006e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_DECODE_ERROR, SSL_F_TLS_PROCESS_SKE_PSK_PREAMBLE, 2007e71b7053SJung-uk Kim SSL_R_LENGTH_MISMATCH); 2008e71b7053SJung-uk Kim return 0; 2009e71b7053SJung-uk Kim } 2010e71b7053SJung-uk Kim 2011e71b7053SJung-uk Kim /* 2012e71b7053SJung-uk Kim * Store PSK identity hint for later use, hint is used in 2013e71b7053SJung-uk Kim * tls_construct_client_key_exchange. Assume that the maximum length of 2014e71b7053SJung-uk Kim * a PSK identity hint can be as long as the maximum length of a PSK 2015e71b7053SJung-uk Kim * identity. 2016e71b7053SJung-uk Kim */ 2017e71b7053SJung-uk Kim if (PACKET_remaining(&psk_identity_hint) > PSK_MAX_IDENTITY_LEN) { 2018e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_HANDSHAKE_FAILURE, 2019e71b7053SJung-uk Kim SSL_F_TLS_PROCESS_SKE_PSK_PREAMBLE, 2020e71b7053SJung-uk Kim SSL_R_DATA_LENGTH_TOO_LONG); 2021e71b7053SJung-uk Kim return 0; 2022e71b7053SJung-uk Kim } 2023e71b7053SJung-uk Kim 2024e71b7053SJung-uk Kim if (PACKET_remaining(&psk_identity_hint) == 0) { 2025e71b7053SJung-uk Kim OPENSSL_free(s->session->psk_identity_hint); 2026e71b7053SJung-uk Kim s->session->psk_identity_hint = NULL; 2027e71b7053SJung-uk Kim } else if (!PACKET_strndup(&psk_identity_hint, 2028e71b7053SJung-uk Kim &s->session->psk_identity_hint)) { 2029e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_TLS_PROCESS_SKE_PSK_PREAMBLE, 2030e71b7053SJung-uk Kim ERR_R_INTERNAL_ERROR); 2031e71b7053SJung-uk Kim return 0; 2032e71b7053SJung-uk Kim } 2033e71b7053SJung-uk Kim 2034e71b7053SJung-uk Kim return 1; 2035e71b7053SJung-uk Kim #else 2036e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_TLS_PROCESS_SKE_PSK_PREAMBLE, 2037e71b7053SJung-uk Kim ERR_R_INTERNAL_ERROR); 2038e71b7053SJung-uk Kim return 0; 2039e71b7053SJung-uk Kim #endif 2040e71b7053SJung-uk Kim } 2041e71b7053SJung-uk Kim 2042e71b7053SJung-uk Kim static int tls_process_ske_srp(SSL *s, PACKET *pkt, EVP_PKEY **pkey) 2043e71b7053SJung-uk Kim { 2044e71b7053SJung-uk Kim #ifndef OPENSSL_NO_SRP 2045e71b7053SJung-uk Kim PACKET prime, generator, salt, server_pub; 2046e71b7053SJung-uk Kim 2047e71b7053SJung-uk Kim if (!PACKET_get_length_prefixed_2(pkt, &prime) 2048e71b7053SJung-uk Kim || !PACKET_get_length_prefixed_2(pkt, &generator) 2049e71b7053SJung-uk Kim || !PACKET_get_length_prefixed_1(pkt, &salt) 2050e71b7053SJung-uk Kim || !PACKET_get_length_prefixed_2(pkt, &server_pub)) { 2051e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_DECODE_ERROR, SSL_F_TLS_PROCESS_SKE_SRP, 2052e71b7053SJung-uk Kim SSL_R_LENGTH_MISMATCH); 2053e71b7053SJung-uk Kim return 0; 2054e71b7053SJung-uk Kim } 2055e71b7053SJung-uk Kim 2056e71b7053SJung-uk Kim /* TODO(size_t): Convert BN_bin2bn() calls */ 2057e71b7053SJung-uk Kim if ((s->srp_ctx.N = 2058e71b7053SJung-uk Kim BN_bin2bn(PACKET_data(&prime), 2059e71b7053SJung-uk Kim (int)PACKET_remaining(&prime), NULL)) == NULL 2060e71b7053SJung-uk Kim || (s->srp_ctx.g = 2061e71b7053SJung-uk Kim BN_bin2bn(PACKET_data(&generator), 2062e71b7053SJung-uk Kim (int)PACKET_remaining(&generator), NULL)) == NULL 2063e71b7053SJung-uk Kim || (s->srp_ctx.s = 2064e71b7053SJung-uk Kim BN_bin2bn(PACKET_data(&salt), 2065e71b7053SJung-uk Kim (int)PACKET_remaining(&salt), NULL)) == NULL 2066e71b7053SJung-uk Kim || (s->srp_ctx.B = 2067e71b7053SJung-uk Kim BN_bin2bn(PACKET_data(&server_pub), 2068e71b7053SJung-uk Kim (int)PACKET_remaining(&server_pub), NULL)) == NULL) { 2069e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_TLS_PROCESS_SKE_SRP, 2070e71b7053SJung-uk Kim ERR_R_BN_LIB); 2071e71b7053SJung-uk Kim return 0; 2072e71b7053SJung-uk Kim } 2073e71b7053SJung-uk Kim 2074e71b7053SJung-uk Kim if (!srp_verify_server_param(s)) { 2075e71b7053SJung-uk Kim /* SSLfatal() already called */ 2076e71b7053SJung-uk Kim return 0; 2077e71b7053SJung-uk Kim } 2078e71b7053SJung-uk Kim 2079e71b7053SJung-uk Kim /* We must check if there is a certificate */ 2080e71b7053SJung-uk Kim if (s->s3->tmp.new_cipher->algorithm_auth & (SSL_aRSA | SSL_aDSS)) 2081e71b7053SJung-uk Kim *pkey = X509_get0_pubkey(s->session->peer); 2082e71b7053SJung-uk Kim 2083e71b7053SJung-uk Kim return 1; 2084e71b7053SJung-uk Kim #else 2085e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_TLS_PROCESS_SKE_SRP, 2086e71b7053SJung-uk Kim ERR_R_INTERNAL_ERROR); 2087e71b7053SJung-uk Kim return 0; 2088e71b7053SJung-uk Kim #endif 2089e71b7053SJung-uk Kim } 2090e71b7053SJung-uk Kim 2091e71b7053SJung-uk Kim static int tls_process_ske_dhe(SSL *s, PACKET *pkt, EVP_PKEY **pkey) 2092e71b7053SJung-uk Kim { 2093e71b7053SJung-uk Kim #ifndef OPENSSL_NO_DH 2094e71b7053SJung-uk Kim PACKET prime, generator, pub_key; 2095e71b7053SJung-uk Kim EVP_PKEY *peer_tmp = NULL; 2096e71b7053SJung-uk Kim 2097e71b7053SJung-uk Kim DH *dh = NULL; 2098e71b7053SJung-uk Kim BIGNUM *p = NULL, *g = NULL, *bnpub_key = NULL; 2099e71b7053SJung-uk Kim 2100e71b7053SJung-uk Kim int check_bits = 0; 2101e71b7053SJung-uk Kim 2102e71b7053SJung-uk Kim if (!PACKET_get_length_prefixed_2(pkt, &prime) 2103e71b7053SJung-uk Kim || !PACKET_get_length_prefixed_2(pkt, &generator) 2104e71b7053SJung-uk Kim || !PACKET_get_length_prefixed_2(pkt, &pub_key)) { 2105e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_DECODE_ERROR, SSL_F_TLS_PROCESS_SKE_DHE, 2106e71b7053SJung-uk Kim SSL_R_LENGTH_MISMATCH); 2107e71b7053SJung-uk Kim return 0; 2108e71b7053SJung-uk Kim } 2109e71b7053SJung-uk Kim 2110e71b7053SJung-uk Kim peer_tmp = EVP_PKEY_new(); 2111e71b7053SJung-uk Kim dh = DH_new(); 2112e71b7053SJung-uk Kim 2113e71b7053SJung-uk Kim if (peer_tmp == NULL || dh == NULL) { 2114e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_TLS_PROCESS_SKE_DHE, 2115e71b7053SJung-uk Kim ERR_R_MALLOC_FAILURE); 2116e71b7053SJung-uk Kim goto err; 2117e71b7053SJung-uk Kim } 2118e71b7053SJung-uk Kim 2119e71b7053SJung-uk Kim /* TODO(size_t): Convert these calls */ 2120e71b7053SJung-uk Kim p = BN_bin2bn(PACKET_data(&prime), (int)PACKET_remaining(&prime), NULL); 2121e71b7053SJung-uk Kim g = BN_bin2bn(PACKET_data(&generator), (int)PACKET_remaining(&generator), 2122e71b7053SJung-uk Kim NULL); 2123e71b7053SJung-uk Kim bnpub_key = BN_bin2bn(PACKET_data(&pub_key), 2124e71b7053SJung-uk Kim (int)PACKET_remaining(&pub_key), NULL); 2125e71b7053SJung-uk Kim if (p == NULL || g == NULL || bnpub_key == NULL) { 2126e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_TLS_PROCESS_SKE_DHE, 2127e71b7053SJung-uk Kim ERR_R_BN_LIB); 2128e71b7053SJung-uk Kim goto err; 2129e71b7053SJung-uk Kim } 2130e71b7053SJung-uk Kim 2131e71b7053SJung-uk Kim /* test non-zero pubkey */ 2132e71b7053SJung-uk Kim if (BN_is_zero(bnpub_key)) { 2133e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_ILLEGAL_PARAMETER, SSL_F_TLS_PROCESS_SKE_DHE, 2134e71b7053SJung-uk Kim SSL_R_BAD_DH_VALUE); 2135e71b7053SJung-uk Kim goto err; 2136e71b7053SJung-uk Kim } 2137e71b7053SJung-uk Kim 2138e71b7053SJung-uk Kim if (!DH_set0_pqg(dh, p, NULL, g)) { 2139e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_TLS_PROCESS_SKE_DHE, 2140e71b7053SJung-uk Kim ERR_R_BN_LIB); 2141e71b7053SJung-uk Kim goto err; 2142e71b7053SJung-uk Kim } 2143e71b7053SJung-uk Kim p = g = NULL; 2144e71b7053SJung-uk Kim 2145e71b7053SJung-uk Kim if (DH_check_params(dh, &check_bits) == 0 || check_bits != 0) { 2146e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_ILLEGAL_PARAMETER, SSL_F_TLS_PROCESS_SKE_DHE, 2147e71b7053SJung-uk Kim SSL_R_BAD_DH_VALUE); 2148e71b7053SJung-uk Kim goto err; 2149e71b7053SJung-uk Kim } 2150e71b7053SJung-uk Kim 2151e71b7053SJung-uk Kim if (!DH_set0_key(dh, bnpub_key, NULL)) { 2152e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_TLS_PROCESS_SKE_DHE, 2153e71b7053SJung-uk Kim ERR_R_BN_LIB); 2154e71b7053SJung-uk Kim goto err; 2155e71b7053SJung-uk Kim } 2156e71b7053SJung-uk Kim bnpub_key = NULL; 2157e71b7053SJung-uk Kim 2158e71b7053SJung-uk Kim if (!ssl_security(s, SSL_SECOP_TMP_DH, DH_security_bits(dh), 0, dh)) { 2159e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_HANDSHAKE_FAILURE, SSL_F_TLS_PROCESS_SKE_DHE, 2160e71b7053SJung-uk Kim SSL_R_DH_KEY_TOO_SMALL); 2161e71b7053SJung-uk Kim goto err; 2162e71b7053SJung-uk Kim } 2163e71b7053SJung-uk Kim 2164e71b7053SJung-uk Kim if (EVP_PKEY_assign_DH(peer_tmp, dh) == 0) { 2165e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_TLS_PROCESS_SKE_DHE, 2166e71b7053SJung-uk Kim ERR_R_EVP_LIB); 2167e71b7053SJung-uk Kim goto err; 2168e71b7053SJung-uk Kim } 2169e71b7053SJung-uk Kim 2170e71b7053SJung-uk Kim s->s3->peer_tmp = peer_tmp; 2171e71b7053SJung-uk Kim 2172e71b7053SJung-uk Kim /* 2173e71b7053SJung-uk Kim * FIXME: This makes assumptions about which ciphersuites come with 2174e71b7053SJung-uk Kim * public keys. We should have a less ad-hoc way of doing this 2175e71b7053SJung-uk Kim */ 2176e71b7053SJung-uk Kim if (s->s3->tmp.new_cipher->algorithm_auth & (SSL_aRSA | SSL_aDSS)) 2177e71b7053SJung-uk Kim *pkey = X509_get0_pubkey(s->session->peer); 2178e71b7053SJung-uk Kim /* else anonymous DH, so no certificate or pkey. */ 2179e71b7053SJung-uk Kim 2180e71b7053SJung-uk Kim return 1; 2181e71b7053SJung-uk Kim 2182e71b7053SJung-uk Kim err: 2183e71b7053SJung-uk Kim BN_free(p); 2184e71b7053SJung-uk Kim BN_free(g); 2185e71b7053SJung-uk Kim BN_free(bnpub_key); 2186e71b7053SJung-uk Kim DH_free(dh); 2187e71b7053SJung-uk Kim EVP_PKEY_free(peer_tmp); 2188e71b7053SJung-uk Kim 2189e71b7053SJung-uk Kim return 0; 2190e71b7053SJung-uk Kim #else 2191e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_TLS_PROCESS_SKE_DHE, 2192e71b7053SJung-uk Kim ERR_R_INTERNAL_ERROR); 2193e71b7053SJung-uk Kim return 0; 2194e71b7053SJung-uk Kim #endif 2195e71b7053SJung-uk Kim } 2196e71b7053SJung-uk Kim 2197e71b7053SJung-uk Kim static int tls_process_ske_ecdhe(SSL *s, PACKET *pkt, EVP_PKEY **pkey) 2198e71b7053SJung-uk Kim { 2199e71b7053SJung-uk Kim #ifndef OPENSSL_NO_EC 2200e71b7053SJung-uk Kim PACKET encoded_pt; 2201e71b7053SJung-uk Kim unsigned int curve_type, curve_id; 2202e71b7053SJung-uk Kim 2203e71b7053SJung-uk Kim /* 2204e71b7053SJung-uk Kim * Extract elliptic curve parameters and the server's ephemeral ECDH 2205e71b7053SJung-uk Kim * public key. We only support named (not generic) curves and 2206e71b7053SJung-uk Kim * ECParameters in this case is just three bytes. 2207e71b7053SJung-uk Kim */ 2208e71b7053SJung-uk Kim if (!PACKET_get_1(pkt, &curve_type) || !PACKET_get_net_2(pkt, &curve_id)) { 2209e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_DECODE_ERROR, SSL_F_TLS_PROCESS_SKE_ECDHE, 2210e71b7053SJung-uk Kim SSL_R_LENGTH_TOO_SHORT); 2211e71b7053SJung-uk Kim return 0; 2212e71b7053SJung-uk Kim } 2213e71b7053SJung-uk Kim /* 2214e71b7053SJung-uk Kim * Check curve is named curve type and one of our preferences, if not 2215e71b7053SJung-uk Kim * server has sent an invalid curve. 2216e71b7053SJung-uk Kim */ 2217e71b7053SJung-uk Kim if (curve_type != NAMED_CURVE_TYPE 2218e71b7053SJung-uk Kim || !tls1_check_group_id(s, curve_id, 1)) { 2219e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_ILLEGAL_PARAMETER, SSL_F_TLS_PROCESS_SKE_ECDHE, 2220e71b7053SJung-uk Kim SSL_R_WRONG_CURVE); 2221e71b7053SJung-uk Kim return 0; 2222e71b7053SJung-uk Kim } 2223e71b7053SJung-uk Kim 2224e71b7053SJung-uk Kim if ((s->s3->peer_tmp = ssl_generate_param_group(curve_id)) == NULL) { 2225e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_TLS_PROCESS_SKE_ECDHE, 2226e71b7053SJung-uk Kim SSL_R_UNABLE_TO_FIND_ECDH_PARAMETERS); 2227e71b7053SJung-uk Kim return 0; 2228e71b7053SJung-uk Kim } 2229e71b7053SJung-uk Kim 2230e71b7053SJung-uk Kim if (!PACKET_get_length_prefixed_1(pkt, &encoded_pt)) { 2231e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_DECODE_ERROR, SSL_F_TLS_PROCESS_SKE_ECDHE, 2232e71b7053SJung-uk Kim SSL_R_LENGTH_MISMATCH); 2233e71b7053SJung-uk Kim return 0; 2234e71b7053SJung-uk Kim } 2235e71b7053SJung-uk Kim 2236e71b7053SJung-uk Kim if (!EVP_PKEY_set1_tls_encodedpoint(s->s3->peer_tmp, 2237e71b7053SJung-uk Kim PACKET_data(&encoded_pt), 2238e71b7053SJung-uk Kim PACKET_remaining(&encoded_pt))) { 2239e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_ILLEGAL_PARAMETER, SSL_F_TLS_PROCESS_SKE_ECDHE, 2240e71b7053SJung-uk Kim SSL_R_BAD_ECPOINT); 2241e71b7053SJung-uk Kim return 0; 2242e71b7053SJung-uk Kim } 2243e71b7053SJung-uk Kim 2244e71b7053SJung-uk Kim /* 2245e71b7053SJung-uk Kim * The ECC/TLS specification does not mention the use of DSA to sign 2246e71b7053SJung-uk Kim * ECParameters in the server key exchange message. We do support RSA 2247e71b7053SJung-uk Kim * and ECDSA. 2248e71b7053SJung-uk Kim */ 2249e71b7053SJung-uk Kim if (s->s3->tmp.new_cipher->algorithm_auth & SSL_aECDSA) 2250e71b7053SJung-uk Kim *pkey = X509_get0_pubkey(s->session->peer); 2251e71b7053SJung-uk Kim else if (s->s3->tmp.new_cipher->algorithm_auth & SSL_aRSA) 2252e71b7053SJung-uk Kim *pkey = X509_get0_pubkey(s->session->peer); 2253e71b7053SJung-uk Kim /* else anonymous ECDH, so no certificate or pkey. */ 2254e71b7053SJung-uk Kim 2255e71b7053SJung-uk Kim return 1; 2256e71b7053SJung-uk Kim #else 2257e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_TLS_PROCESS_SKE_ECDHE, 2258e71b7053SJung-uk Kim ERR_R_INTERNAL_ERROR); 2259e71b7053SJung-uk Kim return 0; 2260e71b7053SJung-uk Kim #endif 2261e71b7053SJung-uk Kim } 2262e71b7053SJung-uk Kim 2263e71b7053SJung-uk Kim MSG_PROCESS_RETURN tls_process_key_exchange(SSL *s, PACKET *pkt) 2264e71b7053SJung-uk Kim { 2265e71b7053SJung-uk Kim long alg_k; 2266e71b7053SJung-uk Kim EVP_PKEY *pkey = NULL; 2267e71b7053SJung-uk Kim EVP_MD_CTX *md_ctx = NULL; 2268e71b7053SJung-uk Kim EVP_PKEY_CTX *pctx = NULL; 2269e71b7053SJung-uk Kim PACKET save_param_start, signature; 2270e71b7053SJung-uk Kim 2271e71b7053SJung-uk Kim alg_k = s->s3->tmp.new_cipher->algorithm_mkey; 2272e71b7053SJung-uk Kim 2273e71b7053SJung-uk Kim save_param_start = *pkt; 2274e71b7053SJung-uk Kim 2275e71b7053SJung-uk Kim #if !defined(OPENSSL_NO_EC) || !defined(OPENSSL_NO_DH) 2276e71b7053SJung-uk Kim EVP_PKEY_free(s->s3->peer_tmp); 2277e71b7053SJung-uk Kim s->s3->peer_tmp = NULL; 2278e71b7053SJung-uk Kim #endif 2279e71b7053SJung-uk Kim 2280e71b7053SJung-uk Kim if (alg_k & SSL_PSK) { 2281e71b7053SJung-uk Kim if (!tls_process_ske_psk_preamble(s, pkt)) { 2282e71b7053SJung-uk Kim /* SSLfatal() already called */ 2283e71b7053SJung-uk Kim goto err; 2284e71b7053SJung-uk Kim } 2285e71b7053SJung-uk Kim } 2286e71b7053SJung-uk Kim 2287e71b7053SJung-uk Kim /* Nothing else to do for plain PSK or RSAPSK */ 2288e71b7053SJung-uk Kim if (alg_k & (SSL_kPSK | SSL_kRSAPSK)) { 2289e71b7053SJung-uk Kim } else if (alg_k & SSL_kSRP) { 2290e71b7053SJung-uk Kim if (!tls_process_ske_srp(s, pkt, &pkey)) { 2291e71b7053SJung-uk Kim /* SSLfatal() already called */ 2292e71b7053SJung-uk Kim goto err; 2293e71b7053SJung-uk Kim } 2294e71b7053SJung-uk Kim } else if (alg_k & (SSL_kDHE | SSL_kDHEPSK)) { 2295e71b7053SJung-uk Kim if (!tls_process_ske_dhe(s, pkt, &pkey)) { 2296e71b7053SJung-uk Kim /* SSLfatal() already called */ 2297e71b7053SJung-uk Kim goto err; 2298e71b7053SJung-uk Kim } 2299e71b7053SJung-uk Kim } else if (alg_k & (SSL_kECDHE | SSL_kECDHEPSK)) { 2300e71b7053SJung-uk Kim if (!tls_process_ske_ecdhe(s, pkt, &pkey)) { 2301e71b7053SJung-uk Kim /* SSLfatal() already called */ 2302e71b7053SJung-uk Kim goto err; 2303e71b7053SJung-uk Kim } 2304e71b7053SJung-uk Kim } else if (alg_k) { 2305e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_UNEXPECTED_MESSAGE, SSL_F_TLS_PROCESS_KEY_EXCHANGE, 2306e71b7053SJung-uk Kim SSL_R_UNEXPECTED_MESSAGE); 2307e71b7053SJung-uk Kim goto err; 2308e71b7053SJung-uk Kim } 2309e71b7053SJung-uk Kim 2310e71b7053SJung-uk Kim /* if it was signed, check the signature */ 2311e71b7053SJung-uk Kim if (pkey != NULL) { 2312e71b7053SJung-uk Kim PACKET params; 2313e71b7053SJung-uk Kim int maxsig; 2314e71b7053SJung-uk Kim const EVP_MD *md = NULL; 2315e71b7053SJung-uk Kim unsigned char *tbs; 2316e71b7053SJung-uk Kim size_t tbslen; 2317e71b7053SJung-uk Kim int rv; 2318e71b7053SJung-uk Kim 2319e71b7053SJung-uk Kim /* 2320e71b7053SJung-uk Kim * |pkt| now points to the beginning of the signature, so the difference 2321e71b7053SJung-uk Kim * equals the length of the parameters. 2322e71b7053SJung-uk Kim */ 2323e71b7053SJung-uk Kim if (!PACKET_get_sub_packet(&save_param_start, ¶ms, 2324e71b7053SJung-uk Kim PACKET_remaining(&save_param_start) - 2325e71b7053SJung-uk Kim PACKET_remaining(pkt))) { 2326e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_DECODE_ERROR, SSL_F_TLS_PROCESS_KEY_EXCHANGE, 2327e71b7053SJung-uk Kim ERR_R_INTERNAL_ERROR); 2328e71b7053SJung-uk Kim goto err; 2329e71b7053SJung-uk Kim } 2330e71b7053SJung-uk Kim 2331e71b7053SJung-uk Kim if (SSL_USE_SIGALGS(s)) { 2332e71b7053SJung-uk Kim unsigned int sigalg; 2333e71b7053SJung-uk Kim 2334e71b7053SJung-uk Kim if (!PACKET_get_net_2(pkt, &sigalg)) { 2335e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_DECODE_ERROR, SSL_F_TLS_PROCESS_KEY_EXCHANGE, 2336e71b7053SJung-uk Kim SSL_R_LENGTH_TOO_SHORT); 2337e71b7053SJung-uk Kim goto err; 2338e71b7053SJung-uk Kim } 2339e71b7053SJung-uk Kim if (tls12_check_peer_sigalg(s, sigalg, pkey) <=0) { 2340e71b7053SJung-uk Kim /* SSLfatal() already called */ 2341e71b7053SJung-uk Kim goto err; 2342e71b7053SJung-uk Kim } 2343e71b7053SJung-uk Kim } else if (!tls1_set_peer_legacy_sigalg(s, pkey)) { 2344e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_TLS_PROCESS_KEY_EXCHANGE, 2345e71b7053SJung-uk Kim ERR_R_INTERNAL_ERROR); 2346e71b7053SJung-uk Kim goto err; 2347e71b7053SJung-uk Kim } 2348e71b7053SJung-uk Kim 2349e71b7053SJung-uk Kim if (!tls1_lookup_md(s->s3->tmp.peer_sigalg, &md)) { 2350e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_TLS_PROCESS_KEY_EXCHANGE, 2351e71b7053SJung-uk Kim ERR_R_INTERNAL_ERROR); 2352e71b7053SJung-uk Kim goto err; 2353e71b7053SJung-uk Kim } 2354e71b7053SJung-uk Kim #ifdef SSL_DEBUG 2355e71b7053SJung-uk Kim if (SSL_USE_SIGALGS(s)) 2356e71b7053SJung-uk Kim fprintf(stderr, "USING TLSv1.2 HASH %s\n", EVP_MD_name(md)); 2357e71b7053SJung-uk Kim #endif 2358e71b7053SJung-uk Kim 2359e71b7053SJung-uk Kim if (!PACKET_get_length_prefixed_2(pkt, &signature) 2360e71b7053SJung-uk Kim || PACKET_remaining(pkt) != 0) { 2361e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_DECODE_ERROR, SSL_F_TLS_PROCESS_KEY_EXCHANGE, 2362e71b7053SJung-uk Kim SSL_R_LENGTH_MISMATCH); 2363e71b7053SJung-uk Kim goto err; 2364e71b7053SJung-uk Kim } 2365e71b7053SJung-uk Kim maxsig = EVP_PKEY_size(pkey); 2366e71b7053SJung-uk Kim if (maxsig < 0) { 2367e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_TLS_PROCESS_KEY_EXCHANGE, 2368e71b7053SJung-uk Kim ERR_R_INTERNAL_ERROR); 2369e71b7053SJung-uk Kim goto err; 2370e71b7053SJung-uk Kim } 2371e71b7053SJung-uk Kim 2372e71b7053SJung-uk Kim /* 2373e71b7053SJung-uk Kim * Check signature length 2374e71b7053SJung-uk Kim */ 2375e71b7053SJung-uk Kim if (PACKET_remaining(&signature) > (size_t)maxsig) { 2376e71b7053SJung-uk Kim /* wrong packet length */ 2377e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_DECODE_ERROR, SSL_F_TLS_PROCESS_KEY_EXCHANGE, 2378e71b7053SJung-uk Kim SSL_R_WRONG_SIGNATURE_LENGTH); 2379e71b7053SJung-uk Kim goto err; 2380e71b7053SJung-uk Kim } 2381e71b7053SJung-uk Kim 2382e71b7053SJung-uk Kim md_ctx = EVP_MD_CTX_new(); 2383e71b7053SJung-uk Kim if (md_ctx == NULL) { 2384e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_TLS_PROCESS_KEY_EXCHANGE, 2385e71b7053SJung-uk Kim ERR_R_MALLOC_FAILURE); 2386e71b7053SJung-uk Kim goto err; 2387e71b7053SJung-uk Kim } 2388e71b7053SJung-uk Kim 2389e71b7053SJung-uk Kim if (EVP_DigestVerifyInit(md_ctx, &pctx, md, NULL, pkey) <= 0) { 2390e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_TLS_PROCESS_KEY_EXCHANGE, 2391e71b7053SJung-uk Kim ERR_R_EVP_LIB); 2392e71b7053SJung-uk Kim goto err; 2393e71b7053SJung-uk Kim } 2394e71b7053SJung-uk Kim if (SSL_USE_PSS(s)) { 2395e71b7053SJung-uk Kim if (EVP_PKEY_CTX_set_rsa_padding(pctx, RSA_PKCS1_PSS_PADDING) <= 0 2396e71b7053SJung-uk Kim || EVP_PKEY_CTX_set_rsa_pss_saltlen(pctx, 2397e71b7053SJung-uk Kim RSA_PSS_SALTLEN_DIGEST) <= 0) { 2398e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_INTERNAL_ERROR, 2399e71b7053SJung-uk Kim SSL_F_TLS_PROCESS_KEY_EXCHANGE, ERR_R_EVP_LIB); 2400e71b7053SJung-uk Kim goto err; 2401e71b7053SJung-uk Kim } 2402e71b7053SJung-uk Kim } 2403e71b7053SJung-uk Kim tbslen = construct_key_exchange_tbs(s, &tbs, PACKET_data(¶ms), 2404e71b7053SJung-uk Kim PACKET_remaining(¶ms)); 2405e71b7053SJung-uk Kim if (tbslen == 0) { 2406e71b7053SJung-uk Kim /* SSLfatal() already called */ 2407e71b7053SJung-uk Kim goto err; 2408e71b7053SJung-uk Kim } 2409e71b7053SJung-uk Kim 2410e71b7053SJung-uk Kim rv = EVP_DigestVerify(md_ctx, PACKET_data(&signature), 2411e71b7053SJung-uk Kim PACKET_remaining(&signature), tbs, tbslen); 2412e71b7053SJung-uk Kim OPENSSL_free(tbs); 2413e71b7053SJung-uk Kim if (rv <= 0) { 2414e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_DECRYPT_ERROR, SSL_F_TLS_PROCESS_KEY_EXCHANGE, 2415e71b7053SJung-uk Kim SSL_R_BAD_SIGNATURE); 2416e71b7053SJung-uk Kim goto err; 2417e71b7053SJung-uk Kim } 2418e71b7053SJung-uk Kim EVP_MD_CTX_free(md_ctx); 2419e71b7053SJung-uk Kim md_ctx = NULL; 2420e71b7053SJung-uk Kim } else { 2421e71b7053SJung-uk Kim /* aNULL, aSRP or PSK do not need public keys */ 2422e71b7053SJung-uk Kim if (!(s->s3->tmp.new_cipher->algorithm_auth & (SSL_aNULL | SSL_aSRP)) 2423e71b7053SJung-uk Kim && !(alg_k & SSL_PSK)) { 2424e71b7053SJung-uk Kim /* Might be wrong key type, check it */ 2425e71b7053SJung-uk Kim if (ssl3_check_cert_and_algorithm(s)) { 2426e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_DECODE_ERROR, SSL_F_TLS_PROCESS_KEY_EXCHANGE, 2427e71b7053SJung-uk Kim SSL_R_BAD_DATA); 2428e71b7053SJung-uk Kim } 2429e71b7053SJung-uk Kim /* else this shouldn't happen, SSLfatal() already called */ 2430e71b7053SJung-uk Kim goto err; 2431e71b7053SJung-uk Kim } 2432e71b7053SJung-uk Kim /* still data left over */ 2433e71b7053SJung-uk Kim if (PACKET_remaining(pkt) != 0) { 2434e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_DECODE_ERROR, SSL_F_TLS_PROCESS_KEY_EXCHANGE, 2435e71b7053SJung-uk Kim SSL_R_EXTRA_DATA_IN_MESSAGE); 2436e71b7053SJung-uk Kim goto err; 2437e71b7053SJung-uk Kim } 2438e71b7053SJung-uk Kim } 2439e71b7053SJung-uk Kim 2440e71b7053SJung-uk Kim return MSG_PROCESS_CONTINUE_READING; 2441e71b7053SJung-uk Kim err: 2442e71b7053SJung-uk Kim EVP_MD_CTX_free(md_ctx); 2443e71b7053SJung-uk Kim return MSG_PROCESS_ERROR; 2444e71b7053SJung-uk Kim } 2445e71b7053SJung-uk Kim 2446e71b7053SJung-uk Kim MSG_PROCESS_RETURN tls_process_certificate_request(SSL *s, PACKET *pkt) 2447e71b7053SJung-uk Kim { 2448e71b7053SJung-uk Kim size_t i; 2449e71b7053SJung-uk Kim 2450e71b7053SJung-uk Kim /* Clear certificate validity flags */ 2451e71b7053SJung-uk Kim for (i = 0; i < SSL_PKEY_NUM; i++) 2452e71b7053SJung-uk Kim s->s3->tmp.valid_flags[i] = 0; 2453e71b7053SJung-uk Kim 2454e71b7053SJung-uk Kim if (SSL_IS_TLS13(s)) { 2455e71b7053SJung-uk Kim PACKET reqctx, extensions; 2456e71b7053SJung-uk Kim RAW_EXTENSION *rawexts = NULL; 2457e71b7053SJung-uk Kim 2458e71b7053SJung-uk Kim if ((s->shutdown & SSL_SENT_SHUTDOWN) != 0) { 2459e71b7053SJung-uk Kim /* 2460e71b7053SJung-uk Kim * We already sent close_notify. This can only happen in TLSv1.3 2461e71b7053SJung-uk Kim * post-handshake messages. We can't reasonably respond to this, so 2462e71b7053SJung-uk Kim * we just ignore it 2463e71b7053SJung-uk Kim */ 2464e71b7053SJung-uk Kim return MSG_PROCESS_FINISHED_READING; 2465e71b7053SJung-uk Kim } 2466e71b7053SJung-uk Kim 2467e71b7053SJung-uk Kim /* Free and zero certificate types: it is not present in TLS 1.3 */ 2468e71b7053SJung-uk Kim OPENSSL_free(s->s3->tmp.ctype); 2469e71b7053SJung-uk Kim s->s3->tmp.ctype = NULL; 2470e71b7053SJung-uk Kim s->s3->tmp.ctype_len = 0; 2471e71b7053SJung-uk Kim OPENSSL_free(s->pha_context); 2472e71b7053SJung-uk Kim s->pha_context = NULL; 2473e71b7053SJung-uk Kim 2474e71b7053SJung-uk Kim if (!PACKET_get_length_prefixed_1(pkt, &reqctx) || 2475e71b7053SJung-uk Kim !PACKET_memdup(&reqctx, &s->pha_context, &s->pha_context_len)) { 2476e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_DECODE_ERROR, 2477e71b7053SJung-uk Kim SSL_F_TLS_PROCESS_CERTIFICATE_REQUEST, 2478e71b7053SJung-uk Kim SSL_R_LENGTH_MISMATCH); 2479e71b7053SJung-uk Kim return MSG_PROCESS_ERROR; 2480e71b7053SJung-uk Kim } 2481e71b7053SJung-uk Kim 2482e71b7053SJung-uk Kim if (!PACKET_get_length_prefixed_2(pkt, &extensions)) { 2483e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_DECODE_ERROR, 2484e71b7053SJung-uk Kim SSL_F_TLS_PROCESS_CERTIFICATE_REQUEST, 2485e71b7053SJung-uk Kim SSL_R_BAD_LENGTH); 2486e71b7053SJung-uk Kim return MSG_PROCESS_ERROR; 2487e71b7053SJung-uk Kim } 2488e71b7053SJung-uk Kim if (!tls_collect_extensions(s, &extensions, 2489e71b7053SJung-uk Kim SSL_EXT_TLS1_3_CERTIFICATE_REQUEST, 2490e71b7053SJung-uk Kim &rawexts, NULL, 1) 2491e71b7053SJung-uk Kim || !tls_parse_all_extensions(s, SSL_EXT_TLS1_3_CERTIFICATE_REQUEST, 2492e71b7053SJung-uk Kim rawexts, NULL, 0, 1)) { 2493e71b7053SJung-uk Kim /* SSLfatal() already called */ 2494e71b7053SJung-uk Kim OPENSSL_free(rawexts); 2495e71b7053SJung-uk Kim return MSG_PROCESS_ERROR; 2496e71b7053SJung-uk Kim } 2497e71b7053SJung-uk Kim OPENSSL_free(rawexts); 2498e71b7053SJung-uk Kim if (!tls1_process_sigalgs(s)) { 2499e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_INTERNAL_ERROR, 2500e71b7053SJung-uk Kim SSL_F_TLS_PROCESS_CERTIFICATE_REQUEST, 2501e71b7053SJung-uk Kim SSL_R_BAD_LENGTH); 2502e71b7053SJung-uk Kim return MSG_PROCESS_ERROR; 2503e71b7053SJung-uk Kim } 2504e71b7053SJung-uk Kim } else { 2505e71b7053SJung-uk Kim PACKET ctypes; 2506e71b7053SJung-uk Kim 2507e71b7053SJung-uk Kim /* get the certificate types */ 2508e71b7053SJung-uk Kim if (!PACKET_get_length_prefixed_1(pkt, &ctypes)) { 2509e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_DECODE_ERROR, 2510e71b7053SJung-uk Kim SSL_F_TLS_PROCESS_CERTIFICATE_REQUEST, 2511e71b7053SJung-uk Kim SSL_R_LENGTH_MISMATCH); 2512e71b7053SJung-uk Kim return MSG_PROCESS_ERROR; 2513e71b7053SJung-uk Kim } 2514e71b7053SJung-uk Kim 2515e71b7053SJung-uk Kim if (!PACKET_memdup(&ctypes, &s->s3->tmp.ctype, &s->s3->tmp.ctype_len)) { 2516e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_INTERNAL_ERROR, 2517e71b7053SJung-uk Kim SSL_F_TLS_PROCESS_CERTIFICATE_REQUEST, 2518e71b7053SJung-uk Kim ERR_R_INTERNAL_ERROR); 2519e71b7053SJung-uk Kim return MSG_PROCESS_ERROR; 2520e71b7053SJung-uk Kim } 2521e71b7053SJung-uk Kim 2522e71b7053SJung-uk Kim if (SSL_USE_SIGALGS(s)) { 2523e71b7053SJung-uk Kim PACKET sigalgs; 2524e71b7053SJung-uk Kim 2525e71b7053SJung-uk Kim if (!PACKET_get_length_prefixed_2(pkt, &sigalgs)) { 2526e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_DECODE_ERROR, 2527e71b7053SJung-uk Kim SSL_F_TLS_PROCESS_CERTIFICATE_REQUEST, 2528e71b7053SJung-uk Kim SSL_R_LENGTH_MISMATCH); 2529e71b7053SJung-uk Kim return MSG_PROCESS_ERROR; 2530e71b7053SJung-uk Kim } 2531e71b7053SJung-uk Kim 2532e71b7053SJung-uk Kim /* 2533e71b7053SJung-uk Kim * Despite this being for certificates, preserve compatibility 2534e71b7053SJung-uk Kim * with pre-TLS 1.3 and use the regular sigalgs field. 2535e71b7053SJung-uk Kim */ 2536e71b7053SJung-uk Kim if (!tls1_save_sigalgs(s, &sigalgs, 0)) { 2537e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_INTERNAL_ERROR, 2538e71b7053SJung-uk Kim SSL_F_TLS_PROCESS_CERTIFICATE_REQUEST, 2539e71b7053SJung-uk Kim SSL_R_SIGNATURE_ALGORITHMS_ERROR); 2540e71b7053SJung-uk Kim return MSG_PROCESS_ERROR; 2541e71b7053SJung-uk Kim } 2542e71b7053SJung-uk Kim if (!tls1_process_sigalgs(s)) { 2543e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_INTERNAL_ERROR, 2544e71b7053SJung-uk Kim SSL_F_TLS_PROCESS_CERTIFICATE_REQUEST, 2545e71b7053SJung-uk Kim ERR_R_MALLOC_FAILURE); 2546e71b7053SJung-uk Kim return MSG_PROCESS_ERROR; 2547e71b7053SJung-uk Kim } 2548e71b7053SJung-uk Kim } 2549e71b7053SJung-uk Kim 2550e71b7053SJung-uk Kim /* get the CA RDNs */ 2551e71b7053SJung-uk Kim if (!parse_ca_names(s, pkt)) { 2552e71b7053SJung-uk Kim /* SSLfatal() already called */ 2553e71b7053SJung-uk Kim return MSG_PROCESS_ERROR; 2554e71b7053SJung-uk Kim } 2555e71b7053SJung-uk Kim } 2556e71b7053SJung-uk Kim 2557e71b7053SJung-uk Kim if (PACKET_remaining(pkt) != 0) { 2558e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_DECODE_ERROR, 2559e71b7053SJung-uk Kim SSL_F_TLS_PROCESS_CERTIFICATE_REQUEST, 2560e71b7053SJung-uk Kim SSL_R_LENGTH_MISMATCH); 2561e71b7053SJung-uk Kim return MSG_PROCESS_ERROR; 2562e71b7053SJung-uk Kim } 2563e71b7053SJung-uk Kim 2564e71b7053SJung-uk Kim /* we should setup a certificate to return.... */ 2565e71b7053SJung-uk Kim s->s3->tmp.cert_req = 1; 2566e71b7053SJung-uk Kim 2567*c9cf7b5cSJung-uk Kim /* 2568*c9cf7b5cSJung-uk Kim * In TLSv1.3 we don't prepare the client certificate yet. We wait until 2569*c9cf7b5cSJung-uk Kim * after the CertificateVerify message has been received. This is because 2570*c9cf7b5cSJung-uk Kim * in TLSv1.3 the CertificateRequest arrives before the Certificate message 2571*c9cf7b5cSJung-uk Kim * but in TLSv1.2 it is the other way around. We want to make sure that 2572*c9cf7b5cSJung-uk Kim * SSL_get_peer_certificate() returns something sensible in 2573*c9cf7b5cSJung-uk Kim * client_cert_cb. 2574*c9cf7b5cSJung-uk Kim */ 2575*c9cf7b5cSJung-uk Kim if (SSL_IS_TLS13(s) && s->post_handshake_auth != SSL_PHA_REQUESTED) 2576*c9cf7b5cSJung-uk Kim return MSG_PROCESS_CONTINUE_READING; 2577*c9cf7b5cSJung-uk Kim 2578e71b7053SJung-uk Kim return MSG_PROCESS_CONTINUE_PROCESSING; 2579e71b7053SJung-uk Kim } 2580e71b7053SJung-uk Kim 2581e71b7053SJung-uk Kim MSG_PROCESS_RETURN tls_process_new_session_ticket(SSL *s, PACKET *pkt) 2582e71b7053SJung-uk Kim { 2583e71b7053SJung-uk Kim unsigned int ticklen; 2584e71b7053SJung-uk Kim unsigned long ticket_lifetime_hint, age_add = 0; 2585e71b7053SJung-uk Kim unsigned int sess_len; 2586e71b7053SJung-uk Kim RAW_EXTENSION *exts = NULL; 2587e71b7053SJung-uk Kim PACKET nonce; 2588e71b7053SJung-uk Kim 2589e71b7053SJung-uk Kim PACKET_null_init(&nonce); 2590e71b7053SJung-uk Kim 2591e71b7053SJung-uk Kim if (!PACKET_get_net_4(pkt, &ticket_lifetime_hint) 2592e71b7053SJung-uk Kim || (SSL_IS_TLS13(s) 2593e71b7053SJung-uk Kim && (!PACKET_get_net_4(pkt, &age_add) 2594e71b7053SJung-uk Kim || !PACKET_get_length_prefixed_1(pkt, &nonce))) 2595e71b7053SJung-uk Kim || !PACKET_get_net_2(pkt, &ticklen) 2596e71b7053SJung-uk Kim || (SSL_IS_TLS13(s) ? (ticklen == 0 || PACKET_remaining(pkt) < ticklen) 2597e71b7053SJung-uk Kim : PACKET_remaining(pkt) != ticklen)) { 2598e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_DECODE_ERROR, SSL_F_TLS_PROCESS_NEW_SESSION_TICKET, 2599e71b7053SJung-uk Kim SSL_R_LENGTH_MISMATCH); 2600e71b7053SJung-uk Kim goto err; 2601e71b7053SJung-uk Kim } 2602e71b7053SJung-uk Kim 2603e71b7053SJung-uk Kim /* 2604e71b7053SJung-uk Kim * Server is allowed to change its mind (in <=TLSv1.2) and send an empty 2605e71b7053SJung-uk Kim * ticket. We already checked this TLSv1.3 case above, so it should never 2606e71b7053SJung-uk Kim * be 0 here in that instance 2607e71b7053SJung-uk Kim */ 2608e71b7053SJung-uk Kim if (ticklen == 0) 2609e71b7053SJung-uk Kim return MSG_PROCESS_CONTINUE_READING; 2610e71b7053SJung-uk Kim 2611e71b7053SJung-uk Kim /* 2612e71b7053SJung-uk Kim * Sessions must be immutable once they go into the session cache. Otherwise 2613e71b7053SJung-uk Kim * we can get multi-thread problems. Therefore we don't "update" sessions, 2614e71b7053SJung-uk Kim * we replace them with a duplicate. In TLSv1.3 we need to do this every 2615e71b7053SJung-uk Kim * time a NewSessionTicket arrives because those messages arrive 2616e71b7053SJung-uk Kim * post-handshake and the session may have already gone into the session 2617e71b7053SJung-uk Kim * cache. 2618e71b7053SJung-uk Kim */ 2619e71b7053SJung-uk Kim if (SSL_IS_TLS13(s) || s->session->session_id_length > 0) { 2620e71b7053SJung-uk Kim SSL_SESSION *new_sess; 2621e71b7053SJung-uk Kim 2622e71b7053SJung-uk Kim /* 2623e71b7053SJung-uk Kim * We reused an existing session, so we need to replace it with a new 2624e71b7053SJung-uk Kim * one 2625e71b7053SJung-uk Kim */ 2626e71b7053SJung-uk Kim if ((new_sess = ssl_session_dup(s->session, 0)) == 0) { 2627e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_INTERNAL_ERROR, 2628e71b7053SJung-uk Kim SSL_F_TLS_PROCESS_NEW_SESSION_TICKET, 2629e71b7053SJung-uk Kim ERR_R_MALLOC_FAILURE); 2630e71b7053SJung-uk Kim goto err; 2631e71b7053SJung-uk Kim } 2632e71b7053SJung-uk Kim 2633e71b7053SJung-uk Kim if ((s->session_ctx->session_cache_mode & SSL_SESS_CACHE_CLIENT) != 0 2634e71b7053SJung-uk Kim && !SSL_IS_TLS13(s)) { 2635e71b7053SJung-uk Kim /* 2636e71b7053SJung-uk Kim * In TLSv1.2 and below the arrival of a new tickets signals that 2637e71b7053SJung-uk Kim * any old ticket we were using is now out of date, so we remove the 2638e71b7053SJung-uk Kim * old session from the cache. We carry on if this fails 2639e71b7053SJung-uk Kim */ 2640e71b7053SJung-uk Kim SSL_CTX_remove_session(s->session_ctx, s->session); 2641e71b7053SJung-uk Kim } 2642e71b7053SJung-uk Kim 2643e71b7053SJung-uk Kim SSL_SESSION_free(s->session); 2644e71b7053SJung-uk Kim s->session = new_sess; 2645e71b7053SJung-uk Kim } 2646e71b7053SJung-uk Kim 2647e71b7053SJung-uk Kim /* 2648e71b7053SJung-uk Kim * Technically the cast to long here is not guaranteed by the C standard - 2649e71b7053SJung-uk Kim * but we use it elsewhere, so this should be ok. 2650e71b7053SJung-uk Kim */ 2651e71b7053SJung-uk Kim s->session->time = (long)time(NULL); 2652e71b7053SJung-uk Kim 2653e71b7053SJung-uk Kim OPENSSL_free(s->session->ext.tick); 2654e71b7053SJung-uk Kim s->session->ext.tick = NULL; 2655e71b7053SJung-uk Kim s->session->ext.ticklen = 0; 2656e71b7053SJung-uk Kim 2657e71b7053SJung-uk Kim s->session->ext.tick = OPENSSL_malloc(ticklen); 2658e71b7053SJung-uk Kim if (s->session->ext.tick == NULL) { 2659e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_TLS_PROCESS_NEW_SESSION_TICKET, 2660e71b7053SJung-uk Kim ERR_R_MALLOC_FAILURE); 2661e71b7053SJung-uk Kim goto err; 2662e71b7053SJung-uk Kim } 2663e71b7053SJung-uk Kim if (!PACKET_copy_bytes(pkt, s->session->ext.tick, ticklen)) { 2664e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_DECODE_ERROR, SSL_F_TLS_PROCESS_NEW_SESSION_TICKET, 2665e71b7053SJung-uk Kim SSL_R_LENGTH_MISMATCH); 2666e71b7053SJung-uk Kim goto err; 2667e71b7053SJung-uk Kim } 2668e71b7053SJung-uk Kim 2669e71b7053SJung-uk Kim s->session->ext.tick_lifetime_hint = ticket_lifetime_hint; 2670e71b7053SJung-uk Kim s->session->ext.tick_age_add = age_add; 2671e71b7053SJung-uk Kim s->session->ext.ticklen = ticklen; 2672e71b7053SJung-uk Kim 2673e71b7053SJung-uk Kim if (SSL_IS_TLS13(s)) { 2674e71b7053SJung-uk Kim PACKET extpkt; 2675e71b7053SJung-uk Kim 2676e71b7053SJung-uk Kim if (!PACKET_as_length_prefixed_2(pkt, &extpkt) 2677e71b7053SJung-uk Kim || PACKET_remaining(pkt) != 0) { 2678e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_DECODE_ERROR, 2679e71b7053SJung-uk Kim SSL_F_TLS_PROCESS_NEW_SESSION_TICKET, 2680e71b7053SJung-uk Kim SSL_R_LENGTH_MISMATCH); 2681e71b7053SJung-uk Kim goto err; 2682e71b7053SJung-uk Kim } 2683e71b7053SJung-uk Kim 2684e71b7053SJung-uk Kim if (!tls_collect_extensions(s, &extpkt, 2685e71b7053SJung-uk Kim SSL_EXT_TLS1_3_NEW_SESSION_TICKET, &exts, 2686e71b7053SJung-uk Kim NULL, 1) 2687e71b7053SJung-uk Kim || !tls_parse_all_extensions(s, 2688e71b7053SJung-uk Kim SSL_EXT_TLS1_3_NEW_SESSION_TICKET, 2689e71b7053SJung-uk Kim exts, NULL, 0, 1)) { 2690e71b7053SJung-uk Kim /* SSLfatal() already called */ 2691e71b7053SJung-uk Kim goto err; 2692e71b7053SJung-uk Kim } 2693e71b7053SJung-uk Kim } 2694e71b7053SJung-uk Kim 2695e71b7053SJung-uk Kim /* 2696e71b7053SJung-uk Kim * There are two ways to detect a resumed ticket session. One is to set 2697e71b7053SJung-uk Kim * an appropriate session ID and then the server must return a match in 2698e71b7053SJung-uk Kim * ServerHello. This allows the normal client session ID matching to work 2699e71b7053SJung-uk Kim * and we know much earlier that the ticket has been accepted. The 2700e71b7053SJung-uk Kim * other way is to set zero length session ID when the ticket is 2701e71b7053SJung-uk Kim * presented and rely on the handshake to determine session resumption. 2702e71b7053SJung-uk Kim * We choose the former approach because this fits in with assumptions 2703e71b7053SJung-uk Kim * elsewhere in OpenSSL. The session ID is set to the SHA256 (or SHA1 is 2704e71b7053SJung-uk Kim * SHA256 is disabled) hash of the ticket. 2705e71b7053SJung-uk Kim */ 2706e71b7053SJung-uk Kim /* 2707e71b7053SJung-uk Kim * TODO(size_t): we use sess_len here because EVP_Digest expects an int 2708e71b7053SJung-uk Kim * but s->session->session_id_length is a size_t 2709e71b7053SJung-uk Kim */ 2710e71b7053SJung-uk Kim if (!EVP_Digest(s->session->ext.tick, ticklen, 2711e71b7053SJung-uk Kim s->session->session_id, &sess_len, 2712e71b7053SJung-uk Kim EVP_sha256(), NULL)) { 2713e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_TLS_PROCESS_NEW_SESSION_TICKET, 2714e71b7053SJung-uk Kim ERR_R_EVP_LIB); 2715e71b7053SJung-uk Kim goto err; 2716e71b7053SJung-uk Kim } 2717e71b7053SJung-uk Kim s->session->session_id_length = sess_len; 2718e71b7053SJung-uk Kim s->session->not_resumable = 0; 2719e71b7053SJung-uk Kim 2720e71b7053SJung-uk Kim /* This is a standalone message in TLSv1.3, so there is no more to read */ 2721e71b7053SJung-uk Kim if (SSL_IS_TLS13(s)) { 2722e71b7053SJung-uk Kim const EVP_MD *md = ssl_handshake_md(s); 2723e71b7053SJung-uk Kim int hashleni = EVP_MD_size(md); 2724e71b7053SJung-uk Kim size_t hashlen; 2725e71b7053SJung-uk Kim static const unsigned char nonce_label[] = "resumption"; 2726e71b7053SJung-uk Kim 2727e71b7053SJung-uk Kim /* Ensure cast to size_t is safe */ 2728e71b7053SJung-uk Kim if (!ossl_assert(hashleni >= 0)) { 2729e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_INTERNAL_ERROR, 2730e71b7053SJung-uk Kim SSL_F_TLS_PROCESS_NEW_SESSION_TICKET, 2731e71b7053SJung-uk Kim ERR_R_INTERNAL_ERROR); 2732e71b7053SJung-uk Kim goto err; 2733e71b7053SJung-uk Kim } 2734e71b7053SJung-uk Kim hashlen = (size_t)hashleni; 2735e71b7053SJung-uk Kim 2736e71b7053SJung-uk Kim if (!tls13_hkdf_expand(s, md, s->resumption_master_secret, 2737e71b7053SJung-uk Kim nonce_label, 2738e71b7053SJung-uk Kim sizeof(nonce_label) - 1, 2739e71b7053SJung-uk Kim PACKET_data(&nonce), 2740e71b7053SJung-uk Kim PACKET_remaining(&nonce), 2741e71b7053SJung-uk Kim s->session->master_key, 2742e71b7053SJung-uk Kim hashlen)) { 2743e71b7053SJung-uk Kim /* SSLfatal() already called */ 2744e71b7053SJung-uk Kim goto err; 2745e71b7053SJung-uk Kim } 2746e71b7053SJung-uk Kim s->session->master_key_length = hashlen; 2747e71b7053SJung-uk Kim 2748e71b7053SJung-uk Kim OPENSSL_free(exts); 2749e71b7053SJung-uk Kim ssl_update_cache(s, SSL_SESS_CACHE_CLIENT); 2750e71b7053SJung-uk Kim return MSG_PROCESS_FINISHED_READING; 2751e71b7053SJung-uk Kim } 2752e71b7053SJung-uk Kim 2753e71b7053SJung-uk Kim return MSG_PROCESS_CONTINUE_READING; 2754e71b7053SJung-uk Kim err: 2755e71b7053SJung-uk Kim OPENSSL_free(exts); 2756e71b7053SJung-uk Kim return MSG_PROCESS_ERROR; 2757e71b7053SJung-uk Kim } 2758e71b7053SJung-uk Kim 2759e71b7053SJung-uk Kim /* 2760e71b7053SJung-uk Kim * In TLSv1.3 this is called from the extensions code, otherwise it is used to 2761e71b7053SJung-uk Kim * parse a separate message. Returns 1 on success or 0 on failure 2762e71b7053SJung-uk Kim */ 2763e71b7053SJung-uk Kim int tls_process_cert_status_body(SSL *s, PACKET *pkt) 2764e71b7053SJung-uk Kim { 2765e71b7053SJung-uk Kim size_t resplen; 2766e71b7053SJung-uk Kim unsigned int type; 2767e71b7053SJung-uk Kim 2768e71b7053SJung-uk Kim if (!PACKET_get_1(pkt, &type) 2769e71b7053SJung-uk Kim || type != TLSEXT_STATUSTYPE_ocsp) { 2770e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_DECODE_ERROR, SSL_F_TLS_PROCESS_CERT_STATUS_BODY, 2771e71b7053SJung-uk Kim SSL_R_UNSUPPORTED_STATUS_TYPE); 2772e71b7053SJung-uk Kim return 0; 2773e71b7053SJung-uk Kim } 2774e71b7053SJung-uk Kim if (!PACKET_get_net_3_len(pkt, &resplen) 2775e71b7053SJung-uk Kim || PACKET_remaining(pkt) != resplen) { 2776e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_DECODE_ERROR, SSL_F_TLS_PROCESS_CERT_STATUS_BODY, 2777e71b7053SJung-uk Kim SSL_R_LENGTH_MISMATCH); 2778e71b7053SJung-uk Kim return 0; 2779e71b7053SJung-uk Kim } 2780e71b7053SJung-uk Kim s->ext.ocsp.resp = OPENSSL_malloc(resplen); 2781e71b7053SJung-uk Kim if (s->ext.ocsp.resp == NULL) { 2782e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_TLS_PROCESS_CERT_STATUS_BODY, 2783e71b7053SJung-uk Kim ERR_R_MALLOC_FAILURE); 2784e71b7053SJung-uk Kim return 0; 2785e71b7053SJung-uk Kim } 2786e71b7053SJung-uk Kim if (!PACKET_copy_bytes(pkt, s->ext.ocsp.resp, resplen)) { 2787e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_DECODE_ERROR, SSL_F_TLS_PROCESS_CERT_STATUS_BODY, 2788e71b7053SJung-uk Kim SSL_R_LENGTH_MISMATCH); 2789e71b7053SJung-uk Kim return 0; 2790e71b7053SJung-uk Kim } 2791e71b7053SJung-uk Kim s->ext.ocsp.resp_len = resplen; 2792e71b7053SJung-uk Kim 2793e71b7053SJung-uk Kim return 1; 2794e71b7053SJung-uk Kim } 2795e71b7053SJung-uk Kim 2796e71b7053SJung-uk Kim 2797e71b7053SJung-uk Kim MSG_PROCESS_RETURN tls_process_cert_status(SSL *s, PACKET *pkt) 2798e71b7053SJung-uk Kim { 2799e71b7053SJung-uk Kim if (!tls_process_cert_status_body(s, pkt)) { 2800e71b7053SJung-uk Kim /* SSLfatal() already called */ 2801e71b7053SJung-uk Kim return MSG_PROCESS_ERROR; 2802e71b7053SJung-uk Kim } 2803e71b7053SJung-uk Kim 2804e71b7053SJung-uk Kim return MSG_PROCESS_CONTINUE_READING; 2805e71b7053SJung-uk Kim } 2806e71b7053SJung-uk Kim 2807e71b7053SJung-uk Kim /* 2808e71b7053SJung-uk Kim * Perform miscellaneous checks and processing after we have received the 2809e71b7053SJung-uk Kim * server's initial flight. In TLS1.3 this is after the Server Finished message. 2810e71b7053SJung-uk Kim * In <=TLS1.2 this is after the ServerDone message. Returns 1 on success or 0 2811e71b7053SJung-uk Kim * on failure. 2812e71b7053SJung-uk Kim */ 2813e71b7053SJung-uk Kim int tls_process_initial_server_flight(SSL *s) 2814e71b7053SJung-uk Kim { 2815e71b7053SJung-uk Kim /* 2816e71b7053SJung-uk Kim * at this point we check that we have the required stuff from 2817e71b7053SJung-uk Kim * the server 2818e71b7053SJung-uk Kim */ 2819e71b7053SJung-uk Kim if (!ssl3_check_cert_and_algorithm(s)) { 2820e71b7053SJung-uk Kim /* SSLfatal() already called */ 2821e71b7053SJung-uk Kim return 0; 2822e71b7053SJung-uk Kim } 2823e71b7053SJung-uk Kim 2824e71b7053SJung-uk Kim /* 2825e71b7053SJung-uk Kim * Call the ocsp status callback if needed. The |ext.ocsp.resp| and 2826e71b7053SJung-uk Kim * |ext.ocsp.resp_len| values will be set if we actually received a status 2827e71b7053SJung-uk Kim * message, or NULL and -1 otherwise 2828e71b7053SJung-uk Kim */ 2829e71b7053SJung-uk Kim if (s->ext.status_type != TLSEXT_STATUSTYPE_nothing 2830e71b7053SJung-uk Kim && s->ctx->ext.status_cb != NULL) { 2831e71b7053SJung-uk Kim int ret = s->ctx->ext.status_cb(s, s->ctx->ext.status_arg); 2832e71b7053SJung-uk Kim 2833e71b7053SJung-uk Kim if (ret == 0) { 2834e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_BAD_CERTIFICATE_STATUS_RESPONSE, 2835e71b7053SJung-uk Kim SSL_F_TLS_PROCESS_INITIAL_SERVER_FLIGHT, 2836e71b7053SJung-uk Kim SSL_R_INVALID_STATUS_RESPONSE); 2837e71b7053SJung-uk Kim return 0; 2838e71b7053SJung-uk Kim } 2839e71b7053SJung-uk Kim if (ret < 0) { 2840e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_INTERNAL_ERROR, 2841e71b7053SJung-uk Kim SSL_F_TLS_PROCESS_INITIAL_SERVER_FLIGHT, 2842e71b7053SJung-uk Kim ERR_R_MALLOC_FAILURE); 2843e71b7053SJung-uk Kim return 0; 2844e71b7053SJung-uk Kim } 2845e71b7053SJung-uk Kim } 2846e71b7053SJung-uk Kim #ifndef OPENSSL_NO_CT 2847e71b7053SJung-uk Kim if (s->ct_validation_callback != NULL) { 2848e71b7053SJung-uk Kim /* Note we validate the SCTs whether or not we abort on error */ 2849e71b7053SJung-uk Kim if (!ssl_validate_ct(s) && (s->verify_mode & SSL_VERIFY_PEER)) { 2850e71b7053SJung-uk Kim /* SSLfatal() already called */ 2851e71b7053SJung-uk Kim return 0; 2852e71b7053SJung-uk Kim } 2853e71b7053SJung-uk Kim } 2854e71b7053SJung-uk Kim #endif 2855e71b7053SJung-uk Kim 2856e71b7053SJung-uk Kim return 1; 2857e71b7053SJung-uk Kim } 2858e71b7053SJung-uk Kim 2859e71b7053SJung-uk Kim MSG_PROCESS_RETURN tls_process_server_done(SSL *s, PACKET *pkt) 2860e71b7053SJung-uk Kim { 2861e71b7053SJung-uk Kim if (PACKET_remaining(pkt) > 0) { 2862e71b7053SJung-uk Kim /* should contain no data */ 2863e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_DECODE_ERROR, SSL_F_TLS_PROCESS_SERVER_DONE, 2864e71b7053SJung-uk Kim SSL_R_LENGTH_MISMATCH); 2865e71b7053SJung-uk Kim return MSG_PROCESS_ERROR; 2866e71b7053SJung-uk Kim } 2867e71b7053SJung-uk Kim #ifndef OPENSSL_NO_SRP 2868e71b7053SJung-uk Kim if (s->s3->tmp.new_cipher->algorithm_mkey & SSL_kSRP) { 2869e71b7053SJung-uk Kim if (SRP_Calc_A_param(s) <= 0) { 2870e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_TLS_PROCESS_SERVER_DONE, 2871e71b7053SJung-uk Kim SSL_R_SRP_A_CALC); 2872e71b7053SJung-uk Kim return MSG_PROCESS_ERROR; 2873e71b7053SJung-uk Kim } 2874e71b7053SJung-uk Kim } 2875e71b7053SJung-uk Kim #endif 2876e71b7053SJung-uk Kim 2877e71b7053SJung-uk Kim if (!tls_process_initial_server_flight(s)) { 2878e71b7053SJung-uk Kim /* SSLfatal() already called */ 2879e71b7053SJung-uk Kim return MSG_PROCESS_ERROR; 2880e71b7053SJung-uk Kim } 2881e71b7053SJung-uk Kim 2882e71b7053SJung-uk Kim return MSG_PROCESS_FINISHED_READING; 2883e71b7053SJung-uk Kim } 2884e71b7053SJung-uk Kim 2885e71b7053SJung-uk Kim static int tls_construct_cke_psk_preamble(SSL *s, WPACKET *pkt) 2886e71b7053SJung-uk Kim { 2887e71b7053SJung-uk Kim #ifndef OPENSSL_NO_PSK 2888e71b7053SJung-uk Kim int ret = 0; 2889e71b7053SJung-uk Kim /* 2890e71b7053SJung-uk Kim * The callback needs PSK_MAX_IDENTITY_LEN + 1 bytes to return a 2891e71b7053SJung-uk Kim * \0-terminated identity. The last byte is for us for simulating 2892e71b7053SJung-uk Kim * strnlen. 2893e71b7053SJung-uk Kim */ 2894e71b7053SJung-uk Kim char identity[PSK_MAX_IDENTITY_LEN + 1]; 2895e71b7053SJung-uk Kim size_t identitylen = 0; 2896e71b7053SJung-uk Kim unsigned char psk[PSK_MAX_PSK_LEN]; 2897e71b7053SJung-uk Kim unsigned char *tmppsk = NULL; 2898e71b7053SJung-uk Kim char *tmpidentity = NULL; 2899e71b7053SJung-uk Kim size_t psklen = 0; 2900e71b7053SJung-uk Kim 2901e71b7053SJung-uk Kim if (s->psk_client_callback == NULL) { 2902e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_TLS_CONSTRUCT_CKE_PSK_PREAMBLE, 2903e71b7053SJung-uk Kim SSL_R_PSK_NO_CLIENT_CB); 2904e71b7053SJung-uk Kim goto err; 2905e71b7053SJung-uk Kim } 2906e71b7053SJung-uk Kim 2907e71b7053SJung-uk Kim memset(identity, 0, sizeof(identity)); 2908e71b7053SJung-uk Kim 2909e71b7053SJung-uk Kim psklen = s->psk_client_callback(s, s->session->psk_identity_hint, 2910e71b7053SJung-uk Kim identity, sizeof(identity) - 1, 2911e71b7053SJung-uk Kim psk, sizeof(psk)); 2912e71b7053SJung-uk Kim 2913e71b7053SJung-uk Kim if (psklen > PSK_MAX_PSK_LEN) { 2914e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_HANDSHAKE_FAILURE, 2915e71b7053SJung-uk Kim SSL_F_TLS_CONSTRUCT_CKE_PSK_PREAMBLE, ERR_R_INTERNAL_ERROR); 2916e71b7053SJung-uk Kim goto err; 2917e71b7053SJung-uk Kim } else if (psklen == 0) { 2918e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_HANDSHAKE_FAILURE, 2919e71b7053SJung-uk Kim SSL_F_TLS_CONSTRUCT_CKE_PSK_PREAMBLE, 2920e71b7053SJung-uk Kim SSL_R_PSK_IDENTITY_NOT_FOUND); 2921e71b7053SJung-uk Kim goto err; 2922e71b7053SJung-uk Kim } 2923e71b7053SJung-uk Kim 2924e71b7053SJung-uk Kim identitylen = strlen(identity); 2925e71b7053SJung-uk Kim if (identitylen > PSK_MAX_IDENTITY_LEN) { 2926e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_TLS_CONSTRUCT_CKE_PSK_PREAMBLE, 2927e71b7053SJung-uk Kim ERR_R_INTERNAL_ERROR); 2928e71b7053SJung-uk Kim goto err; 2929e71b7053SJung-uk Kim } 2930e71b7053SJung-uk Kim 2931e71b7053SJung-uk Kim tmppsk = OPENSSL_memdup(psk, psklen); 2932e71b7053SJung-uk Kim tmpidentity = OPENSSL_strdup(identity); 2933e71b7053SJung-uk Kim if (tmppsk == NULL || tmpidentity == NULL) { 2934e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_TLS_CONSTRUCT_CKE_PSK_PREAMBLE, 2935e71b7053SJung-uk Kim ERR_R_MALLOC_FAILURE); 2936e71b7053SJung-uk Kim goto err; 2937e71b7053SJung-uk Kim } 2938e71b7053SJung-uk Kim 2939e71b7053SJung-uk Kim OPENSSL_free(s->s3->tmp.psk); 2940e71b7053SJung-uk Kim s->s3->tmp.psk = tmppsk; 2941e71b7053SJung-uk Kim s->s3->tmp.psklen = psklen; 2942e71b7053SJung-uk Kim tmppsk = NULL; 2943e71b7053SJung-uk Kim OPENSSL_free(s->session->psk_identity); 2944e71b7053SJung-uk Kim s->session->psk_identity = tmpidentity; 2945e71b7053SJung-uk Kim tmpidentity = NULL; 2946e71b7053SJung-uk Kim 2947e71b7053SJung-uk Kim if (!WPACKET_sub_memcpy_u16(pkt, identity, identitylen)) { 2948e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_TLS_CONSTRUCT_CKE_PSK_PREAMBLE, 2949e71b7053SJung-uk Kim ERR_R_INTERNAL_ERROR); 2950e71b7053SJung-uk Kim goto err; 2951e71b7053SJung-uk Kim } 2952e71b7053SJung-uk Kim 2953e71b7053SJung-uk Kim ret = 1; 2954e71b7053SJung-uk Kim 2955e71b7053SJung-uk Kim err: 2956e71b7053SJung-uk Kim OPENSSL_cleanse(psk, psklen); 2957e71b7053SJung-uk Kim OPENSSL_cleanse(identity, sizeof(identity)); 2958e71b7053SJung-uk Kim OPENSSL_clear_free(tmppsk, psklen); 2959e71b7053SJung-uk Kim OPENSSL_clear_free(tmpidentity, identitylen); 2960e71b7053SJung-uk Kim 2961e71b7053SJung-uk Kim return ret; 2962e71b7053SJung-uk Kim #else 2963e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_TLS_CONSTRUCT_CKE_PSK_PREAMBLE, 2964e71b7053SJung-uk Kim ERR_R_INTERNAL_ERROR); 2965e71b7053SJung-uk Kim return 0; 2966e71b7053SJung-uk Kim #endif 2967e71b7053SJung-uk Kim } 2968e71b7053SJung-uk Kim 2969e71b7053SJung-uk Kim static int tls_construct_cke_rsa(SSL *s, WPACKET *pkt) 2970e71b7053SJung-uk Kim { 2971e71b7053SJung-uk Kim #ifndef OPENSSL_NO_RSA 2972e71b7053SJung-uk Kim unsigned char *encdata = NULL; 2973e71b7053SJung-uk Kim EVP_PKEY *pkey = NULL; 2974e71b7053SJung-uk Kim EVP_PKEY_CTX *pctx = NULL; 2975e71b7053SJung-uk Kim size_t enclen; 2976e71b7053SJung-uk Kim unsigned char *pms = NULL; 2977e71b7053SJung-uk Kim size_t pmslen = 0; 2978e71b7053SJung-uk Kim 2979e71b7053SJung-uk Kim if (s->session->peer == NULL) { 2980e71b7053SJung-uk Kim /* 2981e71b7053SJung-uk Kim * We should always have a server certificate with SSL_kRSA. 2982e71b7053SJung-uk Kim */ 2983e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_TLS_CONSTRUCT_CKE_RSA, 2984e71b7053SJung-uk Kim ERR_R_INTERNAL_ERROR); 2985e71b7053SJung-uk Kim return 0; 2986e71b7053SJung-uk Kim } 2987e71b7053SJung-uk Kim 2988e71b7053SJung-uk Kim pkey = X509_get0_pubkey(s->session->peer); 2989e71b7053SJung-uk Kim if (EVP_PKEY_get0_RSA(pkey) == NULL) { 2990e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_TLS_CONSTRUCT_CKE_RSA, 2991e71b7053SJung-uk Kim ERR_R_INTERNAL_ERROR); 2992e71b7053SJung-uk Kim return 0; 2993e71b7053SJung-uk Kim } 2994e71b7053SJung-uk Kim 2995e71b7053SJung-uk Kim pmslen = SSL_MAX_MASTER_KEY_LENGTH; 2996e71b7053SJung-uk Kim pms = OPENSSL_malloc(pmslen); 2997e71b7053SJung-uk Kim if (pms == NULL) { 2998e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_TLS_CONSTRUCT_CKE_RSA, 2999e71b7053SJung-uk Kim ERR_R_MALLOC_FAILURE); 3000e71b7053SJung-uk Kim return 0; 3001e71b7053SJung-uk Kim } 3002e71b7053SJung-uk Kim 3003e71b7053SJung-uk Kim pms[0] = s->client_version >> 8; 3004e71b7053SJung-uk Kim pms[1] = s->client_version & 0xff; 3005e71b7053SJung-uk Kim /* TODO(size_t): Convert this function */ 3006e71b7053SJung-uk Kim if (RAND_bytes(pms + 2, (int)(pmslen - 2)) <= 0) { 3007e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_TLS_CONSTRUCT_CKE_RSA, 3008e71b7053SJung-uk Kim ERR_R_MALLOC_FAILURE); 3009e71b7053SJung-uk Kim goto err; 3010e71b7053SJung-uk Kim } 3011e71b7053SJung-uk Kim 3012e71b7053SJung-uk Kim /* Fix buf for TLS and beyond */ 3013e71b7053SJung-uk Kim if (s->version > SSL3_VERSION && !WPACKET_start_sub_packet_u16(pkt)) { 3014e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_TLS_CONSTRUCT_CKE_RSA, 3015e71b7053SJung-uk Kim ERR_R_INTERNAL_ERROR); 3016e71b7053SJung-uk Kim goto err; 3017e71b7053SJung-uk Kim } 3018e71b7053SJung-uk Kim pctx = EVP_PKEY_CTX_new(pkey, NULL); 3019e71b7053SJung-uk Kim if (pctx == NULL || EVP_PKEY_encrypt_init(pctx) <= 0 3020e71b7053SJung-uk Kim || EVP_PKEY_encrypt(pctx, NULL, &enclen, pms, pmslen) <= 0) { 3021e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_TLS_CONSTRUCT_CKE_RSA, 3022e71b7053SJung-uk Kim ERR_R_EVP_LIB); 3023e71b7053SJung-uk Kim goto err; 3024e71b7053SJung-uk Kim } 3025e71b7053SJung-uk Kim if (!WPACKET_allocate_bytes(pkt, enclen, &encdata) 3026e71b7053SJung-uk Kim || EVP_PKEY_encrypt(pctx, encdata, &enclen, pms, pmslen) <= 0) { 3027e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_TLS_CONSTRUCT_CKE_RSA, 3028e71b7053SJung-uk Kim SSL_R_BAD_RSA_ENCRYPT); 3029e71b7053SJung-uk Kim goto err; 3030e71b7053SJung-uk Kim } 3031e71b7053SJung-uk Kim EVP_PKEY_CTX_free(pctx); 3032e71b7053SJung-uk Kim pctx = NULL; 3033e71b7053SJung-uk Kim 3034e71b7053SJung-uk Kim /* Fix buf for TLS and beyond */ 3035e71b7053SJung-uk Kim if (s->version > SSL3_VERSION && !WPACKET_close(pkt)) { 3036e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_TLS_CONSTRUCT_CKE_RSA, 3037e71b7053SJung-uk Kim ERR_R_INTERNAL_ERROR); 3038e71b7053SJung-uk Kim goto err; 3039e71b7053SJung-uk Kim } 3040e71b7053SJung-uk Kim 3041e71b7053SJung-uk Kim /* Log the premaster secret, if logging is enabled. */ 3042e71b7053SJung-uk Kim if (!ssl_log_rsa_client_key_exchange(s, encdata, enclen, pms, pmslen)) { 3043e71b7053SJung-uk Kim /* SSLfatal() already called */ 3044e71b7053SJung-uk Kim goto err; 3045e71b7053SJung-uk Kim } 3046e71b7053SJung-uk Kim 3047e71b7053SJung-uk Kim s->s3->tmp.pms = pms; 3048e71b7053SJung-uk Kim s->s3->tmp.pmslen = pmslen; 3049e71b7053SJung-uk Kim 3050e71b7053SJung-uk Kim return 1; 3051e71b7053SJung-uk Kim err: 3052e71b7053SJung-uk Kim OPENSSL_clear_free(pms, pmslen); 3053e71b7053SJung-uk Kim EVP_PKEY_CTX_free(pctx); 3054e71b7053SJung-uk Kim 3055e71b7053SJung-uk Kim return 0; 3056e71b7053SJung-uk Kim #else 3057e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_TLS_CONSTRUCT_CKE_RSA, 3058e71b7053SJung-uk Kim ERR_R_INTERNAL_ERROR); 3059e71b7053SJung-uk Kim return 0; 3060e71b7053SJung-uk Kim #endif 3061e71b7053SJung-uk Kim } 3062e71b7053SJung-uk Kim 3063e71b7053SJung-uk Kim static int tls_construct_cke_dhe(SSL *s, WPACKET *pkt) 3064e71b7053SJung-uk Kim { 3065e71b7053SJung-uk Kim #ifndef OPENSSL_NO_DH 3066e71b7053SJung-uk Kim DH *dh_clnt = NULL; 3067e71b7053SJung-uk Kim const BIGNUM *pub_key; 3068e71b7053SJung-uk Kim EVP_PKEY *ckey = NULL, *skey = NULL; 3069e71b7053SJung-uk Kim unsigned char *keybytes = NULL; 3070e71b7053SJung-uk Kim 3071e71b7053SJung-uk Kim skey = s->s3->peer_tmp; 3072e71b7053SJung-uk Kim if (skey == NULL) { 3073e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_TLS_CONSTRUCT_CKE_DHE, 3074e71b7053SJung-uk Kim ERR_R_INTERNAL_ERROR); 3075e71b7053SJung-uk Kim goto err; 3076e71b7053SJung-uk Kim } 3077e71b7053SJung-uk Kim 3078e71b7053SJung-uk Kim ckey = ssl_generate_pkey(skey); 3079e71b7053SJung-uk Kim if (ckey == NULL) { 3080e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_TLS_CONSTRUCT_CKE_DHE, 3081e71b7053SJung-uk Kim ERR_R_INTERNAL_ERROR); 3082e71b7053SJung-uk Kim goto err; 3083e71b7053SJung-uk Kim } 3084e71b7053SJung-uk Kim 3085e71b7053SJung-uk Kim dh_clnt = EVP_PKEY_get0_DH(ckey); 3086e71b7053SJung-uk Kim 3087e71b7053SJung-uk Kim if (dh_clnt == NULL) { 3088e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_TLS_CONSTRUCT_CKE_DHE, 3089e71b7053SJung-uk Kim ERR_R_INTERNAL_ERROR); 3090e71b7053SJung-uk Kim goto err; 3091e71b7053SJung-uk Kim } 3092e71b7053SJung-uk Kim 3093e71b7053SJung-uk Kim if (ssl_derive(s, ckey, skey, 0) == 0) { 3094e71b7053SJung-uk Kim /* SSLfatal() already called */ 3095e71b7053SJung-uk Kim goto err; 3096e71b7053SJung-uk Kim } 3097e71b7053SJung-uk Kim 3098e71b7053SJung-uk Kim /* send off the data */ 3099e71b7053SJung-uk Kim DH_get0_key(dh_clnt, &pub_key, NULL); 3100e71b7053SJung-uk Kim if (!WPACKET_sub_allocate_bytes_u16(pkt, BN_num_bytes(pub_key), 3101e71b7053SJung-uk Kim &keybytes)) { 3102e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_TLS_CONSTRUCT_CKE_DHE, 3103e71b7053SJung-uk Kim ERR_R_INTERNAL_ERROR); 3104e71b7053SJung-uk Kim goto err; 3105e71b7053SJung-uk Kim } 3106e71b7053SJung-uk Kim 3107e71b7053SJung-uk Kim BN_bn2bin(pub_key, keybytes); 3108e71b7053SJung-uk Kim EVP_PKEY_free(ckey); 3109e71b7053SJung-uk Kim 3110e71b7053SJung-uk Kim return 1; 3111e71b7053SJung-uk Kim err: 3112e71b7053SJung-uk Kim EVP_PKEY_free(ckey); 3113e71b7053SJung-uk Kim return 0; 3114e71b7053SJung-uk Kim #else 3115e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_TLS_CONSTRUCT_CKE_DHE, 3116e71b7053SJung-uk Kim ERR_R_INTERNAL_ERROR); 3117e71b7053SJung-uk Kim return 0; 3118e71b7053SJung-uk Kim #endif 3119e71b7053SJung-uk Kim } 3120e71b7053SJung-uk Kim 3121e71b7053SJung-uk Kim static int tls_construct_cke_ecdhe(SSL *s, WPACKET *pkt) 3122e71b7053SJung-uk Kim { 3123e71b7053SJung-uk Kim #ifndef OPENSSL_NO_EC 3124e71b7053SJung-uk Kim unsigned char *encodedPoint = NULL; 3125e71b7053SJung-uk Kim size_t encoded_pt_len = 0; 3126e71b7053SJung-uk Kim EVP_PKEY *ckey = NULL, *skey = NULL; 3127e71b7053SJung-uk Kim int ret = 0; 3128e71b7053SJung-uk Kim 3129e71b7053SJung-uk Kim skey = s->s3->peer_tmp; 3130e71b7053SJung-uk Kim if (skey == NULL) { 3131e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_TLS_CONSTRUCT_CKE_ECDHE, 3132e71b7053SJung-uk Kim ERR_R_INTERNAL_ERROR); 3133e71b7053SJung-uk Kim return 0; 3134e71b7053SJung-uk Kim } 3135e71b7053SJung-uk Kim 3136e71b7053SJung-uk Kim ckey = ssl_generate_pkey(skey); 3137e71b7053SJung-uk Kim if (ckey == NULL) { 3138e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_TLS_CONSTRUCT_CKE_ECDHE, 3139e71b7053SJung-uk Kim ERR_R_MALLOC_FAILURE); 3140e71b7053SJung-uk Kim goto err; 3141e71b7053SJung-uk Kim } 3142e71b7053SJung-uk Kim 3143e71b7053SJung-uk Kim if (ssl_derive(s, ckey, skey, 0) == 0) { 3144e71b7053SJung-uk Kim /* SSLfatal() already called */ 3145e71b7053SJung-uk Kim goto err; 3146e71b7053SJung-uk Kim } 3147e71b7053SJung-uk Kim 3148e71b7053SJung-uk Kim /* Generate encoding of client key */ 3149e71b7053SJung-uk Kim encoded_pt_len = EVP_PKEY_get1_tls_encodedpoint(ckey, &encodedPoint); 3150e71b7053SJung-uk Kim 3151e71b7053SJung-uk Kim if (encoded_pt_len == 0) { 3152e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_TLS_CONSTRUCT_CKE_ECDHE, 3153e71b7053SJung-uk Kim ERR_R_EC_LIB); 3154e71b7053SJung-uk Kim goto err; 3155e71b7053SJung-uk Kim } 3156e71b7053SJung-uk Kim 3157e71b7053SJung-uk Kim if (!WPACKET_sub_memcpy_u8(pkt, encodedPoint, encoded_pt_len)) { 3158e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_TLS_CONSTRUCT_CKE_ECDHE, 3159e71b7053SJung-uk Kim ERR_R_INTERNAL_ERROR); 3160e71b7053SJung-uk Kim goto err; 3161e71b7053SJung-uk Kim } 3162e71b7053SJung-uk Kim 3163e71b7053SJung-uk Kim ret = 1; 3164e71b7053SJung-uk Kim err: 3165e71b7053SJung-uk Kim OPENSSL_free(encodedPoint); 3166e71b7053SJung-uk Kim EVP_PKEY_free(ckey); 3167e71b7053SJung-uk Kim return ret; 3168e71b7053SJung-uk Kim #else 3169e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_TLS_CONSTRUCT_CKE_ECDHE, 3170e71b7053SJung-uk Kim ERR_R_INTERNAL_ERROR); 3171e71b7053SJung-uk Kim return 0; 3172e71b7053SJung-uk Kim #endif 3173e71b7053SJung-uk Kim } 3174e71b7053SJung-uk Kim 3175e71b7053SJung-uk Kim static int tls_construct_cke_gost(SSL *s, WPACKET *pkt) 3176e71b7053SJung-uk Kim { 3177e71b7053SJung-uk Kim #ifndef OPENSSL_NO_GOST 3178e71b7053SJung-uk Kim /* GOST key exchange message creation */ 3179e71b7053SJung-uk Kim EVP_PKEY_CTX *pkey_ctx = NULL; 3180e71b7053SJung-uk Kim X509 *peer_cert; 3181e71b7053SJung-uk Kim size_t msglen; 3182e71b7053SJung-uk Kim unsigned int md_len; 3183e71b7053SJung-uk Kim unsigned char shared_ukm[32], tmp[256]; 3184e71b7053SJung-uk Kim EVP_MD_CTX *ukm_hash = NULL; 3185e71b7053SJung-uk Kim int dgst_nid = NID_id_GostR3411_94; 3186e71b7053SJung-uk Kim unsigned char *pms = NULL; 3187e71b7053SJung-uk Kim size_t pmslen = 0; 3188e71b7053SJung-uk Kim 3189e71b7053SJung-uk Kim if ((s->s3->tmp.new_cipher->algorithm_auth & SSL_aGOST12) != 0) 3190e71b7053SJung-uk Kim dgst_nid = NID_id_GostR3411_2012_256; 3191e71b7053SJung-uk Kim 3192e71b7053SJung-uk Kim /* 3193e71b7053SJung-uk Kim * Get server certificate PKEY and create ctx from it 3194e71b7053SJung-uk Kim */ 3195e71b7053SJung-uk Kim peer_cert = s->session->peer; 3196e71b7053SJung-uk Kim if (!peer_cert) { 3197e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_HANDSHAKE_FAILURE, SSL_F_TLS_CONSTRUCT_CKE_GOST, 3198e71b7053SJung-uk Kim SSL_R_NO_GOST_CERTIFICATE_SENT_BY_PEER); 3199e71b7053SJung-uk Kim return 0; 3200e71b7053SJung-uk Kim } 3201e71b7053SJung-uk Kim 3202e71b7053SJung-uk Kim pkey_ctx = EVP_PKEY_CTX_new(X509_get0_pubkey(peer_cert), NULL); 3203e71b7053SJung-uk Kim if (pkey_ctx == NULL) { 3204e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_TLS_CONSTRUCT_CKE_GOST, 3205e71b7053SJung-uk Kim ERR_R_MALLOC_FAILURE); 3206e71b7053SJung-uk Kim return 0; 3207e71b7053SJung-uk Kim } 3208e71b7053SJung-uk Kim /* 3209e71b7053SJung-uk Kim * If we have send a certificate, and certificate key 3210e71b7053SJung-uk Kim * parameters match those of server certificate, use 3211e71b7053SJung-uk Kim * certificate key for key exchange 3212e71b7053SJung-uk Kim */ 3213e71b7053SJung-uk Kim 3214e71b7053SJung-uk Kim /* Otherwise, generate ephemeral key pair */ 3215e71b7053SJung-uk Kim pmslen = 32; 3216e71b7053SJung-uk Kim pms = OPENSSL_malloc(pmslen); 3217e71b7053SJung-uk Kim if (pms == NULL) { 3218e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_TLS_CONSTRUCT_CKE_GOST, 3219e71b7053SJung-uk Kim ERR_R_MALLOC_FAILURE); 3220e71b7053SJung-uk Kim goto err; 3221e71b7053SJung-uk Kim } 3222e71b7053SJung-uk Kim 3223e71b7053SJung-uk Kim if (EVP_PKEY_encrypt_init(pkey_ctx) <= 0 3224e71b7053SJung-uk Kim /* Generate session key 3225e71b7053SJung-uk Kim * TODO(size_t): Convert this function 3226e71b7053SJung-uk Kim */ 3227e71b7053SJung-uk Kim || RAND_bytes(pms, (int)pmslen) <= 0) { 3228e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_TLS_CONSTRUCT_CKE_GOST, 3229e71b7053SJung-uk Kim ERR_R_INTERNAL_ERROR); 3230e71b7053SJung-uk Kim goto err; 3231e71b7053SJung-uk Kim }; 3232e71b7053SJung-uk Kim /* 3233e71b7053SJung-uk Kim * Compute shared IV and store it in algorithm-specific context 3234e71b7053SJung-uk Kim * data 3235e71b7053SJung-uk Kim */ 3236e71b7053SJung-uk Kim ukm_hash = EVP_MD_CTX_new(); 3237e71b7053SJung-uk Kim if (ukm_hash == NULL 3238e71b7053SJung-uk Kim || EVP_DigestInit(ukm_hash, EVP_get_digestbynid(dgst_nid)) <= 0 3239e71b7053SJung-uk Kim || EVP_DigestUpdate(ukm_hash, s->s3->client_random, 3240e71b7053SJung-uk Kim SSL3_RANDOM_SIZE) <= 0 3241e71b7053SJung-uk Kim || EVP_DigestUpdate(ukm_hash, s->s3->server_random, 3242e71b7053SJung-uk Kim SSL3_RANDOM_SIZE) <= 0 3243e71b7053SJung-uk Kim || EVP_DigestFinal_ex(ukm_hash, shared_ukm, &md_len) <= 0) { 3244e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_TLS_CONSTRUCT_CKE_GOST, 3245e71b7053SJung-uk Kim ERR_R_INTERNAL_ERROR); 3246e71b7053SJung-uk Kim goto err; 3247e71b7053SJung-uk Kim } 3248e71b7053SJung-uk Kim EVP_MD_CTX_free(ukm_hash); 3249e71b7053SJung-uk Kim ukm_hash = NULL; 3250e71b7053SJung-uk Kim if (EVP_PKEY_CTX_ctrl(pkey_ctx, -1, EVP_PKEY_OP_ENCRYPT, 3251e71b7053SJung-uk Kim EVP_PKEY_CTRL_SET_IV, 8, shared_ukm) < 0) { 3252e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_TLS_CONSTRUCT_CKE_GOST, 3253e71b7053SJung-uk Kim SSL_R_LIBRARY_BUG); 3254e71b7053SJung-uk Kim goto err; 3255e71b7053SJung-uk Kim } 3256e71b7053SJung-uk Kim /* Make GOST keytransport blob message */ 3257e71b7053SJung-uk Kim /* 3258e71b7053SJung-uk Kim * Encapsulate it into sequence 3259e71b7053SJung-uk Kim */ 3260e71b7053SJung-uk Kim msglen = 255; 3261e71b7053SJung-uk Kim if (EVP_PKEY_encrypt(pkey_ctx, tmp, &msglen, pms, pmslen) <= 0) { 3262e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_TLS_CONSTRUCT_CKE_GOST, 3263e71b7053SJung-uk Kim SSL_R_LIBRARY_BUG); 3264e71b7053SJung-uk Kim goto err; 3265e71b7053SJung-uk Kim } 3266e71b7053SJung-uk Kim 3267e71b7053SJung-uk Kim if (!WPACKET_put_bytes_u8(pkt, V_ASN1_SEQUENCE | V_ASN1_CONSTRUCTED) 3268e71b7053SJung-uk Kim || (msglen >= 0x80 && !WPACKET_put_bytes_u8(pkt, 0x81)) 3269e71b7053SJung-uk Kim || !WPACKET_sub_memcpy_u8(pkt, tmp, msglen)) { 3270e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_TLS_CONSTRUCT_CKE_GOST, 3271e71b7053SJung-uk Kim ERR_R_INTERNAL_ERROR); 3272e71b7053SJung-uk Kim goto err; 3273e71b7053SJung-uk Kim } 3274e71b7053SJung-uk Kim 3275e71b7053SJung-uk Kim EVP_PKEY_CTX_free(pkey_ctx); 3276e71b7053SJung-uk Kim s->s3->tmp.pms = pms; 3277e71b7053SJung-uk Kim s->s3->tmp.pmslen = pmslen; 3278e71b7053SJung-uk Kim 3279e71b7053SJung-uk Kim return 1; 3280e71b7053SJung-uk Kim err: 3281e71b7053SJung-uk Kim EVP_PKEY_CTX_free(pkey_ctx); 3282e71b7053SJung-uk Kim OPENSSL_clear_free(pms, pmslen); 3283e71b7053SJung-uk Kim EVP_MD_CTX_free(ukm_hash); 3284e71b7053SJung-uk Kim return 0; 3285e71b7053SJung-uk Kim #else 3286e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_TLS_CONSTRUCT_CKE_GOST, 3287e71b7053SJung-uk Kim ERR_R_INTERNAL_ERROR); 3288e71b7053SJung-uk Kim return 0; 3289e71b7053SJung-uk Kim #endif 3290e71b7053SJung-uk Kim } 3291e71b7053SJung-uk Kim 3292e71b7053SJung-uk Kim static int tls_construct_cke_srp(SSL *s, WPACKET *pkt) 3293e71b7053SJung-uk Kim { 3294e71b7053SJung-uk Kim #ifndef OPENSSL_NO_SRP 3295e71b7053SJung-uk Kim unsigned char *abytes = NULL; 3296e71b7053SJung-uk Kim 3297e71b7053SJung-uk Kim if (s->srp_ctx.A == NULL 3298e71b7053SJung-uk Kim || !WPACKET_sub_allocate_bytes_u16(pkt, BN_num_bytes(s->srp_ctx.A), 3299e71b7053SJung-uk Kim &abytes)) { 3300e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_TLS_CONSTRUCT_CKE_SRP, 3301e71b7053SJung-uk Kim ERR_R_INTERNAL_ERROR); 3302e71b7053SJung-uk Kim return 0; 3303e71b7053SJung-uk Kim } 3304e71b7053SJung-uk Kim BN_bn2bin(s->srp_ctx.A, abytes); 3305e71b7053SJung-uk Kim 3306e71b7053SJung-uk Kim OPENSSL_free(s->session->srp_username); 3307e71b7053SJung-uk Kim s->session->srp_username = OPENSSL_strdup(s->srp_ctx.login); 3308e71b7053SJung-uk Kim if (s->session->srp_username == NULL) { 3309e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_TLS_CONSTRUCT_CKE_SRP, 3310e71b7053SJung-uk Kim ERR_R_MALLOC_FAILURE); 3311e71b7053SJung-uk Kim return 0; 3312e71b7053SJung-uk Kim } 3313e71b7053SJung-uk Kim 3314e71b7053SJung-uk Kim return 1; 3315e71b7053SJung-uk Kim #else 3316e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_TLS_CONSTRUCT_CKE_SRP, 3317e71b7053SJung-uk Kim ERR_R_INTERNAL_ERROR); 3318e71b7053SJung-uk Kim return 0; 3319e71b7053SJung-uk Kim #endif 3320e71b7053SJung-uk Kim } 3321e71b7053SJung-uk Kim 3322e71b7053SJung-uk Kim int tls_construct_client_key_exchange(SSL *s, WPACKET *pkt) 3323e71b7053SJung-uk Kim { 3324e71b7053SJung-uk Kim unsigned long alg_k; 3325e71b7053SJung-uk Kim 3326e71b7053SJung-uk Kim alg_k = s->s3->tmp.new_cipher->algorithm_mkey; 3327e71b7053SJung-uk Kim 3328e71b7053SJung-uk Kim /* 3329e71b7053SJung-uk Kim * All of the construct functions below call SSLfatal() if necessary so 3330e71b7053SJung-uk Kim * no need to do so here. 3331e71b7053SJung-uk Kim */ 3332e71b7053SJung-uk Kim if ((alg_k & SSL_PSK) 3333e71b7053SJung-uk Kim && !tls_construct_cke_psk_preamble(s, pkt)) 3334e71b7053SJung-uk Kim goto err; 3335e71b7053SJung-uk Kim 3336e71b7053SJung-uk Kim if (alg_k & (SSL_kRSA | SSL_kRSAPSK)) { 3337e71b7053SJung-uk Kim if (!tls_construct_cke_rsa(s, pkt)) 3338e71b7053SJung-uk Kim goto err; 3339e71b7053SJung-uk Kim } else if (alg_k & (SSL_kDHE | SSL_kDHEPSK)) { 3340e71b7053SJung-uk Kim if (!tls_construct_cke_dhe(s, pkt)) 3341e71b7053SJung-uk Kim goto err; 3342e71b7053SJung-uk Kim } else if (alg_k & (SSL_kECDHE | SSL_kECDHEPSK)) { 3343e71b7053SJung-uk Kim if (!tls_construct_cke_ecdhe(s, pkt)) 3344e71b7053SJung-uk Kim goto err; 3345e71b7053SJung-uk Kim } else if (alg_k & SSL_kGOST) { 3346e71b7053SJung-uk Kim if (!tls_construct_cke_gost(s, pkt)) 3347e71b7053SJung-uk Kim goto err; 3348e71b7053SJung-uk Kim } else if (alg_k & SSL_kSRP) { 3349e71b7053SJung-uk Kim if (!tls_construct_cke_srp(s, pkt)) 3350e71b7053SJung-uk Kim goto err; 3351e71b7053SJung-uk Kim } else if (!(alg_k & SSL_kPSK)) { 3352e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_INTERNAL_ERROR, 3353e71b7053SJung-uk Kim SSL_F_TLS_CONSTRUCT_CLIENT_KEY_EXCHANGE, ERR_R_INTERNAL_ERROR); 3354e71b7053SJung-uk Kim goto err; 3355e71b7053SJung-uk Kim } 3356e71b7053SJung-uk Kim 3357e71b7053SJung-uk Kim return 1; 3358e71b7053SJung-uk Kim err: 3359e71b7053SJung-uk Kim OPENSSL_clear_free(s->s3->tmp.pms, s->s3->tmp.pmslen); 3360e71b7053SJung-uk Kim s->s3->tmp.pms = NULL; 3361e71b7053SJung-uk Kim #ifndef OPENSSL_NO_PSK 3362e71b7053SJung-uk Kim OPENSSL_clear_free(s->s3->tmp.psk, s->s3->tmp.psklen); 3363e71b7053SJung-uk Kim s->s3->tmp.psk = NULL; 3364e71b7053SJung-uk Kim #endif 3365e71b7053SJung-uk Kim return 0; 3366e71b7053SJung-uk Kim } 3367e71b7053SJung-uk Kim 3368e71b7053SJung-uk Kim int tls_client_key_exchange_post_work(SSL *s) 3369e71b7053SJung-uk Kim { 3370e71b7053SJung-uk Kim unsigned char *pms = NULL; 3371e71b7053SJung-uk Kim size_t pmslen = 0; 3372e71b7053SJung-uk Kim 3373e71b7053SJung-uk Kim pms = s->s3->tmp.pms; 3374e71b7053SJung-uk Kim pmslen = s->s3->tmp.pmslen; 3375e71b7053SJung-uk Kim 3376e71b7053SJung-uk Kim #ifndef OPENSSL_NO_SRP 3377e71b7053SJung-uk Kim /* Check for SRP */ 3378e71b7053SJung-uk Kim if (s->s3->tmp.new_cipher->algorithm_mkey & SSL_kSRP) { 3379e71b7053SJung-uk Kim if (!srp_generate_client_master_secret(s)) { 3380e71b7053SJung-uk Kim /* SSLfatal() already called */ 3381e71b7053SJung-uk Kim goto err; 3382e71b7053SJung-uk Kim } 3383e71b7053SJung-uk Kim return 1; 3384e71b7053SJung-uk Kim } 3385e71b7053SJung-uk Kim #endif 3386e71b7053SJung-uk Kim 3387e71b7053SJung-uk Kim if (pms == NULL && !(s->s3->tmp.new_cipher->algorithm_mkey & SSL_kPSK)) { 3388e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_INTERNAL_ERROR, 3389e71b7053SJung-uk Kim SSL_F_TLS_CLIENT_KEY_EXCHANGE_POST_WORK, ERR_R_MALLOC_FAILURE); 3390e71b7053SJung-uk Kim goto err; 3391e71b7053SJung-uk Kim } 3392e71b7053SJung-uk Kim if (!ssl_generate_master_secret(s, pms, pmslen, 1)) { 3393e71b7053SJung-uk Kim /* SSLfatal() already called */ 3394e71b7053SJung-uk Kim /* ssl_generate_master_secret frees the pms even on error */ 3395e71b7053SJung-uk Kim pms = NULL; 3396e71b7053SJung-uk Kim pmslen = 0; 3397e71b7053SJung-uk Kim goto err; 3398e71b7053SJung-uk Kim } 3399e71b7053SJung-uk Kim pms = NULL; 3400e71b7053SJung-uk Kim pmslen = 0; 3401e71b7053SJung-uk Kim 3402e71b7053SJung-uk Kim #ifndef OPENSSL_NO_SCTP 3403e71b7053SJung-uk Kim if (SSL_IS_DTLS(s)) { 3404e71b7053SJung-uk Kim unsigned char sctpauthkey[64]; 3405e71b7053SJung-uk Kim char labelbuffer[sizeof(DTLS1_SCTP_AUTH_LABEL)]; 3406e71b7053SJung-uk Kim 3407e71b7053SJung-uk Kim /* 3408e71b7053SJung-uk Kim * Add new shared key for SCTP-Auth, will be ignored if no SCTP 3409e71b7053SJung-uk Kim * used. 3410e71b7053SJung-uk Kim */ 3411e71b7053SJung-uk Kim memcpy(labelbuffer, DTLS1_SCTP_AUTH_LABEL, 3412e71b7053SJung-uk Kim sizeof(DTLS1_SCTP_AUTH_LABEL)); 3413e71b7053SJung-uk Kim 3414e71b7053SJung-uk Kim if (SSL_export_keying_material(s, sctpauthkey, 3415e71b7053SJung-uk Kim sizeof(sctpauthkey), labelbuffer, 3416e71b7053SJung-uk Kim sizeof(labelbuffer), NULL, 0, 0) <= 0) { 3417e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_INTERNAL_ERROR, 3418e71b7053SJung-uk Kim SSL_F_TLS_CLIENT_KEY_EXCHANGE_POST_WORK, 3419e71b7053SJung-uk Kim ERR_R_INTERNAL_ERROR); 3420e71b7053SJung-uk Kim goto err; 3421e71b7053SJung-uk Kim } 3422e71b7053SJung-uk Kim 3423e71b7053SJung-uk Kim BIO_ctrl(SSL_get_wbio(s), BIO_CTRL_DGRAM_SCTP_ADD_AUTH_KEY, 3424e71b7053SJung-uk Kim sizeof(sctpauthkey), sctpauthkey); 3425e71b7053SJung-uk Kim } 3426e71b7053SJung-uk Kim #endif 3427e71b7053SJung-uk Kim 3428e71b7053SJung-uk Kim return 1; 3429e71b7053SJung-uk Kim err: 3430e71b7053SJung-uk Kim OPENSSL_clear_free(pms, pmslen); 3431e71b7053SJung-uk Kim s->s3->tmp.pms = NULL; 3432e71b7053SJung-uk Kim return 0; 3433e71b7053SJung-uk Kim } 3434e71b7053SJung-uk Kim 3435e71b7053SJung-uk Kim /* 3436e71b7053SJung-uk Kim * Check a certificate can be used for client authentication. Currently check 3437e71b7053SJung-uk Kim * cert exists, if we have a suitable digest for TLS 1.2 if static DH client 3438e71b7053SJung-uk Kim * certificates can be used and optionally checks suitability for Suite B. 3439e71b7053SJung-uk Kim */ 3440e71b7053SJung-uk Kim static int ssl3_check_client_certificate(SSL *s) 3441e71b7053SJung-uk Kim { 3442e71b7053SJung-uk Kim /* If no suitable signature algorithm can't use certificate */ 3443e71b7053SJung-uk Kim if (!tls_choose_sigalg(s, 0) || s->s3->tmp.sigalg == NULL) 3444e71b7053SJung-uk Kim return 0; 3445e71b7053SJung-uk Kim /* 3446e71b7053SJung-uk Kim * If strict mode check suitability of chain before using it. This also 3447e71b7053SJung-uk Kim * adjusts suite B digest if necessary. 3448e71b7053SJung-uk Kim */ 3449e71b7053SJung-uk Kim if (s->cert->cert_flags & SSL_CERT_FLAGS_CHECK_TLS_STRICT && 3450e71b7053SJung-uk Kim !tls1_check_chain(s, NULL, NULL, NULL, -2)) 3451e71b7053SJung-uk Kim return 0; 3452e71b7053SJung-uk Kim return 1; 3453e71b7053SJung-uk Kim } 3454e71b7053SJung-uk Kim 3455e71b7053SJung-uk Kim WORK_STATE tls_prepare_client_certificate(SSL *s, WORK_STATE wst) 3456e71b7053SJung-uk Kim { 3457e71b7053SJung-uk Kim X509 *x509 = NULL; 3458e71b7053SJung-uk Kim EVP_PKEY *pkey = NULL; 3459e71b7053SJung-uk Kim int i; 3460e71b7053SJung-uk Kim 3461e71b7053SJung-uk Kim if (wst == WORK_MORE_A) { 3462e71b7053SJung-uk Kim /* Let cert callback update client certificates if required */ 3463e71b7053SJung-uk Kim if (s->cert->cert_cb) { 3464e71b7053SJung-uk Kim i = s->cert->cert_cb(s, s->cert->cert_cb_arg); 3465e71b7053SJung-uk Kim if (i < 0) { 3466e71b7053SJung-uk Kim s->rwstate = SSL_X509_LOOKUP; 3467e71b7053SJung-uk Kim return WORK_MORE_A; 3468e71b7053SJung-uk Kim } 3469e71b7053SJung-uk Kim if (i == 0) { 3470e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_INTERNAL_ERROR, 3471e71b7053SJung-uk Kim SSL_F_TLS_PREPARE_CLIENT_CERTIFICATE, 3472e71b7053SJung-uk Kim SSL_R_CALLBACK_FAILED); 3473e71b7053SJung-uk Kim return WORK_ERROR; 3474e71b7053SJung-uk Kim } 3475e71b7053SJung-uk Kim s->rwstate = SSL_NOTHING; 3476e71b7053SJung-uk Kim } 3477e71b7053SJung-uk Kim if (ssl3_check_client_certificate(s)) { 3478e71b7053SJung-uk Kim if (s->post_handshake_auth == SSL_PHA_REQUESTED) { 3479e71b7053SJung-uk Kim return WORK_FINISHED_STOP; 3480e71b7053SJung-uk Kim } 3481e71b7053SJung-uk Kim return WORK_FINISHED_CONTINUE; 3482e71b7053SJung-uk Kim } 3483e71b7053SJung-uk Kim 3484e71b7053SJung-uk Kim /* Fall through to WORK_MORE_B */ 3485e71b7053SJung-uk Kim wst = WORK_MORE_B; 3486e71b7053SJung-uk Kim } 3487e71b7053SJung-uk Kim 3488e71b7053SJung-uk Kim /* We need to get a client cert */ 3489e71b7053SJung-uk Kim if (wst == WORK_MORE_B) { 3490e71b7053SJung-uk Kim /* 3491e71b7053SJung-uk Kim * If we get an error, we need to ssl->rwstate=SSL_X509_LOOKUP; 3492e71b7053SJung-uk Kim * return(-1); We then get retied later 3493e71b7053SJung-uk Kim */ 3494e71b7053SJung-uk Kim i = ssl_do_client_cert_cb(s, &x509, &pkey); 3495e71b7053SJung-uk Kim if (i < 0) { 3496e71b7053SJung-uk Kim s->rwstate = SSL_X509_LOOKUP; 3497e71b7053SJung-uk Kim return WORK_MORE_B; 3498e71b7053SJung-uk Kim } 3499e71b7053SJung-uk Kim s->rwstate = SSL_NOTHING; 3500e71b7053SJung-uk Kim if ((i == 1) && (pkey != NULL) && (x509 != NULL)) { 3501e71b7053SJung-uk Kim if (!SSL_use_certificate(s, x509) || !SSL_use_PrivateKey(s, pkey)) 3502e71b7053SJung-uk Kim i = 0; 3503e71b7053SJung-uk Kim } else if (i == 1) { 3504e71b7053SJung-uk Kim i = 0; 3505e71b7053SJung-uk Kim SSLerr(SSL_F_TLS_PREPARE_CLIENT_CERTIFICATE, 3506e71b7053SJung-uk Kim SSL_R_BAD_DATA_RETURNED_BY_CALLBACK); 3507e71b7053SJung-uk Kim } 3508e71b7053SJung-uk Kim 3509e71b7053SJung-uk Kim X509_free(x509); 3510e71b7053SJung-uk Kim EVP_PKEY_free(pkey); 3511e71b7053SJung-uk Kim if (i && !ssl3_check_client_certificate(s)) 3512e71b7053SJung-uk Kim i = 0; 3513e71b7053SJung-uk Kim if (i == 0) { 3514e71b7053SJung-uk Kim if (s->version == SSL3_VERSION) { 3515e71b7053SJung-uk Kim s->s3->tmp.cert_req = 0; 3516e71b7053SJung-uk Kim ssl3_send_alert(s, SSL3_AL_WARNING, SSL_AD_NO_CERTIFICATE); 3517e71b7053SJung-uk Kim return WORK_FINISHED_CONTINUE; 3518e71b7053SJung-uk Kim } else { 3519e71b7053SJung-uk Kim s->s3->tmp.cert_req = 2; 3520e71b7053SJung-uk Kim if (!ssl3_digest_cached_records(s, 0)) { 3521e71b7053SJung-uk Kim /* SSLfatal() already called */ 3522e71b7053SJung-uk Kim return WORK_ERROR; 3523e71b7053SJung-uk Kim } 3524e71b7053SJung-uk Kim } 3525e71b7053SJung-uk Kim } 3526e71b7053SJung-uk Kim 3527e71b7053SJung-uk Kim if (s->post_handshake_auth == SSL_PHA_REQUESTED) 3528e71b7053SJung-uk Kim return WORK_FINISHED_STOP; 3529e71b7053SJung-uk Kim return WORK_FINISHED_CONTINUE; 3530e71b7053SJung-uk Kim } 3531e71b7053SJung-uk Kim 3532e71b7053SJung-uk Kim /* Shouldn't ever get here */ 3533e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_TLS_PREPARE_CLIENT_CERTIFICATE, 3534e71b7053SJung-uk Kim ERR_R_INTERNAL_ERROR); 3535e71b7053SJung-uk Kim return WORK_ERROR; 3536e71b7053SJung-uk Kim } 3537e71b7053SJung-uk Kim 3538e71b7053SJung-uk Kim int tls_construct_client_certificate(SSL *s, WPACKET *pkt) 3539e71b7053SJung-uk Kim { 3540e71b7053SJung-uk Kim if (SSL_IS_TLS13(s)) { 3541e71b7053SJung-uk Kim if (s->pha_context == NULL) { 3542e71b7053SJung-uk Kim /* no context available, add 0-length context */ 3543e71b7053SJung-uk Kim if (!WPACKET_put_bytes_u8(pkt, 0)) { 3544e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_INTERNAL_ERROR, 3545e71b7053SJung-uk Kim SSL_F_TLS_CONSTRUCT_CLIENT_CERTIFICATE, ERR_R_INTERNAL_ERROR); 3546e71b7053SJung-uk Kim return 0; 3547e71b7053SJung-uk Kim } 3548e71b7053SJung-uk Kim } else if (!WPACKET_sub_memcpy_u8(pkt, s->pha_context, s->pha_context_len)) { 3549e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_INTERNAL_ERROR, 3550e71b7053SJung-uk Kim SSL_F_TLS_CONSTRUCT_CLIENT_CERTIFICATE, ERR_R_INTERNAL_ERROR); 3551e71b7053SJung-uk Kim return 0; 3552e71b7053SJung-uk Kim } 3553e71b7053SJung-uk Kim } 3554e71b7053SJung-uk Kim if (!ssl3_output_cert_chain(s, pkt, 3555e71b7053SJung-uk Kim (s->s3->tmp.cert_req == 2) ? NULL 3556e71b7053SJung-uk Kim : s->cert->key)) { 3557e71b7053SJung-uk Kim /* SSLfatal() already called */ 3558e71b7053SJung-uk Kim return 0; 3559e71b7053SJung-uk Kim } 3560e71b7053SJung-uk Kim 3561e71b7053SJung-uk Kim if (SSL_IS_TLS13(s) 3562e71b7053SJung-uk Kim && SSL_IS_FIRST_HANDSHAKE(s) 3563e71b7053SJung-uk Kim && (!s->method->ssl3_enc->change_cipher_state(s, 3564e71b7053SJung-uk Kim SSL3_CC_HANDSHAKE | SSL3_CHANGE_CIPHER_CLIENT_WRITE))) { 3565e71b7053SJung-uk Kim /* 3566e71b7053SJung-uk Kim * This is a fatal error, which leaves enc_write_ctx in an inconsistent 3567e71b7053SJung-uk Kim * state and thus ssl3_send_alert may crash. 3568e71b7053SJung-uk Kim */ 3569e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_NO_ALERT, SSL_F_TLS_CONSTRUCT_CLIENT_CERTIFICATE, 3570e71b7053SJung-uk Kim SSL_R_CANNOT_CHANGE_CIPHER); 3571e71b7053SJung-uk Kim return 0; 3572e71b7053SJung-uk Kim } 3573e71b7053SJung-uk Kim 3574e71b7053SJung-uk Kim return 1; 3575e71b7053SJung-uk Kim } 3576e71b7053SJung-uk Kim 3577e71b7053SJung-uk Kim int ssl3_check_cert_and_algorithm(SSL *s) 3578e71b7053SJung-uk Kim { 3579e71b7053SJung-uk Kim const SSL_CERT_LOOKUP *clu; 3580e71b7053SJung-uk Kim size_t idx; 3581e71b7053SJung-uk Kim long alg_k, alg_a; 3582e71b7053SJung-uk Kim 3583e71b7053SJung-uk Kim alg_k = s->s3->tmp.new_cipher->algorithm_mkey; 3584e71b7053SJung-uk Kim alg_a = s->s3->tmp.new_cipher->algorithm_auth; 3585e71b7053SJung-uk Kim 3586e71b7053SJung-uk Kim /* we don't have a certificate */ 3587e71b7053SJung-uk Kim if (!(alg_a & SSL_aCERT)) 3588e71b7053SJung-uk Kim return 1; 3589e71b7053SJung-uk Kim 3590e71b7053SJung-uk Kim /* This is the passed certificate */ 3591e71b7053SJung-uk Kim clu = ssl_cert_lookup_by_pkey(X509_get0_pubkey(s->session->peer), &idx); 3592e71b7053SJung-uk Kim 3593e71b7053SJung-uk Kim /* Check certificate is recognised and suitable for cipher */ 3594e71b7053SJung-uk Kim if (clu == NULL || (alg_a & clu->amask) == 0) { 3595e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_HANDSHAKE_FAILURE, 3596e71b7053SJung-uk Kim SSL_F_SSL3_CHECK_CERT_AND_ALGORITHM, 3597e71b7053SJung-uk Kim SSL_R_MISSING_SIGNING_CERT); 3598e71b7053SJung-uk Kim return 0; 3599e71b7053SJung-uk Kim } 3600e71b7053SJung-uk Kim 3601e71b7053SJung-uk Kim #ifndef OPENSSL_NO_EC 3602e71b7053SJung-uk Kim if (clu->amask & SSL_aECDSA) { 3603e71b7053SJung-uk Kim if (ssl_check_srvr_ecc_cert_and_alg(s->session->peer, s)) 3604e71b7053SJung-uk Kim return 1; 3605e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_HANDSHAKE_FAILURE, 3606e71b7053SJung-uk Kim SSL_F_SSL3_CHECK_CERT_AND_ALGORITHM, SSL_R_BAD_ECC_CERT); 3607e71b7053SJung-uk Kim return 0; 3608e71b7053SJung-uk Kim } 3609e71b7053SJung-uk Kim #endif 3610e71b7053SJung-uk Kim #ifndef OPENSSL_NO_RSA 3611e71b7053SJung-uk Kim if (alg_k & (SSL_kRSA | SSL_kRSAPSK) && idx != SSL_PKEY_RSA) { 3612e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_HANDSHAKE_FAILURE, 3613e71b7053SJung-uk Kim SSL_F_SSL3_CHECK_CERT_AND_ALGORITHM, 3614e71b7053SJung-uk Kim SSL_R_MISSING_RSA_ENCRYPTING_CERT); 3615e71b7053SJung-uk Kim return 0; 3616e71b7053SJung-uk Kim } 3617e71b7053SJung-uk Kim #endif 3618e71b7053SJung-uk Kim #ifndef OPENSSL_NO_DH 3619e71b7053SJung-uk Kim if ((alg_k & SSL_kDHE) && (s->s3->peer_tmp == NULL)) { 3620e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_SSL3_CHECK_CERT_AND_ALGORITHM, 3621e71b7053SJung-uk Kim ERR_R_INTERNAL_ERROR); 3622e71b7053SJung-uk Kim return 0; 3623e71b7053SJung-uk Kim } 3624e71b7053SJung-uk Kim #endif 3625e71b7053SJung-uk Kim 3626e71b7053SJung-uk Kim return 1; 3627e71b7053SJung-uk Kim } 3628e71b7053SJung-uk Kim 3629e71b7053SJung-uk Kim #ifndef OPENSSL_NO_NEXTPROTONEG 3630e71b7053SJung-uk Kim int tls_construct_next_proto(SSL *s, WPACKET *pkt) 3631e71b7053SJung-uk Kim { 3632e71b7053SJung-uk Kim size_t len, padding_len; 3633e71b7053SJung-uk Kim unsigned char *padding = NULL; 3634e71b7053SJung-uk Kim 3635e71b7053SJung-uk Kim len = s->ext.npn_len; 3636e71b7053SJung-uk Kim padding_len = 32 - ((len + 2) % 32); 3637e71b7053SJung-uk Kim 3638e71b7053SJung-uk Kim if (!WPACKET_sub_memcpy_u8(pkt, s->ext.npn, len) 3639e71b7053SJung-uk Kim || !WPACKET_sub_allocate_bytes_u8(pkt, padding_len, &padding)) { 3640e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_TLS_CONSTRUCT_NEXT_PROTO, 3641e71b7053SJung-uk Kim ERR_R_INTERNAL_ERROR); 3642e71b7053SJung-uk Kim return 0; 3643e71b7053SJung-uk Kim } 3644e71b7053SJung-uk Kim 3645e71b7053SJung-uk Kim memset(padding, 0, padding_len); 3646e71b7053SJung-uk Kim 3647e71b7053SJung-uk Kim return 1; 3648e71b7053SJung-uk Kim } 3649e71b7053SJung-uk Kim #endif 3650e71b7053SJung-uk Kim 3651e71b7053SJung-uk Kim MSG_PROCESS_RETURN tls_process_hello_req(SSL *s, PACKET *pkt) 3652e71b7053SJung-uk Kim { 3653e71b7053SJung-uk Kim if (PACKET_remaining(pkt) > 0) { 3654e71b7053SJung-uk Kim /* should contain no data */ 3655e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_DECODE_ERROR, SSL_F_TLS_PROCESS_HELLO_REQ, 3656e71b7053SJung-uk Kim SSL_R_LENGTH_MISMATCH); 3657e71b7053SJung-uk Kim return MSG_PROCESS_ERROR; 3658e71b7053SJung-uk Kim } 3659e71b7053SJung-uk Kim 3660e71b7053SJung-uk Kim if ((s->options & SSL_OP_NO_RENEGOTIATION)) { 3661e71b7053SJung-uk Kim ssl3_send_alert(s, SSL3_AL_WARNING, SSL_AD_NO_RENEGOTIATION); 3662e71b7053SJung-uk Kim return MSG_PROCESS_FINISHED_READING; 3663e71b7053SJung-uk Kim } 3664e71b7053SJung-uk Kim 3665e71b7053SJung-uk Kim /* 3666e71b7053SJung-uk Kim * This is a historical discrepancy (not in the RFC) maintained for 3667e71b7053SJung-uk Kim * compatibility reasons. If a TLS client receives a HelloRequest it will 3668e71b7053SJung-uk Kim * attempt an abbreviated handshake. However if a DTLS client receives a 3669e71b7053SJung-uk Kim * HelloRequest it will do a full handshake. Either behaviour is reasonable 3670e71b7053SJung-uk Kim * but doing one for TLS and another for DTLS is odd. 3671e71b7053SJung-uk Kim */ 3672e71b7053SJung-uk Kim if (SSL_IS_DTLS(s)) 3673e71b7053SJung-uk Kim SSL_renegotiate(s); 3674e71b7053SJung-uk Kim else 3675e71b7053SJung-uk Kim SSL_renegotiate_abbreviated(s); 3676e71b7053SJung-uk Kim 3677e71b7053SJung-uk Kim return MSG_PROCESS_FINISHED_READING; 3678e71b7053SJung-uk Kim } 3679e71b7053SJung-uk Kim 3680e71b7053SJung-uk Kim static MSG_PROCESS_RETURN tls_process_encrypted_extensions(SSL *s, PACKET *pkt) 3681e71b7053SJung-uk Kim { 3682e71b7053SJung-uk Kim PACKET extensions; 3683e71b7053SJung-uk Kim RAW_EXTENSION *rawexts = NULL; 3684e71b7053SJung-uk Kim 3685e71b7053SJung-uk Kim if (!PACKET_as_length_prefixed_2(pkt, &extensions) 3686e71b7053SJung-uk Kim || PACKET_remaining(pkt) != 0) { 3687e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_DECODE_ERROR, SSL_F_TLS_PROCESS_ENCRYPTED_EXTENSIONS, 3688e71b7053SJung-uk Kim SSL_R_LENGTH_MISMATCH); 3689e71b7053SJung-uk Kim goto err; 3690e71b7053SJung-uk Kim } 3691e71b7053SJung-uk Kim 3692e71b7053SJung-uk Kim if (!tls_collect_extensions(s, &extensions, 3693e71b7053SJung-uk Kim SSL_EXT_TLS1_3_ENCRYPTED_EXTENSIONS, &rawexts, 3694e71b7053SJung-uk Kim NULL, 1) 3695e71b7053SJung-uk Kim || !tls_parse_all_extensions(s, SSL_EXT_TLS1_3_ENCRYPTED_EXTENSIONS, 3696e71b7053SJung-uk Kim rawexts, NULL, 0, 1)) { 3697e71b7053SJung-uk Kim /* SSLfatal() already called */ 3698e71b7053SJung-uk Kim goto err; 3699e71b7053SJung-uk Kim } 3700e71b7053SJung-uk Kim 3701e71b7053SJung-uk Kim OPENSSL_free(rawexts); 3702e71b7053SJung-uk Kim return MSG_PROCESS_CONTINUE_READING; 3703e71b7053SJung-uk Kim 3704e71b7053SJung-uk Kim err: 3705e71b7053SJung-uk Kim OPENSSL_free(rawexts); 3706e71b7053SJung-uk Kim return MSG_PROCESS_ERROR; 3707e71b7053SJung-uk Kim } 3708e71b7053SJung-uk Kim 3709e71b7053SJung-uk Kim int ssl_do_client_cert_cb(SSL *s, X509 **px509, EVP_PKEY **ppkey) 3710e71b7053SJung-uk Kim { 3711e71b7053SJung-uk Kim int i = 0; 3712e71b7053SJung-uk Kim #ifndef OPENSSL_NO_ENGINE 3713e71b7053SJung-uk Kim if (s->ctx->client_cert_engine) { 3714e71b7053SJung-uk Kim i = ENGINE_load_ssl_client_cert(s->ctx->client_cert_engine, s, 3715e71b7053SJung-uk Kim SSL_get_client_CA_list(s), 3716e71b7053SJung-uk Kim px509, ppkey, NULL, NULL, NULL); 3717e71b7053SJung-uk Kim if (i != 0) 3718e71b7053SJung-uk Kim return i; 3719e71b7053SJung-uk Kim } 3720e71b7053SJung-uk Kim #endif 3721e71b7053SJung-uk Kim if (s->ctx->client_cert_cb) 3722e71b7053SJung-uk Kim i = s->ctx->client_cert_cb(s, px509, ppkey); 3723e71b7053SJung-uk Kim return i; 3724e71b7053SJung-uk Kim } 3725e71b7053SJung-uk Kim 3726e71b7053SJung-uk Kim int ssl_cipher_list_to_bytes(SSL *s, STACK_OF(SSL_CIPHER) *sk, WPACKET *pkt) 3727e71b7053SJung-uk Kim { 3728e71b7053SJung-uk Kim int i; 3729e71b7053SJung-uk Kim size_t totlen = 0, len, maxlen, maxverok = 0; 3730e71b7053SJung-uk Kim int empty_reneg_info_scsv = !s->renegotiate; 3731e71b7053SJung-uk Kim 3732e71b7053SJung-uk Kim /* Set disabled masks for this session */ 3733e71b7053SJung-uk Kim if (!ssl_set_client_disabled(s)) { 3734e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_SSL_CIPHER_LIST_TO_BYTES, 3735e71b7053SJung-uk Kim SSL_R_NO_PROTOCOLS_AVAILABLE); 3736e71b7053SJung-uk Kim return 0; 3737e71b7053SJung-uk Kim } 3738e71b7053SJung-uk Kim 3739e71b7053SJung-uk Kim if (sk == NULL) { 3740e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_SSL_CIPHER_LIST_TO_BYTES, 3741e71b7053SJung-uk Kim ERR_R_INTERNAL_ERROR); 3742e71b7053SJung-uk Kim return 0; 3743e71b7053SJung-uk Kim } 3744e71b7053SJung-uk Kim 3745e71b7053SJung-uk Kim #ifdef OPENSSL_MAX_TLS1_2_CIPHER_LENGTH 3746e71b7053SJung-uk Kim # if OPENSSL_MAX_TLS1_2_CIPHER_LENGTH < 6 3747e71b7053SJung-uk Kim # error Max cipher length too short 3748e71b7053SJung-uk Kim # endif 3749e71b7053SJung-uk Kim /* 3750e71b7053SJung-uk Kim * Some servers hang if client hello > 256 bytes as hack workaround 3751e71b7053SJung-uk Kim * chop number of supported ciphers to keep it well below this if we 3752e71b7053SJung-uk Kim * use TLS v1.2 3753e71b7053SJung-uk Kim */ 3754e71b7053SJung-uk Kim if (TLS1_get_version(s) >= TLS1_2_VERSION) 3755e71b7053SJung-uk Kim maxlen = OPENSSL_MAX_TLS1_2_CIPHER_LENGTH & ~1; 3756e71b7053SJung-uk Kim else 3757e71b7053SJung-uk Kim #endif 3758e71b7053SJung-uk Kim /* Maximum length that can be stored in 2 bytes. Length must be even */ 3759e71b7053SJung-uk Kim maxlen = 0xfffe; 3760e71b7053SJung-uk Kim 3761e71b7053SJung-uk Kim if (empty_reneg_info_scsv) 3762e71b7053SJung-uk Kim maxlen -= 2; 3763e71b7053SJung-uk Kim if (s->mode & SSL_MODE_SEND_FALLBACK_SCSV) 3764e71b7053SJung-uk Kim maxlen -= 2; 3765e71b7053SJung-uk Kim 3766e71b7053SJung-uk Kim for (i = 0; i < sk_SSL_CIPHER_num(sk) && totlen < maxlen; i++) { 3767e71b7053SJung-uk Kim const SSL_CIPHER *c; 3768e71b7053SJung-uk Kim 3769e71b7053SJung-uk Kim c = sk_SSL_CIPHER_value(sk, i); 3770e71b7053SJung-uk Kim /* Skip disabled ciphers */ 3771e71b7053SJung-uk Kim if (ssl_cipher_disabled(s, c, SSL_SECOP_CIPHER_SUPPORTED, 0)) 3772e71b7053SJung-uk Kim continue; 3773e71b7053SJung-uk Kim 3774e71b7053SJung-uk Kim if (!s->method->put_cipher_by_char(c, pkt, &len)) { 3775e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_SSL_CIPHER_LIST_TO_BYTES, 3776e71b7053SJung-uk Kim ERR_R_INTERNAL_ERROR); 3777e71b7053SJung-uk Kim return 0; 3778e71b7053SJung-uk Kim } 3779e71b7053SJung-uk Kim 3780e71b7053SJung-uk Kim /* Sanity check that the maximum version we offer has ciphers enabled */ 3781e71b7053SJung-uk Kim if (!maxverok) { 3782e71b7053SJung-uk Kim if (SSL_IS_DTLS(s)) { 3783e71b7053SJung-uk Kim if (DTLS_VERSION_GE(c->max_dtls, s->s3->tmp.max_ver) 3784e71b7053SJung-uk Kim && DTLS_VERSION_LE(c->min_dtls, s->s3->tmp.max_ver)) 3785e71b7053SJung-uk Kim maxverok = 1; 3786e71b7053SJung-uk Kim } else { 3787e71b7053SJung-uk Kim if (c->max_tls >= s->s3->tmp.max_ver 3788e71b7053SJung-uk Kim && c->min_tls <= s->s3->tmp.max_ver) 3789e71b7053SJung-uk Kim maxverok = 1; 3790e71b7053SJung-uk Kim } 3791e71b7053SJung-uk Kim } 3792e71b7053SJung-uk Kim 3793e71b7053SJung-uk Kim totlen += len; 3794e71b7053SJung-uk Kim } 3795e71b7053SJung-uk Kim 3796e71b7053SJung-uk Kim if (totlen == 0 || !maxverok) { 3797e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_SSL_CIPHER_LIST_TO_BYTES, 3798e71b7053SJung-uk Kim SSL_R_NO_CIPHERS_AVAILABLE); 3799e71b7053SJung-uk Kim 3800e71b7053SJung-uk Kim if (!maxverok) 3801e71b7053SJung-uk Kim ERR_add_error_data(1, "No ciphers enabled for max supported " 3802e71b7053SJung-uk Kim "SSL/TLS version"); 3803e71b7053SJung-uk Kim 3804e71b7053SJung-uk Kim return 0; 3805e71b7053SJung-uk Kim } 3806e71b7053SJung-uk Kim 3807e71b7053SJung-uk Kim if (totlen != 0) { 3808e71b7053SJung-uk Kim if (empty_reneg_info_scsv) { 3809e71b7053SJung-uk Kim static SSL_CIPHER scsv = { 3810e71b7053SJung-uk Kim 0, NULL, NULL, SSL3_CK_SCSV, 0, 0, 0, 0, 0, 0, 0, 0, 0 3811e71b7053SJung-uk Kim }; 3812e71b7053SJung-uk Kim if (!s->method->put_cipher_by_char(&scsv, pkt, &len)) { 3813e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_INTERNAL_ERROR, 3814e71b7053SJung-uk Kim SSL_F_SSL_CIPHER_LIST_TO_BYTES, ERR_R_INTERNAL_ERROR); 3815e71b7053SJung-uk Kim return 0; 3816e71b7053SJung-uk Kim } 3817e71b7053SJung-uk Kim } 3818e71b7053SJung-uk Kim if (s->mode & SSL_MODE_SEND_FALLBACK_SCSV) { 3819e71b7053SJung-uk Kim static SSL_CIPHER scsv = { 3820e71b7053SJung-uk Kim 0, NULL, NULL, SSL3_CK_FALLBACK_SCSV, 0, 0, 0, 0, 0, 0, 0, 0, 0 3821e71b7053SJung-uk Kim }; 3822e71b7053SJung-uk Kim if (!s->method->put_cipher_by_char(&scsv, pkt, &len)) { 3823e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_INTERNAL_ERROR, 3824e71b7053SJung-uk Kim SSL_F_SSL_CIPHER_LIST_TO_BYTES, ERR_R_INTERNAL_ERROR); 3825e71b7053SJung-uk Kim return 0; 3826e71b7053SJung-uk Kim } 3827e71b7053SJung-uk Kim } 3828e71b7053SJung-uk Kim } 3829e71b7053SJung-uk Kim 3830e71b7053SJung-uk Kim return 1; 3831e71b7053SJung-uk Kim } 3832e71b7053SJung-uk Kim 3833e71b7053SJung-uk Kim int tls_construct_end_of_early_data(SSL *s, WPACKET *pkt) 3834e71b7053SJung-uk Kim { 3835e71b7053SJung-uk Kim if (s->early_data_state != SSL_EARLY_DATA_WRITE_RETRY 3836e71b7053SJung-uk Kim && s->early_data_state != SSL_EARLY_DATA_FINISHED_WRITING) { 3837e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_INTERNAL_ERROR, 3838e71b7053SJung-uk Kim SSL_F_TLS_CONSTRUCT_END_OF_EARLY_DATA, 3839e71b7053SJung-uk Kim ERR_R_SHOULD_NOT_HAVE_BEEN_CALLED); 3840e71b7053SJung-uk Kim return 0; 3841e71b7053SJung-uk Kim } 3842e71b7053SJung-uk Kim 3843e71b7053SJung-uk Kim s->early_data_state = SSL_EARLY_DATA_FINISHED_WRITING; 3844e71b7053SJung-uk Kim return 1; 3845e71b7053SJung-uk Kim } 3846