mirror of
https://github.com/libssh2/libssh2.git
synced 2025-11-21 14:00:51 +03:00
wincng: make sure algorithm providers are closed once (#496)
This commit is contained in:
92
src/wincng.c
92
src/wincng.c
@@ -225,35 +225,70 @@ _libssh2_wincng_init(void)
|
|||||||
{
|
{
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
(void)BCryptOpenAlgorithmProvider(&_libssh2_wincng.hAlgRNG,
|
memset(&_libssh2_wincng, 0, sizeof(_libssh2_wincng));
|
||||||
|
|
||||||
|
ret = BCryptOpenAlgorithmProvider(&_libssh2_wincng.hAlgRNG,
|
||||||
BCRYPT_RNG_ALGORITHM, NULL, 0);
|
BCRYPT_RNG_ALGORITHM, NULL, 0);
|
||||||
|
if(!BCRYPT_SUCCESS(ret)) {
|
||||||
|
_libssh2_wincng.hAlgRNG = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
(void)BCryptOpenAlgorithmProvider(&_libssh2_wincng.hAlgHashMD5,
|
ret = BCryptOpenAlgorithmProvider(&_libssh2_wincng.hAlgHashMD5,
|
||||||
BCRYPT_MD5_ALGORITHM, NULL, 0);
|
BCRYPT_MD5_ALGORITHM, NULL, 0);
|
||||||
(void)BCryptOpenAlgorithmProvider(&_libssh2_wincng.hAlgHashSHA1,
|
if(!BCRYPT_SUCCESS(ret)) {
|
||||||
|
_libssh2_wincng.hAlgHashMD5 = NULL;
|
||||||
|
}
|
||||||
|
ret = BCryptOpenAlgorithmProvider(&_libssh2_wincng.hAlgHashSHA1,
|
||||||
BCRYPT_SHA1_ALGORITHM, NULL, 0);
|
BCRYPT_SHA1_ALGORITHM, NULL, 0);
|
||||||
(void)BCryptOpenAlgorithmProvider(&_libssh2_wincng.hAlgHashSHA256,
|
if(!BCRYPT_SUCCESS(ret)) {
|
||||||
|
_libssh2_wincng.hAlgHashSHA1 = NULL;
|
||||||
|
}
|
||||||
|
ret = BCryptOpenAlgorithmProvider(&_libssh2_wincng.hAlgHashSHA256,
|
||||||
BCRYPT_SHA256_ALGORITHM, NULL, 0);
|
BCRYPT_SHA256_ALGORITHM, NULL, 0);
|
||||||
(void)BCryptOpenAlgorithmProvider(&_libssh2_wincng.hAlgHashSHA512,
|
if(!BCRYPT_SUCCESS(ret)) {
|
||||||
|
_libssh2_wincng.hAlgHashSHA256 = NULL;
|
||||||
|
}
|
||||||
|
ret = BCryptOpenAlgorithmProvider(&_libssh2_wincng.hAlgHashSHA512,
|
||||||
BCRYPT_SHA512_ALGORITHM, NULL, 0);
|
BCRYPT_SHA512_ALGORITHM, NULL, 0);
|
||||||
|
if(!BCRYPT_SUCCESS(ret)) {
|
||||||
|
_libssh2_wincng.hAlgHashSHA512 = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
(void)BCryptOpenAlgorithmProvider(&_libssh2_wincng.hAlgHmacMD5,
|
ret = BCryptOpenAlgorithmProvider(&_libssh2_wincng.hAlgHmacMD5,
|
||||||
BCRYPT_MD5_ALGORITHM, NULL,
|
BCRYPT_MD5_ALGORITHM, NULL,
|
||||||
BCRYPT_ALG_HANDLE_HMAC_FLAG);
|
BCRYPT_ALG_HANDLE_HMAC_FLAG);
|
||||||
(void)BCryptOpenAlgorithmProvider(&_libssh2_wincng.hAlgHmacSHA1,
|
if(!BCRYPT_SUCCESS(ret)) {
|
||||||
|
_libssh2_wincng.hAlgHmacMD5 = NULL;
|
||||||
|
}
|
||||||
|
ret = BCryptOpenAlgorithmProvider(&_libssh2_wincng.hAlgHmacSHA1,
|
||||||
BCRYPT_SHA1_ALGORITHM, NULL,
|
BCRYPT_SHA1_ALGORITHM, NULL,
|
||||||
BCRYPT_ALG_HANDLE_HMAC_FLAG);
|
BCRYPT_ALG_HANDLE_HMAC_FLAG);
|
||||||
(void)BCryptOpenAlgorithmProvider(&_libssh2_wincng.hAlgHmacSHA256,
|
if(!BCRYPT_SUCCESS(ret)) {
|
||||||
|
_libssh2_wincng.hAlgHmacSHA1 = NULL;
|
||||||
|
}
|
||||||
|
ret = BCryptOpenAlgorithmProvider(&_libssh2_wincng.hAlgHmacSHA256,
|
||||||
BCRYPT_SHA256_ALGORITHM, NULL,
|
BCRYPT_SHA256_ALGORITHM, NULL,
|
||||||
BCRYPT_ALG_HANDLE_HMAC_FLAG);
|
BCRYPT_ALG_HANDLE_HMAC_FLAG);
|
||||||
(void)BCryptOpenAlgorithmProvider(&_libssh2_wincng.hAlgHmacSHA512,
|
if(!BCRYPT_SUCCESS(ret)) {
|
||||||
|
_libssh2_wincng.hAlgHmacSHA256 = NULL;
|
||||||
|
}
|
||||||
|
ret = BCryptOpenAlgorithmProvider(&_libssh2_wincng.hAlgHmacSHA512,
|
||||||
BCRYPT_SHA512_ALGORITHM, NULL,
|
BCRYPT_SHA512_ALGORITHM, NULL,
|
||||||
BCRYPT_ALG_HANDLE_HMAC_FLAG);
|
BCRYPT_ALG_HANDLE_HMAC_FLAG);
|
||||||
|
if(!BCRYPT_SUCCESS(ret)) {
|
||||||
|
_libssh2_wincng.hAlgHmacSHA512 = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
(void)BCryptOpenAlgorithmProvider(&_libssh2_wincng.hAlgRSA,
|
ret = BCryptOpenAlgorithmProvider(&_libssh2_wincng.hAlgRSA,
|
||||||
BCRYPT_RSA_ALGORITHM, NULL, 0);
|
BCRYPT_RSA_ALGORITHM, NULL, 0);
|
||||||
(void)BCryptOpenAlgorithmProvider(&_libssh2_wincng.hAlgDSA,
|
if(!BCRYPT_SUCCESS(ret)) {
|
||||||
|
_libssh2_wincng.hAlgRSA = NULL;
|
||||||
|
}
|
||||||
|
ret = BCryptOpenAlgorithmProvider(&_libssh2_wincng.hAlgDSA,
|
||||||
BCRYPT_DSA_ALGORITHM, NULL, 0);
|
BCRYPT_DSA_ALGORITHM, NULL, 0);
|
||||||
|
if(!BCRYPT_SUCCESS(ret)) {
|
||||||
|
_libssh2_wincng.hAlgDSA = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
ret = BCryptOpenAlgorithmProvider(&_libssh2_wincng.hAlgAES_CBC,
|
ret = BCryptOpenAlgorithmProvider(&_libssh2_wincng.hAlgAES_CBC,
|
||||||
BCRYPT_AES_ALGORITHM, NULL, 0);
|
BCRYPT_AES_ALGORITHM, NULL, 0);
|
||||||
@@ -263,7 +298,10 @@ _libssh2_wincng_init(void)
|
|||||||
(PBYTE)BCRYPT_CHAIN_MODE_CBC,
|
(PBYTE)BCRYPT_CHAIN_MODE_CBC,
|
||||||
sizeof(BCRYPT_CHAIN_MODE_CBC), 0);
|
sizeof(BCRYPT_CHAIN_MODE_CBC), 0);
|
||||||
if(!BCRYPT_SUCCESS(ret)) {
|
if(!BCRYPT_SUCCESS(ret)) {
|
||||||
(void)BCryptCloseAlgorithmProvider(_libssh2_wincng.hAlgAES_CBC, 0);
|
ret = BCryptCloseAlgorithmProvider(_libssh2_wincng.hAlgAES_CBC, 0);
|
||||||
|
if(BCRYPT_SUCCESS(ret)) {
|
||||||
|
_libssh2_wincng.hAlgAES_CBC = NULL;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -275,7 +313,10 @@ _libssh2_wincng_init(void)
|
|||||||
(PBYTE)BCRYPT_CHAIN_MODE_ECB,
|
(PBYTE)BCRYPT_CHAIN_MODE_ECB,
|
||||||
sizeof(BCRYPT_CHAIN_MODE_ECB), 0);
|
sizeof(BCRYPT_CHAIN_MODE_ECB), 0);
|
||||||
if(!BCRYPT_SUCCESS(ret)) {
|
if(!BCRYPT_SUCCESS(ret)) {
|
||||||
(void)BCryptCloseAlgorithmProvider(_libssh2_wincng.hAlgAES_ECB, 0);
|
ret = BCryptCloseAlgorithmProvider(_libssh2_wincng.hAlgAES_ECB, 0);
|
||||||
|
if(BCRYPT_SUCCESS(ret)) {
|
||||||
|
_libssh2_wincng.hAlgAES_ECB = NULL;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -287,7 +328,10 @@ _libssh2_wincng_init(void)
|
|||||||
(PBYTE)BCRYPT_CHAIN_MODE_NA,
|
(PBYTE)BCRYPT_CHAIN_MODE_NA,
|
||||||
sizeof(BCRYPT_CHAIN_MODE_NA), 0);
|
sizeof(BCRYPT_CHAIN_MODE_NA), 0);
|
||||||
if(!BCRYPT_SUCCESS(ret)) {
|
if(!BCRYPT_SUCCESS(ret)) {
|
||||||
(void)BCryptCloseAlgorithmProvider(_libssh2_wincng.hAlgRC4_NA, 0);
|
ret = BCryptCloseAlgorithmProvider(_libssh2_wincng.hAlgRC4_NA, 0);
|
||||||
|
if(BCRYPT_SUCCESS(ret)) {
|
||||||
|
_libssh2_wincng.hAlgRC4_NA = NULL;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -299,8 +343,11 @@ _libssh2_wincng_init(void)
|
|||||||
(PBYTE)BCRYPT_CHAIN_MODE_CBC,
|
(PBYTE)BCRYPT_CHAIN_MODE_CBC,
|
||||||
sizeof(BCRYPT_CHAIN_MODE_CBC), 0);
|
sizeof(BCRYPT_CHAIN_MODE_CBC), 0);
|
||||||
if(!BCRYPT_SUCCESS(ret)) {
|
if(!BCRYPT_SUCCESS(ret)) {
|
||||||
(void)BCryptCloseAlgorithmProvider(_libssh2_wincng.hAlg3DES_CBC,
|
ret = BCryptCloseAlgorithmProvider(_libssh2_wincng.hAlg3DES_CBC,
|
||||||
0);
|
0);
|
||||||
|
if(BCRYPT_SUCCESS(ret)) {
|
||||||
|
_libssh2_wincng.hAlg3DES_CBC = NULL;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -314,20 +361,35 @@ _libssh2_wincng_init(void)
|
|||||||
void
|
void
|
||||||
_libssh2_wincng_free(void)
|
_libssh2_wincng_free(void)
|
||||||
{
|
{
|
||||||
|
if(_libssh2_wincng.hAlgRNG)
|
||||||
(void)BCryptCloseAlgorithmProvider(_libssh2_wincng.hAlgRNG, 0);
|
(void)BCryptCloseAlgorithmProvider(_libssh2_wincng.hAlgRNG, 0);
|
||||||
|
if(_libssh2_wincng.hAlgHashMD5)
|
||||||
(void)BCryptCloseAlgorithmProvider(_libssh2_wincng.hAlgHashMD5, 0);
|
(void)BCryptCloseAlgorithmProvider(_libssh2_wincng.hAlgHashMD5, 0);
|
||||||
|
if(_libssh2_wincng.hAlgHashSHA1)
|
||||||
(void)BCryptCloseAlgorithmProvider(_libssh2_wincng.hAlgHashSHA1, 0);
|
(void)BCryptCloseAlgorithmProvider(_libssh2_wincng.hAlgHashSHA1, 0);
|
||||||
|
if(_libssh2_wincng.hAlgHashSHA256)
|
||||||
(void)BCryptCloseAlgorithmProvider(_libssh2_wincng.hAlgHashSHA256, 0);
|
(void)BCryptCloseAlgorithmProvider(_libssh2_wincng.hAlgHashSHA256, 0);
|
||||||
|
if(_libssh2_wincng.hAlgHashSHA512)
|
||||||
(void)BCryptCloseAlgorithmProvider(_libssh2_wincng.hAlgHashSHA512, 0);
|
(void)BCryptCloseAlgorithmProvider(_libssh2_wincng.hAlgHashSHA512, 0);
|
||||||
|
if(_libssh2_wincng.hAlgHmacMD5)
|
||||||
(void)BCryptCloseAlgorithmProvider(_libssh2_wincng.hAlgHmacMD5, 0);
|
(void)BCryptCloseAlgorithmProvider(_libssh2_wincng.hAlgHmacMD5, 0);
|
||||||
|
if(_libssh2_wincng.hAlgHmacSHA1)
|
||||||
(void)BCryptCloseAlgorithmProvider(_libssh2_wincng.hAlgHmacSHA1, 0);
|
(void)BCryptCloseAlgorithmProvider(_libssh2_wincng.hAlgHmacSHA1, 0);
|
||||||
|
if(_libssh2_wincng.hAlgHmacSHA256)
|
||||||
(void)BCryptCloseAlgorithmProvider(_libssh2_wincng.hAlgHmacSHA256, 0);
|
(void)BCryptCloseAlgorithmProvider(_libssh2_wincng.hAlgHmacSHA256, 0);
|
||||||
|
if(_libssh2_wincng.hAlgHmacSHA512)
|
||||||
(void)BCryptCloseAlgorithmProvider(_libssh2_wincng.hAlgHmacSHA512, 0);
|
(void)BCryptCloseAlgorithmProvider(_libssh2_wincng.hAlgHmacSHA512, 0);
|
||||||
|
if(_libssh2_wincng.hAlgRSA)
|
||||||
(void)BCryptCloseAlgorithmProvider(_libssh2_wincng.hAlgRSA, 0);
|
(void)BCryptCloseAlgorithmProvider(_libssh2_wincng.hAlgRSA, 0);
|
||||||
|
if(_libssh2_wincng.hAlgDSA)
|
||||||
(void)BCryptCloseAlgorithmProvider(_libssh2_wincng.hAlgDSA, 0);
|
(void)BCryptCloseAlgorithmProvider(_libssh2_wincng.hAlgDSA, 0);
|
||||||
|
if(_libssh2_wincng.hAlgAES_CBC)
|
||||||
(void)BCryptCloseAlgorithmProvider(_libssh2_wincng.hAlgAES_CBC, 0);
|
(void)BCryptCloseAlgorithmProvider(_libssh2_wincng.hAlgAES_CBC, 0);
|
||||||
|
if(_libssh2_wincng.hAlgRC4_NA)
|
||||||
(void)BCryptCloseAlgorithmProvider(_libssh2_wincng.hAlgRC4_NA, 0);
|
(void)BCryptCloseAlgorithmProvider(_libssh2_wincng.hAlgRC4_NA, 0);
|
||||||
|
if(_libssh2_wincng.hAlg3DES_CBC)
|
||||||
(void)BCryptCloseAlgorithmProvider(_libssh2_wincng.hAlg3DES_CBC, 0);
|
(void)BCryptCloseAlgorithmProvider(_libssh2_wincng.hAlg3DES_CBC, 0);
|
||||||
|
if(_libssh2_wincng.hAlgDH)
|
||||||
(void)BCryptCloseAlgorithmProvider(_libssh2_wincng.hAlgDH, 0);
|
(void)BCryptCloseAlgorithmProvider(_libssh2_wincng.hAlgDH, 0);
|
||||||
|
|
||||||
memset(&_libssh2_wincng, 0, sizeof(_libssh2_wincng));
|
memset(&_libssh2_wincng, 0, sizeof(_libssh2_wincng));
|
||||||
|
|||||||
Reference in New Issue
Block a user