Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #pragma once
- class OpenSSL_Base64
- {
- public:
- static size_t calcDecodeLength(const char* b64input);
- static size_t Base64Decode(char* b64message, unsigned char** buffer, size_t* length);
- static char * Base64Encode(char *decoded_bytes, size_t decoded_length);
- };
- #include "OpenSSL_Base64.h"
- #include <string.h>
- #include <assert.h>
- #include <openssl/bio.h>
- #include <openssl/evp.h>
- #include <openssl/buffer.h>
- size_t OpenSSL_Base64::calcDecodeLength(const char* b64input) { //Calculates the length of a decoded string
- size_t len = strlen(b64input),
- padding = 0;
- if (b64input[len - 1] == '=' && b64input[len - 2] == '=') //last two chars are =
- padding = 2;
- else if (b64input[len - 1] == '=') //last char is =
- padding = 1;
- return (len * 3) / 4 - padding;
- }
- size_t OpenSSL_Base64::Base64Decode(char* b64message, unsigned char** buffer, size_t* length) { //Decodes a base64 encoded string
- BIO *bio, *b64;
- int decodeLen = calcDecodeLength(b64message);
- *buffer = (unsigned char*)malloc(decodeLen + 1);
- (*buffer)[decodeLen] = '\0';
- bio = BIO_new_mem_buf(b64message, -1);
- b64 = BIO_new(BIO_f_base64());
- bio = BIO_push(b64, bio);
- BIO_set_flags(bio, BIO_FLAGS_BASE64_NO_NL); //Do not use newlines to flush buffer
- *length = BIO_read(bio, *buffer, strlen(b64message));
- assert(*length == decodeLen); //length should equal decodeLen, else something went horribly wrong
- BIO_free_all(bio);
- return (0); //success
- }
- char * OpenSSL_Base64::Base64Encode(char *decoded_bytes, size_t decoded_length)
- {
- int x;
- BIO *bioMem, *b64;
- BUF_MEM *bufPtr;
- char *buff;
- b64 = BIO_new(BIO_f_base64());
- BIO_set_flags(b64, BIO_FLAGS_BASE64_NO_NL);
- bioMem = BIO_new(BIO_s_mem());
- b64 = BIO_push(b64, bioMem);
- BIO_write(b64, decoded_bytes, decoded_length);
- x = BIO_flush(b64);
- if (x < 1) {
- BIO_free_all(b64);
- return NULL;
- }
- BIO_get_mem_ptr(b64, &bufPtr);
- buff = (char *)malloc(bufPtr->length + 1);
- memcpy(buff, bufPtr->data, bufPtr->length);
- buff[bufPtr->length] = 0;
- BIO_free_all(b64);
- return buff;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement