From: Eduardo Ramos Testillano (eramedu) Date: Wed, 29 Apr 2020 00:30:03 +0000 (+0200) Subject: Add base64 encoder/decoder at anna core functions X-Git-Url: https://git.teslayout.com/public/public/public/?p=anna.git;a=commitdiff_plain;h=eb446c670d53aa275d78b366ef1faf2b32ca964e Add base64 encoder/decoder at anna core functions --- diff --git a/include/anna/core/functions.hpp b/include/anna/core/functions.hpp index 382a625..58b8cd8 100644 --- a/include/anna/core/functions.hpp +++ b/include/anna/core/functions.hpp @@ -1097,6 +1097,28 @@ struct functions { * @param target Isup number octet string. */ static void codeIsupNumber(const isup_number_t & isupNumber, bool calledOrCalling, std::string & target) throw(RuntimeException); + + /** + * Base64 encoding + * + * @param str String to be encoded + * + * @return Returns encoded representation + */ + static std::string encodeBase64(const U8* buf, unsigned int bufLen); + static std::string encodeBase64(const std::string & str) + { + return encodeBase64((const U8 *)str.c_str(), str.size()); + } + + /** + * Base64 decoding + * + * @param encodedString Encoded base64 representation + * + * @return Returns decoded representation + */ + static std::string decodeBase64(const std::string & encodedString); }; } diff --git a/source/core/functions.cpp b/source/core/functions.cpp index 613a021..8a77994 100644 --- a/source/core/functions.cpp +++ b/source/core/functions.cpp @@ -37,6 +37,12 @@ using namespace std; #define PAGE_WIDTH_LENGTH 80 +static const std::string base64_chars = + "ABCDEFGHIJKLMNOPQRSTUVWXYZ" + "abcdefghijklmnopqrstuvwxyz" + "0123456789+/"; + + string functions::getVersion() throw() { static const int version = ANNA_VERSION; string result; @@ -1519,3 +1525,90 @@ void functions::codeIsupNumber(const isup_number_t & isupNumber, bool calledOrCa memcpy(buffer, target.c_str(), length); } + +static inline bool is_base64(U8 c) { + return (isalnum(c) || (c == '+') || (c == '/')); +} + +std::string functions::encodeBase64(const U8* buf, unsigned int bufLen) { + std::string ret; + int i = 0; + int j = 0; + U8 char_array_3[3]; + U8 char_array_4[4]; + + while (bufLen--) { + char_array_3[i++] = *(buf++); + if (i == 3) { + char_array_4[0] = (char_array_3[0] & 0xfc) >> 2; + char_array_4[1] = ((char_array_3[0] & 0x03) << 4) + ((char_array_3[1] & 0xf0) >> 4); + char_array_4[2] = ((char_array_3[1] & 0x0f) << 2) + ((char_array_3[2] & 0xc0) >> 6); + char_array_4[3] = char_array_3[2] & 0x3f; + + for(i = 0; (i <4) ; i++) + ret += base64_chars[char_array_4[i]]; + i = 0; + } + } + + if (i) + { + for(j = i; j < 3; j++) + char_array_3[j] = '\0'; + + char_array_4[0] = (char_array_3[0] & 0xfc) >> 2; + char_array_4[1] = ((char_array_3[0] & 0x03) << 4) + ((char_array_3[1] & 0xf0) >> 4); + char_array_4[2] = ((char_array_3[1] & 0x0f) << 2) + ((char_array_3[2] & 0xc0) >> 6); + char_array_4[3] = char_array_3[2] & 0x3f; + + for (j = 0; (j < i + 1); j++) + ret += base64_chars[char_array_4[j]]; + + while((i++ < 3)) + ret += '='; + } + + return ret; +} + +std::string functions::decodeBase64(const std::string & encodedString) { + int in_len = encodedString.size(); + int i = 0; + int j = 0; + int in_ = 0; + U8 char_array_4[4], char_array_3[3]; + std::string ret; + + while (in_len-- && ( encodedString[in_] != '=') && is_base64(encodedString[in_])) { + char_array_4[i++] = encodedString[in_]; in_++; + if (i ==4) { + for (i = 0; i <4; i++) + char_array_4[i] = base64_chars.find(char_array_4[i]); + + char_array_3[0] = (char_array_4[0] << 2) + ((char_array_4[1] & 0x30) >> 4); + char_array_3[1] = ((char_array_4[1] & 0xf) << 4) + ((char_array_4[2] & 0x3c) >> 2); + char_array_3[2] = ((char_array_4[2] & 0x3) << 6) + char_array_4[3]; + + for (i = 0; (i < 3); i++) + ret += char_array_3[i]; + i = 0; + } + } + + if (i) { + for (j = i; j <4; j++) + char_array_4[j] = 0; + + for (j = 0; j <4; j++) + char_array_4[j] = base64_chars.find(char_array_4[j]); + + char_array_3[0] = (char_array_4[0] << 2) + ((char_array_4[1] & 0x30) >> 4); + char_array_3[1] = ((char_array_4[1] & 0xf) << 4) + ((char_array_4[2] & 0x3c) >> 2); + char_array_3[2] = ((char_array_4[2] & 0x3) << 6) + char_array_4[3]; + + for (j = 0; (j < i - 1); j++) ret += char_array_3[j]; + } + + return ret; +} +