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