openssl 初始化函数到底做了什么?
每次使用openssl前都会使用如下几个函数进行初始化:
OpenSSL_add_all_ciphers();
OpenSSL_add_all_digests();
ERR_load_crypto_strings();
那么我们会有疑问:这个函数到底是干嘛的,能不能在别的地方多次使用?
首先分析OpenSSL_add_all_ciphers() 这是一个宏定义,其定义如下:
# define OpenSSL_add_all_ciphers() \
OPENSSL_init_crypto(OPENSSL_INIT_ADD_ALL_CIPHERS, NULL)
OPENSSL_init_crypto做了两件事情:
1、CRYPTO_THREAD_run_once(&base, ossl_init_base);
2、CRYPTO_THREAD_run_once(&add_all_ciphers,
ossl_init_add_all_ciphers)
CRYPTO_THREAD_run_once函数通过调用Linux库函数pthread_once保证在多线程环境下ossl_init_add_all_ciphers只进行一次初始化。
ossl_init_add_all_ciphers函数调用openssl_add_all_ciphers_int进行