This commit is contained in:
Lncvrt committed 2026-03-11 22:45:07 -07:00
1 parent 420238165f
commit 434cd69467
1 file changed
+23 -17
+23 -17
View File
@@ -1,10 +1,13 @@
#include <math.h>
#include <openssl/bio.h>
#include <openssl/buffer.h>
#include <openssl/evp.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
// This code is taken from https://gist.github.com/barrysteyn/4409525
// Modified for Windows compatibility (no fmemopen)
int calcDecodeLength(const char *b64input) {
int len = strlen(b64input);
@@ -18,40 +21,43 @@ int calcDecodeLength(const char *b64input) {
return (int)len * 0.75 - padding;
}
int *base64_encode(const char *message, char **buffer) {
int base64_encode(const char *message, char **buffer) {
BIO *bio, *b64;
FILE *stream;
int encodedSize = 4 * ceil((double)strlen(message) / 3);
*buffer = (char *)malloc(encodedSize + 1);
BUF_MEM *buffer_ptr;
int encodedSize = 4 * (int)ceil((double)strlen(message) / 3);
stream = fmemopen(*buffer, encodedSize + 1, "w");
b64 = BIO_new(BIO_f_base64());
bio = BIO_new_fp(stream, BIO_NOCLOSE);
bio = BIO_new(BIO_s_mem());
bio = BIO_push(b64, bio);
BIO_set_flags(bio, BIO_FLAGS_BASE64_NO_NL);
BIO_write(bio, message, strlen(message));
BIO_flush(bio);
BIO_free_all(bio);
fclose(stream);
BIO_get_mem_ptr(bio, &buffer_ptr);
return (0);
*buffer = (char *)malloc(buffer_ptr->length + 1);
memcpy(*buffer, buffer_ptr->data, buffer_ptr->length);
(*buffer)[buffer_ptr->length] = '\0';
BIO_free_all(bio);
return 0;
}
int *base64_decode(char *b64message, char **buffer) {
int base64_decode(char *b64message, char **buffer) {
BIO *bio, *b64;
int decodeLen = calcDecodeLength(b64message), len = 0;
*buffer = (char *)malloc(decodeLen + 1);
FILE *stream = fmemopen(b64message, strlen(b64message), "r");
int decodeLen = calcDecodeLength(b64message);
int len = 0;
*buffer = (char *)malloc(decodeLen + 1);
bio = BIO_new_mem_buf(b64message, strlen(b64message));
b64 = BIO_new(BIO_f_base64());
bio = BIO_new_fp(stream, BIO_NOCLOSE);
bio = BIO_push(b64, bio);
BIO_set_flags(bio, BIO_FLAGS_BASE64_NO_NL);
len = BIO_read(bio, *buffer, strlen(b64message));
(*buffer)[len] = '\0';
BIO_free_all(bio);
fclose(stream);
return (0);
}
return 0;
}