xref: /aosp_15_r20/external/curl/lib/vtls/vtls_int.h (revision 6236dae45794135f37c4eb022389c904c8b0090d)
1*6236dae4SAndroid Build Coastguard Worker #ifndef HEADER_CURL_VTLS_INT_H
2*6236dae4SAndroid Build Coastguard Worker #define HEADER_CURL_VTLS_INT_H
3*6236dae4SAndroid Build Coastguard Worker /***************************************************************************
4*6236dae4SAndroid Build Coastguard Worker  *                                  _   _ ____  _
5*6236dae4SAndroid Build Coastguard Worker  *  Project                     ___| | | |  _ \| |
6*6236dae4SAndroid Build Coastguard Worker  *                             / __| | | | |_) | |
7*6236dae4SAndroid Build Coastguard Worker  *                            | (__| |_| |  _ <| |___
8*6236dae4SAndroid Build Coastguard Worker  *                             \___|\___/|_| \_\_____|
9*6236dae4SAndroid Build Coastguard Worker  *
10*6236dae4SAndroid Build Coastguard Worker  * Copyright (C) Daniel Stenberg, <[email protected]>, et al.
11*6236dae4SAndroid Build Coastguard Worker  *
12*6236dae4SAndroid Build Coastguard Worker  * This software is licensed as described in the file COPYING, which
13*6236dae4SAndroid Build Coastguard Worker  * you should have received as part of this distribution. The terms
14*6236dae4SAndroid Build Coastguard Worker  * are also available at https://curl.se/docs/copyright.html.
15*6236dae4SAndroid Build Coastguard Worker  *
16*6236dae4SAndroid Build Coastguard Worker  * You may opt to use, copy, modify, merge, publish, distribute and/or sell
17*6236dae4SAndroid Build Coastguard Worker  * copies of the Software, and permit persons to whom the Software is
18*6236dae4SAndroid Build Coastguard Worker  * furnished to do so, under the terms of the COPYING file.
19*6236dae4SAndroid Build Coastguard Worker  *
20*6236dae4SAndroid Build Coastguard Worker  * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
21*6236dae4SAndroid Build Coastguard Worker  * KIND, either express or implied.
22*6236dae4SAndroid Build Coastguard Worker  *
23*6236dae4SAndroid Build Coastguard Worker  * SPDX-License-Identifier: curl
24*6236dae4SAndroid Build Coastguard Worker  *
25*6236dae4SAndroid Build Coastguard Worker  ***************************************************************************/
26*6236dae4SAndroid Build Coastguard Worker #include "curl_setup.h"
27*6236dae4SAndroid Build Coastguard Worker #include "cfilters.h"
28*6236dae4SAndroid Build Coastguard Worker #include "urldata.h"
29*6236dae4SAndroid Build Coastguard Worker 
30*6236dae4SAndroid Build Coastguard Worker #ifdef USE_SSL
31*6236dae4SAndroid Build Coastguard Worker 
32*6236dae4SAndroid Build Coastguard Worker struct ssl_connect_data;
33*6236dae4SAndroid Build Coastguard Worker 
34*6236dae4SAndroid Build Coastguard Worker /* see https://www.iana.org/assignments/tls-extensiontype-values/ */
35*6236dae4SAndroid Build Coastguard Worker #define ALPN_HTTP_1_1_LENGTH 8
36*6236dae4SAndroid Build Coastguard Worker #define ALPN_HTTP_1_1 "http/1.1"
37*6236dae4SAndroid Build Coastguard Worker #define ALPN_H2_LENGTH 2
38*6236dae4SAndroid Build Coastguard Worker #define ALPN_H2 "h2"
39*6236dae4SAndroid Build Coastguard Worker #define ALPN_H3_LENGTH 2
40*6236dae4SAndroid Build Coastguard Worker #define ALPN_H3 "h3"
41*6236dae4SAndroid Build Coastguard Worker 
42*6236dae4SAndroid Build Coastguard Worker /* conservative sizes on the ALPN entries and count we are handling,
43*6236dae4SAndroid Build Coastguard Worker  * we can increase these if we ever feel the need or have to accommodate
44*6236dae4SAndroid Build Coastguard Worker  * ALPN strings from the "outside". */
45*6236dae4SAndroid Build Coastguard Worker #define ALPN_NAME_MAX     10
46*6236dae4SAndroid Build Coastguard Worker #define ALPN_ENTRIES_MAX  3
47*6236dae4SAndroid Build Coastguard Worker #define ALPN_PROTO_BUF_MAX   (ALPN_ENTRIES_MAX * (ALPN_NAME_MAX + 1))
48*6236dae4SAndroid Build Coastguard Worker 
49*6236dae4SAndroid Build Coastguard Worker struct alpn_spec {
50*6236dae4SAndroid Build Coastguard Worker   const char entries[ALPN_ENTRIES_MAX][ALPN_NAME_MAX];
51*6236dae4SAndroid Build Coastguard Worker   size_t count; /* number of entries */
52*6236dae4SAndroid Build Coastguard Worker };
53*6236dae4SAndroid Build Coastguard Worker 
54*6236dae4SAndroid Build Coastguard Worker struct alpn_proto_buf {
55*6236dae4SAndroid Build Coastguard Worker   unsigned char data[ALPN_PROTO_BUF_MAX];
56*6236dae4SAndroid Build Coastguard Worker   int len;
57*6236dae4SAndroid Build Coastguard Worker };
58*6236dae4SAndroid Build Coastguard Worker 
59*6236dae4SAndroid Build Coastguard Worker CURLcode Curl_alpn_to_proto_buf(struct alpn_proto_buf *buf,
60*6236dae4SAndroid Build Coastguard Worker                                 const struct alpn_spec *spec);
61*6236dae4SAndroid Build Coastguard Worker CURLcode Curl_alpn_to_proto_str(struct alpn_proto_buf *buf,
62*6236dae4SAndroid Build Coastguard Worker                                 const struct alpn_spec *spec);
63*6236dae4SAndroid Build Coastguard Worker 
64*6236dae4SAndroid Build Coastguard Worker CURLcode Curl_alpn_set_negotiated(struct Curl_cfilter *cf,
65*6236dae4SAndroid Build Coastguard Worker                                   struct Curl_easy *data,
66*6236dae4SAndroid Build Coastguard Worker                                   struct ssl_connect_data *connssl,
67*6236dae4SAndroid Build Coastguard Worker                                   const unsigned char *proto,
68*6236dae4SAndroid Build Coastguard Worker                                   size_t proto_len);
69*6236dae4SAndroid Build Coastguard Worker 
70*6236dae4SAndroid Build Coastguard Worker bool Curl_alpn_contains_proto(const struct alpn_spec *spec,
71*6236dae4SAndroid Build Coastguard Worker                               const char *proto);
72*6236dae4SAndroid Build Coastguard Worker 
73*6236dae4SAndroid Build Coastguard Worker /* enum for the nonblocking SSL connection state machine */
74*6236dae4SAndroid Build Coastguard Worker typedef enum {
75*6236dae4SAndroid Build Coastguard Worker   ssl_connect_1,
76*6236dae4SAndroid Build Coastguard Worker   ssl_connect_2,
77*6236dae4SAndroid Build Coastguard Worker   ssl_connect_3,
78*6236dae4SAndroid Build Coastguard Worker   ssl_connect_done
79*6236dae4SAndroid Build Coastguard Worker } ssl_connect_state;
80*6236dae4SAndroid Build Coastguard Worker 
81*6236dae4SAndroid Build Coastguard Worker typedef enum {
82*6236dae4SAndroid Build Coastguard Worker   ssl_connection_none,
83*6236dae4SAndroid Build Coastguard Worker   ssl_connection_deferred,
84*6236dae4SAndroid Build Coastguard Worker   ssl_connection_negotiating,
85*6236dae4SAndroid Build Coastguard Worker   ssl_connection_complete
86*6236dae4SAndroid Build Coastguard Worker } ssl_connection_state;
87*6236dae4SAndroid Build Coastguard Worker 
88*6236dae4SAndroid Build Coastguard Worker typedef enum {
89*6236dae4SAndroid Build Coastguard Worker   ssl_earlydata_none,
90*6236dae4SAndroid Build Coastguard Worker   ssl_earlydata_use,
91*6236dae4SAndroid Build Coastguard Worker   ssl_earlydata_sending,
92*6236dae4SAndroid Build Coastguard Worker   ssl_earlydata_sent,
93*6236dae4SAndroid Build Coastguard Worker   ssl_earlydata_accepted,
94*6236dae4SAndroid Build Coastguard Worker   ssl_earlydata_rejected
95*6236dae4SAndroid Build Coastguard Worker } ssl_earlydata_state;
96*6236dae4SAndroid Build Coastguard Worker 
97*6236dae4SAndroid Build Coastguard Worker #define CURL_SSL_IO_NEED_NONE   (0)
98*6236dae4SAndroid Build Coastguard Worker #define CURL_SSL_IO_NEED_RECV   (1<<0)
99*6236dae4SAndroid Build Coastguard Worker #define CURL_SSL_IO_NEED_SEND   (1<<1)
100*6236dae4SAndroid Build Coastguard Worker 
101*6236dae4SAndroid Build Coastguard Worker /* Max earlydata payload we want to send */
102*6236dae4SAndroid Build Coastguard Worker #define CURL_SSL_EARLY_MAX       (64*1024)
103*6236dae4SAndroid Build Coastguard Worker 
104*6236dae4SAndroid Build Coastguard Worker /* Information in each SSL cfilter context: cf->ctx */
105*6236dae4SAndroid Build Coastguard Worker struct ssl_connect_data {
106*6236dae4SAndroid Build Coastguard Worker   struct ssl_peer peer;
107*6236dae4SAndroid Build Coastguard Worker   const struct alpn_spec *alpn;     /* ALPN to use or NULL for none */
108*6236dae4SAndroid Build Coastguard Worker   void *backend;                    /* vtls backend specific props */
109*6236dae4SAndroid Build Coastguard Worker   struct cf_call_data call_data;    /* data handle used in current call */
110*6236dae4SAndroid Build Coastguard Worker   struct curltime handshake_done;   /* time when handshake finished */
111*6236dae4SAndroid Build Coastguard Worker   char *alpn_negotiated;            /* negotiated ALPN value or NULL */
112*6236dae4SAndroid Build Coastguard Worker   struct bufq earlydata;            /* earlydata to be send to peer */
113*6236dae4SAndroid Build Coastguard Worker   size_t earlydata_max;             /* max earlydata allowed by peer */
114*6236dae4SAndroid Build Coastguard Worker   size_t earlydata_skip;            /* sending bytes to skip when earlydata
115*6236dae4SAndroid Build Coastguard Worker                                      * is accepted by peer */
116*6236dae4SAndroid Build Coastguard Worker   ssl_connection_state state;
117*6236dae4SAndroid Build Coastguard Worker   ssl_connect_state connecting_state;
118*6236dae4SAndroid Build Coastguard Worker   ssl_earlydata_state earlydata_state;
119*6236dae4SAndroid Build Coastguard Worker   int io_need;                      /* TLS signals special SEND/RECV needs */
120*6236dae4SAndroid Build Coastguard Worker   BIT(use_alpn);                    /* if ALPN shall be used in handshake */
121*6236dae4SAndroid Build Coastguard Worker   BIT(peer_closed);                 /* peer has closed connection */
122*6236dae4SAndroid Build Coastguard Worker };
123*6236dae4SAndroid Build Coastguard Worker 
124*6236dae4SAndroid Build Coastguard Worker 
125*6236dae4SAndroid Build Coastguard Worker #undef CF_CTX_CALL_DATA
126*6236dae4SAndroid Build Coastguard Worker #define CF_CTX_CALL_DATA(cf)  \
127*6236dae4SAndroid Build Coastguard Worker   ((struct ssl_connect_data *)(cf)->ctx)->call_data
128*6236dae4SAndroid Build Coastguard Worker 
129*6236dae4SAndroid Build Coastguard Worker 
130*6236dae4SAndroid Build Coastguard Worker /* Definitions for SSL Implementations */
131*6236dae4SAndroid Build Coastguard Worker 
132*6236dae4SAndroid Build Coastguard Worker struct Curl_ssl {
133*6236dae4SAndroid Build Coastguard Worker   /*
134*6236dae4SAndroid Build Coastguard Worker    * This *must* be the first entry to allow returning the list of available
135*6236dae4SAndroid Build Coastguard Worker    * backends in curl_global_sslset().
136*6236dae4SAndroid Build Coastguard Worker    */
137*6236dae4SAndroid Build Coastguard Worker   curl_ssl_backend info;
138*6236dae4SAndroid Build Coastguard Worker   unsigned int supports; /* bitfield, see above */
139*6236dae4SAndroid Build Coastguard Worker   size_t sizeof_ssl_backend_data;
140*6236dae4SAndroid Build Coastguard Worker 
141*6236dae4SAndroid Build Coastguard Worker   int (*init)(void);
142*6236dae4SAndroid Build Coastguard Worker   void (*cleanup)(void);
143*6236dae4SAndroid Build Coastguard Worker 
144*6236dae4SAndroid Build Coastguard Worker   size_t (*version)(char *buffer, size_t size);
145*6236dae4SAndroid Build Coastguard Worker   int (*check_cxn)(struct Curl_cfilter *cf, struct Curl_easy *data);
146*6236dae4SAndroid Build Coastguard Worker   CURLcode (*shut_down)(struct Curl_cfilter *cf, struct Curl_easy *data,
147*6236dae4SAndroid Build Coastguard Worker                         bool send_shutdown, bool *done);
148*6236dae4SAndroid Build Coastguard Worker   bool (*data_pending)(struct Curl_cfilter *cf,
149*6236dae4SAndroid Build Coastguard Worker                        const struct Curl_easy *data);
150*6236dae4SAndroid Build Coastguard Worker 
151*6236dae4SAndroid Build Coastguard Worker   /* return 0 if a find random is filled in */
152*6236dae4SAndroid Build Coastguard Worker   CURLcode (*random)(struct Curl_easy *data, unsigned char *entropy,
153*6236dae4SAndroid Build Coastguard Worker                      size_t length);
154*6236dae4SAndroid Build Coastguard Worker   bool (*cert_status_request)(void);
155*6236dae4SAndroid Build Coastguard Worker 
156*6236dae4SAndroid Build Coastguard Worker   CURLcode (*connect_blocking)(struct Curl_cfilter *cf,
157*6236dae4SAndroid Build Coastguard Worker                                struct Curl_easy *data);
158*6236dae4SAndroid Build Coastguard Worker   CURLcode (*connect_nonblocking)(struct Curl_cfilter *cf,
159*6236dae4SAndroid Build Coastguard Worker                                   struct Curl_easy *data,
160*6236dae4SAndroid Build Coastguard Worker                                   bool *done);
161*6236dae4SAndroid Build Coastguard Worker 
162*6236dae4SAndroid Build Coastguard Worker   /* During handshake/shutdown, adjust the pollset to include the socket
163*6236dae4SAndroid Build Coastguard Worker    * for POLLOUT or POLLIN as needed. Mandatory. */
164*6236dae4SAndroid Build Coastguard Worker   void (*adjust_pollset)(struct Curl_cfilter *cf, struct Curl_easy *data,
165*6236dae4SAndroid Build Coastguard Worker                           struct easy_pollset *ps);
166*6236dae4SAndroid Build Coastguard Worker   void *(*get_internals)(struct ssl_connect_data *connssl, CURLINFO info);
167*6236dae4SAndroid Build Coastguard Worker   void (*close)(struct Curl_cfilter *cf, struct Curl_easy *data);
168*6236dae4SAndroid Build Coastguard Worker   void (*close_all)(struct Curl_easy *data);
169*6236dae4SAndroid Build Coastguard Worker 
170*6236dae4SAndroid Build Coastguard Worker   CURLcode (*set_engine)(struct Curl_easy *data, const char *engine);
171*6236dae4SAndroid Build Coastguard Worker   CURLcode (*set_engine_default)(struct Curl_easy *data);
172*6236dae4SAndroid Build Coastguard Worker   struct curl_slist *(*engines_list)(struct Curl_easy *data);
173*6236dae4SAndroid Build Coastguard Worker 
174*6236dae4SAndroid Build Coastguard Worker   bool (*false_start)(void);
175*6236dae4SAndroid Build Coastguard Worker   CURLcode (*sha256sum)(const unsigned char *input, size_t inputlen,
176*6236dae4SAndroid Build Coastguard Worker                     unsigned char *sha256sum, size_t sha256sumlen);
177*6236dae4SAndroid Build Coastguard Worker 
178*6236dae4SAndroid Build Coastguard Worker   bool (*attach_data)(struct Curl_cfilter *cf, struct Curl_easy *data);
179*6236dae4SAndroid Build Coastguard Worker   void (*detach_data)(struct Curl_cfilter *cf, struct Curl_easy *data);
180*6236dae4SAndroid Build Coastguard Worker 
181*6236dae4SAndroid Build Coastguard Worker   ssize_t (*recv_plain)(struct Curl_cfilter *cf, struct Curl_easy *data,
182*6236dae4SAndroid Build Coastguard Worker                         char *buf, size_t len, CURLcode *code);
183*6236dae4SAndroid Build Coastguard Worker   ssize_t (*send_plain)(struct Curl_cfilter *cf, struct Curl_easy *data,
184*6236dae4SAndroid Build Coastguard Worker                         const void *mem, size_t len, CURLcode *code);
185*6236dae4SAndroid Build Coastguard Worker 
186*6236dae4SAndroid Build Coastguard Worker   CURLcode (*get_channel_binding)(struct Curl_easy *data, int sockindex,
187*6236dae4SAndroid Build Coastguard Worker                                   struct dynbuf *binding);
188*6236dae4SAndroid Build Coastguard Worker 
189*6236dae4SAndroid Build Coastguard Worker };
190*6236dae4SAndroid Build Coastguard Worker 
191*6236dae4SAndroid Build Coastguard Worker extern const struct Curl_ssl *Curl_ssl;
192*6236dae4SAndroid Build Coastguard Worker 
193*6236dae4SAndroid Build Coastguard Worker 
194*6236dae4SAndroid Build Coastguard Worker int Curl_none_init(void);
195*6236dae4SAndroid Build Coastguard Worker void Curl_none_cleanup(void);
196*6236dae4SAndroid Build Coastguard Worker CURLcode Curl_none_shutdown(struct Curl_cfilter *cf, struct Curl_easy *data,
197*6236dae4SAndroid Build Coastguard Worker                             bool send_shutdown, bool *done);
198*6236dae4SAndroid Build Coastguard Worker int Curl_none_check_cxn(struct Curl_cfilter *cf, struct Curl_easy *data);
199*6236dae4SAndroid Build Coastguard Worker void Curl_none_close_all(struct Curl_easy *data);
200*6236dae4SAndroid Build Coastguard Worker void Curl_none_session_free(void *ptr);
201*6236dae4SAndroid Build Coastguard Worker bool Curl_none_data_pending(struct Curl_cfilter *cf,
202*6236dae4SAndroid Build Coastguard Worker                             const struct Curl_easy *data);
203*6236dae4SAndroid Build Coastguard Worker bool Curl_none_cert_status_request(void);
204*6236dae4SAndroid Build Coastguard Worker CURLcode Curl_none_set_engine(struct Curl_easy *data, const char *engine);
205*6236dae4SAndroid Build Coastguard Worker CURLcode Curl_none_set_engine_default(struct Curl_easy *data);
206*6236dae4SAndroid Build Coastguard Worker struct curl_slist *Curl_none_engines_list(struct Curl_easy *data);
207*6236dae4SAndroid Build Coastguard Worker bool Curl_none_false_start(void);
208*6236dae4SAndroid Build Coastguard Worker void Curl_ssl_adjust_pollset(struct Curl_cfilter *cf, struct Curl_easy *data,
209*6236dae4SAndroid Build Coastguard Worker                               struct easy_pollset *ps);
210*6236dae4SAndroid Build Coastguard Worker 
211*6236dae4SAndroid Build Coastguard Worker /**
212*6236dae4SAndroid Build Coastguard Worker  * Get the SSL filter below the given one or NULL if there is none.
213*6236dae4SAndroid Build Coastguard Worker  */
214*6236dae4SAndroid Build Coastguard Worker bool Curl_ssl_cf_is_proxy(struct Curl_cfilter *cf);
215*6236dae4SAndroid Build Coastguard Worker 
216*6236dae4SAndroid Build Coastguard Worker /* extract a session ID
217*6236dae4SAndroid Build Coastguard Worker  * Sessionid mutex must be locked (see Curl_ssl_sessionid_lock).
218*6236dae4SAndroid Build Coastguard Worker  * Caller must make sure that the ownership of returned sessionid object
219*6236dae4SAndroid Build Coastguard Worker  * is properly taken (e.g. its refcount is incremented
220*6236dae4SAndroid Build Coastguard Worker  * under sessionid mutex).
221*6236dae4SAndroid Build Coastguard Worker  * @param cf      the connection filter wanting to use it
222*6236dae4SAndroid Build Coastguard Worker  * @param data    the transfer involved
223*6236dae4SAndroid Build Coastguard Worker  * @param peer    the peer the filter wants to talk to
224*6236dae4SAndroid Build Coastguard Worker  * @param sessionid on return the TLS session
225*6236dae4SAndroid Build Coastguard Worker  * @param idsize  on return the size of the TLS session data
226*6236dae4SAndroid Build Coastguard Worker  * @param palpn   on return the ALPN string used by the session,
227*6236dae4SAndroid Build Coastguard Worker  *                set to NULL when not interested
228*6236dae4SAndroid Build Coastguard Worker  */
229*6236dae4SAndroid Build Coastguard Worker bool Curl_ssl_getsessionid(struct Curl_cfilter *cf,
230*6236dae4SAndroid Build Coastguard Worker                            struct Curl_easy *data,
231*6236dae4SAndroid Build Coastguard Worker                            const struct ssl_peer *peer,
232*6236dae4SAndroid Build Coastguard Worker                            void **ssl_sessionid,
233*6236dae4SAndroid Build Coastguard Worker                            size_t *idsize, /* set 0 if unknown */
234*6236dae4SAndroid Build Coastguard Worker                            char **palpn);
235*6236dae4SAndroid Build Coastguard Worker 
236*6236dae4SAndroid Build Coastguard Worker /* Set a TLS session ID for `peer`. Replaces an existing session ID if
237*6236dae4SAndroid Build Coastguard Worker  * not already the same.
238*6236dae4SAndroid Build Coastguard Worker  * Sessionid mutex must be locked (see Curl_ssl_sessionid_lock).
239*6236dae4SAndroid Build Coastguard Worker  * Call takes ownership of `ssl_sessionid`, using `sessionid_free_cb`
240*6236dae4SAndroid Build Coastguard Worker  * to deallocate it. Is called in all outcomes, either right away or
241*6236dae4SAndroid Build Coastguard Worker  * later when the session cache is cleaned up.
242*6236dae4SAndroid Build Coastguard Worker  * Caller must ensure that it has properly shared ownership of this sessionid
243*6236dae4SAndroid Build Coastguard Worker  * object with cache (e.g. incrementing refcount on success)
244*6236dae4SAndroid Build Coastguard Worker  */
245*6236dae4SAndroid Build Coastguard Worker CURLcode Curl_ssl_set_sessionid(struct Curl_cfilter *cf,
246*6236dae4SAndroid Build Coastguard Worker                                 struct Curl_easy *data,
247*6236dae4SAndroid Build Coastguard Worker                                 const struct ssl_peer *peer,
248*6236dae4SAndroid Build Coastguard Worker                                 const char *alpn,
249*6236dae4SAndroid Build Coastguard Worker                                 void *sessionid,
250*6236dae4SAndroid Build Coastguard Worker                                 size_t sessionid_size,
251*6236dae4SAndroid Build Coastguard Worker                                 Curl_ssl_sessionid_dtor *sessionid_free_cb);
252*6236dae4SAndroid Build Coastguard Worker 
253*6236dae4SAndroid Build Coastguard Worker #endif /* USE_SSL */
254*6236dae4SAndroid Build Coastguard Worker 
255*6236dae4SAndroid Build Coastguard Worker #endif /* HEADER_CURL_VTLS_INT_H */
256