Skip to content

Commit bf4d43d

Browse files
committed
sha1/md5: fix exception safety, remove copy, and own exception message
1 parent 6afa94b commit bf4d43d

File tree

1 file changed

+30
-10
lines changed

1 file changed

+30
-10
lines changed

src/utils/sha1.h

Lines changed: 30 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
#define SRC_UTILS_SHA1_H_
1818

1919
#include <array>
20+
#include <cassert>
2021
#include <exception>
2122
#include <string>
2223
#include <string_view>
@@ -28,35 +29,54 @@ namespace modsecurity::Utils {
2829

2930
class DigestCalculationException : public std::exception {
3031
public:
31-
explicit DigestCalculationException(const char *message) noexcept
32+
explicit DigestCalculationException(const char *message)
3233
: m_message(message) { }
3334

3435
const char *what() const noexcept override {
35-
return m_message;
36+
return m_message.c_str();
3637
}
3738

3839
private:
39-
const char *m_message;
40+
std::string m_message;
4041
};
4142

4243

4344
template<mbedtls_md_type_t DigestType, int DigestSize>
4445
class DigestImpl {
4546
public:
4647
static std::string digest(const std::string& input) {
47-
const auto digestBytes = calculateDigest(input);
48-
return std::string(digestBytes.begin(), digestBytes.end());
48+
try {
49+
const auto digestBytes = calculateDigest(input);
50+
return std::string(digestBytes.begin(), digestBytes.end());
51+
} catch (const DigestCalculationException&) {
52+
assert(false);
53+
return std::string(DigestSize, '\0');
54+
}
4955
}
5056

5157
static void digestReplace(std::string& value) {
52-
const auto digestBytes = calculateDigest(value);
53-
value.assign(digestBytes.begin(), digestBytes.end());
58+
try {
59+
const auto digestBytes = calculateDigest(value);
60+
value.assign(digestBytes.begin(), digestBytes.end());
61+
} catch (const DigestCalculationException&) {
62+
assert(false);
63+
value.assign(DigestSize, '\0');
64+
}
5465
}
5566

5667
static std::string hexdigest(const std::string& input) {
57-
const auto digestBytes = calculateDigest(input);
58-
const std::string digestString(digestBytes.begin(), digestBytes.end());
59-
return utils::string::string_to_hex(digestString);
68+
try {
69+
const auto digestBytes = calculateDigest(input);
70+
return utils::string::string_to_hex(std::string_view(
71+
reinterpret_cast<const char *>(digestBytes.data()),
72+
digestBytes.size()));
73+
} catch (const DigestCalculationException&) {
74+
assert(false);
75+
const std::array<unsigned char, DigestSize> digestBytes = {};
76+
return utils::string::string_to_hex(std::string_view(
77+
reinterpret_cast<const char *>(digestBytes.data()),
78+
digestBytes.size()));
79+
}
6080
}
6181

6282
private:

0 commit comments

Comments
 (0)