| /* |
| * Licensed to the Apache Software Foundation (ASF) under one |
| * or more contributor license agreements. See the NOTICE file |
| * distributed with this work for additional information |
| * regarding copyright ownership. The ASF licenses this file |
| * to you under the Apache License, Version 2.0 (the |
| * "License"); you may not use this file except in compliance |
| * with the License. You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| #include "Base64.h" |
| #include <iostream> |
| |
| static const std::string base64_chars = |
| "ABCDEFGHIJKLMNOPQRSTUVWXYZ" |
| "abcdefghijklmnopqrstuvwxyz" |
| "0123456789+/"; |
| |
| |
| static inline bool is_base64 ( unsigned char c ) |
| { |
| return ( isalnum ( c ) || ( c == '+' ) || ( c == '/' ) ); |
| } |
| |
| std::string base64_encode ( unsigned char const* bytes_to_encode, unsigned int in_len ) |
| { |
| std::string ret; |
| int i = 0; |
| int j = 0; |
| unsigned char char_array_3[3]; |
| unsigned char char_array_4[4]; |
| |
| while ( in_len-- ) |
| { |
| char_array_3[i++] = * ( bytes_to_encode++ ); |
| |
| 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 base64_decode ( std::string const& encoded_string ) |
| { |
| int in_len = encoded_string . size (); |
| int i = 0; |
| int j = 0; |
| int in_ = 0; |
| unsigned char char_array_4[4], char_array_3[3]; |
| std::string ret; |
| |
| while ( in_len-- && ( encoded_string[in_] != '=' ) && is_base64 ( encoded_string[in_] ) ) |
| { |
| char_array_4[i++] = encoded_string[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; |
| } |
| |