parent
df589eb9e0
commit
bc3b4daebc
@ -0,0 +1,57 @@
|
|||||||
|
#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;
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,8 @@
|
|||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include <stdbool.h>
|
||||||
|
#include <stddef.h>
|
||||||
|
|
||||||
|
char* base64_strict_encode( void* v_binary, size_t len );
|
||||||
|
bool base64_decode( const char* str, void** v_binary, size_t* len );
|
||||||
|
|
Loading…
Reference in new issue