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);
74
75// BN functions
76
79
80INIT_FUNC(BN_div_word)
81INIT_FUNC(BN_mul_word)
82INIT_FUNC(BN_add_word)
83INIT_FUNC(BN_sub_word)
84INIT_FUNC(BN_set_word)
85INIT_FUNC(BN_new)
86INIT_FUNC(BN_cmp)
87
88INIT_FUNC(BN_free);
89
91
93
96
99
102
105
108
112
115
116// BIO-related functions
117
121
126
128
131
135
138
147
149
150// DTLS functions
154
155// EVP functions
156
167
168// PEM functions
169
174
175// SSL functions
176
189INIT_FUNC(SSL_CTX_use_certificate)
190INIT_FUNC(SSL_CTX_use_certificate_chain_file);
191
195
217
219
220// options are unsigned long in openssl 1.1.1, and uint64 in 3.x.x
221
223
228
229// TLS functions
230
233
234// RAND functions
235
237
238// X509 functions
239
256
257END_INIT_FUNCS()
258
259//////////// Define
260
261// ASN1 functions
262
263DEFINE_FUNC(ASN1_INTEGER_set, 2);
264DEFINE_FUNC(ASN1_INTEGER_set_uint64, 2);
265
266// BN functions
267
268DEFINE_FUNC(BN_value_one, 0);
269DEFINE_FUNC(BN_mod_word, 2);
270
271DEFINE_FUNC(BN_div_word, 2)
272DEFINE_FUNC(BN_mul_word, 2)
273DEFINE_FUNC(BN_add_word, 2)
274DEFINE_FUNC(BN_sub_word, 2)
275DEFINE_FUNC(BN_set_word, 2)
276DEFINE_FUNC(BN_new, 0)
277DEFINE_FUNC(BN_cmp, 2)
278
279DEFINE_FUNC(BN_free, 1);
280
281DEFINE_FUNC(BN_copy, 2);
282
283DEFINE_FUNC(BN_CTX_new, 0);
284
285DEFINE_FUNC(BN_CTX_free, 1);
286DEFINE_FUNC(BN_CTX_start, 1);
287
288DEFINE_FUNC(BN_CTX_get, 1);
289DEFINE_FUNC(BN_CTX_end, 1);
290
291DEFINE_FUNC(BN_rand, 4);
292DEFINE_FUNC(BN_mod_exp, 5);
293
294DEFINE_FUNC(BN_num_bits, 1);
295DEFINE_FUNC(BN_num_bits_word, 1);
296
297DEFINE_FUNC(BN_bn2hex, 1);
298DEFINE_FUNC(BN_bn2dec, 1);
299
300DEFINE_FUNC(BN_hex2bn, 2);
301DEFINE_FUNC(BN_dec2bn, 2);
302DEFINE_FUNC(BN_asc2bn, 2);
303
304DEFINE_FUNC(BN_bn2bin, 2);
305DEFINE_FUNC(BN_bin2bn, 3);
306
307// BIO-related functions
308
309DEFINE_FUNC(BIO_new, 1);
310DEFINE_FUNC(BIO_new_mem_buf, 2);
311DEFINE_FUNC(BIO_free, 1);
312
313DEFINE_FUNC(BIO_read, 3, -1);
314DEFINE_FUNC(BIO_write, 3, -1);
315DEFINE_FUNC(BIO_s_mem, 0);
316DEFINE_FUNC(BIO_ctrl, 4, -1);
317
318DEFINE_FUNC(BIO_set_data, 2);
319
320DEFINE_FUNC(BIO_get_data, 1);
321DEFINE_FUNC(BIO_set_init, 2);
322
323DEFINE_FUNC(BIO_set_flags, 2);
324DEFINE_FUNC(BIO_test_flags, 2);
325DEFINE_FUNC(BIO_clear_flags, 2);
326
327DEFINE_FUNC(BIO_meth_new, 2);
328DEFINE_FUNC(BIO_meth_free, 1);
329
330DEFINE_FUNC(BIO_meth_set_write, 2);
331DEFINE_FUNC(BIO_meth_set_read, 2);
332DEFINE_FUNC(BIO_meth_set_puts, 2);
333DEFINE_FUNC(BIO_meth_set_gets, 2);
334DEFINE_FUNC(BIO_meth_set_ctrl, 2);
335DEFINE_FUNC(BIO_meth_set_create, 2);
336DEFINE_FUNC(BIO_meth_set_destroy, 2);
337DEFINE_FUNC(BIO_meth_set_callback_ctrl, 2);
338
340
341// DTLS functions
342
343DEFINE_FUNC(DTLS_client_method, 0);
345DEFINE_FUNC(DTLS_server_method, 0);
346
347// EVP functions
348
349extern "C" [[maybe_unused]] EXPORT_FUNC EVP_PKEY *EVP_PKEY_Q_keygen(
350 OSSL_LIB_CTX *libctx,
351 const char *propq,
352 const char *type,
353 ...)
354{
355 const auto f = reinterpret_cast<decltype(::EVP_PKEY_Q_keygen)*>(
356 SymbolsResolverImpl::instance().EVP_PKEY_Q_keygen);
357 if (!f)
358 return nullptr;
359
360 va_list args;
361 va_start(args, type);
362 auto cleanup = qScopeGuard([&] {
363 va_end(args);
364 });
365
366 if (strcmp(type, "RSA") == 0) {
367 return f(libctx, propq, type, va_arg(args, size_t));
368 } else if (strcmp(type, "EC") == 0) {
369 return f(libctx, propq, type, va_arg(args, char *));
370 }
371
372 return f(libctx, propq, type);
373}
374
375DEFINE_FUNC(EVP_PKEY_CTX_free, 1);
376DEFINE_FUNC(EVP_PKEY_CTX_new_from_name, 3);
377DEFINE_FUNC(EVP_PKEY_CTX_set_params, 2);
378DEFINE_FUNC(EVP_PKEY_free, 1);
379DEFINE_FUNC(EVP_PKEY_generate, 2);
380DEFINE_FUNC(EVP_PKEY_keygen_init, 1);
381DEFINE_FUNC(EVP_PKEY_keygen, 2);
382DEFINE_FUNC(EVP_sha1, 0);
383DEFINE_FUNC(EVP_sha256, 0);
384
385// PEM functions
386
387DEFINE_FUNC(PEM_read_bio_PrivateKey, 4);
388DEFINE_FUNC(PEM_read_bio_X509, 4);
389DEFINE_FUNC(PEM_write_bio_PrivateKey, 7, 0);
390DEFINE_FUNC(PEM_write_bio_X509, 2);
391
392// SSL functions
393
394DEFINE_FUNC(SSL_CTX_ctrl, 4, -1);
395DEFINE_FUNC(SSL_CTX_free, 1);
396DEFINE_FUNC(SSL_CTX_load_verify_locations, 3, 0);
397DEFINE_FUNC(SSL_CTX_new, 1);
398DEFINE_FUNC(SSL_CTX_set_default_verify_paths, 1);
399DEFINE_FUNC(SSL_CTX_set_info_callback, 2);
400DEFINE_FUNC(SSL_CTX_set_options, 2);
401DEFINE_FUNC(SSL_CTX_set_tlsext_use_srtp, 2, 1);
402DEFINE_FUNC(SSL_CTX_set_verify, 3);
403DEFINE_FUNC(SSL_CTX_up_ref, 1);
404DEFINE_FUNC(SSL_CTX_use_PrivateKey, 2);
405DEFINE_FUNC(SSL_CTX_use_PrivateKey_file, 3);
406DEFINE_FUNC(SSL_CTX_use_certificate, 2);
407DEFINE_FUNC(SSL_CTX_use_certificate_chain_file, 2);
408
409DEFINE_FUNC(SSL_new, 1);
410DEFINE_FUNC(SSL_up_ref, 1);
411DEFINE_FUNC(SSL_free, 1);
412
413DEFINE_FUNC(SSL_accept, 1);
414DEFINE_FUNC(SSL_do_handshake, 1, -1);
415DEFINE_FUNC(SSL_stateless, 1);
416DEFINE_FUNC(SSL_connect, 1);
417DEFINE_FUNC(SSL_is_init_finished, 1, 0);
418DEFINE_FUNC(SSL_read, 3, -1);
419DEFINE_FUNC(SSL_peek, 3);
420DEFINE_FUNC(SSL_write, 3, -1);
421DEFINE_FUNC(SSL_ctrl, 4);
422DEFINE_FUNC(SSL_get0_param, 1);
423DEFINE_FUNC(SSL_get_ex_data, 2);
424DEFINE_FUNC(SSL_set1_host, 2);
425DEFINE_FUNC(SSL_set_accept_state, 1);
426DEFINE_FUNC(SSL_set_bio, 3);
427DEFINE_FUNC(SSL_set_connect_state, 1);
428DEFINE_FUNC(SSL_set_ex_data, 3);
429DEFINE_FUNC(SSL_set_hostflags, 2);
430DEFINE_FUNC(SSL_set_options, 2);
431DEFINE_FUNC(SSL_shutdown, 1);
432DEFINE_FUNC(SSL_state_string, 1);
433DEFINE_FUNC(SSL_state_string_long, 1);
434
436
437// options are unsigned long in openssl 1.1.1, and uint64 in 3.x.x
438
439DEFINE_FUNC(SSL_get_error, 2, SSL_ERROR_SSL);
440
441DEFINE_FUNC(ERR_clear_error, 0);
442DEFINE_FUNC(ERR_get_error, 0);
443static char ErrorString[] = "Ssl not found";
444DEFINE_FUNC(ERR_error_string, 2, ErrorString);
445// TODO: We could implement this one when SSL is not linked.
447
448// TLS functions
449
450DEFINE_FUNC(TLS_client_method, 0);
451DEFINE_FUNC(TLS_server_method, 0);
452
453// RAND functions
454
455DEFINE_FUNC(RAND_bytes, 2);
456
457// X509 functions
458DEFINE_FUNC(X509_NAME_add_entry_by_txt, 7);
459DEFINE_FUNC(X509_NAME_free, 1);
460DEFINE_FUNC(X509_NAME_new, 0);
462DEFINE_FUNC(X509_digest, 4, 0);
463DEFINE_FUNC(X509_free, 1);
464DEFINE_FUNC(X509_get_serialNumber, 1);
465DEFINE_FUNC(X509_getm_notAfter, 1);
466DEFINE_FUNC(X509_getm_notBefore, 1);
467DEFINE_FUNC(X509_gmtime_adj, 2);
468DEFINE_FUNC(X509_new, 0);
469DEFINE_FUNC(X509_set_issuer_name, 2);
470DEFINE_FUNC(X509_set_pubkey, 2);
471DEFINE_FUNC(X509_set_subject_name, 2);
472DEFINE_FUNC(X509_set_version, 2);
473DEFINE_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(ASN1_INTEGER_set_uint64)
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(X509_VERIFY_PARAM_set1_ip)
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(SSL_get0_param)
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(BIO_read_ex)
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)