1/****************************************************************************
2**
3** Copyright (C) 2017 The Qt Company Ltd.
4** Copyright (C) 2014 BlackBerry Limited. All rights reserved.
5** Contact: https://www.qt.io/licensing/
6**
7** This file is part of the QtNetwork module of the Qt Toolkit.
8**
9** $QT_BEGIN_LICENSE:LGPL$
10** Commercial License Usage
11** Licensees holding valid commercial Qt licenses may use this file in
12** accordance with the commercial license agreement provided with the
13** Software or, alternatively, in accordance with the terms contained in
14** a written agreement between you and The Qt Company. For licensing terms
15** and conditions see https://www.qt.io/terms-conditions. For further
16** information use the contact form at https://www.qt.io/contact-us.
17**
18** GNU Lesser General Public License Usage
19** Alternatively, this file may be used under the terms of the GNU Lesser
20** General Public License version 3 as published by the Free Software
21** Foundation and appearing in the file LICENSE.LGPL3 included in the
22** packaging of this file. Please review the following information to
23** ensure the GNU Lesser General Public License version 3 requirements
24** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
25**
26** GNU General Public License Usage
27** Alternatively, this file may be used under the terms of the GNU
28** General Public License version 2.0 or (at your option) the GNU General
29** Public license version 3 or any later version approved by the KDE Free
30** Qt Foundation. The licenses are as published by the Free Software
31** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
32** included in the packaging of this file. Please review the following
33** information to ensure the GNU General Public License requirements will
34** be met: https://www.gnu.org/licenses/gpl-2.0.html and
35** https://www.gnu.org/licenses/gpl-3.0.html.
36**
37** $QT_END_LICENSE$
38**
39****************************************************************************/
40
41/****************************************************************************
42**
43** In addition, as a special exception, the copyright holders listed above give
44** permission to link the code of its release of Qt with the OpenSSL project's
45** "OpenSSL" library (or modified versions of the "OpenSSL" library that use the
46** same license as the original version), and distribute the linked executables.
47**
48** You must comply with the GNU General Public License version 2 in all
49** respects for all of the code used other than the "OpenSSL" code. If you
50** modify this file, you may extend this exception to your version of the file,
51** but you are not obligated to do so. If you do not wish to do so, delete
52** this exception statement from your version of this file.
53**
54****************************************************************************/
55
56#ifndef QSSLSOCKET_OPENSSL_SYMBOLS_P_H
57#define QSSLSOCKET_OPENSSL_SYMBOLS_P_H
58
59
60//
61// W A R N I N G
62// -------------
63//
64// This file is not part of the Qt API. It exists purely as an
65// implementation detail. This header file may change from version to
66// version without notice, or even be removed.
67//
68// We mean it.
69//
70
71#include <QtNetwork/private/qtnetworkglobal_p.h>
72#include "qsslsocket_openssl_p.h"
73#include <QtCore/qglobal.h>
74
75#if QT_CONFIG(ocsp)
76#include "qocsp_p.h"
77#endif
78
79QT_BEGIN_NAMESPACE
80
81#define DUMMYARG
82
83#if !defined QT_LINKED_OPENSSL
84// **************** Shared declarations ******************
85// ret func(arg)
86
87# define DEFINEFUNC(ret, func, arg, a, err, funcret) \
88 typedef ret (*_q_PTR_##func)(arg); \
89 static _q_PTR_##func _q_##func = 0; \
90 ret q_##func(arg) { \
91 if (Q_UNLIKELY(!_q_##func)) { \
92 qsslSocketUnresolvedSymbolWarning(#func); \
93 err; \
94 } \
95 funcret _q_##func(a); \
96 }
97
98// ret func(arg1, arg2)
99# define DEFINEFUNC2(ret, func, arg1, a, arg2, b, err, funcret) \
100 typedef ret (*_q_PTR_##func)(arg1, arg2); \
101 static _q_PTR_##func _q_##func = 0; \
102 ret q_##func(arg1, arg2) { \
103 if (Q_UNLIKELY(!_q_##func)) { \
104 qsslSocketUnresolvedSymbolWarning(#func);\
105 err; \
106 } \
107 funcret _q_##func(a, b); \
108 }
109
110// ret func(arg1, arg2, arg3)
111# define DEFINEFUNC3(ret, func, arg1, a, arg2, b, arg3, c, err, funcret) \
112 typedef ret (*_q_PTR_##func)(arg1, arg2, arg3); \
113 static _q_PTR_##func _q_##func = 0; \
114 ret q_##func(arg1, arg2, arg3) { \
115 if (Q_UNLIKELY(!_q_##func)) { \
116 qsslSocketUnresolvedSymbolWarning(#func); \
117 err; \
118 } \
119 funcret _q_##func(a, b, c); \
120 }
121
122// ret func(arg1, arg2, arg3, arg4)
123# define DEFINEFUNC4(ret, func, arg1, a, arg2, b, arg3, c, arg4, d, err, funcret) \
124 typedef ret (*_q_PTR_##func)(arg1, arg2, arg3, arg4); \
125 static _q_PTR_##func _q_##func = 0; \
126 ret q_##func(arg1, arg2, arg3, arg4) { \
127 if (Q_UNLIKELY(!_q_##func)) { \
128 qsslSocketUnresolvedSymbolWarning(#func); \
129 err; \
130 } \
131 funcret _q_##func(a, b, c, d); \
132 }
133
134// ret func(arg1, arg2, arg3, arg4, arg5)
135# define DEFINEFUNC5(ret, func, arg1, a, arg2, b, arg3, c, arg4, d, arg5, e, err, funcret) \
136 typedef ret (*_q_PTR_##func)(arg1, arg2, arg3, arg4, arg5); \
137 static _q_PTR_##func _q_##func = 0; \
138 ret q_##func(arg1, arg2, arg3, arg4, arg5) { \
139 if (Q_UNLIKELY(!_q_##func)) { \
140 qsslSocketUnresolvedSymbolWarning(#func); \
141 err; \
142 } \
143 funcret _q_##func(a, b, c, d, e); \
144 }
145
146// ret func(arg1, arg2, arg3, arg4, arg6)
147# define DEFINEFUNC6(ret, func, arg1, a, arg2, b, arg3, c, arg4, d, arg5, e, arg6, f, err, funcret) \
148 typedef ret (*_q_PTR_##func)(arg1, arg2, arg3, arg4, arg5, arg6); \
149 static _q_PTR_##func _q_##func = 0; \
150 ret q_##func(arg1, arg2, arg3, arg4, arg5, arg6) { \
151 if (Q_UNLIKELY(!_q_##func)) { \
152 qsslSocketUnresolvedSymbolWarning(#func); \
153 err; \
154 } \
155 funcret _q_##func(a, b, c, d, e, f); \
156 }
157
158// ret func(arg1, arg2, arg3, arg4, arg6, arg7)
159# define DEFINEFUNC7(ret, func, arg1, a, arg2, b, arg3, c, arg4, d, arg5, e, arg6, f, arg7, g, err, funcret) \
160 typedef ret (*_q_PTR_##func)(arg1, arg2, arg3, arg4, arg5, arg6, arg7); \
161 static _q_PTR_##func _q_##func = 0; \
162 ret q_##func(arg1, arg2, arg3, arg4, arg5, arg6, arg7) { \
163 if (Q_UNLIKELY(!_q_##func)) { \
164 qsslSocketUnresolvedSymbolWarning(#func); \
165 err; \
166 } \
167 funcret _q_##func(a, b, c, d, e, f, g); \
168 }
169
170// ret func(arg1, arg2, arg3, arg4, arg6, arg7, arg8, arg9)
171# define DEFINEFUNC9(ret, func, arg1, a, arg2, b, arg3, c, arg4, d, arg5, e, arg6, f, arg7, g, arg8, h, arg9, i, err, funcret) \
172 typedef ret (*_q_PTR_##func)(arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9); \
173 static _q_PTR_##func _q_##func = 0; \
174 ret q_##func(arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9) { \
175 if (Q_UNLIKELY(!_q_##func)) { \
176 qsslSocketUnresolvedSymbolWarning(#func); \
177 err; \
178 } \
179 funcret _q_##func(a, b, c, d, e, f, g, h, i); \
180 }
181// **************** Shared declarations ******************
182
183#else // !defined QT_LINKED_OPENSSL
184
185// **************** Static declarations ******************
186
187// ret func(arg)
188# define DEFINEFUNC(ret, func, arg, a, err, funcret) \
189 ret q_##func(arg) { funcret func(a); }
190
191// ret func(arg1, arg2)
192# define DEFINEFUNC2(ret, func, arg1, a, arg2, b, err, funcret) \
193 ret q_##func(arg1, arg2) { funcret func(a, b); }
194
195// ret func(arg1, arg2, arg3)
196# define DEFINEFUNC3(ret, func, arg1, a, arg2, b, arg3, c, err, funcret) \
197 ret q_##func(arg1, arg2, arg3) { funcret func(a, b, c); }
198
199// ret func(arg1, arg2, arg3, arg4)
200# define DEFINEFUNC4(ret, func, arg1, a, arg2, b, arg3, c, arg4, d, err, funcret) \
201 ret q_##func(arg1, arg2, arg3, arg4) { funcret func(a, b, c, d); }
202
203// ret func(arg1, arg2, arg3, arg4, arg5)
204# define DEFINEFUNC5(ret, func, arg1, a, arg2, b, arg3, c, arg4, d, arg5, e, err, funcret) \
205 ret q_##func(arg1, arg2, arg3, arg4, arg5) { funcret func(a, b, c, d, e); }
206
207// ret func(arg1, arg2, arg3, arg4, arg6)
208# define DEFINEFUNC6(ret, func, arg1, a, arg2, b, arg3, c, arg4, d, arg5, e, arg6, f, err, funcret) \
209 ret q_##func(arg1, arg2, arg3, arg4, arg5, arg6) { funcret func(a, b, c, d, e, f); }
210
211// ret func(arg1, arg2, arg3, arg4, arg6, arg7)
212# define DEFINEFUNC7(ret, func, arg1, a, arg2, b, arg3, c, arg4, d, arg5, e, arg6, f, arg7, g, err, funcret) \
213 ret q_##func(arg1, arg2, arg3, arg4, arg5, arg6, arg7) { funcret func(a, b, c, d, e, f, g); }
214
215// ret func(arg1, arg2, arg3, arg4, arg6, arg7, arg8, arg9)
216# define DEFINEFUNC9(ret, func, arg1, a, arg2, b, arg3, c, arg4, d, arg5, e, arg6, f, arg7, g, arg8, h, arg9, i, err, funcret) \
217 ret q_##func(arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9) { funcret func(a, b, c, d, e, f, g, h, i); }
218
219// **************** Static declarations ******************
220
221#endif // !defined QT_LINKED_OPENSSL
222
223// TODO: the following lines previously were a part of 1.1 - specific header.
224// To reduce the amount of the change, I'm directly copying and pasting the
225// content of the header here. Later, can be better sorted/split into groups,
226// depending on the functionality.
227
228const unsigned char * q_ASN1_STRING_get0_data(const ASN1_STRING *x);
229
230Q_AUTOTEST_EXPORT BIO *q_BIO_new(const BIO_METHOD *a);
231Q_AUTOTEST_EXPORT const BIO_METHOD *q_BIO_s_mem();
232
233int q_DSA_bits(DSA *a);
234void q_AUTHORITY_INFO_ACCESS_free(AUTHORITY_INFO_ACCESS *a);
235int q_EVP_CIPHER_CTX_reset(EVP_CIPHER_CTX *c);
236Q_AUTOTEST_EXPORT int q_EVP_PKEY_up_ref(EVP_PKEY *a);
237EVP_PKEY_CTX *q_EVP_PKEY_CTX_new(EVP_PKEY *pkey, ENGINE *e);
238void q_EVP_PKEY_CTX_free(EVP_PKEY_CTX *ctx);
239int q_EVP_PKEY_param_check(EVP_PKEY_CTX *ctx);
240int q_EVP_PKEY_base_id(EVP_PKEY *a);
241int q_RSA_bits(RSA *a);
242Q_AUTOTEST_EXPORT int q_OPENSSL_sk_num(OPENSSL_STACK *a);
243Q_AUTOTEST_EXPORT void q_OPENSSL_sk_pop_free(OPENSSL_STACK *a, void (*b)(void *));
244Q_AUTOTEST_EXPORT OPENSSL_STACK *q_OPENSSL_sk_new_null();
245Q_AUTOTEST_EXPORT void q_OPENSSL_sk_push(OPENSSL_STACK *st, void *data);
246Q_AUTOTEST_EXPORT void q_OPENSSL_sk_free(OPENSSL_STACK *a);
247Q_AUTOTEST_EXPORT void * q_OPENSSL_sk_value(OPENSSL_STACK *a, int b);
248int q_SSL_session_reused(SSL *a);
249unsigned long q_SSL_CTX_set_options(SSL_CTX *ctx, unsigned long op);
250int q_OPENSSL_init_ssl(uint64_t opts, const OPENSSL_INIT_SETTINGS *settings);
251size_t q_SSL_get_client_random(SSL *a, unsigned char *out, size_t outlen);
252size_t q_SSL_SESSION_get_master_key(const SSL_SESSION *session, unsigned char *out, size_t outlen);
253int q_CRYPTO_get_ex_new_index(int class_index, long argl, void *argp, CRYPTO_EX_new *new_func, CRYPTO_EX_dup *dup_func, CRYPTO_EX_free *free_func);
254const SSL_METHOD *q_TLS_method();
255const SSL_METHOD *q_TLS_client_method();
256const SSL_METHOD *q_TLS_server_method();
257ASN1_TIME *q_X509_getm_notBefore(X509 *a);
258ASN1_TIME *q_X509_getm_notAfter(X509 *a);
259void q_ASN1_item_free(ASN1_VALUE *val, const ASN1_ITEM *it);
260void q_X509V3_conf_free(CONF_VALUE *val);
261
262Q_AUTOTEST_EXPORT void q_X509_up_ref(X509 *a);
263long q_X509_get_version(X509 *a);
264EVP_PKEY *q_X509_get_pubkey(X509 *a);
265void q_X509_STORE_set_verify_cb(X509_STORE *ctx, X509_STORE_CTX_verify_cb verify_cb);
266int q_X509_STORE_set_ex_data(X509_STORE *ctx, int idx, void *data);
267void *q_X509_STORE_get_ex_data(X509_STORE *r, int idx);
268STACK_OF(X509) *q_X509_STORE_CTX_get0_chain(X509_STORE_CTX *ctx);
269void q_DH_get0_pqg(const DH *dh, const BIGNUM **p, const BIGNUM **q, const BIGNUM **g);
270int q_DH_bits(DH *dh);
271
272# define q_SSL_load_error_strings() q_OPENSSL_init_ssl(OPENSSL_INIT_LOAD_SSL_STRINGS \
273 | OPENSSL_INIT_LOAD_CRYPTO_STRINGS, NULL)
274
275#define q_SKM_sk_num(st) q_OPENSSL_sk_num((OPENSSL_STACK *)st)
276#define q_SKM_sk_value(type, st,i) (type *)q_OPENSSL_sk_value((OPENSSL_STACK *)st, i)
277
278#define q_OPENSSL_add_all_algorithms_conf() q_OPENSSL_init_crypto(OPENSSL_INIT_ADD_ALL_CIPHERS \
279 | OPENSSL_INIT_ADD_ALL_DIGESTS \
280 | OPENSSL_INIT_LOAD_CONFIG, NULL)
281#define q_OPENSSL_add_all_algorithms_noconf() q_OPENSSL_init_crypto(OPENSSL_INIT_ADD_ALL_CIPHERS \
282 | OPENSSL_INIT_ADD_ALL_DIGESTS, NULL)
283
284int q_OPENSSL_init_crypto(uint64_t opts, const OPENSSL_INIT_SETTINGS *settings);
285long q_OpenSSL_version_num();
286const char *q_OpenSSL_version(int type);
287
288unsigned long q_SSL_SESSION_get_ticket_lifetime_hint(const SSL_SESSION *session);
289unsigned long q_SSL_set_options(SSL *s, unsigned long op);
290
291#ifdef TLS1_3_VERSION
292int q_SSL_CTX_set_ciphersuites(SSL_CTX *ctx, const char *str);
293
294// The functions below do not really have to be ifdefed like this, but for now
295// they only used in TLS 1.3 handshake (and probably future versions).
296// Plus, 'is resumalbe' is OpenSSL 1.1.1-only (and again we need it for
297// TLS 1.3-specific session management).
298
299extern "C"
300{
301using NewSessionCallback = int (*)(SSL *, SSL_SESSION *);
302}
303
304void q_SSL_CTX_sess_set_new_cb(SSL_CTX *ctx, NewSessionCallback cb);
305int q_SSL_SESSION_is_resumable(const SSL_SESSION *s);
306
307#define q_SSL_CTX_set_session_cache_mode(ctx,m) \
308 q_SSL_CTX_ctrl(ctx,SSL_CTRL_SET_SESS_CACHE_MODE,m,NULL)
309
310#endif
311
312#if QT_CONFIG(dtls)
313// Functions and types required for DTLS support:
314extern "C"
315{
316
317typedef int (*CookieVerifyCallback)(SSL *, const unsigned char *, unsigned);
318typedef int (*DgramWriteCallback) (BIO *, const char *, int);
319typedef int (*DgramReadCallback) (BIO *, char *, int);
320typedef int (*DgramPutsCallback) (BIO *, const char *);
321typedef long (*DgramCtrlCallback) (BIO *, int, long, void *);
322typedef int (*DgramCreateCallback) (BIO *);
323typedef int (*DgramDestroyCallback) (BIO *);
324
325}
326
327int q_DTLSv1_listen(SSL *s, BIO_ADDR *client);
328BIO_ADDR *q_BIO_ADDR_new();
329void q_BIO_ADDR_free(BIO_ADDR *ap);
330
331// API we need for a custom dgram BIO:
332
333BIO_METHOD *q_BIO_meth_new(int type, const char *name);
334void q_BIO_meth_free(BIO_METHOD *biom);
335int q_BIO_meth_set_write(BIO_METHOD *biom, DgramWriteCallback);
336int q_BIO_meth_set_read(BIO_METHOD *biom, DgramReadCallback);
337int q_BIO_meth_set_puts(BIO_METHOD *biom, DgramPutsCallback);
338int q_BIO_meth_set_ctrl(BIO_METHOD *biom, DgramCtrlCallback);
339int q_BIO_meth_set_create(BIO_METHOD *biom, DgramCreateCallback);
340int q_BIO_meth_set_destroy(BIO_METHOD *biom, DgramDestroyCallback);
341
342#endif // dtls
343
344void q_BIO_set_data(BIO *a, void *ptr);
345void *q_BIO_get_data(BIO *a);
346void q_BIO_set_init(BIO *a, int init);
347int q_BIO_get_shutdown(BIO *a);
348void q_BIO_set_shutdown(BIO *a, int shut);
349
350#if QT_CONFIG(ocsp)
351const OCSP_CERTID *q_OCSP_SINGLERESP_get0_id(const OCSP_SINGLERESP *x);
352#endif // ocsp
353
354#define q_SSL_CTX_set_min_proto_version(ctx, version) \
355 q_SSL_CTX_ctrl(ctx, SSL_CTRL_SET_MIN_PROTO_VERSION, version, nullptr)
356
357#define q_SSL_CTX_set_max_proto_version(ctx, version) \
358 q_SSL_CTX_ctrl(ctx, SSL_CTRL_SET_MAX_PROTO_VERSION, version, nullptr)
359
360extern "C" {
361typedef int (*q_SSL_psk_use_session_cb_func_t)(SSL *, const EVP_MD *, const unsigned char **, size_t *,
362 SSL_SESSION **);
363}
364void q_SSL_set_psk_use_session_callback(SSL *s, q_SSL_psk_use_session_cb_func_t);
365// Here the content of the 1.1 header ends.
366
367bool q_resolveOpenSslSymbols();
368long q_ASN1_INTEGER_get(ASN1_INTEGER *a);
369int q_ASN1_INTEGER_cmp(const ASN1_INTEGER *x, const ASN1_INTEGER *y);
370int q_ASN1_STRING_length(ASN1_STRING *a);
371int q_ASN1_STRING_to_UTF8(unsigned char **a, ASN1_STRING *b);
372long q_BIO_ctrl(BIO *a, int b, long c, void *d);
373Q_AUTOTEST_EXPORT int q_BIO_free(BIO *a);
374BIO *q_BIO_new_mem_buf(void *a, int b);
375int q_BIO_read(BIO *a, void *b, int c);
376Q_AUTOTEST_EXPORT int q_BIO_write(BIO *a, const void *b, int c);
377int q_BN_num_bits(const BIGNUM *a);
378int q_BN_is_word(BIGNUM *a, BN_ULONG w);
379BN_ULONG q_BN_mod_word(const BIGNUM *a, BN_ULONG w);
380
381#ifndef OPENSSL_NO_EC
382const EC_GROUP* q_EC_KEY_get0_group(const EC_KEY* k);
383int q_EC_GROUP_get_degree(const EC_GROUP* g);
384#endif // OPENSSL_NO_EC
385
386DSA *q_DSA_new();
387void q_DSA_free(DSA *a);
388X509 *q_d2i_X509(X509 **a, const unsigned char **b, long c);
389char *q_ERR_error_string(unsigned long a, char *b);
390void q_ERR_error_string_n(unsigned long e, char *buf, size_t len);
391unsigned long q_ERR_get_error();
392EVP_CIPHER_CTX *q_EVP_CIPHER_CTX_new();
393void q_EVP_CIPHER_CTX_free(EVP_CIPHER_CTX *a);
394int q_EVP_CIPHER_CTX_ctrl(EVP_CIPHER_CTX *ctx, int type, int arg, void *ptr);
395int q_EVP_CIPHER_CTX_set_key_length(EVP_CIPHER_CTX *x, int keylen);
396int q_EVP_CipherInit(EVP_CIPHER_CTX *ctx, const EVP_CIPHER *type, const unsigned char *key, const unsigned char *iv, int enc);
397int q_EVP_CipherInit_ex(EVP_CIPHER_CTX *ctx, const EVP_CIPHER *cipher, ENGINE *impl, const unsigned char *key, const unsigned char *iv, int enc);
398int q_EVP_CipherUpdate(EVP_CIPHER_CTX *ctx, unsigned char *out, int *outl, const unsigned char *in, int inl);
399int q_EVP_CipherFinal(EVP_CIPHER_CTX *ctx, unsigned char *out, int *outl);
400const EVP_MD *q_EVP_get_digestbyname(const char *name);
401
402#ifndef OPENSSL_NO_DES
403const EVP_CIPHER *q_EVP_des_cbc();
404const EVP_CIPHER *q_EVP_des_ede3_cbc();
405#endif // OPENSSL_NO_DES
406
407#ifndef OPENSSL_NO_RC2
408const EVP_CIPHER *q_EVP_rc2_cbc();
409#endif // OPENSSL_NO_RC2
410
411#ifndef OPENSSL_NO_AES
412const EVP_CIPHER *q_EVP_aes_128_cbc();
413const EVP_CIPHER *q_EVP_aes_192_cbc();
414const EVP_CIPHER *q_EVP_aes_256_cbc();
415#endif // OPENSSL_NO_AES
416
417Q_AUTOTEST_EXPORT const EVP_MD *q_EVP_sha1();
418int q_EVP_PKEY_assign(EVP_PKEY *a, int b, char *c);
419Q_AUTOTEST_EXPORT int q_EVP_PKEY_set1_RSA(EVP_PKEY *a, RSA *b);
420Q_AUTOTEST_EXPORT int q_EVP_PKEY_set1_DSA(EVP_PKEY *a, DSA *b);
421Q_AUTOTEST_EXPORT int q_EVP_PKEY_set1_DH(EVP_PKEY *a, DH *b);
422
423#ifndef OPENSSL_NO_EC
424Q_AUTOTEST_EXPORT int q_EVP_PKEY_set1_EC_KEY(EVP_PKEY *a, EC_KEY *b);
425#endif
426
427Q_AUTOTEST_EXPORT int q_EVP_PKEY_cmp(const EVP_PKEY *a, const EVP_PKEY *b);
428Q_AUTOTEST_EXPORT void q_EVP_PKEY_free(EVP_PKEY *a);
429RSA *q_EVP_PKEY_get1_RSA(EVP_PKEY *a);
430DSA *q_EVP_PKEY_get1_DSA(EVP_PKEY *a);
431DH *q_EVP_PKEY_get1_DH(EVP_PKEY *a);
432#ifndef OPENSSL_NO_EC
433EC_KEY *q_EVP_PKEY_get1_EC_KEY(EVP_PKEY *a);
434#endif
435int q_EVP_PKEY_type(int a);
436Q_AUTOTEST_EXPORT EVP_PKEY *q_EVP_PKEY_new();
437int q_i2d_X509(X509 *a, unsigned char **b);
438const char *q_OBJ_nid2sn(int a);
439const char *q_OBJ_nid2ln(int a);
440int q_OBJ_sn2nid(const char *s);
441int q_OBJ_ln2nid(const char *s);
442int q_i2t_ASN1_OBJECT(char *buf, int buf_len, ASN1_OBJECT *obj);
443int q_OBJ_obj2txt(char *buf, int buf_len, ASN1_OBJECT *obj, int no_name);
444int q_OBJ_obj2nid(const ASN1_OBJECT *a);
445#define q_EVP_get_digestbynid(a) q_EVP_get_digestbyname(q_OBJ_nid2sn(a))
446Q_AUTOTEST_EXPORT EVP_PKEY *q_PEM_read_bio_PrivateKey(BIO *a, EVP_PKEY **b, pem_password_cb *c, void *d);
447DSA *q_PEM_read_bio_DSAPrivateKey(BIO *a, DSA **b, pem_password_cb *c, void *d);
448RSA *q_PEM_read_bio_RSAPrivateKey(BIO *a, RSA **b, pem_password_cb *c, void *d);
449
450#ifndef OPENSSL_NO_EC
451EC_KEY *q_PEM_read_bio_ECPrivateKey(BIO *a, EC_KEY **b, pem_password_cb *c, void *d);
452int q_PEM_write_bio_ECPrivateKey(BIO *a, EC_KEY *b, const EVP_CIPHER *c, unsigned char *d,
453 int e, pem_password_cb *f, void *g);
454EC_KEY *q_PEM_read_bio_EC_PUBKEY(BIO *a, EC_KEY **b, pem_password_cb *c, void *d);
455int q_PEM_write_bio_EC_PUBKEY(BIO *a, EC_KEY *b);
456#endif // OPENSSL_NO_EC
457
458DH *q_PEM_read_bio_DHparams(BIO *a, DH **b, pem_password_cb *c, void *d);
459int q_PEM_write_bio_DSAPrivateKey(BIO *a, DSA *b, const EVP_CIPHER *c, unsigned char *d,
460 int e, pem_password_cb *f, void *g);
461int q_PEM_write_bio_RSAPrivateKey(BIO *a, RSA *b, const EVP_CIPHER *c, unsigned char *d,
462 int e, pem_password_cb *f, void *g);
463int q_PEM_write_bio_PrivateKey(BIO *a, EVP_PKEY *b, const EVP_CIPHER *c, unsigned char *d,
464 int e, pem_password_cb *f, void *g);
465Q_AUTOTEST_EXPORT EVP_PKEY *q_PEM_read_bio_PUBKEY(BIO *a, EVP_PKEY **b, pem_password_cb *c, void *d);
466DSA *q_PEM_read_bio_DSA_PUBKEY(BIO *a, DSA **b, pem_password_cb *c, void *d);
467RSA *q_PEM_read_bio_RSA_PUBKEY(BIO *a, RSA **b, pem_password_cb *c, void *d);
468int q_PEM_write_bio_DSA_PUBKEY(BIO *a, DSA *b);
469int q_PEM_write_bio_RSA_PUBKEY(BIO *a, RSA *b);
470int q_PEM_write_bio_PUBKEY(BIO *a, EVP_PKEY *b);
471
472void q_RAND_seed(const void *a, int b);
473int q_RAND_status();
474int q_RAND_bytes(unsigned char *b, int n);
475RSA *q_RSA_new();
476void q_RSA_free(RSA *a);
477int q_SSL_accept(SSL *a);
478int q_SSL_clear(SSL *a);
479char *q_SSL_CIPHER_description(const SSL_CIPHER *a, char *b, int c);
480int q_SSL_CIPHER_get_bits(const SSL_CIPHER *a, int *b);
481BIO *q_SSL_get_rbio(const SSL *s);
482int q_SSL_connect(SSL *a);
483int q_SSL_CTX_check_private_key(const SSL_CTX *a);
484long q_SSL_CTX_ctrl(SSL_CTX *a, int b, long c, void *d);
485void q_SSL_CTX_free(SSL_CTX *a);
486SSL_CTX *q_SSL_CTX_new(const SSL_METHOD *a);
487int q_SSL_CTX_set_cipher_list(SSL_CTX *a, const char *b);
488int q_SSL_CTX_set_default_verify_paths(SSL_CTX *a);
489void q_SSL_CTX_set_verify(SSL_CTX *a, int b, int (*c)(int, X509_STORE_CTX *));
490void q_SSL_CTX_set_verify_depth(SSL_CTX *a, int b);
491extern "C" {
492typedef void (*GenericCallbackType)();
493}
494long q_SSL_CTX_callback_ctrl(SSL_CTX *, int, GenericCallbackType);
495int q_SSL_CTX_use_certificate(SSL_CTX *a, X509 *b);
496int q_SSL_CTX_use_certificate_file(SSL_CTX *a, const char *b, int c);
497int q_SSL_CTX_use_PrivateKey(SSL_CTX *a, EVP_PKEY *b);
498int q_SSL_CTX_use_RSAPrivateKey(SSL_CTX *a, RSA *b);
499int q_SSL_CTX_use_PrivateKey_file(SSL_CTX *a, const char *b, int c);
500X509_STORE *q_SSL_CTX_get_cert_store(const SSL_CTX *a);
501SSL_CONF_CTX *q_SSL_CONF_CTX_new();
502void q_SSL_CONF_CTX_free(SSL_CONF_CTX *a);
503void q_SSL_CONF_CTX_set_ssl_ctx(SSL_CONF_CTX *a, SSL_CTX *b);
504unsigned int q_SSL_CONF_CTX_set_flags(SSL_CONF_CTX *a, unsigned int b);
505int q_SSL_CONF_CTX_finish(SSL_CONF_CTX *a);
506int q_SSL_CONF_cmd(SSL_CONF_CTX *a, const char *b, const char *c);
507void q_SSL_free(SSL *a);
508STACK_OF(SSL_CIPHER) *q_SSL_get_ciphers(const SSL *a);
509const SSL_CIPHER *q_SSL_get_current_cipher(SSL *a);
510int q_SSL_version(const SSL *a);
511int q_SSL_get_error(SSL *a, int b);
512STACK_OF(X509) *q_SSL_get_peer_cert_chain(SSL *a);
513X509 *q_SSL_get_peer_certificate(SSL *a);
514long q_SSL_get_verify_result(const SSL *a);
515SSL *q_SSL_new(SSL_CTX *a);
516SSL_CTX *q_SSL_get_SSL_CTX(SSL *a);
517long q_SSL_ctrl(SSL *ssl,int cmd, long larg, void *parg);
518int q_SSL_read(SSL *a, void *b, int c);
519void q_SSL_set_bio(SSL *a, BIO *b, BIO *c);
520void q_SSL_set_accept_state(SSL *a);
521void q_SSL_set_connect_state(SSL *a);
522int q_SSL_shutdown(SSL *a);
523int q_SSL_in_init(const SSL *s);
524int q_SSL_get_shutdown(const SSL *ssl);
525int q_SSL_set_session(SSL *to, SSL_SESSION *session);
526void q_SSL_SESSION_free(SSL_SESSION *ses);
527SSL_SESSION *q_SSL_get1_session(SSL *ssl);
528SSL_SESSION *q_SSL_get_session(const SSL *ssl);
529int q_SSL_set_ex_data(SSL *ssl, int idx, void *arg);
530void *q_SSL_get_ex_data(const SSL *ssl, int idx);
531#ifndef OPENSSL_NO_PSK
532typedef unsigned int (*q_psk_client_callback_t)(SSL *ssl, const char *hint, char *identity, unsigned int max_identity_len, unsigned char *psk, unsigned int max_psk_len);
533void q_SSL_set_psk_client_callback(SSL *ssl, q_psk_client_callback_t callback);
534typedef unsigned int (*q_psk_server_callback_t)(SSL *ssl, const char *identity, unsigned char *psk, unsigned int max_psk_len);
535void q_SSL_set_psk_server_callback(SSL *ssl, q_psk_server_callback_t callback);
536int q_SSL_CTX_use_psk_identity_hint(SSL_CTX *ctx, const char *hint);
537#endif // !OPENSSL_NO_PSK
538int q_SSL_write(SSL *a, const void *b, int c);
539int q_X509_cmp(X509 *a, X509 *b);
540X509 *q_X509_dup(X509 *a);
541void q_X509_print(BIO *a, X509*b);
542int q_X509_digest(const X509 *x509, const EVP_MD *type, unsigned char *md, unsigned int *len);
543ASN1_OBJECT *q_X509_EXTENSION_get_object(X509_EXTENSION *a);
544Q_AUTOTEST_EXPORT void q_X509_free(X509 *a);
545Q_AUTOTEST_EXPORT ASN1_TIME *q_X509_gmtime_adj(ASN1_TIME *s, long adj);
546Q_AUTOTEST_EXPORT void q_ASN1_TIME_free(ASN1_TIME *t);
547X509_EXTENSION *q_X509_get_ext(X509 *a, int b);
548int q_X509_get_ext_count(X509 *a);
549void *q_X509_get_ext_d2i(X509 *a, int b, int *c, int *d);
550const X509V3_EXT_METHOD *q_X509V3_EXT_get(X509_EXTENSION *a);
551void *q_X509V3_EXT_d2i(X509_EXTENSION *a);
552int q_X509_EXTENSION_get_critical(X509_EXTENSION *a);
553ASN1_OCTET_STRING *q_X509_EXTENSION_get_data(X509_EXTENSION *a);
554void q_BASIC_CONSTRAINTS_free(BASIC_CONSTRAINTS *a);
555void q_AUTHORITY_KEYID_free(AUTHORITY_KEYID *a);
556int q_ASN1_STRING_print(BIO *a, const ASN1_STRING *b);
557int q_X509_check_issued(X509 *a, X509 *b);
558X509_NAME *q_X509_get_issuer_name(X509 *a);
559X509_NAME *q_X509_get_subject_name(X509 *a);
560ASN1_INTEGER *q_X509_get_serialNumber(X509 *a);
561int q_X509_verify_cert(X509_STORE_CTX *ctx);
562int q_X509_NAME_entry_count(X509_NAME *a);
563X509_NAME_ENTRY *q_X509_NAME_get_entry(X509_NAME *a,int b);
564ASN1_STRING *q_X509_NAME_ENTRY_get_data(X509_NAME_ENTRY *a);
565ASN1_OBJECT *q_X509_NAME_ENTRY_get_object(X509_NAME_ENTRY *a);
566EVP_PKEY *q_X509_PUBKEY_get(X509_PUBKEY *a);
567void q_X509_STORE_free(X509_STORE *store);
568X509_STORE *q_X509_STORE_new();
569int q_X509_STORE_add_cert(X509_STORE *ctx, X509 *x);
570void q_X509_STORE_CTX_free(X509_STORE_CTX *storeCtx);
571int q_X509_STORE_CTX_init(X509_STORE_CTX *ctx, X509_STORE *store,
572 X509 *x509, STACK_OF(X509) *chain);
573X509_STORE_CTX *q_X509_STORE_CTX_new();
574int q_X509_STORE_CTX_set_purpose(X509_STORE_CTX *ctx, int purpose);
575int q_X509_STORE_CTX_get_error(X509_STORE_CTX *ctx);
576int q_X509_STORE_CTX_get_error_depth(X509_STORE_CTX *ctx);
577X509 *q_X509_STORE_CTX_get_current_cert(X509_STORE_CTX *ctx);
578X509_STORE *q_X509_STORE_CTX_get0_store(X509_STORE_CTX *ctx);
579
580// Diffie-Hellman support
581DH *q_DH_new();
582void q_DH_free(DH *dh);
583DH *q_d2i_DHparams(DH **a, const unsigned char **pp, long length);
584int q_i2d_DHparams(DH *a, unsigned char **p);
585
586#ifndef OPENSSL_NO_DEPRECATED_3_0
587int q_DH_check(DH *dh, int *codes);
588#endif // OPENSSL_NO_DEPRECATED_3_0
589
590BIGNUM *q_BN_bin2bn(const unsigned char *s, int len, BIGNUM *ret);
591#define q_SSL_CTX_set_tmp_dh(ctx, dh) q_SSL_CTX_ctrl((ctx), SSL_CTRL_SET_TMP_DH, 0, (char *)dh)
592
593#ifndef OPENSSL_NO_EC
594// EC Diffie-Hellman support
595EC_KEY *q_EC_KEY_dup(const EC_KEY *src);
596EC_KEY *q_EC_KEY_new_by_curve_name(int nid);
597void q_EC_KEY_free(EC_KEY *ecdh);
598#define q_SSL_CTX_set_tmp_ecdh(ctx, ecdh) q_SSL_CTX_ctrl((ctx), SSL_CTRL_SET_TMP_ECDH, 0, (char *)ecdh)
599
600// EC curves management
601size_t q_EC_get_builtin_curves(EC_builtin_curve *r, size_t nitems);
602int q_EC_curve_nist2nid(const char *name);
603#endif // OPENSSL_NO_EC
604
605#define q_SSL_get_server_tmp_key(ssl, key) q_SSL_ctrl((ssl), SSL_CTRL_GET_SERVER_TMP_KEY, 0, (char *)key)
606
607// PKCS#12 support
608int q_PKCS12_parse(PKCS12 *p12, const char *pass, EVP_PKEY **pkey, X509 **cert, STACK_OF(X509) **ca);
609PKCS12 *q_d2i_PKCS12_bio(BIO *bio, PKCS12 **pkcs12);
610void q_PKCS12_free(PKCS12 *pkcs12);
611
612#define q_BIO_get_mem_data(b, pp) (int)q_BIO_ctrl(b,BIO_CTRL_INFO,0,(char *)pp)
613#define q_BIO_pending(b) (int)q_BIO_ctrl(b,BIO_CTRL_PENDING,0,NULL)
614#define q_SSL_CTX_set_mode(ctx,op) q_SSL_CTX_ctrl((ctx),SSL_CTRL_MODE,(op),NULL)
615#define q_sk_GENERAL_NAME_num(st) q_SKM_sk_num((st))
616#define q_sk_GENERAL_NAME_value(st, i) q_SKM_sk_value(GENERAL_NAME, (st), (i))
617
618void q_GENERAL_NAME_free(GENERAL_NAME *a);
619
620#define q_sk_X509_num(st) q_SKM_sk_num((st))
621#define q_sk_X509_value(st, i) q_SKM_sk_value(X509, (st), (i))
622#define q_sk_SSL_CIPHER_num(st) q_SKM_sk_num((st))
623#define q_sk_SSL_CIPHER_value(st, i) q_SKM_sk_value(SSL_CIPHER, (st), (i))
624#define q_SSL_CTX_add_extra_chain_cert(ctx,x509) \
625 q_SSL_CTX_ctrl(ctx,SSL_CTRL_EXTRA_CHAIN_CERT,0,(char *)x509)
626#define q_EVP_PKEY_assign_RSA(pkey,rsa) q_EVP_PKEY_assign((pkey),EVP_PKEY_RSA,\
627 (char *)(rsa))
628#define q_EVP_PKEY_assign_DSA(pkey,dsa) q_EVP_PKEY_assign((pkey),EVP_PKEY_DSA,\
629 (char *)(dsa))
630#define q_OpenSSL_add_all_algorithms() q_OPENSSL_add_all_algorithms_conf()
631
632#if OPENSSL_VERSION_MAJOR < 3
633int q_SSL_CTX_load_verify_locations(SSL_CTX *ctx, const char *CAfile, const char *CApath);
634#else
635int q_SSL_CTX_load_verify_dir(SSL_CTX *ctx, const char *CApath);
636#endif // OPENSSL_VERSION_MAJOR
637
638int q_i2d_SSL_SESSION(SSL_SESSION *in, unsigned char **pp);
639SSL_SESSION *q_d2i_SSL_SESSION(SSL_SESSION **a, const unsigned char **pp, long length);
640
641#ifndef OPENSSL_NO_NEXTPROTONEG
642int q_SSL_select_next_proto(unsigned char **out, unsigned char *outlen,
643 const unsigned char *in, unsigned int inlen,
644 const unsigned char *client, unsigned int client_len);
645void q_SSL_CTX_set_next_proto_select_cb(SSL_CTX *s,
646 int (*cb) (SSL *ssl, unsigned char **out,
647 unsigned char *outlen,
648 const unsigned char *in,
649 unsigned int inlen, void *arg),
650 void *arg);
651void q_SSL_get0_next_proto_negotiated(const SSL *s, const unsigned char **data,
652 unsigned *len);
653int q_SSL_set_alpn_protos(SSL *ssl, const unsigned char *protos,
654 unsigned protos_len);
655void q_SSL_CTX_set_alpn_select_cb(SSL_CTX *ctx,
656 int (*cb) (SSL *ssl,
657 const unsigned char **out,
658 unsigned char *outlen,
659 const unsigned char *in,
660 unsigned int inlen,
661 void *arg), void *arg);
662void q_SSL_get0_alpn_selected(const SSL *ssl, const unsigned char **data,
663 unsigned *len);
664#endif // !OPENSSL_NO_NEXTPROTONEG
665
666
667#if QT_CONFIG(dtls)
668
669extern "C"
670{
671typedef int (*CookieGenerateCallback)(SSL *, unsigned char *, unsigned *);
672}
673
674void q_SSL_CTX_set_cookie_generate_cb(SSL_CTX *ctx, CookieGenerateCallback cb);
675void q_SSL_CTX_set_cookie_verify_cb(SSL_CTX *ctx, CookieVerifyCallback cb);
676const SSL_METHOD *q_DTLS_server_method();
677const SSL_METHOD *q_DTLS_client_method();
678
679#endif // dtls
680
681void *q_X509_STORE_CTX_get_ex_data(X509_STORE_CTX *ctx, int idx);
682int q_SSL_get_ex_data_X509_STORE_CTX_idx();
683
684#if QT_CONFIG(dtls)
685#define q_DTLS_set_link_mtu(ssl, mtu) q_SSL_ctrl((ssl), DTLS_CTRL_SET_LINK_MTU, (mtu), nullptr)
686#define q_DTLSv1_get_timeout(ssl, arg) q_SSL_ctrl(ssl, DTLS_CTRL_GET_TIMEOUT, 0, arg)
687#define q_DTLSv1_handle_timeout(ssl) q_SSL_ctrl(ssl, DTLS_CTRL_HANDLE_TIMEOUT, 0, nullptr)
688#endif // dtls
689
690void q_BIO_set_flags(BIO *b, int flags);
691void q_BIO_clear_flags(BIO *b, int flags);
692void *q_BIO_get_ex_data(BIO *b, int idx);
693int q_BIO_set_ex_data(BIO *b, int idx, void *data);
694
695#define q_BIO_set_retry_read(b) q_BIO_set_flags(b, (BIO_FLAGS_READ|BIO_FLAGS_SHOULD_RETRY))
696#define q_BIO_set_retry_write(b) q_BIO_set_flags(b, (BIO_FLAGS_WRITE|BIO_FLAGS_SHOULD_RETRY))
697#define q_BIO_clear_retry_flags(b) q_BIO_clear_flags(b, (BIO_FLAGS_RWS|BIO_FLAGS_SHOULD_RETRY))
698#define q_BIO_set_app_data(s,arg) q_BIO_set_ex_data(s,0,arg)
699#define q_BIO_get_app_data(s) q_BIO_get_ex_data(s,0)
700
701// Helper function
702class QDateTime;
703QDateTime q_getTimeFromASN1(const ASN1_TIME *aTime);
704
705#define q_SSL_set_tlsext_status_type(ssl, type) \
706 q_SSL_ctrl((ssl), SSL_CTRL_SET_TLSEXT_STATUS_REQ_TYPE, (type), nullptr)
707
708#if QT_CONFIG(ocsp)
709
710OCSP_RESPONSE *q_d2i_OCSP_RESPONSE(OCSP_RESPONSE **a, const unsigned char **in, long len);
711Q_AUTOTEST_EXPORT int q_i2d_OCSP_RESPONSE(OCSP_RESPONSE *r, unsigned char **ppout);
712Q_AUTOTEST_EXPORT OCSP_RESPONSE *q_OCSP_response_create(int status, OCSP_BASICRESP *bs);
713Q_AUTOTEST_EXPORT void q_OCSP_RESPONSE_free(OCSP_RESPONSE *rs);
714int q_OCSP_response_status(OCSP_RESPONSE *resp);
715OCSP_BASICRESP *q_OCSP_response_get1_basic(OCSP_RESPONSE *resp);
716Q_AUTOTEST_EXPORT OCSP_SINGLERESP *q_OCSP_basic_add1_status(OCSP_BASICRESP *rsp, OCSP_CERTID *cid,
717 int status, int reason, ASN1_TIME *revtime,
718 ASN1_TIME *thisupd, ASN1_TIME *nextupd);
719Q_AUTOTEST_EXPORT int q_OCSP_basic_sign(OCSP_BASICRESP *brsp, X509 *signer, EVP_PKEY *key, const EVP_MD *dgst,
720 STACK_OF(X509) *certs, unsigned long flags);
721Q_AUTOTEST_EXPORT OCSP_BASICRESP *q_OCSP_BASICRESP_new();
722Q_AUTOTEST_EXPORT void q_OCSP_BASICRESP_free(OCSP_BASICRESP *bs);
723int q_OCSP_basic_verify(OCSP_BASICRESP *bs, STACK_OF(X509) *certs, X509_STORE *st, unsigned long flags);
724int q_OCSP_resp_count(OCSP_BASICRESP *bs);
725OCSP_SINGLERESP *q_OCSP_resp_get0(OCSP_BASICRESP *bs, int idx);
726int q_OCSP_single_get0_status(OCSP_SINGLERESP *single, int *reason, ASN1_GENERALIZEDTIME **revtime,
727 ASN1_GENERALIZEDTIME **thisupd, ASN1_GENERALIZEDTIME **nextupd);
728int q_OCSP_check_validity(ASN1_GENERALIZEDTIME *thisupd, ASN1_GENERALIZEDTIME *nextupd, long nsec, long maxsec);
729int q_OCSP_id_get0_info(ASN1_OCTET_STRING **piNameHash, ASN1_OBJECT **pmd, ASN1_OCTET_STRING **pikeyHash,
730 ASN1_INTEGER **pserial, OCSP_CERTID *cid);
731
732const STACK_OF(X509) *q_OCSP_resp_get0_certs(const OCSP_BASICRESP *bs);
733Q_AUTOTEST_EXPORT OCSP_CERTID *q_OCSP_cert_to_id(const EVP_MD *dgst, X509 *subject, X509 *issuer);
734Q_AUTOTEST_EXPORT void q_OCSP_CERTID_free(OCSP_CERTID *cid);
735int q_OCSP_id_cmp(OCSP_CERTID *a, OCSP_CERTID *b);
736
737#define q_SSL_get_tlsext_status_ocsp_resp(ssl, arg) \
738 q_SSL_ctrl(ssl, SSL_CTRL_GET_TLSEXT_STATUS_REQ_OCSP_RESP, 0, arg)
739
740#define q_SSL_CTX_set_tlsext_status_cb(ssl, cb) \
741 q_SSL_CTX_callback_ctrl(ssl, SSL_CTRL_SET_TLSEXT_STATUS_REQ_CB, GenericCallbackType(cb))
742
743# define q_SSL_set_tlsext_status_ocsp_resp(ssl, arg, arglen) \
744 q_SSL_ctrl(ssl, SSL_CTRL_SET_TLSEXT_STATUS_REQ_OCSP_RESP, arglen, arg)
745
746#endif // ocsp
747
748
749void *q_CRYPTO_malloc(size_t num, const char *file, int line);
750#define q_OPENSSL_malloc(num) q_CRYPTO_malloc(num, "", 0)
751void q_CRYPTO_free(void *str, const char *file, int line);
752#define q_OPENSSL_free(addr) q_CRYPTO_free(addr, "", 0)
753
754int q_SSL_CTX_get_security_level(const SSL_CTX *ctx);
755void q_SSL_CTX_set_security_level(SSL_CTX *ctx, int level);
756
757QT_END_NAMESPACE
758
759#endif
760

source code of qtbase/src/network/ssl/qsslsocket_openssl_symbols_p.h