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

Popular posts from this blog

c# - How to set Z index when using WPF DrawingContext? -

razor - Is this a bug in WebMatrix PageData? -

visual c++ - Using relative values in array sorting ( asm ) -