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

#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;
}