xref: /freebsd/crypto/openssl/ssl/statem/extensions_srvr.c (revision e71b70530d95c4f34d8bdbd78d1242df1ba4a945)
1*e71b7053SJung-uk Kim /*
2*e71b7053SJung-uk Kim  * Copyright 2016-2018 The OpenSSL Project Authors. All Rights Reserved.
3*e71b7053SJung-uk Kim  *
4*e71b7053SJung-uk Kim  * Licensed under the OpenSSL license (the "License").  You may not use
5*e71b7053SJung-uk Kim  * this file except in compliance with the License.  You can obtain a copy
6*e71b7053SJung-uk Kim  * in the file LICENSE in the source distribution or at
7*e71b7053SJung-uk Kim  * https://www.openssl.org/source/license.html
8*e71b7053SJung-uk Kim  */
9*e71b7053SJung-uk Kim 
10*e71b7053SJung-uk Kim #include <openssl/ocsp.h>
11*e71b7053SJung-uk Kim #include "../ssl_locl.h"
12*e71b7053SJung-uk Kim #include "statem_locl.h"
13*e71b7053SJung-uk Kim #include "internal/cryptlib.h"
14*e71b7053SJung-uk Kim 
15*e71b7053SJung-uk Kim #define COOKIE_STATE_FORMAT_VERSION     0
16*e71b7053SJung-uk Kim 
17*e71b7053SJung-uk Kim /*
18*e71b7053SJung-uk Kim  * 2 bytes for packet length, 2 bytes for format version, 2 bytes for
19*e71b7053SJung-uk Kim  * protocol version, 2 bytes for group id, 2 bytes for cipher id, 1 byte for
20*e71b7053SJung-uk Kim  * key_share present flag, 4 bytes for timestamp, 2 bytes for the hashlen,
21*e71b7053SJung-uk Kim  * EVP_MAX_MD_SIZE for transcript hash, 1 byte for app cookie length, app cookie
22*e71b7053SJung-uk Kim  * length bytes, SHA256_DIGEST_LENGTH bytes for the HMAC of the whole thing.
23*e71b7053SJung-uk Kim  */
24*e71b7053SJung-uk Kim #define MAX_COOKIE_SIZE (2 + 2 + 2 + 2 + 2 + 1 + 4 + 2 + EVP_MAX_MD_SIZE + 1 \
25*e71b7053SJung-uk Kim                          + SSL_COOKIE_LENGTH + SHA256_DIGEST_LENGTH)
26*e71b7053SJung-uk Kim 
27*e71b7053SJung-uk Kim /*
28*e71b7053SJung-uk Kim  * Message header + 2 bytes for protocol version + number of random bytes +
29*e71b7053SJung-uk Kim  * + 1 byte for legacy session id length + number of bytes in legacy session id
30*e71b7053SJung-uk Kim  * + 2 bytes for ciphersuite + 1 byte for legacy compression
31*e71b7053SJung-uk Kim  * + 2 bytes for extension block length + 6 bytes for key_share extension
32*e71b7053SJung-uk Kim  * + 4 bytes for cookie extension header + the number of bytes in the cookie
33*e71b7053SJung-uk Kim  */
34*e71b7053SJung-uk Kim #define MAX_HRR_SIZE    (SSL3_HM_HEADER_LENGTH + 2 + SSL3_RANDOM_SIZE + 1 \
35*e71b7053SJung-uk Kim                          + SSL_MAX_SSL_SESSION_ID_LENGTH + 2 + 1 + 2 + 6 + 4 \
36*e71b7053SJung-uk Kim                          + MAX_COOKIE_SIZE)
37*e71b7053SJung-uk Kim 
38*e71b7053SJung-uk Kim /*
39*e71b7053SJung-uk Kim  * Parse the client's renegotiation binding and abort if it's not right
40*e71b7053SJung-uk Kim  */
41*e71b7053SJung-uk Kim int tls_parse_ctos_renegotiate(SSL *s, PACKET *pkt, unsigned int context,
42*e71b7053SJung-uk Kim                                X509 *x, size_t chainidx)
43*e71b7053SJung-uk Kim {
44*e71b7053SJung-uk Kim     unsigned int ilen;
45*e71b7053SJung-uk Kim     const unsigned char *data;
46*e71b7053SJung-uk Kim 
47*e71b7053SJung-uk Kim     /* Parse the length byte */
48*e71b7053SJung-uk Kim     if (!PACKET_get_1(pkt, &ilen)
49*e71b7053SJung-uk Kim         || !PACKET_get_bytes(pkt, &data, ilen)) {
50*e71b7053SJung-uk Kim         SSLfatal(s, SSL_AD_DECODE_ERROR, SSL_F_TLS_PARSE_CTOS_RENEGOTIATE,
51*e71b7053SJung-uk Kim                  SSL_R_RENEGOTIATION_ENCODING_ERR);
52*e71b7053SJung-uk Kim         return 0;
53*e71b7053SJung-uk Kim     }
54*e71b7053SJung-uk Kim 
55*e71b7053SJung-uk Kim     /* Check that the extension matches */
56*e71b7053SJung-uk Kim     if (ilen != s->s3->previous_client_finished_len) {
57*e71b7053SJung-uk Kim         SSLfatal(s, SSL_AD_HANDSHAKE_FAILURE, SSL_F_TLS_PARSE_CTOS_RENEGOTIATE,
58*e71b7053SJung-uk Kim                  SSL_R_RENEGOTIATION_MISMATCH);
59*e71b7053SJung-uk Kim         return 0;
60*e71b7053SJung-uk Kim     }
61*e71b7053SJung-uk Kim 
62*e71b7053SJung-uk Kim     if (memcmp(data, s->s3->previous_client_finished,
63*e71b7053SJung-uk Kim                s->s3->previous_client_finished_len)) {
64*e71b7053SJung-uk Kim         SSLfatal(s, SSL_AD_HANDSHAKE_FAILURE, SSL_F_TLS_PARSE_CTOS_RENEGOTIATE,
65*e71b7053SJung-uk Kim                  SSL_R_RENEGOTIATION_MISMATCH);
66*e71b7053SJung-uk Kim         return 0;
67*e71b7053SJung-uk Kim     }
68*e71b7053SJung-uk Kim 
69*e71b7053SJung-uk Kim     s->s3->send_connection_binding = 1;
70*e71b7053SJung-uk Kim 
71*e71b7053SJung-uk Kim     return 1;
72*e71b7053SJung-uk Kim }
73*e71b7053SJung-uk Kim 
74*e71b7053SJung-uk Kim /*-
75*e71b7053SJung-uk Kim  * The servername extension is treated as follows:
76*e71b7053SJung-uk Kim  *
77*e71b7053SJung-uk Kim  * - Only the hostname type is supported with a maximum length of 255.
78*e71b7053SJung-uk Kim  * - The servername is rejected if too long or if it contains zeros,
79*e71b7053SJung-uk Kim  *   in which case an fatal alert is generated.
80*e71b7053SJung-uk Kim  * - The servername field is maintained together with the session cache.
81*e71b7053SJung-uk Kim  * - When a session is resumed, the servername call back invoked in order
82*e71b7053SJung-uk Kim  *   to allow the application to position itself to the right context.
83*e71b7053SJung-uk Kim  * - The servername is acknowledged if it is new for a session or when
84*e71b7053SJung-uk Kim  *   it is identical to a previously used for the same session.
85*e71b7053SJung-uk Kim  *   Applications can control the behaviour.  They can at any time
86*e71b7053SJung-uk Kim  *   set a 'desirable' servername for a new SSL object. This can be the
87*e71b7053SJung-uk Kim  *   case for example with HTTPS when a Host: header field is received and
88*e71b7053SJung-uk Kim  *   a renegotiation is requested. In this case, a possible servername
89*e71b7053SJung-uk Kim  *   presented in the new client hello is only acknowledged if it matches
90*e71b7053SJung-uk Kim  *   the value of the Host: field.
91*e71b7053SJung-uk Kim  * - Applications must  use SSL_OP_NO_SESSION_RESUMPTION_ON_RENEGOTIATION
92*e71b7053SJung-uk Kim  *   if they provide for changing an explicit servername context for the
93*e71b7053SJung-uk Kim  *   session, i.e. when the session has been established with a servername
94*e71b7053SJung-uk Kim  *   extension.
95*e71b7053SJung-uk Kim  * - On session reconnect, the servername extension may be absent.
96*e71b7053SJung-uk Kim  */
97*e71b7053SJung-uk Kim int tls_parse_ctos_server_name(SSL *s, PACKET *pkt, unsigned int context,
98*e71b7053SJung-uk Kim                                X509 *x, size_t chainidx)
99*e71b7053SJung-uk Kim {
100*e71b7053SJung-uk Kim     unsigned int servname_type;
101*e71b7053SJung-uk Kim     PACKET sni, hostname;
102*e71b7053SJung-uk Kim 
103*e71b7053SJung-uk Kim     if (!PACKET_as_length_prefixed_2(pkt, &sni)
104*e71b7053SJung-uk Kim         /* ServerNameList must be at least 1 byte long. */
105*e71b7053SJung-uk Kim         || PACKET_remaining(&sni) == 0) {
106*e71b7053SJung-uk Kim         SSLfatal(s, SSL_AD_DECODE_ERROR, SSL_F_TLS_PARSE_CTOS_SERVER_NAME,
107*e71b7053SJung-uk Kim                  SSL_R_BAD_EXTENSION);
108*e71b7053SJung-uk Kim         return 0;
109*e71b7053SJung-uk Kim     }
110*e71b7053SJung-uk Kim 
111*e71b7053SJung-uk Kim     /*
112*e71b7053SJung-uk Kim      * Although the intent was for server_name to be extensible, RFC 4366
113*e71b7053SJung-uk Kim      * was not clear about it; and so OpenSSL among other implementations,
114*e71b7053SJung-uk Kim      * always and only allows a 'host_name' name types.
115*e71b7053SJung-uk Kim      * RFC 6066 corrected the mistake but adding new name types
116*e71b7053SJung-uk Kim      * is nevertheless no longer feasible, so act as if no other
117*e71b7053SJung-uk Kim      * SNI types can exist, to simplify parsing.
118*e71b7053SJung-uk Kim      *
119*e71b7053SJung-uk Kim      * Also note that the RFC permits only one SNI value per type,
120*e71b7053SJung-uk Kim      * i.e., we can only have a single hostname.
121*e71b7053SJung-uk Kim      */
122*e71b7053SJung-uk Kim     if (!PACKET_get_1(&sni, &servname_type)
123*e71b7053SJung-uk Kim         || servname_type != TLSEXT_NAMETYPE_host_name
124*e71b7053SJung-uk Kim         || !PACKET_as_length_prefixed_2(&sni, &hostname)) {
125*e71b7053SJung-uk Kim         SSLfatal(s, SSL_AD_DECODE_ERROR, SSL_F_TLS_PARSE_CTOS_SERVER_NAME,
126*e71b7053SJung-uk Kim                  SSL_R_BAD_EXTENSION);
127*e71b7053SJung-uk Kim         return 0;
128*e71b7053SJung-uk Kim     }
129*e71b7053SJung-uk Kim 
130*e71b7053SJung-uk Kim     if (!s->hit || SSL_IS_TLS13(s)) {
131*e71b7053SJung-uk Kim         if (PACKET_remaining(&hostname) > TLSEXT_MAXLEN_host_name) {
132*e71b7053SJung-uk Kim             SSLfatal(s, SSL_AD_UNRECOGNIZED_NAME,
133*e71b7053SJung-uk Kim                      SSL_F_TLS_PARSE_CTOS_SERVER_NAME,
134*e71b7053SJung-uk Kim                      SSL_R_BAD_EXTENSION);
135*e71b7053SJung-uk Kim             return 0;
136*e71b7053SJung-uk Kim         }
137*e71b7053SJung-uk Kim 
138*e71b7053SJung-uk Kim         if (PACKET_contains_zero_byte(&hostname)) {
139*e71b7053SJung-uk Kim             SSLfatal(s, SSL_AD_UNRECOGNIZED_NAME,
140*e71b7053SJung-uk Kim                      SSL_F_TLS_PARSE_CTOS_SERVER_NAME,
141*e71b7053SJung-uk Kim                      SSL_R_BAD_EXTENSION);
142*e71b7053SJung-uk Kim             return 0;
143*e71b7053SJung-uk Kim         }
144*e71b7053SJung-uk Kim 
145*e71b7053SJung-uk Kim         /*
146*e71b7053SJung-uk Kim          * Store the requested SNI in the SSL as temporary storage.
147*e71b7053SJung-uk Kim          * If we accept it, it will get stored in the SSL_SESSION as well.
148*e71b7053SJung-uk Kim          */
149*e71b7053SJung-uk Kim         OPENSSL_free(s->ext.hostname);
150*e71b7053SJung-uk Kim         s->ext.hostname = NULL;
151*e71b7053SJung-uk Kim         if (!PACKET_strndup(&hostname, &s->ext.hostname)) {
152*e71b7053SJung-uk Kim             SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_TLS_PARSE_CTOS_SERVER_NAME,
153*e71b7053SJung-uk Kim                      ERR_R_INTERNAL_ERROR);
154*e71b7053SJung-uk Kim             return 0;
155*e71b7053SJung-uk Kim         }
156*e71b7053SJung-uk Kim 
157*e71b7053SJung-uk Kim         s->servername_done = 1;
158*e71b7053SJung-uk Kim     }
159*e71b7053SJung-uk Kim     if (s->hit) {
160*e71b7053SJung-uk Kim         /*
161*e71b7053SJung-uk Kim          * TODO(openssl-team): if the SNI doesn't match, we MUST
162*e71b7053SJung-uk Kim          * fall back to a full handshake.
163*e71b7053SJung-uk Kim          */
164*e71b7053SJung-uk Kim         s->servername_done = (s->session->ext.hostname != NULL)
165*e71b7053SJung-uk Kim             && PACKET_equal(&hostname, s->session->ext.hostname,
166*e71b7053SJung-uk Kim                             strlen(s->session->ext.hostname));
167*e71b7053SJung-uk Kim 
168*e71b7053SJung-uk Kim         if (!s->servername_done && s->session->ext.hostname != NULL)
169*e71b7053SJung-uk Kim             s->ext.early_data_ok = 0;
170*e71b7053SJung-uk Kim     }
171*e71b7053SJung-uk Kim 
172*e71b7053SJung-uk Kim     return 1;
173*e71b7053SJung-uk Kim }
174*e71b7053SJung-uk Kim 
175*e71b7053SJung-uk Kim int tls_parse_ctos_maxfragmentlen(SSL *s, PACKET *pkt, unsigned int context,
176*e71b7053SJung-uk Kim                                   X509 *x, size_t chainidx)
177*e71b7053SJung-uk Kim {
178*e71b7053SJung-uk Kim     unsigned int value;
179*e71b7053SJung-uk Kim 
180*e71b7053SJung-uk Kim     if (PACKET_remaining(pkt) != 1 || !PACKET_get_1(pkt, &value)) {
181*e71b7053SJung-uk Kim         SSLfatal(s, SSL_AD_DECODE_ERROR, SSL_F_TLS_PARSE_CTOS_MAXFRAGMENTLEN,
182*e71b7053SJung-uk Kim                  SSL_R_BAD_EXTENSION);
183*e71b7053SJung-uk Kim         return 0;
184*e71b7053SJung-uk Kim     }
185*e71b7053SJung-uk Kim 
186*e71b7053SJung-uk Kim     /* Received |value| should be a valid max-fragment-length code. */
187*e71b7053SJung-uk Kim     if (!IS_MAX_FRAGMENT_LENGTH_EXT_VALID(value)) {
188*e71b7053SJung-uk Kim         SSLfatal(s, SSL_AD_ILLEGAL_PARAMETER,
189*e71b7053SJung-uk Kim                  SSL_F_TLS_PARSE_CTOS_MAXFRAGMENTLEN,
190*e71b7053SJung-uk Kim                  SSL_R_SSL3_EXT_INVALID_MAX_FRAGMENT_LENGTH);
191*e71b7053SJung-uk Kim         return 0;
192*e71b7053SJung-uk Kim     }
193*e71b7053SJung-uk Kim 
194*e71b7053SJung-uk Kim     /*
195*e71b7053SJung-uk Kim      * RFC 6066:  The negotiated length applies for the duration of the session
196*e71b7053SJung-uk Kim      * including session resumptions.
197*e71b7053SJung-uk Kim      * We should receive the same code as in resumed session !
198*e71b7053SJung-uk Kim      */
199*e71b7053SJung-uk Kim     if (s->hit && s->session->ext.max_fragment_len_mode != value) {
200*e71b7053SJung-uk Kim         SSLfatal(s, SSL_AD_ILLEGAL_PARAMETER,
201*e71b7053SJung-uk Kim                  SSL_F_TLS_PARSE_CTOS_MAXFRAGMENTLEN,
202*e71b7053SJung-uk Kim                  SSL_R_SSL3_EXT_INVALID_MAX_FRAGMENT_LENGTH);
203*e71b7053SJung-uk Kim         return 0;
204*e71b7053SJung-uk Kim     }
205*e71b7053SJung-uk Kim 
206*e71b7053SJung-uk Kim     /*
207*e71b7053SJung-uk Kim      * Store it in session, so it'll become binding for us
208*e71b7053SJung-uk Kim      * and we'll include it in a next Server Hello.
209*e71b7053SJung-uk Kim      */
210*e71b7053SJung-uk Kim     s->session->ext.max_fragment_len_mode = value;
211*e71b7053SJung-uk Kim     return 1;
212*e71b7053SJung-uk Kim }
213*e71b7053SJung-uk Kim 
214*e71b7053SJung-uk Kim #ifndef OPENSSL_NO_SRP
215*e71b7053SJung-uk Kim int tls_parse_ctos_srp(SSL *s, PACKET *pkt, unsigned int context, X509 *x,
216*e71b7053SJung-uk Kim                        size_t chainidx)
217*e71b7053SJung-uk Kim {
218*e71b7053SJung-uk Kim     PACKET srp_I;
219*e71b7053SJung-uk Kim 
220*e71b7053SJung-uk Kim     if (!PACKET_as_length_prefixed_1(pkt, &srp_I)
221*e71b7053SJung-uk Kim             || PACKET_contains_zero_byte(&srp_I)) {
222*e71b7053SJung-uk Kim         SSLfatal(s, SSL_AD_DECODE_ERROR,
223*e71b7053SJung-uk Kim                  SSL_F_TLS_PARSE_CTOS_SRP,
224*e71b7053SJung-uk Kim                  SSL_R_BAD_EXTENSION);
225*e71b7053SJung-uk Kim         return 0;
226*e71b7053SJung-uk Kim     }
227*e71b7053SJung-uk Kim 
228*e71b7053SJung-uk Kim     /*
229*e71b7053SJung-uk Kim      * TODO(openssl-team): currently, we re-authenticate the user
230*e71b7053SJung-uk Kim      * upon resumption. Instead, we MUST ignore the login.
231*e71b7053SJung-uk Kim      */
232*e71b7053SJung-uk Kim     if (!PACKET_strndup(&srp_I, &s->srp_ctx.login)) {
233*e71b7053SJung-uk Kim         SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_TLS_PARSE_CTOS_SRP,
234*e71b7053SJung-uk Kim                  ERR_R_INTERNAL_ERROR);
235*e71b7053SJung-uk Kim         return 0;
236*e71b7053SJung-uk Kim     }
237*e71b7053SJung-uk Kim 
238*e71b7053SJung-uk Kim     return 1;
239*e71b7053SJung-uk Kim }
240*e71b7053SJung-uk Kim #endif
241*e71b7053SJung-uk Kim 
242*e71b7053SJung-uk Kim #ifndef OPENSSL_NO_EC
243*e71b7053SJung-uk Kim int tls_parse_ctos_ec_pt_formats(SSL *s, PACKET *pkt, unsigned int context,
244*e71b7053SJung-uk Kim                                  X509 *x, size_t chainidx)
245*e71b7053SJung-uk Kim {
246*e71b7053SJung-uk Kim     PACKET ec_point_format_list;
247*e71b7053SJung-uk Kim 
248*e71b7053SJung-uk Kim     if (!PACKET_as_length_prefixed_1(pkt, &ec_point_format_list)
249*e71b7053SJung-uk Kim         || PACKET_remaining(&ec_point_format_list) == 0) {
250*e71b7053SJung-uk Kim         SSLfatal(s, SSL_AD_DECODE_ERROR, SSL_F_TLS_PARSE_CTOS_EC_PT_FORMATS,
251*e71b7053SJung-uk Kim                  SSL_R_BAD_EXTENSION);
252*e71b7053SJung-uk Kim         return 0;
253*e71b7053SJung-uk Kim     }
254*e71b7053SJung-uk Kim 
255*e71b7053SJung-uk Kim     if (!s->hit) {
256*e71b7053SJung-uk Kim         if (!PACKET_memdup(&ec_point_format_list,
257*e71b7053SJung-uk Kim                            &s->session->ext.ecpointformats,
258*e71b7053SJung-uk Kim                            &s->session->ext.ecpointformats_len)) {
259*e71b7053SJung-uk Kim             SSLfatal(s, SSL_AD_INTERNAL_ERROR,
260*e71b7053SJung-uk Kim                      SSL_F_TLS_PARSE_CTOS_EC_PT_FORMATS, ERR_R_INTERNAL_ERROR);
261*e71b7053SJung-uk Kim             return 0;
262*e71b7053SJung-uk Kim         }
263*e71b7053SJung-uk Kim     }
264*e71b7053SJung-uk Kim 
265*e71b7053SJung-uk Kim     return 1;
266*e71b7053SJung-uk Kim }
267*e71b7053SJung-uk Kim #endif                          /* OPENSSL_NO_EC */
268*e71b7053SJung-uk Kim 
269*e71b7053SJung-uk Kim int tls_parse_ctos_session_ticket(SSL *s, PACKET *pkt, unsigned int context,
270*e71b7053SJung-uk Kim                                   X509 *x, size_t chainidx)
271*e71b7053SJung-uk Kim {
272*e71b7053SJung-uk Kim     if (s->ext.session_ticket_cb &&
273*e71b7053SJung-uk Kim             !s->ext.session_ticket_cb(s, PACKET_data(pkt),
274*e71b7053SJung-uk Kim                                   PACKET_remaining(pkt),
275*e71b7053SJung-uk Kim                                   s->ext.session_ticket_cb_arg)) {
276*e71b7053SJung-uk Kim         SSLfatal(s, SSL_AD_INTERNAL_ERROR,
277*e71b7053SJung-uk Kim                  SSL_F_TLS_PARSE_CTOS_SESSION_TICKET, ERR_R_INTERNAL_ERROR);
278*e71b7053SJung-uk Kim         return 0;
279*e71b7053SJung-uk Kim     }
280*e71b7053SJung-uk Kim 
281*e71b7053SJung-uk Kim     return 1;
282*e71b7053SJung-uk Kim }
283*e71b7053SJung-uk Kim 
284*e71b7053SJung-uk Kim int tls_parse_ctos_sig_algs_cert(SSL *s, PACKET *pkt, unsigned int context,
285*e71b7053SJung-uk Kim                                  X509 *x, size_t chainidx)
286*e71b7053SJung-uk Kim {
287*e71b7053SJung-uk Kim     PACKET supported_sig_algs;
288*e71b7053SJung-uk Kim 
289*e71b7053SJung-uk Kim     if (!PACKET_as_length_prefixed_2(pkt, &supported_sig_algs)
290*e71b7053SJung-uk Kim             || PACKET_remaining(&supported_sig_algs) == 0) {
291*e71b7053SJung-uk Kim         SSLfatal(s, SSL_AD_DECODE_ERROR,
292*e71b7053SJung-uk Kim                  SSL_F_TLS_PARSE_CTOS_SIG_ALGS_CERT, SSL_R_BAD_EXTENSION);
293*e71b7053SJung-uk Kim         return 0;
294*e71b7053SJung-uk Kim     }
295*e71b7053SJung-uk Kim 
296*e71b7053SJung-uk Kim     if (!s->hit && !tls1_save_sigalgs(s, &supported_sig_algs, 1)) {
297*e71b7053SJung-uk Kim         SSLfatal(s, SSL_AD_DECODE_ERROR,
298*e71b7053SJung-uk Kim                  SSL_F_TLS_PARSE_CTOS_SIG_ALGS_CERT, SSL_R_BAD_EXTENSION);
299*e71b7053SJung-uk Kim         return 0;
300*e71b7053SJung-uk Kim     }
301*e71b7053SJung-uk Kim 
302*e71b7053SJung-uk Kim     return 1;
303*e71b7053SJung-uk Kim }
304*e71b7053SJung-uk Kim 
305*e71b7053SJung-uk Kim int tls_parse_ctos_sig_algs(SSL *s, PACKET *pkt, unsigned int context, X509 *x,
306*e71b7053SJung-uk Kim                             size_t chainidx)
307*e71b7053SJung-uk Kim {
308*e71b7053SJung-uk Kim     PACKET supported_sig_algs;
309*e71b7053SJung-uk Kim 
310*e71b7053SJung-uk Kim     if (!PACKET_as_length_prefixed_2(pkt, &supported_sig_algs)
311*e71b7053SJung-uk Kim             || PACKET_remaining(&supported_sig_algs) == 0) {
312*e71b7053SJung-uk Kim         SSLfatal(s, SSL_AD_DECODE_ERROR,
313*e71b7053SJung-uk Kim                  SSL_F_TLS_PARSE_CTOS_SIG_ALGS, SSL_R_BAD_EXTENSION);
314*e71b7053SJung-uk Kim         return 0;
315*e71b7053SJung-uk Kim     }
316*e71b7053SJung-uk Kim 
317*e71b7053SJung-uk Kim     if (!s->hit && !tls1_save_sigalgs(s, &supported_sig_algs, 0)) {
318*e71b7053SJung-uk Kim         SSLfatal(s, SSL_AD_DECODE_ERROR,
319*e71b7053SJung-uk Kim                  SSL_F_TLS_PARSE_CTOS_SIG_ALGS, SSL_R_BAD_EXTENSION);
320*e71b7053SJung-uk Kim         return 0;
321*e71b7053SJung-uk Kim     }
322*e71b7053SJung-uk Kim 
323*e71b7053SJung-uk Kim     return 1;
324*e71b7053SJung-uk Kim }
325*e71b7053SJung-uk Kim 
326*e71b7053SJung-uk Kim #ifndef OPENSSL_NO_OCSP
327*e71b7053SJung-uk Kim int tls_parse_ctos_status_request(SSL *s, PACKET *pkt, unsigned int context,
328*e71b7053SJung-uk Kim                                   X509 *x, size_t chainidx)
329*e71b7053SJung-uk Kim {
330*e71b7053SJung-uk Kim     PACKET responder_id_list, exts;
331*e71b7053SJung-uk Kim 
332*e71b7053SJung-uk Kim     /* We ignore this in a resumption handshake */
333*e71b7053SJung-uk Kim     if (s->hit)
334*e71b7053SJung-uk Kim         return 1;
335*e71b7053SJung-uk Kim 
336*e71b7053SJung-uk Kim     /* Not defined if we get one of these in a client Certificate */
337*e71b7053SJung-uk Kim     if (x != NULL)
338*e71b7053SJung-uk Kim         return 1;
339*e71b7053SJung-uk Kim 
340*e71b7053SJung-uk Kim     if (!PACKET_get_1(pkt, (unsigned int *)&s->ext.status_type)) {
341*e71b7053SJung-uk Kim         SSLfatal(s, SSL_AD_DECODE_ERROR,
342*e71b7053SJung-uk Kim                  SSL_F_TLS_PARSE_CTOS_STATUS_REQUEST, SSL_R_BAD_EXTENSION);
343*e71b7053SJung-uk Kim         return 0;
344*e71b7053SJung-uk Kim     }
345*e71b7053SJung-uk Kim 
346*e71b7053SJung-uk Kim     if (s->ext.status_type != TLSEXT_STATUSTYPE_ocsp) {
347*e71b7053SJung-uk Kim         /*
348*e71b7053SJung-uk Kim          * We don't know what to do with any other type so ignore it.
349*e71b7053SJung-uk Kim          */
350*e71b7053SJung-uk Kim         s->ext.status_type = TLSEXT_STATUSTYPE_nothing;
351*e71b7053SJung-uk Kim         return 1;
352*e71b7053SJung-uk Kim     }
353*e71b7053SJung-uk Kim 
354*e71b7053SJung-uk Kim     if (!PACKET_get_length_prefixed_2 (pkt, &responder_id_list)) {
355*e71b7053SJung-uk Kim         SSLfatal(s, SSL_AD_DECODE_ERROR,
356*e71b7053SJung-uk Kim                  SSL_F_TLS_PARSE_CTOS_STATUS_REQUEST, SSL_R_BAD_EXTENSION);
357*e71b7053SJung-uk Kim         return 0;
358*e71b7053SJung-uk Kim     }
359*e71b7053SJung-uk Kim 
360*e71b7053SJung-uk Kim     /*
361*e71b7053SJung-uk Kim      * We remove any OCSP_RESPIDs from a previous handshake
362*e71b7053SJung-uk Kim      * to prevent unbounded memory growth - CVE-2016-6304
363*e71b7053SJung-uk Kim      */
364*e71b7053SJung-uk Kim     sk_OCSP_RESPID_pop_free(s->ext.ocsp.ids, OCSP_RESPID_free);
365*e71b7053SJung-uk Kim     if (PACKET_remaining(&responder_id_list) > 0) {
366*e71b7053SJung-uk Kim         s->ext.ocsp.ids = sk_OCSP_RESPID_new_null();
367*e71b7053SJung-uk Kim         if (s->ext.ocsp.ids == NULL) {
368*e71b7053SJung-uk Kim             SSLfatal(s, SSL_AD_INTERNAL_ERROR,
369*e71b7053SJung-uk Kim                      SSL_F_TLS_PARSE_CTOS_STATUS_REQUEST, ERR_R_MALLOC_FAILURE);
370*e71b7053SJung-uk Kim             return 0;
371*e71b7053SJung-uk Kim         }
372*e71b7053SJung-uk Kim     } else {
373*e71b7053SJung-uk Kim         s->ext.ocsp.ids = NULL;
374*e71b7053SJung-uk Kim     }
375*e71b7053SJung-uk Kim 
376*e71b7053SJung-uk Kim     while (PACKET_remaining(&responder_id_list) > 0) {
377*e71b7053SJung-uk Kim         OCSP_RESPID *id;
378*e71b7053SJung-uk Kim         PACKET responder_id;
379*e71b7053SJung-uk Kim         const unsigned char *id_data;
380*e71b7053SJung-uk Kim 
381*e71b7053SJung-uk Kim         if (!PACKET_get_length_prefixed_2(&responder_id_list, &responder_id)
382*e71b7053SJung-uk Kim                 || PACKET_remaining(&responder_id) == 0) {
383*e71b7053SJung-uk Kim             SSLfatal(s, SSL_AD_DECODE_ERROR,
384*e71b7053SJung-uk Kim                      SSL_F_TLS_PARSE_CTOS_STATUS_REQUEST, SSL_R_BAD_EXTENSION);
385*e71b7053SJung-uk Kim             return 0;
386*e71b7053SJung-uk Kim         }
387*e71b7053SJung-uk Kim 
388*e71b7053SJung-uk Kim         id_data = PACKET_data(&responder_id);
389*e71b7053SJung-uk Kim         /* TODO(size_t): Convert d2i_* to size_t */
390*e71b7053SJung-uk Kim         id = d2i_OCSP_RESPID(NULL, &id_data,
391*e71b7053SJung-uk Kim                              (int)PACKET_remaining(&responder_id));
392*e71b7053SJung-uk Kim         if (id == NULL) {
393*e71b7053SJung-uk Kim             SSLfatal(s, SSL_AD_DECODE_ERROR,
394*e71b7053SJung-uk Kim                      SSL_F_TLS_PARSE_CTOS_STATUS_REQUEST, SSL_R_BAD_EXTENSION);
395*e71b7053SJung-uk Kim             return 0;
396*e71b7053SJung-uk Kim         }
397*e71b7053SJung-uk Kim 
398*e71b7053SJung-uk Kim         if (id_data != PACKET_end(&responder_id)) {
399*e71b7053SJung-uk Kim             OCSP_RESPID_free(id);
400*e71b7053SJung-uk Kim             SSLfatal(s, SSL_AD_DECODE_ERROR,
401*e71b7053SJung-uk Kim                      SSL_F_TLS_PARSE_CTOS_STATUS_REQUEST, SSL_R_BAD_EXTENSION);
402*e71b7053SJung-uk Kim 
403*e71b7053SJung-uk Kim             return 0;
404*e71b7053SJung-uk Kim         }
405*e71b7053SJung-uk Kim 
406*e71b7053SJung-uk Kim         if (!sk_OCSP_RESPID_push(s->ext.ocsp.ids, id)) {
407*e71b7053SJung-uk Kim             OCSP_RESPID_free(id);
408*e71b7053SJung-uk Kim             SSLfatal(s, SSL_AD_INTERNAL_ERROR,
409*e71b7053SJung-uk Kim                      SSL_F_TLS_PARSE_CTOS_STATUS_REQUEST, ERR_R_INTERNAL_ERROR);
410*e71b7053SJung-uk Kim 
411*e71b7053SJung-uk Kim             return 0;
412*e71b7053SJung-uk Kim         }
413*e71b7053SJung-uk Kim     }
414*e71b7053SJung-uk Kim 
415*e71b7053SJung-uk Kim     /* Read in request_extensions */
416*e71b7053SJung-uk Kim     if (!PACKET_as_length_prefixed_2(pkt, &exts)) {
417*e71b7053SJung-uk Kim         SSLfatal(s, SSL_AD_DECODE_ERROR,
418*e71b7053SJung-uk Kim                  SSL_F_TLS_PARSE_CTOS_STATUS_REQUEST, SSL_R_BAD_EXTENSION);
419*e71b7053SJung-uk Kim         return 0;
420*e71b7053SJung-uk Kim     }
421*e71b7053SJung-uk Kim 
422*e71b7053SJung-uk Kim     if (PACKET_remaining(&exts) > 0) {
423*e71b7053SJung-uk Kim         const unsigned char *ext_data = PACKET_data(&exts);
424*e71b7053SJung-uk Kim 
425*e71b7053SJung-uk Kim         sk_X509_EXTENSION_pop_free(s->ext.ocsp.exts,
426*e71b7053SJung-uk Kim                                    X509_EXTENSION_free);
427*e71b7053SJung-uk Kim         s->ext.ocsp.exts =
428*e71b7053SJung-uk Kim             d2i_X509_EXTENSIONS(NULL, &ext_data, (int)PACKET_remaining(&exts));
429*e71b7053SJung-uk Kim         if (s->ext.ocsp.exts == NULL || ext_data != PACKET_end(&exts)) {
430*e71b7053SJung-uk Kim             SSLfatal(s, SSL_AD_DECODE_ERROR,
431*e71b7053SJung-uk Kim                      SSL_F_TLS_PARSE_CTOS_STATUS_REQUEST, SSL_R_BAD_EXTENSION);
432*e71b7053SJung-uk Kim             return 0;
433*e71b7053SJung-uk Kim         }
434*e71b7053SJung-uk Kim     }
435*e71b7053SJung-uk Kim 
436*e71b7053SJung-uk Kim     return 1;
437*e71b7053SJung-uk Kim }
438*e71b7053SJung-uk Kim #endif
439*e71b7053SJung-uk Kim 
440*e71b7053SJung-uk Kim #ifndef OPENSSL_NO_NEXTPROTONEG
441*e71b7053SJung-uk Kim int tls_parse_ctos_npn(SSL *s, PACKET *pkt, unsigned int context, X509 *x,
442*e71b7053SJung-uk Kim                        size_t chainidx)
443*e71b7053SJung-uk Kim {
444*e71b7053SJung-uk Kim     /*
445*e71b7053SJung-uk Kim      * We shouldn't accept this extension on a
446*e71b7053SJung-uk Kim      * renegotiation.
447*e71b7053SJung-uk Kim      */
448*e71b7053SJung-uk Kim     if (SSL_IS_FIRST_HANDSHAKE(s))
449*e71b7053SJung-uk Kim         s->s3->npn_seen = 1;
450*e71b7053SJung-uk Kim 
451*e71b7053SJung-uk Kim     return 1;
452*e71b7053SJung-uk Kim }
453*e71b7053SJung-uk Kim #endif
454*e71b7053SJung-uk Kim 
455*e71b7053SJung-uk Kim /*
456*e71b7053SJung-uk Kim  * Save the ALPN extension in a ClientHello.|pkt| holds the contents of the ALPN
457*e71b7053SJung-uk Kim  * extension, not including type and length. Returns: 1 on success, 0 on error.
458*e71b7053SJung-uk Kim  */
459*e71b7053SJung-uk Kim int tls_parse_ctos_alpn(SSL *s, PACKET *pkt, unsigned int context, X509 *x,
460*e71b7053SJung-uk Kim                         size_t chainidx)
461*e71b7053SJung-uk Kim {
462*e71b7053SJung-uk Kim     PACKET protocol_list, save_protocol_list, protocol;
463*e71b7053SJung-uk Kim 
464*e71b7053SJung-uk Kim     if (!SSL_IS_FIRST_HANDSHAKE(s))
465*e71b7053SJung-uk Kim         return 1;
466*e71b7053SJung-uk Kim 
467*e71b7053SJung-uk Kim     if (!PACKET_as_length_prefixed_2(pkt, &protocol_list)
468*e71b7053SJung-uk Kim         || PACKET_remaining(&protocol_list) < 2) {
469*e71b7053SJung-uk Kim         SSLfatal(s, SSL_AD_DECODE_ERROR, SSL_F_TLS_PARSE_CTOS_ALPN,
470*e71b7053SJung-uk Kim                  SSL_R_BAD_EXTENSION);
471*e71b7053SJung-uk Kim         return 0;
472*e71b7053SJung-uk Kim     }
473*e71b7053SJung-uk Kim 
474*e71b7053SJung-uk Kim     save_protocol_list = protocol_list;
475*e71b7053SJung-uk Kim     do {
476*e71b7053SJung-uk Kim         /* Protocol names can't be empty. */
477*e71b7053SJung-uk Kim         if (!PACKET_get_length_prefixed_1(&protocol_list, &protocol)
478*e71b7053SJung-uk Kim                 || PACKET_remaining(&protocol) == 0) {
479*e71b7053SJung-uk Kim             SSLfatal(s, SSL_AD_DECODE_ERROR, SSL_F_TLS_PARSE_CTOS_ALPN,
480*e71b7053SJung-uk Kim                      SSL_R_BAD_EXTENSION);
481*e71b7053SJung-uk Kim             return 0;
482*e71b7053SJung-uk Kim         }
483*e71b7053SJung-uk Kim     } while (PACKET_remaining(&protocol_list) != 0);
484*e71b7053SJung-uk Kim 
485*e71b7053SJung-uk Kim     OPENSSL_free(s->s3->alpn_proposed);
486*e71b7053SJung-uk Kim     s->s3->alpn_proposed = NULL;
487*e71b7053SJung-uk Kim     s->s3->alpn_proposed_len = 0;
488*e71b7053SJung-uk Kim     if (!PACKET_memdup(&save_protocol_list,
489*e71b7053SJung-uk Kim                        &s->s3->alpn_proposed, &s->s3->alpn_proposed_len)) {
490*e71b7053SJung-uk Kim         SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_TLS_PARSE_CTOS_ALPN,
491*e71b7053SJung-uk Kim                  ERR_R_INTERNAL_ERROR);
492*e71b7053SJung-uk Kim         return 0;
493*e71b7053SJung-uk Kim     }
494*e71b7053SJung-uk Kim 
495*e71b7053SJung-uk Kim     return 1;
496*e71b7053SJung-uk Kim }
497*e71b7053SJung-uk Kim 
498*e71b7053SJung-uk Kim #ifndef OPENSSL_NO_SRTP
499*e71b7053SJung-uk Kim int tls_parse_ctos_use_srtp(SSL *s, PACKET *pkt, unsigned int context, X509 *x,
500*e71b7053SJung-uk Kim                             size_t chainidx)
501*e71b7053SJung-uk Kim {
502*e71b7053SJung-uk Kim     STACK_OF(SRTP_PROTECTION_PROFILE) *srvr;
503*e71b7053SJung-uk Kim     unsigned int ct, mki_len, id;
504*e71b7053SJung-uk Kim     int i, srtp_pref;
505*e71b7053SJung-uk Kim     PACKET subpkt;
506*e71b7053SJung-uk Kim 
507*e71b7053SJung-uk Kim     /* Ignore this if we have no SRTP profiles */
508*e71b7053SJung-uk Kim     if (SSL_get_srtp_profiles(s) == NULL)
509*e71b7053SJung-uk Kim         return 1;
510*e71b7053SJung-uk Kim 
511*e71b7053SJung-uk Kim     /* Pull off the length of the cipher suite list  and check it is even */
512*e71b7053SJung-uk Kim     if (!PACKET_get_net_2(pkt, &ct) || (ct & 1) != 0
513*e71b7053SJung-uk Kim             || !PACKET_get_sub_packet(pkt, &subpkt, ct)) {
514*e71b7053SJung-uk Kim         SSLfatal(s, SSL_AD_DECODE_ERROR, SSL_F_TLS_PARSE_CTOS_USE_SRTP,
515*e71b7053SJung-uk Kim                SSL_R_BAD_SRTP_PROTECTION_PROFILE_LIST);
516*e71b7053SJung-uk Kim         return 0;
517*e71b7053SJung-uk Kim     }
518*e71b7053SJung-uk Kim 
519*e71b7053SJung-uk Kim     srvr = SSL_get_srtp_profiles(s);
520*e71b7053SJung-uk Kim     s->srtp_profile = NULL;
521*e71b7053SJung-uk Kim     /* Search all profiles for a match initially */
522*e71b7053SJung-uk Kim     srtp_pref = sk_SRTP_PROTECTION_PROFILE_num(srvr);
523*e71b7053SJung-uk Kim 
524*e71b7053SJung-uk Kim     while (PACKET_remaining(&subpkt)) {
525*e71b7053SJung-uk Kim         if (!PACKET_get_net_2(&subpkt, &id)) {
526*e71b7053SJung-uk Kim             SSLfatal(s, SSL_AD_DECODE_ERROR, SSL_F_TLS_PARSE_CTOS_USE_SRTP,
527*e71b7053SJung-uk Kim                      SSL_R_BAD_SRTP_PROTECTION_PROFILE_LIST);
528*e71b7053SJung-uk Kim             return 0;
529*e71b7053SJung-uk Kim         }
530*e71b7053SJung-uk Kim 
531*e71b7053SJung-uk Kim         /*
532*e71b7053SJung-uk Kim          * Only look for match in profiles of higher preference than
533*e71b7053SJung-uk Kim          * current match.
534*e71b7053SJung-uk Kim          * If no profiles have been have been configured then this
535*e71b7053SJung-uk Kim          * does nothing.
536*e71b7053SJung-uk Kim          */
537*e71b7053SJung-uk Kim         for (i = 0; i < srtp_pref; i++) {
538*e71b7053SJung-uk Kim             SRTP_PROTECTION_PROFILE *sprof =
539*e71b7053SJung-uk Kim                 sk_SRTP_PROTECTION_PROFILE_value(srvr, i);
540*e71b7053SJung-uk Kim 
541*e71b7053SJung-uk Kim             if (sprof->id == id) {
542*e71b7053SJung-uk Kim                 s->srtp_profile = sprof;
543*e71b7053SJung-uk Kim                 srtp_pref = i;
544*e71b7053SJung-uk Kim                 break;
545*e71b7053SJung-uk Kim             }
546*e71b7053SJung-uk Kim         }
547*e71b7053SJung-uk Kim     }
548*e71b7053SJung-uk Kim 
549*e71b7053SJung-uk Kim     /* Now extract the MKI value as a sanity check, but discard it for now */
550*e71b7053SJung-uk Kim     if (!PACKET_get_1(pkt, &mki_len)) {
551*e71b7053SJung-uk Kim         SSLfatal(s, SSL_AD_DECODE_ERROR, SSL_F_TLS_PARSE_CTOS_USE_SRTP,
552*e71b7053SJung-uk Kim                  SSL_R_BAD_SRTP_PROTECTION_PROFILE_LIST);
553*e71b7053SJung-uk Kim         return 0;
554*e71b7053SJung-uk Kim     }
555*e71b7053SJung-uk Kim 
556*e71b7053SJung-uk Kim     if (!PACKET_forward(pkt, mki_len)
557*e71b7053SJung-uk Kim         || PACKET_remaining(pkt)) {
558*e71b7053SJung-uk Kim         SSLfatal(s, SSL_AD_DECODE_ERROR, SSL_F_TLS_PARSE_CTOS_USE_SRTP,
559*e71b7053SJung-uk Kim                  SSL_R_BAD_SRTP_MKI_VALUE);
560*e71b7053SJung-uk Kim         return 0;
561*e71b7053SJung-uk Kim     }
562*e71b7053SJung-uk Kim 
563*e71b7053SJung-uk Kim     return 1;
564*e71b7053SJung-uk Kim }
565*e71b7053SJung-uk Kim #endif
566*e71b7053SJung-uk Kim 
567*e71b7053SJung-uk Kim int tls_parse_ctos_etm(SSL *s, PACKET *pkt, unsigned int context, X509 *x,
568*e71b7053SJung-uk Kim                        size_t chainidx)
569*e71b7053SJung-uk Kim {
570*e71b7053SJung-uk Kim     if (!(s->options & SSL_OP_NO_ENCRYPT_THEN_MAC))
571*e71b7053SJung-uk Kim         s->ext.use_etm = 1;
572*e71b7053SJung-uk Kim 
573*e71b7053SJung-uk Kim     return 1;
574*e71b7053SJung-uk Kim }
575*e71b7053SJung-uk Kim 
576*e71b7053SJung-uk Kim /*
577*e71b7053SJung-uk Kim  * Process a psk_kex_modes extension received in the ClientHello. |pkt| contains
578*e71b7053SJung-uk Kim  * the raw PACKET data for the extension. Returns 1 on success or 0 on failure.
579*e71b7053SJung-uk Kim  */
580*e71b7053SJung-uk Kim int tls_parse_ctos_psk_kex_modes(SSL *s, PACKET *pkt, unsigned int context,
581*e71b7053SJung-uk Kim                                  X509 *x, size_t chainidx)
582*e71b7053SJung-uk Kim {
583*e71b7053SJung-uk Kim #ifndef OPENSSL_NO_TLS1_3
584*e71b7053SJung-uk Kim     PACKET psk_kex_modes;
585*e71b7053SJung-uk Kim     unsigned int mode;
586*e71b7053SJung-uk Kim 
587*e71b7053SJung-uk Kim     if (!PACKET_as_length_prefixed_1(pkt, &psk_kex_modes)
588*e71b7053SJung-uk Kim             || PACKET_remaining(&psk_kex_modes) == 0) {
589*e71b7053SJung-uk Kim         SSLfatal(s, SSL_AD_DECODE_ERROR, SSL_F_TLS_PARSE_CTOS_PSK_KEX_MODES,
590*e71b7053SJung-uk Kim                  SSL_R_BAD_EXTENSION);
591*e71b7053SJung-uk Kim         return 0;
592*e71b7053SJung-uk Kim     }
593*e71b7053SJung-uk Kim 
594*e71b7053SJung-uk Kim     while (PACKET_get_1(&psk_kex_modes, &mode)) {
595*e71b7053SJung-uk Kim         if (mode == TLSEXT_KEX_MODE_KE_DHE)
596*e71b7053SJung-uk Kim             s->ext.psk_kex_mode |= TLSEXT_KEX_MODE_FLAG_KE_DHE;
597*e71b7053SJung-uk Kim         else if (mode == TLSEXT_KEX_MODE_KE
598*e71b7053SJung-uk Kim                 && (s->options & SSL_OP_ALLOW_NO_DHE_KEX) != 0)
599*e71b7053SJung-uk Kim             s->ext.psk_kex_mode |= TLSEXT_KEX_MODE_FLAG_KE;
600*e71b7053SJung-uk Kim     }
601*e71b7053SJung-uk Kim #endif
602*e71b7053SJung-uk Kim 
603*e71b7053SJung-uk Kim     return 1;
604*e71b7053SJung-uk Kim }
605*e71b7053SJung-uk Kim 
606*e71b7053SJung-uk Kim /*
607*e71b7053SJung-uk Kim  * Process a key_share extension received in the ClientHello. |pkt| contains
608*e71b7053SJung-uk Kim  * the raw PACKET data for the extension. Returns 1 on success or 0 on failure.
609*e71b7053SJung-uk Kim  */
610*e71b7053SJung-uk Kim int tls_parse_ctos_key_share(SSL *s, PACKET *pkt, unsigned int context, X509 *x,
611*e71b7053SJung-uk Kim                              size_t chainidx)
612*e71b7053SJung-uk Kim {
613*e71b7053SJung-uk Kim #ifndef OPENSSL_NO_TLS1_3
614*e71b7053SJung-uk Kim     unsigned int group_id;
615*e71b7053SJung-uk Kim     PACKET key_share_list, encoded_pt;
616*e71b7053SJung-uk Kim     const uint16_t *clntgroups, *srvrgroups;
617*e71b7053SJung-uk Kim     size_t clnt_num_groups, srvr_num_groups;
618*e71b7053SJung-uk Kim     int found = 0;
619*e71b7053SJung-uk Kim 
620*e71b7053SJung-uk Kim     if (s->hit && (s->ext.psk_kex_mode & TLSEXT_KEX_MODE_FLAG_KE_DHE) == 0)
621*e71b7053SJung-uk Kim         return 1;
622*e71b7053SJung-uk Kim 
623*e71b7053SJung-uk Kim     /* Sanity check */
624*e71b7053SJung-uk Kim     if (s->s3->peer_tmp != NULL) {
625*e71b7053SJung-uk Kim         SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_TLS_PARSE_CTOS_KEY_SHARE,
626*e71b7053SJung-uk Kim                  ERR_R_INTERNAL_ERROR);
627*e71b7053SJung-uk Kim         return 0;
628*e71b7053SJung-uk Kim     }
629*e71b7053SJung-uk Kim 
630*e71b7053SJung-uk Kim     if (!PACKET_as_length_prefixed_2(pkt, &key_share_list)) {
631*e71b7053SJung-uk Kim         SSLfatal(s, SSL_AD_DECODE_ERROR, SSL_F_TLS_PARSE_CTOS_KEY_SHARE,
632*e71b7053SJung-uk Kim                  SSL_R_LENGTH_MISMATCH);
633*e71b7053SJung-uk Kim         return 0;
634*e71b7053SJung-uk Kim     }
635*e71b7053SJung-uk Kim 
636*e71b7053SJung-uk Kim     /* Get our list of supported groups */
637*e71b7053SJung-uk Kim     tls1_get_supported_groups(s, &srvrgroups, &srvr_num_groups);
638*e71b7053SJung-uk Kim     /* Get the clients list of supported groups. */
639*e71b7053SJung-uk Kim     tls1_get_peer_groups(s, &clntgroups, &clnt_num_groups);
640*e71b7053SJung-uk Kim     if (clnt_num_groups == 0) {
641*e71b7053SJung-uk Kim         /*
642*e71b7053SJung-uk Kim          * This can only happen if the supported_groups extension was not sent,
643*e71b7053SJung-uk Kim          * because we verify that the length is non-zero when we process that
644*e71b7053SJung-uk Kim          * extension.
645*e71b7053SJung-uk Kim          */
646*e71b7053SJung-uk Kim         SSLfatal(s, SSL_AD_MISSING_EXTENSION, SSL_F_TLS_PARSE_CTOS_KEY_SHARE,
647*e71b7053SJung-uk Kim                  SSL_R_MISSING_SUPPORTED_GROUPS_EXTENSION);
648*e71b7053SJung-uk Kim         return 0;
649*e71b7053SJung-uk Kim     }
650*e71b7053SJung-uk Kim 
651*e71b7053SJung-uk Kim     if (s->s3->group_id != 0 && PACKET_remaining(&key_share_list) == 0) {
652*e71b7053SJung-uk Kim         /*
653*e71b7053SJung-uk Kim          * If we set a group_id already, then we must have sent an HRR
654*e71b7053SJung-uk Kim          * requesting a new key_share. If we haven't got one then that is an
655*e71b7053SJung-uk Kim          * error
656*e71b7053SJung-uk Kim          */
657*e71b7053SJung-uk Kim         SSLfatal(s, SSL_AD_ILLEGAL_PARAMETER, SSL_F_TLS_PARSE_CTOS_KEY_SHARE,
658*e71b7053SJung-uk Kim                  SSL_R_BAD_KEY_SHARE);
659*e71b7053SJung-uk Kim         return 0;
660*e71b7053SJung-uk Kim     }
661*e71b7053SJung-uk Kim 
662*e71b7053SJung-uk Kim     while (PACKET_remaining(&key_share_list) > 0) {
663*e71b7053SJung-uk Kim         if (!PACKET_get_net_2(&key_share_list, &group_id)
664*e71b7053SJung-uk Kim                 || !PACKET_get_length_prefixed_2(&key_share_list, &encoded_pt)
665*e71b7053SJung-uk Kim                 || PACKET_remaining(&encoded_pt) == 0) {
666*e71b7053SJung-uk Kim             SSLfatal(s, SSL_AD_DECODE_ERROR, SSL_F_TLS_PARSE_CTOS_KEY_SHARE,
667*e71b7053SJung-uk Kim                      SSL_R_LENGTH_MISMATCH);
668*e71b7053SJung-uk Kim             return 0;
669*e71b7053SJung-uk Kim         }
670*e71b7053SJung-uk Kim 
671*e71b7053SJung-uk Kim         /*
672*e71b7053SJung-uk Kim          * If we already found a suitable key_share we loop through the
673*e71b7053SJung-uk Kim          * rest to verify the structure, but don't process them.
674*e71b7053SJung-uk Kim          */
675*e71b7053SJung-uk Kim         if (found)
676*e71b7053SJung-uk Kim             continue;
677*e71b7053SJung-uk Kim 
678*e71b7053SJung-uk Kim         /*
679*e71b7053SJung-uk Kim          * If we sent an HRR then the key_share sent back MUST be for the group
680*e71b7053SJung-uk Kim          * we requested, and must be the only key_share sent.
681*e71b7053SJung-uk Kim          */
682*e71b7053SJung-uk Kim         if (s->s3->group_id != 0
683*e71b7053SJung-uk Kim                 && (group_id != s->s3->group_id
684*e71b7053SJung-uk Kim                     || PACKET_remaining(&key_share_list) != 0)) {
685*e71b7053SJung-uk Kim             SSLfatal(s, SSL_AD_ILLEGAL_PARAMETER,
686*e71b7053SJung-uk Kim                      SSL_F_TLS_PARSE_CTOS_KEY_SHARE, SSL_R_BAD_KEY_SHARE);
687*e71b7053SJung-uk Kim             return 0;
688*e71b7053SJung-uk Kim         }
689*e71b7053SJung-uk Kim 
690*e71b7053SJung-uk Kim         /* Check if this share is in supported_groups sent from client */
691*e71b7053SJung-uk Kim         if (!check_in_list(s, group_id, clntgroups, clnt_num_groups, 0)) {
692*e71b7053SJung-uk Kim             SSLfatal(s, SSL_AD_ILLEGAL_PARAMETER,
693*e71b7053SJung-uk Kim                      SSL_F_TLS_PARSE_CTOS_KEY_SHARE, SSL_R_BAD_KEY_SHARE);
694*e71b7053SJung-uk Kim             return 0;
695*e71b7053SJung-uk Kim         }
696*e71b7053SJung-uk Kim 
697*e71b7053SJung-uk Kim         /* Check if this share is for a group we can use */
698*e71b7053SJung-uk Kim         if (!check_in_list(s, group_id, srvrgroups, srvr_num_groups, 1)) {
699*e71b7053SJung-uk Kim             /* Share not suitable */
700*e71b7053SJung-uk Kim             continue;
701*e71b7053SJung-uk Kim         }
702*e71b7053SJung-uk Kim 
703*e71b7053SJung-uk Kim         if ((s->s3->peer_tmp = ssl_generate_param_group(group_id)) == NULL) {
704*e71b7053SJung-uk Kim             SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_TLS_PARSE_CTOS_KEY_SHARE,
705*e71b7053SJung-uk Kim                    SSL_R_UNABLE_TO_FIND_ECDH_PARAMETERS);
706*e71b7053SJung-uk Kim             return 0;
707*e71b7053SJung-uk Kim         }
708*e71b7053SJung-uk Kim 
709*e71b7053SJung-uk Kim         s->s3->group_id = group_id;
710*e71b7053SJung-uk Kim 
711*e71b7053SJung-uk Kim         if (!EVP_PKEY_set1_tls_encodedpoint(s->s3->peer_tmp,
712*e71b7053SJung-uk Kim                 PACKET_data(&encoded_pt),
713*e71b7053SJung-uk Kim                 PACKET_remaining(&encoded_pt))) {
714*e71b7053SJung-uk Kim             SSLfatal(s, SSL_AD_ILLEGAL_PARAMETER,
715*e71b7053SJung-uk Kim                      SSL_F_TLS_PARSE_CTOS_KEY_SHARE, SSL_R_BAD_ECPOINT);
716*e71b7053SJung-uk Kim             return 0;
717*e71b7053SJung-uk Kim         }
718*e71b7053SJung-uk Kim 
719*e71b7053SJung-uk Kim         found = 1;
720*e71b7053SJung-uk Kim     }
721*e71b7053SJung-uk Kim #endif
722*e71b7053SJung-uk Kim 
723*e71b7053SJung-uk Kim     return 1;
724*e71b7053SJung-uk Kim }
725*e71b7053SJung-uk Kim 
726*e71b7053SJung-uk Kim int tls_parse_ctos_cookie(SSL *s, PACKET *pkt, unsigned int context, X509 *x,
727*e71b7053SJung-uk Kim                           size_t chainidx)
728*e71b7053SJung-uk Kim {
729*e71b7053SJung-uk Kim #ifndef OPENSSL_NO_TLS1_3
730*e71b7053SJung-uk Kim     unsigned int format, version, key_share, group_id;
731*e71b7053SJung-uk Kim     EVP_MD_CTX *hctx;
732*e71b7053SJung-uk Kim     EVP_PKEY *pkey;
733*e71b7053SJung-uk Kim     PACKET cookie, raw, chhash, appcookie;
734*e71b7053SJung-uk Kim     WPACKET hrrpkt;
735*e71b7053SJung-uk Kim     const unsigned char *data, *mdin, *ciphdata;
736*e71b7053SJung-uk Kim     unsigned char hmac[SHA256_DIGEST_LENGTH];
737*e71b7053SJung-uk Kim     unsigned char hrr[MAX_HRR_SIZE];
738*e71b7053SJung-uk Kim     size_t rawlen, hmaclen, hrrlen, ciphlen;
739*e71b7053SJung-uk Kim     unsigned long tm, now;
740*e71b7053SJung-uk Kim 
741*e71b7053SJung-uk Kim     /* Ignore any cookie if we're not set up to verify it */
742*e71b7053SJung-uk Kim     if (s->ctx->verify_stateless_cookie_cb == NULL
743*e71b7053SJung-uk Kim             || (s->s3->flags & TLS1_FLAGS_STATELESS) == 0)
744*e71b7053SJung-uk Kim         return 1;
745*e71b7053SJung-uk Kim 
746*e71b7053SJung-uk Kim     if (!PACKET_as_length_prefixed_2(pkt, &cookie)) {
747*e71b7053SJung-uk Kim         SSLfatal(s, SSL_AD_DECODE_ERROR, SSL_F_TLS_PARSE_CTOS_COOKIE,
748*e71b7053SJung-uk Kim                  SSL_R_LENGTH_MISMATCH);
749*e71b7053SJung-uk Kim         return 0;
750*e71b7053SJung-uk Kim     }
751*e71b7053SJung-uk Kim 
752*e71b7053SJung-uk Kim     raw = cookie;
753*e71b7053SJung-uk Kim     data = PACKET_data(&raw);
754*e71b7053SJung-uk Kim     rawlen = PACKET_remaining(&raw);
755*e71b7053SJung-uk Kim     if (rawlen < SHA256_DIGEST_LENGTH
756*e71b7053SJung-uk Kim             || !PACKET_forward(&raw, rawlen - SHA256_DIGEST_LENGTH)) {
757*e71b7053SJung-uk Kim         SSLfatal(s, SSL_AD_DECODE_ERROR, SSL_F_TLS_PARSE_CTOS_COOKIE,
758*e71b7053SJung-uk Kim                  SSL_R_LENGTH_MISMATCH);
759*e71b7053SJung-uk Kim         return 0;
760*e71b7053SJung-uk Kim     }
761*e71b7053SJung-uk Kim     mdin = PACKET_data(&raw);
762*e71b7053SJung-uk Kim 
763*e71b7053SJung-uk Kim     /* Verify the HMAC of the cookie */
764*e71b7053SJung-uk Kim     hctx = EVP_MD_CTX_create();
765*e71b7053SJung-uk Kim     pkey = EVP_PKEY_new_raw_private_key(EVP_PKEY_HMAC, NULL,
766*e71b7053SJung-uk Kim                                         s->session_ctx->ext.cookie_hmac_key,
767*e71b7053SJung-uk Kim                                         sizeof(s->session_ctx->ext
768*e71b7053SJung-uk Kim                                                .cookie_hmac_key));
769*e71b7053SJung-uk Kim     if (hctx == NULL || pkey == NULL) {
770*e71b7053SJung-uk Kim         EVP_MD_CTX_free(hctx);
771*e71b7053SJung-uk Kim         EVP_PKEY_free(pkey);
772*e71b7053SJung-uk Kim         SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_TLS_PARSE_CTOS_COOKIE,
773*e71b7053SJung-uk Kim                  ERR_R_MALLOC_FAILURE);
774*e71b7053SJung-uk Kim         return 0;
775*e71b7053SJung-uk Kim     }
776*e71b7053SJung-uk Kim 
777*e71b7053SJung-uk Kim     hmaclen = SHA256_DIGEST_LENGTH;
778*e71b7053SJung-uk Kim     if (EVP_DigestSignInit(hctx, NULL, EVP_sha256(), NULL, pkey) <= 0
779*e71b7053SJung-uk Kim             || EVP_DigestSign(hctx, hmac, &hmaclen, data,
780*e71b7053SJung-uk Kim                               rawlen - SHA256_DIGEST_LENGTH) <= 0
781*e71b7053SJung-uk Kim             || hmaclen != SHA256_DIGEST_LENGTH) {
782*e71b7053SJung-uk Kim         EVP_MD_CTX_free(hctx);
783*e71b7053SJung-uk Kim         EVP_PKEY_free(pkey);
784*e71b7053SJung-uk Kim         SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_TLS_PARSE_CTOS_COOKIE,
785*e71b7053SJung-uk Kim                  ERR_R_INTERNAL_ERROR);
786*e71b7053SJung-uk Kim         return 0;
787*e71b7053SJung-uk Kim     }
788*e71b7053SJung-uk Kim 
789*e71b7053SJung-uk Kim     EVP_MD_CTX_free(hctx);
790*e71b7053SJung-uk Kim     EVP_PKEY_free(pkey);
791*e71b7053SJung-uk Kim 
792*e71b7053SJung-uk Kim     if (CRYPTO_memcmp(hmac, mdin, SHA256_DIGEST_LENGTH) != 0) {
793*e71b7053SJung-uk Kim         SSLfatal(s, SSL_AD_ILLEGAL_PARAMETER, SSL_F_TLS_PARSE_CTOS_COOKIE,
794*e71b7053SJung-uk Kim                  SSL_R_COOKIE_MISMATCH);
795*e71b7053SJung-uk Kim         return 0;
796*e71b7053SJung-uk Kim     }
797*e71b7053SJung-uk Kim 
798*e71b7053SJung-uk Kim     if (!PACKET_get_net_2(&cookie, &format)) {
799*e71b7053SJung-uk Kim         SSLfatal(s, SSL_AD_DECODE_ERROR, SSL_F_TLS_PARSE_CTOS_COOKIE,
800*e71b7053SJung-uk Kim                  SSL_R_LENGTH_MISMATCH);
801*e71b7053SJung-uk Kim         return 0;
802*e71b7053SJung-uk Kim     }
803*e71b7053SJung-uk Kim     /* Check the cookie format is something we recognise. Ignore it if not */
804*e71b7053SJung-uk Kim     if (format != COOKIE_STATE_FORMAT_VERSION)
805*e71b7053SJung-uk Kim         return 1;
806*e71b7053SJung-uk Kim 
807*e71b7053SJung-uk Kim     /*
808*e71b7053SJung-uk Kim      * The rest of these checks really shouldn't fail since we have verified the
809*e71b7053SJung-uk Kim      * HMAC above.
810*e71b7053SJung-uk Kim      */
811*e71b7053SJung-uk Kim 
812*e71b7053SJung-uk Kim     /* Check the version number is sane */
813*e71b7053SJung-uk Kim     if (!PACKET_get_net_2(&cookie, &version)) {
814*e71b7053SJung-uk Kim         SSLfatal(s, SSL_AD_DECODE_ERROR, SSL_F_TLS_PARSE_CTOS_COOKIE,
815*e71b7053SJung-uk Kim                  SSL_R_LENGTH_MISMATCH);
816*e71b7053SJung-uk Kim         return 0;
817*e71b7053SJung-uk Kim     }
818*e71b7053SJung-uk Kim     if (version != TLS1_3_VERSION) {
819*e71b7053SJung-uk Kim         SSLfatal(s, SSL_AD_ILLEGAL_PARAMETER, SSL_F_TLS_PARSE_CTOS_COOKIE,
820*e71b7053SJung-uk Kim                  SSL_R_BAD_PROTOCOL_VERSION_NUMBER);
821*e71b7053SJung-uk Kim         return 0;
822*e71b7053SJung-uk Kim     }
823*e71b7053SJung-uk Kim 
824*e71b7053SJung-uk Kim     if (!PACKET_get_net_2(&cookie, &group_id)) {
825*e71b7053SJung-uk Kim         SSLfatal(s, SSL_AD_DECODE_ERROR, SSL_F_TLS_PARSE_CTOS_COOKIE,
826*e71b7053SJung-uk Kim                  SSL_R_LENGTH_MISMATCH);
827*e71b7053SJung-uk Kim         return 0;
828*e71b7053SJung-uk Kim     }
829*e71b7053SJung-uk Kim 
830*e71b7053SJung-uk Kim     ciphdata = PACKET_data(&cookie);
831*e71b7053SJung-uk Kim     if (!PACKET_forward(&cookie, 2)) {
832*e71b7053SJung-uk Kim         SSLfatal(s, SSL_AD_DECODE_ERROR, SSL_F_TLS_PARSE_CTOS_COOKIE,
833*e71b7053SJung-uk Kim                  SSL_R_LENGTH_MISMATCH);
834*e71b7053SJung-uk Kim         return 0;
835*e71b7053SJung-uk Kim     }
836*e71b7053SJung-uk Kim     if (group_id != s->s3->group_id
837*e71b7053SJung-uk Kim             || s->s3->tmp.new_cipher
838*e71b7053SJung-uk Kim                != ssl_get_cipher_by_char(s, ciphdata, 0)) {
839*e71b7053SJung-uk Kim         /*
840*e71b7053SJung-uk Kim          * We chose a different cipher or group id this time around to what is
841*e71b7053SJung-uk Kim          * in the cookie. Something must have changed.
842*e71b7053SJung-uk Kim          */
843*e71b7053SJung-uk Kim         SSLfatal(s, SSL_AD_ILLEGAL_PARAMETER, SSL_F_TLS_PARSE_CTOS_COOKIE,
844*e71b7053SJung-uk Kim                  SSL_R_BAD_CIPHER);
845*e71b7053SJung-uk Kim         return 0;
846*e71b7053SJung-uk Kim     }
847*e71b7053SJung-uk Kim 
848*e71b7053SJung-uk Kim     if (!PACKET_get_1(&cookie, &key_share)
849*e71b7053SJung-uk Kim             || !PACKET_get_net_4(&cookie, &tm)
850*e71b7053SJung-uk Kim             || !PACKET_get_length_prefixed_2(&cookie, &chhash)
851*e71b7053SJung-uk Kim             || !PACKET_get_length_prefixed_1(&cookie, &appcookie)
852*e71b7053SJung-uk Kim             || PACKET_remaining(&cookie) != SHA256_DIGEST_LENGTH) {
853*e71b7053SJung-uk Kim         SSLfatal(s, SSL_AD_DECODE_ERROR, SSL_F_TLS_PARSE_CTOS_COOKIE,
854*e71b7053SJung-uk Kim                  SSL_R_LENGTH_MISMATCH);
855*e71b7053SJung-uk Kim         return 0;
856*e71b7053SJung-uk Kim     }
857*e71b7053SJung-uk Kim 
858*e71b7053SJung-uk Kim     /* We tolerate a cookie age of up to 10 minutes (= 60 * 10 seconds) */
859*e71b7053SJung-uk Kim     now = (unsigned long)time(NULL);
860*e71b7053SJung-uk Kim     if (tm > now || (now - tm) > 600) {
861*e71b7053SJung-uk Kim         /* Cookie is stale. Ignore it */
862*e71b7053SJung-uk Kim         return 1;
863*e71b7053SJung-uk Kim     }
864*e71b7053SJung-uk Kim 
865*e71b7053SJung-uk Kim     /* Verify the app cookie */
866*e71b7053SJung-uk Kim     if (s->ctx->verify_stateless_cookie_cb(s, PACKET_data(&appcookie),
867*e71b7053SJung-uk Kim                                      PACKET_remaining(&appcookie)) == 0) {
868*e71b7053SJung-uk Kim         SSLfatal(s, SSL_AD_ILLEGAL_PARAMETER, SSL_F_TLS_PARSE_CTOS_COOKIE,
869*e71b7053SJung-uk Kim                  SSL_R_COOKIE_MISMATCH);
870*e71b7053SJung-uk Kim         return 0;
871*e71b7053SJung-uk Kim     }
872*e71b7053SJung-uk Kim 
873*e71b7053SJung-uk Kim     /*
874*e71b7053SJung-uk Kim      * Reconstruct the HRR that we would have sent in response to the original
875*e71b7053SJung-uk Kim      * ClientHello so we can add it to the transcript hash.
876*e71b7053SJung-uk Kim      * Note: This won't work with custom HRR extensions
877*e71b7053SJung-uk Kim      */
878*e71b7053SJung-uk Kim     if (!WPACKET_init_static_len(&hrrpkt, hrr, sizeof(hrr), 0)) {
879*e71b7053SJung-uk Kim         SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_TLS_PARSE_CTOS_COOKIE,
880*e71b7053SJung-uk Kim                  ERR_R_INTERNAL_ERROR);
881*e71b7053SJung-uk Kim         return 0;
882*e71b7053SJung-uk Kim     }
883*e71b7053SJung-uk Kim     if (!WPACKET_put_bytes_u8(&hrrpkt, SSL3_MT_SERVER_HELLO)
884*e71b7053SJung-uk Kim             || !WPACKET_start_sub_packet_u24(&hrrpkt)
885*e71b7053SJung-uk Kim             || !WPACKET_put_bytes_u16(&hrrpkt, TLS1_2_VERSION)
886*e71b7053SJung-uk Kim             || !WPACKET_memcpy(&hrrpkt, hrrrandom, SSL3_RANDOM_SIZE)
887*e71b7053SJung-uk Kim             || !WPACKET_sub_memcpy_u8(&hrrpkt, s->tmp_session_id,
888*e71b7053SJung-uk Kim                                       s->tmp_session_id_len)
889*e71b7053SJung-uk Kim             || !s->method->put_cipher_by_char(s->s3->tmp.new_cipher, &hrrpkt,
890*e71b7053SJung-uk Kim                                               &ciphlen)
891*e71b7053SJung-uk Kim             || !WPACKET_put_bytes_u8(&hrrpkt, 0)
892*e71b7053SJung-uk Kim             || !WPACKET_start_sub_packet_u16(&hrrpkt)) {
893*e71b7053SJung-uk Kim         WPACKET_cleanup(&hrrpkt);
894*e71b7053SJung-uk Kim         SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_TLS_PARSE_CTOS_COOKIE,
895*e71b7053SJung-uk Kim                  ERR_R_INTERNAL_ERROR);
896*e71b7053SJung-uk Kim         return 0;
897*e71b7053SJung-uk Kim     }
898*e71b7053SJung-uk Kim     if (!WPACKET_put_bytes_u16(&hrrpkt, TLSEXT_TYPE_supported_versions)
899*e71b7053SJung-uk Kim             || !WPACKET_start_sub_packet_u16(&hrrpkt)
900*e71b7053SJung-uk Kim             || !WPACKET_put_bytes_u16(&hrrpkt, s->version)
901*e71b7053SJung-uk Kim             || !WPACKET_close(&hrrpkt)) {
902*e71b7053SJung-uk Kim         WPACKET_cleanup(&hrrpkt);
903*e71b7053SJung-uk Kim         SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_TLS_PARSE_CTOS_COOKIE,
904*e71b7053SJung-uk Kim                  ERR_R_INTERNAL_ERROR);
905*e71b7053SJung-uk Kim         return 0;
906*e71b7053SJung-uk Kim     }
907*e71b7053SJung-uk Kim     if (key_share) {
908*e71b7053SJung-uk Kim         if (!WPACKET_put_bytes_u16(&hrrpkt, TLSEXT_TYPE_key_share)
909*e71b7053SJung-uk Kim                 || !WPACKET_start_sub_packet_u16(&hrrpkt)
910*e71b7053SJung-uk Kim                 || !WPACKET_put_bytes_u16(&hrrpkt, s->s3->group_id)
911*e71b7053SJung-uk Kim                 || !WPACKET_close(&hrrpkt)) {
912*e71b7053SJung-uk Kim             WPACKET_cleanup(&hrrpkt);
913*e71b7053SJung-uk Kim             SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_TLS_PARSE_CTOS_COOKIE,
914*e71b7053SJung-uk Kim                      ERR_R_INTERNAL_ERROR);
915*e71b7053SJung-uk Kim             return 0;
916*e71b7053SJung-uk Kim         }
917*e71b7053SJung-uk Kim     }
918*e71b7053SJung-uk Kim     if (!WPACKET_put_bytes_u16(&hrrpkt, TLSEXT_TYPE_cookie)
919*e71b7053SJung-uk Kim             || !WPACKET_start_sub_packet_u16(&hrrpkt)
920*e71b7053SJung-uk Kim             || !WPACKET_sub_memcpy_u16(&hrrpkt, data, rawlen)
921*e71b7053SJung-uk Kim             || !WPACKET_close(&hrrpkt) /* cookie extension */
922*e71b7053SJung-uk Kim             || !WPACKET_close(&hrrpkt) /* extension block */
923*e71b7053SJung-uk Kim             || !WPACKET_close(&hrrpkt) /* message */
924*e71b7053SJung-uk Kim             || !WPACKET_get_total_written(&hrrpkt, &hrrlen)
925*e71b7053SJung-uk Kim             || !WPACKET_finish(&hrrpkt)) {
926*e71b7053SJung-uk Kim         WPACKET_cleanup(&hrrpkt);
927*e71b7053SJung-uk Kim         SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_TLS_PARSE_CTOS_COOKIE,
928*e71b7053SJung-uk Kim                  ERR_R_INTERNAL_ERROR);
929*e71b7053SJung-uk Kim         return 0;
930*e71b7053SJung-uk Kim     }
931*e71b7053SJung-uk Kim 
932*e71b7053SJung-uk Kim     /* Reconstruct the transcript hash */
933*e71b7053SJung-uk Kim     if (!create_synthetic_message_hash(s, PACKET_data(&chhash),
934*e71b7053SJung-uk Kim                                        PACKET_remaining(&chhash), hrr,
935*e71b7053SJung-uk Kim                                        hrrlen)) {
936*e71b7053SJung-uk Kim         /* SSLfatal() already called */
937*e71b7053SJung-uk Kim         return 0;
938*e71b7053SJung-uk Kim     }
939*e71b7053SJung-uk Kim 
940*e71b7053SJung-uk Kim     /* Act as if this ClientHello came after a HelloRetryRequest */
941*e71b7053SJung-uk Kim     s->hello_retry_request = 1;
942*e71b7053SJung-uk Kim 
943*e71b7053SJung-uk Kim     s->ext.cookieok = 1;
944*e71b7053SJung-uk Kim #endif
945*e71b7053SJung-uk Kim 
946*e71b7053SJung-uk Kim     return 1;
947*e71b7053SJung-uk Kim }
948*e71b7053SJung-uk Kim 
949*e71b7053SJung-uk Kim #ifndef OPENSSL_NO_EC
950*e71b7053SJung-uk Kim int tls_parse_ctos_supported_groups(SSL *s, PACKET *pkt, unsigned int context,
951*e71b7053SJung-uk Kim                                     X509 *x, size_t chainidx)
952*e71b7053SJung-uk Kim {
953*e71b7053SJung-uk Kim     PACKET supported_groups_list;
954*e71b7053SJung-uk Kim 
955*e71b7053SJung-uk Kim     /* Each group is 2 bytes and we must have at least 1. */
956*e71b7053SJung-uk Kim     if (!PACKET_as_length_prefixed_2(pkt, &supported_groups_list)
957*e71b7053SJung-uk Kim             || PACKET_remaining(&supported_groups_list) == 0
958*e71b7053SJung-uk Kim             || (PACKET_remaining(&supported_groups_list) % 2) != 0) {
959*e71b7053SJung-uk Kim         SSLfatal(s, SSL_AD_DECODE_ERROR,
960*e71b7053SJung-uk Kim                  SSL_F_TLS_PARSE_CTOS_SUPPORTED_GROUPS, SSL_R_BAD_EXTENSION);
961*e71b7053SJung-uk Kim         return 0;
962*e71b7053SJung-uk Kim     }
963*e71b7053SJung-uk Kim 
964*e71b7053SJung-uk Kim     if (!s->hit || SSL_IS_TLS13(s)) {
965*e71b7053SJung-uk Kim         OPENSSL_free(s->session->ext.supportedgroups);
966*e71b7053SJung-uk Kim         s->session->ext.supportedgroups = NULL;
967*e71b7053SJung-uk Kim         s->session->ext.supportedgroups_len = 0;
968*e71b7053SJung-uk Kim         if (!tls1_save_u16(&supported_groups_list,
969*e71b7053SJung-uk Kim                            &s->session->ext.supportedgroups,
970*e71b7053SJung-uk Kim                            &s->session->ext.supportedgroups_len)) {
971*e71b7053SJung-uk Kim             SSLfatal(s, SSL_AD_INTERNAL_ERROR,
972*e71b7053SJung-uk Kim                      SSL_F_TLS_PARSE_CTOS_SUPPORTED_GROUPS,
973*e71b7053SJung-uk Kim                      ERR_R_INTERNAL_ERROR);
974*e71b7053SJung-uk Kim             return 0;
975*e71b7053SJung-uk Kim         }
976*e71b7053SJung-uk Kim     }
977*e71b7053SJung-uk Kim 
978*e71b7053SJung-uk Kim     return 1;
979*e71b7053SJung-uk Kim }
980*e71b7053SJung-uk Kim #endif
981*e71b7053SJung-uk Kim 
982*e71b7053SJung-uk Kim int tls_parse_ctos_ems(SSL *s, PACKET *pkt, unsigned int context, X509 *x,
983*e71b7053SJung-uk Kim                        size_t chainidx)
984*e71b7053SJung-uk Kim {
985*e71b7053SJung-uk Kim     /* The extension must always be empty */
986*e71b7053SJung-uk Kim     if (PACKET_remaining(pkt) != 0) {
987*e71b7053SJung-uk Kim         SSLfatal(s, SSL_AD_DECODE_ERROR,
988*e71b7053SJung-uk Kim                  SSL_F_TLS_PARSE_CTOS_EMS, SSL_R_BAD_EXTENSION);
989*e71b7053SJung-uk Kim         return 0;
990*e71b7053SJung-uk Kim     }
991*e71b7053SJung-uk Kim 
992*e71b7053SJung-uk Kim     s->s3->flags |= TLS1_FLAGS_RECEIVED_EXTMS;
993*e71b7053SJung-uk Kim 
994*e71b7053SJung-uk Kim     return 1;
995*e71b7053SJung-uk Kim }
996*e71b7053SJung-uk Kim 
997*e71b7053SJung-uk Kim 
998*e71b7053SJung-uk Kim int tls_parse_ctos_early_data(SSL *s, PACKET *pkt, unsigned int context,
999*e71b7053SJung-uk Kim                               X509 *x, size_t chainidx)
1000*e71b7053SJung-uk Kim {
1001*e71b7053SJung-uk Kim     if (PACKET_remaining(pkt) != 0) {
1002*e71b7053SJung-uk Kim         SSLfatal(s, SSL_AD_DECODE_ERROR,
1003*e71b7053SJung-uk Kim                  SSL_F_TLS_PARSE_CTOS_EARLY_DATA, SSL_R_BAD_EXTENSION);
1004*e71b7053SJung-uk Kim         return 0;
1005*e71b7053SJung-uk Kim     }
1006*e71b7053SJung-uk Kim 
1007*e71b7053SJung-uk Kim     if (s->hello_retry_request != SSL_HRR_NONE) {
1008*e71b7053SJung-uk Kim         SSLfatal(s, SSL_AD_ILLEGAL_PARAMETER,
1009*e71b7053SJung-uk Kim                  SSL_F_TLS_PARSE_CTOS_EARLY_DATA, SSL_R_BAD_EXTENSION);
1010*e71b7053SJung-uk Kim         return 0;
1011*e71b7053SJung-uk Kim     }
1012*e71b7053SJung-uk Kim 
1013*e71b7053SJung-uk Kim     return 1;
1014*e71b7053SJung-uk Kim }
1015*e71b7053SJung-uk Kim 
1016*e71b7053SJung-uk Kim static SSL_TICKET_STATUS tls_get_stateful_ticket(SSL *s, PACKET *tick,
1017*e71b7053SJung-uk Kim                                                  SSL_SESSION **sess)
1018*e71b7053SJung-uk Kim {
1019*e71b7053SJung-uk Kim     SSL_SESSION *tmpsess = NULL;
1020*e71b7053SJung-uk Kim 
1021*e71b7053SJung-uk Kim     s->ext.ticket_expected = 1;
1022*e71b7053SJung-uk Kim 
1023*e71b7053SJung-uk Kim     switch (PACKET_remaining(tick)) {
1024*e71b7053SJung-uk Kim         case 0:
1025*e71b7053SJung-uk Kim             return SSL_TICKET_EMPTY;
1026*e71b7053SJung-uk Kim 
1027*e71b7053SJung-uk Kim         case SSL_MAX_SSL_SESSION_ID_LENGTH:
1028*e71b7053SJung-uk Kim             break;
1029*e71b7053SJung-uk Kim 
1030*e71b7053SJung-uk Kim         default:
1031*e71b7053SJung-uk Kim             return SSL_TICKET_NO_DECRYPT;
1032*e71b7053SJung-uk Kim     }
1033*e71b7053SJung-uk Kim 
1034*e71b7053SJung-uk Kim     tmpsess = lookup_sess_in_cache(s, PACKET_data(tick),
1035*e71b7053SJung-uk Kim                                    SSL_MAX_SSL_SESSION_ID_LENGTH);
1036*e71b7053SJung-uk Kim 
1037*e71b7053SJung-uk Kim     if (tmpsess == NULL)
1038*e71b7053SJung-uk Kim         return SSL_TICKET_NO_DECRYPT;
1039*e71b7053SJung-uk Kim 
1040*e71b7053SJung-uk Kim     *sess = tmpsess;
1041*e71b7053SJung-uk Kim     return SSL_TICKET_SUCCESS;
1042*e71b7053SJung-uk Kim }
1043*e71b7053SJung-uk Kim 
1044*e71b7053SJung-uk Kim int tls_parse_ctos_psk(SSL *s, PACKET *pkt, unsigned int context, X509 *x,
1045*e71b7053SJung-uk Kim                        size_t chainidx)
1046*e71b7053SJung-uk Kim {
1047*e71b7053SJung-uk Kim     PACKET identities, binders, binder;
1048*e71b7053SJung-uk Kim     size_t binderoffset, hashsize;
1049*e71b7053SJung-uk Kim     SSL_SESSION *sess = NULL;
1050*e71b7053SJung-uk Kim     unsigned int id, i, ext = 0;
1051*e71b7053SJung-uk Kim     const EVP_MD *md = NULL;
1052*e71b7053SJung-uk Kim 
1053*e71b7053SJung-uk Kim     /*
1054*e71b7053SJung-uk Kim      * If we have no PSK kex mode that we recognise then we can't resume so
1055*e71b7053SJung-uk Kim      * ignore this extension
1056*e71b7053SJung-uk Kim      */
1057*e71b7053SJung-uk Kim     if ((s->ext.psk_kex_mode
1058*e71b7053SJung-uk Kim             & (TLSEXT_KEX_MODE_FLAG_KE | TLSEXT_KEX_MODE_FLAG_KE_DHE)) == 0)
1059*e71b7053SJung-uk Kim         return 1;
1060*e71b7053SJung-uk Kim 
1061*e71b7053SJung-uk Kim     if (!PACKET_get_length_prefixed_2(pkt, &identities)) {
1062*e71b7053SJung-uk Kim         SSLfatal(s, SSL_AD_DECODE_ERROR,
1063*e71b7053SJung-uk Kim                  SSL_F_TLS_PARSE_CTOS_PSK, SSL_R_BAD_EXTENSION);
1064*e71b7053SJung-uk Kim         return 0;
1065*e71b7053SJung-uk Kim     }
1066*e71b7053SJung-uk Kim 
1067*e71b7053SJung-uk Kim     s->ext.ticket_expected = 0;
1068*e71b7053SJung-uk Kim     for (id = 0; PACKET_remaining(&identities) != 0; id++) {
1069*e71b7053SJung-uk Kim         PACKET identity;
1070*e71b7053SJung-uk Kim         unsigned long ticket_agel;
1071*e71b7053SJung-uk Kim         size_t idlen;
1072*e71b7053SJung-uk Kim 
1073*e71b7053SJung-uk Kim         if (!PACKET_get_length_prefixed_2(&identities, &identity)
1074*e71b7053SJung-uk Kim                 || !PACKET_get_net_4(&identities, &ticket_agel)) {
1075*e71b7053SJung-uk Kim             SSLfatal(s, SSL_AD_DECODE_ERROR,
1076*e71b7053SJung-uk Kim                      SSL_F_TLS_PARSE_CTOS_PSK, SSL_R_BAD_EXTENSION);
1077*e71b7053SJung-uk Kim             return 0;
1078*e71b7053SJung-uk Kim         }
1079*e71b7053SJung-uk Kim 
1080*e71b7053SJung-uk Kim         idlen = PACKET_remaining(&identity);
1081*e71b7053SJung-uk Kim         if (s->psk_find_session_cb != NULL
1082*e71b7053SJung-uk Kim                 && !s->psk_find_session_cb(s, PACKET_data(&identity), idlen,
1083*e71b7053SJung-uk Kim                                            &sess)) {
1084*e71b7053SJung-uk Kim             SSLfatal(s, SSL_AD_INTERNAL_ERROR,
1085*e71b7053SJung-uk Kim                      SSL_F_TLS_PARSE_CTOS_PSK, SSL_R_BAD_EXTENSION);
1086*e71b7053SJung-uk Kim             return 0;
1087*e71b7053SJung-uk Kim         }
1088*e71b7053SJung-uk Kim 
1089*e71b7053SJung-uk Kim #ifndef OPENSSL_NO_PSK
1090*e71b7053SJung-uk Kim         if(sess == NULL
1091*e71b7053SJung-uk Kim                 && s->psk_server_callback != NULL
1092*e71b7053SJung-uk Kim                 && idlen <= PSK_MAX_IDENTITY_LEN) {
1093*e71b7053SJung-uk Kim             char *pskid = NULL;
1094*e71b7053SJung-uk Kim             unsigned char pskdata[PSK_MAX_PSK_LEN];
1095*e71b7053SJung-uk Kim             unsigned int pskdatalen;
1096*e71b7053SJung-uk Kim 
1097*e71b7053SJung-uk Kim             if (!PACKET_strndup(&identity, &pskid)) {
1098*e71b7053SJung-uk Kim                 SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_TLS_PARSE_CTOS_PSK,
1099*e71b7053SJung-uk Kim                          ERR_R_INTERNAL_ERROR);
1100*e71b7053SJung-uk Kim                 return 0;
1101*e71b7053SJung-uk Kim             }
1102*e71b7053SJung-uk Kim             pskdatalen = s->psk_server_callback(s, pskid, pskdata,
1103*e71b7053SJung-uk Kim                                                 sizeof(pskdata));
1104*e71b7053SJung-uk Kim             OPENSSL_free(pskid);
1105*e71b7053SJung-uk Kim             if (pskdatalen > PSK_MAX_PSK_LEN) {
1106*e71b7053SJung-uk Kim                 SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_TLS_PARSE_CTOS_PSK,
1107*e71b7053SJung-uk Kim                          ERR_R_INTERNAL_ERROR);
1108*e71b7053SJung-uk Kim                 return 0;
1109*e71b7053SJung-uk Kim             } else if (pskdatalen > 0) {
1110*e71b7053SJung-uk Kim                 const SSL_CIPHER *cipher;
1111*e71b7053SJung-uk Kim                 const unsigned char tls13_aes128gcmsha256_id[] = { 0x13, 0x01 };
1112*e71b7053SJung-uk Kim 
1113*e71b7053SJung-uk Kim                 /*
1114*e71b7053SJung-uk Kim                  * We found a PSK using an old style callback. We don't know
1115*e71b7053SJung-uk Kim                  * the digest so we default to SHA256 as per the TLSv1.3 spec
1116*e71b7053SJung-uk Kim                  */
1117*e71b7053SJung-uk Kim                 cipher = SSL_CIPHER_find(s, tls13_aes128gcmsha256_id);
1118*e71b7053SJung-uk Kim                 if (cipher == NULL) {
1119*e71b7053SJung-uk Kim                     OPENSSL_cleanse(pskdata, pskdatalen);
1120*e71b7053SJung-uk Kim                     SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_TLS_PARSE_CTOS_PSK,
1121*e71b7053SJung-uk Kim                              ERR_R_INTERNAL_ERROR);
1122*e71b7053SJung-uk Kim                     return 0;
1123*e71b7053SJung-uk Kim                 }
1124*e71b7053SJung-uk Kim 
1125*e71b7053SJung-uk Kim                 sess = SSL_SESSION_new();
1126*e71b7053SJung-uk Kim                 if (sess == NULL
1127*e71b7053SJung-uk Kim                         || !SSL_SESSION_set1_master_key(sess, pskdata,
1128*e71b7053SJung-uk Kim                                                         pskdatalen)
1129*e71b7053SJung-uk Kim                         || !SSL_SESSION_set_cipher(sess, cipher)
1130*e71b7053SJung-uk Kim                         || !SSL_SESSION_set_protocol_version(sess,
1131*e71b7053SJung-uk Kim                                                              TLS1_3_VERSION)) {
1132*e71b7053SJung-uk Kim                     OPENSSL_cleanse(pskdata, pskdatalen);
1133*e71b7053SJung-uk Kim                     SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_TLS_PARSE_CTOS_PSK,
1134*e71b7053SJung-uk Kim                              ERR_R_INTERNAL_ERROR);
1135*e71b7053SJung-uk Kim                     goto err;
1136*e71b7053SJung-uk Kim                 }
1137*e71b7053SJung-uk Kim                 OPENSSL_cleanse(pskdata, pskdatalen);
1138*e71b7053SJung-uk Kim             }
1139*e71b7053SJung-uk Kim         }
1140*e71b7053SJung-uk Kim #endif /* OPENSSL_NO_PSK */
1141*e71b7053SJung-uk Kim 
1142*e71b7053SJung-uk Kim         if (sess != NULL) {
1143*e71b7053SJung-uk Kim             /* We found a PSK */
1144*e71b7053SJung-uk Kim             SSL_SESSION *sesstmp = ssl_session_dup(sess, 0);
1145*e71b7053SJung-uk Kim 
1146*e71b7053SJung-uk Kim             if (sesstmp == NULL) {
1147*e71b7053SJung-uk Kim                 SSLfatal(s, SSL_AD_INTERNAL_ERROR,
1148*e71b7053SJung-uk Kim                          SSL_F_TLS_PARSE_CTOS_PSK, ERR_R_INTERNAL_ERROR);
1149*e71b7053SJung-uk Kim                 return 0;
1150*e71b7053SJung-uk Kim             }
1151*e71b7053SJung-uk Kim             SSL_SESSION_free(sess);
1152*e71b7053SJung-uk Kim             sess = sesstmp;
1153*e71b7053SJung-uk Kim 
1154*e71b7053SJung-uk Kim             /*
1155*e71b7053SJung-uk Kim              * We've just been told to use this session for this context so
1156*e71b7053SJung-uk Kim              * make sure the sid_ctx matches up.
1157*e71b7053SJung-uk Kim              */
1158*e71b7053SJung-uk Kim             memcpy(sess->sid_ctx, s->sid_ctx, s->sid_ctx_length);
1159*e71b7053SJung-uk Kim             sess->sid_ctx_length = s->sid_ctx_length;
1160*e71b7053SJung-uk Kim             ext = 1;
1161*e71b7053SJung-uk Kim             if (id == 0)
1162*e71b7053SJung-uk Kim                 s->ext.early_data_ok = 1;
1163*e71b7053SJung-uk Kim             s->ext.ticket_expected = 1;
1164*e71b7053SJung-uk Kim         } else {
1165*e71b7053SJung-uk Kim             uint32_t ticket_age = 0, now, agesec, agems;
1166*e71b7053SJung-uk Kim             int ret;
1167*e71b7053SJung-uk Kim 
1168*e71b7053SJung-uk Kim             /*
1169*e71b7053SJung-uk Kim              * If we are using anti-replay protection then we behave as if
1170*e71b7053SJung-uk Kim              * SSL_OP_NO_TICKET is set - we are caching tickets anyway so there
1171*e71b7053SJung-uk Kim              * is no point in using full stateless tickets.
1172*e71b7053SJung-uk Kim              */
1173*e71b7053SJung-uk Kim             if ((s->options & SSL_OP_NO_TICKET) != 0
1174*e71b7053SJung-uk Kim                     || (s->max_early_data > 0
1175*e71b7053SJung-uk Kim                         && (s->options & SSL_OP_NO_ANTI_REPLAY) == 0))
1176*e71b7053SJung-uk Kim                 ret = tls_get_stateful_ticket(s, &identity, &sess);
1177*e71b7053SJung-uk Kim             else
1178*e71b7053SJung-uk Kim                 ret = tls_decrypt_ticket(s, PACKET_data(&identity),
1179*e71b7053SJung-uk Kim                                          PACKET_remaining(&identity), NULL, 0,
1180*e71b7053SJung-uk Kim                                          &sess);
1181*e71b7053SJung-uk Kim 
1182*e71b7053SJung-uk Kim             if (ret == SSL_TICKET_EMPTY) {
1183*e71b7053SJung-uk Kim                 SSLfatal(s, SSL_AD_DECODE_ERROR, SSL_F_TLS_PARSE_CTOS_PSK,
1184*e71b7053SJung-uk Kim                          SSL_R_BAD_EXTENSION);
1185*e71b7053SJung-uk Kim                 return 0;
1186*e71b7053SJung-uk Kim             }
1187*e71b7053SJung-uk Kim 
1188*e71b7053SJung-uk Kim             if (ret == SSL_TICKET_FATAL_ERR_MALLOC
1189*e71b7053SJung-uk Kim                     || ret == SSL_TICKET_FATAL_ERR_OTHER) {
1190*e71b7053SJung-uk Kim                 SSLfatal(s, SSL_AD_INTERNAL_ERROR,
1191*e71b7053SJung-uk Kim                          SSL_F_TLS_PARSE_CTOS_PSK, ERR_R_INTERNAL_ERROR);
1192*e71b7053SJung-uk Kim                 return 0;
1193*e71b7053SJung-uk Kim             }
1194*e71b7053SJung-uk Kim             if (ret == SSL_TICKET_NONE || ret == SSL_TICKET_NO_DECRYPT)
1195*e71b7053SJung-uk Kim                 continue;
1196*e71b7053SJung-uk Kim 
1197*e71b7053SJung-uk Kim             /* Check for replay */
1198*e71b7053SJung-uk Kim             if (s->max_early_data > 0
1199*e71b7053SJung-uk Kim                     && (s->options & SSL_OP_NO_ANTI_REPLAY) == 0
1200*e71b7053SJung-uk Kim                     && !SSL_CTX_remove_session(s->session_ctx, sess)) {
1201*e71b7053SJung-uk Kim                 SSL_SESSION_free(sess);
1202*e71b7053SJung-uk Kim                 sess = NULL;
1203*e71b7053SJung-uk Kim                 continue;
1204*e71b7053SJung-uk Kim             }
1205*e71b7053SJung-uk Kim 
1206*e71b7053SJung-uk Kim             ticket_age = (uint32_t)ticket_agel;
1207*e71b7053SJung-uk Kim             now = (uint32_t)time(NULL);
1208*e71b7053SJung-uk Kim             agesec = now - (uint32_t)sess->time;
1209*e71b7053SJung-uk Kim             agems = agesec * (uint32_t)1000;
1210*e71b7053SJung-uk Kim             ticket_age -= sess->ext.tick_age_add;
1211*e71b7053SJung-uk Kim 
1212*e71b7053SJung-uk Kim             /*
1213*e71b7053SJung-uk Kim              * For simplicity we do our age calculations in seconds. If the
1214*e71b7053SJung-uk Kim              * client does it in ms then it could appear that their ticket age
1215*e71b7053SJung-uk Kim              * is longer than ours (our ticket age calculation should always be
1216*e71b7053SJung-uk Kim              * slightly longer than the client's due to the network latency).
1217*e71b7053SJung-uk Kim              * Therefore we add 1000ms to our age calculation to adjust for
1218*e71b7053SJung-uk Kim              * rounding errors.
1219*e71b7053SJung-uk Kim              */
1220*e71b7053SJung-uk Kim             if (id == 0
1221*e71b7053SJung-uk Kim                     && sess->timeout >= (long)agesec
1222*e71b7053SJung-uk Kim                     && agems / (uint32_t)1000 == agesec
1223*e71b7053SJung-uk Kim                     && ticket_age <= agems + 1000
1224*e71b7053SJung-uk Kim                     && ticket_age + TICKET_AGE_ALLOWANCE >= agems + 1000) {
1225*e71b7053SJung-uk Kim                 /*
1226*e71b7053SJung-uk Kim                  * Ticket age is within tolerance and not expired. We allow it
1227*e71b7053SJung-uk Kim                  * for early data
1228*e71b7053SJung-uk Kim                  */
1229*e71b7053SJung-uk Kim                 s->ext.early_data_ok = 1;
1230*e71b7053SJung-uk Kim             }
1231*e71b7053SJung-uk Kim         }
1232*e71b7053SJung-uk Kim 
1233*e71b7053SJung-uk Kim         md = ssl_md(sess->cipher->algorithm2);
1234*e71b7053SJung-uk Kim         if (md != ssl_md(s->s3->tmp.new_cipher->algorithm2)) {
1235*e71b7053SJung-uk Kim             /* The ciphersuite is not compatible with this session. */
1236*e71b7053SJung-uk Kim             SSL_SESSION_free(sess);
1237*e71b7053SJung-uk Kim             sess = NULL;
1238*e71b7053SJung-uk Kim             s->ext.early_data_ok = 0;
1239*e71b7053SJung-uk Kim             s->ext.ticket_expected = 0;
1240*e71b7053SJung-uk Kim             continue;
1241*e71b7053SJung-uk Kim         }
1242*e71b7053SJung-uk Kim         break;
1243*e71b7053SJung-uk Kim     }
1244*e71b7053SJung-uk Kim 
1245*e71b7053SJung-uk Kim     if (sess == NULL)
1246*e71b7053SJung-uk Kim         return 1;
1247*e71b7053SJung-uk Kim 
1248*e71b7053SJung-uk Kim     binderoffset = PACKET_data(pkt) - (const unsigned char *)s->init_buf->data;
1249*e71b7053SJung-uk Kim     hashsize = EVP_MD_size(md);
1250*e71b7053SJung-uk Kim 
1251*e71b7053SJung-uk Kim     if (!PACKET_get_length_prefixed_2(pkt, &binders)) {
1252*e71b7053SJung-uk Kim         SSLfatal(s, SSL_AD_DECODE_ERROR, SSL_F_TLS_PARSE_CTOS_PSK,
1253*e71b7053SJung-uk Kim                  SSL_R_BAD_EXTENSION);
1254*e71b7053SJung-uk Kim         goto err;
1255*e71b7053SJung-uk Kim     }
1256*e71b7053SJung-uk Kim 
1257*e71b7053SJung-uk Kim     for (i = 0; i <= id; i++) {
1258*e71b7053SJung-uk Kim         if (!PACKET_get_length_prefixed_1(&binders, &binder)) {
1259*e71b7053SJung-uk Kim             SSLfatal(s, SSL_AD_DECODE_ERROR, SSL_F_TLS_PARSE_CTOS_PSK,
1260*e71b7053SJung-uk Kim                      SSL_R_BAD_EXTENSION);
1261*e71b7053SJung-uk Kim             goto err;
1262*e71b7053SJung-uk Kim         }
1263*e71b7053SJung-uk Kim     }
1264*e71b7053SJung-uk Kim 
1265*e71b7053SJung-uk Kim     if (PACKET_remaining(&binder) != hashsize) {
1266*e71b7053SJung-uk Kim         SSLfatal(s, SSL_AD_DECODE_ERROR, SSL_F_TLS_PARSE_CTOS_PSK,
1267*e71b7053SJung-uk Kim                  SSL_R_BAD_EXTENSION);
1268*e71b7053SJung-uk Kim         goto err;
1269*e71b7053SJung-uk Kim     }
1270*e71b7053SJung-uk Kim     if (tls_psk_do_binder(s, md, (const unsigned char *)s->init_buf->data,
1271*e71b7053SJung-uk Kim                           binderoffset, PACKET_data(&binder), NULL, sess, 0,
1272*e71b7053SJung-uk Kim                           ext) != 1) {
1273*e71b7053SJung-uk Kim         /* SSLfatal() already called */
1274*e71b7053SJung-uk Kim         goto err;
1275*e71b7053SJung-uk Kim     }
1276*e71b7053SJung-uk Kim 
1277*e71b7053SJung-uk Kim     sess->ext.tick_identity = id;
1278*e71b7053SJung-uk Kim 
1279*e71b7053SJung-uk Kim     SSL_SESSION_free(s->session);
1280*e71b7053SJung-uk Kim     s->session = sess;
1281*e71b7053SJung-uk Kim     return 1;
1282*e71b7053SJung-uk Kim err:
1283*e71b7053SJung-uk Kim     SSL_SESSION_free(sess);
1284*e71b7053SJung-uk Kim     return 0;
1285*e71b7053SJung-uk Kim }
1286*e71b7053SJung-uk Kim 
1287*e71b7053SJung-uk Kim int tls_parse_ctos_post_handshake_auth(SSL *s, PACKET *pkt, unsigned int context,
1288*e71b7053SJung-uk Kim                                        X509 *x, size_t chainidx)
1289*e71b7053SJung-uk Kim {
1290*e71b7053SJung-uk Kim     if (PACKET_remaining(pkt) != 0) {
1291*e71b7053SJung-uk Kim         SSLfatal(s, SSL_AD_DECODE_ERROR, SSL_F_TLS_PARSE_CTOS_POST_HANDSHAKE_AUTH,
1292*e71b7053SJung-uk Kim                  SSL_R_POST_HANDSHAKE_AUTH_ENCODING_ERR);
1293*e71b7053SJung-uk Kim         return 0;
1294*e71b7053SJung-uk Kim     }
1295*e71b7053SJung-uk Kim 
1296*e71b7053SJung-uk Kim     s->post_handshake_auth = SSL_PHA_EXT_RECEIVED;
1297*e71b7053SJung-uk Kim 
1298*e71b7053SJung-uk Kim     return 1;
1299*e71b7053SJung-uk Kim }
1300*e71b7053SJung-uk Kim 
1301*e71b7053SJung-uk Kim /*
1302*e71b7053SJung-uk Kim  * Add the server's renegotiation binding
1303*e71b7053SJung-uk Kim  */
1304*e71b7053SJung-uk Kim EXT_RETURN tls_construct_stoc_renegotiate(SSL *s, WPACKET *pkt,
1305*e71b7053SJung-uk Kim                                           unsigned int context, X509 *x,
1306*e71b7053SJung-uk Kim                                           size_t chainidx)
1307*e71b7053SJung-uk Kim {
1308*e71b7053SJung-uk Kim     if (!s->s3->send_connection_binding)
1309*e71b7053SJung-uk Kim         return EXT_RETURN_NOT_SENT;
1310*e71b7053SJung-uk Kim 
1311*e71b7053SJung-uk Kim     /* Still add this even if SSL_OP_NO_RENEGOTIATION is set */
1312*e71b7053SJung-uk Kim     if (!WPACKET_put_bytes_u16(pkt, TLSEXT_TYPE_renegotiate)
1313*e71b7053SJung-uk Kim             || !WPACKET_start_sub_packet_u16(pkt)
1314*e71b7053SJung-uk Kim             || !WPACKET_start_sub_packet_u8(pkt)
1315*e71b7053SJung-uk Kim             || !WPACKET_memcpy(pkt, s->s3->previous_client_finished,
1316*e71b7053SJung-uk Kim                                s->s3->previous_client_finished_len)
1317*e71b7053SJung-uk Kim             || !WPACKET_memcpy(pkt, s->s3->previous_server_finished,
1318*e71b7053SJung-uk Kim                                s->s3->previous_server_finished_len)
1319*e71b7053SJung-uk Kim             || !WPACKET_close(pkt)
1320*e71b7053SJung-uk Kim             || !WPACKET_close(pkt)) {
1321*e71b7053SJung-uk Kim         SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_TLS_CONSTRUCT_STOC_RENEGOTIATE,
1322*e71b7053SJung-uk Kim                  ERR_R_INTERNAL_ERROR);
1323*e71b7053SJung-uk Kim         return EXT_RETURN_FAIL;
1324*e71b7053SJung-uk Kim     }
1325*e71b7053SJung-uk Kim 
1326*e71b7053SJung-uk Kim     return EXT_RETURN_SENT;
1327*e71b7053SJung-uk Kim }
1328*e71b7053SJung-uk Kim 
1329*e71b7053SJung-uk Kim EXT_RETURN tls_construct_stoc_server_name(SSL *s, WPACKET *pkt,
1330*e71b7053SJung-uk Kim                                           unsigned int context, X509 *x,
1331*e71b7053SJung-uk Kim                                           size_t chainidx)
1332*e71b7053SJung-uk Kim {
1333*e71b7053SJung-uk Kim     if (s->hit || s->servername_done != 1
1334*e71b7053SJung-uk Kim             || s->ext.hostname == NULL)
1335*e71b7053SJung-uk Kim         return EXT_RETURN_NOT_SENT;
1336*e71b7053SJung-uk Kim 
1337*e71b7053SJung-uk Kim     if (!WPACKET_put_bytes_u16(pkt, TLSEXT_TYPE_server_name)
1338*e71b7053SJung-uk Kim             || !WPACKET_put_bytes_u16(pkt, 0)) {
1339*e71b7053SJung-uk Kim         SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_TLS_CONSTRUCT_STOC_SERVER_NAME,
1340*e71b7053SJung-uk Kim                  ERR_R_INTERNAL_ERROR);
1341*e71b7053SJung-uk Kim         return EXT_RETURN_FAIL;
1342*e71b7053SJung-uk Kim     }
1343*e71b7053SJung-uk Kim 
1344*e71b7053SJung-uk Kim     return EXT_RETURN_SENT;
1345*e71b7053SJung-uk Kim }
1346*e71b7053SJung-uk Kim 
1347*e71b7053SJung-uk Kim /* Add/include the server's max fragment len extension into ServerHello */
1348*e71b7053SJung-uk Kim EXT_RETURN tls_construct_stoc_maxfragmentlen(SSL *s, WPACKET *pkt,
1349*e71b7053SJung-uk Kim                                              unsigned int context, X509 *x,
1350*e71b7053SJung-uk Kim                                              size_t chainidx)
1351*e71b7053SJung-uk Kim {
1352*e71b7053SJung-uk Kim     if (!USE_MAX_FRAGMENT_LENGTH_EXT(s->session))
1353*e71b7053SJung-uk Kim         return EXT_RETURN_NOT_SENT;
1354*e71b7053SJung-uk Kim 
1355*e71b7053SJung-uk Kim     /*-
1356*e71b7053SJung-uk Kim      * 4 bytes for this extension type and extension length
1357*e71b7053SJung-uk Kim      * 1 byte for the Max Fragment Length code value.
1358*e71b7053SJung-uk Kim      */
1359*e71b7053SJung-uk Kim     if (!WPACKET_put_bytes_u16(pkt, TLSEXT_TYPE_max_fragment_length)
1360*e71b7053SJung-uk Kim         || !WPACKET_start_sub_packet_u16(pkt)
1361*e71b7053SJung-uk Kim         || !WPACKET_put_bytes_u8(pkt, s->session->ext.max_fragment_len_mode)
1362*e71b7053SJung-uk Kim         || !WPACKET_close(pkt)) {
1363*e71b7053SJung-uk Kim         SSLfatal(s, SSL_AD_INTERNAL_ERROR,
1364*e71b7053SJung-uk Kim                  SSL_F_TLS_CONSTRUCT_STOC_MAXFRAGMENTLEN, ERR_R_INTERNAL_ERROR);
1365*e71b7053SJung-uk Kim         return EXT_RETURN_FAIL;
1366*e71b7053SJung-uk Kim     }
1367*e71b7053SJung-uk Kim 
1368*e71b7053SJung-uk Kim     return EXT_RETURN_SENT;
1369*e71b7053SJung-uk Kim }
1370*e71b7053SJung-uk Kim 
1371*e71b7053SJung-uk Kim #ifndef OPENSSL_NO_EC
1372*e71b7053SJung-uk Kim EXT_RETURN tls_construct_stoc_ec_pt_formats(SSL *s, WPACKET *pkt,
1373*e71b7053SJung-uk Kim                                             unsigned int context, X509 *x,
1374*e71b7053SJung-uk Kim                                             size_t chainidx)
1375*e71b7053SJung-uk Kim {
1376*e71b7053SJung-uk Kim     unsigned long alg_k = s->s3->tmp.new_cipher->algorithm_mkey;
1377*e71b7053SJung-uk Kim     unsigned long alg_a = s->s3->tmp.new_cipher->algorithm_auth;
1378*e71b7053SJung-uk Kim     int using_ecc = ((alg_k & SSL_kECDHE) || (alg_a & SSL_aECDSA))
1379*e71b7053SJung-uk Kim                     && (s->session->ext.ecpointformats != NULL);
1380*e71b7053SJung-uk Kim     const unsigned char *plist;
1381*e71b7053SJung-uk Kim     size_t plistlen;
1382*e71b7053SJung-uk Kim 
1383*e71b7053SJung-uk Kim     if (!using_ecc)
1384*e71b7053SJung-uk Kim         return EXT_RETURN_NOT_SENT;
1385*e71b7053SJung-uk Kim 
1386*e71b7053SJung-uk Kim     tls1_get_formatlist(s, &plist, &plistlen);
1387*e71b7053SJung-uk Kim     if (!WPACKET_put_bytes_u16(pkt, TLSEXT_TYPE_ec_point_formats)
1388*e71b7053SJung-uk Kim             || !WPACKET_start_sub_packet_u16(pkt)
1389*e71b7053SJung-uk Kim             || !WPACKET_sub_memcpy_u8(pkt, plist, plistlen)
1390*e71b7053SJung-uk Kim             || !WPACKET_close(pkt)) {
1391*e71b7053SJung-uk Kim         SSLfatal(s, SSL_AD_INTERNAL_ERROR,
1392*e71b7053SJung-uk Kim                  SSL_F_TLS_CONSTRUCT_STOC_EC_PT_FORMATS, ERR_R_INTERNAL_ERROR);
1393*e71b7053SJung-uk Kim         return EXT_RETURN_FAIL;
1394*e71b7053SJung-uk Kim     }
1395*e71b7053SJung-uk Kim 
1396*e71b7053SJung-uk Kim     return EXT_RETURN_SENT;
1397*e71b7053SJung-uk Kim }
1398*e71b7053SJung-uk Kim #endif
1399*e71b7053SJung-uk Kim 
1400*e71b7053SJung-uk Kim #ifndef OPENSSL_NO_EC
1401*e71b7053SJung-uk Kim EXT_RETURN tls_construct_stoc_supported_groups(SSL *s, WPACKET *pkt,
1402*e71b7053SJung-uk Kim                                                unsigned int context, X509 *x,
1403*e71b7053SJung-uk Kim                                                size_t chainidx)
1404*e71b7053SJung-uk Kim {
1405*e71b7053SJung-uk Kim     const uint16_t *groups;
1406*e71b7053SJung-uk Kim     size_t numgroups, i, first = 1;
1407*e71b7053SJung-uk Kim 
1408*e71b7053SJung-uk Kim     /* s->s3->group_id is non zero if we accepted a key_share */
1409*e71b7053SJung-uk Kim     if (s->s3->group_id == 0)
1410*e71b7053SJung-uk Kim         return EXT_RETURN_NOT_SENT;
1411*e71b7053SJung-uk Kim 
1412*e71b7053SJung-uk Kim     /* Get our list of supported groups */
1413*e71b7053SJung-uk Kim     tls1_get_supported_groups(s, &groups, &numgroups);
1414*e71b7053SJung-uk Kim     if (numgroups == 0) {
1415*e71b7053SJung-uk Kim         SSLfatal(s, SSL_AD_INTERNAL_ERROR,
1416*e71b7053SJung-uk Kim                  SSL_F_TLS_CONSTRUCT_STOC_SUPPORTED_GROUPS, ERR_R_INTERNAL_ERROR);
1417*e71b7053SJung-uk Kim         return EXT_RETURN_FAIL;
1418*e71b7053SJung-uk Kim     }
1419*e71b7053SJung-uk Kim 
1420*e71b7053SJung-uk Kim     /* Copy group ID if supported */
1421*e71b7053SJung-uk Kim     for (i = 0; i < numgroups; i++) {
1422*e71b7053SJung-uk Kim         uint16_t group = groups[i];
1423*e71b7053SJung-uk Kim 
1424*e71b7053SJung-uk Kim         if (tls_curve_allowed(s, group, SSL_SECOP_CURVE_SUPPORTED)) {
1425*e71b7053SJung-uk Kim             if (first) {
1426*e71b7053SJung-uk Kim                 /*
1427*e71b7053SJung-uk Kim                  * Check if the client is already using our preferred group. If
1428*e71b7053SJung-uk Kim                  * so we don't need to add this extension
1429*e71b7053SJung-uk Kim                  */
1430*e71b7053SJung-uk Kim                 if (s->s3->group_id == group)
1431*e71b7053SJung-uk Kim                     return EXT_RETURN_NOT_SENT;
1432*e71b7053SJung-uk Kim 
1433*e71b7053SJung-uk Kim                 /* Add extension header */
1434*e71b7053SJung-uk Kim                 if (!WPACKET_put_bytes_u16(pkt, TLSEXT_TYPE_supported_groups)
1435*e71b7053SJung-uk Kim                            /* Sub-packet for supported_groups extension */
1436*e71b7053SJung-uk Kim                         || !WPACKET_start_sub_packet_u16(pkt)
1437*e71b7053SJung-uk Kim                         || !WPACKET_start_sub_packet_u16(pkt)) {
1438*e71b7053SJung-uk Kim                     SSLfatal(s, SSL_AD_INTERNAL_ERROR,
1439*e71b7053SJung-uk Kim                              SSL_F_TLS_CONSTRUCT_STOC_SUPPORTED_GROUPS,
1440*e71b7053SJung-uk Kim                              ERR_R_INTERNAL_ERROR);
1441*e71b7053SJung-uk Kim                     return EXT_RETURN_FAIL;
1442*e71b7053SJung-uk Kim                 }
1443*e71b7053SJung-uk Kim 
1444*e71b7053SJung-uk Kim                 first = 0;
1445*e71b7053SJung-uk Kim             }
1446*e71b7053SJung-uk Kim             if (!WPACKET_put_bytes_u16(pkt, group)) {
1447*e71b7053SJung-uk Kim                     SSLfatal(s, SSL_AD_INTERNAL_ERROR,
1448*e71b7053SJung-uk Kim                              SSL_F_TLS_CONSTRUCT_STOC_SUPPORTED_GROUPS,
1449*e71b7053SJung-uk Kim                              ERR_R_INTERNAL_ERROR);
1450*e71b7053SJung-uk Kim                     return EXT_RETURN_FAIL;
1451*e71b7053SJung-uk Kim                 }
1452*e71b7053SJung-uk Kim         }
1453*e71b7053SJung-uk Kim     }
1454*e71b7053SJung-uk Kim 
1455*e71b7053SJung-uk Kim     if (!WPACKET_close(pkt) || !WPACKET_close(pkt)) {
1456*e71b7053SJung-uk Kim         SSLfatal(s, SSL_AD_INTERNAL_ERROR,
1457*e71b7053SJung-uk Kim                  SSL_F_TLS_CONSTRUCT_STOC_SUPPORTED_GROUPS,
1458*e71b7053SJung-uk Kim                  ERR_R_INTERNAL_ERROR);
1459*e71b7053SJung-uk Kim         return EXT_RETURN_FAIL;
1460*e71b7053SJung-uk Kim     }
1461*e71b7053SJung-uk Kim 
1462*e71b7053SJung-uk Kim     return EXT_RETURN_SENT;
1463*e71b7053SJung-uk Kim }
1464*e71b7053SJung-uk Kim #endif
1465*e71b7053SJung-uk Kim 
1466*e71b7053SJung-uk Kim EXT_RETURN tls_construct_stoc_session_ticket(SSL *s, WPACKET *pkt,
1467*e71b7053SJung-uk Kim                                              unsigned int context, X509 *x,
1468*e71b7053SJung-uk Kim                                              size_t chainidx)
1469*e71b7053SJung-uk Kim {
1470*e71b7053SJung-uk Kim     if (!s->ext.ticket_expected || !tls_use_ticket(s)) {
1471*e71b7053SJung-uk Kim         s->ext.ticket_expected = 0;
1472*e71b7053SJung-uk Kim         return EXT_RETURN_NOT_SENT;
1473*e71b7053SJung-uk Kim     }
1474*e71b7053SJung-uk Kim 
1475*e71b7053SJung-uk Kim     if (!WPACKET_put_bytes_u16(pkt, TLSEXT_TYPE_session_ticket)
1476*e71b7053SJung-uk Kim             || !WPACKET_put_bytes_u16(pkt, 0)) {
1477*e71b7053SJung-uk Kim         SSLfatal(s, SSL_AD_INTERNAL_ERROR,
1478*e71b7053SJung-uk Kim                  SSL_F_TLS_CONSTRUCT_STOC_SESSION_TICKET, ERR_R_INTERNAL_ERROR);
1479*e71b7053SJung-uk Kim         return EXT_RETURN_FAIL;
1480*e71b7053SJung-uk Kim     }
1481*e71b7053SJung-uk Kim 
1482*e71b7053SJung-uk Kim     return EXT_RETURN_SENT;
1483*e71b7053SJung-uk Kim }
1484*e71b7053SJung-uk Kim 
1485*e71b7053SJung-uk Kim #ifndef OPENSSL_NO_OCSP
1486*e71b7053SJung-uk Kim EXT_RETURN tls_construct_stoc_status_request(SSL *s, WPACKET *pkt,
1487*e71b7053SJung-uk Kim                                              unsigned int context, X509 *x,
1488*e71b7053SJung-uk Kim                                              size_t chainidx)
1489*e71b7053SJung-uk Kim {
1490*e71b7053SJung-uk Kim     if (!s->ext.status_expected)
1491*e71b7053SJung-uk Kim         return EXT_RETURN_NOT_SENT;
1492*e71b7053SJung-uk Kim 
1493*e71b7053SJung-uk Kim     if (SSL_IS_TLS13(s) && chainidx != 0)
1494*e71b7053SJung-uk Kim         return EXT_RETURN_NOT_SENT;
1495*e71b7053SJung-uk Kim 
1496*e71b7053SJung-uk Kim     if (!WPACKET_put_bytes_u16(pkt, TLSEXT_TYPE_status_request)
1497*e71b7053SJung-uk Kim             || !WPACKET_start_sub_packet_u16(pkt)) {
1498*e71b7053SJung-uk Kim         SSLfatal(s, SSL_AD_INTERNAL_ERROR,
1499*e71b7053SJung-uk Kim                  SSL_F_TLS_CONSTRUCT_STOC_STATUS_REQUEST, ERR_R_INTERNAL_ERROR);
1500*e71b7053SJung-uk Kim         return EXT_RETURN_FAIL;
1501*e71b7053SJung-uk Kim     }
1502*e71b7053SJung-uk Kim 
1503*e71b7053SJung-uk Kim     /*
1504*e71b7053SJung-uk Kim      * In TLSv1.3 we include the certificate status itself. In <= TLSv1.2 we
1505*e71b7053SJung-uk Kim      * send back an empty extension, with the certificate status appearing as a
1506*e71b7053SJung-uk Kim      * separate message
1507*e71b7053SJung-uk Kim      */
1508*e71b7053SJung-uk Kim     if (SSL_IS_TLS13(s) && !tls_construct_cert_status_body(s, pkt)) {
1509*e71b7053SJung-uk Kim        /* SSLfatal() already called */
1510*e71b7053SJung-uk Kim        return EXT_RETURN_FAIL;
1511*e71b7053SJung-uk Kim     }
1512*e71b7053SJung-uk Kim     if (!WPACKET_close(pkt)) {
1513*e71b7053SJung-uk Kim         SSLfatal(s, SSL_AD_INTERNAL_ERROR,
1514*e71b7053SJung-uk Kim                  SSL_F_TLS_CONSTRUCT_STOC_STATUS_REQUEST, ERR_R_INTERNAL_ERROR);
1515*e71b7053SJung-uk Kim         return EXT_RETURN_FAIL;
1516*e71b7053SJung-uk Kim     }
1517*e71b7053SJung-uk Kim 
1518*e71b7053SJung-uk Kim     return EXT_RETURN_SENT;
1519*e71b7053SJung-uk Kim }
1520*e71b7053SJung-uk Kim #endif
1521*e71b7053SJung-uk Kim 
1522*e71b7053SJung-uk Kim #ifndef OPENSSL_NO_NEXTPROTONEG
1523*e71b7053SJung-uk Kim EXT_RETURN tls_construct_stoc_next_proto_neg(SSL *s, WPACKET *pkt,
1524*e71b7053SJung-uk Kim                                              unsigned int context, X509 *x,
1525*e71b7053SJung-uk Kim                                              size_t chainidx)
1526*e71b7053SJung-uk Kim {
1527*e71b7053SJung-uk Kim     const unsigned char *npa;
1528*e71b7053SJung-uk Kim     unsigned int npalen;
1529*e71b7053SJung-uk Kim     int ret;
1530*e71b7053SJung-uk Kim     int npn_seen = s->s3->npn_seen;
1531*e71b7053SJung-uk Kim 
1532*e71b7053SJung-uk Kim     s->s3->npn_seen = 0;
1533*e71b7053SJung-uk Kim     if (!npn_seen || s->ctx->ext.npn_advertised_cb == NULL)
1534*e71b7053SJung-uk Kim         return EXT_RETURN_NOT_SENT;
1535*e71b7053SJung-uk Kim 
1536*e71b7053SJung-uk Kim     ret = s->ctx->ext.npn_advertised_cb(s, &npa, &npalen,
1537*e71b7053SJung-uk Kim                                         s->ctx->ext.npn_advertised_cb_arg);
1538*e71b7053SJung-uk Kim     if (ret == SSL_TLSEXT_ERR_OK) {
1539*e71b7053SJung-uk Kim         if (!WPACKET_put_bytes_u16(pkt, TLSEXT_TYPE_next_proto_neg)
1540*e71b7053SJung-uk Kim                 || !WPACKET_sub_memcpy_u16(pkt, npa, npalen)) {
1541*e71b7053SJung-uk Kim             SSLfatal(s, SSL_AD_INTERNAL_ERROR,
1542*e71b7053SJung-uk Kim                      SSL_F_TLS_CONSTRUCT_STOC_NEXT_PROTO_NEG,
1543*e71b7053SJung-uk Kim                      ERR_R_INTERNAL_ERROR);
1544*e71b7053SJung-uk Kim             return EXT_RETURN_FAIL;
1545*e71b7053SJung-uk Kim         }
1546*e71b7053SJung-uk Kim         s->s3->npn_seen = 1;
1547*e71b7053SJung-uk Kim     }
1548*e71b7053SJung-uk Kim 
1549*e71b7053SJung-uk Kim     return EXT_RETURN_SENT;
1550*e71b7053SJung-uk Kim }
1551*e71b7053SJung-uk Kim #endif
1552*e71b7053SJung-uk Kim 
1553*e71b7053SJung-uk Kim EXT_RETURN tls_construct_stoc_alpn(SSL *s, WPACKET *pkt, unsigned int context,
1554*e71b7053SJung-uk Kim                                    X509 *x, size_t chainidx)
1555*e71b7053SJung-uk Kim {
1556*e71b7053SJung-uk Kim     if (s->s3->alpn_selected == NULL)
1557*e71b7053SJung-uk Kim         return EXT_RETURN_NOT_SENT;
1558*e71b7053SJung-uk Kim 
1559*e71b7053SJung-uk Kim     if (!WPACKET_put_bytes_u16(pkt,
1560*e71b7053SJung-uk Kim                 TLSEXT_TYPE_application_layer_protocol_negotiation)
1561*e71b7053SJung-uk Kim             || !WPACKET_start_sub_packet_u16(pkt)
1562*e71b7053SJung-uk Kim             || !WPACKET_start_sub_packet_u16(pkt)
1563*e71b7053SJung-uk Kim             || !WPACKET_sub_memcpy_u8(pkt, s->s3->alpn_selected,
1564*e71b7053SJung-uk Kim                                       s->s3->alpn_selected_len)
1565*e71b7053SJung-uk Kim             || !WPACKET_close(pkt)
1566*e71b7053SJung-uk Kim             || !WPACKET_close(pkt)) {
1567*e71b7053SJung-uk Kim         SSLfatal(s, SSL_AD_INTERNAL_ERROR,
1568*e71b7053SJung-uk Kim                  SSL_F_TLS_CONSTRUCT_STOC_ALPN, ERR_R_INTERNAL_ERROR);
1569*e71b7053SJung-uk Kim         return EXT_RETURN_FAIL;
1570*e71b7053SJung-uk Kim     }
1571*e71b7053SJung-uk Kim 
1572*e71b7053SJung-uk Kim     return EXT_RETURN_SENT;
1573*e71b7053SJung-uk Kim }
1574*e71b7053SJung-uk Kim 
1575*e71b7053SJung-uk Kim #ifndef OPENSSL_NO_SRTP
1576*e71b7053SJung-uk Kim EXT_RETURN tls_construct_stoc_use_srtp(SSL *s, WPACKET *pkt,
1577*e71b7053SJung-uk Kim                                        unsigned int context, X509 *x,
1578*e71b7053SJung-uk Kim                                        size_t chainidx)
1579*e71b7053SJung-uk Kim {
1580*e71b7053SJung-uk Kim     if (s->srtp_profile == NULL)
1581*e71b7053SJung-uk Kim         return EXT_RETURN_NOT_SENT;
1582*e71b7053SJung-uk Kim 
1583*e71b7053SJung-uk Kim     if (!WPACKET_put_bytes_u16(pkt, TLSEXT_TYPE_use_srtp)
1584*e71b7053SJung-uk Kim             || !WPACKET_start_sub_packet_u16(pkt)
1585*e71b7053SJung-uk Kim             || !WPACKET_put_bytes_u16(pkt, 2)
1586*e71b7053SJung-uk Kim             || !WPACKET_put_bytes_u16(pkt, s->srtp_profile->id)
1587*e71b7053SJung-uk Kim             || !WPACKET_put_bytes_u8(pkt, 0)
1588*e71b7053SJung-uk Kim             || !WPACKET_close(pkt)) {
1589*e71b7053SJung-uk Kim         SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_TLS_CONSTRUCT_STOC_USE_SRTP,
1590*e71b7053SJung-uk Kim                  ERR_R_INTERNAL_ERROR);
1591*e71b7053SJung-uk Kim         return EXT_RETURN_FAIL;
1592*e71b7053SJung-uk Kim     }
1593*e71b7053SJung-uk Kim 
1594*e71b7053SJung-uk Kim     return EXT_RETURN_SENT;
1595*e71b7053SJung-uk Kim }
1596*e71b7053SJung-uk Kim #endif
1597*e71b7053SJung-uk Kim 
1598*e71b7053SJung-uk Kim EXT_RETURN tls_construct_stoc_etm(SSL *s, WPACKET *pkt, unsigned int context,
1599*e71b7053SJung-uk Kim                                   X509 *x, size_t chainidx)
1600*e71b7053SJung-uk Kim {
1601*e71b7053SJung-uk Kim     if (!s->ext.use_etm)
1602*e71b7053SJung-uk Kim         return EXT_RETURN_NOT_SENT;
1603*e71b7053SJung-uk Kim 
1604*e71b7053SJung-uk Kim     /*
1605*e71b7053SJung-uk Kim      * Don't use encrypt_then_mac if AEAD or RC4 might want to disable
1606*e71b7053SJung-uk Kim      * for other cases too.
1607*e71b7053SJung-uk Kim      */
1608*e71b7053SJung-uk Kim     if (s->s3->tmp.new_cipher->algorithm_mac == SSL_AEAD
1609*e71b7053SJung-uk Kim         || s->s3->tmp.new_cipher->algorithm_enc == SSL_RC4
1610*e71b7053SJung-uk Kim         || s->s3->tmp.new_cipher->algorithm_enc == SSL_eGOST2814789CNT
1611*e71b7053SJung-uk Kim         || s->s3->tmp.new_cipher->algorithm_enc == SSL_eGOST2814789CNT12) {
1612*e71b7053SJung-uk Kim         s->ext.use_etm = 0;
1613*e71b7053SJung-uk Kim         return EXT_RETURN_NOT_SENT;
1614*e71b7053SJung-uk Kim     }
1615*e71b7053SJung-uk Kim 
1616*e71b7053SJung-uk Kim     if (!WPACKET_put_bytes_u16(pkt, TLSEXT_TYPE_encrypt_then_mac)
1617*e71b7053SJung-uk Kim             || !WPACKET_put_bytes_u16(pkt, 0)) {
1618*e71b7053SJung-uk Kim         SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_TLS_CONSTRUCT_STOC_ETM,
1619*e71b7053SJung-uk Kim                  ERR_R_INTERNAL_ERROR);
1620*e71b7053SJung-uk Kim         return EXT_RETURN_FAIL;
1621*e71b7053SJung-uk Kim     }
1622*e71b7053SJung-uk Kim 
1623*e71b7053SJung-uk Kim     return EXT_RETURN_SENT;
1624*e71b7053SJung-uk Kim }
1625*e71b7053SJung-uk Kim 
1626*e71b7053SJung-uk Kim EXT_RETURN tls_construct_stoc_ems(SSL *s, WPACKET *pkt, unsigned int context,
1627*e71b7053SJung-uk Kim                                   X509 *x, size_t chainidx)
1628*e71b7053SJung-uk Kim {
1629*e71b7053SJung-uk Kim     if ((s->s3->flags & TLS1_FLAGS_RECEIVED_EXTMS) == 0)
1630*e71b7053SJung-uk Kim         return EXT_RETURN_NOT_SENT;
1631*e71b7053SJung-uk Kim 
1632*e71b7053SJung-uk Kim     if (!WPACKET_put_bytes_u16(pkt, TLSEXT_TYPE_extended_master_secret)
1633*e71b7053SJung-uk Kim             || !WPACKET_put_bytes_u16(pkt, 0)) {
1634*e71b7053SJung-uk Kim         SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_TLS_CONSTRUCT_STOC_EMS,
1635*e71b7053SJung-uk Kim                  ERR_R_INTERNAL_ERROR);
1636*e71b7053SJung-uk Kim         return EXT_RETURN_FAIL;
1637*e71b7053SJung-uk Kim     }
1638*e71b7053SJung-uk Kim 
1639*e71b7053SJung-uk Kim     return EXT_RETURN_SENT;
1640*e71b7053SJung-uk Kim }
1641*e71b7053SJung-uk Kim 
1642*e71b7053SJung-uk Kim EXT_RETURN tls_construct_stoc_supported_versions(SSL *s, WPACKET *pkt,
1643*e71b7053SJung-uk Kim                                                  unsigned int context, X509 *x,
1644*e71b7053SJung-uk Kim                                                  size_t chainidx)
1645*e71b7053SJung-uk Kim {
1646*e71b7053SJung-uk Kim     if (!ossl_assert(SSL_IS_TLS13(s))) {
1647*e71b7053SJung-uk Kim         SSLfatal(s, SSL_AD_INTERNAL_ERROR,
1648*e71b7053SJung-uk Kim                  SSL_F_TLS_CONSTRUCT_STOC_SUPPORTED_VERSIONS,
1649*e71b7053SJung-uk Kim                  ERR_R_INTERNAL_ERROR);
1650*e71b7053SJung-uk Kim         return EXT_RETURN_FAIL;
1651*e71b7053SJung-uk Kim     }
1652*e71b7053SJung-uk Kim 
1653*e71b7053SJung-uk Kim     if (!WPACKET_put_bytes_u16(pkt, TLSEXT_TYPE_supported_versions)
1654*e71b7053SJung-uk Kim             || !WPACKET_start_sub_packet_u16(pkt)
1655*e71b7053SJung-uk Kim             || !WPACKET_put_bytes_u16(pkt, s->version)
1656*e71b7053SJung-uk Kim             || !WPACKET_close(pkt)) {
1657*e71b7053SJung-uk Kim         SSLfatal(s, SSL_AD_INTERNAL_ERROR,
1658*e71b7053SJung-uk Kim                  SSL_F_TLS_CONSTRUCT_STOC_SUPPORTED_VERSIONS,
1659*e71b7053SJung-uk Kim                  ERR_R_INTERNAL_ERROR);
1660*e71b7053SJung-uk Kim         return EXT_RETURN_FAIL;
1661*e71b7053SJung-uk Kim     }
1662*e71b7053SJung-uk Kim 
1663*e71b7053SJung-uk Kim     return EXT_RETURN_SENT;
1664*e71b7053SJung-uk Kim }
1665*e71b7053SJung-uk Kim 
1666*e71b7053SJung-uk Kim EXT_RETURN tls_construct_stoc_key_share(SSL *s, WPACKET *pkt,
1667*e71b7053SJung-uk Kim                                         unsigned int context, X509 *x,
1668*e71b7053SJung-uk Kim                                         size_t chainidx)
1669*e71b7053SJung-uk Kim {
1670*e71b7053SJung-uk Kim #ifndef OPENSSL_NO_TLS1_3
1671*e71b7053SJung-uk Kim     unsigned char *encodedPoint;
1672*e71b7053SJung-uk Kim     size_t encoded_pt_len = 0;
1673*e71b7053SJung-uk Kim     EVP_PKEY *ckey = s->s3->peer_tmp, *skey = NULL;
1674*e71b7053SJung-uk Kim 
1675*e71b7053SJung-uk Kim     if (s->hello_retry_request == SSL_HRR_PENDING) {
1676*e71b7053SJung-uk Kim         if (ckey != NULL) {
1677*e71b7053SJung-uk Kim             /* Original key_share was acceptable so don't ask for another one */
1678*e71b7053SJung-uk Kim             return EXT_RETURN_NOT_SENT;
1679*e71b7053SJung-uk Kim         }
1680*e71b7053SJung-uk Kim         if (!WPACKET_put_bytes_u16(pkt, TLSEXT_TYPE_key_share)
1681*e71b7053SJung-uk Kim                 || !WPACKET_start_sub_packet_u16(pkt)
1682*e71b7053SJung-uk Kim                 || !WPACKET_put_bytes_u16(pkt, s->s3->group_id)
1683*e71b7053SJung-uk Kim                 || !WPACKET_close(pkt)) {
1684*e71b7053SJung-uk Kim             SSLfatal(s, SSL_AD_INTERNAL_ERROR,
1685*e71b7053SJung-uk Kim                      SSL_F_TLS_CONSTRUCT_STOC_KEY_SHARE,
1686*e71b7053SJung-uk Kim                      ERR_R_INTERNAL_ERROR);
1687*e71b7053SJung-uk Kim             return EXT_RETURN_FAIL;
1688*e71b7053SJung-uk Kim         }
1689*e71b7053SJung-uk Kim 
1690*e71b7053SJung-uk Kim         return EXT_RETURN_SENT;
1691*e71b7053SJung-uk Kim     }
1692*e71b7053SJung-uk Kim 
1693*e71b7053SJung-uk Kim     if (ckey == NULL) {
1694*e71b7053SJung-uk Kim         /* No key_share received from client - must be resuming */
1695*e71b7053SJung-uk Kim         if (!s->hit || !tls13_generate_handshake_secret(s, NULL, 0)) {
1696*e71b7053SJung-uk Kim             SSLfatal(s, SSL_AD_INTERNAL_ERROR,
1697*e71b7053SJung-uk Kim                      SSL_F_TLS_CONSTRUCT_STOC_KEY_SHARE, ERR_R_INTERNAL_ERROR);
1698*e71b7053SJung-uk Kim             return EXT_RETURN_FAIL;
1699*e71b7053SJung-uk Kim         }
1700*e71b7053SJung-uk Kim         return EXT_RETURN_NOT_SENT;
1701*e71b7053SJung-uk Kim     }
1702*e71b7053SJung-uk Kim 
1703*e71b7053SJung-uk Kim     if (!WPACKET_put_bytes_u16(pkt, TLSEXT_TYPE_key_share)
1704*e71b7053SJung-uk Kim             || !WPACKET_start_sub_packet_u16(pkt)
1705*e71b7053SJung-uk Kim             || !WPACKET_put_bytes_u16(pkt, s->s3->group_id)) {
1706*e71b7053SJung-uk Kim         SSLfatal(s, SSL_AD_INTERNAL_ERROR,
1707*e71b7053SJung-uk Kim                  SSL_F_TLS_CONSTRUCT_STOC_KEY_SHARE, ERR_R_INTERNAL_ERROR);
1708*e71b7053SJung-uk Kim         return EXT_RETURN_FAIL;
1709*e71b7053SJung-uk Kim     }
1710*e71b7053SJung-uk Kim 
1711*e71b7053SJung-uk Kim     skey = ssl_generate_pkey(ckey);
1712*e71b7053SJung-uk Kim     if (skey == NULL) {
1713*e71b7053SJung-uk Kim         SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_TLS_CONSTRUCT_STOC_KEY_SHARE,
1714*e71b7053SJung-uk Kim                  ERR_R_MALLOC_FAILURE);
1715*e71b7053SJung-uk Kim         return EXT_RETURN_FAIL;
1716*e71b7053SJung-uk Kim     }
1717*e71b7053SJung-uk Kim 
1718*e71b7053SJung-uk Kim     /* Generate encoding of server key */
1719*e71b7053SJung-uk Kim     encoded_pt_len = EVP_PKEY_get1_tls_encodedpoint(skey, &encodedPoint);
1720*e71b7053SJung-uk Kim     if (encoded_pt_len == 0) {
1721*e71b7053SJung-uk Kim         SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_TLS_CONSTRUCT_STOC_KEY_SHARE,
1722*e71b7053SJung-uk Kim                  ERR_R_EC_LIB);
1723*e71b7053SJung-uk Kim         EVP_PKEY_free(skey);
1724*e71b7053SJung-uk Kim         return EXT_RETURN_FAIL;
1725*e71b7053SJung-uk Kim     }
1726*e71b7053SJung-uk Kim 
1727*e71b7053SJung-uk Kim     if (!WPACKET_sub_memcpy_u16(pkt, encodedPoint, encoded_pt_len)
1728*e71b7053SJung-uk Kim             || !WPACKET_close(pkt)) {
1729*e71b7053SJung-uk Kim         SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_TLS_CONSTRUCT_STOC_KEY_SHARE,
1730*e71b7053SJung-uk Kim                  ERR_R_INTERNAL_ERROR);
1731*e71b7053SJung-uk Kim         EVP_PKEY_free(skey);
1732*e71b7053SJung-uk Kim         OPENSSL_free(encodedPoint);
1733*e71b7053SJung-uk Kim         return EXT_RETURN_FAIL;
1734*e71b7053SJung-uk Kim     }
1735*e71b7053SJung-uk Kim     OPENSSL_free(encodedPoint);
1736*e71b7053SJung-uk Kim 
1737*e71b7053SJung-uk Kim     /* This causes the crypto state to be updated based on the derived keys */
1738*e71b7053SJung-uk Kim     s->s3->tmp.pkey = skey;
1739*e71b7053SJung-uk Kim     if (ssl_derive(s, skey, ckey, 1) == 0) {
1740*e71b7053SJung-uk Kim         /* SSLfatal() already called */
1741*e71b7053SJung-uk Kim         return EXT_RETURN_FAIL;
1742*e71b7053SJung-uk Kim     }
1743*e71b7053SJung-uk Kim     return EXT_RETURN_SENT;
1744*e71b7053SJung-uk Kim #else
1745*e71b7053SJung-uk Kim     return EXT_RETURN_FAIL;
1746*e71b7053SJung-uk Kim #endif
1747*e71b7053SJung-uk Kim }
1748*e71b7053SJung-uk Kim 
1749*e71b7053SJung-uk Kim EXT_RETURN tls_construct_stoc_cookie(SSL *s, WPACKET *pkt, unsigned int context,
1750*e71b7053SJung-uk Kim                                      X509 *x, size_t chainidx)
1751*e71b7053SJung-uk Kim {
1752*e71b7053SJung-uk Kim #ifndef OPENSSL_NO_TLS1_3
1753*e71b7053SJung-uk Kim     unsigned char *hashval1, *hashval2, *appcookie1, *appcookie2, *cookie;
1754*e71b7053SJung-uk Kim     unsigned char *hmac, *hmac2;
1755*e71b7053SJung-uk Kim     size_t startlen, ciphlen, totcookielen, hashlen, hmaclen, appcookielen;
1756*e71b7053SJung-uk Kim     EVP_MD_CTX *hctx;
1757*e71b7053SJung-uk Kim     EVP_PKEY *pkey;
1758*e71b7053SJung-uk Kim     int ret = EXT_RETURN_FAIL;
1759*e71b7053SJung-uk Kim 
1760*e71b7053SJung-uk Kim     if ((s->s3->flags & TLS1_FLAGS_STATELESS) == 0)
1761*e71b7053SJung-uk Kim         return EXT_RETURN_NOT_SENT;
1762*e71b7053SJung-uk Kim 
1763*e71b7053SJung-uk Kim     if (s->ctx->gen_stateless_cookie_cb == NULL) {
1764*e71b7053SJung-uk Kim         SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_TLS_CONSTRUCT_STOC_COOKIE,
1765*e71b7053SJung-uk Kim                  SSL_R_NO_COOKIE_CALLBACK_SET);
1766*e71b7053SJung-uk Kim         return EXT_RETURN_FAIL;
1767*e71b7053SJung-uk Kim     }
1768*e71b7053SJung-uk Kim 
1769*e71b7053SJung-uk Kim     if (!WPACKET_put_bytes_u16(pkt, TLSEXT_TYPE_cookie)
1770*e71b7053SJung-uk Kim             || !WPACKET_start_sub_packet_u16(pkt)
1771*e71b7053SJung-uk Kim             || !WPACKET_start_sub_packet_u16(pkt)
1772*e71b7053SJung-uk Kim             || !WPACKET_get_total_written(pkt, &startlen)
1773*e71b7053SJung-uk Kim             || !WPACKET_reserve_bytes(pkt, MAX_COOKIE_SIZE, &cookie)
1774*e71b7053SJung-uk Kim             || !WPACKET_put_bytes_u16(pkt, COOKIE_STATE_FORMAT_VERSION)
1775*e71b7053SJung-uk Kim             || !WPACKET_put_bytes_u16(pkt, TLS1_3_VERSION)
1776*e71b7053SJung-uk Kim             || !WPACKET_put_bytes_u16(pkt, s->s3->group_id)
1777*e71b7053SJung-uk Kim             || !s->method->put_cipher_by_char(s->s3->tmp.new_cipher, pkt,
1778*e71b7053SJung-uk Kim                                               &ciphlen)
1779*e71b7053SJung-uk Kim                /* Is there a key_share extension present in this HRR? */
1780*e71b7053SJung-uk Kim             || !WPACKET_put_bytes_u8(pkt, s->s3->peer_tmp == NULL)
1781*e71b7053SJung-uk Kim             || !WPACKET_put_bytes_u32(pkt, (unsigned int)time(NULL))
1782*e71b7053SJung-uk Kim             || !WPACKET_start_sub_packet_u16(pkt)
1783*e71b7053SJung-uk Kim             || !WPACKET_reserve_bytes(pkt, EVP_MAX_MD_SIZE, &hashval1)) {
1784*e71b7053SJung-uk Kim         SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_TLS_CONSTRUCT_STOC_COOKIE,
1785*e71b7053SJung-uk Kim                  ERR_R_INTERNAL_ERROR);
1786*e71b7053SJung-uk Kim         return EXT_RETURN_FAIL;
1787*e71b7053SJung-uk Kim     }
1788*e71b7053SJung-uk Kim 
1789*e71b7053SJung-uk Kim     /*
1790*e71b7053SJung-uk Kim      * Get the hash of the initial ClientHello. ssl_handshake_hash() operates
1791*e71b7053SJung-uk Kim      * on raw buffers, so we first reserve sufficient bytes (above) and then
1792*e71b7053SJung-uk Kim      * subsequently allocate them (below)
1793*e71b7053SJung-uk Kim      */
1794*e71b7053SJung-uk Kim     if (!ssl3_digest_cached_records(s, 0)
1795*e71b7053SJung-uk Kim             || !ssl_handshake_hash(s, hashval1, EVP_MAX_MD_SIZE, &hashlen)) {
1796*e71b7053SJung-uk Kim         /* SSLfatal() already called */
1797*e71b7053SJung-uk Kim         return EXT_RETURN_FAIL;
1798*e71b7053SJung-uk Kim     }
1799*e71b7053SJung-uk Kim 
1800*e71b7053SJung-uk Kim     if (!WPACKET_allocate_bytes(pkt, hashlen, &hashval2)
1801*e71b7053SJung-uk Kim             || !ossl_assert(hashval1 == hashval2)
1802*e71b7053SJung-uk Kim             || !WPACKET_close(pkt)
1803*e71b7053SJung-uk Kim             || !WPACKET_start_sub_packet_u8(pkt)
1804*e71b7053SJung-uk Kim             || !WPACKET_reserve_bytes(pkt, SSL_COOKIE_LENGTH, &appcookie1)) {
1805*e71b7053SJung-uk Kim         SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_TLS_CONSTRUCT_STOC_COOKIE,
1806*e71b7053SJung-uk Kim                  ERR_R_INTERNAL_ERROR);
1807*e71b7053SJung-uk Kim         return EXT_RETURN_FAIL;
1808*e71b7053SJung-uk Kim     }
1809*e71b7053SJung-uk Kim 
1810*e71b7053SJung-uk Kim     /* Generate the application cookie */
1811*e71b7053SJung-uk Kim     if (s->ctx->gen_stateless_cookie_cb(s, appcookie1, &appcookielen) == 0) {
1812*e71b7053SJung-uk Kim         SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_TLS_CONSTRUCT_STOC_COOKIE,
1813*e71b7053SJung-uk Kim                  SSL_R_COOKIE_GEN_CALLBACK_FAILURE);
1814*e71b7053SJung-uk Kim         return EXT_RETURN_FAIL;
1815*e71b7053SJung-uk Kim     }
1816*e71b7053SJung-uk Kim 
1817*e71b7053SJung-uk Kim     if (!WPACKET_allocate_bytes(pkt, appcookielen, &appcookie2)
1818*e71b7053SJung-uk Kim             || !ossl_assert(appcookie1 == appcookie2)
1819*e71b7053SJung-uk Kim             || !WPACKET_close(pkt)
1820*e71b7053SJung-uk Kim             || !WPACKET_get_total_written(pkt, &totcookielen)
1821*e71b7053SJung-uk Kim             || !WPACKET_reserve_bytes(pkt, SHA256_DIGEST_LENGTH, &hmac)) {
1822*e71b7053SJung-uk Kim         SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_TLS_CONSTRUCT_STOC_COOKIE,
1823*e71b7053SJung-uk Kim                  ERR_R_INTERNAL_ERROR);
1824*e71b7053SJung-uk Kim         return EXT_RETURN_FAIL;
1825*e71b7053SJung-uk Kim     }
1826*e71b7053SJung-uk Kim     hmaclen = SHA256_DIGEST_LENGTH;
1827*e71b7053SJung-uk Kim 
1828*e71b7053SJung-uk Kim     totcookielen -= startlen;
1829*e71b7053SJung-uk Kim     if (!ossl_assert(totcookielen <= MAX_COOKIE_SIZE - SHA256_DIGEST_LENGTH)) {
1830*e71b7053SJung-uk Kim         SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_TLS_CONSTRUCT_STOC_COOKIE,
1831*e71b7053SJung-uk Kim                  ERR_R_INTERNAL_ERROR);
1832*e71b7053SJung-uk Kim         return EXT_RETURN_FAIL;
1833*e71b7053SJung-uk Kim     }
1834*e71b7053SJung-uk Kim 
1835*e71b7053SJung-uk Kim     /* HMAC the cookie */
1836*e71b7053SJung-uk Kim     hctx = EVP_MD_CTX_create();
1837*e71b7053SJung-uk Kim     pkey = EVP_PKEY_new_raw_private_key(EVP_PKEY_HMAC, NULL,
1838*e71b7053SJung-uk Kim                                         s->session_ctx->ext.cookie_hmac_key,
1839*e71b7053SJung-uk Kim                                         sizeof(s->session_ctx->ext
1840*e71b7053SJung-uk Kim                                                .cookie_hmac_key));
1841*e71b7053SJung-uk Kim     if (hctx == NULL || pkey == NULL) {
1842*e71b7053SJung-uk Kim         SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_TLS_CONSTRUCT_STOC_COOKIE,
1843*e71b7053SJung-uk Kim                  ERR_R_MALLOC_FAILURE);
1844*e71b7053SJung-uk Kim         goto err;
1845*e71b7053SJung-uk Kim     }
1846*e71b7053SJung-uk Kim 
1847*e71b7053SJung-uk Kim     if (EVP_DigestSignInit(hctx, NULL, EVP_sha256(), NULL, pkey) <= 0
1848*e71b7053SJung-uk Kim             || EVP_DigestSign(hctx, hmac, &hmaclen, cookie,
1849*e71b7053SJung-uk Kim                               totcookielen) <= 0) {
1850*e71b7053SJung-uk Kim         SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_TLS_CONSTRUCT_STOC_COOKIE,
1851*e71b7053SJung-uk Kim                  ERR_R_INTERNAL_ERROR);
1852*e71b7053SJung-uk Kim         goto err;
1853*e71b7053SJung-uk Kim     }
1854*e71b7053SJung-uk Kim 
1855*e71b7053SJung-uk Kim     if (!ossl_assert(totcookielen + hmaclen <= MAX_COOKIE_SIZE)) {
1856*e71b7053SJung-uk Kim         SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_TLS_CONSTRUCT_STOC_COOKIE,
1857*e71b7053SJung-uk Kim                  ERR_R_INTERNAL_ERROR);
1858*e71b7053SJung-uk Kim         goto err;
1859*e71b7053SJung-uk Kim     }
1860*e71b7053SJung-uk Kim 
1861*e71b7053SJung-uk Kim     if (!WPACKET_allocate_bytes(pkt, hmaclen, &hmac2)
1862*e71b7053SJung-uk Kim             || !ossl_assert(hmac == hmac2)
1863*e71b7053SJung-uk Kim             || !ossl_assert(cookie == hmac - totcookielen)
1864*e71b7053SJung-uk Kim             || !WPACKET_close(pkt)
1865*e71b7053SJung-uk Kim             || !WPACKET_close(pkt)) {
1866*e71b7053SJung-uk Kim         SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_TLS_CONSTRUCT_STOC_COOKIE,
1867*e71b7053SJung-uk Kim                  ERR_R_INTERNAL_ERROR);
1868*e71b7053SJung-uk Kim         goto err;
1869*e71b7053SJung-uk Kim     }
1870*e71b7053SJung-uk Kim 
1871*e71b7053SJung-uk Kim     ret = EXT_RETURN_SENT;
1872*e71b7053SJung-uk Kim 
1873*e71b7053SJung-uk Kim  err:
1874*e71b7053SJung-uk Kim     EVP_MD_CTX_free(hctx);
1875*e71b7053SJung-uk Kim     EVP_PKEY_free(pkey);
1876*e71b7053SJung-uk Kim     return ret;
1877*e71b7053SJung-uk Kim #else
1878*e71b7053SJung-uk Kim     return EXT_RETURN_FAIL;
1879*e71b7053SJung-uk Kim #endif
1880*e71b7053SJung-uk Kim }
1881*e71b7053SJung-uk Kim 
1882*e71b7053SJung-uk Kim EXT_RETURN tls_construct_stoc_cryptopro_bug(SSL *s, WPACKET *pkt,
1883*e71b7053SJung-uk Kim                                             unsigned int context, X509 *x,
1884*e71b7053SJung-uk Kim                                             size_t chainidx)
1885*e71b7053SJung-uk Kim {
1886*e71b7053SJung-uk Kim     const unsigned char cryptopro_ext[36] = {
1887*e71b7053SJung-uk Kim         0xfd, 0xe8,         /* 65000 */
1888*e71b7053SJung-uk Kim         0x00, 0x20,         /* 32 bytes length */
1889*e71b7053SJung-uk Kim         0x30, 0x1e, 0x30, 0x08, 0x06, 0x06, 0x2a, 0x85,
1890*e71b7053SJung-uk Kim         0x03, 0x02, 0x02, 0x09, 0x30, 0x08, 0x06, 0x06,
1891*e71b7053SJung-uk Kim         0x2a, 0x85, 0x03, 0x02, 0x02, 0x16, 0x30, 0x08,
1892*e71b7053SJung-uk Kim         0x06, 0x06, 0x2a, 0x85, 0x03, 0x02, 0x02, 0x17
1893*e71b7053SJung-uk Kim     };
1894*e71b7053SJung-uk Kim 
1895*e71b7053SJung-uk Kim     if (((s->s3->tmp.new_cipher->id & 0xFFFF) != 0x80
1896*e71b7053SJung-uk Kim          && (s->s3->tmp.new_cipher->id & 0xFFFF) != 0x81)
1897*e71b7053SJung-uk Kim             || (SSL_get_options(s) & SSL_OP_CRYPTOPRO_TLSEXT_BUG) == 0)
1898*e71b7053SJung-uk Kim         return EXT_RETURN_NOT_SENT;
1899*e71b7053SJung-uk Kim 
1900*e71b7053SJung-uk Kim     if (!WPACKET_memcpy(pkt, cryptopro_ext, sizeof(cryptopro_ext))) {
1901*e71b7053SJung-uk Kim         SSLfatal(s, SSL_AD_INTERNAL_ERROR,
1902*e71b7053SJung-uk Kim                  SSL_F_TLS_CONSTRUCT_STOC_CRYPTOPRO_BUG, ERR_R_INTERNAL_ERROR);
1903*e71b7053SJung-uk Kim         return EXT_RETURN_FAIL;
1904*e71b7053SJung-uk Kim     }
1905*e71b7053SJung-uk Kim 
1906*e71b7053SJung-uk Kim     return EXT_RETURN_SENT;
1907*e71b7053SJung-uk Kim }
1908*e71b7053SJung-uk Kim 
1909*e71b7053SJung-uk Kim EXT_RETURN tls_construct_stoc_early_data(SSL *s, WPACKET *pkt,
1910*e71b7053SJung-uk Kim                                          unsigned int context, X509 *x,
1911*e71b7053SJung-uk Kim                                          size_t chainidx)
1912*e71b7053SJung-uk Kim {
1913*e71b7053SJung-uk Kim     if (context == SSL_EXT_TLS1_3_NEW_SESSION_TICKET) {
1914*e71b7053SJung-uk Kim         if (s->max_early_data == 0)
1915*e71b7053SJung-uk Kim             return EXT_RETURN_NOT_SENT;
1916*e71b7053SJung-uk Kim 
1917*e71b7053SJung-uk Kim         if (!WPACKET_put_bytes_u16(pkt, TLSEXT_TYPE_early_data)
1918*e71b7053SJung-uk Kim                 || !WPACKET_start_sub_packet_u16(pkt)
1919*e71b7053SJung-uk Kim                 || !WPACKET_put_bytes_u32(pkt, s->max_early_data)
1920*e71b7053SJung-uk Kim                 || !WPACKET_close(pkt)) {
1921*e71b7053SJung-uk Kim             SSLfatal(s, SSL_AD_INTERNAL_ERROR,
1922*e71b7053SJung-uk Kim                      SSL_F_TLS_CONSTRUCT_STOC_EARLY_DATA, ERR_R_INTERNAL_ERROR);
1923*e71b7053SJung-uk Kim             return EXT_RETURN_FAIL;
1924*e71b7053SJung-uk Kim         }
1925*e71b7053SJung-uk Kim 
1926*e71b7053SJung-uk Kim         return EXT_RETURN_SENT;
1927*e71b7053SJung-uk Kim     }
1928*e71b7053SJung-uk Kim 
1929*e71b7053SJung-uk Kim     if (s->ext.early_data != SSL_EARLY_DATA_ACCEPTED)
1930*e71b7053SJung-uk Kim         return EXT_RETURN_NOT_SENT;
1931*e71b7053SJung-uk Kim 
1932*e71b7053SJung-uk Kim     if (!WPACKET_put_bytes_u16(pkt, TLSEXT_TYPE_early_data)
1933*e71b7053SJung-uk Kim             || !WPACKET_start_sub_packet_u16(pkt)
1934*e71b7053SJung-uk Kim             || !WPACKET_close(pkt)) {
1935*e71b7053SJung-uk Kim         SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_TLS_CONSTRUCT_STOC_EARLY_DATA,
1936*e71b7053SJung-uk Kim                  ERR_R_INTERNAL_ERROR);
1937*e71b7053SJung-uk Kim         return EXT_RETURN_FAIL;
1938*e71b7053SJung-uk Kim     }
1939*e71b7053SJung-uk Kim 
1940*e71b7053SJung-uk Kim     return EXT_RETURN_SENT;
1941*e71b7053SJung-uk Kim }
1942*e71b7053SJung-uk Kim 
1943*e71b7053SJung-uk Kim EXT_RETURN tls_construct_stoc_psk(SSL *s, WPACKET *pkt, unsigned int context,
1944*e71b7053SJung-uk Kim                                   X509 *x, size_t chainidx)
1945*e71b7053SJung-uk Kim {
1946*e71b7053SJung-uk Kim     if (!s->hit)
1947*e71b7053SJung-uk Kim         return EXT_RETURN_NOT_SENT;
1948*e71b7053SJung-uk Kim 
1949*e71b7053SJung-uk Kim     if (!WPACKET_put_bytes_u16(pkt, TLSEXT_TYPE_psk)
1950*e71b7053SJung-uk Kim             || !WPACKET_start_sub_packet_u16(pkt)
1951*e71b7053SJung-uk Kim             || !WPACKET_put_bytes_u16(pkt, s->session->ext.tick_identity)
1952*e71b7053SJung-uk Kim             || !WPACKET_close(pkt)) {
1953*e71b7053SJung-uk Kim         SSLfatal(s, SSL_AD_INTERNAL_ERROR,
1954*e71b7053SJung-uk Kim                  SSL_F_TLS_CONSTRUCT_STOC_PSK, ERR_R_INTERNAL_ERROR);
1955*e71b7053SJung-uk Kim         return EXT_RETURN_FAIL;
1956*e71b7053SJung-uk Kim     }
1957*e71b7053SJung-uk Kim 
1958*e71b7053SJung-uk Kim     return EXT_RETURN_SENT;
1959*e71b7053SJung-uk Kim }
1960