|
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