33
44#include < cassert>
55
6+ #include " md5.h"
7+ #include " sha1.h"
8+ #include " sha3.h"
9+ #include " blake2.h"
10+
611namespace trantor
712{
813namespace utils
@@ -11,6 +16,15 @@ Hash128 md5(const void* data, size_t len)
1116{
1217 Hash128 hash;
1318 auto md5 = Botan::HashFunction::create (" MD5" );
19+ if (md5 == nullptr )
20+ {
21+ MD5_CTX ctx;
22+ trantor_md5_init (&ctx);
23+ trantor_md5_update (&ctx, (const unsigned char *)data, len);
24+ trantor_md5_final (&ctx, (unsigned char *)&hash);
25+ return hash;
26+ }
27+
1428 md5->update ((const unsigned char *)data, len);
1529 md5->final ((unsigned char *)&hash);
1630 return hash;
@@ -20,6 +34,14 @@ Hash160 sha1(const void* data, size_t len)
2034{
2135 Hash160 hash;
2236 auto sha1 = Botan::HashFunction::create (" SHA-1" );
37+ if (sha1 == nullptr )
38+ {
39+ SHA1_CTX ctx;
40+ TrantorSHA1Init (&ctx);
41+ TrantorSHA1Update (&ctx, (const unsigned char *)data, len);
42+ TrantorSHA1Final ((unsigned char *)&hash, &ctx);
43+ return hash;
44+ }
2345 sha1->update ((const unsigned char *)data, len);
2446 sha1->final ((unsigned char *)&hash);
2547 return hash;
@@ -29,6 +51,7 @@ Hash256 sha256(const void* data, size_t len)
2951{
3052 Hash256 hash;
3153 auto sha256 = Botan::HashFunction::create (" SHA-256" );
54+ assert (sha256 != nullptr ); // Botan guarantees that SHA-256 is available
3255 sha256->update ((const unsigned char *)data, len);
3356 sha256->final ((unsigned char *)&hash);
3457 return hash;
@@ -38,6 +61,11 @@ Hash256 sha3(const void* data, size_t len)
3861{
3962 Hash256 hash;
4063 auto sha3 = Botan::HashFunction::create (" SHA-3(256)" );
64+ if (sha3 == nullptr )
65+ {
66+ trantor_sha3 ((const unsigned char *)data, len, &hash, sizeof (hash));
67+ return hash;
68+ }
4169 assert (sha3 != nullptr );
4270 sha3->update ((const unsigned char *)data, len);
4371 sha3->final ((unsigned char *)&hash);
@@ -48,7 +76,11 @@ Hash256 blake2b(const void* data, size_t len)
4876{
4977 Hash256 hash;
5078 auto blake2b = Botan::HashFunction::create (" BLAKE2b(256)" );
51- assert (blake2b != nullptr );
79+ if (blake2b == nullptr )
80+ {
81+ trantor_blake2b (&hash, sizeof (hash), data, len, NULL , 0 );
82+ return hash;
83+ }
5284 blake2b->update ((const unsigned char *)data, len);
5385 blake2b->final ((unsigned char *)&hash);
5486 return hash;
0 commit comments