Use explicit EVP_MD_fetch with OpenSSL 3.0, because EVP_sha* fetch algorithm each time and are extremely slow in OpenSSL 3.0.
This commit is contained in:
parent
3c56140995
commit
398a996ef8
@ -688,11 +688,24 @@ static void make_digest(Slice data, MutableSlice output, const EVP_MD *evp_md) {
|
|||||||
LOG_IF(FATAL, res != 1);
|
LOG_IF(FATAL, res != 1);
|
||||||
EVP_MD_CTX_free(ctx);
|
EVP_MD_CTX_free(ctx);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void init_thread_local_evp_md(const EVP_MD *&evp_md, const char *algorithm) {
|
||||||
|
evp_md = EVP_MD_fetch(nullptr, algorithm, nullptr);
|
||||||
|
LOG_IF(FATAL, evp_md == nullptr);
|
||||||
|
detail::add_thread_local_destructor(create_destructor([&evp_md]() mutable {
|
||||||
|
EVP_MD_free(const_cast<EVP_MD *>(evp_md));
|
||||||
|
evp_md = nullptr;
|
||||||
|
}));
|
||||||
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
void sha1(Slice data, unsigned char output[20]) {
|
void sha1(Slice data, unsigned char output[20]) {
|
||||||
#if OPENSSL_VERSION_NUMBER >= 0x30000000L && !defined(LIBRESSL_VERSION_NUMBER)
|
#if OPENSSL_VERSION_NUMBER >= 0x30000000L && !defined(LIBRESSL_VERSION_NUMBER)
|
||||||
make_digest(data, MutableSlice(output, 20), EVP_sha1());
|
static TD_THREAD_LOCAL const EVP_MD *evp_md;
|
||||||
|
if (unlikely(evp_md == nullptr)) {
|
||||||
|
init_thread_local_evp_md(evp_md, "sha1");
|
||||||
|
}
|
||||||
|
make_digest(data, MutableSlice(output, 20), evp_md);
|
||||||
#else
|
#else
|
||||||
auto result = SHA1(data.ubegin(), data.size(), output);
|
auto result = SHA1(data.ubegin(), data.size(), output);
|
||||||
CHECK(result == output);
|
CHECK(result == output);
|
||||||
@ -702,7 +715,11 @@ void sha1(Slice data, unsigned char output[20]) {
|
|||||||
void sha256(Slice data, MutableSlice output) {
|
void sha256(Slice data, MutableSlice output) {
|
||||||
CHECK(output.size() >= 32);
|
CHECK(output.size() >= 32);
|
||||||
#if OPENSSL_VERSION_NUMBER >= 0x30000000L && !defined(LIBRESSL_VERSION_NUMBER)
|
#if OPENSSL_VERSION_NUMBER >= 0x30000000L && !defined(LIBRESSL_VERSION_NUMBER)
|
||||||
make_digest(data, output, EVP_sha256());
|
static TD_THREAD_LOCAL const EVP_MD *evp_md;
|
||||||
|
if (unlikely(evp_md == nullptr)) {
|
||||||
|
init_thread_local_evp_md(evp_md, "sha256");
|
||||||
|
}
|
||||||
|
make_digest(data, output, evp_md);
|
||||||
#else
|
#else
|
||||||
auto result = SHA256(data.ubegin(), data.size(), output.ubegin());
|
auto result = SHA256(data.ubegin(), data.size(), output.ubegin());
|
||||||
CHECK(result == output.ubegin());
|
CHECK(result == output.ubegin());
|
||||||
@ -712,7 +729,11 @@ void sha256(Slice data, MutableSlice output) {
|
|||||||
void sha512(Slice data, MutableSlice output) {
|
void sha512(Slice data, MutableSlice output) {
|
||||||
CHECK(output.size() >= 64);
|
CHECK(output.size() >= 64);
|
||||||
#if OPENSSL_VERSION_NUMBER >= 0x30000000L && !defined(LIBRESSL_VERSION_NUMBER)
|
#if OPENSSL_VERSION_NUMBER >= 0x30000000L && !defined(LIBRESSL_VERSION_NUMBER)
|
||||||
make_digest(data, output, EVP_sha512());
|
static TD_THREAD_LOCAL const EVP_MD *evp_md;
|
||||||
|
if (unlikely(evp_md == nullptr)) {
|
||||||
|
init_thread_local_evp_md(evp_md, "sha512");
|
||||||
|
}
|
||||||
|
make_digest(data, output, evp_md);
|
||||||
#else
|
#else
|
||||||
auto result = SHA512(data.ubegin(), data.size(), output.ubegin());
|
auto result = SHA512(data.ubegin(), data.size(), output.ubegin());
|
||||||
CHECK(result == output.ubegin());
|
CHECK(result == output.ubegin());
|
||||||
@ -792,7 +813,11 @@ void Sha256State::init() {
|
|||||||
}
|
}
|
||||||
CHECK(!is_inited_);
|
CHECK(!is_inited_);
|
||||||
#if OPENSSL_VERSION_NUMBER >= 0x30000000L && !defined(LIBRESSL_VERSION_NUMBER)
|
#if OPENSSL_VERSION_NUMBER >= 0x30000000L && !defined(LIBRESSL_VERSION_NUMBER)
|
||||||
int err = EVP_DigestInit_ex(impl_->ctx_, EVP_sha256(), nullptr);
|
static TD_THREAD_LOCAL const EVP_MD *evp_md;
|
||||||
|
if (unlikely(evp_md == nullptr)) {
|
||||||
|
init_thread_local_evp_md(evp_md, "sha256");
|
||||||
|
}
|
||||||
|
int err = EVP_DigestInit_ex(impl_->ctx_, evp_md, nullptr);
|
||||||
#else
|
#else
|
||||||
int err = SHA256_Init(&impl_->ctx_);
|
int err = SHA256_Init(&impl_->ctx_);
|
||||||
#endif
|
#endif
|
||||||
@ -830,7 +855,11 @@ void Sha256State::extract(MutableSlice output, bool destroy) {
|
|||||||
void md5(Slice input, MutableSlice output) {
|
void md5(Slice input, MutableSlice output) {
|
||||||
CHECK(output.size() >= 16);
|
CHECK(output.size() >= 16);
|
||||||
#if OPENSSL_VERSION_NUMBER >= 0x30000000L && !defined(LIBRESSL_VERSION_NUMBER)
|
#if OPENSSL_VERSION_NUMBER >= 0x30000000L && !defined(LIBRESSL_VERSION_NUMBER)
|
||||||
make_digest(input, output, EVP_md5());
|
static TD_THREAD_LOCAL const EVP_MD *evp_md;
|
||||||
|
if (unlikely(evp_md == nullptr)) {
|
||||||
|
init_thread_local_evp_md(evp_md, "md5");
|
||||||
|
}
|
||||||
|
make_digest(input, output, evp_md);
|
||||||
#else
|
#else
|
||||||
auto result = MD5(input.ubegin(), input.size(), output.ubegin());
|
auto result = MD5(input.ubegin(), input.size(), output.ubegin());
|
||||||
CHECK(result == output.ubegin());
|
CHECK(result == output.ubegin());
|
||||||
|
Loading…
x
Reference in New Issue
Block a user