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