Skip to content

Commit aee8856

Browse files
authored
add fallback when OpenSSL not providing BLAKE2b (#275)
1 parent 8af4886 commit aee8856

File tree

1 file changed

+37
-35
lines changed

1 file changed

+37
-35
lines changed

trantor/utils/crypto/openssl.cc

Lines changed: 37 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -7,16 +7,13 @@
77
#include <openssl/sha.h>
88
#endif
99

10-
// Hack: LibreSSL does not support SHA3. We use our own implementation.
11-
#if defined(LIBRESSL_VERSION_NUMBER) || OPENSSL_VERSION_NUMBER < 0x10100000L
1210
#include "sha3.h"
1311
#include "sha3.cc"
14-
#endif
1512

16-
#if OPENSSL_VERSION_MAJOR < 3 || defined(LIBRESSL_VERSION_NUMBER)
13+
// Some OpenSSL installations does not come with BLAKE2b-256
14+
// We use our own implementation in such case
1715
#include "blake2.h"
1816
#include "blake2.cc"
19-
#endif
2017

2118
namespace trantor
2219
{
@@ -90,49 +87,54 @@ Hash256 sha256(const void* data, size_t len)
9087

9188
Hash256 sha3(const void* data, size_t len)
9289
{
93-
#if defined(LIBRESSL_VERSION_NUMBER) || (OPENSSL_VERSION_NUMBER < 0x10100000L)
94-
Hash256 hash;
95-
trantor_sha3((const unsigned char*)data, len, &hash, sizeof(hash));
96-
return hash;
97-
#elif OPENSSL_VERSION_MAJOR >= 3
90+
#if OPENSSL_VERSION_MAJOR >= 3
9891
Hash256 hash;
9992
auto sha3 = EVP_MD_fetch(nullptr, "SHA3-256", nullptr);
100-
auto ctx = EVP_MD_CTX_new();
101-
EVP_DigestInit_ex(ctx, sha3, nullptr);
102-
EVP_DigestUpdate(ctx, data, len);
103-
EVP_DigestFinal_ex(ctx, (unsigned char*)&hash, nullptr);
104-
EVP_MD_CTX_free(ctx);
105-
EVP_MD_free(sha3);
106-
return hash;
107-
#else
93+
if (sha3 != nullptr)
94+
{
95+
auto ctx = EVP_MD_CTX_new();
96+
EVP_DigestInit_ex(ctx, sha3, nullptr);
97+
EVP_DigestUpdate(ctx, data, len);
98+
EVP_DigestFinal_ex(ctx, (unsigned char*)&hash, nullptr);
99+
EVP_MD_CTX_free(ctx);
100+
EVP_MD_free(sha3);
101+
return hash;
102+
}
103+
#elif !defined(LIBRESSL_VERSION_NUMBER)
108104
Hash256 hash;
109105
auto sha3 = EVP_sha3_256();
110-
EVP_MD_CTX* ctx = EVP_MD_CTX_new();
111-
EVP_DigestInit_ex(ctx, sha3, nullptr);
112-
EVP_DigestUpdate(ctx, data, len);
113-
EVP_DigestFinal_ex(ctx, (unsigned char*)&hash, nullptr);
114-
EVP_MD_CTX_free(ctx);
115-
return hash;
106+
if (sha3 != nullptr)
107+
{
108+
EVP_MD_CTX* ctx = EVP_MD_CTX_new();
109+
EVP_DigestInit_ex(ctx, sha3, nullptr);
110+
EVP_DigestUpdate(ctx, data, len);
111+
EVP_DigestFinal_ex(ctx, (unsigned char*)&hash, nullptr);
112+
EVP_MD_CTX_free(ctx);
113+
return hash;
114+
}
116115
#endif
116+
trantor_sha3((const unsigned char*)data, len, &hash, sizeof(hash));
117+
return hash;
117118
}
118119

119120
Hash256 blake2b(const void* data, size_t len)
120121
{
121-
#if OPENSSL_VERSION_MAJOR >= 3
122122
Hash256 hash;
123+
#if OPENSSL_VERSION_MAJOR >= 3
123124
auto blake2b = EVP_MD_fetch(nullptr, "BLAKE2b-256", nullptr);
124-
auto ctx = EVP_MD_CTX_new();
125-
EVP_DigestInit_ex(ctx, blake2b, nullptr);
126-
EVP_DigestUpdate(ctx, data, len);
127-
EVP_DigestFinal_ex(ctx, (unsigned char*)&hash, nullptr);
128-
EVP_MD_CTX_free(ctx);
129-
EVP_MD_free(blake2b);
130-
return hash;
131-
#else
132-
Hash256 hash;
125+
if (blake2b != nullptr)
126+
{
127+
auto ctx = EVP_MD_CTX_new();
128+
EVP_DigestInit_ex(ctx, blake2b, nullptr);
129+
EVP_DigestUpdate(ctx, data, len);
130+
EVP_DigestFinal_ex(ctx, (unsigned char*)&hash, nullptr);
131+
EVP_MD_CTX_free(ctx);
132+
EVP_MD_free(blake2b);
133+
return hash;
134+
}
135+
#endif
133136
trantor_blake2b(&hash, sizeof(hash), data, len, nullptr, 0);
134137
return hash;
135-
#endif
136138
}
137139

138140
} // namespace utils

0 commit comments

Comments
 (0)