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
6562std::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
9167std::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