You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
58 lines
1.2 KiB
C
58 lines
1.2 KiB
C
#include "base64.h"
|
|
|
|
#include <stdint.h>
|
|
#include <stdlib.h>
|
|
|
|
char* base64_strict_encode( void* v_binary, size_t len )
|
|
{
|
|
// RFC 4648 - https://www.rfc-editor.org/rfc/rfc4648.html
|
|
static const char* alphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
|
|
enum { pad = '=' };
|
|
|
|
uint8_t* binary = v_binary;
|
|
const int groups = ( len + 2 ) / 3;
|
|
const int padding = len % 3;
|
|
|
|
char* result = malloc( groups * 4 + 1 );
|
|
result[groups*4] = '\0';
|
|
|
|
uint32_t word;
|
|
char* out = result;
|
|
for( int remain = len; remain > 0; remain -= 3, binary += 3, out += 4 ) {
|
|
word = 0;
|
|
switch( remain ) {
|
|
default:
|
|
word |= binary[2] << (8*0);
|
|
case 2:
|
|
word |= binary[1] << (8*1);
|
|
case 1:
|
|
word |= binary[0] << (8*2);
|
|
}
|
|
switch( remain ) {
|
|
default:
|
|
out[3] = alphabet[ ( word >> (6*0) ) % 64 ];
|
|
case 2:
|
|
out[2] = alphabet[ ( word >> (6*1) ) % 64 ];
|
|
case 1:
|
|
out[1] = alphabet[ ( word >> (6*2) ) % 64 ];
|
|
out[0] = alphabet[ ( word >> (6*3) ) % 64 ];
|
|
}
|
|
switch( remain ) {
|
|
case 1:
|
|
out[3] = '=';
|
|
out[2] = '=';
|
|
break;
|
|
case 2:
|
|
out[3] = '=';
|
|
break;
|
|
}
|
|
}
|
|
|
|
return result;
|
|
}
|
|
bool base64_decode( const char* str, void** v_binary, size_t* len )
|
|
{
|
|
return false;
|
|
}
|
|
|