Legends-of-Azeroth-Pandaria-5.4.8

Форк
0
85 строк · 2.7 Кб
1
/*
2
* This file is part of the Pandaria 5.4.8 Project. See THANKS file for Copyright information
3
*
4
* This program is free software; you can redistribute it and/or modify it
5
* under the terms of the GNU General Public License as published by the
6
* Free Software Foundation; either version 2 of the License, or (at your
7
* option) any later version.
8
*
9
* This program is distributed in the hope that it will be useful, but WITHOUT
10
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
12
* more details.
13
*
14
* You should have received a copy of the GNU General Public License along
15
* with this program. If not, see <http://www.gnu.org/licenses/>.
16
*/
17

18
#include <OpenSSLCrypto.h>
19
#include <openssl/crypto.h>
20

21
#if defined(OPENSSL_VERSION_NUMBER) && OPENSSL_VERSION_NUMBER < 0x1010000fL
22
#include <vector>
23
#include <thread>
24
#include <mutex>
25

26
std::vector<std::mutex*> cryptoLocks;
27

28
static void lockingCallback(int mode, int type, char const* /*file*/, int /*line*/)
29
{
30
    if (mode & CRYPTO_LOCK)
31
        cryptoLocks[type]->lock();
32
    else
33
        cryptoLocks[type]->unlock();
34
}
35

36
static void threadIdCallback(CRYPTO_THREADID * id)
37
{
38
    (void)id;
39
    CRYPTO_THREADID_set_numeric(id, std::hash<std::thread::id>()(std::this_thread::get_id()));
40
}
41
#elif OPENSSL_VERSION_NUMBER >= 0x30000000L
42
#include <openssl/provider.h>
43
OSSL_PROVIDER* LegacyProvider;
44
OSSL_PROVIDER* DefaultProvider;
45
#endif
46

47
void OpenSSLCrypto::threadsSetup([[maybe_unused]] boost::filesystem::path const& providerModulePath)
48
{
49
#if defined(OPENSSL_VERSION_NUMBER) && OPENSSL_VERSION_NUMBER < 0x1010000fL
50
    cryptoLocks.resize(CRYPTO_num_locks());
51
    for(int i = 0 ; i < CRYPTO_num_locks(); ++i)
52
    {
53
        cryptoLocks[i] = new std::mutex();
54
    }
55

56
    (void)&threadIdCallback;
57
    CRYPTO_THREADID_set_callback(threadIdCallback);
58

59
    (void)&lockingCallback;
60
    CRYPTO_set_locking_callback(lockingCallback);
61
#elif OPENSSL_VERSION_NUMBER >= 0x30000000L
62
#if TRINITY_PLATFORM == TRINITY_PLATFORM_WINDOWS
63
    OSSL_PROVIDER_set_default_search_path(nullptr, providerModulePath.string().c_str());
64
#endif
65
    LegacyProvider = OSSL_PROVIDER_load(nullptr, "legacy");
66
    DefaultProvider = OSSL_PROVIDER_load(nullptr, "default");
67
#endif
68
}
69

70
void OpenSSLCrypto::threadsCleanup()
71
{
72
#if defined(OPENSSL_VERSION_NUMBER) && OPENSSL_VERSION_NUMBER < 0x1010000fL
73
    CRYPTO_set_locking_callback(nullptr);
74
    CRYPTO_THREADID_set_callback(nullptr);
75
    for(int i = 0 ; i < CRYPTO_num_locks(); ++i)
76
    {
77
        delete cryptoLocks[i];
78
    }
79
    cryptoLocks.resize(0);
80
#elif OPENSSL_VERSION_NUMBER >= 0x30000000L
81
    OSSL_PROVIDER_unload(LegacyProvider);
82
    OSSL_PROVIDER_unload(DefaultProvider);
83
    OSSL_PROVIDER_set_default_search_path(nullptr, nullptr);
84
#endif
85
}

Использование cookies

Мы используем файлы cookie в соответствии с Политикой конфиденциальности и Политикой использования cookies.

Нажимая кнопку «Принимаю», Вы даете АО «СберТех» согласие на обработку Ваших персональных данных в целях совершенствования нашего веб-сайта и Сервиса GitVerse, а также повышения удобства их использования.

Запретить использование cookies Вы можете самостоятельно в настройках Вашего браузера.