Неверное кодирование Base64 с использованием libssl - PullRequest
2 голосов
/ 14 сентября 2010

Принимая следующий код, у меня странная ошибка в моих кодировках base64.

#include <openssl/bio.h>
#include <openssl/buffer.h>
#include <stdio.h>
#include <string.h>

char * base64(unsigned char * input, int length) {

    BIO *b64 = NULL;
    BIO * bmem = NULL;
    BUF_MEM *bptr = NULL;
    char * output = NULL;

    b64 = BIO_new((BIO_METHOD *)BIO_f_base64());
    BIO_set_flags(b64, BIO_FLAGS_BASE64_NO_NL);
    bmem = BIO_new(BIO_s_mem());
    b64 = BIO_push(b64, bmem);
    BIO_write(b64, input, length);
    BIO_flush(b64);
    BIO_get_mem_ptr(b64, &bptr);

    output = (char *) calloc (bptr->length, sizeof(char));
    memcpy(output, bptr->data, bptr->length);

    BIO_free_all(b64);

    return output;
}


int main(int argc, char *argv[]) {


    char * based_string = NULL;

    based_string = base64(argv[1], strlen(argv[1]));
    printf("%s\n", based_string);
    free(based_string);
    return 0;
}

Я компилирую с gcc test.c -o test -lcrypto

если я бегу:

./test testtes

У меня dGVzdHRlcw==� в результате .. вместо dGVzdHRlcw==

если я бегу:

./test test

У меня взамен dGVzdA==, что является хорошим результатом.

Что не так с предыдущим исходным кодом.

1 Ответ

7 голосов
/ 14 сентября 2010
output = (char *) calloc (bptr->length + 1, sizeof(char));

Вам не хватает '+1', поэтому в буфере нет места для нулевого терминатора.

...