Skip to content

Commit

Permalink
Report failures to initialize the crypto backend
Browse files Browse the repository at this point in the history
  • Loading branch information
tiennou committed May 14, 2019
1 parent 80ae3a4 commit 866df39
Show file tree
Hide file tree
Showing 6 changed files with 50 additions and 18 deletions.
3 changes: 2 additions & 1 deletion src/global.c
Expand Up @@ -45,7 +45,8 @@ LIBSSH2_API int
libssh2_init(int flags) libssh2_init(int flags)
{ {
if(_libssh2_initialized == 0 && !(flags & LIBSSH2_INIT_NO_CRYPTO)) { if(_libssh2_initialized == 0 && !(flags & LIBSSH2_INIT_NO_CRYPTO)) {
libssh2_crypto_init(); if(libssh2_crypto_init() < 0)
return -1;
} }


_libssh2_initialized++; _libssh2_initialized++;
Expand Down
4 changes: 3 additions & 1 deletion src/mbedtls.c
Expand Up @@ -52,7 +52,7 @@ static mbedtls_ctr_drbg_context _libssh2_mbedtls_ctr_drbg;
* mbedTLS backend: Generic functions * mbedTLS backend: Generic functions
*/ */


void int
_libssh2_mbedtls_init(void) _libssh2_mbedtls_init(void)
{ {
int ret; int ret;
Expand All @@ -65,6 +65,8 @@ _libssh2_mbedtls_init(void)
&_libssh2_mbedtls_entropy, NULL, 0); &_libssh2_mbedtls_entropy, NULL, 0);
if(ret != 0) if(ret != 0)
mbedtls_ctr_drbg_free(&_libssh2_mbedtls_ctr_drbg); mbedtls_ctr_drbg_free(&_libssh2_mbedtls_ctr_drbg);

return ret;
} }


void void
Expand Down
2 changes: 1 addition & 1 deletion src/mbedtls.h
Expand Up @@ -326,7 +326,7 @@
/* /*
* mbedTLS backend: forward declarations * mbedTLS backend: forward declarations
*/ */
void int
_libssh2_mbedtls_init(void); _libssh2_mbedtls_init(void);


void void
Expand Down
2 changes: 1 addition & 1 deletion src/openssl.h
Expand Up @@ -291,7 +291,7 @@ int _libssh2_md5_init(libssh2_md5_ctx *ctx);
#define libssh2_hmac_cleanup(ctx) HMAC_cleanup(ctx) #define libssh2_hmac_cleanup(ctx) HMAC_cleanup(ctx)
#endif #endif


extern void _libssh2_openssl_crypto_init(void); extern int _libssh2_openssl_crypto_init(void);
extern void _libssh2_openssl_crypto_exit(void); extern void _libssh2_openssl_crypto_exit(void);
#define libssh2_crypto_init() _libssh2_openssl_crypto_init() #define libssh2_crypto_init() _libssh2_openssl_crypto_init()
#define libssh2_crypto_exit() _libssh2_openssl_crypto_exit() #define libssh2_crypto_exit() _libssh2_openssl_crypto_exit()
Expand Down
53 changes: 41 additions & 12 deletions src/wincng.c
Expand Up @@ -208,40 +208,64 @@
* Windows CNG backend: Generic functions * Windows CNG backend: Generic functions
*/ */


