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