diff options
Diffstat (limited to 'src/utils/base64.cpp')
-rw-r--r-- | src/utils/base64.cpp | 214 |
1 files changed, 0 insertions, 214 deletions
diff --git a/src/utils/base64.cpp b/src/utils/base64.cpp deleted file mode 100644 index 62ba76f21..000000000 --- a/src/utils/base64.cpp +++ /dev/null @@ -1,214 +0,0 @@ -/* - +----------------------------------------------------------------------+ - | PHP HTML Embedded Scripting Language Version 3.0 | - +----------------------------------------------------------------------+ - | Copyright (c) 1997-2000 PHP Development Team (See Credits file) | - +----------------------------------------------------------------------+ - | This program is free software; you can redistribute it and/or modify | - | it under the terms of one of the following licenses: | - | | - | A) the GNU General Public License as published by the Free Software | - | Foundation; either version 2 of the License, or (at your option) | - | any later version. | - | | - | B) the PHP License as published by the PHP Development Team and | - | included in the distribution in the file: LICENSE | - | | - | This program is distributed in the hope that it will be useful, | - | but WITHOUT ANY WARRANTY; without even the implied warranty of | - | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | - | GNU General Public License for more details. | - | | - | You should have received a copy of both licenses referred to here. | - | If you did not, or have any questions about PHP licensing, please | - | contact core@php.net. | - +----------------------------------------------------------------------+ - | Author: Jim Winstead (jimw@php.net) | - +----------------------------------------------------------------------+ - */ - -#include "utils/base64.h" - -#include "utils/cast.h" - -#include "debug.h" - -static char base64_table[] = -{ - 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', - 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', - 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', - 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', - '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '+', '/', '\0' -}; -static const char base64_pad = '='; - -unsigned char *php3_base64_encode(const unsigned char *restrict const string, - int length, - int *restrict const ret_length) -{ - if (string == nullptr) - return nullptr; - const unsigned char *current = string; - int i = 0; - unsigned char *const result = static_cast<unsigned char *>( - calloc(CAST_SIZE((length + 3 - length % 3) * 4 / 3 + 1) - * sizeof(unsigned char), 1)); - if (result == nullptr) - return nullptr; - - while (length > 2) - { /* keep going until we have less than 24 bits */ - result[i++] = base64_table[current[0] >> 2]; - result[i++] = base64_table[((current[0] & 0x03) - << 4) + (current[1] >> 4)]; - result[i++] = base64_table[((current[1] & 0x0f) - << 2) + (current[2] >> 6)]; - result[i++] = base64_table[current[2] & 0x3f]; - - current += 3; - length -= 3; /* we just handle 3 octets of data */ - } - - /* now deal with the tail end of things */ - if (length != 0) - { - result[i++] = base64_table[current[0] >> 2]; - if (length > 1) - { - result[i++] = base64_table[((current[0] & 0x03) << 4) - + (current[1] >> 4)]; - result[i++] = base64_table[(current[1] & 0x0f) << 2]; - result[i++] = base64_pad; - } - else - { - result[i++] = base64_table[(current[0] & 0x03) << 4]; - result[i++] = base64_pad; - result[i++] = base64_pad; - } - } - if (ret_length != nullptr) - { - *ret_length = i; - } - result[i] = '\0'; - return result; -} - -/* as above, but backwards. :) */ -unsigned char *php3_base64_decode(const unsigned char *restrict const string, - const int length, - int *restrict const ret_length) -{ - const unsigned char *current = string; - int ch, i = 0, j = 0, k; - - unsigned char *result = static_cast<unsigned char *>( - calloc(length + 1, 1)); - - if (result == nullptr) - return nullptr; - - /* run through the whole string, converting as we go */ - while ((ch = *current++) != '\0') - { - if (ch == base64_pad) - break; - - /* When Base64 gets POSTed, all pluses are interpreted as spaces. - This line changes them back. It's not exactly the Base64 spec, - but it is completely compatible with it (the spec says that - spaces are invalid). This will also save many people considerable - headache. - Turadg Aleahmad <turadg@wise.berkeley.edu> - */ - - if (ch == ' ') ch = '+'; - - const char *const chp = strchr(base64_table, ch); - if (chp == nullptr) - continue; - ch = CAST_S32(chp - base64_table); - - switch (i % 4) - { - case 0: - result[j] = CAST_U8(ch << 2U); - break; - case 1: - result[j++] |= CAST_U8(ch >> 4U); - result[j] = CAST_U8((ch & 0x0f) << 4U); - break; - case 2: - result[j++] |= CAST_U8(ch >>2U); - result[j] = CAST_U8((ch & 0x03) << 6U); - break; - case 3: - result[j++] |= CAST_U8(ch); - break; - default: - break; - } - i++; - } - - k = j; - /* mop things up if we ended on a boundary */ - if (ch == base64_pad) - { - switch (i % 4) - { - case 0: - case 1: - free(result); - return nullptr; - case 2: - k++; - // copy from 3. is it should be here? - result[k++] = 0; - break; - case 3: - result[k++] = 0; - break; - default: - break; - } - } - if (ret_length != nullptr) - { - *ret_length = j; - } - result[k] = '\0'; - return result; -} - -std::string encodeBase64String(std::string value) -{ - int sz = 0; - const unsigned char *const str = reinterpret_cast<unsigned char*>( - const_cast<char*>(value.c_str())); - unsigned char *const buf = php3_base64_encode( - str, CAST_S32(value.size()), &sz); - if (buf == nullptr) - return std::string(); - - value = std::string(reinterpret_cast<char*>(buf), sz); - free(buf); - return value; -} - -std::string decodeBase64String(std::string value) -{ - int sz = 0; - const unsigned char *const str = reinterpret_cast<unsigned char*>( - const_cast<char*>(value.c_str())); - unsigned char *const buf = php3_base64_decode( - str, CAST_S32(value.size()), &sz); - - if (buf != nullptr) - value = std::string(reinterpret_cast<char*>(buf), sz); - else - value.clear(); - free(buf); - return value; -} |