Qt
Internal/Contributor docs for the Qt SDK. Note: These are NOT official API docs; those are found at https://doc.qt.io/
Loading...
Searching...
No Matches
qffmpegsymbols-ssl.cpp
Go to the documentation of this file.
1// Copyright (C) 2024 The Qt Company Ltd.
2// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
3// Qt-Security score:critical reason:execute-external-code
4
5#include <QtMultimedia/private/qsymbolsresolveutils_p.h>
6
7#include <qstringliteral.h>
8
9#include <openssl/bio.h>
10#include <openssl/bn.h>
11#include <openssl/err.h>
12#include <openssl/evp.h>
13#include <openssl/rand.h>
14#include <openssl/ssl.h>
15#include <openssl/params.h>
16#include <openssl/pem.h>
17#include <openssl/x509.h>
18
19using namespace Qt::StringLiterals;
20
21[[maybe_unused]] static constexpr auto SHLIB_VERSION =
22#if defined(OPENSSL_SHLIB_VERSION)
23 OPENSSL_SHLIB_VERSION;
24#elif defined(SHLIB_VERSION_NUMBER)
25 SHLIB_VERSION_NUMBER;
26#endif
27
28
29#if !defined(Q_OS_ANDROID)
30CHECK_VERSIONS("ssl", SSL_NEEDED_SOVERSION, SHLIB_VERSION);
31#endif
32
34{
35 auto lib = std::make_unique<QLibrary>();
36
37 auto tryLoad = [&](QString sslName, auto version) {
38 lib->setFileNameAndVersion(sslName, version);
39 return lib->load();
40 };
41
42// openssl on Android has specific suffixes
43#if defined(Q_OS_ANDROID)
44 {
45 auto suffix = qEnvironmentVariable("ANDROID_OPENSSL_SUFFIX");
46 if (suffix.isEmpty()) {
47#if (OPENSSL_VERSION_NUMBER >> 28) < 3 // major version < 3
48 suffix = "_1_1"_L1;
49#elif OPENSSL_VERSION_MAJOR == 3
50 suffix = "_3"_L1;
51#else
52 static_assert(false, "Unexpected openssl version");
53#endif
54 }
55
56 if (tryLoad("ssl"_L1 + suffix, -1))
57 return lib;
58 }
59#endif
60
61 if (tryLoad("ssl"_L1, SSL_NEEDED_SOVERSION ""_L1))
62 return lib;
63
64 return {};
65};
66
67
68BEGIN_INIT_FUNCS("ssl", loadLib)
69
70// ASN1 functions
71
72INIT_FUNC(ASN1_INTEGER_set);
73
74// BN functions
75
78
79INIT_FUNC(BN_div_word)
80INIT_FUNC(BN_mul_word)
81INIT_FUNC(BN_add_word)
82INIT_FUNC(BN_sub_word)
83INIT_FUNC(BN_set_word)
84INIT_FUNC(BN_new)
85INIT_FUNC(BN_cmp)
86
87INIT_FUNC(BN_free);
88
90
92
95
98
101
104
107
111
114
115// BIO-related functions
116
120
125
127
130
134
137
146
147// DTLS functions
151
152// EVP functions
153
164
165// PEM functions
166
171
172// SSL functions
173
186INIT_FUNC(SSL_CTX_use_certificate)
187INIT_FUNC(SSL_CTX_use_certificate_chain_file);
188
192
213
215
216// options are unsigned long in openssl 1.1.1, and uint64 in 3.x.x
217
219
224
225// TLS functions
226
229
230// RAND functions
231
233
234// X509 functions
235
251
252END_INIT_FUNCS()
253
254//////////// Define
255
256// ASN1 functions
257
258DEFINE_FUNC(ASN1_INTEGER_set, 2);
259
260// BN functions
261
262DEFINE_FUNC(BN_value_one, 0);
263DEFINE_FUNC(BN_mod_word, 2);
264
265DEFINE_FUNC(BN_div_word, 2)
266DEFINE_FUNC(BN_mul_word, 2)
267DEFINE_FUNC(BN_add_word, 2)
268DEFINE_FUNC(BN_sub_word, 2)
269DEFINE_FUNC(BN_set_word, 2)
270DEFINE_FUNC(BN_new, 0)
271DEFINE_FUNC(BN_cmp, 2)
272
273DEFINE_FUNC(BN_free, 1);
274
275DEFINE_FUNC(BN_copy, 2);
276
277DEFINE_FUNC(BN_CTX_new, 0);
278
279DEFINE_FUNC(BN_CTX_free, 1);
280DEFINE_FUNC(BN_CTX_start, 1);
281
282DEFINE_FUNC(BN_CTX_get, 1);
283DEFINE_FUNC(BN_CTX_end, 1);
284
285DEFINE_FUNC(BN_rand, 4);
286DEFINE_FUNC(BN_mod_exp, 5);
287
288DEFINE_FUNC(BN_num_bits, 1);
289DEFINE_FUNC(BN_num_bits_word, 1);
290
291DEFINE_FUNC(BN_bn2hex, 1);
292DEFINE_FUNC(BN_bn2dec, 1);
293
294DEFINE_FUNC(BN_hex2bn, 2);
295DEFINE_FUNC(BN_dec2bn, 2);
296DEFINE_FUNC(BN_asc2bn, 2);
297
298DEFINE_FUNC(BN_bn2bin, 2);
299DEFINE_FUNC(BN_bin2bn, 3);
300
301// BIO-related functions
302
303DEFINE_FUNC(BIO_new, 1);
304DEFINE_FUNC(BIO_new_mem_buf, 2);
305DEFINE_FUNC(BIO_free, 1);
306
307DEFINE_FUNC(BIO_read, 3, -1);
308DEFINE_FUNC(BIO_write, 3, -1);
309DEFINE_FUNC(BIO_s_mem, 0);
310DEFINE_FUNC(BIO_ctrl, 4, -1);
311
312DEFINE_FUNC(BIO_set_data, 2);
313
314DEFINE_FUNC(BIO_get_data, 1);
315DEFINE_FUNC(BIO_set_init, 2);
316
317DEFINE_FUNC(BIO_set_flags, 2);
318DEFINE_FUNC(BIO_test_flags, 2);
319DEFINE_FUNC(BIO_clear_flags, 2);
320
321DEFINE_FUNC(BIO_meth_new, 2);
322DEFINE_FUNC(BIO_meth_free, 1);
323
324DEFINE_FUNC(BIO_meth_set_write, 2);
325DEFINE_FUNC(BIO_meth_set_read, 2);
326DEFINE_FUNC(BIO_meth_set_puts, 2);
327DEFINE_FUNC(BIO_meth_set_gets, 2);
328DEFINE_FUNC(BIO_meth_set_ctrl, 2);
329DEFINE_FUNC(BIO_meth_set_create, 2);
330DEFINE_FUNC(BIO_meth_set_destroy, 2);
331DEFINE_FUNC(BIO_meth_set_callback_ctrl, 2);
332
333// DTLS functions
334
335DEFINE_FUNC(DTLS_client_method, 0);
337DEFINE_FUNC(DTLS_server_method, 0);
338
339// EVP functions
340
341extern "C" [[maybe_unused]] EXPORT_FUNC EVP_PKEY *EVP_PKEY_Q_keygen(
342 OSSL_LIB_CTX *libctx,
343 const char *propq,
344 const char *type,
345 ...)
346{
347 const auto f = reinterpret_cast<decltype(::EVP_PKEY_Q_keygen)*>(
348 SymbolsResolverImpl::instance().EVP_PKEY_Q_keygen);
349 if (!f)
350 return nullptr;
351
352 va_list args;
353 va_start(args, type);
354 auto cleanup = qScopeGuard([&] {
355 va_end(args);
356 });
357
358 if (strcmp(type, "RSA") == 0) {
359 return f(libctx, propq, type, va_arg(args, size_t));
360 } else if (strcmp(type, "EC") == 0) {
361 return f(libctx, propq, type, va_arg(args, char *));
362 }
363
364 return f(libctx, propq, type);
365}
366
367DEFINE_FUNC(EVP_PKEY_CTX_free, 1);
368DEFINE_FUNC(EVP_PKEY_CTX_new_from_name, 3);
369DEFINE_FUNC(EVP_PKEY_CTX_set_params, 2);
370DEFINE_FUNC(EVP_PKEY_free, 1);
371DEFINE_FUNC(EVP_PKEY_generate, 2);
372DEFINE_FUNC(EVP_PKEY_keygen_init, 1);
373DEFINE_FUNC(EVP_PKEY_keygen, 2);
374DEFINE_FUNC(EVP_sha1, 0);
375DEFINE_FUNC(EVP_sha256, 0);
376
377// PEM functions
378
379DEFINE_FUNC(PEM_read_bio_PrivateKey, 4);
380DEFINE_FUNC(PEM_read_bio_X509, 4);
381DEFINE_FUNC(PEM_write_bio_PrivateKey, 7, -1);
382DEFINE_FUNC(PEM_write_bio_X509, 2);
383
384// SSL functions
385
386DEFINE_FUNC(SSL_CTX_ctrl, 4, -1);
387DEFINE_FUNC(SSL_CTX_free, 1);
388DEFINE_FUNC(SSL_CTX_load_verify_locations, 3, -1);
389DEFINE_FUNC(SSL_CTX_new, 1);
390DEFINE_FUNC(SSL_CTX_set_default_verify_paths, 1);
391DEFINE_FUNC(SSL_CTX_set_info_callback, 2);
392DEFINE_FUNC(SSL_CTX_set_options, 2);
393DEFINE_FUNC(SSL_CTX_set_tlsext_use_srtp, 2, 1);
394DEFINE_FUNC(SSL_CTX_set_verify, 3);
395DEFINE_FUNC(SSL_CTX_up_ref, 1);
396DEFINE_FUNC(SSL_CTX_use_PrivateKey, 2);
397DEFINE_FUNC(SSL_CTX_use_PrivateKey_file, 3);
398DEFINE_FUNC(SSL_CTX_use_certificate, 2);
399DEFINE_FUNC(SSL_CTX_use_certificate_chain_file, 2);
400
401DEFINE_FUNC(SSL_new, 1);
402DEFINE_FUNC(SSL_up_ref, 1);
403DEFINE_FUNC(SSL_free, 1);
404
405DEFINE_FUNC(SSL_accept, 1);
406DEFINE_FUNC(SSL_do_handshake, 1, -1);
407DEFINE_FUNC(SSL_stateless, 1);
408DEFINE_FUNC(SSL_connect, 1);
409DEFINE_FUNC(SSL_is_init_finished, 1, 0);
410DEFINE_FUNC(SSL_read, 3, -1);
411DEFINE_FUNC(SSL_peek, 3);
412DEFINE_FUNC(SSL_write, 3, -1);
413DEFINE_FUNC(SSL_ctrl, 4);
414DEFINE_FUNC(SSL_get_ex_data, 2);
415DEFINE_FUNC(SSL_set1_host, 2);
416DEFINE_FUNC(SSL_set_accept_state, 1);
417DEFINE_FUNC(SSL_set_bio, 3);
418DEFINE_FUNC(SSL_set_connect_state, 1);
419DEFINE_FUNC(SSL_set_ex_data, 3);
420DEFINE_FUNC(SSL_set_hostflags, 2);
421DEFINE_FUNC(SSL_set_options, 2);
422DEFINE_FUNC(SSL_shutdown, 1);
423DEFINE_FUNC(SSL_state_string, 1);
424DEFINE_FUNC(SSL_state_string_long, 1);
425
427
428// options are unsigned long in openssl 1.1.1, and uint64 in 3.x.x
429
430DEFINE_FUNC(SSL_get_error, 2);
431
432DEFINE_FUNC(ERR_clear_error, 0);
433DEFINE_FUNC(ERR_get_error, 0);
434static char ErrorString[] = "Ssl not found";
435DEFINE_FUNC(ERR_error_string, 2, ErrorString);
436// TODO: We could implement this one when SSL is not linked.
438
439// TLS functions
440
441DEFINE_FUNC(TLS_client_method, 0);
442DEFINE_FUNC(TLS_server_method, 0);
443
444// RAND functions
445
446DEFINE_FUNC(RAND_bytes, 2);
447
448// X509 functions
449DEFINE_FUNC(X509_NAME_add_entry_by_txt, 7);
450DEFINE_FUNC(X509_NAME_free, 1);
451DEFINE_FUNC(X509_NAME_new, 0);
452DEFINE_FUNC(X509_digest, 4, 0);
453DEFINE_FUNC(X509_free, 1);
454DEFINE_FUNC(X509_get_serialNumber, 1);
455DEFINE_FUNC(X509_getm_notAfter, 1);
456DEFINE_FUNC(X509_getm_notBefore, 1);
457DEFINE_FUNC(X509_gmtime_adj, 2);
458DEFINE_FUNC(X509_new, 0);
459DEFINE_FUNC(X509_set_issuer_name, 2);
460DEFINE_FUNC(X509_set_pubkey, 2);
461DEFINE_FUNC(X509_set_subject_name, 2);
462DEFINE_FUNC(X509_set_version, 2);
463DEFINE_FUNC(X509_sign, 3);
static constexpr auto SHLIB_VERSION
INIT_FUNC(BN_CTX_get)
INIT_FUNC(EVP_PKEY_Q_keygen)
INIT_FUNC(SSL_CTX_new)
INIT_FUNC(SSL_up_ref)
INIT_FUNC(BIO_meth_set_ctrl)
INIT_FUNC(SSL_set_connect_state)
INIT_FUNC(X509_set_version)
INIT_FUNC(SSL_write)
INIT_FUNC(X509_NAME_new)
INIT_FUNC(RAND_bytes)
INIT_FUNC(BIO_meth_set_read)
INIT_FUNC(BN_bin2bn)
INIT_FUNC(EVP_sha1)
INIT_FUNC(SSL_set_ex_data)
INIT_FUNC(BIO_test_flags)
INIT_FUNC(BN_CTX_new)
INIT_FUNC(BIO_meth_set_write)
INIT_FUNC(BIO_meth_set_gets)
INIT_FUNC(SSL_accept)
INIT_FUNC(BIO_new_mem_buf)
INIT_FUNC(TLS_server_method)
INIT_FUNC(SSL_peek)
INIT_FUNC(BIO_clear_flags)
INIT_FUNC(ERR_error_string_n)
INIT_FUNC(ERR_error_string)
INIT_FUNC(BN_hex2bn)
INIT_FUNC(DTLS_client_method)
INIT_FUNC(X509_NAME_free)
INIT_FUNC(SSL_set_accept_state)
INIT_FUNC(SSL_set_options)
INIT_FUNC(SSL_CTX_set_info_callback)
INIT_FUNC(PEM_read_bio_PrivateKey)
INIT_FUNC(BIO_meth_set_create)
INIT_FUNC(BN_bn2dec)
INIT_FUNC(SSL_shutdown)
static std::unique_ptr< QLibrary > loadLib()
INIT_FUNC(SSL_CTX_use_PrivateKey_file)
INIT_FUNC(SSL_read)
INIT_FUNC(TLS_client_method)
INIT_FUNC(X509_gmtime_adj)
INIT_FUNC(BN_CTX_end)
INIT_FUNC(SSL_get_ex_data)
static char ErrorString[]
INIT_FUNC(ERR_clear_error)
INIT_FUNC(BIO_read)
INIT_FUNC(BN_rand)
INIT_FUNC(BN_value_one)
INIT_FUNC(EVP_PKEY_generate)
INIT_FUNC(DTLS_server_method)
INIT_FUNC(BIO_meth_new)
INIT_FUNC(EVP_PKEY_CTX_new_from_name)
INIT_FUNC(BIO_meth_free)
INIT_FUNC(X509_getm_notAfter)
INIT_FUNC(SSL_ctrl)
INIT_FUNC(SSL_is_init_finished)
INIT_FUNC(BIO_meth_set_destroy)
INIT_FUNC(X509_set_subject_name)
INIT_FUNC(X509_digest)
INIT_FUNC(BIO_s_mem)
INIT_FUNC(BN_copy)
INIT_FUNC(X509_get_serialNumber)
INIT_FUNC(X509_set_pubkey)
INIT_FUNC(EVP_PKEY_free)
INIT_FUNC(X509_NAME_add_entry_by_txt)
INIT_FUNC(EVP_PKEY_keygen)
INIT_FUNC(SSL_CTX_set_tlsext_use_srtp)
INIT_FUNC(BIO_meth_set_puts)
INIT_FUNC(SSL_CTX_free)
INIT_FUNC(X509_set_issuer_name)
INIT_FUNC(BN_dec2bn)
INIT_FUNC(EVP_sha256)
INIT_FUNC(SSL_connect)
INIT_FUNC(SSL_get_error)
INIT_FUNC(SSL_free)
INIT_FUNC(SSL_CTX_ctrl)
INIT_FUNC(BIO_write)
INIT_FUNC(SSL_CTX_load_verify_locations)
INIT_FUNC(BIO_set_flags)
INIT_FUNC(EVP_PKEY_keygen_init)
INIT_FUNC(SSL_new)
INIT_FUNC(BN_CTX_start)
INIT_FUNC(PEM_write_bio_PrivateKey)
INIT_FUNC(BN_bn2hex)
INIT_FUNC(SSL_CTX_set_default_verify_paths)
INIT_FUNC(PEM_read_bio_X509)
INIT_FUNC(BIO_meth_set_callback_ctrl)
INIT_FUNC(BIO_set_init)
INIT_FUNC(SSL_set_bio)
INIT_FUNC(BIO_ctrl)
INIT_FUNC(BN_asc2bn)
INIT_FUNC(SSL_set_hostflags)
INIT_FUNC(BN_num_bits_word)
INIT_FUNC(SSL_set1_host)
INIT_FUNC(X509_new)
INIT_FUNC(SSL_export_keying_material)
INIT_FUNC(BN_mod_word)
INIT_FUNC(SSL_CTX_set_verify)
INIT_FUNC(SSL_CTX_use_PrivateKey)
INIT_FUNC(BIO_set_data)
INIT_FUNC(BN_num_bits)
INIT_FUNC(SSL_stateless)
INIT_FUNC(EVP_PKEY_CTX_set_params)
INIT_FUNC(SSL_do_handshake)
INIT_FUNC(X509_getm_notBefore)
INIT_FUNC(BN_bn2bin)
INIT_FUNC(DTLS_get_data_mtu)
INIT_FUNC(BN_mod_exp)
INIT_FUNC(SSL_state_string_long)
INIT_FUNC(BIO_get_data)
INIT_FUNC(SSL_CTX_set_options)
INIT_FUNC(ERR_get_error)
INIT_FUNC(SSL_CTX_up_ref)
INIT_FUNC(SSL_state_string)
INIT_FUNC(X509_sign)
INIT_FUNC(EVP_PKEY_CTX_free)
INIT_FUNC(PEM_write_bio_X509)
INIT_FUNC(BIO_new)
INIT_FUNC(X509_free)
INIT_FUNC(BIO_free)
INIT_FUNC(BN_CTX_free)
CHECK_VERSIONS("va-drm", VA_DRM_NEEDED_SOVERSION, VA_MAJOR_VERSION+1)
DEFINE_FUNC(pw_deinit, 0)