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