1 /****************************************************************************
3 ** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
4 ** All rights reserved.
5 ** Contact: Nokia Corporation (qt-info@nokia.com)
7 ** This file is part of the QtNetwork module of the Qt Toolkit.
9 ** $QT_BEGIN_LICENSE:LGPL$
10 ** GNU Lesser General Public License Usage
11 ** This file may be used under the terms of the GNU Lesser General Public
12 ** License version 2.1 as published by the Free Software Foundation and
13 ** appearing in the file LICENSE.LGPL included in the packaging of this
14 ** file. Please review the following information to ensure the GNU Lesser
15 ** General Public License version 2.1 requirements will be met:
16 ** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
18 ** In addition, as a special exception, Nokia gives you certain additional
19 ** rights. These rights are described in the Nokia Qt LGPL Exception
20 ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
22 ** GNU General Public License Usage
23 ** Alternatively, this file may be used under the terms of the GNU General
24 ** Public License version 3.0 as published by the Free Software Foundation
25 ** and appearing in the file LICENSE.GPL included in the packaging of this
26 ** file. Please review the following information to ensure the GNU General
27 ** Public License version 3.0 requirements will be met:
28 ** http://www.gnu.org/copyleft/gpl.html.
31 ** Alternatively, this file may be used in accordance with the terms and
32 ** conditions contained in a signed written agreement between you and Nokia.
40 ****************************************************************************/
43 #ifndef QSSLSOCKET_OPENSSL_SYMBOLS_P_H
44 #define QSSLSOCKET_OPENSSL_SYMBOLS_P_H
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.
57 #include "qsslsocket_openssl_p.h"
63 #if !defined QT_LINKED_OPENSSL
64 // **************** Shared declarations ******************
67 # define DEFINEFUNC(ret, func, arg, a, err, funcret) \
68 typedef ret (*_q_PTR_##func)(arg); \
69 static _q_PTR_##func _q_##func = 0; \
72 qWarning("QSslSocket: cannot call unresolved function "#func); \
75 funcret _q_##func(a); \
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) { \
84 qWarning("QSslSocket: cannot call unresolved function "#func);\
87 funcret _q_##func(a, b); \
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) { \
96 qWarning("QSslSocket: cannot call unresolved function "#func); \
99 funcret _q_##func(a, b, c); \
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) { \
108 qWarning("QSslSocket: cannot call unresolved function "#func); \
111 funcret _q_##func(a, b, c, d); \
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) { \
120 qWarning("QSslSocket: cannot call unresolved function "#func); \
123 funcret _q_##func(a, b, c, d, e); \
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) { \
132 qWarning("QSslSocket: cannot call unresolved function "#func); \
135 funcret _q_##func(a, b, c, d, e, f); \
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) { \
144 qWarning("QSslSocket: cannot call unresolved function "#func); \
147 funcret _q_##func(a, b, c, d, e, f, g); \
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) { \
156 qWarning("QSslSocket: cannot call unresolved function "#func); \
159 funcret _q_##func(a, b, c, d, e, f, g, h, i); \
161 // **************** Shared declarations ******************
163 #else // !defined QT_LINKED_OPENSSL
165 // **************** Static declarations ******************
168 # define DEFINEFUNC(ret, func, arg, a, err, funcret) \
169 ret q_##func(arg) { funcret func(a); }
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); }
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); }
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); }
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); }
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); }
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); }
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); }
199 // **************** Static declarations ******************
201 #endif // !defined QT_LINKED_OPENSSL
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 BIO *q_BIO_new(BIO_METHOD *a);
211 BIO *q_BIO_new_mem_buf(void *a, int b);
212 int q_BIO_read(BIO *a, void *b, int c);
213 BIO_METHOD *q_BIO_s_mem();
214 int q_BIO_write(BIO *a, const void *b, int c);
215 int q_BN_num_bits(const BIGNUM *a);
216 int q_CRYPTO_num_locks();
217 void q_CRYPTO_set_locking_callback(void (*a)(int, int, const char *, int));
218 void q_CRYPTO_set_id_callback(unsigned long (*a)());
219 void q_CRYPTO_free(void *a);
220 void q_DSA_free(DSA *a);
221 #if OPENSSL_VERSION_NUMBER >= 0x00908000L
222 // 0.9.8 broke SC and BC by changing this function's signature.
223 X509 *q_d2i_X509(X509 **a, const unsigned char **b, long c);
225 X509 *q_d2i_X509(X509 **a, unsigned char **b, long c);
227 char *q_ERR_error_string(unsigned long a, char *b);
228 unsigned long q_ERR_get_error();
229 const EVP_CIPHER *q_EVP_des_ede3_cbc();
230 int q_EVP_PKEY_assign(EVP_PKEY *a, int b, char *c);
231 int q_EVP_PKEY_set1_RSA(EVP_PKEY *a, RSA *b);
232 int q_EVP_PKEY_set1_DSA(EVP_PKEY *a, DSA *b);
233 void q_EVP_PKEY_free(EVP_PKEY *a);
234 RSA *q_EVP_PKEY_get1_RSA(EVP_PKEY *a);
235 DSA *q_EVP_PKEY_get1_DSA(EVP_PKEY *a);
236 int q_EVP_PKEY_type(int a);
237 EVP_PKEY *q_EVP_PKEY_new();
238 int q_i2d_X509(X509 *a, unsigned char **b);
239 const char *q_OBJ_nid2sn(int a);
240 int q_OBJ_obj2nid(const ASN1_OBJECT *a);
243 void *q_PEM_ASN1_read_bio(d2i_of_void *a, const char *b, BIO *c, void **d, pem_password_cb *e,
245 // ### ditto for write
247 DSA *q_PEM_read_bio_DSAPrivateKey(BIO *a, DSA **b, pem_password_cb *c, void *d);
248 RSA *q_PEM_read_bio_RSAPrivateKey(BIO *a, RSA **b, pem_password_cb *c, void *d);
249 int q_PEM_write_bio_DSAPrivateKey(BIO *a, DSA *b, const EVP_CIPHER *c, unsigned char *d,
250 int e, pem_password_cb *f, void *g);
251 int q_PEM_write_bio_RSAPrivateKey(BIO *a, RSA *b, const EVP_CIPHER *c, unsigned char *d,
252 int e, pem_password_cb *f, void *g);
254 DSA *q_PEM_read_bio_DSA_PUBKEY(BIO *a, DSA **b, pem_password_cb *c, void *d);
255 RSA *q_PEM_read_bio_RSA_PUBKEY(BIO *a, RSA **b, pem_password_cb *c, void *d);
256 int q_PEM_write_bio_DSA_PUBKEY(BIO *a, DSA *b);
257 int q_PEM_write_bio_RSA_PUBKEY(BIO *a, RSA *b);
258 void q_RAND_seed(const void *a, int b);
260 void q_RSA_free(RSA *a);
261 int q_sk_num(STACK *a);
262 void q_sk_pop_free(STACK *a, void (*b)(void *));
263 #if OPENSSL_VERSION_NUMBER >= 0x10000000L
264 void q_sk_free(_STACK *a);
265 void * q_sk_value(STACK *a, int b);
267 void q_sk_free(STACK *a);
268 char * q_sk_value(STACK *a, int b);
270 int q_SSL_accept(SSL *a);
271 int q_SSL_clear(SSL *a);
272 char *q_SSL_CIPHER_description(SSL_CIPHER *a, char *b, int c);
273 int q_SSL_connect(SSL *a);
274 #if OPENSSL_VERSION_NUMBER >= 0x00908000L
275 // 0.9.8 broke SC and BC by changing this function's signature.
276 int q_SSL_CTX_check_private_key(const SSL_CTX *a);
278 int q_SSL_CTX_check_private_key(SSL_CTX *a);
280 long q_SSL_CTX_ctrl(SSL_CTX *a, int b, long c, void *d);
281 void q_SSL_CTX_free(SSL_CTX *a);
282 #if OPENSSL_VERSION_NUMBER >= 0x10000000L
283 SSL_CTX *q_SSL_CTX_new(const SSL_METHOD *a);
285 SSL_CTX *q_SSL_CTX_new(SSL_METHOD *a);
287 int q_SSL_CTX_set_cipher_list(SSL_CTX *a, const char *b);
288 int q_SSL_CTX_set_default_verify_paths(SSL_CTX *a);
289 void q_SSL_CTX_set_verify(SSL_CTX *a, int b, int (*c)(int, X509_STORE_CTX *));
290 void q_SSL_CTX_set_verify_depth(SSL_CTX *a, int b);
291 int q_SSL_CTX_use_certificate(SSL_CTX *a, X509 *b);
292 int q_SSL_CTX_use_certificate_file(SSL_CTX *a, const char *b, int c);
293 int q_SSL_CTX_use_PrivateKey(SSL_CTX *a, EVP_PKEY *b);
294 int q_SSL_CTX_use_RSAPrivateKey(SSL_CTX *a, RSA *b);
295 int q_SSL_CTX_use_PrivateKey_file(SSL_CTX *a, const char *b, int c);
296 void q_SSL_free(SSL *a);
297 #if OPENSSL_VERSION_NUMBER >= 0x00908000L
298 // 0.9.8 broke SC and BC by changing this function's signature.
299 STACK_OF(SSL_CIPHER) *q_SSL_get_ciphers(const SSL *a);
301 STACK_OF(SSL_CIPHER) *q_SSL_get_ciphers(SSL *a);
303 #if OPENSSL_VERSION_NUMBER >= 0x10000000L
304 const SSL_CIPHER *q_SSL_get_current_cipher(SSL *a);
306 SSL_CIPHER *q_SSL_get_current_cipher(SSL *a);
308 int q_SSL_get_error(SSL *a, int b);
309 STACK_OF(X509) *q_SSL_get_peer_cert_chain(SSL *a);
310 X509 *q_SSL_get_peer_certificate(SSL *a);
311 #if OPENSSL_VERSION_NUMBER >= 0x00908000L
312 // 0.9.8 broke SC and BC by changing this function's signature.
313 long q_SSL_get_verify_result(const SSL *a);
315 long q_SSL_get_verify_result(SSL *a);
317 int q_SSL_library_init();
318 void q_SSL_load_error_strings();
319 SSL *q_SSL_new(SSL_CTX *a);
320 #if OPENSSL_VERSION_NUMBER >= 0x0090806fL && !defined(OPENSSL_NO_TLSEXT)
321 long q_SSL_ctrl(SSL *ssl,int cmd, long larg, const void *parg);
323 int q_SSL_read(SSL *a, void *b, int c);
324 void q_SSL_set_bio(SSL *a, BIO *b, BIO *c);
325 void q_SSL_set_accept_state(SSL *a);
326 void q_SSL_set_connect_state(SSL *a);
327 int q_SSL_shutdown(SSL *a);
328 #if OPENSSL_VERSION_NUMBER >= 0x10000000L
329 const SSL_METHOD *q_SSLv2_client_method();
330 const SSL_METHOD *q_SSLv3_client_method();
331 const SSL_METHOD *q_SSLv23_client_method();
332 const SSL_METHOD *q_TLSv1_client_method();
333 const SSL_METHOD *q_SSLv2_server_method();
334 const SSL_METHOD *q_SSLv3_server_method();
335 const SSL_METHOD *q_SSLv23_server_method();
336 const SSL_METHOD *q_TLSv1_server_method();
338 SSL_METHOD *q_SSLv2_client_method();
339 SSL_METHOD *q_SSLv3_client_method();
340 SSL_METHOD *q_SSLv23_client_method();
341 SSL_METHOD *q_TLSv1_client_method();
342 SSL_METHOD *q_SSLv2_server_method();
343 SSL_METHOD *q_SSLv3_server_method();
344 SSL_METHOD *q_SSLv23_server_method();
345 SSL_METHOD *q_TLSv1_server_method();
347 int q_SSL_write(SSL *a, const void *b, int c);
348 int q_X509_cmp(X509 *a, X509 *b);
350 void *q_ASN1_dup(i2d_of_void *i2d, d2i_of_void *d2i, char *x);
351 #define q_X509_dup(x509) (X509 *)q_ASN1_dup((i2d_of_void *)q_i2d_X509, \
352 (d2i_of_void *)q_d2i_X509,(char *)x509)
354 X509 *q_X509_dup(X509 *a);
356 ASN1_OBJECT *q_X509_EXTENSION_get_object(X509_EXTENSION *a);
357 void q_X509_free(X509 *a);
358 X509_EXTENSION *q_X509_get_ext(X509 *a, int b);
359 int q_X509_get_ext_count(X509 *a);
360 void *q_X509_get_ext_d2i(X509 *a, int b, int *c, int *d);
361 X509_NAME *q_X509_get_issuer_name(X509 *a);
362 X509_NAME *q_X509_get_subject_name(X509 *a);
363 int q_X509_verify_cert(X509_STORE_CTX *ctx);
364 int q_X509_NAME_entry_count(X509_NAME *a);
365 X509_NAME_ENTRY *q_X509_NAME_get_entry(X509_NAME *a,int b);
366 ASN1_STRING *q_X509_NAME_ENTRY_get_data(X509_NAME_ENTRY *a);
367 ASN1_OBJECT *q_X509_NAME_ENTRY_get_object(X509_NAME_ENTRY *a);
368 EVP_PKEY *q_X509_PUBKEY_get(X509_PUBKEY *a);
369 void q_X509_STORE_free(X509_STORE *store);
370 X509_STORE *q_X509_STORE_new();
371 int q_X509_STORE_add_cert(X509_STORE *ctx, X509 *x);
372 void q_X509_STORE_CTX_free(X509_STORE_CTX *storeCtx);
373 int q_X509_STORE_CTX_init(X509_STORE_CTX *ctx, X509_STORE *store,
374 X509 *x509, STACK_OF(X509) *chain);
375 X509_STORE_CTX *q_X509_STORE_CTX_new();
376 int q_X509_STORE_CTX_set_purpose(X509_STORE_CTX *ctx, int purpose);
378 #define q_BIO_get_mem_data(b, pp) (int)q_BIO_ctrl(b,BIO_CTRL_INFO,0,(char *)pp)
379 #define q_BIO_pending(b) (int)q_BIO_ctrl(b,BIO_CTRL_PENDING,0,NULL)
381 int q_i2d_DSAPrivateKey(const DSA *a, unsigned char **pp);
382 int q_i2d_RSAPrivateKey(const RSA *a, unsigned char **pp);
383 RSA *q_d2i_RSAPrivateKey(RSA **a, unsigned char **pp, long length);
384 DSA *q_d2i_DSAPrivateKey(DSA **a, unsigned char **pp, long length);
385 #define q_PEM_read_bio_RSAPrivateKey(bp, x, cb, u) \
386 (RSA *)q_PEM_ASN1_read_bio( \
387 (void *(*)(void**, const unsigned char**, long int))q_d2i_RSAPrivateKey, PEM_STRING_RSA, bp, (void **)x, cb, u)
388 #define q_PEM_read_bio_DSAPrivateKey(bp, x, cb, u) \
389 (DSA *)q_PEM_ASN1_read_bio( \
390 (void *(*)(void**, const unsigned char**, long int))q_d2i_DSAPrivateKey, PEM_STRING_DSA, bp, (void **)x, cb, u)
391 #define q_PEM_write_bio_RSAPrivateKey(bp,x,enc,kstr,klen,cb,u) \
392 PEM_ASN1_write_bio((int (*)(void*, unsigned char**))q_i2d_RSAPrivateKey,PEM_STRING_RSA,\
393 bp,(char *)x,enc,kstr,klen,cb,u)
394 #define q_PEM_write_bio_DSAPrivateKey(bp,x,enc,kstr,klen,cb,u) \
395 PEM_ASN1_write_bio((int (*)(void*, unsigned char**))q_i2d_DSAPrivateKey,PEM_STRING_DSA,\
396 bp,(char *)x,enc,kstr,klen,cb,u)
398 #define q_SSL_CTX_set_options(ctx,op) q_SSL_CTX_ctrl((ctx),SSL_CTRL_OPTIONS,(op),NULL)
399 #define q_SKM_sk_num(type, st) ((int (*)(const STACK_OF(type) *))q_sk_num)(st)
400 #define q_SKM_sk_value(type, st,i) ((type * (*)(const STACK_OF(type) *, int))q_sk_value)(st, i)
401 #define q_sk_GENERAL_NAME_num(st) q_SKM_sk_num(GENERAL_NAME, (st))
402 #define q_sk_GENERAL_NAME_value(st, i) q_SKM_sk_value(GENERAL_NAME, (st), (i))
403 #define q_sk_X509_num(st) q_SKM_sk_num(X509, (st))
404 #define q_sk_X509_value(st, i) q_SKM_sk_value(X509, (st), (i))
405 #define q_sk_SSL_CIPHER_num(st) q_SKM_sk_num(SSL_CIPHER, (st))
406 #define q_sk_SSL_CIPHER_value(st, i) q_SKM_sk_value(SSL_CIPHER, (st), (i))
407 #define q_SSL_CTX_add_extra_chain_cert(ctx,x509) \
408 q_SSL_CTX_ctrl(ctx,SSL_CTRL_EXTRA_CHAIN_CERT,0,(char *)x509)
409 #define q_X509_get_notAfter(x) X509_get_notAfter(x)
410 #define q_X509_get_notBefore(x) X509_get_notBefore(x)
411 #define q_EVP_PKEY_assign_RSA(pkey,rsa) q_EVP_PKEY_assign((pkey),EVP_PKEY_RSA,\
413 #define q_EVP_PKEY_assign_DSA(pkey,dsa) q_EVP_PKEY_assign((pkey),EVP_PKEY_DSA,\
415 #ifdef OPENSSL_LOAD_CONF
416 #define q_OpenSSL_add_all_algorithms() q_OPENSSL_add_all_algorithms_conf()
418 #define q_OpenSSL_add_all_algorithms() q_OPENSSL_add_all_algorithms_noconf()
420 void q_OPENSSL_add_all_algorithms_noconf();
421 void q_OPENSSL_add_all_algorithms_conf();
422 int q_SSL_CTX_load_verify_locations(SSL_CTX *ctx, const char *CAfile, const char *CApath);
427 QDateTime q_getTimeFromASN1(const ASN1_TIME *aTime);