diff --git a/src/actions/transformations/parity_even_7bit.cc b/src/actions/transformations/parity_even_7bit.cc index f2992240..d9327b9e 100644 --- a/src/actions/transformations/parity_even_7bit.cc +++ b/src/actions/transformations/parity_even_7bit.cc @@ -15,53 +15,12 @@ #include "parity_even_7bit.h" -#include - namespace modsecurity::actions::transformations { bool ParityEven7bit::transform(std::string &value, const Transaction *trans) const { - if (value.empty()) return false; - - unsigned char *input; - - input = reinterpret_cast - (malloc(sizeof(char) * value.length()+1)); - - if (input == NULL) { - return ""; - } - - std::memcpy(input, value.c_str(), value.length()+1); - - const auto ret = inplace(input, value.length()); - - value.assign(reinterpret_cast(input), value.length()); - free(input); - - return ret; -} - -bool ParityEven7bit::inplace(unsigned char *input, uint64_t input_len) { - uint64_t i; - - i = 0; - while (i < input_len) { - unsigned int x = input[i]; - - input[i] ^= input[i] >> 4; - input[i] &= 0xf; - - if ((0x6996 >> input[i]) & 1) { - input[i] = x | 0x80; - } else { - input[i] = x & 0x7f; - } - i++; - } - - return true; + return ParityEven7bit::inplace(value); } diff --git a/src/actions/transformations/parity_even_7bit.h b/src/actions/transformations/parity_even_7bit.h index 41010d62..786f72e4 100644 --- a/src/actions/transformations/parity_even_7bit.h +++ b/src/actions/transformations/parity_even_7bit.h @@ -26,7 +26,28 @@ class ParityEven7bit : public Transformation { : Transformation(action) { } bool transform(std::string &value, const Transaction *trans) const override; - static bool inplace(unsigned char *input, uint64_t input_len); + + template + static bool inplace(std::string &value) { + if (value.empty()) return false; + + for(auto &c : value) { + auto &uc = reinterpret_cast(c); + unsigned int x = uc; + + uc ^= uc >> 4; + uc &= 0xf; + + const bool condition = (0x6996 >> uc) & 1; + if (even ? condition : !condition) { + uc = x | 0x80; + } else { + uc = x & 0x7f; + } + } + + return true; + } }; } // namespace modsecurity::actions::transformations diff --git a/src/actions/transformations/parity_odd_7bit.cc b/src/actions/transformations/parity_odd_7bit.cc index f8192ef3..865a2754 100644 --- a/src/actions/transformations/parity_odd_7bit.cc +++ b/src/actions/transformations/parity_odd_7bit.cc @@ -14,54 +14,14 @@ */ #include "parity_odd_7bit.h" - -#include +#include "parity_even_7bit.h" namespace modsecurity::actions::transformations { bool ParityOdd7bit::transform(std::string &value, const Transaction *trans) const { - if (value.empty()) return false; - - unsigned char *input; - - input = reinterpret_cast - (malloc(sizeof(char) * value.length()+1)); - - if (input == NULL) { - return ""; - } - - memcpy(input, value.c_str(), value.length()+1); - - const auto ret = inplace(input, value.length()); - - value.assign(reinterpret_cast(input), value.length()); - free(input); - - return ret; -} - -bool ParityOdd7bit::inplace(unsigned char *input, uint64_t input_len) { - uint64_t i; - - i = 0; - while (i < input_len) { - unsigned int x = input[i]; - - input[i] ^= input[i] >> 4; - input[i] &= 0xf; - - if ((0x6996 >> input[i]) & 1) { - input[i] = x & 0x7f; - } else { - input[i] = x | 0x80; - } - i++; - } - - return true; + return ParityEven7bit::inplace(value); } diff --git a/src/actions/transformations/parity_odd_7bit.h b/src/actions/transformations/parity_odd_7bit.h index 1afa1327..d0a1583c 100644 --- a/src/actions/transformations/parity_odd_7bit.h +++ b/src/actions/transformations/parity_odd_7bit.h @@ -26,7 +26,6 @@ class ParityOdd7bit : public Transformation { : Transformation(action) { } bool transform(std::string &value, const Transaction *trans) const override; - static bool inplace(unsigned char *input, uint64_t input_len); }; } // namespace modsecurity::actions::transformations diff --git a/src/actions/transformations/parity_zero_7bit.cc b/src/actions/transformations/parity_zero_7bit.cc index ef80b74d..77ad0514 100644 --- a/src/actions/transformations/parity_zero_7bit.cc +++ b/src/actions/transformations/parity_zero_7bit.cc @@ -15,46 +15,24 @@ #include "parity_zero_7bit.h" -#include - namespace modsecurity::actions::transformations { -bool ParityZero7bit::transform(std::string &value, const Transaction *trans) const { +static inline bool inplace(std::string &value) { if (value.empty()) return false; - unsigned char *input; - - input = reinterpret_cast - (malloc(sizeof(char) * value.length()+1)); - - if (input == NULL) { - return ""; - } - - memcpy(input, value.c_str(), value.length()+1); - - const auto ret = inplace(input, value.length()); - - value.assign(reinterpret_cast(input), value.length()); - free(input); - - return ret; -} - - -bool ParityZero7bit::inplace(unsigned char *input, uint64_t input_len) { - uint64_t i; - - i = 0; - while (i < input_len) { - input[i] &= 0x7f; - i++; + for(auto &c : value) { + ((unsigned char&)c) &= 0x7f; } return true; } +bool ParityZero7bit::transform(std::string &value, const Transaction *trans) const { + return inplace(value); +} + + } // namespace modsecurity::actions::transformations diff --git a/src/actions/transformations/parity_zero_7bit.h b/src/actions/transformations/parity_zero_7bit.h index af47f7c5..c7f27d74 100644 --- a/src/actions/transformations/parity_zero_7bit.h +++ b/src/actions/transformations/parity_zero_7bit.h @@ -26,7 +26,6 @@ class ParityZero7bit : public Transformation { : Transformation(action) { } bool transform(std::string &value, const Transaction *trans) const override; - static bool inplace(unsigned char *input, uint64_t input_len); }; } // namespace modsecurity::actions::transformations