|
7 | 7 | #include <openssl/sha.h>
|
8 | 8 | #endif
|
9 | 9 |
|
10 |
| -// Hack: LibreSSL does not support SHA3. We use our own implementation. |
11 |
| -#if defined(LIBRESSL_VERSION_NUMBER) || OPENSSL_VERSION_NUMBER < 0x10100000L |
12 | 10 | #include "sha3.h"
|
13 | 11 | #include "sha3.cc"
|
14 |
| -#endif |
15 | 12 |
|
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 |
17 | 15 | #include "blake2.h"
|
18 | 16 | #include "blake2.cc"
|
19 |
| -#endif |
20 | 17 |
|
21 | 18 | namespace trantor
|
22 | 19 | {
|
@@ -90,49 +87,54 @@ Hash256 sha256(const void* data, size_t len)
|
90 | 87 |
|
91 | 88 | Hash256 sha3(const void* data, size_t len)
|
92 | 89 | {
|
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 |
98 | 91 | Hash256 hash;
|
99 | 92 | 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) |
108 | 104 | Hash256 hash;
|
109 | 105 | 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 | + } |
116 | 115 | #endif
|
| 116 | + trantor_sha3((const unsigned char*)data, len, &hash, sizeof(hash)); |
| 117 | + return hash; |
117 | 118 | }
|
118 | 119 |
|
119 | 120 | Hash256 blake2b(const void* data, size_t len)
|
120 | 121 | {
|
121 |
| -#if OPENSSL_VERSION_MAJOR >= 3 |
122 | 122 | Hash256 hash;
|
| 123 | +#if OPENSSL_VERSION_MAJOR >= 3 |
123 | 124 | 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 |
133 | 136 | trantor_blake2b(&hash, sizeof(hash), data, len, nullptr, 0);
|
134 | 137 | return hash;
|
135 |
| -#endif |
136 | 138 | }
|
137 | 139 |
|
138 | 140 | } // namespace utils
|
|
0 commit comments