Skip to content

Commit 4a4d4b3

Browse files
committed
Refactored base64 utils to share implementation and reduce code duplication.
1 parent 45793dd commit 4a4d4b3

File tree

1 file changed

+18
-63
lines changed

1 file changed

+18
-63
lines changed

src/utils/base64.cc

+18-63
Original file line numberDiff line numberDiff line change
@@ -23,33 +23,30 @@
2323

2424
#include "mbedtls/base64.h"
2525

26-
namespace modsecurity {
27-
namespace Utils {
26+
template<typename Operation>
27+
inline std::string base64Helper(const char *data, const unsigned int len, Operation op) {
28+
size_t out_len = 0;
2829

30+
op(nullptr, 0, &out_len,
31+
reinterpret_cast<const unsigned char *>(data), len);
2932

30-
std::string Base64::encode(const std::string& data) {
31-
size_t encoded_len = 0;
32-
unsigned char *d;
33-
std::string ret;
34-
35-
mbedtls_base64_encode(NULL, 0, &encoded_len,
36-
reinterpret_cast<const unsigned char*>(data.c_str()), data.size());
33+
std::string ret(out_len, {});
34+
if(out_len > 0) {
35+
op(reinterpret_cast<unsigned char *>(ret.data()), ret.size(), &out_len,
36+
reinterpret_cast<const unsigned char *>(data), len);
3737

38-
d = reinterpret_cast<unsigned char*>(malloc(sizeof(char) * encoded_len));
39-
if (d == NULL) {
40-
return data;
38+
ret.resize(out_len);
4139
}
4240

43-
memset(d, '\0', encoded_len);
44-
45-
mbedtls_base64_encode(d, encoded_len, &encoded_len,
46-
(unsigned char*) data.c_str(), data.size());
41+
return ret;
42+
}
4743

48-
ret.assign(reinterpret_cast<const char*>(d), encoded_len);
49-
free(d);
44+
namespace modsecurity {
45+
namespace Utils {
5046

5147

52-
return ret;
48+
std::string Base64::encode(const std::string& data) {
49+
return base64Helper(data.c_str(), data.size(), mbedtls_base64_encode);
5350
}
5451

5552

@@ -63,53 +60,12 @@ std::string Base64::decode(const std::string& data, bool forgiven) {
6360

6461

6562
std::string Base64::decode(const std::string& data) {
66-
size_t decoded_len = 0;
67-
unsigned char *d;
68-
std::string ret;
69-
size_t len = strlen(data.c_str());
70-
71-
mbedtls_base64_decode(NULL, 0, &decoded_len,
72-
reinterpret_cast<const unsigned char*>(data.c_str()), len);
73-
74-
d = reinterpret_cast<unsigned char*>(malloc(sizeof(char) * decoded_len));
75-
if (d == NULL) {
76-
return data;
77-
}
78-
79-
memset(d, '\0', decoded_len);
80-
81-
mbedtls_base64_decode(d, decoded_len, &decoded_len,
82-
reinterpret_cast<const unsigned char*>(data.c_str()), len);
83-
84-
ret.assign(reinterpret_cast<const char*>(d), decoded_len);
85-
free(d);
86-
87-
return ret;
63+
return base64Helper(data.c_str(), strlen(data.c_str()), mbedtls_base64_decode);
8864
}
8965

9066

9167
std::string Base64::decode_forgiven(const std::string& data) {
92-
size_t decoded_len = 0;
93-
unsigned char *d;
94-
std::string ret;
95-
96-
decode_forgiven_engine(NULL, 0, &decoded_len,
97-
reinterpret_cast<const unsigned char*>(data.c_str()), data.size());
98-
99-
d = reinterpret_cast<unsigned char*>(malloc(sizeof(char) * decoded_len));
100-
if (d == NULL) {
101-
return data;
102-
}
103-
104-
memset(d, '\0', decoded_len);
105-
106-
decode_forgiven_engine(d, decoded_len, &decoded_len,
107-
reinterpret_cast<const unsigned char*>(data.c_str()), data.size());
108-
109-
ret.assign(reinterpret_cast<const char*>(d), decoded_len);
110-
free(d);
111-
112-
return ret;
68+
return base64Helper(data.c_str(), data.size(), decode_forgiven_engine);
11369
}
11470

11571

@@ -215,6 +171,5 @@ void Base64::decode_forgiven_engine(unsigned char *plain_text,
215171
}
216172
}
217173

218-
219174
} // namespace Utils
220175
} // namespace modsecurity

0 commit comments

Comments
 (0)