#include <iostream>
#include <openssl/bio.h>
#include <openssl/evp.h>
#include <openssl/buffer.h>
using namespace std;
int Base64Encode(const unsigned char* in, int len, char* out_base64)
{
if (!in || len <= 0 || !out_base64)
return 0;
auto mem_bio = BIO_new(BIO_s_mem());
if (!mem_bio)return 0;
auto b64_bio = BIO_new(BIO_f_base64());
if (!b64_bio)
{
BIO_free(mem_bio);
return 0;
}
BIO_push(b64_bio, mem_bio);
BIO_set_flags(b64_bio, BIO_FLAGS_BASE64_NO_NL);
int re = BIO_write(b64_bio, in, len);
if (re <= 0)
{
BIO_free_all(b64_bio);
return 0;
}
BIO_flush(b64_bio);
int outsize = 0;
BUF_MEM* p_data = 0;
BIO_get_mem_ptr(b64_bio, &p_data);
if (p_data)
{
memcpy(out_base64, p_data->data, p_data->length);
outsize = p_data->length;
}
BIO_free_all(b64_bio);
return outsize;
}
int Base64Decode(const char* in, int len, unsigned char* out_data)
{
if (!in || len <= 0 || !out_data)
return 0;
auto mem_bio = BIO_new_mem_buf(in, len);
if (!mem_bio)return 0;
auto b64_bio = BIO_new(BIO_f_base64());
if (!b64_bio)
{
BIO_free(mem_bio);
return 0;
}
BIO_push(b64_bio, mem_bio);
BIO_set_flags(b64_bio, BIO_FLAGS_BASE64_NO_NL);
size_t size = 0;
BIO_read_ex(b64_bio, out_data,len,&size);
BIO_free_all(b64_bio);
return size;
}
int main(int argc, char* argv[])
{
cout << "Test openssl BIO base64!" << endl;
unsigned char data[] = "测试base64数据0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789";
int len = sizeof(data);
char out[4096] = { 0 };
unsigned char out2[4096] = { 0 };
cout <<"source:"<< data << endl;
int re = Base64Encode(data, len, out);
if (re > 0)
{
out[re] = '\0';
cout << "encode:["<<out<<"]" << endl;
}
re = Base64Decode(out, re, out2);
cout <<"decode:"<< out2 << endl;
getchar();
return 0;
}