2010-09-14 9 views
2

En supposant que le code suivant, j'ai une erreur étrange dans mes encodages base64.Mauvais codage Base64 utilisant libssl

#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; 
} 

Je compiler avec gcc test.c -o test -lcrypto

si je courir:

./test testtes

J'ai dGVzdHRlcw==� en résultat .. au lieu de dGVzdHRlcw==

si je cours:

./test test

J'ai en retour dGVzdA==, ce qui est le bon résultat.

Quel est le problème avec le code source précédent.

+0

'sizeof (char)' est défini comme étant '1'. Aussi, en C, vous ne devez pas renvoyer les valeurs de retour de 'malloc' ou' calloc', car cela pourrait vous avertir de l'absence de prototypes: ici, vous n'avez pas inclus '' stdlib.h '', donc votre compilateur pourrait d'abord convertir renvoie la valeur à 'int', puis la place dans' char * 'et perd un peu de son chemin. En C++ vous devriez faire le cast, mais là vous n'utiliserez pas 'calloc' en premier lieu. –

Répondre

7
output = (char *) calloc (bptr->length + 1, sizeof(char)); 

Il vous manque le '+1', donc il n'y a pas de place dans le tampon pour la terminaison nulle.

+0

J'ai un peu honte de ne pas avoir vu ce problème. Merci beaucoup – ohe

Questions connexes