c - base64 decoding files of length greater than 8192? -
whenever try base64 decode files (using openssl's bio_f_base64()
) larger 8192, seem wrong value.
what magic number 8192? educate me appreciated!
updated:
here part of code:
int dgst(char *alg) { evp_md_ctx ctx; const evp_md *md; unsigned char md_value[evp_max_md_size]; unsigned int md_len, i; char *tob64val = null; char *data = null; openssl_add_all_digests(); md = evp_get_digestbyname(alg); if(!md) { printf("unknown message digest %s\n", alg); exit(1); } data = readfilebuffer("file_out"); printf("strlen(data) %d\n", strlen(data)); evp_md_ctx_init(&ctx); evp_digestinit_ex(&ctx, md, null); evp_digestupdate(&ctx, data, strlen(data)); evp_digestfinal_ex(&ctx, md_value, &md_len); //retrieve digest ctx unto md_value , #bytes written copied md_len evp_md_ctx_cleanup(&ctx); unsigned char *copy = malloc(md_len); memcpy(copy, md_value, md_len); char *buff = encbase64(copy, md_len); printf("digest is:%s\n ", buff); free(buff); free(tob64val); free(data); return 0; } char *readfilebuffer(char *name) { file *file; char *buffer = null; unsigned long filelen; //open file file = fopen(name, "rb"); if (!file) { fprintf(stderr, "unable open file %s", name); return; } //get file length fseek(file, 0, seek_end); filelen=ftell(file); printf("file length = %ld\n", filelen); fseek(file, 0, seek_set); //printf("allocate memory\n"); buffer=(char *)malloc(filelen+1); printf("length of write buffer = %d\n", strlen(buffer)); if (!buffer) { fprintf(stderr, "memory error!"); } long int n = fread(buffer,1, filelen,file); buffer[n] = '\0'; printf("read no. of bytes = %ld buffer \n", n); printf("len of buffer %d \n", strlen(buffer)); if (!buffer) { fprintf(stderr, "memory error!"); fclose(file); } fclose(file); return buffer; } char *encbase64( char *input, int length) { bio *bmem, *b64; buf_mem *bptr; b64 = bio_new(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); char *buff = (char *)malloc(bptr->length); memcpy(buff, bptr->data, bptr->length-1); buff[bptr->length-1] = 0; bio_free_all(b64); return buff; }
it doesn't seem have problems 8k boundaries. show soucecode how call it?
update:
int dgst(char *alg) { evp_md_ctx ctx; const evp_md *md; unsigned char md_value[evp_max_md_size]; unsigned int md_len, i; char *tob64val = null; char *data = null; openssl_add_all_digests(); md = evp_get_digestbyname(alg); if(!md) { printf("unknown message digest %s\n", alg); exit(1); } data = readfilebuffer("file_out"); //printf("strlen(data) %d\n", strlen(data)); <- don't use strlen on binary data evp_md_ctx_init(&ctx); evp_digestinit_ex(&ctx, md, null); evp_digestupdate(&ctx, data, strlen(data)); evp_digestfinal_ex(&ctx, md_value, &md_len); //retrieve digest ctx unto md_value , #bytes written copied md_len evp_md_ctx_cleanup(&ctx); unsigned char *copy = malloc(md_len); memcpy(copy, md_value, md_len); char *buff = encbase64(copy, md_len); printf("digest is:%s\n ", buff); free(buff); free(tob64val); free(data); return 0; } char *readfilebuffer(char *name) { file *file; char *buffer = null; unsigned long filelen; //open file file = fopen(name, "rb"); if (!file) { fprintf(stderr, "unable open file %s", name); return; } //get file length fseek(file, 0, seek_end); filelen=ftell(file); printf("file length = %ld\n", filelen); fseek(file, 0, seek_set); //printf("allocate memory\n"); buffer=(char *)malloc(filelen/*+1*/); // <- not string - no need +1 //printf("length of write buffer = %d\n", strlen(buffer)); <- again strlen on binary data (you allocated it, contains random bytes) if (!buffer) { fprintf(stderr, "memory error!"); } long int n = fread(buffer,1, filelen,file); //buffer[n] = '\0'; // not string - no need end printf("read no. of bytes = %ld buffer \n", n); //printf("len of buffer %d \n", strlen(buffer)); <- buffer length in 'n' if (!buffer) { fprintf(stderr, "memory error!"); fclose(file); } fclose(file); return buffer; } char *encbase64( char *input, int length) { bio *bmem, *b64; buf_mem *bptr; b64 = bio_new(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); char *buff = (char *)malloc(bptr->length); memcpy(buff, bptr->data, bptr->length/*-1*/); // removed '+1' //buff[bptr->length-1] = 0; // not string bio_free_all(b64); return buff; }
Comments
Post a Comment