xref: /freebsd/crypto/openssl/ssl/statem/extensions_clnt.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 "internal/cryptlib.h"
13*e71b7053SJung-uk Kim #include "statem_locl.h"
14*e71b7053SJung-uk Kim 
15*e71b7053SJung-uk Kim EXT_RETURN tls_construct_ctos_renegotiate(SSL *s, WPACKET *pkt,
16*e71b7053SJung-uk Kim                                           unsigned int context, X509 *x,
17*e71b7053SJung-uk Kim                                           size_t chainidx)
18*e71b7053SJung-uk Kim {
19*e71b7053SJung-uk Kim     /* Add RI if renegotiating */
20*e71b7053SJung-uk Kim     if (!s->renegotiate)
21*e71b7053SJung-uk Kim         return EXT_RETURN_NOT_SENT;
22*e71b7053SJung-uk Kim 
23*e71b7053SJung-uk Kim     if (!WPACKET_put_bytes_u16(pkt, TLSEXT_TYPE_renegotiate)
24*e71b7053SJung-uk Kim             || !WPACKET_start_sub_packet_u16(pkt)
25*e71b7053SJung-uk Kim             || !WPACKET_sub_memcpy_u8(pkt, s->s3->previous_client_finished,
26*e71b7053SJung-uk Kim                                s->s3->previous_client_finished_len)
27*e71b7053SJung-uk Kim             || !WPACKET_close(pkt)) {
28*e71b7053SJung-uk Kim         SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_TLS_CONSTRUCT_CTOS_RENEGOTIATE,
29*e71b7053SJung-uk Kim                  ERR_R_INTERNAL_ERROR);
30*e71b7053SJung-uk Kim         return EXT_RETURN_FAIL;
31*e71b7053SJung-uk Kim     }
32*e71b7053SJung-uk Kim 
33*e71b7053SJung-uk Kim     return EXT_RETURN_SENT;
34*e71b7053SJung-uk Kim }
35*e71b7053SJung-uk Kim 
36*e71b7053SJung-uk Kim EXT_RETURN tls_construct_ctos_server_name(SSL *s, WPACKET *pkt,
37*e71b7053SJung-uk Kim                                           unsigned int context, X509 *x,
38*e71b7053SJung-uk Kim                                           size_t chainidx)
39*e71b7053SJung-uk Kim {
40*e71b7053SJung-uk Kim     if (s->ext.hostname == NULL)
41*e71b7053SJung-uk Kim         return EXT_RETURN_NOT_SENT;
42*e71b7053SJung-uk Kim 
43*e71b7053SJung-uk Kim     /* Add TLS extension servername to the Client Hello message */
44*e71b7053SJung-uk Kim     if (!WPACKET_put_bytes_u16(pkt, TLSEXT_TYPE_server_name)
45*e71b7053SJung-uk Kim                /* Sub-packet for server_name extension */
46*e71b7053SJung-uk Kim             || !WPACKET_start_sub_packet_u16(pkt)
47*e71b7053SJung-uk Kim                /* Sub-packet for servername list (always 1 hostname)*/
48*e71b7053SJung-uk Kim             || !WPACKET_start_sub_packet_u16(pkt)
49*e71b7053SJung-uk Kim             || !WPACKET_put_bytes_u8(pkt, TLSEXT_NAMETYPE_host_name)
50*e71b7053SJung-uk Kim             || !WPACKET_sub_memcpy_u16(pkt, s->ext.hostname,
51*e71b7053SJung-uk Kim                                        strlen(s->ext.hostname))
52*e71b7053SJung-uk Kim             || !WPACKET_close(pkt)
53*e71b7053SJung-uk Kim             || !WPACKET_close(pkt)) {
54*e71b7053SJung-uk Kim         SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_TLS_CONSTRUCT_CTOS_SERVER_NAME,
55*e71b7053SJung-uk Kim                  ERR_R_INTERNAL_ERROR);
56*e71b7053SJung-uk Kim         return EXT_RETURN_FAIL;
57*e71b7053SJung-uk Kim     }
58*e71b7053SJung-uk Kim 
59*e71b7053SJung-uk Kim     return EXT_RETURN_SENT;
60*e71b7053SJung-uk Kim }
61*e71b7053SJung-uk Kim 
62*e71b7053SJung-uk Kim /* Push a Max Fragment Len extension into ClientHello */
63*e71b7053SJung-uk Kim EXT_RETURN tls_construct_ctos_maxfragmentlen(SSL *s, WPACKET *pkt,
64*e71b7053SJung-uk Kim                                              unsigned int context, X509 *x,
65*e71b7053SJung-uk Kim                                              size_t chainidx)
66*e71b7053SJung-uk Kim {
67*e71b7053SJung-uk Kim     if (s->ext.max_fragment_len_mode == TLSEXT_max_fragment_length_DISABLED)
68*e71b7053SJung-uk Kim         return EXT_RETURN_NOT_SENT;
69*e71b7053SJung-uk Kim 
70*e71b7053SJung-uk Kim     /* Add Max Fragment Length extension if client enabled it. */
71*e71b7053SJung-uk Kim     /*-
72*e71b7053SJung-uk Kim      * 4 bytes for this extension type and extension length
73*e71b7053SJung-uk Kim      * 1 byte for the Max Fragment Length code value.
74*e71b7053SJung-uk Kim      */
75*e71b7053SJung-uk Kim     if (!WPACKET_put_bytes_u16(pkt, TLSEXT_TYPE_max_fragment_length)
76*e71b7053SJung-uk Kim             /* Sub-packet for Max Fragment Length extension (1 byte) */
77*e71b7053SJung-uk Kim             || !WPACKET_start_sub_packet_u16(pkt)
78*e71b7053SJung-uk Kim             || !WPACKET_put_bytes_u8(pkt, s->ext.max_fragment_len_mode)
79*e71b7053SJung-uk Kim             || !WPACKET_close(pkt)) {
80*e71b7053SJung-uk Kim         SSLfatal(s, SSL_AD_INTERNAL_ERROR,
81*e71b7053SJung-uk Kim                  SSL_F_TLS_CONSTRUCT_CTOS_MAXFRAGMENTLEN, ERR_R_INTERNAL_ERROR);
82*e71b7053SJung-uk Kim         return EXT_RETURN_FAIL;
83*e71b7053SJung-uk Kim     }
84*e71b7053SJung-uk Kim 
85*e71b7053SJung-uk Kim     return EXT_RETURN_SENT;
86*e71b7053SJung-uk Kim }
87*e71b7053SJung-uk Kim 
88*e71b7053SJung-uk Kim #ifndef OPENSSL_NO_SRP
89*e71b7053SJung-uk Kim EXT_RETURN tls_construct_ctos_srp(SSL *s, WPACKET *pkt, unsigned int context,
90*e71b7053SJung-uk Kim                                   X509 *x, size_t chainidx)
91*e71b7053SJung-uk Kim {
92*e71b7053SJung-uk Kim     /* Add SRP username if there is one */
93*e71b7053SJung-uk Kim     if (s->srp_ctx.login == NULL)
94*e71b7053SJung-uk Kim         return EXT_RETURN_NOT_SENT;
95*e71b7053SJung-uk Kim 
96*e71b7053SJung-uk Kim     if (!WPACKET_put_bytes_u16(pkt, TLSEXT_TYPE_srp)
97*e71b7053SJung-uk Kim                /* Sub-packet for SRP extension */
98*e71b7053SJung-uk Kim             || !WPACKET_start_sub_packet_u16(pkt)
99*e71b7053SJung-uk Kim             || !WPACKET_start_sub_packet_u8(pkt)
100*e71b7053SJung-uk Kim                /* login must not be zero...internal error if so */
101*e71b7053SJung-uk Kim             || !WPACKET_set_flags(pkt, WPACKET_FLAGS_NON_ZERO_LENGTH)
102*e71b7053SJung-uk Kim             || !WPACKET_memcpy(pkt, s->srp_ctx.login,
103*e71b7053SJung-uk Kim                                strlen(s->srp_ctx.login))
104*e71b7053SJung-uk Kim             || !WPACKET_close(pkt)
105*e71b7053SJung-uk Kim             || !WPACKET_close(pkt)) {
106*e71b7053SJung-uk Kim         SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_TLS_CONSTRUCT_CTOS_SRP,
107*e71b7053SJung-uk Kim                  ERR_R_INTERNAL_ERROR);
108*e71b7053SJung-uk Kim         return EXT_RETURN_FAIL;
109*e71b7053SJung-uk Kim     }
110*e71b7053SJung-uk Kim 
111*e71b7053SJung-uk Kim     return EXT_RETURN_SENT;
112*e71b7053SJung-uk Kim }
113*e71b7053SJung-uk Kim #endif
114*e71b7053SJung-uk Kim 
115*e71b7053SJung-uk Kim #ifndef OPENSSL_NO_EC
116*e71b7053SJung-uk Kim static int use_ecc(SSL *s)
117*e71b7053SJung-uk Kim {
118*e71b7053SJung-uk Kim     int i, end;
119*e71b7053SJung-uk Kim     unsigned long alg_k, alg_a;
120*e71b7053SJung-uk Kim     STACK_OF(SSL_CIPHER) *cipher_stack = NULL;
121*e71b7053SJung-uk Kim 
122*e71b7053SJung-uk Kim     /* See if we support any ECC ciphersuites */
123*e71b7053SJung-uk Kim     if (s->version == SSL3_VERSION)
124*e71b7053SJung-uk Kim         return 0;
125*e71b7053SJung-uk Kim 
126*e71b7053SJung-uk Kim     cipher_stack = SSL_get_ciphers(s);
127*e71b7053SJung-uk Kim     end = sk_SSL_CIPHER_num(cipher_stack);
128*e71b7053SJung-uk Kim     for (i = 0; i < end; i++) {
129*e71b7053SJung-uk Kim         const SSL_CIPHER *c = sk_SSL_CIPHER_value(cipher_stack, i);
130*e71b7053SJung-uk Kim 
131*e71b7053SJung-uk Kim         alg_k = c->algorithm_mkey;
132*e71b7053SJung-uk Kim         alg_a = c->algorithm_auth;
133*e71b7053SJung-uk Kim         if ((alg_k & (SSL_kECDHE | SSL_kECDHEPSK))
134*e71b7053SJung-uk Kim                 || (alg_a & SSL_aECDSA)
135*e71b7053SJung-uk Kim                 || c->min_tls >= TLS1_3_VERSION)
136*e71b7053SJung-uk Kim             return 1;
137*e71b7053SJung-uk Kim     }
138*e71b7053SJung-uk Kim 
139*e71b7053SJung-uk Kim     return 0;
140*e71b7053SJung-uk Kim }
141*e71b7053SJung-uk Kim 
142*e71b7053SJung-uk Kim EXT_RETURN tls_construct_ctos_ec_pt_formats(SSL *s, WPACKET *pkt,
143*e71b7053SJung-uk Kim                                             unsigned int context, X509 *x,
144*e71b7053SJung-uk Kim                                             size_t chainidx)
145*e71b7053SJung-uk Kim {
146*e71b7053SJung-uk Kim     const unsigned char *pformats;
147*e71b7053SJung-uk Kim     size_t num_formats;
148*e71b7053SJung-uk Kim 
149*e71b7053SJung-uk Kim     if (!use_ecc(s))
150*e71b7053SJung-uk Kim         return EXT_RETURN_NOT_SENT;
151*e71b7053SJung-uk Kim 
152*e71b7053SJung-uk Kim     /* Add TLS extension ECPointFormats to the ClientHello message */
153*e71b7053SJung-uk Kim     tls1_get_formatlist(s, &pformats, &num_formats);
154*e71b7053SJung-uk Kim 
155*e71b7053SJung-uk Kim     if (!WPACKET_put_bytes_u16(pkt, TLSEXT_TYPE_ec_point_formats)
156*e71b7053SJung-uk Kim                /* Sub-packet for formats extension */
157*e71b7053SJung-uk Kim             || !WPACKET_start_sub_packet_u16(pkt)
158*e71b7053SJung-uk Kim             || !WPACKET_sub_memcpy_u8(pkt, pformats, num_formats)
159*e71b7053SJung-uk Kim             || !WPACKET_close(pkt)) {
160*e71b7053SJung-uk Kim         SSLfatal(s, SSL_AD_INTERNAL_ERROR,
161*e71b7053SJung-uk Kim                  SSL_F_TLS_CONSTRUCT_CTOS_EC_PT_FORMATS, ERR_R_INTERNAL_ERROR);
162*e71b7053SJung-uk Kim         return EXT_RETURN_FAIL;
163*e71b7053SJung-uk Kim     }
164*e71b7053SJung-uk Kim 
165*e71b7053SJung-uk Kim     return EXT_RETURN_SENT;
166*e71b7053SJung-uk Kim }
167*e71b7053SJung-uk Kim 
168*e71b7053SJung-uk Kim EXT_RETURN tls_construct_ctos_supported_groups(SSL *s, WPACKET *pkt,
169*e71b7053SJung-uk Kim                                                unsigned int context, X509 *x,
170*e71b7053SJung-uk Kim                                                size_t chainidx)
171*e71b7053SJung-uk Kim {
172*e71b7053SJung-uk Kim     const uint16_t *pgroups = NULL;
173*e71b7053SJung-uk Kim     size_t num_groups = 0, i;
174*e71b7053SJung-uk Kim 
175*e71b7053SJung-uk Kim     if (!use_ecc(s))
176*e71b7053SJung-uk Kim         return EXT_RETURN_NOT_SENT;
177*e71b7053SJung-uk Kim 
178*e71b7053SJung-uk Kim     /*
179*e71b7053SJung-uk Kim      * Add TLS extension supported_groups to the ClientHello message
180*e71b7053SJung-uk Kim      */
181*e71b7053SJung-uk Kim     /* TODO(TLS1.3): Add support for DHE groups */
182*e71b7053SJung-uk Kim     tls1_get_supported_groups(s, &pgroups, &num_groups);
183*e71b7053SJung-uk Kim 
184*e71b7053SJung-uk Kim     if (!WPACKET_put_bytes_u16(pkt, TLSEXT_TYPE_supported_groups)
185*e71b7053SJung-uk Kim                /* Sub-packet for supported_groups extension */
186*e71b7053SJung-uk Kim             || !WPACKET_start_sub_packet_u16(pkt)
187*e71b7053SJung-uk Kim             || !WPACKET_start_sub_packet_u16(pkt)) {
188*e71b7053SJung-uk Kim         SSLfatal(s, SSL_AD_INTERNAL_ERROR,
189*e71b7053SJung-uk Kim                  SSL_F_TLS_CONSTRUCT_CTOS_SUPPORTED_GROUPS,
190*e71b7053SJung-uk Kim                  ERR_R_INTERNAL_ERROR);
191*e71b7053SJung-uk Kim         return EXT_RETURN_FAIL;
192*e71b7053SJung-uk Kim     }
193*e71b7053SJung-uk Kim     /* Copy curve ID if supported */
194*e71b7053SJung-uk Kim     for (i = 0; i < num_groups; i++) {
195*e71b7053SJung-uk Kim         uint16_t ctmp = pgroups[i];
196*e71b7053SJung-uk Kim 
197*e71b7053SJung-uk Kim         if (tls_curve_allowed(s, ctmp, SSL_SECOP_CURVE_SUPPORTED)) {
198*e71b7053SJung-uk Kim             if (!WPACKET_put_bytes_u16(pkt, ctmp)) {
199*e71b7053SJung-uk Kim                     SSLfatal(s, SSL_AD_INTERNAL_ERROR,
200*e71b7053SJung-uk Kim                              SSL_F_TLS_CONSTRUCT_CTOS_SUPPORTED_GROUPS,
201*e71b7053SJung-uk Kim                              ERR_R_INTERNAL_ERROR);
202*e71b7053SJung-uk Kim                     return EXT_RETURN_FAIL;
203*e71b7053SJung-uk Kim                 }
204*e71b7053SJung-uk Kim         }
205*e71b7053SJung-uk Kim     }
206*e71b7053SJung-uk Kim     if (!WPACKET_close(pkt) || !WPACKET_close(pkt)) {
207*e71b7053SJung-uk Kim         SSLfatal(s, SSL_AD_INTERNAL_ERROR,
208*e71b7053SJung-uk Kim                  SSL_F_TLS_CONSTRUCT_CTOS_SUPPORTED_GROUPS,
209*e71b7053SJung-uk Kim                  ERR_R_INTERNAL_ERROR);
210*e71b7053SJung-uk Kim         return EXT_RETURN_FAIL;
211*e71b7053SJung-uk Kim     }
212*e71b7053SJung-uk Kim 
213*e71b7053SJung-uk Kim     return EXT_RETURN_SENT;
214*e71b7053SJung-uk Kim }
215*e71b7053SJung-uk Kim #endif
216*e71b7053SJung-uk Kim 
217*e71b7053SJung-uk Kim EXT_RETURN tls_construct_ctos_session_ticket(SSL *s, WPACKET *pkt,
218*e71b7053SJung-uk Kim                                              unsigned int context, X509 *x,
219*e71b7053SJung-uk Kim                                              size_t chainidx)
220*e71b7053SJung-uk Kim {
221*e71b7053SJung-uk Kim     size_t ticklen;
222*e71b7053SJung-uk Kim 
223*e71b7053SJung-uk Kim     if (!tls_use_ticket(s))
224*e71b7053SJung-uk Kim         return EXT_RETURN_NOT_SENT;
225*e71b7053SJung-uk Kim 
226*e71b7053SJung-uk Kim     if (!s->new_session && s->session != NULL
227*e71b7053SJung-uk Kim             && s->session->ext.tick != NULL
228*e71b7053SJung-uk Kim             && s->session->ssl_version != TLS1_3_VERSION) {
229*e71b7053SJung-uk Kim         ticklen = s->session->ext.ticklen;
230*e71b7053SJung-uk Kim     } else if (s->session && s->ext.session_ticket != NULL
231*e71b7053SJung-uk Kim                && s->ext.session_ticket->data != NULL) {
232*e71b7053SJung-uk Kim         ticklen = s->ext.session_ticket->length;
233*e71b7053SJung-uk Kim         s->session->ext.tick = OPENSSL_malloc(ticklen);
234*e71b7053SJung-uk Kim         if (s->session->ext.tick == NULL) {
235*e71b7053SJung-uk Kim             SSLfatal(s, SSL_AD_INTERNAL_ERROR,
236*e71b7053SJung-uk Kim                      SSL_F_TLS_CONSTRUCT_CTOS_SESSION_TICKET,
237*e71b7053SJung-uk Kim                      ERR_R_INTERNAL_ERROR);
238*e71b7053SJung-uk Kim             return EXT_RETURN_FAIL;
239*e71b7053SJung-uk Kim         }
240*e71b7053SJung-uk Kim         memcpy(s->session->ext.tick,
241*e71b7053SJung-uk Kim                s->ext.session_ticket->data, ticklen);
242*e71b7053SJung-uk Kim         s->session->ext.ticklen = ticklen;
243*e71b7053SJung-uk Kim     } else {
244*e71b7053SJung-uk Kim         ticklen = 0;
245*e71b7053SJung-uk Kim     }
246*e71b7053SJung-uk Kim 
247*e71b7053SJung-uk Kim     if (ticklen == 0 && s->ext.session_ticket != NULL &&
248*e71b7053SJung-uk Kim             s->ext.session_ticket->data == NULL)
249*e71b7053SJung-uk Kim         return EXT_RETURN_NOT_SENT;
250*e71b7053SJung-uk Kim 
251*e71b7053SJung-uk Kim     if (!WPACKET_put_bytes_u16(pkt, TLSEXT_TYPE_session_ticket)
252*e71b7053SJung-uk Kim             || !WPACKET_sub_memcpy_u16(pkt, s->session->ext.tick, ticklen)) {
253*e71b7053SJung-uk Kim         SSLfatal(s, SSL_AD_INTERNAL_ERROR,
254*e71b7053SJung-uk Kim                  SSL_F_TLS_CONSTRUCT_CTOS_SESSION_TICKET, ERR_R_INTERNAL_ERROR);
255*e71b7053SJung-uk Kim         return EXT_RETURN_FAIL;
256*e71b7053SJung-uk Kim     }
257*e71b7053SJung-uk Kim 
258*e71b7053SJung-uk Kim     return EXT_RETURN_SENT;
259*e71b7053SJung-uk Kim }
260*e71b7053SJung-uk Kim 
261*e71b7053SJung-uk Kim EXT_RETURN tls_construct_ctos_sig_algs(SSL *s, WPACKET *pkt,
262*e71b7053SJung-uk Kim                                        unsigned int context, X509 *x,
263*e71b7053SJung-uk Kim                                        size_t chainidx)
264*e71b7053SJung-uk Kim {
265*e71b7053SJung-uk Kim     size_t salglen;
266*e71b7053SJung-uk Kim     const uint16_t *salg;
267*e71b7053SJung-uk Kim 
268*e71b7053SJung-uk Kim     if (!SSL_CLIENT_USE_SIGALGS(s))
269*e71b7053SJung-uk Kim         return EXT_RETURN_NOT_SENT;
270*e71b7053SJung-uk Kim 
271*e71b7053SJung-uk Kim     salglen = tls12_get_psigalgs(s, 1, &salg);
272*e71b7053SJung-uk Kim     if (!WPACKET_put_bytes_u16(pkt, TLSEXT_TYPE_signature_algorithms)
273*e71b7053SJung-uk Kim                /* Sub-packet for sig-algs extension */
274*e71b7053SJung-uk Kim             || !WPACKET_start_sub_packet_u16(pkt)
275*e71b7053SJung-uk Kim                /* Sub-packet for the actual list */
276*e71b7053SJung-uk Kim             || !WPACKET_start_sub_packet_u16(pkt)
277*e71b7053SJung-uk Kim             || !tls12_copy_sigalgs(s, pkt, salg, salglen)
278*e71b7053SJung-uk Kim             || !WPACKET_close(pkt)
279*e71b7053SJung-uk Kim             || !WPACKET_close(pkt)) {
280*e71b7053SJung-uk Kim         SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_TLS_CONSTRUCT_CTOS_SIG_ALGS,
281*e71b7053SJung-uk Kim                  ERR_R_INTERNAL_ERROR);
282*e71b7053SJung-uk Kim         return EXT_RETURN_FAIL;
283*e71b7053SJung-uk Kim     }
284*e71b7053SJung-uk Kim 
285*e71b7053SJung-uk Kim     return EXT_RETURN_SENT;
286*e71b7053SJung-uk Kim }
287*e71b7053SJung-uk Kim 
288*e71b7053SJung-uk Kim #ifndef OPENSSL_NO_OCSP
289*e71b7053SJung-uk Kim EXT_RETURN tls_construct_ctos_status_request(SSL *s, WPACKET *pkt,
290*e71b7053SJung-uk Kim                                              unsigned int context, X509 *x,
291*e71b7053SJung-uk Kim                                              size_t chainidx)
292*e71b7053SJung-uk Kim {
293*e71b7053SJung-uk Kim     int i;
294*e71b7053SJung-uk Kim 
295*e71b7053SJung-uk Kim     /* This extension isn't defined for client Certificates */
296*e71b7053SJung-uk Kim     if (x != NULL)
297*e71b7053SJung-uk Kim         return EXT_RETURN_NOT_SENT;
298*e71b7053SJung-uk Kim 
299*e71b7053SJung-uk Kim     if (s->ext.status_type != TLSEXT_STATUSTYPE_ocsp)
300*e71b7053SJung-uk Kim         return EXT_RETURN_NOT_SENT;
301*e71b7053SJung-uk Kim 
302*e71b7053SJung-uk Kim     if (!WPACKET_put_bytes_u16(pkt, TLSEXT_TYPE_status_request)
303*e71b7053SJung-uk Kim                /* Sub-packet for status request extension */
304*e71b7053SJung-uk Kim             || !WPACKET_start_sub_packet_u16(pkt)
305*e71b7053SJung-uk Kim             || !WPACKET_put_bytes_u8(pkt, TLSEXT_STATUSTYPE_ocsp)
306*e71b7053SJung-uk Kim                /* Sub-packet for the ids */
307*e71b7053SJung-uk Kim             || !WPACKET_start_sub_packet_u16(pkt)) {
308*e71b7053SJung-uk Kim         SSLfatal(s, SSL_AD_INTERNAL_ERROR,
309*e71b7053SJung-uk Kim                  SSL_F_TLS_CONSTRUCT_CTOS_STATUS_REQUEST, ERR_R_INTERNAL_ERROR);
310*e71b7053SJung-uk Kim         return EXT_RETURN_FAIL;
311*e71b7053SJung-uk Kim     }
312*e71b7053SJung-uk Kim     for (i = 0; i < sk_OCSP_RESPID_num(s->ext.ocsp.ids); i++) {
313*e71b7053SJung-uk Kim         unsigned char *idbytes;
314*e71b7053SJung-uk Kim         OCSP_RESPID *id = sk_OCSP_RESPID_value(s->ext.ocsp.ids, i);
315*e71b7053SJung-uk Kim         int idlen = i2d_OCSP_RESPID(id, NULL);
316*e71b7053SJung-uk Kim 
317*e71b7053SJung-uk Kim         if (idlen <= 0
318*e71b7053SJung-uk Kim                    /* Sub-packet for an individual id */
319*e71b7053SJung-uk Kim                 || !WPACKET_sub_allocate_bytes_u16(pkt, idlen, &idbytes)
320*e71b7053SJung-uk Kim                 || i2d_OCSP_RESPID(id, &idbytes) != idlen) {
321*e71b7053SJung-uk Kim             SSLfatal(s, SSL_AD_INTERNAL_ERROR,
322*e71b7053SJung-uk Kim                      SSL_F_TLS_CONSTRUCT_CTOS_STATUS_REQUEST,
323*e71b7053SJung-uk Kim                      ERR_R_INTERNAL_ERROR);
324*e71b7053SJung-uk Kim             return EXT_RETURN_FAIL;
325*e71b7053SJung-uk Kim         }
326*e71b7053SJung-uk Kim     }
327*e71b7053SJung-uk Kim     if (!WPACKET_close(pkt)
328*e71b7053SJung-uk Kim             || !WPACKET_start_sub_packet_u16(pkt)) {
329*e71b7053SJung-uk Kim         SSLfatal(s, SSL_AD_INTERNAL_ERROR,
330*e71b7053SJung-uk Kim                  SSL_F_TLS_CONSTRUCT_CTOS_STATUS_REQUEST, ERR_R_INTERNAL_ERROR);
331*e71b7053SJung-uk Kim         return EXT_RETURN_FAIL;
332*e71b7053SJung-uk Kim     }
333*e71b7053SJung-uk Kim     if (s->ext.ocsp.exts) {
334*e71b7053SJung-uk Kim         unsigned char *extbytes;
335*e71b7053SJung-uk Kim         int extlen = i2d_X509_EXTENSIONS(s->ext.ocsp.exts, NULL);
336*e71b7053SJung-uk Kim 
337*e71b7053SJung-uk Kim         if (extlen < 0) {
338*e71b7053SJung-uk Kim             SSLfatal(s, SSL_AD_INTERNAL_ERROR,
339*e71b7053SJung-uk Kim                      SSL_F_TLS_CONSTRUCT_CTOS_STATUS_REQUEST,
340*e71b7053SJung-uk Kim                      ERR_R_INTERNAL_ERROR);
341*e71b7053SJung-uk Kim             return EXT_RETURN_FAIL;
342*e71b7053SJung-uk Kim         }
343*e71b7053SJung-uk Kim         if (!WPACKET_allocate_bytes(pkt, extlen, &extbytes)
344*e71b7053SJung-uk Kim                 || i2d_X509_EXTENSIONS(s->ext.ocsp.exts, &extbytes)
345*e71b7053SJung-uk Kim                    != extlen) {
346*e71b7053SJung-uk Kim             SSLfatal(s, SSL_AD_INTERNAL_ERROR,
347*e71b7053SJung-uk Kim                      SSL_F_TLS_CONSTRUCT_CTOS_STATUS_REQUEST,
348*e71b7053SJung-uk Kim                      ERR_R_INTERNAL_ERROR);
349*e71b7053SJung-uk Kim             return EXT_RETURN_FAIL;
350*e71b7053SJung-uk Kim        }
351*e71b7053SJung-uk Kim     }
352*e71b7053SJung-uk Kim     if (!WPACKET_close(pkt) || !WPACKET_close(pkt)) {
353*e71b7053SJung-uk Kim         SSLfatal(s, SSL_AD_INTERNAL_ERROR,
354*e71b7053SJung-uk Kim                  SSL_F_TLS_CONSTRUCT_CTOS_STATUS_REQUEST, ERR_R_INTERNAL_ERROR);
355*e71b7053SJung-uk Kim         return EXT_RETURN_FAIL;
356*e71b7053SJung-uk Kim     }
357*e71b7053SJung-uk Kim 
358*e71b7053SJung-uk Kim     return EXT_RETURN_SENT;
359*e71b7053SJung-uk Kim }
360*e71b7053SJung-uk Kim #endif
361*e71b7053SJung-uk Kim 
362*e71b7053SJung-uk Kim #ifndef OPENSSL_NO_NEXTPROTONEG
363*e71b7053SJung-uk Kim EXT_RETURN tls_construct_ctos_npn(SSL *s, WPACKET *pkt, unsigned int context,
364*e71b7053SJung-uk Kim                                   X509 *x, size_t chainidx)
365*e71b7053SJung-uk Kim {
366*e71b7053SJung-uk Kim     if (s->ctx->ext.npn_select_cb == NULL || !SSL_IS_FIRST_HANDSHAKE(s))
367*e71b7053SJung-uk Kim         return EXT_RETURN_NOT_SENT;
368*e71b7053SJung-uk Kim 
369*e71b7053SJung-uk Kim     /*
370*e71b7053SJung-uk Kim      * The client advertises an empty extension to indicate its support
371*e71b7053SJung-uk Kim      * for Next Protocol Negotiation
372*e71b7053SJung-uk Kim      */
373*e71b7053SJung-uk Kim     if (!WPACKET_put_bytes_u16(pkt, TLSEXT_TYPE_next_proto_neg)
374*e71b7053SJung-uk Kim             || !WPACKET_put_bytes_u16(pkt, 0)) {
375*e71b7053SJung-uk Kim         SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_TLS_CONSTRUCT_CTOS_NPN,
376*e71b7053SJung-uk Kim                  ERR_R_INTERNAL_ERROR);
377*e71b7053SJung-uk Kim         return EXT_RETURN_FAIL;
378*e71b7053SJung-uk Kim     }
379*e71b7053SJung-uk Kim 
380*e71b7053SJung-uk Kim     return EXT_RETURN_SENT;
381*e71b7053SJung-uk Kim }
382*e71b7053SJung-uk Kim #endif
383*e71b7053SJung-uk Kim 
384*e71b7053SJung-uk Kim EXT_RETURN tls_construct_ctos_alpn(SSL *s, WPACKET *pkt, unsigned int context,
385*e71b7053SJung-uk Kim                                    X509 *x, size_t chainidx)
386*e71b7053SJung-uk Kim {
387*e71b7053SJung-uk Kim     s->s3->alpn_sent = 0;
388*e71b7053SJung-uk Kim 
389*e71b7053SJung-uk Kim     if (s->ext.alpn == NULL || !SSL_IS_FIRST_HANDSHAKE(s))
390*e71b7053SJung-uk Kim         return EXT_RETURN_NOT_SENT;
391*e71b7053SJung-uk Kim 
392*e71b7053SJung-uk Kim     if (!WPACKET_put_bytes_u16(pkt,
393*e71b7053SJung-uk Kim                 TLSEXT_TYPE_application_layer_protocol_negotiation)
394*e71b7053SJung-uk Kim                /* Sub-packet ALPN extension */
395*e71b7053SJung-uk Kim             || !WPACKET_start_sub_packet_u16(pkt)
396*e71b7053SJung-uk Kim             || !WPACKET_sub_memcpy_u16(pkt, s->ext.alpn, s->ext.alpn_len)
397*e71b7053SJung-uk Kim             || !WPACKET_close(pkt)) {
398*e71b7053SJung-uk Kim         SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_TLS_CONSTRUCT_CTOS_ALPN,
399*e71b7053SJung-uk Kim                  ERR_R_INTERNAL_ERROR);
400*e71b7053SJung-uk Kim         return EXT_RETURN_FAIL;
401*e71b7053SJung-uk Kim     }
402*e71b7053SJung-uk Kim     s->s3->alpn_sent = 1;
403*e71b7053SJung-uk Kim 
404*e71b7053SJung-uk Kim     return EXT_RETURN_SENT;
405*e71b7053SJung-uk Kim }
406*e71b7053SJung-uk Kim 
407*e71b7053SJung-uk Kim 
408*e71b7053SJung-uk Kim #ifndef OPENSSL_NO_SRTP
409*e71b7053SJung-uk Kim EXT_RETURN tls_construct_ctos_use_srtp(SSL *s, WPACKET *pkt,
410*e71b7053SJung-uk Kim                                        unsigned int context, X509 *x,
411*e71b7053SJung-uk Kim                                        size_t chainidx)
412*e71b7053SJung-uk Kim {
413*e71b7053SJung-uk Kim     STACK_OF(SRTP_PROTECTION_PROFILE) *clnt = SSL_get_srtp_profiles(s);
414*e71b7053SJung-uk Kim     int i, end;
415*e71b7053SJung-uk Kim 
416*e71b7053SJung-uk Kim     if (clnt == NULL)
417*e71b7053SJung-uk Kim         return EXT_RETURN_NOT_SENT;
418*e71b7053SJung-uk Kim 
419*e71b7053SJung-uk Kim     if (!WPACKET_put_bytes_u16(pkt, TLSEXT_TYPE_use_srtp)
420*e71b7053SJung-uk Kim                /* Sub-packet for SRTP extension */
421*e71b7053SJung-uk Kim             || !WPACKET_start_sub_packet_u16(pkt)
422*e71b7053SJung-uk Kim                /* Sub-packet for the protection profile list */
423*e71b7053SJung-uk Kim             || !WPACKET_start_sub_packet_u16(pkt)) {
424*e71b7053SJung-uk Kim         SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_TLS_CONSTRUCT_CTOS_USE_SRTP,
425*e71b7053SJung-uk Kim                  ERR_R_INTERNAL_ERROR);
426*e71b7053SJung-uk Kim         return EXT_RETURN_FAIL;
427*e71b7053SJung-uk Kim     }
428*e71b7053SJung-uk Kim 
429*e71b7053SJung-uk Kim     end = sk_SRTP_PROTECTION_PROFILE_num(clnt);
430*e71b7053SJung-uk Kim     for (i = 0; i < end; i++) {
431*e71b7053SJung-uk Kim         const SRTP_PROTECTION_PROFILE *prof =
432*e71b7053SJung-uk Kim             sk_SRTP_PROTECTION_PROFILE_value(clnt, i);
433*e71b7053SJung-uk Kim 
434*e71b7053SJung-uk Kim         if (prof == NULL || !WPACKET_put_bytes_u16(pkt, prof->id)) {
435*e71b7053SJung-uk Kim             SSLfatal(s, SSL_AD_INTERNAL_ERROR,
436*e71b7053SJung-uk Kim                      SSL_F_TLS_CONSTRUCT_CTOS_USE_SRTP, ERR_R_INTERNAL_ERROR);
437*e71b7053SJung-uk Kim             return EXT_RETURN_FAIL;
438*e71b7053SJung-uk Kim         }
439*e71b7053SJung-uk Kim     }
440*e71b7053SJung-uk Kim     if (!WPACKET_close(pkt)
441*e71b7053SJung-uk Kim                /* Add an empty use_mki value */
442*e71b7053SJung-uk Kim             || !WPACKET_put_bytes_u8(pkt, 0)
443*e71b7053SJung-uk Kim             || !WPACKET_close(pkt)) {
444*e71b7053SJung-uk Kim         SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_TLS_CONSTRUCT_CTOS_USE_SRTP,
445*e71b7053SJung-uk Kim                  ERR_R_INTERNAL_ERROR);
446*e71b7053SJung-uk Kim         return EXT_RETURN_FAIL;
447*e71b7053SJung-uk Kim     }
448*e71b7053SJung-uk Kim 
449*e71b7053SJung-uk Kim     return EXT_RETURN_SENT;
450*e71b7053SJung-uk Kim }
451*e71b7053SJung-uk Kim #endif
452*e71b7053SJung-uk Kim 
453*e71b7053SJung-uk Kim EXT_RETURN tls_construct_ctos_etm(SSL *s, WPACKET *pkt, unsigned int context,
454*e71b7053SJung-uk Kim                                   X509 *x, size_t chainidx)
455*e71b7053SJung-uk Kim {
456*e71b7053SJung-uk Kim     if (s->options & SSL_OP_NO_ENCRYPT_THEN_MAC)
457*e71b7053SJung-uk Kim         return EXT_RETURN_NOT_SENT;
458*e71b7053SJung-uk Kim 
459*e71b7053SJung-uk Kim     if (!WPACKET_put_bytes_u16(pkt, TLSEXT_TYPE_encrypt_then_mac)
460*e71b7053SJung-uk Kim             || !WPACKET_put_bytes_u16(pkt, 0)) {
461*e71b7053SJung-uk Kim         SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_TLS_CONSTRUCT_CTOS_ETM,
462*e71b7053SJung-uk Kim                  ERR_R_INTERNAL_ERROR);
463*e71b7053SJung-uk Kim         return EXT_RETURN_FAIL;
464*e71b7053SJung-uk Kim     }
465*e71b7053SJung-uk Kim 
466*e71b7053SJung-uk Kim     return EXT_RETURN_SENT;
467*e71b7053SJung-uk Kim }
468*e71b7053SJung-uk Kim 
469*e71b7053SJung-uk Kim #ifndef OPENSSL_NO_CT
470*e71b7053SJung-uk Kim EXT_RETURN tls_construct_ctos_sct(SSL *s, WPACKET *pkt, unsigned int context,
471*e71b7053SJung-uk Kim                                   X509 *x, size_t chainidx)
472*e71b7053SJung-uk Kim {
473*e71b7053SJung-uk Kim     if (s->ct_validation_callback == NULL)
474*e71b7053SJung-uk Kim         return EXT_RETURN_NOT_SENT;
475*e71b7053SJung-uk Kim 
476*e71b7053SJung-uk Kim     /* Not defined for client Certificates */
477*e71b7053SJung-uk Kim     if (x != NULL)
478*e71b7053SJung-uk Kim         return EXT_RETURN_NOT_SENT;
479*e71b7053SJung-uk Kim 
480*e71b7053SJung-uk Kim     if (!WPACKET_put_bytes_u16(pkt, TLSEXT_TYPE_signed_certificate_timestamp)
481*e71b7053SJung-uk Kim             || !WPACKET_put_bytes_u16(pkt, 0)) {
482*e71b7053SJung-uk Kim         SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_TLS_CONSTRUCT_CTOS_SCT,
483*e71b7053SJung-uk Kim                  ERR_R_INTERNAL_ERROR);
484*e71b7053SJung-uk Kim         return EXT_RETURN_FAIL;
485*e71b7053SJung-uk Kim     }
486*e71b7053SJung-uk Kim 
487*e71b7053SJung-uk Kim     return EXT_RETURN_SENT;
488*e71b7053SJung-uk Kim }
489*e71b7053SJung-uk Kim #endif
490*e71b7053SJung-uk Kim 
491*e71b7053SJung-uk Kim EXT_RETURN tls_construct_ctos_ems(SSL *s, WPACKET *pkt, unsigned int context,
492*e71b7053SJung-uk Kim                                   X509 *x, size_t chainidx)
493*e71b7053SJung-uk Kim {
494*e71b7053SJung-uk Kim     if (!WPACKET_put_bytes_u16(pkt, TLSEXT_TYPE_extended_master_secret)
495*e71b7053SJung-uk Kim             || !WPACKET_put_bytes_u16(pkt, 0)) {
496*e71b7053SJung-uk Kim         SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_TLS_CONSTRUCT_CTOS_EMS,
497*e71b7053SJung-uk Kim                  ERR_R_INTERNAL_ERROR);
498*e71b7053SJung-uk Kim         return EXT_RETURN_FAIL;
499*e71b7053SJung-uk Kim     }
500*e71b7053SJung-uk Kim 
501*e71b7053SJung-uk Kim     return EXT_RETURN_SENT;
502*e71b7053SJung-uk Kim }
503*e71b7053SJung-uk Kim 
504*e71b7053SJung-uk Kim EXT_RETURN tls_construct_ctos_supported_versions(SSL *s, WPACKET *pkt,
505*e71b7053SJung-uk Kim                                                  unsigned int context, X509 *x,
506*e71b7053SJung-uk Kim                                                  size_t chainidx)
507*e71b7053SJung-uk Kim {
508*e71b7053SJung-uk Kim     int currv, min_version, max_version, reason;
509*e71b7053SJung-uk Kim 
510*e71b7053SJung-uk Kim     reason = ssl_get_min_max_version(s, &min_version, &max_version, NULL);
511*e71b7053SJung-uk Kim     if (reason != 0) {
512*e71b7053SJung-uk Kim         SSLfatal(s, SSL_AD_INTERNAL_ERROR,
513*e71b7053SJung-uk Kim                  SSL_F_TLS_CONSTRUCT_CTOS_SUPPORTED_VERSIONS, reason);
514*e71b7053SJung-uk Kim         return EXT_RETURN_FAIL;
515*e71b7053SJung-uk Kim     }
516*e71b7053SJung-uk Kim 
517*e71b7053SJung-uk Kim     /*
518*e71b7053SJung-uk Kim      * Don't include this if we can't negotiate TLSv1.3. We can do a straight
519*e71b7053SJung-uk Kim      * comparison here because we will never be called in DTLS.
520*e71b7053SJung-uk Kim      */
521*e71b7053SJung-uk Kim     if (max_version < TLS1_3_VERSION)
522*e71b7053SJung-uk Kim         return EXT_RETURN_NOT_SENT;
523*e71b7053SJung-uk Kim 
524*e71b7053SJung-uk Kim     if (!WPACKET_put_bytes_u16(pkt, TLSEXT_TYPE_supported_versions)
525*e71b7053SJung-uk Kim             || !WPACKET_start_sub_packet_u16(pkt)
526*e71b7053SJung-uk Kim             || !WPACKET_start_sub_packet_u8(pkt)) {
527*e71b7053SJung-uk Kim         SSLfatal(s, SSL_AD_INTERNAL_ERROR,
528*e71b7053SJung-uk Kim                  SSL_F_TLS_CONSTRUCT_CTOS_SUPPORTED_VERSIONS,
529*e71b7053SJung-uk Kim                  ERR_R_INTERNAL_ERROR);
530*e71b7053SJung-uk Kim         return EXT_RETURN_FAIL;
531*e71b7053SJung-uk Kim     }
532*e71b7053SJung-uk Kim 
533*e71b7053SJung-uk Kim     for (currv = max_version; currv >= min_version; currv--) {
534*e71b7053SJung-uk Kim         if (!WPACKET_put_bytes_u16(pkt, currv)) {
535*e71b7053SJung-uk Kim             SSLfatal(s, SSL_AD_INTERNAL_ERROR,
536*e71b7053SJung-uk Kim                      SSL_F_TLS_CONSTRUCT_CTOS_SUPPORTED_VERSIONS,
537*e71b7053SJung-uk Kim                      ERR_R_INTERNAL_ERROR);
538*e71b7053SJung-uk Kim             return EXT_RETURN_FAIL;
539*e71b7053SJung-uk Kim         }
540*e71b7053SJung-uk Kim     }
541*e71b7053SJung-uk Kim     if (!WPACKET_close(pkt) || !WPACKET_close(pkt)) {
542*e71b7053SJung-uk Kim         SSLfatal(s, SSL_AD_INTERNAL_ERROR,
543*e71b7053SJung-uk Kim                  SSL_F_TLS_CONSTRUCT_CTOS_SUPPORTED_VERSIONS,
544*e71b7053SJung-uk Kim                  ERR_R_INTERNAL_ERROR);
545*e71b7053SJung-uk Kim         return EXT_RETURN_FAIL;
546*e71b7053SJung-uk Kim     }
547*e71b7053SJung-uk Kim 
548*e71b7053SJung-uk Kim     return EXT_RETURN_SENT;
549*e71b7053SJung-uk Kim }
550*e71b7053SJung-uk Kim 
551*e71b7053SJung-uk Kim /*
552*e71b7053SJung-uk Kim  * Construct a psk_kex_modes extension.
553*e71b7053SJung-uk Kim  */
554*e71b7053SJung-uk Kim EXT_RETURN tls_construct_ctos_psk_kex_modes(SSL *s, WPACKET *pkt,
555*e71b7053SJung-uk Kim                                             unsigned int context, X509 *x,
556*e71b7053SJung-uk Kim                                             size_t chainidx)
557*e71b7053SJung-uk Kim {
558*e71b7053SJung-uk Kim #ifndef OPENSSL_NO_TLS1_3
559*e71b7053SJung-uk Kim     int nodhe = s->options & SSL_OP_ALLOW_NO_DHE_KEX;
560*e71b7053SJung-uk Kim 
561*e71b7053SJung-uk Kim     if (!WPACKET_put_bytes_u16(pkt, TLSEXT_TYPE_psk_kex_modes)
562*e71b7053SJung-uk Kim             || !WPACKET_start_sub_packet_u16(pkt)
563*e71b7053SJung-uk Kim             || !WPACKET_start_sub_packet_u8(pkt)
564*e71b7053SJung-uk Kim             || !WPACKET_put_bytes_u8(pkt, TLSEXT_KEX_MODE_KE_DHE)
565*e71b7053SJung-uk Kim             || (nodhe && !WPACKET_put_bytes_u8(pkt, TLSEXT_KEX_MODE_KE))
566*e71b7053SJung-uk Kim             || !WPACKET_close(pkt)
567*e71b7053SJung-uk Kim             || !WPACKET_close(pkt)) {
568*e71b7053SJung-uk Kim         SSLfatal(s, SSL_AD_INTERNAL_ERROR,
569*e71b7053SJung-uk Kim                  SSL_F_TLS_CONSTRUCT_CTOS_PSK_KEX_MODES, ERR_R_INTERNAL_ERROR);
570*e71b7053SJung-uk Kim         return EXT_RETURN_FAIL;
571*e71b7053SJung-uk Kim     }
572*e71b7053SJung-uk Kim 
573*e71b7053SJung-uk Kim     s->ext.psk_kex_mode = TLSEXT_KEX_MODE_FLAG_KE_DHE;
574*e71b7053SJung-uk Kim     if (nodhe)
575*e71b7053SJung-uk Kim         s->ext.psk_kex_mode |= TLSEXT_KEX_MODE_FLAG_KE;
576*e71b7053SJung-uk Kim #endif
577*e71b7053SJung-uk Kim 
578*e71b7053SJung-uk Kim     return EXT_RETURN_SENT;
579*e71b7053SJung-uk Kim }
580*e71b7053SJung-uk Kim 
581*e71b7053SJung-uk Kim #ifndef OPENSSL_NO_TLS1_3
582*e71b7053SJung-uk Kim static int add_key_share(SSL *s, WPACKET *pkt, unsigned int curve_id)
583*e71b7053SJung-uk Kim {
584*e71b7053SJung-uk Kim     unsigned char *encoded_point = NULL;
585*e71b7053SJung-uk Kim     EVP_PKEY *key_share_key = NULL;
586*e71b7053SJung-uk Kim     size_t encodedlen;
587*e71b7053SJung-uk Kim 
588*e71b7053SJung-uk Kim     if (s->s3->tmp.pkey != NULL) {
589*e71b7053SJung-uk Kim         if (!ossl_assert(s->hello_retry_request == SSL_HRR_PENDING)) {
590*e71b7053SJung-uk Kim             SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_ADD_KEY_SHARE,
591*e71b7053SJung-uk Kim                      ERR_R_INTERNAL_ERROR);
592*e71b7053SJung-uk Kim             return 0;
593*e71b7053SJung-uk Kim         }
594*e71b7053SJung-uk Kim         /*
595*e71b7053SJung-uk Kim          * Could happen if we got an HRR that wasn't requesting a new key_share
596*e71b7053SJung-uk Kim          */
597*e71b7053SJung-uk Kim         key_share_key = s->s3->tmp.pkey;
598*e71b7053SJung-uk Kim     } else {
599*e71b7053SJung-uk Kim         key_share_key = ssl_generate_pkey_group(s, curve_id);
600*e71b7053SJung-uk Kim         if (key_share_key == NULL) {
601*e71b7053SJung-uk Kim             /* SSLfatal() already called */
602*e71b7053SJung-uk Kim             return 0;
603*e71b7053SJung-uk Kim         }
604*e71b7053SJung-uk Kim     }
605*e71b7053SJung-uk Kim 
606*e71b7053SJung-uk Kim     /* Encode the public key. */
607*e71b7053SJung-uk Kim     encodedlen = EVP_PKEY_get1_tls_encodedpoint(key_share_key,
608*e71b7053SJung-uk Kim                                                 &encoded_point);
609*e71b7053SJung-uk Kim     if (encodedlen == 0) {
610*e71b7053SJung-uk Kim         SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_ADD_KEY_SHARE, ERR_R_EC_LIB);
611*e71b7053SJung-uk Kim         goto err;
612*e71b7053SJung-uk Kim     }
613*e71b7053SJung-uk Kim 
614*e71b7053SJung-uk Kim     /* Create KeyShareEntry */
615*e71b7053SJung-uk Kim     if (!WPACKET_put_bytes_u16(pkt, curve_id)
616*e71b7053SJung-uk Kim             || !WPACKET_sub_memcpy_u16(pkt, encoded_point, encodedlen)) {
617*e71b7053SJung-uk Kim         SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_ADD_KEY_SHARE,
618*e71b7053SJung-uk Kim                  ERR_R_INTERNAL_ERROR);
619*e71b7053SJung-uk Kim         goto err;
620*e71b7053SJung-uk Kim     }
621*e71b7053SJung-uk Kim 
622*e71b7053SJung-uk Kim     /*
623*e71b7053SJung-uk Kim      * TODO(TLS1.3): When changing to send more than one key_share we're
624*e71b7053SJung-uk Kim      * going to need to be able to save more than one EVP_PKEY. For now
625*e71b7053SJung-uk Kim      * we reuse the existing tmp.pkey
626*e71b7053SJung-uk Kim      */
627*e71b7053SJung-uk Kim     s->s3->tmp.pkey = key_share_key;
628*e71b7053SJung-uk Kim     s->s3->group_id = curve_id;
629*e71b7053SJung-uk Kim     OPENSSL_free(encoded_point);
630*e71b7053SJung-uk Kim 
631*e71b7053SJung-uk Kim     return 1;
632*e71b7053SJung-uk Kim  err:
633*e71b7053SJung-uk Kim     if (s->s3->tmp.pkey == NULL)
634*e71b7053SJung-uk Kim         EVP_PKEY_free(key_share_key);
635*e71b7053SJung-uk Kim     OPENSSL_free(encoded_point);
636*e71b7053SJung-uk Kim     return 0;
637*e71b7053SJung-uk Kim }
638*e71b7053SJung-uk Kim #endif
639*e71b7053SJung-uk Kim 
640*e71b7053SJung-uk Kim EXT_RETURN tls_construct_ctos_key_share(SSL *s, WPACKET *pkt,
641*e71b7053SJung-uk Kim                                         unsigned int context, X509 *x,
642*e71b7053SJung-uk Kim                                         size_t chainidx)
643*e71b7053SJung-uk Kim {
644*e71b7053SJung-uk Kim #ifndef OPENSSL_NO_TLS1_3
645*e71b7053SJung-uk Kim     size_t i, num_groups = 0;
646*e71b7053SJung-uk Kim     const uint16_t *pgroups = NULL;
647*e71b7053SJung-uk Kim     uint16_t curve_id = 0;
648*e71b7053SJung-uk Kim 
649*e71b7053SJung-uk Kim     /* key_share extension */
650*e71b7053SJung-uk Kim     if (!WPACKET_put_bytes_u16(pkt, TLSEXT_TYPE_key_share)
651*e71b7053SJung-uk Kim                /* Extension data sub-packet */
652*e71b7053SJung-uk Kim             || !WPACKET_start_sub_packet_u16(pkt)
653*e71b7053SJung-uk Kim                /* KeyShare list sub-packet */
654*e71b7053SJung-uk Kim             || !WPACKET_start_sub_packet_u16(pkt)) {
655*e71b7053SJung-uk Kim         SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_TLS_CONSTRUCT_CTOS_KEY_SHARE,
656*e71b7053SJung-uk Kim                  ERR_R_INTERNAL_ERROR);
657*e71b7053SJung-uk Kim         return EXT_RETURN_FAIL;
658*e71b7053SJung-uk Kim     }
659*e71b7053SJung-uk Kim 
660*e71b7053SJung-uk Kim     tls1_get_supported_groups(s, &pgroups, &num_groups);
661*e71b7053SJung-uk Kim 
662*e71b7053SJung-uk Kim     /*
663*e71b7053SJung-uk Kim      * TODO(TLS1.3): Make the number of key_shares sent configurable. For
664*e71b7053SJung-uk Kim      * now, just send one
665*e71b7053SJung-uk Kim      */
666*e71b7053SJung-uk Kim     if (s->s3->group_id != 0) {
667*e71b7053SJung-uk Kim         curve_id = s->s3->group_id;
668*e71b7053SJung-uk Kim     } else {
669*e71b7053SJung-uk Kim         for (i = 0; i < num_groups; i++) {
670*e71b7053SJung-uk Kim 
671*e71b7053SJung-uk Kim             if (!tls_curve_allowed(s, pgroups[i], SSL_SECOP_CURVE_SUPPORTED))
672*e71b7053SJung-uk Kim                 continue;
673*e71b7053SJung-uk Kim 
674*e71b7053SJung-uk Kim             curve_id = pgroups[i];
675*e71b7053SJung-uk Kim             break;
676*e71b7053SJung-uk Kim         }
677*e71b7053SJung-uk Kim     }
678*e71b7053SJung-uk Kim 
679*e71b7053SJung-uk Kim     if (curve_id == 0) {
680*e71b7053SJung-uk Kim         SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_TLS_CONSTRUCT_CTOS_KEY_SHARE,
681*e71b7053SJung-uk Kim                  SSL_R_NO_SUITABLE_KEY_SHARE);
682*e71b7053SJung-uk Kim         return EXT_RETURN_FAIL;
683*e71b7053SJung-uk Kim     }
684*e71b7053SJung-uk Kim 
685*e71b7053SJung-uk Kim     if (!add_key_share(s, pkt, curve_id)) {
686*e71b7053SJung-uk Kim         /* SSLfatal() already called */
687*e71b7053SJung-uk Kim         return EXT_RETURN_FAIL;
688*e71b7053SJung-uk Kim     }
689*e71b7053SJung-uk Kim 
690*e71b7053SJung-uk Kim     if (!WPACKET_close(pkt) || !WPACKET_close(pkt)) {
691*e71b7053SJung-uk Kim         SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_TLS_CONSTRUCT_CTOS_KEY_SHARE,
692*e71b7053SJung-uk Kim                  ERR_R_INTERNAL_ERROR);
693*e71b7053SJung-uk Kim         return EXT_RETURN_FAIL;
694*e71b7053SJung-uk Kim     }
695*e71b7053SJung-uk Kim     return EXT_RETURN_SENT;
696*e71b7053SJung-uk Kim #else
697*e71b7053SJung-uk Kim     return EXT_RETURN_NOT_SENT;
698*e71b7053SJung-uk Kim #endif
699*e71b7053SJung-uk Kim }
700*e71b7053SJung-uk Kim 
701*e71b7053SJung-uk Kim EXT_RETURN tls_construct_ctos_cookie(SSL *s, WPACKET *pkt, unsigned int context,
702*e71b7053SJung-uk Kim                                      X509 *x, size_t chainidx)
703*e71b7053SJung-uk Kim {
704*e71b7053SJung-uk Kim     EXT_RETURN ret = EXT_RETURN_FAIL;
705*e71b7053SJung-uk Kim 
706*e71b7053SJung-uk Kim     /* Should only be set if we've had an HRR */
707*e71b7053SJung-uk Kim     if (s->ext.tls13_cookie_len == 0)
708*e71b7053SJung-uk Kim         return EXT_RETURN_NOT_SENT;
709*e71b7053SJung-uk Kim 
710*e71b7053SJung-uk Kim     if (!WPACKET_put_bytes_u16(pkt, TLSEXT_TYPE_cookie)
711*e71b7053SJung-uk Kim                /* Extension data sub-packet */
712*e71b7053SJung-uk Kim             || !WPACKET_start_sub_packet_u16(pkt)
713*e71b7053SJung-uk Kim             || !WPACKET_sub_memcpy_u16(pkt, s->ext.tls13_cookie,
714*e71b7053SJung-uk Kim                                        s->ext.tls13_cookie_len)
715*e71b7053SJung-uk Kim             || !WPACKET_close(pkt)) {
716*e71b7053SJung-uk Kim         SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_TLS_CONSTRUCT_CTOS_COOKIE,
717*e71b7053SJung-uk Kim                  ERR_R_INTERNAL_ERROR);
718*e71b7053SJung-uk Kim         goto end;
719*e71b7053SJung-uk Kim     }
720*e71b7053SJung-uk Kim 
721*e71b7053SJung-uk Kim     ret = EXT_RETURN_SENT;
722*e71b7053SJung-uk Kim  end:
723*e71b7053SJung-uk Kim     OPENSSL_free(s->ext.tls13_cookie);
724*e71b7053SJung-uk Kim     s->ext.tls13_cookie = NULL;
725*e71b7053SJung-uk Kim     s->ext.tls13_cookie_len = 0;
726*e71b7053SJung-uk Kim 
727*e71b7053SJung-uk Kim     return ret;
728*e71b7053SJung-uk Kim }
729*e71b7053SJung-uk Kim 
730*e71b7053SJung-uk Kim EXT_RETURN tls_construct_ctos_early_data(SSL *s, WPACKET *pkt,
731*e71b7053SJung-uk Kim                                          unsigned int context, X509 *x,
732*e71b7053SJung-uk Kim                                          size_t chainidx)
733*e71b7053SJung-uk Kim {
734*e71b7053SJung-uk Kim #ifndef OPENSSL_NO_PSK
735*e71b7053SJung-uk Kim     char identity[PSK_MAX_IDENTITY_LEN + 1];
736*e71b7053SJung-uk Kim #endif  /* OPENSSL_NO_PSK */
737*e71b7053SJung-uk Kim     const unsigned char *id = NULL;
738*e71b7053SJung-uk Kim     size_t idlen = 0;
739*e71b7053SJung-uk Kim     SSL_SESSION *psksess = NULL;
740*e71b7053SJung-uk Kim     SSL_SESSION *edsess = NULL;
741*e71b7053SJung-uk Kim     const EVP_MD *handmd = NULL;
742*e71b7053SJung-uk Kim 
743*e71b7053SJung-uk Kim     if (s->hello_retry_request == SSL_HRR_PENDING)
744*e71b7053SJung-uk Kim         handmd = ssl_handshake_md(s);
745*e71b7053SJung-uk Kim 
746*e71b7053SJung-uk Kim     if (s->psk_use_session_cb != NULL
747*e71b7053SJung-uk Kim             && (!s->psk_use_session_cb(s, handmd, &id, &idlen, &psksess)
748*e71b7053SJung-uk Kim                 || (psksess != NULL
749*e71b7053SJung-uk Kim                     && psksess->ssl_version != TLS1_3_VERSION))) {
750*e71b7053SJung-uk Kim         SSL_SESSION_free(psksess);
751*e71b7053SJung-uk Kim         SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_TLS_CONSTRUCT_CTOS_EARLY_DATA,
752*e71b7053SJung-uk Kim                  SSL_R_BAD_PSK);
753*e71b7053SJung-uk Kim         return EXT_RETURN_FAIL;
754*e71b7053SJung-uk Kim     }
755*e71b7053SJung-uk Kim 
756*e71b7053SJung-uk Kim #ifndef OPENSSL_NO_PSK
757*e71b7053SJung-uk Kim     if (psksess == NULL && s->psk_client_callback != NULL) {
758*e71b7053SJung-uk Kim         unsigned char psk[PSK_MAX_PSK_LEN];
759*e71b7053SJung-uk Kim         size_t psklen = 0;
760*e71b7053SJung-uk Kim 
761*e71b7053SJung-uk Kim         memset(identity, 0, sizeof(identity));
762*e71b7053SJung-uk Kim         psklen = s->psk_client_callback(s, NULL, identity, sizeof(identity) - 1,
763*e71b7053SJung-uk Kim                                         psk, sizeof(psk));
764*e71b7053SJung-uk Kim 
765*e71b7053SJung-uk Kim         if (psklen > PSK_MAX_PSK_LEN) {
766*e71b7053SJung-uk Kim             SSLfatal(s, SSL_AD_HANDSHAKE_FAILURE,
767*e71b7053SJung-uk Kim                      SSL_F_TLS_CONSTRUCT_CTOS_EARLY_DATA, ERR_R_INTERNAL_ERROR);
768*e71b7053SJung-uk Kim             return EXT_RETURN_FAIL;
769*e71b7053SJung-uk Kim         } else if (psklen > 0) {
770*e71b7053SJung-uk Kim             const unsigned char tls13_aes128gcmsha256_id[] = { 0x13, 0x01 };
771*e71b7053SJung-uk Kim             const SSL_CIPHER *cipher;
772*e71b7053SJung-uk Kim 
773*e71b7053SJung-uk Kim             idlen = strlen(identity);
774*e71b7053SJung-uk Kim             if (idlen > PSK_MAX_IDENTITY_LEN) {
775*e71b7053SJung-uk Kim                 SSLfatal(s, SSL_AD_INTERNAL_ERROR,
776*e71b7053SJung-uk Kim                          SSL_F_TLS_CONSTRUCT_CTOS_EARLY_DATA,
777*e71b7053SJung-uk Kim                          ERR_R_INTERNAL_ERROR);
778*e71b7053SJung-uk Kim                 return EXT_RETURN_FAIL;
779*e71b7053SJung-uk Kim             }
780*e71b7053SJung-uk Kim             id = (unsigned char *)identity;
781*e71b7053SJung-uk Kim 
782*e71b7053SJung-uk Kim             /*
783*e71b7053SJung-uk Kim              * We found a PSK using an old style callback. We don't know
784*e71b7053SJung-uk Kim              * the digest so we default to SHA256 as per the TLSv1.3 spec
785*e71b7053SJung-uk Kim              */
786*e71b7053SJung-uk Kim             cipher = SSL_CIPHER_find(s, tls13_aes128gcmsha256_id);
787*e71b7053SJung-uk Kim             if (cipher == NULL) {
788*e71b7053SJung-uk Kim                 SSLfatal(s, SSL_AD_INTERNAL_ERROR,
789*e71b7053SJung-uk Kim                          SSL_F_TLS_CONSTRUCT_CTOS_EARLY_DATA,
790*e71b7053SJung-uk Kim                          ERR_R_INTERNAL_ERROR);
791*e71b7053SJung-uk Kim                 return EXT_RETURN_FAIL;
792*e71b7053SJung-uk Kim             }
793*e71b7053SJung-uk Kim 
794*e71b7053SJung-uk Kim             psksess = SSL_SESSION_new();
795*e71b7053SJung-uk Kim             if (psksess == NULL
796*e71b7053SJung-uk Kim                     || !SSL_SESSION_set1_master_key(psksess, psk, psklen)
797*e71b7053SJung-uk Kim                     || !SSL_SESSION_set_cipher(psksess, cipher)
798*e71b7053SJung-uk Kim                     || !SSL_SESSION_set_protocol_version(psksess, TLS1_3_VERSION)) {
799*e71b7053SJung-uk Kim                 SSLfatal(s, SSL_AD_INTERNAL_ERROR,
800*e71b7053SJung-uk Kim                          SSL_F_TLS_CONSTRUCT_CTOS_EARLY_DATA,
801*e71b7053SJung-uk Kim                          ERR_R_INTERNAL_ERROR);
802*e71b7053SJung-uk Kim                 OPENSSL_cleanse(psk, psklen);
803*e71b7053SJung-uk Kim                 return EXT_RETURN_FAIL;
804*e71b7053SJung-uk Kim             }
805*e71b7053SJung-uk Kim             OPENSSL_cleanse(psk, psklen);
806*e71b7053SJung-uk Kim         }
807*e71b7053SJung-uk Kim     }
808*e71b7053SJung-uk Kim #endif  /* OPENSSL_NO_PSK */
809*e71b7053SJung-uk Kim 
810*e71b7053SJung-uk Kim     SSL_SESSION_free(s->psksession);
811*e71b7053SJung-uk Kim     s->psksession = psksess;
812*e71b7053SJung-uk Kim     if (psksess != NULL) {
813*e71b7053SJung-uk Kim         OPENSSL_free(s->psksession_id);
814*e71b7053SJung-uk Kim         s->psksession_id = OPENSSL_memdup(id, idlen);
815*e71b7053SJung-uk Kim         if (s->psksession_id == NULL) {
816*e71b7053SJung-uk Kim             SSLfatal(s, SSL_AD_INTERNAL_ERROR,
817*e71b7053SJung-uk Kim                      SSL_F_TLS_CONSTRUCT_CTOS_EARLY_DATA, ERR_R_INTERNAL_ERROR);
818*e71b7053SJung-uk Kim             return EXT_RETURN_FAIL;
819*e71b7053SJung-uk Kim         }
820*e71b7053SJung-uk Kim         s->psksession_id_len = idlen;
821*e71b7053SJung-uk Kim     }
822*e71b7053SJung-uk Kim 
823*e71b7053SJung-uk Kim     if (s->early_data_state != SSL_EARLY_DATA_CONNECTING
824*e71b7053SJung-uk Kim             || (s->session->ext.max_early_data == 0
825*e71b7053SJung-uk Kim                 && (psksess == NULL || psksess->ext.max_early_data == 0))) {
826*e71b7053SJung-uk Kim         s->max_early_data = 0;
827*e71b7053SJung-uk Kim         return EXT_RETURN_NOT_SENT;
828*e71b7053SJung-uk Kim     }
829*e71b7053SJung-uk Kim     edsess = s->session->ext.max_early_data != 0 ? s->session : psksess;
830*e71b7053SJung-uk Kim     s->max_early_data = edsess->ext.max_early_data;
831*e71b7053SJung-uk Kim 
832*e71b7053SJung-uk Kim     if (edsess->ext.hostname != NULL) {
833*e71b7053SJung-uk Kim         if (s->ext.hostname == NULL
834*e71b7053SJung-uk Kim                 || (s->ext.hostname != NULL
835*e71b7053SJung-uk Kim                     && strcmp(s->ext.hostname, edsess->ext.hostname) != 0)) {
836*e71b7053SJung-uk Kim             SSLfatal(s, SSL_AD_INTERNAL_ERROR,
837*e71b7053SJung-uk Kim                      SSL_F_TLS_CONSTRUCT_CTOS_EARLY_DATA,
838*e71b7053SJung-uk Kim                      SSL_R_INCONSISTENT_EARLY_DATA_SNI);
839*e71b7053SJung-uk Kim             return EXT_RETURN_FAIL;
840*e71b7053SJung-uk Kim         }
841*e71b7053SJung-uk Kim     }
842*e71b7053SJung-uk Kim 
843*e71b7053SJung-uk Kim     if ((s->ext.alpn == NULL && edsess->ext.alpn_selected != NULL)) {
844*e71b7053SJung-uk Kim         SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_TLS_CONSTRUCT_CTOS_EARLY_DATA,
845*e71b7053SJung-uk Kim                  SSL_R_INCONSISTENT_EARLY_DATA_ALPN);
846*e71b7053SJung-uk Kim         return EXT_RETURN_FAIL;
847*e71b7053SJung-uk Kim     }
848*e71b7053SJung-uk Kim 
849*e71b7053SJung-uk Kim     /*
850*e71b7053SJung-uk Kim      * Verify that we are offering an ALPN protocol consistent with the early
851*e71b7053SJung-uk Kim      * data.
852*e71b7053SJung-uk Kim      */
853*e71b7053SJung-uk Kim     if (edsess->ext.alpn_selected != NULL) {
854*e71b7053SJung-uk Kim         PACKET prots, alpnpkt;
855*e71b7053SJung-uk Kim         int found = 0;
856*e71b7053SJung-uk Kim 
857*e71b7053SJung-uk Kim         if (!PACKET_buf_init(&prots, s->ext.alpn, s->ext.alpn_len)) {
858*e71b7053SJung-uk Kim             SSLfatal(s, SSL_AD_INTERNAL_ERROR,
859*e71b7053SJung-uk Kim                      SSL_F_TLS_CONSTRUCT_CTOS_EARLY_DATA, ERR_R_INTERNAL_ERROR);
860*e71b7053SJung-uk Kim             return EXT_RETURN_FAIL;
861*e71b7053SJung-uk Kim         }
862*e71b7053SJung-uk Kim         while (PACKET_get_length_prefixed_1(&prots, &alpnpkt)) {
863*e71b7053SJung-uk Kim             if (PACKET_equal(&alpnpkt, edsess->ext.alpn_selected,
864*e71b7053SJung-uk Kim                              edsess->ext.alpn_selected_len)) {
865*e71b7053SJung-uk Kim                 found = 1;
866*e71b7053SJung-uk Kim                 break;
867*e71b7053SJung-uk Kim             }
868*e71b7053SJung-uk Kim         }
869*e71b7053SJung-uk Kim         if (!found) {
870*e71b7053SJung-uk Kim             SSLfatal(s, SSL_AD_INTERNAL_ERROR,
871*e71b7053SJung-uk Kim                      SSL_F_TLS_CONSTRUCT_CTOS_EARLY_DATA,
872*e71b7053SJung-uk Kim                      SSL_R_INCONSISTENT_EARLY_DATA_ALPN);
873*e71b7053SJung-uk Kim             return EXT_RETURN_FAIL;
874*e71b7053SJung-uk Kim         }
875*e71b7053SJung-uk Kim     }
876*e71b7053SJung-uk Kim 
877*e71b7053SJung-uk Kim     if (!WPACKET_put_bytes_u16(pkt, TLSEXT_TYPE_early_data)
878*e71b7053SJung-uk Kim             || !WPACKET_start_sub_packet_u16(pkt)
879*e71b7053SJung-uk Kim             || !WPACKET_close(pkt)) {
880*e71b7053SJung-uk Kim         SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_TLS_CONSTRUCT_CTOS_EARLY_DATA,
881*e71b7053SJung-uk Kim                  ERR_R_INTERNAL_ERROR);
882*e71b7053SJung-uk Kim         return EXT_RETURN_FAIL;
883*e71b7053SJung-uk Kim     }
884*e71b7053SJung-uk Kim 
885*e71b7053SJung-uk Kim     /*
886*e71b7053SJung-uk Kim      * We set this to rejected here. Later, if the server acknowledges the
887*e71b7053SJung-uk Kim      * extension, we set it to accepted.
888*e71b7053SJung-uk Kim      */
889*e71b7053SJung-uk Kim     s->ext.early_data = SSL_EARLY_DATA_REJECTED;
890*e71b7053SJung-uk Kim     s->ext.early_data_ok = 1;
891*e71b7053SJung-uk Kim 
892*e71b7053SJung-uk Kim     return EXT_RETURN_SENT;
893*e71b7053SJung-uk Kim }
894*e71b7053SJung-uk Kim 
895*e71b7053SJung-uk Kim #define F5_WORKAROUND_MIN_MSG_LEN   0xff
896*e71b7053SJung-uk Kim #define F5_WORKAROUND_MAX_MSG_LEN   0x200
897*e71b7053SJung-uk Kim 
898*e71b7053SJung-uk Kim /*
899*e71b7053SJung-uk Kim  * PSK pre binder overhead =
900*e71b7053SJung-uk Kim  *  2 bytes for TLSEXT_TYPE_psk
901*e71b7053SJung-uk Kim  *  2 bytes for extension length
902*e71b7053SJung-uk Kim  *  2 bytes for identities list length
903*e71b7053SJung-uk Kim  *  2 bytes for identity length
904*e71b7053SJung-uk Kim  *  4 bytes for obfuscated_ticket_age
905*e71b7053SJung-uk Kim  *  2 bytes for binder list length
906*e71b7053SJung-uk Kim  *  1 byte for binder length
907*e71b7053SJung-uk Kim  * The above excludes the number of bytes for the identity itself and the
908*e71b7053SJung-uk Kim  * subsequent binder bytes
909*e71b7053SJung-uk Kim  */
910*e71b7053SJung-uk Kim #define PSK_PRE_BINDER_OVERHEAD (2 + 2 + 2 + 2 + 4 + 2 + 1)
911*e71b7053SJung-uk Kim 
912*e71b7053SJung-uk Kim EXT_RETURN tls_construct_ctos_padding(SSL *s, WPACKET *pkt,
913*e71b7053SJung-uk Kim                                       unsigned int context, X509 *x,
914*e71b7053SJung-uk Kim                                       size_t chainidx)
915*e71b7053SJung-uk Kim {
916*e71b7053SJung-uk Kim     unsigned char *padbytes;
917*e71b7053SJung-uk Kim     size_t hlen;
918*e71b7053SJung-uk Kim 
919*e71b7053SJung-uk Kim     if ((s->options & SSL_OP_TLSEXT_PADDING) == 0)
920*e71b7053SJung-uk Kim         return EXT_RETURN_NOT_SENT;
921*e71b7053SJung-uk Kim 
922*e71b7053SJung-uk Kim     /*
923*e71b7053SJung-uk Kim      * Add padding to workaround bugs in F5 terminators. See RFC7685.
924*e71b7053SJung-uk Kim      * This code calculates the length of all extensions added so far but
925*e71b7053SJung-uk Kim      * excludes the PSK extension (because that MUST be written last). Therefore
926*e71b7053SJung-uk Kim      * this extension MUST always appear second to last.
927*e71b7053SJung-uk Kim      */
928*e71b7053SJung-uk Kim     if (!WPACKET_get_total_written(pkt, &hlen)) {
929*e71b7053SJung-uk Kim         SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_TLS_CONSTRUCT_CTOS_PADDING,
930*e71b7053SJung-uk Kim                  ERR_R_INTERNAL_ERROR);
931*e71b7053SJung-uk Kim         return EXT_RETURN_FAIL;
932*e71b7053SJung-uk Kim     }
933*e71b7053SJung-uk Kim 
934*e71b7053SJung-uk Kim     /*
935*e71b7053SJung-uk Kim      * If we're going to send a PSK then that will be written out after this
936*e71b7053SJung-uk Kim      * extension, so we need to calculate how long it is going to be.
937*e71b7053SJung-uk Kim      */
938*e71b7053SJung-uk Kim     if (s->session->ssl_version == TLS1_3_VERSION
939*e71b7053SJung-uk Kim             && s->session->ext.ticklen != 0
940*e71b7053SJung-uk Kim             && s->session->cipher != NULL) {
941*e71b7053SJung-uk Kim         const EVP_MD *md = ssl_md(s->session->cipher->algorithm2);
942*e71b7053SJung-uk Kim 
943*e71b7053SJung-uk Kim         if (md != NULL) {
944*e71b7053SJung-uk Kim             /*
945*e71b7053SJung-uk Kim              * Add the fixed PSK overhead, the identity length and the binder
946*e71b7053SJung-uk Kim              * length.
947*e71b7053SJung-uk Kim              */
948*e71b7053SJung-uk Kim             hlen +=  PSK_PRE_BINDER_OVERHEAD + s->session->ext.ticklen
949*e71b7053SJung-uk Kim                      + EVP_MD_size(md);
950*e71b7053SJung-uk Kim         }
951*e71b7053SJung-uk Kim     }
952*e71b7053SJung-uk Kim 
953*e71b7053SJung-uk Kim     if (hlen > F5_WORKAROUND_MIN_MSG_LEN && hlen < F5_WORKAROUND_MAX_MSG_LEN) {
954*e71b7053SJung-uk Kim         /* Calculate the amount of padding we need to add */
955*e71b7053SJung-uk Kim         hlen = F5_WORKAROUND_MAX_MSG_LEN - hlen;
956*e71b7053SJung-uk Kim 
957*e71b7053SJung-uk Kim         /*
958*e71b7053SJung-uk Kim          * Take off the size of extension header itself (2 bytes for type and
959*e71b7053SJung-uk Kim          * 2 bytes for length bytes), but ensure that the extension is at least
960*e71b7053SJung-uk Kim          * 1 byte long so as not to have an empty extension last (WebSphere 7.x,
961*e71b7053SJung-uk Kim          * 8.x are intolerant of that condition)
962*e71b7053SJung-uk Kim          */
963*e71b7053SJung-uk Kim         if (hlen > 4)
964*e71b7053SJung-uk Kim             hlen -= 4;
965*e71b7053SJung-uk Kim         else
966*e71b7053SJung-uk Kim             hlen = 1;
967*e71b7053SJung-uk Kim 
968*e71b7053SJung-uk Kim         if (!WPACKET_put_bytes_u16(pkt, TLSEXT_TYPE_padding)
969*e71b7053SJung-uk Kim                 || !WPACKET_sub_allocate_bytes_u16(pkt, hlen, &padbytes)) {
970*e71b7053SJung-uk Kim             SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_TLS_CONSTRUCT_CTOS_PADDING,
971*e71b7053SJung-uk Kim                      ERR_R_INTERNAL_ERROR);
972*e71b7053SJung-uk Kim             return EXT_RETURN_FAIL;
973*e71b7053SJung-uk Kim         }
974*e71b7053SJung-uk Kim         memset(padbytes, 0, hlen);
975*e71b7053SJung-uk Kim     }
976*e71b7053SJung-uk Kim 
977*e71b7053SJung-uk Kim     return EXT_RETURN_SENT;
978*e71b7053SJung-uk Kim }
979*e71b7053SJung-uk Kim 
980*e71b7053SJung-uk Kim /*
981*e71b7053SJung-uk Kim  * Construct the pre_shared_key extension
982*e71b7053SJung-uk Kim  */
983*e71b7053SJung-uk Kim EXT_RETURN tls_construct_ctos_psk(SSL *s, WPACKET *pkt, unsigned int context,
984*e71b7053SJung-uk Kim                                   X509 *x, size_t chainidx)
985*e71b7053SJung-uk Kim {
986*e71b7053SJung-uk Kim #ifndef OPENSSL_NO_TLS1_3
987*e71b7053SJung-uk Kim     uint32_t now, agesec, agems = 0;
988*e71b7053SJung-uk Kim     size_t reshashsize = 0, pskhashsize = 0, binderoffset, msglen;
989*e71b7053SJung-uk Kim     unsigned char *resbinder = NULL, *pskbinder = NULL, *msgstart = NULL;
990*e71b7053SJung-uk Kim     const EVP_MD *handmd = NULL, *mdres = NULL, *mdpsk = NULL;
991*e71b7053SJung-uk Kim     int dores = 0;
992*e71b7053SJung-uk Kim 
993*e71b7053SJung-uk Kim     s->session->ext.tick_identity = TLSEXT_PSK_BAD_IDENTITY;
994*e71b7053SJung-uk Kim 
995*e71b7053SJung-uk Kim     /*
996*e71b7053SJung-uk Kim      * Note: At this stage of the code we only support adding a single
997*e71b7053SJung-uk Kim      * resumption PSK. If we add support for multiple PSKs then the length
998*e71b7053SJung-uk Kim      * calculations in the padding extension will need to be adjusted.
999*e71b7053SJung-uk Kim      */
1000*e71b7053SJung-uk Kim 
1001*e71b7053SJung-uk Kim     /*
1002*e71b7053SJung-uk Kim      * If this is an incompatible or new session then we have nothing to resume
1003*e71b7053SJung-uk Kim      * so don't add this extension.
1004*e71b7053SJung-uk Kim      */
1005*e71b7053SJung-uk Kim     if (s->session->ssl_version != TLS1_3_VERSION
1006*e71b7053SJung-uk Kim             || (s->session->ext.ticklen == 0 && s->psksession == NULL))
1007*e71b7053SJung-uk Kim         return EXT_RETURN_NOT_SENT;
1008*e71b7053SJung-uk Kim 
1009*e71b7053SJung-uk Kim     if (s->hello_retry_request == SSL_HRR_PENDING)
1010*e71b7053SJung-uk Kim         handmd = ssl_handshake_md(s);
1011*e71b7053SJung-uk Kim 
1012*e71b7053SJung-uk Kim     if (s->session->ext.ticklen != 0) {
1013*e71b7053SJung-uk Kim         /* Get the digest associated with the ciphersuite in the session */
1014*e71b7053SJung-uk Kim         if (s->session->cipher == NULL) {
1015*e71b7053SJung-uk Kim             SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_TLS_CONSTRUCT_CTOS_PSK,
1016*e71b7053SJung-uk Kim                      ERR_R_INTERNAL_ERROR);
1017*e71b7053SJung-uk Kim             return EXT_RETURN_FAIL;
1018*e71b7053SJung-uk Kim         }
1019*e71b7053SJung-uk Kim         mdres = ssl_md(s->session->cipher->algorithm2);
1020*e71b7053SJung-uk Kim         if (mdres == NULL) {
1021*e71b7053SJung-uk Kim             /*
1022*e71b7053SJung-uk Kim              * Don't recognize this cipher so we can't use the session.
1023*e71b7053SJung-uk Kim              * Ignore it
1024*e71b7053SJung-uk Kim              */
1025*e71b7053SJung-uk Kim             goto dopsksess;
1026*e71b7053SJung-uk Kim         }
1027*e71b7053SJung-uk Kim 
1028*e71b7053SJung-uk Kim         if (s->hello_retry_request == SSL_HRR_PENDING && mdres != handmd) {
1029*e71b7053SJung-uk Kim             /*
1030*e71b7053SJung-uk Kim              * Selected ciphersuite hash does not match the hash for the session
1031*e71b7053SJung-uk Kim              * so we can't use it.
1032*e71b7053SJung-uk Kim              */
1033*e71b7053SJung-uk Kim             goto dopsksess;
1034*e71b7053SJung-uk Kim         }
1035*e71b7053SJung-uk Kim 
1036*e71b7053SJung-uk Kim         /*
1037*e71b7053SJung-uk Kim          * Technically the C standard just says time() returns a time_t and says
1038*e71b7053SJung-uk Kim          * nothing about the encoding of that type. In practice most
1039*e71b7053SJung-uk Kim          * implementations follow POSIX which holds it as an integral type in
1040*e71b7053SJung-uk Kim          * seconds since epoch. We've already made the assumption that we can do
1041*e71b7053SJung-uk Kim          * this in multiple places in the code, so portability shouldn't be an
1042*e71b7053SJung-uk Kim          * issue.
1043*e71b7053SJung-uk Kim          */
1044*e71b7053SJung-uk Kim         now = (uint32_t)time(NULL);
1045*e71b7053SJung-uk Kim         agesec = now - (uint32_t)s->session->time;
1046*e71b7053SJung-uk Kim         /*
1047*e71b7053SJung-uk Kim          * We calculate the age in seconds but the server may work in ms. Due to
1048*e71b7053SJung-uk Kim          * rounding errors we could overestimate the age by up to 1s. It is
1049*e71b7053SJung-uk Kim          * better to underestimate it. Otherwise, if the RTT is very short, when
1050*e71b7053SJung-uk Kim          * the server calculates the age reported by the client it could be
1051*e71b7053SJung-uk Kim          * bigger than the age calculated on the server - which should never
1052*e71b7053SJung-uk Kim          * happen.
1053*e71b7053SJung-uk Kim          */
1054*e71b7053SJung-uk Kim         if (agesec > 0)
1055*e71b7053SJung-uk Kim             agesec--;
1056*e71b7053SJung-uk Kim 
1057*e71b7053SJung-uk Kim         if (s->session->ext.tick_lifetime_hint < agesec) {
1058*e71b7053SJung-uk Kim             /* Ticket is too old. Ignore it. */
1059*e71b7053SJung-uk Kim             goto dopsksess;
1060*e71b7053SJung-uk Kim         }
1061*e71b7053SJung-uk Kim 
1062*e71b7053SJung-uk Kim         /*
1063*e71b7053SJung-uk Kim          * Calculate age in ms. We're just doing it to nearest second. Should be
1064*e71b7053SJung-uk Kim          * good enough.
1065*e71b7053SJung-uk Kim          */
1066*e71b7053SJung-uk Kim         agems = agesec * (uint32_t)1000;
1067*e71b7053SJung-uk Kim 
1068*e71b7053SJung-uk Kim         if (agesec != 0 && agems / (uint32_t)1000 != agesec) {
1069*e71b7053SJung-uk Kim             /*
1070*e71b7053SJung-uk Kim              * Overflow. Shouldn't happen unless this is a *really* old session.
1071*e71b7053SJung-uk Kim              * If so we just ignore it.
1072*e71b7053SJung-uk Kim              */
1073*e71b7053SJung-uk Kim             goto dopsksess;
1074*e71b7053SJung-uk Kim         }
1075*e71b7053SJung-uk Kim 
1076*e71b7053SJung-uk Kim         /*
1077*e71b7053SJung-uk Kim          * Obfuscate the age. Overflow here is fine, this addition is supposed
1078*e71b7053SJung-uk Kim          * to be mod 2^32.
1079*e71b7053SJung-uk Kim          */
1080*e71b7053SJung-uk Kim         agems += s->session->ext.tick_age_add;
1081*e71b7053SJung-uk Kim 
1082*e71b7053SJung-uk Kim         reshashsize = EVP_MD_size(mdres);
1083*e71b7053SJung-uk Kim         dores = 1;
1084*e71b7053SJung-uk Kim     }
1085*e71b7053SJung-uk Kim 
1086*e71b7053SJung-uk Kim  dopsksess:
1087*e71b7053SJung-uk Kim     if (!dores && s->psksession == NULL)
1088*e71b7053SJung-uk Kim         return EXT_RETURN_NOT_SENT;
1089*e71b7053SJung-uk Kim 
1090*e71b7053SJung-uk Kim     if (s->psksession != NULL) {
1091*e71b7053SJung-uk Kim         mdpsk = ssl_md(s->psksession->cipher->algorithm2);
1092*e71b7053SJung-uk Kim         if (mdpsk == NULL) {
1093*e71b7053SJung-uk Kim             /*
1094*e71b7053SJung-uk Kim              * Don't recognize this cipher so we can't use the session.
1095*e71b7053SJung-uk Kim              * If this happens it's an application bug.
1096*e71b7053SJung-uk Kim              */
1097*e71b7053SJung-uk Kim             SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_TLS_CONSTRUCT_CTOS_PSK,
1098*e71b7053SJung-uk Kim                      SSL_R_BAD_PSK);
1099*e71b7053SJung-uk Kim             return EXT_RETURN_FAIL;
1100*e71b7053SJung-uk Kim         }
1101*e71b7053SJung-uk Kim 
1102*e71b7053SJung-uk Kim         if (s->hello_retry_request == SSL_HRR_PENDING && mdpsk != handmd) {
1103*e71b7053SJung-uk Kim             /*
1104*e71b7053SJung-uk Kim              * Selected ciphersuite hash does not match the hash for the PSK
1105*e71b7053SJung-uk Kim              * session. This is an application bug.
1106*e71b7053SJung-uk Kim              */
1107*e71b7053SJung-uk Kim             SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_TLS_CONSTRUCT_CTOS_PSK,
1108*e71b7053SJung-uk Kim                      SSL_R_BAD_PSK);
1109*e71b7053SJung-uk Kim             return EXT_RETURN_FAIL;
1110*e71b7053SJung-uk Kim         }
1111*e71b7053SJung-uk Kim 
1112*e71b7053SJung-uk Kim         pskhashsize = EVP_MD_size(mdpsk);
1113*e71b7053SJung-uk Kim     }
1114*e71b7053SJung-uk Kim 
1115*e71b7053SJung-uk Kim     /* Create the extension, but skip over the binder for now */
1116*e71b7053SJung-uk Kim     if (!WPACKET_put_bytes_u16(pkt, TLSEXT_TYPE_psk)
1117*e71b7053SJung-uk Kim             || !WPACKET_start_sub_packet_u16(pkt)
1118*e71b7053SJung-uk Kim             || !WPACKET_start_sub_packet_u16(pkt)) {
1119*e71b7053SJung-uk Kim         SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_TLS_CONSTRUCT_CTOS_PSK,
1120*e71b7053SJung-uk Kim                  ERR_R_INTERNAL_ERROR);
1121*e71b7053SJung-uk Kim         return EXT_RETURN_FAIL;
1122*e71b7053SJung-uk Kim     }
1123*e71b7053SJung-uk Kim 
1124*e71b7053SJung-uk Kim     if (dores) {
1125*e71b7053SJung-uk Kim         if (!WPACKET_sub_memcpy_u16(pkt, s->session->ext.tick,
1126*e71b7053SJung-uk Kim                                            s->session->ext.ticklen)
1127*e71b7053SJung-uk Kim                 || !WPACKET_put_bytes_u32(pkt, agems)) {
1128*e71b7053SJung-uk Kim             SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_TLS_CONSTRUCT_CTOS_PSK,
1129*e71b7053SJung-uk Kim                      ERR_R_INTERNAL_ERROR);
1130*e71b7053SJung-uk Kim             return EXT_RETURN_FAIL;
1131*e71b7053SJung-uk Kim         }
1132*e71b7053SJung-uk Kim     }
1133*e71b7053SJung-uk Kim 
1134*e71b7053SJung-uk Kim     if (s->psksession != NULL) {
1135*e71b7053SJung-uk Kim         if (!WPACKET_sub_memcpy_u16(pkt, s->psksession_id,
1136*e71b7053SJung-uk Kim                                     s->psksession_id_len)
1137*e71b7053SJung-uk Kim                 || !WPACKET_put_bytes_u32(pkt, 0)) {
1138*e71b7053SJung-uk Kim             SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_TLS_CONSTRUCT_CTOS_PSK,
1139*e71b7053SJung-uk Kim                      ERR_R_INTERNAL_ERROR);
1140*e71b7053SJung-uk Kim             return EXT_RETURN_FAIL;
1141*e71b7053SJung-uk Kim         }
1142*e71b7053SJung-uk Kim     }
1143*e71b7053SJung-uk Kim 
1144*e71b7053SJung-uk Kim     if (!WPACKET_close(pkt)
1145*e71b7053SJung-uk Kim             || !WPACKET_get_total_written(pkt, &binderoffset)
1146*e71b7053SJung-uk Kim             || !WPACKET_start_sub_packet_u16(pkt)
1147*e71b7053SJung-uk Kim             || (dores
1148*e71b7053SJung-uk Kim                 && !WPACKET_sub_allocate_bytes_u8(pkt, reshashsize, &resbinder))
1149*e71b7053SJung-uk Kim             || (s->psksession != NULL
1150*e71b7053SJung-uk Kim                 && !WPACKET_sub_allocate_bytes_u8(pkt, pskhashsize, &pskbinder))
1151*e71b7053SJung-uk Kim             || !WPACKET_close(pkt)
1152*e71b7053SJung-uk Kim             || !WPACKET_close(pkt)
1153*e71b7053SJung-uk Kim             || !WPACKET_get_total_written(pkt, &msglen)
1154*e71b7053SJung-uk Kim                /*
1155*e71b7053SJung-uk Kim                 * We need to fill in all the sub-packet lengths now so we can
1156*e71b7053SJung-uk Kim                 * calculate the HMAC of the message up to the binders
1157*e71b7053SJung-uk Kim                 */
1158*e71b7053SJung-uk Kim             || !WPACKET_fill_lengths(pkt)) {
1159*e71b7053SJung-uk Kim         SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_TLS_CONSTRUCT_CTOS_PSK,
1160*e71b7053SJung-uk Kim                  ERR_R_INTERNAL_ERROR);
1161*e71b7053SJung-uk Kim         return EXT_RETURN_FAIL;
1162*e71b7053SJung-uk Kim     }
1163*e71b7053SJung-uk Kim 
1164*e71b7053SJung-uk Kim     msgstart = WPACKET_get_curr(pkt) - msglen;
1165*e71b7053SJung-uk Kim 
1166*e71b7053SJung-uk Kim     if (dores
1167*e71b7053SJung-uk Kim             && tls_psk_do_binder(s, mdres, msgstart, binderoffset, NULL,
1168*e71b7053SJung-uk Kim                                  resbinder, s->session, 1, 0) != 1) {
1169*e71b7053SJung-uk Kim         /* SSLfatal() already called */
1170*e71b7053SJung-uk Kim         return EXT_RETURN_FAIL;
1171*e71b7053SJung-uk Kim     }
1172*e71b7053SJung-uk Kim 
1173*e71b7053SJung-uk Kim     if (s->psksession != NULL
1174*e71b7053SJung-uk Kim             && tls_psk_do_binder(s, mdpsk, msgstart, binderoffset, NULL,
1175*e71b7053SJung-uk Kim                                  pskbinder, s->psksession, 1, 1) != 1) {
1176*e71b7053SJung-uk Kim         /* SSLfatal() already called */
1177*e71b7053SJung-uk Kim         return EXT_RETURN_FAIL;
1178*e71b7053SJung-uk Kim     }
1179*e71b7053SJung-uk Kim 
1180*e71b7053SJung-uk Kim     if (dores)
1181*e71b7053SJung-uk Kim         s->session->ext.tick_identity = 0;
1182*e71b7053SJung-uk Kim     if (s->psksession != NULL)
1183*e71b7053SJung-uk Kim         s->psksession->ext.tick_identity = (dores ? 1 : 0);
1184*e71b7053SJung-uk Kim 
1185*e71b7053SJung-uk Kim     return EXT_RETURN_SENT;
1186*e71b7053SJung-uk Kim #else
1187*e71b7053SJung-uk Kim     return EXT_RETURN_NOT_SENT;
1188*e71b7053SJung-uk Kim #endif
1189*e71b7053SJung-uk Kim }
1190*e71b7053SJung-uk Kim 
1191*e71b7053SJung-uk Kim EXT_RETURN tls_construct_ctos_post_handshake_auth(SSL *s, WPACKET *pkt,
1192*e71b7053SJung-uk Kim                                                   unsigned int context,
1193*e71b7053SJung-uk Kim                                                   X509 *x, size_t chainidx)
1194*e71b7053SJung-uk Kim {
1195*e71b7053SJung-uk Kim #ifndef OPENSSL_NO_TLS1_3
1196*e71b7053SJung-uk Kim     if (!s->pha_enabled)
1197*e71b7053SJung-uk Kim         return EXT_RETURN_NOT_SENT;
1198*e71b7053SJung-uk Kim 
1199*e71b7053SJung-uk Kim     /* construct extension - 0 length, no contents */
1200*e71b7053SJung-uk Kim     if (!WPACKET_put_bytes_u16(pkt, TLSEXT_TYPE_post_handshake_auth)
1201*e71b7053SJung-uk Kim             || !WPACKET_start_sub_packet_u16(pkt)
1202*e71b7053SJung-uk Kim             || !WPACKET_close(pkt)) {
1203*e71b7053SJung-uk Kim         SSLfatal(s, SSL_AD_INTERNAL_ERROR,
1204*e71b7053SJung-uk Kim                  SSL_F_TLS_CONSTRUCT_CTOS_POST_HANDSHAKE_AUTH,
1205*e71b7053SJung-uk Kim                  ERR_R_INTERNAL_ERROR);
1206*e71b7053SJung-uk Kim         return EXT_RETURN_FAIL;
1207*e71b7053SJung-uk Kim     }
1208*e71b7053SJung-uk Kim 
1209*e71b7053SJung-uk Kim     s->post_handshake_auth = SSL_PHA_EXT_SENT;
1210*e71b7053SJung-uk Kim 
1211*e71b7053SJung-uk Kim     return EXT_RETURN_SENT;
1212*e71b7053SJung-uk Kim #else
1213*e71b7053SJung-uk Kim     return EXT_RETURN_NOT_SENT;
1214*e71b7053SJung-uk Kim #endif
1215*e71b7053SJung-uk Kim }
1216*e71b7053SJung-uk Kim 
1217*e71b7053SJung-uk Kim 
1218*e71b7053SJung-uk Kim /*
1219*e71b7053SJung-uk Kim  * Parse the server's renegotiation binding and abort if it's not right
1220*e71b7053SJung-uk Kim  */
1221*e71b7053SJung-uk Kim int tls_parse_stoc_renegotiate(SSL *s, PACKET *pkt, unsigned int context,
1222*e71b7053SJung-uk Kim                                X509 *x, size_t chainidx)
1223*e71b7053SJung-uk Kim {
1224*e71b7053SJung-uk Kim     size_t expected_len = s->s3->previous_client_finished_len
1225*e71b7053SJung-uk Kim         + s->s3->previous_server_finished_len;
1226*e71b7053SJung-uk Kim     size_t ilen;
1227*e71b7053SJung-uk Kim     const unsigned char *data;
1228*e71b7053SJung-uk Kim 
1229*e71b7053SJung-uk Kim     /* Check for logic errors */
1230*e71b7053SJung-uk Kim     if (!ossl_assert(expected_len == 0
1231*e71b7053SJung-uk Kim                      || s->s3->previous_client_finished_len != 0)
1232*e71b7053SJung-uk Kim         || !ossl_assert(expected_len == 0
1233*e71b7053SJung-uk Kim                         || s->s3->previous_server_finished_len != 0)) {
1234*e71b7053SJung-uk Kim         SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_TLS_PARSE_STOC_RENEGOTIATE,
1235*e71b7053SJung-uk Kim                  ERR_R_INTERNAL_ERROR);
1236*e71b7053SJung-uk Kim         return 0;
1237*e71b7053SJung-uk Kim     }
1238*e71b7053SJung-uk Kim 
1239*e71b7053SJung-uk Kim     /* Parse the length byte */
1240*e71b7053SJung-uk Kim     if (!PACKET_get_1_len(pkt, &ilen)) {
1241*e71b7053SJung-uk Kim         SSLfatal(s, SSL_AD_DECODE_ERROR, SSL_F_TLS_PARSE_STOC_RENEGOTIATE,
1242*e71b7053SJung-uk Kim                  SSL_R_RENEGOTIATION_ENCODING_ERR);
1243*e71b7053SJung-uk Kim         return 0;
1244*e71b7053SJung-uk Kim     }
1245*e71b7053SJung-uk Kim 
1246*e71b7053SJung-uk Kim     /* Consistency check */
1247*e71b7053SJung-uk Kim     if (PACKET_remaining(pkt) != ilen) {
1248*e71b7053SJung-uk Kim         SSLfatal(s, SSL_AD_DECODE_ERROR, SSL_F_TLS_PARSE_STOC_RENEGOTIATE,
1249*e71b7053SJung-uk Kim                  SSL_R_RENEGOTIATION_ENCODING_ERR);
1250*e71b7053SJung-uk Kim         return 0;
1251*e71b7053SJung-uk Kim     }
1252*e71b7053SJung-uk Kim 
1253*e71b7053SJung-uk Kim     /* Check that the extension matches */
1254*e71b7053SJung-uk Kim     if (ilen != expected_len) {
1255*e71b7053SJung-uk Kim         SSLfatal(s, SSL_AD_ILLEGAL_PARAMETER, SSL_F_TLS_PARSE_STOC_RENEGOTIATE,
1256*e71b7053SJung-uk Kim                  SSL_R_RENEGOTIATION_MISMATCH);
1257*e71b7053SJung-uk Kim         return 0;
1258*e71b7053SJung-uk Kim     }
1259*e71b7053SJung-uk Kim 
1260*e71b7053SJung-uk Kim     if (!PACKET_get_bytes(pkt, &data, s->s3->previous_client_finished_len)
1261*e71b7053SJung-uk Kim         || memcmp(data, s->s3->previous_client_finished,
1262*e71b7053SJung-uk Kim                   s->s3->previous_client_finished_len) != 0) {
1263*e71b7053SJung-uk Kim         SSLfatal(s, SSL_AD_ILLEGAL_PARAMETER, SSL_F_TLS_PARSE_STOC_RENEGOTIATE,
1264*e71b7053SJung-uk Kim                  SSL_R_RENEGOTIATION_MISMATCH);
1265*e71b7053SJung-uk Kim         return 0;
1266*e71b7053SJung-uk Kim     }
1267*e71b7053SJung-uk Kim 
1268*e71b7053SJung-uk Kim     if (!PACKET_get_bytes(pkt, &data, s->s3->previous_server_finished_len)
1269*e71b7053SJung-uk Kim         || memcmp(data, s->s3->previous_server_finished,
1270*e71b7053SJung-uk Kim                   s->s3->previous_server_finished_len) != 0) {
1271*e71b7053SJung-uk Kim         SSLfatal(s, SSL_AD_ILLEGAL_PARAMETER, SSL_F_TLS_PARSE_STOC_RENEGOTIATE,
1272*e71b7053SJung-uk Kim                  SSL_R_RENEGOTIATION_MISMATCH);
1273*e71b7053SJung-uk Kim         return 0;
1274*e71b7053SJung-uk Kim     }
1275*e71b7053SJung-uk Kim     s->s3->send_connection_binding = 1;
1276*e71b7053SJung-uk Kim 
1277*e71b7053SJung-uk Kim     return 1;
1278*e71b7053SJung-uk Kim }
1279*e71b7053SJung-uk Kim 
1280*e71b7053SJung-uk Kim /* Parse the server's max fragment len extension packet */
1281*e71b7053SJung-uk Kim int tls_parse_stoc_maxfragmentlen(SSL *s, PACKET *pkt, unsigned int context,
1282*e71b7053SJung-uk Kim                                   X509 *x, size_t chainidx)
1283*e71b7053SJung-uk Kim {
1284*e71b7053SJung-uk Kim     unsigned int value;
1285*e71b7053SJung-uk Kim 
1286*e71b7053SJung-uk Kim     if (PACKET_remaining(pkt) != 1 || !PACKET_get_1(pkt, &value)) {
1287*e71b7053SJung-uk Kim         SSLfatal(s, SSL_AD_DECODE_ERROR, SSL_F_TLS_PARSE_STOC_MAXFRAGMENTLEN,
1288*e71b7053SJung-uk Kim                  SSL_R_BAD_EXTENSION);
1289*e71b7053SJung-uk Kim         return 0;
1290*e71b7053SJung-uk Kim     }
1291*e71b7053SJung-uk Kim 
1292*e71b7053SJung-uk Kim     /* |value| should contains a valid max-fragment-length code. */
1293*e71b7053SJung-uk Kim     if (!IS_MAX_FRAGMENT_LENGTH_EXT_VALID(value)) {
1294*e71b7053SJung-uk Kim         SSLfatal(s, SSL_AD_ILLEGAL_PARAMETER,
1295*e71b7053SJung-uk Kim                  SSL_F_TLS_PARSE_STOC_MAXFRAGMENTLEN,
1296*e71b7053SJung-uk Kim                  SSL_R_SSL3_EXT_INVALID_MAX_FRAGMENT_LENGTH);
1297*e71b7053SJung-uk Kim         return 0;
1298*e71b7053SJung-uk Kim     }
1299*e71b7053SJung-uk Kim 
1300*e71b7053SJung-uk Kim     /* Must be the same value as client-configured one who was sent to server */
1301*e71b7053SJung-uk Kim     /*-
1302*e71b7053SJung-uk Kim      * RFC 6066: if a client receives a maximum fragment length negotiation
1303*e71b7053SJung-uk Kim      * response that differs from the length it requested, ...
1304*e71b7053SJung-uk Kim      * It must abort with SSL_AD_ILLEGAL_PARAMETER alert
1305*e71b7053SJung-uk Kim      */
1306*e71b7053SJung-uk Kim     if (value != s->ext.max_fragment_len_mode) {
1307*e71b7053SJung-uk Kim         SSLfatal(s, SSL_AD_ILLEGAL_PARAMETER,
1308*e71b7053SJung-uk Kim                  SSL_F_TLS_PARSE_STOC_MAXFRAGMENTLEN,
1309*e71b7053SJung-uk Kim                  SSL_R_SSL3_EXT_INVALID_MAX_FRAGMENT_LENGTH);
1310*e71b7053SJung-uk Kim         return 0;
1311*e71b7053SJung-uk Kim     }
1312*e71b7053SJung-uk Kim 
1313*e71b7053SJung-uk Kim     /*
1314*e71b7053SJung-uk Kim      * Maximum Fragment Length Negotiation succeeded.
1315*e71b7053SJung-uk Kim      * The negotiated Maximum Fragment Length is binding now.
1316*e71b7053SJung-uk Kim      */
1317*e71b7053SJung-uk Kim     s->session->ext.max_fragment_len_mode = value;
1318*e71b7053SJung-uk Kim 
1319*e71b7053SJung-uk Kim     return 1;
1320*e71b7053SJung-uk Kim }
1321*e71b7053SJung-uk Kim 
1322*e71b7053SJung-uk Kim int tls_parse_stoc_server_name(SSL *s, PACKET *pkt, unsigned int context,
1323*e71b7053SJung-uk Kim                                X509 *x, size_t chainidx)
1324*e71b7053SJung-uk Kim {
1325*e71b7053SJung-uk Kim     if (s->ext.hostname == NULL) {
1326*e71b7053SJung-uk Kim         SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_TLS_PARSE_STOC_SERVER_NAME,
1327*e71b7053SJung-uk Kim                  ERR_R_INTERNAL_ERROR);
1328*e71b7053SJung-uk Kim         return 0;
1329*e71b7053SJung-uk Kim     }
1330*e71b7053SJung-uk Kim 
1331*e71b7053SJung-uk Kim     if (PACKET_remaining(pkt) > 0) {
1332*e71b7053SJung-uk Kim         SSLfatal(s, SSL_AD_DECODE_ERROR, SSL_F_TLS_PARSE_STOC_SERVER_NAME,
1333*e71b7053SJung-uk Kim                  SSL_R_BAD_EXTENSION);
1334*e71b7053SJung-uk Kim         return 0;
1335*e71b7053SJung-uk Kim     }
1336*e71b7053SJung-uk Kim 
1337*e71b7053SJung-uk Kim     if (!s->hit) {
1338*e71b7053SJung-uk Kim         if (s->session->ext.hostname != NULL) {
1339*e71b7053SJung-uk Kim             SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_TLS_PARSE_STOC_SERVER_NAME,
1340*e71b7053SJung-uk Kim                      ERR_R_INTERNAL_ERROR);
1341*e71b7053SJung-uk Kim             return 0;
1342*e71b7053SJung-uk Kim         }
1343*e71b7053SJung-uk Kim         s->session->ext.hostname = OPENSSL_strdup(s->ext.hostname);
1344*e71b7053SJung-uk Kim         if (s->session->ext.hostname == NULL) {
1345*e71b7053SJung-uk Kim             SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_TLS_PARSE_STOC_SERVER_NAME,
1346*e71b7053SJung-uk Kim                      ERR_R_INTERNAL_ERROR);
1347*e71b7053SJung-uk Kim             return 0;
1348*e71b7053SJung-uk Kim         }
1349*e71b7053SJung-uk Kim     }
1350*e71b7053SJung-uk Kim 
1351*e71b7053SJung-uk Kim     return 1;
1352*e71b7053SJung-uk Kim }
1353*e71b7053SJung-uk Kim 
1354*e71b7053SJung-uk Kim #ifndef OPENSSL_NO_EC
1355*e71b7053SJung-uk Kim int tls_parse_stoc_ec_pt_formats(SSL *s, PACKET *pkt, unsigned int context,
1356*e71b7053SJung-uk Kim                                  X509 *x, size_t chainidx)
1357*e71b7053SJung-uk Kim {
1358*e71b7053SJung-uk Kim     size_t ecpointformats_len;
1359*e71b7053SJung-uk Kim     PACKET ecptformatlist;
1360*e71b7053SJung-uk Kim 
1361*e71b7053SJung-uk Kim     if (!PACKET_as_length_prefixed_1(pkt, &ecptformatlist)) {
1362*e71b7053SJung-uk Kim         SSLfatal(s, SSL_AD_DECODE_ERROR, SSL_F_TLS_PARSE_STOC_EC_PT_FORMATS,
1363*e71b7053SJung-uk Kim                  SSL_R_BAD_EXTENSION);
1364*e71b7053SJung-uk Kim         return 0;
1365*e71b7053SJung-uk Kim     }
1366*e71b7053SJung-uk Kim     if (!s->hit) {
1367*e71b7053SJung-uk Kim         ecpointformats_len = PACKET_remaining(&ecptformatlist);
1368*e71b7053SJung-uk Kim         if (ecpointformats_len == 0) {
1369*e71b7053SJung-uk Kim             SSLfatal(s, SSL_AD_DECODE_ERROR,
1370*e71b7053SJung-uk Kim                      SSL_F_TLS_PARSE_STOC_EC_PT_FORMATS, SSL_R_BAD_LENGTH);
1371*e71b7053SJung-uk Kim             return 0;
1372*e71b7053SJung-uk Kim         }
1373*e71b7053SJung-uk Kim 
1374*e71b7053SJung-uk Kim         s->session->ext.ecpointformats_len = 0;
1375*e71b7053SJung-uk Kim         OPENSSL_free(s->session->ext.ecpointformats);
1376*e71b7053SJung-uk Kim         s->session->ext.ecpointformats = OPENSSL_malloc(ecpointformats_len);
1377*e71b7053SJung-uk Kim         if (s->session->ext.ecpointformats == NULL) {
1378*e71b7053SJung-uk Kim             SSLfatal(s, SSL_AD_INTERNAL_ERROR,
1379*e71b7053SJung-uk Kim                      SSL_F_TLS_PARSE_STOC_EC_PT_FORMATS, ERR_R_INTERNAL_ERROR);
1380*e71b7053SJung-uk Kim             return 0;
1381*e71b7053SJung-uk Kim         }
1382*e71b7053SJung-uk Kim 
1383*e71b7053SJung-uk Kim         s->session->ext.ecpointformats_len = ecpointformats_len;
1384*e71b7053SJung-uk Kim 
1385*e71b7053SJung-uk Kim         if (!PACKET_copy_bytes(&ecptformatlist,
1386*e71b7053SJung-uk Kim                                s->session->ext.ecpointformats,
1387*e71b7053SJung-uk Kim                                ecpointformats_len)) {
1388*e71b7053SJung-uk Kim             SSLfatal(s, SSL_AD_INTERNAL_ERROR,
1389*e71b7053SJung-uk Kim                      SSL_F_TLS_PARSE_STOC_EC_PT_FORMATS, ERR_R_INTERNAL_ERROR);
1390*e71b7053SJung-uk Kim             return 0;
1391*e71b7053SJung-uk Kim         }
1392*e71b7053SJung-uk Kim     }
1393*e71b7053SJung-uk Kim 
1394*e71b7053SJung-uk Kim     return 1;
1395*e71b7053SJung-uk Kim }
1396*e71b7053SJung-uk Kim #endif
1397*e71b7053SJung-uk Kim 
1398*e71b7053SJung-uk Kim int tls_parse_stoc_session_ticket(SSL *s, PACKET *pkt, unsigned int context,
1399*e71b7053SJung-uk Kim                                   X509 *x, size_t chainidx)
1400*e71b7053SJung-uk Kim {
1401*e71b7053SJung-uk Kim     if (s->ext.session_ticket_cb != NULL &&
1402*e71b7053SJung-uk Kim         !s->ext.session_ticket_cb(s, PACKET_data(pkt),
1403*e71b7053SJung-uk Kim                               PACKET_remaining(pkt),
1404*e71b7053SJung-uk Kim                               s->ext.session_ticket_cb_arg)) {
1405*e71b7053SJung-uk Kim         SSLfatal(s, SSL_AD_HANDSHAKE_FAILURE,
1406*e71b7053SJung-uk Kim                  SSL_F_TLS_PARSE_STOC_SESSION_TICKET, SSL_R_BAD_EXTENSION);
1407*e71b7053SJung-uk Kim         return 0;
1408*e71b7053SJung-uk Kim     }
1409*e71b7053SJung-uk Kim 
1410*e71b7053SJung-uk Kim     if (!tls_use_ticket(s)) {
1411*e71b7053SJung-uk Kim         SSLfatal(s, SSL_AD_UNSUPPORTED_EXTENSION,
1412*e71b7053SJung-uk Kim                  SSL_F_TLS_PARSE_STOC_SESSION_TICKET, SSL_R_BAD_EXTENSION);
1413*e71b7053SJung-uk Kim         return 0;
1414*e71b7053SJung-uk Kim     }
1415*e71b7053SJung-uk Kim     if (PACKET_remaining(pkt) > 0) {
1416*e71b7053SJung-uk Kim         SSLfatal(s, SSL_AD_DECODE_ERROR,
1417*e71b7053SJung-uk Kim                  SSL_F_TLS_PARSE_STOC_SESSION_TICKET, SSL_R_BAD_EXTENSION);
1418*e71b7053SJung-uk Kim         return 0;
1419*e71b7053SJung-uk Kim     }
1420*e71b7053SJung-uk Kim 
1421*e71b7053SJung-uk Kim     s->ext.ticket_expected = 1;
1422*e71b7053SJung-uk Kim 
1423*e71b7053SJung-uk Kim     return 1;
1424*e71b7053SJung-uk Kim }
1425*e71b7053SJung-uk Kim 
1426*e71b7053SJung-uk Kim #ifndef OPENSSL_NO_OCSP
1427*e71b7053SJung-uk Kim int tls_parse_stoc_status_request(SSL *s, PACKET *pkt, unsigned int context,
1428*e71b7053SJung-uk Kim                                   X509 *x, size_t chainidx)
1429*e71b7053SJung-uk Kim {
1430*e71b7053SJung-uk Kim     if (context == SSL_EXT_TLS1_3_CERTIFICATE_REQUEST) {
1431*e71b7053SJung-uk Kim         /* We ignore this if the server sends a CertificateRequest */
1432*e71b7053SJung-uk Kim         /* TODO(TLS1.3): Add support for this */
1433*e71b7053SJung-uk Kim         return 1;
1434*e71b7053SJung-uk Kim     }
1435*e71b7053SJung-uk Kim 
1436*e71b7053SJung-uk Kim     /*
1437*e71b7053SJung-uk Kim      * MUST only be sent if we've requested a status
1438*e71b7053SJung-uk Kim      * request message. In TLS <= 1.2 it must also be empty.
1439*e71b7053SJung-uk Kim      */
1440*e71b7053SJung-uk Kim     if (s->ext.status_type != TLSEXT_STATUSTYPE_ocsp) {
1441*e71b7053SJung-uk Kim         SSLfatal(s, SSL_AD_UNSUPPORTED_EXTENSION,
1442*e71b7053SJung-uk Kim                  SSL_F_TLS_PARSE_STOC_STATUS_REQUEST, SSL_R_BAD_EXTENSION);
1443*e71b7053SJung-uk Kim         return 0;
1444*e71b7053SJung-uk Kim     }
1445*e71b7053SJung-uk Kim     if (!SSL_IS_TLS13(s) && PACKET_remaining(pkt) > 0) {
1446*e71b7053SJung-uk Kim         SSLfatal(s, SSL_AD_DECODE_ERROR,
1447*e71b7053SJung-uk Kim                  SSL_F_TLS_PARSE_STOC_STATUS_REQUEST, SSL_R_BAD_EXTENSION);
1448*e71b7053SJung-uk Kim         return 0;
1449*e71b7053SJung-uk Kim     }
1450*e71b7053SJung-uk Kim 
1451*e71b7053SJung-uk Kim     if (SSL_IS_TLS13(s)) {
1452*e71b7053SJung-uk Kim         /* We only know how to handle this if it's for the first Certificate in
1453*e71b7053SJung-uk Kim          * the chain. We ignore any other responses.
1454*e71b7053SJung-uk Kim          */
1455*e71b7053SJung-uk Kim         if (chainidx != 0)
1456*e71b7053SJung-uk Kim             return 1;
1457*e71b7053SJung-uk Kim 
1458*e71b7053SJung-uk Kim         /* SSLfatal() already called */
1459*e71b7053SJung-uk Kim         return tls_process_cert_status_body(s, pkt);
1460*e71b7053SJung-uk Kim     }
1461*e71b7053SJung-uk Kim 
1462*e71b7053SJung-uk Kim     /* Set flag to expect CertificateStatus message */
1463*e71b7053SJung-uk Kim     s->ext.status_expected = 1;
1464*e71b7053SJung-uk Kim 
1465*e71b7053SJung-uk Kim     return 1;
1466*e71b7053SJung-uk Kim }
1467*e71b7053SJung-uk Kim #endif
1468*e71b7053SJung-uk Kim 
1469*e71b7053SJung-uk Kim 
1470*e71b7053SJung-uk Kim #ifndef OPENSSL_NO_CT
1471*e71b7053SJung-uk Kim int tls_parse_stoc_sct(SSL *s, PACKET *pkt, unsigned int context, X509 *x,
1472*e71b7053SJung-uk Kim                        size_t chainidx)
1473*e71b7053SJung-uk Kim {
1474*e71b7053SJung-uk Kim     if (context == SSL_EXT_TLS1_3_CERTIFICATE_REQUEST) {
1475*e71b7053SJung-uk Kim         /* We ignore this if the server sends it in a CertificateRequest */
1476*e71b7053SJung-uk Kim         /* TODO(TLS1.3): Add support for this */
1477*e71b7053SJung-uk Kim         return 1;
1478*e71b7053SJung-uk Kim     }
1479*e71b7053SJung-uk Kim 
1480*e71b7053SJung-uk Kim     /*
1481*e71b7053SJung-uk Kim      * Only take it if we asked for it - i.e if there is no CT validation
1482*e71b7053SJung-uk Kim      * callback set, then a custom extension MAY be processing it, so we
1483*e71b7053SJung-uk Kim      * need to let control continue to flow to that.
1484*e71b7053SJung-uk Kim      */
1485*e71b7053SJung-uk Kim     if (s->ct_validation_callback != NULL) {
1486*e71b7053SJung-uk Kim         size_t size = PACKET_remaining(pkt);
1487*e71b7053SJung-uk Kim 
1488*e71b7053SJung-uk Kim         /* Simply copy it off for later processing */
1489*e71b7053SJung-uk Kim         OPENSSL_free(s->ext.scts);
1490*e71b7053SJung-uk Kim         s->ext.scts = NULL;
1491*e71b7053SJung-uk Kim 
1492*e71b7053SJung-uk Kim         s->ext.scts_len = (uint16_t)size;
1493*e71b7053SJung-uk Kim         if (size > 0) {
1494*e71b7053SJung-uk Kim             s->ext.scts = OPENSSL_malloc(size);
1495*e71b7053SJung-uk Kim             if (s->ext.scts == NULL
1496*e71b7053SJung-uk Kim                     || !PACKET_copy_bytes(pkt, s->ext.scts, size)) {
1497*e71b7053SJung-uk Kim                 SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_TLS_PARSE_STOC_SCT,
1498*e71b7053SJung-uk Kim                          ERR_R_INTERNAL_ERROR);
1499*e71b7053SJung-uk Kim                 return 0;
1500*e71b7053SJung-uk Kim             }
1501*e71b7053SJung-uk Kim         }
1502*e71b7053SJung-uk Kim     } else {
1503*e71b7053SJung-uk Kim         ENDPOINT role = (context & SSL_EXT_TLS1_2_SERVER_HELLO) != 0
1504*e71b7053SJung-uk Kim                         ? ENDPOINT_CLIENT : ENDPOINT_BOTH;
1505*e71b7053SJung-uk Kim 
1506*e71b7053SJung-uk Kim         /*
1507*e71b7053SJung-uk Kim          * If we didn't ask for it then there must be a custom extension,
1508*e71b7053SJung-uk Kim          * otherwise this is unsolicited.
1509*e71b7053SJung-uk Kim          */
1510*e71b7053SJung-uk Kim         if (custom_ext_find(&s->cert->custext, role,
1511*e71b7053SJung-uk Kim                             TLSEXT_TYPE_signed_certificate_timestamp,
1512*e71b7053SJung-uk Kim                             NULL) == NULL) {
1513*e71b7053SJung-uk Kim             SSLfatal(s, TLS1_AD_UNSUPPORTED_EXTENSION, SSL_F_TLS_PARSE_STOC_SCT,
1514*e71b7053SJung-uk Kim                      SSL_R_BAD_EXTENSION);
1515*e71b7053SJung-uk Kim             return 0;
1516*e71b7053SJung-uk Kim         }
1517*e71b7053SJung-uk Kim 
1518*e71b7053SJung-uk Kim         if (!custom_ext_parse(s, context,
1519*e71b7053SJung-uk Kim                              TLSEXT_TYPE_signed_certificate_timestamp,
1520*e71b7053SJung-uk Kim                              PACKET_data(pkt), PACKET_remaining(pkt),
1521*e71b7053SJung-uk Kim                              x, chainidx)) {
1522*e71b7053SJung-uk Kim             /* SSLfatal already called */
1523*e71b7053SJung-uk Kim             return 0;
1524*e71b7053SJung-uk Kim         }
1525*e71b7053SJung-uk Kim     }
1526*e71b7053SJung-uk Kim 
1527*e71b7053SJung-uk Kim     return 1;
1528*e71b7053SJung-uk Kim }
1529*e71b7053SJung-uk Kim #endif
1530*e71b7053SJung-uk Kim 
1531*e71b7053SJung-uk Kim 
1532*e71b7053SJung-uk Kim #ifndef OPENSSL_NO_NEXTPROTONEG
1533*e71b7053SJung-uk Kim /*
1534*e71b7053SJung-uk Kim  * ssl_next_proto_validate validates a Next Protocol Negotiation block. No
1535*e71b7053SJung-uk Kim  * elements of zero length are allowed and the set of elements must exactly
1536*e71b7053SJung-uk Kim  * fill the length of the block. Returns 1 on success or 0 on failure.
1537*e71b7053SJung-uk Kim  */
1538*e71b7053SJung-uk Kim static int ssl_next_proto_validate(SSL *s, PACKET *pkt)
1539*e71b7053SJung-uk Kim {
1540*e71b7053SJung-uk Kim     PACKET tmp_protocol;
1541*e71b7053SJung-uk Kim 
1542*e71b7053SJung-uk Kim     while (PACKET_remaining(pkt)) {
1543*e71b7053SJung-uk Kim         if (!PACKET_get_length_prefixed_1(pkt, &tmp_protocol)
1544*e71b7053SJung-uk Kim             || PACKET_remaining(&tmp_protocol) == 0) {
1545*e71b7053SJung-uk Kim             SSLfatal(s, SSL_AD_DECODE_ERROR, SSL_F_SSL_NEXT_PROTO_VALIDATE,
1546*e71b7053SJung-uk Kim                      SSL_R_BAD_EXTENSION);
1547*e71b7053SJung-uk Kim             return 0;
1548*e71b7053SJung-uk Kim         }
1549*e71b7053SJung-uk Kim     }
1550*e71b7053SJung-uk Kim 
1551*e71b7053SJung-uk Kim     return 1;
1552*e71b7053SJung-uk Kim }
1553*e71b7053SJung-uk Kim 
1554*e71b7053SJung-uk Kim int tls_parse_stoc_npn(SSL *s, PACKET *pkt, unsigned int context, X509 *x,
1555*e71b7053SJung-uk Kim                        size_t chainidx)
1556*e71b7053SJung-uk Kim {
1557*e71b7053SJung-uk Kim     unsigned char *selected;
1558*e71b7053SJung-uk Kim     unsigned char selected_len;
1559*e71b7053SJung-uk Kim     PACKET tmppkt;
1560*e71b7053SJung-uk Kim 
1561*e71b7053SJung-uk Kim     /* Check if we are in a renegotiation. If so ignore this extension */
1562*e71b7053SJung-uk Kim     if (!SSL_IS_FIRST_HANDSHAKE(s))
1563*e71b7053SJung-uk Kim         return 1;
1564*e71b7053SJung-uk Kim 
1565*e71b7053SJung-uk Kim     /* We must have requested it. */
1566*e71b7053SJung-uk Kim     if (s->ctx->ext.npn_select_cb == NULL) {
1567*e71b7053SJung-uk Kim         SSLfatal(s, SSL_AD_UNSUPPORTED_EXTENSION, SSL_F_TLS_PARSE_STOC_NPN,
1568*e71b7053SJung-uk Kim                  SSL_R_BAD_EXTENSION);
1569*e71b7053SJung-uk Kim         return 0;
1570*e71b7053SJung-uk Kim     }
1571*e71b7053SJung-uk Kim 
1572*e71b7053SJung-uk Kim     /* The data must be valid */
1573*e71b7053SJung-uk Kim     tmppkt = *pkt;
1574*e71b7053SJung-uk Kim     if (!ssl_next_proto_validate(s, &tmppkt)) {
1575*e71b7053SJung-uk Kim         /* SSLfatal() already called */
1576*e71b7053SJung-uk Kim         return 0;
1577*e71b7053SJung-uk Kim     }
1578*e71b7053SJung-uk Kim     if (s->ctx->ext.npn_select_cb(s, &selected, &selected_len,
1579*e71b7053SJung-uk Kim                                   PACKET_data(pkt),
1580*e71b7053SJung-uk Kim                                   PACKET_remaining(pkt),
1581*e71b7053SJung-uk Kim                                   s->ctx->ext.npn_select_cb_arg) !=
1582*e71b7053SJung-uk Kim              SSL_TLSEXT_ERR_OK) {
1583*e71b7053SJung-uk Kim         SSLfatal(s, SSL_AD_HANDSHAKE_FAILURE, SSL_F_TLS_PARSE_STOC_NPN,
1584*e71b7053SJung-uk Kim                  SSL_R_BAD_EXTENSION);
1585*e71b7053SJung-uk Kim         return 0;
1586*e71b7053SJung-uk Kim     }
1587*e71b7053SJung-uk Kim 
1588*e71b7053SJung-uk Kim     /*
1589*e71b7053SJung-uk Kim      * Could be non-NULL if server has sent multiple NPN extensions in
1590*e71b7053SJung-uk Kim      * a single Serverhello
1591*e71b7053SJung-uk Kim      */
1592*e71b7053SJung-uk Kim     OPENSSL_free(s->ext.npn);
1593*e71b7053SJung-uk Kim     s->ext.npn = OPENSSL_malloc(selected_len);
1594*e71b7053SJung-uk Kim     if (s->ext.npn == NULL) {
1595*e71b7053SJung-uk Kim         SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_TLS_PARSE_STOC_NPN,
1596*e71b7053SJung-uk Kim                  ERR_R_INTERNAL_ERROR);
1597*e71b7053SJung-uk Kim         return 0;
1598*e71b7053SJung-uk Kim     }
1599*e71b7053SJung-uk Kim 
1600*e71b7053SJung-uk Kim     memcpy(s->ext.npn, selected, selected_len);
1601*e71b7053SJung-uk Kim     s->ext.npn_len = selected_len;
1602*e71b7053SJung-uk Kim     s->s3->npn_seen = 1;
1603*e71b7053SJung-uk Kim 
1604*e71b7053SJung-uk Kim     return 1;
1605*e71b7053SJung-uk Kim }
1606*e71b7053SJung-uk Kim #endif
1607*e71b7053SJung-uk Kim 
1608*e71b7053SJung-uk Kim int tls_parse_stoc_alpn(SSL *s, PACKET *pkt, unsigned int context, X509 *x,
1609*e71b7053SJung-uk Kim                         size_t chainidx)
1610*e71b7053SJung-uk Kim {
1611*e71b7053SJung-uk Kim     size_t len;
1612*e71b7053SJung-uk Kim 
1613*e71b7053SJung-uk Kim     /* We must have requested it. */
1614*e71b7053SJung-uk Kim     if (!s->s3->alpn_sent) {
1615*e71b7053SJung-uk Kim         SSLfatal(s, SSL_AD_UNSUPPORTED_EXTENSION, SSL_F_TLS_PARSE_STOC_ALPN,
1616*e71b7053SJung-uk Kim                  SSL_R_BAD_EXTENSION);
1617*e71b7053SJung-uk Kim         return 0;
1618*e71b7053SJung-uk Kim     }
1619*e71b7053SJung-uk Kim     /*-
1620*e71b7053SJung-uk Kim      * The extension data consists of:
1621*e71b7053SJung-uk Kim      *   uint16 list_length
1622*e71b7053SJung-uk Kim      *   uint8 proto_length;
1623*e71b7053SJung-uk Kim      *   uint8 proto[proto_length];
1624*e71b7053SJung-uk Kim      */
1625*e71b7053SJung-uk Kim     if (!PACKET_get_net_2_len(pkt, &len)
1626*e71b7053SJung-uk Kim         || PACKET_remaining(pkt) != len || !PACKET_get_1_len(pkt, &len)
1627*e71b7053SJung-uk Kim         || PACKET_remaining(pkt) != len) {
1628*e71b7053SJung-uk Kim         SSLfatal(s, SSL_AD_DECODE_ERROR, SSL_F_TLS_PARSE_STOC_ALPN,
1629*e71b7053SJung-uk Kim                  SSL_R_BAD_EXTENSION);
1630*e71b7053SJung-uk Kim         return 0;
1631*e71b7053SJung-uk Kim     }
1632*e71b7053SJung-uk Kim     OPENSSL_free(s->s3->alpn_selected);
1633*e71b7053SJung-uk Kim     s->s3->alpn_selected = OPENSSL_malloc(len);
1634*e71b7053SJung-uk Kim     if (s->s3->alpn_selected == NULL) {
1635*e71b7053SJung-uk Kim         SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_TLS_PARSE_STOC_ALPN,
1636*e71b7053SJung-uk Kim                  ERR_R_INTERNAL_ERROR);
1637*e71b7053SJung-uk Kim         return 0;
1638*e71b7053SJung-uk Kim     }
1639*e71b7053SJung-uk Kim     if (!PACKET_copy_bytes(pkt, s->s3->alpn_selected, len)) {
1640*e71b7053SJung-uk Kim         SSLfatal(s, SSL_AD_DECODE_ERROR, SSL_F_TLS_PARSE_STOC_ALPN,
1641*e71b7053SJung-uk Kim                  SSL_R_BAD_EXTENSION);
1642*e71b7053SJung-uk Kim         return 0;
1643*e71b7053SJung-uk Kim     }
1644*e71b7053SJung-uk Kim     s->s3->alpn_selected_len = len;
1645*e71b7053SJung-uk Kim 
1646*e71b7053SJung-uk Kim     if (s->session->ext.alpn_selected == NULL
1647*e71b7053SJung-uk Kim             || s->session->ext.alpn_selected_len != len
1648*e71b7053SJung-uk Kim             || memcmp(s->session->ext.alpn_selected, s->s3->alpn_selected, len)
1649*e71b7053SJung-uk Kim                != 0) {
1650*e71b7053SJung-uk Kim         /* ALPN not consistent with the old session so cannot use early_data */
1651*e71b7053SJung-uk Kim         s->ext.early_data_ok = 0;
1652*e71b7053SJung-uk Kim     }
1653*e71b7053SJung-uk Kim     if (!s->hit) {
1654*e71b7053SJung-uk Kim         /*
1655*e71b7053SJung-uk Kim          * This is a new session and so alpn_selected should have been
1656*e71b7053SJung-uk Kim          * initialised to NULL. We should update it with the selected ALPN.
1657*e71b7053SJung-uk Kim          */
1658*e71b7053SJung-uk Kim         if (!ossl_assert(s->session->ext.alpn_selected == NULL)) {
1659*e71b7053SJung-uk Kim             SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_TLS_PARSE_STOC_ALPN,
1660*e71b7053SJung-uk Kim                      ERR_R_INTERNAL_ERROR);
1661*e71b7053SJung-uk Kim             return 0;
1662*e71b7053SJung-uk Kim         }
1663*e71b7053SJung-uk Kim         s->session->ext.alpn_selected =
1664*e71b7053SJung-uk Kim             OPENSSL_memdup(s->s3->alpn_selected, s->s3->alpn_selected_len);
1665*e71b7053SJung-uk Kim         if (s->session->ext.alpn_selected == NULL) {
1666*e71b7053SJung-uk Kim             SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_TLS_PARSE_STOC_ALPN,
1667*e71b7053SJung-uk Kim                      ERR_R_INTERNAL_ERROR);
1668*e71b7053SJung-uk Kim             return 0;
1669*e71b7053SJung-uk Kim         }
1670*e71b7053SJung-uk Kim         s->session->ext.alpn_selected_len = s->s3->alpn_selected_len;
1671*e71b7053SJung-uk Kim     }
1672*e71b7053SJung-uk Kim 
1673*e71b7053SJung-uk Kim     return 1;
1674*e71b7053SJung-uk Kim }
1675*e71b7053SJung-uk Kim 
1676*e71b7053SJung-uk Kim #ifndef OPENSSL_NO_SRTP
1677*e71b7053SJung-uk Kim int tls_parse_stoc_use_srtp(SSL *s, PACKET *pkt, unsigned int context, X509 *x,
1678*e71b7053SJung-uk Kim                             size_t chainidx)
1679*e71b7053SJung-uk Kim {
1680*e71b7053SJung-uk Kim     unsigned int id, ct, mki;
1681*e71b7053SJung-uk Kim     int i;
1682*e71b7053SJung-uk Kim     STACK_OF(SRTP_PROTECTION_PROFILE) *clnt;
1683*e71b7053SJung-uk Kim     SRTP_PROTECTION_PROFILE *prof;
1684*e71b7053SJung-uk Kim 
1685*e71b7053SJung-uk Kim     if (!PACKET_get_net_2(pkt, &ct) || ct != 2
1686*e71b7053SJung-uk Kim             || !PACKET_get_net_2(pkt, &id)
1687*e71b7053SJung-uk Kim             || !PACKET_get_1(pkt, &mki)
1688*e71b7053SJung-uk Kim             || PACKET_remaining(pkt) != 0) {
1689*e71b7053SJung-uk Kim         SSLfatal(s, SSL_AD_DECODE_ERROR, SSL_F_TLS_PARSE_STOC_USE_SRTP,
1690*e71b7053SJung-uk Kim                  SSL_R_BAD_SRTP_PROTECTION_PROFILE_LIST);
1691*e71b7053SJung-uk Kim         return 0;
1692*e71b7053SJung-uk Kim     }
1693*e71b7053SJung-uk Kim 
1694*e71b7053SJung-uk Kim     if (mki != 0) {
1695*e71b7053SJung-uk Kim         /* Must be no MKI, since we never offer one */
1696*e71b7053SJung-uk Kim         SSLfatal(s, SSL_AD_ILLEGAL_PARAMETER, SSL_F_TLS_PARSE_STOC_USE_SRTP,
1697*e71b7053SJung-uk Kim                  SSL_R_BAD_SRTP_MKI_VALUE);
1698*e71b7053SJung-uk Kim         return 0;
1699*e71b7053SJung-uk Kim     }
1700*e71b7053SJung-uk Kim 
1701*e71b7053SJung-uk Kim     /* Throw an error if the server gave us an unsolicited extension */
1702*e71b7053SJung-uk Kim     clnt = SSL_get_srtp_profiles(s);
1703*e71b7053SJung-uk Kim     if (clnt == NULL) {
1704*e71b7053SJung-uk Kim         SSLfatal(s, SSL_AD_DECODE_ERROR, SSL_F_TLS_PARSE_STOC_USE_SRTP,
1705*e71b7053SJung-uk Kim                  SSL_R_NO_SRTP_PROFILES);
1706*e71b7053SJung-uk Kim         return 0;
1707*e71b7053SJung-uk Kim     }
1708*e71b7053SJung-uk Kim 
1709*e71b7053SJung-uk Kim     /*
1710*e71b7053SJung-uk Kim      * Check to see if the server gave us something we support (and
1711*e71b7053SJung-uk Kim      * presumably offered)
1712*e71b7053SJung-uk Kim      */
1713*e71b7053SJung-uk Kim     for (i = 0; i < sk_SRTP_PROTECTION_PROFILE_num(clnt); i++) {
1714*e71b7053SJung-uk Kim         prof = sk_SRTP_PROTECTION_PROFILE_value(clnt, i);
1715*e71b7053SJung-uk Kim 
1716*e71b7053SJung-uk Kim         if (prof->id == id) {
1717*e71b7053SJung-uk Kim             s->srtp_profile = prof;
1718*e71b7053SJung-uk Kim             return 1;
1719*e71b7053SJung-uk Kim         }
1720*e71b7053SJung-uk Kim     }
1721*e71b7053SJung-uk Kim 
1722*e71b7053SJung-uk Kim     SSLfatal(s, SSL_AD_DECODE_ERROR, SSL_F_TLS_PARSE_STOC_USE_SRTP,
1723*e71b7053SJung-uk Kim              SSL_R_BAD_SRTP_PROTECTION_PROFILE_LIST);
1724*e71b7053SJung-uk Kim     return 0;
1725*e71b7053SJung-uk Kim }
1726*e71b7053SJung-uk Kim #endif
1727*e71b7053SJung-uk Kim 
1728*e71b7053SJung-uk Kim int tls_parse_stoc_etm(SSL *s, PACKET *pkt, unsigned int context, X509 *x,
1729*e71b7053SJung-uk Kim                        size_t chainidx)
1730*e71b7053SJung-uk Kim {
1731*e71b7053SJung-uk Kim     /* Ignore if inappropriate ciphersuite */
1732*e71b7053SJung-uk Kim     if (!(s->options & SSL_OP_NO_ENCRYPT_THEN_MAC)
1733*e71b7053SJung-uk Kim             && s->s3->tmp.new_cipher->algorithm_mac != SSL_AEAD
1734*e71b7053SJung-uk Kim             && s->s3->tmp.new_cipher->algorithm_enc != SSL_RC4)
1735*e71b7053SJung-uk Kim         s->ext.use_etm = 1;
1736*e71b7053SJung-uk Kim 
1737*e71b7053SJung-uk Kim     return 1;
1738*e71b7053SJung-uk Kim }
1739*e71b7053SJung-uk Kim 
1740*e71b7053SJung-uk Kim int tls_parse_stoc_ems(SSL *s, PACKET *pkt, unsigned int context, X509 *x,
1741*e71b7053SJung-uk Kim                        size_t chainidx)
1742*e71b7053SJung-uk Kim {
1743*e71b7053SJung-uk Kim     s->s3->flags |= TLS1_FLAGS_RECEIVED_EXTMS;
1744*e71b7053SJung-uk Kim     if (!s->hit)
1745*e71b7053SJung-uk Kim         s->session->flags |= SSL_SESS_FLAG_EXTMS;
1746*e71b7053SJung-uk Kim 
1747*e71b7053SJung-uk Kim     return 1;
1748*e71b7053SJung-uk Kim }
1749*e71b7053SJung-uk Kim 
1750*e71b7053SJung-uk Kim int tls_parse_stoc_supported_versions(SSL *s, PACKET *pkt, unsigned int context,
1751*e71b7053SJung-uk Kim                                       X509 *x, size_t chainidx)
1752*e71b7053SJung-uk Kim {
1753*e71b7053SJung-uk Kim     unsigned int version;
1754*e71b7053SJung-uk Kim 
1755*e71b7053SJung-uk Kim     if (!PACKET_get_net_2(pkt, &version)
1756*e71b7053SJung-uk Kim             || PACKET_remaining(pkt) != 0) {
1757*e71b7053SJung-uk Kim         SSLfatal(s, SSL_AD_DECODE_ERROR,
1758*e71b7053SJung-uk Kim                  SSL_F_TLS_PARSE_STOC_SUPPORTED_VERSIONS,
1759*e71b7053SJung-uk Kim                  SSL_R_LENGTH_MISMATCH);
1760*e71b7053SJung-uk Kim         return 0;
1761*e71b7053SJung-uk Kim     }
1762*e71b7053SJung-uk Kim 
1763*e71b7053SJung-uk Kim     /*
1764*e71b7053SJung-uk Kim      * The only protocol version we support which is valid in this extension in
1765*e71b7053SJung-uk Kim      * a ServerHello is TLSv1.3 therefore we shouldn't be getting anything else.
1766*e71b7053SJung-uk Kim      */
1767*e71b7053SJung-uk Kim     if (version != TLS1_3_VERSION) {
1768*e71b7053SJung-uk Kim         SSLfatal(s, SSL_AD_ILLEGAL_PARAMETER,
1769*e71b7053SJung-uk Kim                  SSL_F_TLS_PARSE_STOC_SUPPORTED_VERSIONS,
1770*e71b7053SJung-uk Kim                  SSL_R_BAD_PROTOCOL_VERSION_NUMBER);
1771*e71b7053SJung-uk Kim         return 0;
1772*e71b7053SJung-uk Kim     }
1773*e71b7053SJung-uk Kim 
1774*e71b7053SJung-uk Kim     /* We ignore this extension for HRRs except to sanity check it */
1775*e71b7053SJung-uk Kim     if (context == SSL_EXT_TLS1_3_HELLO_RETRY_REQUEST)
1776*e71b7053SJung-uk Kim         return 1;
1777*e71b7053SJung-uk Kim 
1778*e71b7053SJung-uk Kim     /* We just set it here. We validate it in ssl_choose_client_version */
1779*e71b7053SJung-uk Kim     s->version = version;
1780*e71b7053SJung-uk Kim 
1781*e71b7053SJung-uk Kim     return 1;
1782*e71b7053SJung-uk Kim }
1783*e71b7053SJung-uk Kim 
1784*e71b7053SJung-uk Kim int tls_parse_stoc_key_share(SSL *s, PACKET *pkt, unsigned int context, X509 *x,
1785*e71b7053SJung-uk Kim                              size_t chainidx)
1786*e71b7053SJung-uk Kim {
1787*e71b7053SJung-uk Kim #ifndef OPENSSL_NO_TLS1_3
1788*e71b7053SJung-uk Kim     unsigned int group_id;
1789*e71b7053SJung-uk Kim     PACKET encoded_pt;
1790*e71b7053SJung-uk Kim     EVP_PKEY *ckey = s->s3->tmp.pkey, *skey = NULL;
1791*e71b7053SJung-uk Kim 
1792*e71b7053SJung-uk Kim     /* Sanity check */
1793*e71b7053SJung-uk Kim     if (ckey == NULL || s->s3->peer_tmp != NULL) {
1794*e71b7053SJung-uk Kim         SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_TLS_PARSE_STOC_KEY_SHARE,
1795*e71b7053SJung-uk Kim                  ERR_R_INTERNAL_ERROR);
1796*e71b7053SJung-uk Kim         return 0;
1797*e71b7053SJung-uk Kim     }
1798*e71b7053SJung-uk Kim 
1799*e71b7053SJung-uk Kim     if (!PACKET_get_net_2(pkt, &group_id)) {
1800*e71b7053SJung-uk Kim         SSLfatal(s, SSL_AD_DECODE_ERROR, SSL_F_TLS_PARSE_STOC_KEY_SHARE,
1801*e71b7053SJung-uk Kim                  SSL_R_LENGTH_MISMATCH);
1802*e71b7053SJung-uk Kim         return 0;
1803*e71b7053SJung-uk Kim     }
1804*e71b7053SJung-uk Kim 
1805*e71b7053SJung-uk Kim     if ((context & SSL_EXT_TLS1_3_HELLO_RETRY_REQUEST) != 0) {
1806*e71b7053SJung-uk Kim         const uint16_t *pgroups = NULL;
1807*e71b7053SJung-uk Kim         size_t i, num_groups;
1808*e71b7053SJung-uk Kim 
1809*e71b7053SJung-uk Kim         if (PACKET_remaining(pkt) != 0) {
1810*e71b7053SJung-uk Kim             SSLfatal(s, SSL_AD_DECODE_ERROR, SSL_F_TLS_PARSE_STOC_KEY_SHARE,
1811*e71b7053SJung-uk Kim                      SSL_R_LENGTH_MISMATCH);
1812*e71b7053SJung-uk Kim             return 0;
1813*e71b7053SJung-uk Kim         }
1814*e71b7053SJung-uk Kim 
1815*e71b7053SJung-uk Kim         /*
1816*e71b7053SJung-uk Kim          * It is an error if the HelloRetryRequest wants a key_share that we
1817*e71b7053SJung-uk Kim          * already sent in the first ClientHello
1818*e71b7053SJung-uk Kim          */
1819*e71b7053SJung-uk Kim         if (group_id == s->s3->group_id) {
1820*e71b7053SJung-uk Kim             SSLfatal(s, SSL_AD_ILLEGAL_PARAMETER,
1821*e71b7053SJung-uk Kim                      SSL_F_TLS_PARSE_STOC_KEY_SHARE, SSL_R_BAD_KEY_SHARE);
1822*e71b7053SJung-uk Kim             return 0;
1823*e71b7053SJung-uk Kim         }
1824*e71b7053SJung-uk Kim 
1825*e71b7053SJung-uk Kim         /* Validate the selected group is one we support */
1826*e71b7053SJung-uk Kim         tls1_get_supported_groups(s, &pgroups, &num_groups);
1827*e71b7053SJung-uk Kim         for (i = 0; i < num_groups; i++) {
1828*e71b7053SJung-uk Kim             if (group_id == pgroups[i])
1829*e71b7053SJung-uk Kim                 break;
1830*e71b7053SJung-uk Kim         }
1831*e71b7053SJung-uk Kim         if (i >= num_groups
1832*e71b7053SJung-uk Kim                 || !tls_curve_allowed(s, group_id, SSL_SECOP_CURVE_SUPPORTED)) {
1833*e71b7053SJung-uk Kim             SSLfatal(s, SSL_AD_ILLEGAL_PARAMETER,
1834*e71b7053SJung-uk Kim                      SSL_F_TLS_PARSE_STOC_KEY_SHARE, SSL_R_BAD_KEY_SHARE);
1835*e71b7053SJung-uk Kim             return 0;
1836*e71b7053SJung-uk Kim         }
1837*e71b7053SJung-uk Kim 
1838*e71b7053SJung-uk Kim         s->s3->group_id = group_id;
1839*e71b7053SJung-uk Kim         EVP_PKEY_free(s->s3->tmp.pkey);
1840*e71b7053SJung-uk Kim         s->s3->tmp.pkey = NULL;
1841*e71b7053SJung-uk Kim         return 1;
1842*e71b7053SJung-uk Kim     }
1843*e71b7053SJung-uk Kim 
1844*e71b7053SJung-uk Kim     if (group_id != s->s3->group_id) {
1845*e71b7053SJung-uk Kim         /*
1846*e71b7053SJung-uk Kim          * This isn't for the group that we sent in the original
1847*e71b7053SJung-uk Kim          * key_share!
1848*e71b7053SJung-uk Kim          */
1849*e71b7053SJung-uk Kim         SSLfatal(s, SSL_AD_ILLEGAL_PARAMETER, SSL_F_TLS_PARSE_STOC_KEY_SHARE,
1850*e71b7053SJung-uk Kim                  SSL_R_BAD_KEY_SHARE);
1851*e71b7053SJung-uk Kim         return 0;
1852*e71b7053SJung-uk Kim     }
1853*e71b7053SJung-uk Kim 
1854*e71b7053SJung-uk Kim     if (!PACKET_as_length_prefixed_2(pkt, &encoded_pt)
1855*e71b7053SJung-uk Kim             || PACKET_remaining(&encoded_pt) == 0) {
1856*e71b7053SJung-uk Kim         SSLfatal(s, SSL_AD_DECODE_ERROR, SSL_F_TLS_PARSE_STOC_KEY_SHARE,
1857*e71b7053SJung-uk Kim                  SSL_R_LENGTH_MISMATCH);
1858*e71b7053SJung-uk Kim         return 0;
1859*e71b7053SJung-uk Kim     }
1860*e71b7053SJung-uk Kim 
1861*e71b7053SJung-uk Kim     skey = ssl_generate_pkey(ckey);
1862*e71b7053SJung-uk Kim     if (skey == NULL) {
1863*e71b7053SJung-uk Kim         SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_TLS_PARSE_STOC_KEY_SHARE,
1864*e71b7053SJung-uk Kim                  ERR_R_MALLOC_FAILURE);
1865*e71b7053SJung-uk Kim         return 0;
1866*e71b7053SJung-uk Kim     }
1867*e71b7053SJung-uk Kim     if (!EVP_PKEY_set1_tls_encodedpoint(skey, PACKET_data(&encoded_pt),
1868*e71b7053SJung-uk Kim                                         PACKET_remaining(&encoded_pt))) {
1869*e71b7053SJung-uk Kim         SSLfatal(s, SSL_AD_ILLEGAL_PARAMETER, SSL_F_TLS_PARSE_STOC_KEY_SHARE,
1870*e71b7053SJung-uk Kim                  SSL_R_BAD_ECPOINT);
1871*e71b7053SJung-uk Kim         EVP_PKEY_free(skey);
1872*e71b7053SJung-uk Kim         return 0;
1873*e71b7053SJung-uk Kim     }
1874*e71b7053SJung-uk Kim 
1875*e71b7053SJung-uk Kim     if (ssl_derive(s, ckey, skey, 1) == 0) {
1876*e71b7053SJung-uk Kim         /* SSLfatal() already called */
1877*e71b7053SJung-uk Kim         EVP_PKEY_free(skey);
1878*e71b7053SJung-uk Kim         return 0;
1879*e71b7053SJung-uk Kim     }
1880*e71b7053SJung-uk Kim     s->s3->peer_tmp = skey;
1881*e71b7053SJung-uk Kim #endif
1882*e71b7053SJung-uk Kim 
1883*e71b7053SJung-uk Kim     return 1;
1884*e71b7053SJung-uk Kim }
1885*e71b7053SJung-uk Kim 
1886*e71b7053SJung-uk Kim int tls_parse_stoc_cookie(SSL *s, PACKET *pkt, unsigned int context, X509 *x,
1887*e71b7053SJung-uk Kim                        size_t chainidx)
1888*e71b7053SJung-uk Kim {
1889*e71b7053SJung-uk Kim     PACKET cookie;
1890*e71b7053SJung-uk Kim 
1891*e71b7053SJung-uk Kim     if (!PACKET_as_length_prefixed_2(pkt, &cookie)
1892*e71b7053SJung-uk Kim             || !PACKET_memdup(&cookie, &s->ext.tls13_cookie,
1893*e71b7053SJung-uk Kim                               &s->ext.tls13_cookie_len)) {
1894*e71b7053SJung-uk Kim         SSLfatal(s, SSL_AD_DECODE_ERROR, SSL_F_TLS_PARSE_STOC_COOKIE,
1895*e71b7053SJung-uk Kim                  SSL_R_LENGTH_MISMATCH);
1896*e71b7053SJung-uk Kim         return 0;
1897*e71b7053SJung-uk Kim     }
1898*e71b7053SJung-uk Kim 
1899*e71b7053SJung-uk Kim     return 1;
1900*e71b7053SJung-uk Kim }
1901*e71b7053SJung-uk Kim 
1902*e71b7053SJung-uk Kim int tls_parse_stoc_early_data(SSL *s, PACKET *pkt, unsigned int context,
1903*e71b7053SJung-uk Kim                               X509 *x, size_t chainidx)
1904*e71b7053SJung-uk Kim {
1905*e71b7053SJung-uk Kim     if (context == SSL_EXT_TLS1_3_NEW_SESSION_TICKET) {
1906*e71b7053SJung-uk Kim         unsigned long max_early_data;
1907*e71b7053SJung-uk Kim 
1908*e71b7053SJung-uk Kim         if (!PACKET_get_net_4(pkt, &max_early_data)
1909*e71b7053SJung-uk Kim                 || PACKET_remaining(pkt) != 0) {
1910*e71b7053SJung-uk Kim             SSLfatal(s, SSL_AD_DECODE_ERROR, SSL_F_TLS_PARSE_STOC_EARLY_DATA,
1911*e71b7053SJung-uk Kim                      SSL_R_INVALID_MAX_EARLY_DATA);
1912*e71b7053SJung-uk Kim             return 0;
1913*e71b7053SJung-uk Kim         }
1914*e71b7053SJung-uk Kim 
1915*e71b7053SJung-uk Kim         s->session->ext.max_early_data = max_early_data;
1916*e71b7053SJung-uk Kim 
1917*e71b7053SJung-uk Kim         return 1;
1918*e71b7053SJung-uk Kim     }
1919*e71b7053SJung-uk Kim 
1920*e71b7053SJung-uk Kim     if (PACKET_remaining(pkt) != 0) {
1921*e71b7053SJung-uk Kim         SSLfatal(s, SSL_AD_DECODE_ERROR, SSL_F_TLS_PARSE_STOC_EARLY_DATA,
1922*e71b7053SJung-uk Kim                  SSL_R_BAD_EXTENSION);
1923*e71b7053SJung-uk Kim         return 0;
1924*e71b7053SJung-uk Kim     }
1925*e71b7053SJung-uk Kim 
1926*e71b7053SJung-uk Kim     if (!s->ext.early_data_ok
1927*e71b7053SJung-uk Kim             || !s->hit
1928*e71b7053SJung-uk Kim             || s->session->ext.tick_identity != 0) {
1929*e71b7053SJung-uk Kim         /*
1930*e71b7053SJung-uk Kim          * If we get here then we didn't send early data, or we didn't resume
1931*e71b7053SJung-uk Kim          * using the first identity, or the SNI/ALPN is not consistent so the
1932*e71b7053SJung-uk Kim          * server should not be accepting it.
1933*e71b7053SJung-uk Kim          */
1934*e71b7053SJung-uk Kim         SSLfatal(s, SSL_AD_ILLEGAL_PARAMETER, SSL_F_TLS_PARSE_STOC_EARLY_DATA,
1935*e71b7053SJung-uk Kim                  SSL_R_BAD_EXTENSION);
1936*e71b7053SJung-uk Kim         return 0;
1937*e71b7053SJung-uk Kim     }
1938*e71b7053SJung-uk Kim 
1939*e71b7053SJung-uk Kim     s->ext.early_data = SSL_EARLY_DATA_ACCEPTED;
1940*e71b7053SJung-uk Kim 
1941*e71b7053SJung-uk Kim     return 1;
1942*e71b7053SJung-uk Kim }
1943*e71b7053SJung-uk Kim 
1944*e71b7053SJung-uk Kim int tls_parse_stoc_psk(SSL *s, PACKET *pkt, unsigned int context, X509 *x,
1945*e71b7053SJung-uk Kim                        size_t chainidx)
1946*e71b7053SJung-uk Kim {
1947*e71b7053SJung-uk Kim #ifndef OPENSSL_NO_TLS1_3
1948*e71b7053SJung-uk Kim     unsigned int identity;
1949*e71b7053SJung-uk Kim 
1950*e71b7053SJung-uk Kim     if (!PACKET_get_net_2(pkt, &identity) || PACKET_remaining(pkt) != 0) {
1951*e71b7053SJung-uk Kim         SSLfatal(s, SSL_AD_DECODE_ERROR, SSL_F_TLS_PARSE_STOC_PSK,
1952*e71b7053SJung-uk Kim                  SSL_R_LENGTH_MISMATCH);
1953*e71b7053SJung-uk Kim         return 0;
1954*e71b7053SJung-uk Kim     }
1955*e71b7053SJung-uk Kim 
1956*e71b7053SJung-uk Kim     if (s->session->ext.tick_identity == (int)identity) {
1957*e71b7053SJung-uk Kim         s->hit = 1;
1958*e71b7053SJung-uk Kim         SSL_SESSION_free(s->psksession);
1959*e71b7053SJung-uk Kim         s->psksession = NULL;
1960*e71b7053SJung-uk Kim         return 1;
1961*e71b7053SJung-uk Kim     }
1962*e71b7053SJung-uk Kim 
1963*e71b7053SJung-uk Kim     if (s->psksession == NULL
1964*e71b7053SJung-uk Kim             || s->psksession->ext.tick_identity != (int)identity) {
1965*e71b7053SJung-uk Kim         SSLfatal(s, SSL_AD_ILLEGAL_PARAMETER, SSL_F_TLS_PARSE_STOC_PSK,
1966*e71b7053SJung-uk Kim                  SSL_R_BAD_PSK_IDENTITY);
1967*e71b7053SJung-uk Kim         return 0;
1968*e71b7053SJung-uk Kim     }
1969*e71b7053SJung-uk Kim 
1970*e71b7053SJung-uk Kim     /*
1971*e71b7053SJung-uk Kim      * If we used the external PSK for sending early_data then s->early_secret
1972*e71b7053SJung-uk Kim      * is already set up, so don't overwrite it. Otherwise we copy the
1973*e71b7053SJung-uk Kim      * early_secret across that we generated earlier.
1974*e71b7053SJung-uk Kim      */
1975*e71b7053SJung-uk Kim     if ((s->early_data_state != SSL_EARLY_DATA_WRITE_RETRY
1976*e71b7053SJung-uk Kim                 && s->early_data_state != SSL_EARLY_DATA_FINISHED_WRITING)
1977*e71b7053SJung-uk Kim             || s->session->ext.max_early_data > 0
1978*e71b7053SJung-uk Kim             || s->psksession->ext.max_early_data == 0)
1979*e71b7053SJung-uk Kim         memcpy(s->early_secret, s->psksession->early_secret, EVP_MAX_MD_SIZE);
1980*e71b7053SJung-uk Kim 
1981*e71b7053SJung-uk Kim     SSL_SESSION_free(s->session);
1982*e71b7053SJung-uk Kim     s->session = s->psksession;
1983*e71b7053SJung-uk Kim     s->psksession = NULL;
1984*e71b7053SJung-uk Kim     s->hit = 1;
1985*e71b7053SJung-uk Kim #endif
1986*e71b7053SJung-uk Kim 
1987*e71b7053SJung-uk Kim     return 1;
1988*e71b7053SJung-uk Kim }
1989