Skip to content

Instantly share code, notes, and snippets.

@jige003
Last active April 26, 2019 11:59
Show Gist options
  • Save jige003/af71126cc31251a6938820d51b2a9d92 to your computer and use it in GitHub Desktop.
Save jige003/af71126cc31251a6938820d51b2a9d92 to your computer and use it in GitHub Desktop.
base64.md
/*************************************************************************
> File Name: base64.c
> Author: jige003
> Created Time: Thu 25 Apr 2019 03:12:24 PM CST
************************************************************************/
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <unistd.h>
#include <assert.h>
#include <errno.h>
#include <stdint.h>
#include <sys/time.h>
#include <sys/resource.h>
#include <openssl/evp.h>
#include <openssl/err.h>
#include <openssl/rand.h>
#include <openssl/bio.h>
#include <openssl/buffer.h>
typedef unsigned char byte;
void b64_encode(const byte *inbuf, size_t inlen, byte **outbuf, size_t *outlen){
BIO *buff, *b64;
BUF_MEM *ptr;
b64 = BIO_new(BIO_f_base64());
buff = BIO_new(BIO_s_mem());
buff = BIO_push(b64, buff);
BIO_set_flags(buff, BIO_FLAGS_BASE64_NO_NL);
BIO_set_close(buff, BIO_CLOSE);
BIO_write(buff, inbuf, inlen);
BIO_flush(buff);
BIO_get_mem_ptr(buff, &ptr);
(*outlen) = ptr->length;
(*outbuf) = BUF_strdup(ptr->data);
BIO_free_all(buff);
}
void b64_decode(const byte *inbuf, size_t inlen, byte **outbuf, size_t *outlen){
BIO *buff, *b64;
b64 = BIO_new(BIO_f_base64());
buff = BIO_new_mem_buf((void *)inbuf, inlen);
buff = BIO_push(b64, buff);
BIO_set_flags(buff, BIO_FLAGS_BASE64_NO_NL);
BIO_set_close(buff, BIO_CLOSE);
BIO_write(buff, inbuf, inlen);
BIO_flush(buff);
(*outbuf) = (byte *)malloc(inlen * sizeof(byte));
(*outlen) = BIO_read(b64, (*outbuf), inlen);
(*outbuf) = (byte *)realloc((void*)(*outbuf), ((*outlen + 1) * sizeof(byte)));
(*outbuf)[(*outlen)] = '\0';
BIO_free_all(buff);
}
void xfree(void *ptr){
if (ptr != ((void*)0)) free(ptr);
}
int main(void){
unsigned char inbuf[] = "this is a test string";
unsigned char *outbuf;
size_t inlen, outlen;
inlen = strlen(inbuf);
unsigned char *plainbuf;
size_t plen;
/* use to test memory leak */
#ifdef LOOP
while(1){
#endif
b64_encode(inbuf, inlen, &outbuf, &outlen);
printf("inbuf:%s outbuf:%s\n", inbuf, outbuf);
b64_decode(outbuf, outlen, &plainbuf, &plen);
printf("base64buf:%s plainbuf:%s\n", outbuf, plainbuf);
assert( strcmp(plainbuf, inbuf) == 0 );
xfree(plainbuf);
xfree(outbuf);
#ifdef LOOP
}
#endif
return 0;
}

c base64 encode/decode implement by openssl


void b64_encode(const byte *inbuf, size_t inlen, byte **outbuf, size_t *outlen);

void b64_decode(const byte *inbuf, size_t  inlen, byte **outbuf, size_t *outlen);

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment