Skip to content

Commit 7c0e6e9

Browse files
Refactor SHA1 utility with exception handling
1 parent c5a4b19 commit 7c0e6e9

1 file changed

Lines changed: 39 additions & 36 deletions

File tree

src/utils/sha1.h

Lines changed: 39 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
* Copyright (c) 2015 - 2021 Trustwave Holdings, Inc. (http://www.trustwave.com/)
44
*
55
* You may not use this file except in compliance with
6-
* the License. You may obtain a copy of the License at
6+
* the License. You may obtain a copy of the License at
77
*
88
* http://www.apache.org/licenses/LICENSE-2.0
99
*
@@ -17,75 +17,78 @@
1717
#define SRC_UTILS_SHA1_H_
1818

1919
#include <array>
20+
#include <exception>
2021
#include <string>
2122
#include <string_view>
22-
#include <stdexcept>
2323

2424
#include "src/utils/string.h"
2525
#include "mbedtls/md.h"
2626

2727
namespace modsecurity::Utils {
2828

29+
class DigestCalculationException : public std::exception {
30+
public:
31+
explicit DigestCalculationException(const char *message) noexcept
32+
: m_message(message) { }
33+
34+
const char *what() const noexcept override {
35+
return m_message;
36+
}
37+
38+
private:
39+
const char *m_message;
40+
};
41+
42+
2943
template<mbedtls_md_type_t DigestType, int DigestSize>
3044
class DigestImpl {
3145
public:
32-
3346
static std::string digest(const std::string& input) {
34-
return digestHelper(input, [](const auto digest) {
35-
return std::string(digest);
36-
});
47+
const auto digestBytes = calculateDigest(input);
48+
return std::string(digestBytes.begin(), digestBytes.end());
3749
}
3850

3951
static void digestReplace(std::string& value) {
40-
digestHelper(value, [&value](const auto digest) mutable {
41-
value = digest;
42-
});
52+
const auto digestBytes = calculateDigest(value);
53+
value.assign(digestBytes.begin(), digestBytes.end());
4354
}
4455

45-
static std::string hexdigest(const std::string &input) {
46-
return digestHelper(input, [](const auto digest) {
47-
return utils::string::string_to_hex(digest);
48-
});
56+
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);
4960
}
5061

51-
private:
52-
53-
template<typename ConvertOp>
54-
static auto digestHelper(std::string_view input,
55-
ConvertOp convertOp) {
62+
private:
63+
static std::array<unsigned char, DigestSize> calculateDigest(
64+
std::string_view input) {
65+
std::array<unsigned char, DigestSize> digestBytes = {};
5666

57-
std::array<unsigned char, DigestSize> digest = {};
58-
59-
const auto *mdInfo = mbedtls_md_info_from_type(DigestType);
67+
const mbedtls_md_info_t *mdInfo = mbedtls_md_info_from_type(DigestType);
6068
if (mdInfo == nullptr) {
61-
throw std::runtime_error(
69+
throw DigestCalculationException(
6270
"mbedtls_md_info_from_type() returned nullptr");
6371
}
6472

65-
const int ret = mbedtls_md(
66-
mdInfo,
67-
reinterpret_cast<const unsigned char *>(input.data()),
68-
input.size(),
69-
digest.data());
73+
const auto *inputBytes =
74+
static_cast<const unsigned char *>(static_cast<const void *>(input.data()));
7075

71-
if (ret != 0) {
72-
throw std::runtime_error(
73-
"mbedtls_md() failed with error code: " + std::to_string(ret));
76+
if (const int ret = mbedtls_md(
77+
mdInfo,
78+
inputBytes,
79+
input.size(),
80+
digestBytes.data()); ret != 0) {
81+
throw DigestCalculationException("mbedtls_md() failed");
7482
}
7583

76-
// mbedtls uses unsigned char buffers, while string_view expects char.
77-
const auto *digestChars =
78-
reinterpret_cast<const char *>(digest.data());
79-
80-
return convertOp(std::string_view(digestChars, DigestSize));
84+
return digestBytes;
8185
}
8286
};
8387

8488

8589
class Sha1 : public DigestImpl<MBEDTLS_MD_SHA1, 20> {
8690
};
8791

88-
8992
} // namespace modsecurity::Utils
9093

9194
#endif // SRC_UTILS_SHA1_H_

0 commit comments

Comments
 (0)