3
3
4
4
#include < cassert>
5
5
6
+ #include " md5.h"
7
+ #include " sha1.h"
8
+ #include " sha3.h"
9
+ #include " blake2.h"
10
+
6
11
namespace trantor
7
12
{
8
13
namespace utils
@@ -11,6 +16,15 @@ Hash128 md5(const void* data, size_t len)
11
16
{
12
17
Hash128 hash;
13
18
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
+
14
28
md5->update ((const unsigned char *)data, len);
15
29
md5->final ((unsigned char *)&hash);
16
30
return hash;
@@ -20,6 +34,14 @@ Hash160 sha1(const void* data, size_t len)
20
34
{
21
35
Hash160 hash;
22
36
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
+ }
23
45
sha1->update ((const unsigned char *)data, len);
24
46
sha1->final ((unsigned char *)&hash);
25
47
return hash;
@@ -29,6 +51,7 @@ Hash256 sha256(const void* data, size_t len)
29
51
{
30
52
Hash256 hash;
31
53
auto sha256 = Botan::HashFunction::create (" SHA-256" );
54
+ assert (sha256 != nullptr ); // Botan guarantees that SHA-256 is available
32
55
sha256->update ((const unsigned char *)data, len);
33
56
sha256->final ((unsigned char *)&hash);
34
57
return hash;
@@ -38,6 +61,11 @@ Hash256 sha3(const void* data, size_t len)
38
61
{
39
62
Hash256 hash;
40
63
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
+ }
41
69
assert (sha3 != nullptr );
42
70
sha3->update ((const unsigned char *)data, len);
43
71
sha3->final ((unsigned char *)&hash);
@@ -48,7 +76,11 @@ Hash256 blake2b(const void* data, size_t len)
48
76
{
49
77
Hash256 hash;
50
78
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
+ }
52
84
blake2b->update ((const unsigned char *)data, len);
53
85
blake2b->final ((unsigned char *)&hash);
54
86
return hash;
0 commit comments