2017-08-08 13:53:47 +02:00
|
|
|
|
/*
|
|
|
|
|
base64.cpp and base64.h
|
|
|
|
|
|
2018-08-29 21:40:59 +02:00
|
|
|
|
Copyright (C) 2004-2008 Ren<EFBFBD> Nyffenegger
|
2017-08-08 13:53:47 +02:00
|
|
|
|
|
|
|
|
|
This source code is provided 'as-is', without any express or implied
|
|
|
|
|
warranty. In no event will the author be held liable for any damages
|
|
|
|
|
arising from the use of this software.
|
|
|
|
|
|
|
|
|
|
Permission is granted to anyone to use this software for any purpose,
|
|
|
|
|
including commercial applications, and to alter it and redistribute it
|
|
|
|
|
freely, subject to the following restrictions:
|
|
|
|
|
|
|
|
|
|
1. The origin of this source code must not be misrepresented; you must not
|
|
|
|
|
claim that you wrote the original source code. If you use this source code
|
|
|
|
|
in a product, an acknowledgment in the product documentation would be
|
|
|
|
|
appreciated but is not required.
|
|
|
|
|
|
|
|
|
|
2. Altered source versions must be plainly marked as such, and must not be
|
|
|
|
|
misrepresented as being the original source code.
|
|
|
|
|
|
|
|
|
|
3. This notice may not be removed or altered from any source distribution.
|
|
|
|
|
|
2018-08-29 21:40:59 +02:00
|
|
|
|
Ren<EFBFBD> Nyffenegger rene.nyffenegger@adp-gmbh.ch
|
2017-08-08 13:53:47 +02:00
|
|
|
|
|
|
|
|
|
*/
|
|
|
|
|
|
|
|
|
|
#include "base64.h"
|
|
|
|
|
#include <iostream>
|
|
|
|
|
|
|
|
|
|
static const std::string base64_chars =
|
2018-08-29 21:40:59 +02:00
|
|
|
|
"ABCDEFGHIJKLMNOPQRSTUVWXYZ"
|
|
|
|
|
"abcdefghijklmnopqrstuvwxyz"
|
|
|
|
|
"0123456789+/";
|
2017-08-08 13:53:47 +02:00
|
|
|
|
|
|
|
|
|
|
2018-08-29 21:40:59 +02:00
|
|
|
|
static inline bool is_base64( uint8_t c )
|
|
|
|
|
{
|
|
|
|
|
return ( isalnum( c ) || ( c == '+' ) || ( c == '/' ) );
|
2017-08-08 13:53:47 +02:00
|
|
|
|
}
|
|
|
|
|
|
2018-08-29 21:40:59 +02:00
|
|
|
|
std::string Core::Util::base64_encode( uint8_t const* bytes_to_encode, uint32_t in_len )
|
|
|
|
|
{
|
|
|
|
|
std::string ret;
|
|
|
|
|
int32_t i = 0;
|
|
|
|
|
int32_t j = 0;
|
|
|
|
|
uint8_t char_array_3[3];
|
|
|
|
|
uint8_t 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;
|
2017-08-08 13:53:47 +02:00
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
2018-08-29 21:40:59 +02:00
|
|
|
|
std::string Core::Util::base64_decode( std::string const& encoded_string )
|
|
|
|
|
{
|
|
|
|
|
int32_t in_len = encoded_string.size();
|
|
|
|
|
int32_t i = 0;
|
|
|
|
|
int32_t j = 0;
|
|
|
|
|
int32_t in_ = 0;
|
|
|
|
|
uint8_t 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 ] = static_cast< uint8_t >( 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 ] = static_cast< uint8_t >( 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;
|
2017-08-08 13:53:47 +02:00
|
|
|
|
}
|