void int
_libssh2_wincng_init(void) _libssh2_wincng_init(void)
{ {
int ret; int ret;


(void)BCryptOpenAlgorithmProvider(&_libssh2_wincng.hAlgRNG, ret = BCryptOpenAlgorithmProvider(&_libssh2_wincng.hAlgRNG,
BCRYPT_RNG_ALGORITHM, NULL, 0); BCRYPT_RNG_ALGORITHM, NULL, 0);
if(!BCRYPT_SUCCESS(ret))
return -1;


(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))
return -1;

ret = BCryptOpenAlgorithmProvider(&_libssh2_wincng.hAlgHashSHA1,
BCRYPT_SHA1_ALGORITHM, NULL, 0); BCRYPT_SHA1_ALGORITHM, NULL, 0);
(void)BCryptOpenAlgorithmProvider(&_libssh2_wincng.hAlgHashSHA256, if(!BCRYPT_SUCCESS(ret))
return -1;
ret = BCryptOpenAlgorithmProvider(&_libssh2_wincng.hAlgHashSHA256,
BCRYPT_SHA256_ALGORITHM, NULL, 0); BCRYPT_SHA256_ALGORITHM, NULL, 0);
(void)BCryptOpenAlgorithmProvider(&_libssh2_wincng.hAlgHashSHA512, if(!BCRYPT_SUCCESS(ret))
return -1;

ret = BCryptOpenAlgorithmProvider(&_libssh2_wincng.hAlgHashSHA512,
BCRYPT_SHA512_ALGORITHM, NULL, 0); BCRYPT_SHA512_ALGORITHM, NULL, 0);
if(!BCRYPT_SUCCESS(ret))
return -1;


(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))
return -1;
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))
return -1;
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))
return -1;
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))
return -1;


(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))
return -1;
ret = BCryptOpenAlgorithmProvider(&_libssh2_wincng.hAlgDSA,
BCRYPT_DSA_ALGORITHM, NULL, 0); BCRYPT_DSA_ALGORITHM, NULL, 0);
if(!BCRYPT_SUCCESS(ret))
return -1;


ret = BCryptOpenAlgorithmProvider(&_libssh2_wincng.hAlgAES_CBC, ret = BCryptOpenAlgorithmProvider(&_libssh2_wincng.hAlgAES_CBC,
BCRYPT_AES_ALGORITHM, NULL, 0); BCRYPT_AES_ALGORITHM, NULL, 0);
Expand All @@ -252,6 +276,7 @@ _libssh2_wincng_init(void)
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); (void)BCryptCloseAlgorithmProvider(_libssh2_wincng.hAlgAES_CBC, 0);
return -1;
} }
} }


Expand All @@ -264,6 +289,7 @@ _libssh2_wincng_init(void)
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); (void)BCryptCloseAlgorithmProvider(_libssh2_wincng.hAlgAES_ECB, 0);
return -1;
} }
} }


Expand All @@ -276,6 +302,7 @@ _libssh2_wincng_init(void)
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); (void)BCryptCloseAlgorithmProvider(_libssh2_wincng.hAlgRC4_NA, 0);
return -1;
} }
} }


Expand All @@ -289,8 +316,10 @@ _libssh2_wincng_init(void)
if(!BCRYPT_SUCCESS(ret)) { if(!BCRYPT_SUCCESS(ret)) {
(void)BCryptCloseAlgorithmProvider(_libssh2_wincng.hAlg3DES_CBC, (void)BCryptCloseAlgorithmProvider(_libssh2_wincng.hAlg3DES_CBC,
0); 0);
return -1;
} }
} }
return 0;
} }


void void
Expand Down
4 changes: 2 additions & 2 deletions src/wincng.h
Expand Up @@ -109,7 +109,7 @@ struct _libssh2_wincng_ctx _libssh2_wincng;
* Windows CNG backend: Generic functions * Windows CNG backend: Generic functions
*/ */


void _libssh2_wincng_init(void); int _libssh2_wincng_init(void);
void _libssh2_wincng_free(void); void _libssh2_wincng_free(void);


#define libssh2_crypto_init() \ #define libssh2_crypto_init() \
Expand Down Expand Up @@ -395,7 +395,7 @@ _libssh2_bn *_libssh2_wincng_bignum_init(void);
/* /*
* Windows CNG backend: forward declarations * Windows CNG backend: forward declarations
*/ */
void _libssh2_wincng_init(void); int _libssh2_wincng_init(void);
void _libssh2_wincng_free(void); void _libssh2_wincng_free(void);
int _libssh2_wincng_random(void *buf, int len); int _libssh2_wincng_random(void *buf, int len);


Expand Down

0 comments on commit 866df39

Please sign in to comment.