1 /****************************************************************************
2 **
3 ** Copyright (C) 2015 The Qt Company Ltd.
4 ** Contact: http://www.qt.io/licensing/
5 **
6 ** This file is part of the QtNetwork module of the Qt Toolkit.
7 **
8 ** $QT_BEGIN_LICENSE:LGPL$
9 ** Commercial License Usage
10 ** Licensees holding valid commercial Qt licenses may use this file in
11 ** accordance with the commercial license agreement provided with the
12 ** Software or, alternatively, in accordance with the terms contained in
13 ** a written agreement between you and The Qt Company. For licensing terms
14 ** and conditions see http://www.qt.io/terms-conditions. For further
15 ** information use the contact form at http://www.qt.io/contact-us.
16 **
17 ** GNU Lesser General Public License Usage
18 ** Alternatively, this file may be used under the terms of the GNU Lesser
19 ** General Public License version 2.1 or version 3 as published by the Free
20 ** Software Foundation and appearing in the file LICENSE.LGPLv21 and
21 ** LICENSE.LGPLv3 included in the packaging of this file. Please review the
22 ** following information to ensure the GNU Lesser General Public License
23 ** requirements will be met: https://www.gnu.org/licenses/lgpl.html and
24 ** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
25 **
26 ** As a special exception, The Qt Company gives you certain additional
27 ** rights. These rights are described in The Qt Company LGPL Exception
28 ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
29 **
30 ** GNU General Public License Usage
31 ** Alternatively, this file may be used under the terms of the GNU
32 ** General Public License version 3.0 as published by the Free Software
33 ** Foundation and appearing in the file LICENSE.GPL included in the
34 ** packaging of this file.  Please review the following information to
35 ** ensure the GNU General Public License version 3.0 requirements will be
36 ** met: http://www.gnu.org/copyleft/gpl.html.
37 **
38 ** $QT_END_LICENSE$
39 **
40 ****************************************************************************/
41 
42 
43 #ifndef QSSLSOCKET_OPENSSL_SYMBOLS_P_H
44 #define QSSLSOCKET_OPENSSL_SYMBOLS_P_H
45 
46 //
47 //  W A R N I N G
48 //  -------------
49 //
50 // This file is not part of the Qt API.  It exists for the convenience
51 // of the QLibrary class.  This header file may change from
52 // version to version without notice, or even be removed.
53 //
54 // We mean it.
55 //
56 
57 #include "qsslsocket_openssl_p.h"
58 
59 QT_BEGIN_NAMESPACE
60 
61 #define DUMMYARG
62 
63 #if !defined QT_LINKED_OPENSSL
64 // **************** Shared declarations ******************
65 // ret func(arg)
66 
67 #  define DEFINEFUNC(ret, func, arg, a, err, funcret)				\
68     typedef ret (*_q_PTR_##func)(arg);					\
69     static _q_PTR_##func _q_##func = 0;					\
70     ret q_##func(arg) {						\
71         if (!_q_##func) {				\
72             qWarning("QSslSocket: cannot call unresolved function "#func);	\
73             err;								\
74         } \
75         funcret _q_##func(a); \
76     }
77 
78 // ret func(arg1, arg2)
79 #  define DEFINEFUNC2(ret, func, arg1, a, arg2, b, err, funcret) \
80     typedef ret (*_q_PTR_##func)(arg1, arg2);         \
81     static _q_PTR_##func _q_##func = 0;               \
82     ret q_##func(arg1, arg2) { \
83         if (!_q_##func) { \
84             qWarning("QSslSocket: cannot call unresolved function "#func);\
85             err; \
86         } \
87         funcret _q_##func(a, b); \
88     }
89 
90 // ret func(arg1, arg2, arg3)
91 #  define DEFINEFUNC3(ret, func, arg1, a, arg2, b, arg3, c, err, funcret) \
92     typedef ret (*_q_PTR_##func)(arg1, arg2, arg3);            \
93     static _q_PTR_##func _q_##func = 0;                        \
94     ret q_##func(arg1, arg2, arg3) { \
95         if (!_q_##func) { \
96             qWarning("QSslSocket: cannot call unresolved function "#func); \
97             err; \
98         } \
99         funcret _q_##func(a, b, c); \
100     }
101 
102 // ret func(arg1, arg2, arg3, arg4)
103 #  define DEFINEFUNC4(ret, func, arg1, a, arg2, b, arg3, c, arg4, d, err, funcret) \
104     typedef ret (*_q_PTR_##func)(arg1, arg2, arg3, arg4);               \
105     static _q_PTR_##func _q_##func = 0;                                 \
106     ret q_##func(arg1, arg2, arg3, arg4) { \
107          if (!_q_##func) { \
108              qWarning("QSslSocket: cannot call unresolved function "#func); \
109              err; \
110          } \
111          funcret _q_##func(a, b, c, d); \
112     }
113 
114 // ret func(arg1, arg2, arg3, arg4, arg5)
115 #  define DEFINEFUNC5(ret, func, arg1, a, arg2, b, arg3, c, arg4, d, arg5, e, err, funcret) \
116     typedef ret (*_q_PTR_##func)(arg1, arg2, arg3, arg4, arg5);         \
117     static _q_PTR_##func _q_##func = 0;                                 \
118     ret q_##func(arg1, arg2, arg3, arg4, arg5) { \
119         if (!_q_##func) { \
120             qWarning("QSslSocket: cannot call unresolved function "#func); \
121             err; \
122         } \
123         funcret _q_##func(a, b, c, d, e); \
124     }
125 
126 // ret func(arg1, arg2, arg3, arg4, arg6)
127 #  define DEFINEFUNC6(ret, func, arg1, a, arg2, b, arg3, c, arg4, d, arg5, e, arg6, f, err, funcret) \
128     typedef ret (*_q_PTR_##func)(arg1, arg2, arg3, arg4, arg5, arg6);   \
129     static _q_PTR_##func _q_##func = 0;                                 \
130     ret q_##func(arg1, arg2, arg3, arg4, arg5, arg6) { \
131         if (!_q_##func) { \
132             qWarning("QSslSocket: cannot call unresolved function "#func); \
133             err; \
134         } \
135         funcret _q_##func(a, b, c, d, e, f); \
136     }
137 
138 // ret func(arg1, arg2, arg3, arg4, arg6, arg7)
139 #  define DEFINEFUNC7(ret, func, arg1, a, arg2, b, arg3, c, arg4, d, arg5, e, arg6, f, arg7, g, err, funcret) \
140     typedef ret (*_q_PTR_##func)(arg1, arg2, arg3, arg4, arg5, arg6, arg7);   \
141     static _q_PTR_##func _q_##func = 0;                                       \
142     ret q_##func(arg1, arg2, arg3, arg4, arg5, arg6, arg7) { \
143         if (!_q_##func) { \
144             qWarning("QSslSocket: cannot call unresolved function "#func); \
145             err; \
146         } \
147         funcret _q_##func(a, b, c, d, e, f, g); \
148     }
149 
150 // ret func(arg1, arg2, arg3, arg4, arg6, arg7, arg8, arg9)
151 #  define DEFINEFUNC9(ret, func, arg1, a, arg2, b, arg3, c, arg4, d, arg5, e, arg6, f, arg7, g, arg8, h, arg9, i, err, funcret) \
152     typedef ret (*_q_PTR_##func)(arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9);   \
153     static _q_PTR_##func _q_##func = 0;                                                   \
154     ret q_##func(arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9) { \
155         if (_q_##func) { \
156             qWarning("QSslSocket: cannot call unresolved function "#func); \
157             err; \
158         }   \
159         funcret _q_##func(a, b, c, d, e, f, g, h, i); \
160     }
161 // **************** Shared declarations ******************
162 
163 #else // !defined QT_LINKED_OPENSSL
164 
165 // **************** Static declarations ******************
166 
167 // ret func(arg)
168 #  define DEFINEFUNC(ret, func, arg, a, err, funcret)				\
169     ret q_##func(arg) {	funcret func(a); }
170 
171 // ret func(arg1, arg2)
172 #  define DEFINEFUNC2(ret, func, arg1, a, arg2, b, err, funcret) \
173     ret q_##func(arg1, arg2) { funcret func(a, b); }
174 
175 // ret func(arg1, arg2, arg3)
176 #  define DEFINEFUNC3(ret, func, arg1, a, arg2, b, arg3, c, err, funcret) \
177     ret q_##func(arg1, arg2, arg3) { funcret func(a, b, c); }
178 
179 // ret func(arg1, arg2, arg3, arg4)
180 #  define DEFINEFUNC4(ret, func, arg1, a, arg2, b, arg3, c, arg4, d, err, funcret) \
181     ret q_##func(arg1, arg2, arg3, arg4) { funcret func(a, b, c, d); }
182 
183 // ret func(arg1, arg2, arg3, arg4, arg5)
184 #  define DEFINEFUNC5(ret, func, arg1, a, arg2, b, arg3, c, arg4, d, arg5, e, err, funcret) \
185     ret q_##func(arg1, arg2, arg3, arg4, arg5) { funcret func(a, b, c, d, e); }
186 
187 // ret func(arg1, arg2, arg3, arg4, arg6)
188 #  define DEFINEFUNC6(ret, func, arg1, a, arg2, b, arg3, c, arg4, d, arg5, e, arg6, f, err, funcret) \
189     ret q_##func(arg1, arg2, arg3, arg4, arg5, arg6) { funcret func(a, b, c, d, e, f); }
190 
191 // ret func(arg1, arg2, arg3, arg4, arg6, arg7)
192 #  define DEFINEFUNC7(ret, func, arg1, a, arg2, b, arg3, c, arg4, d, arg5, e, arg6, f, arg7, g, err, funcret) \
193     ret q_##func(arg1, arg2, arg3, arg4, arg5, arg6, arg7) { funcret func(a, b, c, d, e, f, g); }
194 
195 // ret func(arg1, arg2, arg3, arg4, arg6, arg7, arg8, arg9)
196 #  define DEFINEFUNC9(ret, func, arg1, a, arg2, b, arg3, c, arg4, d, arg5, e, arg6, f, arg7, g, arg8, h, arg9, i, err, funcret) \
197     ret q_##func(arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9) { funcret func(a, b, c, d, e, f, g, h, i); }
198 
199 // **************** Static declarations ******************
200 
201 #endif // !defined QT_LINKED_OPENSSL
202 
203 bool q_resolveOpenSslSymbols();
204 long q_ASN1_INTEGER_get(ASN1_INTEGER *a);
205 unsigned char * q_ASN1_STRING_data(ASN1_STRING *a);
206 int q_ASN1_STRING_length(ASN1_STRING *a);
207 int q_ASN1_STRING_to_UTF8(unsigned char **a, ASN1_STRING *b);
208 long q_BIO_ctrl(BIO *a, int b, long c, void *d);
209 int q_BIO_free(BIO *a);
210 #if OPENSSL_VERSION_NUMBER < 0x10100000L || defined(LIBRESSL_VERSION_NUMBER)
211 BIO *q_BIO_new(BIO_METHOD *a);
212 #else
213 BIO *q_BIO_new(const BIO_METHOD *a);
214 #endif
215 BIO *q_BIO_new_mem_buf(void *a, int b);
216 int q_BIO_read(BIO *a, void *b, int c);
217 #if OPENSSL_VERSION_NUMBER < 0x10100000L
218 BIO_METHOD *q_BIO_s_mem();
219 #else
220 const BIO_METHOD *q_BIO_s_mem();
221 #endif
222 int q_BIO_write(BIO *a, const void *b, int c);
223 int q_BN_num_bits(const BIGNUM *a);
224 #if OPENSSL_VERSION_NUMBER < 0x10100000L || defined(LIBRESSL_VERSION_NUMBER)
225 int q_CRYPTO_num_locks();
226 void q_CRYPTO_set_locking_callback(void (*a)(int, int, const char *, int));
227 void q_CRYPTO_set_id_callback(unsigned long (*a)());
228 void q_CRYPTO_free(void *a);
229 #else
230 #define q_CRYPTO_num_locks() 1
231 #define q_CRYPTO_set_locking_callback(a)
232 #define q_CRYPTO_set_id_callback(a)
233 void q_OPENSSL_free(void *a);
234 #endif
235 void q_DSA_free(DSA *a);
236 #if OPENSSL_VERSION_NUMBER >= 0x00908000L
237 // 0.9.8 broke SC and BC by changing this function's signature.
238 X509 *q_d2i_X509(X509 **a, const unsigned char **b, long c);
239 #else
240 X509 *q_d2i_X509(X509 **a, unsigned char **b, long c);
241 #endif
242 char *q_ERR_error_string(unsigned long a, char *b);
243 unsigned long q_ERR_get_error();
244 const EVP_CIPHER *q_EVP_des_ede3_cbc();
245 int q_EVP_PKEY_assign(EVP_PKEY *a, int b, char *c);
246 int q_EVP_PKEY_set1_RSA(EVP_PKEY *a, RSA *b);
247 int q_EVP_PKEY_set1_DSA(EVP_PKEY *a, DSA *b);
248 void q_EVP_PKEY_free(EVP_PKEY *a);
249 RSA *q_EVP_PKEY_get1_RSA(EVP_PKEY *a);
250 DSA *q_EVP_PKEY_get1_DSA(EVP_PKEY *a);
251 int q_EVP_PKEY_type(int a);
252 EVP_PKEY *q_EVP_PKEY_new();
253 int q_i2d_X509(X509 *a, unsigned char **b);
254 const char *q_OBJ_nid2sn(int a);
255 int q_OBJ_obj2nid(const ASN1_OBJECT *a);
256 #ifdef SSLEAY_MACROS
257 // ### verify
258 void *q_PEM_ASN1_read_bio(d2i_of_void *a, const char *b, BIO *c, void **d, pem_password_cb *e,
259                           void *f);
260 // ### ditto for write
261 #else
262 DSA *q_PEM_read_bio_DSAPrivateKey(BIO *a, DSA **b, pem_password_cb *c, void *d);
263 RSA *q_PEM_read_bio_RSAPrivateKey(BIO *a, RSA **b, pem_password_cb *c, void *d);
264 int q_PEM_write_bio_DSAPrivateKey(BIO *a, DSA *b, const EVP_CIPHER *c, unsigned char *d,
265                                   int e, pem_password_cb *f, void *g);
266 int q_PEM_write_bio_RSAPrivateKey(BIO *a, RSA *b, const EVP_CIPHER *c, unsigned char *d,
267                                   int e, pem_password_cb *f, void *g);
268 #endif
269 DSA *q_PEM_read_bio_DSA_PUBKEY(BIO *a, DSA **b, pem_password_cb *c, void *d);
270 RSA *q_PEM_read_bio_RSA_PUBKEY(BIO *a, RSA **b, pem_password_cb *c, void *d);
271 int q_PEM_write_bio_DSA_PUBKEY(BIO *a, DSA *b);
272 int q_PEM_write_bio_RSA_PUBKEY(BIO *a, RSA *b);
273 void q_RAND_seed(const void *a, int b);
274 int q_RAND_status();
275 void q_RSA_free(RSA *a);
276 #if OPENSSL_VERSION_NUMBER < 0x10100000L || defined(LIBRESSL_VERSION_NUMBER)
277 int q_sk_num(STACK *a);
278 void q_sk_pop_free(STACK *a, void (*b)(void *));
279 #if OPENSSL_VERSION_NUMBER >= 0x10000000L
280 void q_sk_free(_STACK *a);
281 void * q_sk_value(STACK *a, int b);
282 #else
283 void q_sk_free(STACK *a);
284 char * q_sk_value(STACK *a, int b);
285 #endif
286 #else
287 int q_OPENSSL_sk_num(STACK *a);
288 void q_OPENSSL_sk_pop_free(STACK *a, void (*b)(void *));
289 void q_OPENSSL_sk_free(_STACK *a);
290 void * q_OPENSSL_sk_value(STACK *a, int b);
291 #define q_sk_num q_OPENSSL_sk_num
292 #define q_sk_pop_free q_OPENSSL_sk_pop_free
293 #define q_sk_free q_OPENSSL_sk_free
294 #define q_sk_value q_OPENSSL_sk_value
295 #endif
296 int q_SSL_accept(SSL *a);
297 int q_SSL_clear(SSL *a);
298 char *q_SSL_CIPHER_description(SSL_CIPHER *a, char *b, int c);
299 int q_SSL_connect(SSL *a);
300 #if OPENSSL_VERSION_NUMBER >= 0x00908000L
301 // 0.9.8 broke SC and BC by changing this function's signature.
302 int q_SSL_CTX_check_private_key(const SSL_CTX *a);
303 #else
304 int q_SSL_CTX_check_private_key(SSL_CTX *a);
305 #endif
306 long q_SSL_CTX_ctrl(SSL_CTX *a, int b, long c, void *d);
307 void q_SSL_CTX_free(SSL_CTX *a);
308 #if OPENSSL_VERSION_NUMBER >= 0x10000000L
309 SSL_CTX *q_SSL_CTX_new(const SSL_METHOD *a);
310 #else
311 SSL_CTX *q_SSL_CTX_new(SSL_METHOD *a);
312 #endif
313 int q_SSL_CTX_set_cipher_list(SSL_CTX *a, const char *b);
314 int q_SSL_CTX_set_default_verify_paths(SSL_CTX *a);
315 void q_SSL_CTX_set_verify(SSL_CTX *a, int b, int (*c)(int, X509_STORE_CTX *));
316 void q_SSL_CTX_set_verify_depth(SSL_CTX *a, int b);
317 int q_SSL_CTX_use_certificate(SSL_CTX *a, X509 *b);
318 int q_SSL_CTX_use_certificate_file(SSL_CTX *a, const char *b, int c);
319 int q_SSL_CTX_use_PrivateKey(SSL_CTX *a, EVP_PKEY *b);
320 int q_SSL_CTX_use_RSAPrivateKey(SSL_CTX *a, RSA *b);
321 int q_SSL_CTX_use_PrivateKey_file(SSL_CTX *a, const char *b, int c);
322 void q_SSL_free(SSL *a);
323 #if OPENSSL_VERSION_NUMBER >= 0x00908000L
324 // 0.9.8 broke SC and BC by changing this function's signature.
325 STACK_OF(SSL_CIPHER) *q_SSL_get_ciphers(const SSL *a);
326 #else
327 STACK_OF(SSL_CIPHER) *q_SSL_get_ciphers(SSL *a);
328 #endif
329 #if OPENSSL_VERSION_NUMBER >= 0x10000000L
330 const SSL_CIPHER *q_SSL_get_current_cipher(SSL *a);
331 #else
332 SSL_CIPHER *q_SSL_get_current_cipher(SSL *a);
333 #endif
334 int q_SSL_get_error(SSL *a, int b);
335 STACK_OF(X509) *q_SSL_get_peer_cert_chain(SSL *a);
336 X509 *q_SSL_get_peer_certificate(SSL *a);
337 #if OPENSSL_VERSION_NUMBER >= 0x00908000L
338 // 0.9.8 broke SC and BC by changing this function's signature.
339 long q_SSL_get_verify_result(const SSL *a);
340 #else
341 long q_SSL_get_verify_result(SSL *a);
342 #endif
343 #if OPENSSL_VERSION_NUMBER < 0x10100000L || defined(LIBRESSL_VERSION_NUMBER)
344 int q_SSL_library_init();
345 void q_SSL_load_error_strings();
346 #else
347 int q_OPENSSL_init_ssl(uint64_t opts, const OPENSSL_INIT_SETTINGS *settings);
348 #define q_SSL_library_init() q_OPENSSL_init_ssl(0, NULL)
349 #define q_SSL_load_error_strings() q_OPENSSL_init_ssl(OPENSSL_INIT_LOAD_SSL_STRINGS | OPENSSL_INIT_LOAD_CRYPTO_STRINGS, NULL)
350 #endif
351 SSL *q_SSL_new(SSL_CTX *a);
352 #if OPENSSL_VERSION_NUMBER >= 0x0090806fL && !defined(OPENSSL_NO_TLSEXT)
353 long q_SSL_ctrl(SSL *ssl,int cmd, long larg, void *parg);
354 #endif
355 int q_SSL_read(SSL *a, void *b, int c);
356 void q_SSL_set_bio(SSL *a, BIO *b, BIO *c);
357 void q_SSL_set_accept_state(SSL *a);
358 void q_SSL_set_connect_state(SSL *a);
359 int q_SSL_shutdown(SSL *a);
360 #if OPENSSL_VERSION_NUMBER >= 0x10000000L
361 const SSL_METHOD *q_SSLv2_client_method();
362 const SSL_METHOD *q_SSLv3_client_method();
363 #if OPENSSL_VERSION_NUMBER < 0x10100000L || defined(LIBRESSL_VERSION_NUMBER)
364 const SSL_METHOD *q_SSLv23_client_method();
365 #else
366 const SSL_METHOD *q_TLS_client_method();
367 #define q_SSLv23_client_method q_TLS_client_method
368 #endif
369 const SSL_METHOD *q_TLSv1_client_method();
370 const SSL_METHOD *q_SSLv2_server_method();
371 const SSL_METHOD *q_SSLv3_server_method();
372 #if OPENSSL_VERSION_NUMBER < 0x10100000L || defined(LIBRESSL_VERSION_NUMBER)
373 const SSL_METHOD *q_SSLv23_server_method();
374 #else
375 const SSL_METHOD *q_TLS_server_method();
376 #define q_SSLv23_server_method q_TLS_server_method
377 #endif
378 const SSL_METHOD *q_TLSv1_server_method();
379 #else
380 SSL_METHOD *q_SSLv2_client_method();
381 SSL_METHOD *q_SSLv3_client_method();
382 SSL_METHOD *q_SSLv23_client_method();
383 SSL_METHOD *q_TLSv1_client_method();
384 SSL_METHOD *q_SSLv2_server_method();
385 SSL_METHOD *q_SSLv3_server_method();
386 SSL_METHOD *q_SSLv23_server_method();
387 SSL_METHOD *q_TLSv1_server_method();
388 #endif
389 int q_SSL_write(SSL *a, const void *b, int c);
390 int q_X509_cmp(X509 *a, X509 *b);
391 #ifdef SSLEAY_MACROS
392 void *q_ASN1_dup(i2d_of_void *i2d, d2i_of_void *d2i, char *x);
393 #define q_X509_dup(x509) (X509 *)q_ASN1_dup((i2d_of_void *)q_i2d_X509, \
394 		(d2i_of_void *)q_d2i_X509,(char *)x509)
395 #else
396 X509 *q_X509_dup(X509 *a);
397 #endif
398 ASN1_OBJECT *q_X509_EXTENSION_get_object(X509_EXTENSION *a);
399 void q_X509_free(X509 *a);
400 X509_EXTENSION *q_X509_get_ext(X509 *a, int b);
401 int q_X509_get_ext_count(X509 *a);
402 void *q_X509_get_ext_d2i(X509 *a, int b, int *c, int *d);
403 X509_NAME *q_X509_get_issuer_name(X509 *a);
404 X509_NAME *q_X509_get_subject_name(X509 *a);
405 int q_X509_verify_cert(X509_STORE_CTX *ctx);
406 int q_X509_NAME_entry_count(X509_NAME *a);
407 X509_NAME_ENTRY *q_X509_NAME_get_entry(X509_NAME *a,int b);
408 ASN1_STRING *q_X509_NAME_ENTRY_get_data(X509_NAME_ENTRY *a);
409 ASN1_OBJECT *q_X509_NAME_ENTRY_get_object(X509_NAME_ENTRY *a);
410 EVP_PKEY *q_X509_PUBKEY_get(X509_PUBKEY *a);
411 void q_X509_STORE_free(X509_STORE *store);
412 X509_STORE *q_X509_STORE_new();
413 int q_X509_STORE_add_cert(X509_STORE *ctx, X509 *x);
414 void q_X509_STORE_CTX_free(X509_STORE_CTX *storeCtx);
415 int q_X509_STORE_CTX_init(X509_STORE_CTX *ctx, X509_STORE *store,
416                           X509 *x509, STACK_OF(X509) *chain);
417 X509_STORE_CTX *q_X509_STORE_CTX_new();
418 int q_X509_STORE_CTX_set_purpose(X509_STORE_CTX *ctx, int purpose);
419 int q_X509_STORE_CTX_get_error(X509_STORE_CTX *ctx);
420 int q_X509_STORE_CTX_get_error_depth(X509_STORE_CTX *ctx);
421 X509 *q_X509_STORE_CTX_get_current_cert(X509_STORE_CTX *ctx);
422 #if OPENSSL_VERSION_NUMBER < 0x10100000L || defined(LIBRESSL_VERSION_NUMBER)
423 STACK_OF(X509) *q_X509_STORE_CTX_get_chain(X509_STORE_CTX *ctx);
424 #else
425 STACK_OF(X509) *q_X509_STORE_CTX_get0_chain(X509_STORE_CTX *ctx);
426 #define q_X509_STORE_CTX_get_chain q_X509_STORE_CTX_get0_chain
427 #endif
428 
429 #define q_BIO_get_mem_data(b, pp) (int)q_BIO_ctrl(b,BIO_CTRL_INFO,0,(char *)pp)
430 #define q_BIO_pending(b) (int)q_BIO_ctrl(b,BIO_CTRL_PENDING,0,NULL)
431 #ifdef SSLEAY_MACROS
432 int 	q_i2d_DSAPrivateKey(const DSA *a, unsigned char **pp);
433 int 	q_i2d_RSAPrivateKey(const RSA *a, unsigned char **pp);
434 RSA *q_d2i_RSAPrivateKey(RSA **a, unsigned char **pp, long length);
435 DSA *q_d2i_DSAPrivateKey(DSA **a, unsigned char **pp, long length);
436 #define	q_PEM_read_bio_RSAPrivateKey(bp, x, cb, u) \
437         (RSA *)q_PEM_ASN1_read_bio( \
438         (void *(*)(void**, const unsigned char**, long int))q_d2i_RSAPrivateKey, PEM_STRING_RSA, bp, (void **)x, cb, u)
439 #define	q_PEM_read_bio_DSAPrivateKey(bp, x, cb, u) \
440         (DSA *)q_PEM_ASN1_read_bio( \
441         (void *(*)(void**, const unsigned char**, long int))q_d2i_DSAPrivateKey, PEM_STRING_DSA, bp, (void **)x, cb, u)
442 #define	q_PEM_write_bio_RSAPrivateKey(bp,x,enc,kstr,klen,cb,u) \
443 		PEM_ASN1_write_bio((int (*)(void*, unsigned char**))q_i2d_RSAPrivateKey,PEM_STRING_RSA,\
444 			bp,(char *)x,enc,kstr,klen,cb,u)
445 #define	q_PEM_write_bio_DSAPrivateKey(bp,x,enc,kstr,klen,cb,u) \
446 		PEM_ASN1_write_bio((int (*)(void*, unsigned char**))q_i2d_DSAPrivateKey,PEM_STRING_DSA,\
447 			bp,(char *)x,enc,kstr,klen,cb,u)
448 #endif
449 
450 X509_STORE * q_SSL_CTX_get_cert_store(const SSL_CTX *ctx);
451 ASN1_INTEGER * q_X509_get_serialNumber(X509 *x);
452 
453 #if OPENSSL_VERSION_NUMBER < 0x10100000L || defined(LIBRESSL_VERSION_NUMBER)
454 #define q_SSL_CTX_set_options(ctx,op) q_SSL_CTX_ctrl((ctx),SSL_CTRL_OPTIONS,(op),NULL)
455 #define q_X509_get_version(x) X509_get_version(x)
456 #else
457 int q_EVP_PKEY_id(const EVP_PKEY *pkey);
458 int q_EVP_PKEY_base_id(const EVP_PKEY *pkey);
459 int q_SSL_CIPHER_get_bits(const SSL_CIPHER *cipher, int *alg_bits);
460 long q_SSL_CTX_set_options(SSL_CTX *ctx, long options);
461 long q_X509_get_version(X509 *x);
462 X509_PUBKEY * q_X509_get_X509_PUBKEY(X509 *x);
463 int q_RSA_bits(const RSA *rsa);
464 int q_DSA_security_bits(const DSA *dsa);
465 void q_DSA_get0_pqg(const DSA *d, const BIGNUM **p, const BIGNUM **q, const BIGNUM **g);
466 #endif
467 
468 #define q_SKM_sk_num(type, st) ((int (*)(const STACK_OF(type) *))q_sk_num)(st)
469 #define q_SKM_sk_value(type, st,i) ((type * (*)(const STACK_OF(type) *, int))q_sk_value)(st, i)
470 #define q_sk_GENERAL_NAME_num(st) q_SKM_sk_num(GENERAL_NAME, (st))
471 #define q_sk_GENERAL_NAME_value(st, i) q_SKM_sk_value(GENERAL_NAME, (st), (i))
472 #define q_sk_X509_num(st) q_SKM_sk_num(X509, (st))
473 #define q_sk_X509_value(st, i) q_SKM_sk_value(X509, (st), (i))
474 #define q_sk_SSL_CIPHER_num(st) q_SKM_sk_num(SSL_CIPHER, (st))
475 #define q_sk_SSL_CIPHER_value(st, i) q_SKM_sk_value(SSL_CIPHER, (st), (i))
476 #define q_SSL_CTX_add_extra_chain_cert(ctx,x509) \
477         q_SSL_CTX_ctrl(ctx,SSL_CTRL_EXTRA_CHAIN_CERT,0,(char *)x509)
478 
479 #if OPENSSL_VERSION_NUMBER < 0x10100000L || defined(LIBRESSL_VERSION_NUMBER)
480 #define q_X509_get_notAfter(x) X509_get_notAfter(x)
481 #define q_X509_get_notBefore(x) X509_get_notBefore(x)
482 #else
483 ASN1_TIME *q_X509_getm_notAfter(X509 *x);
484 ASN1_TIME *q_X509_getm_notBefore(X509 *x);
485 #define q_X509_get_notAfter(x) q_X509_getm_notAfter(x)
486 #define q_X509_get_notBefore(x) q_X509_getm_notBefore(x)
487 #endif
488 
489 #define q_EVP_PKEY_assign_RSA(pkey,rsa) q_EVP_PKEY_assign((pkey),EVP_PKEY_RSA,\
490 					(char *)(rsa))
491 #define q_EVP_PKEY_assign_DSA(pkey,dsa) q_EVP_PKEY_assign((pkey),EVP_PKEY_DSA,\
492 					(char *)(dsa))
493 #ifdef OPENSSL_LOAD_CONF
494 #define q_OpenSSL_add_all_algorithms() q_OPENSSL_add_all_algorithms_conf()
495 #else
496 #define q_OpenSSL_add_all_algorithms() q_OPENSSL_add_all_algorithms_noconf()
497 #endif
498 #if OPENSSL_VERSION_NUMBER < 0x10100000L || defined(LIBRESSL_VERSION_NUMBER)
499 void q_OPENSSL_add_all_algorithms_noconf();
500 void q_OPENSSL_add_all_algorithms_conf();
501 #else
502 int q_OPENSSL_init_crypto(uint64_t opts, const OPENSSL_INIT_SETTINGS *settings);
503 #define q_OPENSSL_add_all_algorithms_conf() q_OPENSSL_init_crypto(OPENSSL_INIT_ADD_ALL_CIPHERS | OPENSSL_INIT_ADD_ALL_DIGESTS | OPENSSL_INIT_LOAD_CONFIG, NULL)
504 #  define q_OPENSSL_add_all_algorithms_noconf() q_OPENSSL_init_crypto(OPENSSL_INIT_ADD_ALL_CIPHERS | OPENSSL_INIT_ADD_ALL_DIGESTS, NULL)
505 #endif
506 int q_SSL_CTX_load_verify_locations(SSL_CTX *ctx, const char *CAfile, const char *CApath);
507 #if OPENSSL_VERSION_NUMBER < 0x10100000L || defined(LIBRESSL_VERSION_NUMBER)
508 long q_SSLeay();
509 #else
510 unsigned long q_OpenSSL_version_num();
511 #define q_SSLeay q_OpenSSL_version_num
512 #endif
513 
514 // Helper function
515 class QDateTime;
516 QDateTime q_getTimeFromASN1(const ASN1_TIME *aTime);
517 
518 QT_END_NAMESPACE
519 
520 #endif
521