23
23
24
24
#include " mbedtls/base64.h"
25
25
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 ;
28
29
30
+ op (nullptr , 0 , &out_len,
31
+ reinterpret_cast <const unsigned char *>(data), len);
29
32
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);
37
37
38
- d = reinterpret_cast <unsigned char *>(malloc (sizeof (char ) * encoded_len));
39
- if (d == NULL ) {
40
- return data;
38
+ ret.resize (out_len);
41
39
}
42
40
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
+ }
47
43
48
- ret. assign ( reinterpret_cast < const char *>(d), encoded_len);
49
- free (d);
44
+ namespace modsecurity {
45
+ namespace Utils {
50
46
51
47
52
- return ret;
48
+ std::string Base64::encode (const std::string& data) {
49
+ return base64Helper (data.c_str (), data.size (), mbedtls_base64_encode);
53
50
}
54
51
55
52
@@ -63,53 +60,12 @@ std::string Base64::decode(const std::string& data, bool forgiven) {
63
60
64
61
65
62
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);
88
64
}
89
65
90
66
91
67
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);
113
69
}
114
70
115
71
@@ -215,6 +171,5 @@ void Base64::decode_forgiven_engine(unsigned char *plain_text,
215
171
}
216
172
}
217
173
218
-
219
174
} // namespace Utils
220
175
} // namespace modsecurity
0 commit comments