xref: /freebsd/crypto/openssl/doc/man3/OSSL_HTTP_transfer.pod (revision b077aed33b7b6aefca7b17ddb250cf521f938613)
1*b077aed3SPierre Pronchery=pod
2*b077aed3SPierre Pronchery
3*b077aed3SPierre Pronchery=head1 NAME
4*b077aed3SPierre Pronchery
5*b077aed3SPierre ProncheryOSSL_HTTP_open,
6*b077aed3SPierre ProncheryOSSL_HTTP_bio_cb_t,
7*b077aed3SPierre ProncheryOSSL_HTTP_proxy_connect,
8*b077aed3SPierre ProncheryOSSL_HTTP_set1_request,
9*b077aed3SPierre ProncheryOSSL_HTTP_exchange,
10*b077aed3SPierre ProncheryOSSL_HTTP_get,
11*b077aed3SPierre ProncheryOSSL_HTTP_transfer,
12*b077aed3SPierre ProncheryOSSL_HTTP_close
13*b077aed3SPierre Pronchery-  HTTP client high-level functions
14*b077aed3SPierre Pronchery
15*b077aed3SPierre Pronchery=head1 SYNOPSIS
16*b077aed3SPierre Pronchery
17*b077aed3SPierre Pronchery #include <openssl/http.h>
18*b077aed3SPierre Pronchery
19*b077aed3SPierre Pronchery typedef BIO *(*OSSL_HTTP_bio_cb_t)(BIO *bio, void *arg,
20*b077aed3SPierre Pronchery                                    int connect, int detail);
21*b077aed3SPierre Pronchery OSSL_HTTP_REQ_CTX *OSSL_HTTP_open(const char *server, const char *port,
22*b077aed3SPierre Pronchery                                   const char *proxy, const char *no_proxy,
23*b077aed3SPierre Pronchery                                   int use_ssl, BIO *bio, BIO *rbio,
24*b077aed3SPierre Pronchery                                   OSSL_HTTP_bio_cb_t bio_update_fn, void *arg,
25*b077aed3SPierre Pronchery                                   int buf_size, int overall_timeout);
26*b077aed3SPierre Pronchery int OSSL_HTTP_proxy_connect(BIO *bio, const char *server, const char *port,
27*b077aed3SPierre Pronchery                             const char *proxyuser, const char *proxypass,
28*b077aed3SPierre Pronchery                             int timeout, BIO *bio_err, const char *prog);
29*b077aed3SPierre Pronchery int OSSL_HTTP_set1_request(OSSL_HTTP_REQ_CTX *rctx, const char *path,
30*b077aed3SPierre Pronchery                            const STACK_OF(CONF_VALUE) *headers,
31*b077aed3SPierre Pronchery                            const char *content_type, BIO *req,
32*b077aed3SPierre Pronchery                            const char *expected_content_type, int expect_asn1,
33*b077aed3SPierre Pronchery                            size_t max_resp_len, int timeout, int keep_alive);
34*b077aed3SPierre Pronchery BIO *OSSL_HTTP_exchange(OSSL_HTTP_REQ_CTX *rctx, char **redirection_url);
35*b077aed3SPierre Pronchery BIO *OSSL_HTTP_get(const char *url, const char *proxy, const char *no_proxy,
36*b077aed3SPierre Pronchery                    BIO *bio, BIO *rbio,
37*b077aed3SPierre Pronchery                    OSSL_HTTP_bio_cb_t bio_update_fn, void *arg,
38*b077aed3SPierre Pronchery                    int buf_size, const STACK_OF(CONF_VALUE) *headers,
39*b077aed3SPierre Pronchery                    const char *expected_content_type, int expect_asn1,
40*b077aed3SPierre Pronchery                    size_t max_resp_len, int timeout);
41*b077aed3SPierre Pronchery BIO *OSSL_HTTP_transfer(OSSL_HTTP_REQ_CTX **prctx,
42*b077aed3SPierre Pronchery                         const char *server, const char *port,
43*b077aed3SPierre Pronchery                         const char *path, int use_ssl,
44*b077aed3SPierre Pronchery                         const char *proxy, const char *no_proxy,
45*b077aed3SPierre Pronchery                         BIO *bio, BIO *rbio,
46*b077aed3SPierre Pronchery                         OSSL_HTTP_bio_cb_t bio_update_fn, void *arg,
47*b077aed3SPierre Pronchery                         int buf_size, const STACK_OF(CONF_VALUE) *headers,
48*b077aed3SPierre Pronchery                         const char *content_type, BIO *req,
49*b077aed3SPierre Pronchery                         const char *expected_content_type, int expect_asn1,
50*b077aed3SPierre Pronchery                         size_t max_resp_len, int timeout, int keep_alive);
51*b077aed3SPierre Pronchery int OSSL_HTTP_close(OSSL_HTTP_REQ_CTX *rctx, int ok);
52*b077aed3SPierre Pronchery
53*b077aed3SPierre Pronchery=head1 DESCRIPTION
54*b077aed3SPierre Pronchery
55*b077aed3SPierre ProncheryOSSL_HTTP_open() initiates an HTTP session using the I<bio> argument if not
56*b077aed3SPierre ProncheryNULL, else by connecting to a given I<server> optionally via a I<proxy>.
57*b077aed3SPierre Pronchery
58*b077aed3SPierre ProncheryTypically the OpenSSL build supports sockets and the I<bio> parameter is NULL.
59*b077aed3SPierre ProncheryIn this case I<rbio> must be NULL as well and the I<server> must be non-NULL.
60*b077aed3SPierre ProncheryThe function creates a network BIO internally using L<BIO_new_connect(3)>
61*b077aed3SPierre Proncheryfor connecting to the given server and the optionally given I<port>,
62*b077aed3SPierre Proncherydefaulting to 80 for HTTP or 443 for HTTPS.
63*b077aed3SPierre ProncheryThen this internal BIO is used for setting up a connection
64*b077aed3SPierre Proncheryand for exchanging one or more request and response.
65*b077aed3SPierre ProncheryIf I<bio> is given and I<rbio> is NULL then this I<bio> is used instead.
66*b077aed3SPierre ProncheryIf both I<bio> and I<rbio> are given (which may be memory BIOs for instance)
67*b077aed3SPierre Proncherythen no explicit connection is set up, but
68*b077aed3SPierre ProncheryI<bio> is used for writing requests and I<rbio> for reading responses.
69*b077aed3SPierre ProncheryAs soon as the client has flushed I<bio> the server must be ready to provide
70*b077aed3SPierre Proncherya response or indicate a waiting condition via I<rbio>.
71*b077aed3SPierre Pronchery
72*b077aed3SPierre ProncheryIf I<bio> is given, it is an error to provide I<proxy> or I<no_proxy> arguments,
73*b077aed3SPierre Proncherywhile I<server> and I<port> arguments may be given to support diagnostic output.
74*b077aed3SPierre ProncheryIf I<bio> is NULL the optional I<proxy> parameter can be used to set an
75*b077aed3SPierre ProncheryHTTP(S) proxy to use (unless overridden by "no_proxy" settings).
76*b077aed3SPierre ProncheryIf TLS is not used this defaults to the environment variable C<http_proxy>
77*b077aed3SPierre Proncheryif set, else C<HTTP_PROXY>.
78*b077aed3SPierre ProncheryIf I<use_ssl> != 0 it defaults to C<https_proxy> if set, else C<HTTPS_PROXY>.
79*b077aed3SPierre ProncheryAn empty proxy string C<""> forbids using a proxy.
80*b077aed3SPierre ProncheryElse the format is
81*b077aed3SPierre ProncheryC<[http[s]://][userinfo@]host[:port][/path][?query][#fragment]>,
82*b077aed3SPierre Proncherywhere any userinfo, path, query, and fragment given is ignored.
83*b077aed3SPierre ProncheryThe default proxy port number is 80, or 443 in case "https:" is given.
84*b077aed3SPierre ProncheryThe HTTP client functions connect via the given proxy unless the I<server>
85*b077aed3SPierre Proncheryis found in the optional list I<no_proxy> of proxy hostnames (if not NULL;
86*b077aed3SPierre Proncherydefault is the environment variable C<no_proxy> if set, else C<NO_PROXY>).
87*b077aed3SPierre ProncheryProxying plain HTTP is supported directly,
88*b077aed3SPierre Proncherywhile using a proxy for HTTPS connections requires a suitable callback function
89*b077aed3SPierre Proncherysuch as OSSL_HTTP_proxy_connect(), described below.
90*b077aed3SPierre Pronchery
91*b077aed3SPierre ProncheryIf I<use_ssl> is nonzero a TLS connection is requested
92*b077aed3SPierre Proncheryand the I<bio_update_fn> parameter must be provided.
93*b077aed3SPierre Pronchery
94*b077aed3SPierre ProncheryThe parameter I<bio_update_fn>, which is optional if I<use_ssl> is 0,
95*b077aed3SPierre Proncherymay be used to modify the connection BIO used by the HTTP client,
96*b077aed3SPierre Proncherybut cannot be used when both I<bio> and I<rbio> are given.
97*b077aed3SPierre ProncheryI<bio_update_fn> is a BIO connect/disconnect callback function with prototype
98*b077aed3SPierre Pronchery
99*b077aed3SPierre Pronchery BIO *(*OSSL_HTTP_bio_cb_t)(BIO *bio, void *arg, int connect, int detail)
100*b077aed3SPierre Pronchery
101*b077aed3SPierre ProncheryThe callback function may modify the BIO provided in the I<bio> argument,
102*b077aed3SPierre Proncherywhereby it may make use of a custom defined argument I<arg>,
103*b077aed3SPierre Proncherywhich may for instance point to an B<SSL_CTX> structure.
104*b077aed3SPierre ProncheryDuring connection establishment, just after calling BIO_do_connect_retry(), the
105*b077aed3SPierre Proncherycallback function is invoked with the I<connect> argument being 1 and
106*b077aed3SPierre ProncheryI<detail> being 1 if I<use_ssl> is nonzero (i.e., HTTPS is requested), else 0.
107*b077aed3SPierre ProncheryOn disconnect I<connect> is 0 and I<detail> is 1 if no error occurred, else 0.
108*b077aed3SPierre ProncheryFor instance, on connect the callback may push an SSL BIO to implement HTTPS;
109*b077aed3SPierre Proncheryafter disconnect it may do some diagnostic output and pop and free the SSL BIO.
110*b077aed3SPierre Pronchery
111*b077aed3SPierre ProncheryThe callback function must return either the potentially modified BIO I<bio>.
112*b077aed3SPierre Proncheryor NULL to indicate failure, in which case it should not modify the BIO.
113*b077aed3SPierre Pronchery
114*b077aed3SPierre ProncheryHere is a simple example that supports TLS connections (but not via a proxy):
115*b077aed3SPierre Pronchery
116*b077aed3SPierre Pronchery BIO *http_tls_cb(BIO *bio, void *arg, int connect, int detail)
117*b077aed3SPierre Pronchery {
118*b077aed3SPierre Pronchery     if (connect && detail) { /* connecting with TLS */
119*b077aed3SPierre Pronchery         SSL_CTX *ctx = (SSL_CTX *)arg;
120*b077aed3SPierre Pronchery         BIO *sbio = BIO_new_ssl(ctx, 1);
121*b077aed3SPierre Pronchery
122*b077aed3SPierre Pronchery         bio = sbio != NULL ? BIO_push(sbio, bio) : NULL;
123*b077aed3SPierre Pronchery     } else if (!connect) { /* disconnecting */
124*b077aed3SPierre Pronchery         BIO *hbio;
125*b077aed3SPierre Pronchery
126*b077aed3SPierre Pronchery         if (!detail) { /* an error has occurred */
127*b077aed3SPierre Pronchery             /* optionally add diagnostics here */
128*b077aed3SPierre Pronchery         }
129*b077aed3SPierre Pronchery         BIO_ssl_shutdown(bio);
130*b077aed3SPierre Pronchery         hbio = BIO_pop(bio);
131*b077aed3SPierre Pronchery         BIO_free(bio); /* SSL BIO */
132*b077aed3SPierre Pronchery         bio = hbio;
133*b077aed3SPierre Pronchery     }
134*b077aed3SPierre Pronchery     return bio;
135*b077aed3SPierre Pronchery }
136*b077aed3SPierre Pronchery
137*b077aed3SPierre ProncheryAfter disconnect the modified BIO will be deallocated using BIO_free_all().
138*b077aed3SPierre Pronchery
139*b077aed3SPierre ProncheryThe I<buf_size> parameter specifies the response header maximum line length.
140*b077aed3SPierre ProncheryA value <= 0 means that the B<OSSL_HTTP_DEFAULT_MAX_LINE_LEN> (4KiB) is used.
141*b077aed3SPierre ProncheryI<buf_size> is also used as the number of content bytes that are read at a time.
142*b077aed3SPierre Pronchery
143*b077aed3SPierre ProncheryIf the I<overall_timeout> parameter is > 0 this indicates the maximum number of
144*b077aed3SPierre Proncheryseconds the overall HTTP transfer (i.e., connection setup if needed,
145*b077aed3SPierre Proncherysending requests, and receiving responses) is allowed to take until completion.
146*b077aed3SPierre ProncheryA value <= 0 enables waiting indefinitely, i.e., no timeout.
147*b077aed3SPierre Pronchery
148*b077aed3SPierre ProncheryOSSL_HTTP_proxy_connect() may be used by an above BIO connect callback function
149*b077aed3SPierre Proncheryto set up an SSL/TLS connection via an HTTPS proxy.
150*b077aed3SPierre ProncheryIt promotes the given BIO I<bio> representing a connection
151*b077aed3SPierre Proncherypre-established with a TLS proxy using the HTTP CONNECT method,
152*b077aed3SPierre Proncheryoptionally using proxy client credentials I<proxyuser> and I<proxypass>,
153*b077aed3SPierre Proncheryto connect with TLS protection ultimately to I<server> and I<port>.
154*b077aed3SPierre ProncheryIf the I<port> argument is NULL or the empty string it defaults to "443".
155*b077aed3SPierre ProncheryIf the I<timeout> parameter is > 0 this indicates the maximum number of
156*b077aed3SPierre Proncheryseconds the connection setup is allowed to take.
157*b077aed3SPierre ProncheryA value <= 0 enables waiting indefinitely, i.e., no timeout.
158*b077aed3SPierre ProncherySince this function is typically called by applications such as
159*b077aed3SPierre ProncheryL<openssl-s_client(1)> it uses the I<bio_err> and I<prog> parameters (unless
160*b077aed3SPierre ProncheryNULL) to print additional diagnostic information in a user-oriented way.
161*b077aed3SPierre Pronchery
162*b077aed3SPierre ProncheryOSSL_HTTP_set1_request() sets up in I<rctx> the request header and content data
163*b077aed3SPierre Proncheryand expectations on the response using the following parameters.
164*b077aed3SPierre ProncheryIf <rctx> indicates using a proxy for HTTP (but not HTTPS), the server hostname
165*b077aed3SPierre Pronchery(and optionally port) needs to be placed in the header and thus must be present.
166*b077aed3SPierre ProncheryIf I<path> is NULL it defaults to "/".
167*b077aed3SPierre ProncheryIf I<req> is NULL the HTTP GET method will be used to send the request
168*b077aed3SPierre Proncheryelse HTTP POST with the contents of I<req> and optional I<content_type>, where
169*b077aed3SPierre Proncherythe length of the data in I<req> does not need to be determined in advance: the
170*b077aed3SPierre ProncheryBIO will be read on-the-fly while sending the request, which supports streaming.
171*b077aed3SPierre ProncheryThe optional list I<headers> may contain additional custom HTTP header lines.
172*b077aed3SPierre ProncheryIf the parameter I<expected_content_type>
173*b077aed3SPierre Proncheryis not NULL then the client will check that the given content type string
174*b077aed3SPierre Proncheryis included in the HTTP header of the response and return an error if not.
175*b077aed3SPierre ProncheryIf the I<expect_asn1> parameter is nonzero,
176*b077aed3SPierre Proncherya structure in ASN.1 encoding will be expected as response content.
177*b077aed3SPierre ProncheryThe I<max_resp_len> parameter specifies the maximum allowed
178*b077aed3SPierre Proncheryresponse content length, where the value 0 indicates no limit.
179*b077aed3SPierre ProncheryIf the I<timeout> parameter is > 0 this indicates the maximum number of seconds
180*b077aed3SPierre Proncherythe subsequent HTTP transfer (sending the request and receiving a response)
181*b077aed3SPierre Proncheryis allowed to take.
182*b077aed3SPierre ProncheryA value of 0 enables waiting indefinitely, i.e., no timeout.
183*b077aed3SPierre ProncheryA value < 0 indicates that the I<overall_timeout> parameter value given
184*b077aed3SPierre Proncherywhen opening the HTTP transfer will be used instead.
185*b077aed3SPierre ProncheryIf I<keep_alive> is 0 the connection is not kept open
186*b077aed3SPierre Proncheryafter receiving a response, which is the default behavior for HTTP 1.0.
187*b077aed3SPierre ProncheryIf the value is 1 or 2 then a persistent connection is requested.
188*b077aed3SPierre ProncheryIf the value is 2 then a persistent connection is required,
189*b077aed3SPierre Proncheryi.e., an error occurs in case the server does not grant it.
190*b077aed3SPierre Pronchery
191*b077aed3SPierre ProncheryOSSL_HTTP_exchange() exchanges any form of HTTP request and response
192*b077aed3SPierre Proncheryas specified by I<rctx>, which must include both connection and request data,
193*b077aed3SPierre Proncherytypically set up using OSSL_HTTP_open() and OSSL_HTTP_set1_request().
194*b077aed3SPierre ProncheryIt implements the core of the functions described below.
195*b077aed3SPierre ProncheryIf the HTTP method is GET and I<redirection_url>
196*b077aed3SPierre Proncheryis not NULL the latter pointer is used to provide any new location that
197*b077aed3SPierre Proncherythe server may return with HTTP code 301 (MOVED_PERMANENTLY) or 302 (FOUND).
198*b077aed3SPierre ProncheryIn this case the function returns NULL and the caller is
199*b077aed3SPierre Proncheryresponsible for deallocating the URL with L<OPENSSL_free(3)>.
200*b077aed3SPierre ProncheryIf the response header contains one or more "Content-Length" header lines and/or
201*b077aed3SPierre Proncheryan ASN.1-encoded response is expected, which should include a total length,
202*b077aed3SPierre Proncherythe length indications received are checked for consistency
203*b077aed3SPierre Proncheryand for not exceeding any given maximum response length.
204*b077aed3SPierre ProncheryIf an ASN.1-encoded response is expected, the function returns on success
205*b077aed3SPierre Proncherythe contents buffered in a memory BIO, which does not support streaming.
206*b077aed3SPierre ProncheryOtherwise it returns directly the read BIO that holds the response contents,
207*b077aed3SPierre Proncherywhich allows a response of indefinite length and may support streaming.
208*b077aed3SPierre ProncheryThe caller is responsible for freeing the BIO pointer obtained.
209*b077aed3SPierre Pronchery
210*b077aed3SPierre ProncheryOSSL_HTTP_get() uses HTTP GET to obtain data from I<bio> if non-NULL,
211*b077aed3SPierre Proncheryelse from the server contained in the I<url>, and returns it as a BIO.
212*b077aed3SPierre ProncheryIt supports redirection via HTTP status code 301 or 302.  It is meant for
213*b077aed3SPierre Proncherytransfers with a single round trip, so does not support persistent connections.
214*b077aed3SPierre ProncheryIf I<bio> is non-NULL, any host and port components in the I<url> are not used
215*b077aed3SPierre Proncheryfor connecting but the hostname is used, as usual, for the C<Host> header.
216*b077aed3SPierre ProncheryAny userinfo and fragment components in the I<url> are ignored.
217*b077aed3SPierre ProncheryAny query component is handled as part of the path component.
218*b077aed3SPierre ProncheryIf the scheme component of the I<url> is C<https> a TLS connection is requested
219*b077aed3SPierre Proncheryand the I<bio_update_fn>, as described for OSSL_HTTP_open(), must be provided.
220*b077aed3SPierre ProncheryAlso the remaining parameters are interpreted as described for OSSL_HTTP_open()
221*b077aed3SPierre Proncheryand OSSL_HTTP_set1_request(), respectively.
222*b077aed3SPierre ProncheryThe caller is responsible for freeing the BIO pointer obtained.
223*b077aed3SPierre Pronchery
224*b077aed3SPierre ProncheryOSSL_HTTP_transfer() exchanges an HTTP request and response
225*b077aed3SPierre Proncheryover a connection managed via I<prctx> without supporting redirection.
226*b077aed3SPierre ProncheryIt combines OSSL_HTTP_open(), OSSL_HTTP_set1_request(), OSSL_HTTP_exchange(),
227*b077aed3SPierre Proncheryand OSSL_HTTP_close().
228*b077aed3SPierre ProncheryIf I<prctx> is not NULL it reuses any open connection represented by a non-NULL
229*b077aed3SPierre ProncheryI<*prctx>.  It keeps the connection open if a persistent connection is requested
230*b077aed3SPierre Proncheryor required and this was granted by the server, else it closes the connection
231*b077aed3SPierre Proncheryand assigns NULL to I<*prctx>.
232*b077aed3SPierre ProncheryThe remaining parameters are interpreted as described for OSSL_HTTP_open()
233*b077aed3SPierre Proncheryand OSSL_HTTP_set1_request(), respectively.
234*b077aed3SPierre ProncheryThe caller is responsible for freeing the BIO pointer obtained.
235*b077aed3SPierre Pronchery
236*b077aed3SPierre ProncheryOSSL_HTTP_close() closes the connection and releases I<rctx>.
237*b077aed3SPierre ProncheryThe I<ok> parameter is passed to any BIO update function
238*b077aed3SPierre Proncherygiven during setup as described above for OSSL_HTTP_open().
239*b077aed3SPierre ProncheryIt must be 1 if no error occurred during the HTTP transfer and 0 otherwise.
240*b077aed3SPierre Pronchery
241*b077aed3SPierre Pronchery=head1 NOTES
242*b077aed3SPierre Pronchery
243*b077aed3SPierre ProncheryThe names of the environment variables used by this implementation:
244*b077aed3SPierre ProncheryC<http_proxy>, C<HTTP_PROXY>, C<https_proxy>, C<HTTPS_PROXY>, C<no_proxy>, and
245*b077aed3SPierre ProncheryC<NO_PROXY>, have been chosen for maximal compatibility with
246*b077aed3SPierre Proncheryother HTTP client implementations such as wget, curl, and git.
247*b077aed3SPierre Pronchery
248*b077aed3SPierre Pronchery=head1 RETURN VALUES
249*b077aed3SPierre Pronchery
250*b077aed3SPierre ProncheryOSSL_HTTP_open() returns on success a B<OSSL_HTTP_REQ_CTX>, else NULL.
251*b077aed3SPierre Pronchery
252*b077aed3SPierre ProncheryOSSL_HTTP_proxy_connect() and OSSL_HTTP_set1_request()
253*b077aed3SPierre Proncheryreturn 1 on success, 0 on error.
254*b077aed3SPierre Pronchery
255*b077aed3SPierre ProncheryOn success, OSSL_HTTP_exchange(), OSSL_HTTP_get(), and OSSL_HTTP_transfer()
256*b077aed3SPierre Proncheryreturn a memory BIO that buffers all the data received if an ASN.1-encoded
257*b077aed3SPierre Proncheryresponse is expected, otherwise a BIO that may support streaming.
258*b077aed3SPierre ProncheryThe BIO must be freed by the caller.
259*b077aed3SPierre ProncheryOn failure, they return NULL.
260*b077aed3SPierre ProncheryFailure conditions include connection/transfer timeout, parse errors, etc.
261*b077aed3SPierre ProncheryThe caller is responsible for freeing the BIO pointer obtained.
262*b077aed3SPierre Pronchery
263*b077aed3SPierre ProncheryOSSL_HTTP_close() returns 0 if anything went wrong while disconnecting, else 1.
264*b077aed3SPierre Pronchery
265*b077aed3SPierre Pronchery=head1 SEE ALSO
266*b077aed3SPierre Pronchery
267*b077aed3SPierre ProncheryL<OSSL_HTTP_parse_url(3)>, L<BIO_new_connect(3)>,
268*b077aed3SPierre ProncheryL<ASN1_item_i2d_mem_bio(3)>, L<ASN1_item_d2i_bio(3)>,
269*b077aed3SPierre ProncheryL<OSSL_HTTP_is_alive(3)>
270*b077aed3SPierre Pronchery
271*b077aed3SPierre Pronchery=head1 HISTORY
272*b077aed3SPierre Pronchery
273*b077aed3SPierre ProncheryAll the functions described here were added in OpenSSL 3.0.
274*b077aed3SPierre Pronchery
275*b077aed3SPierre Pronchery=head1 COPYRIGHT
276*b077aed3SPierre Pronchery
277*b077aed3SPierre ProncheryCopyright 2019-2022 The OpenSSL Project Authors. All Rights Reserved.
278*b077aed3SPierre Pronchery
279*b077aed3SPierre ProncheryLicensed under the Apache License 2.0 (the "License").  You may not use
280*b077aed3SPierre Proncherythis file except in compliance with the License.  You can obtain a copy
281*b077aed3SPierre Proncheryin the file LICENSE in the source distribution or at
282*b077aed3SPierre ProncheryL<https://www.openssl.org/source/license.html>.
283*b077aed3SPierre Pronchery
284*b077aed3SPierre Pronchery=cut
285