ps, yes, line 29 is a mistake and should read: char new_filename[strlen( filename ) + 5];
But even with that fix i get the same results On Fri, Aug 16, 2013 at 2:27 AM, Ztatik Light <ztatik.li...@gmail.com>wrote: > maybe not - still confused > > > On Fri, Aug 16, 2013 at 2:21 AM, Ztatik Light <ztatik.li...@gmail.com>wrote: > >> strange i think it has something to do with me using "rb" and "wb" >> instead of "r" and "w"... >> >> >> On Fri, Aug 16, 2013 at 2:14 AM, Ztatik Light <ztatik.li...@gmail.com>wrote: >> >>> So, I'm having a really weird issue... i'm trying simple file >>> encryption/decryption with BIO_*, but if the encrypted file is in a >>> subdirectory.. i get garbage data, >>> >>> I'll post the code i'm using, with a brief elaboration on how i'm using >>> it and what behaviour i'm getting: >>> >>> /////////////////////////////// >>> >>> /* >>>> >>>> Example of ssl read and write to a file >>>> >>>> >>>>> gcc ssl_write_read.c -lssl >>>> >>>> ./a.out >>>> >>>> >>>>> >>>>> */ >>>> >>>> >>>>> >>>>> >>>>> #include <openssl/bio.h> >>>> >>>> #include <openssl/err.h> >>>> >>>> #include <openssl/rand.h> >>>> >>>> #include <openssl/ssl.h> >>>> >>>> #include <openssl/x509v3.h> >>>> >>>> >>>>> int read_whole_file( char* filename, char** data ){ >>>> >>>> FILE* file = fopen( filename, "rb" ); >>>> >>>> fseek( file, 0, SEEK_END ); >>>> >>>> long fileSize = ftell( file ); >>>> >>>> rewind( file ); >>>> >>>> *data = malloc( fileSize ); >>>> >>>> fread( *data, fileSize, 1, file ); >>>> >>>> fclose( file ); >>>> >>>> return fileSize; >>>> >>>> } >>>> >>>> void encrypt_file( char* filename ){ >>>> >>>> char new_filename[strlen( filename + 4 )]; >>>> >>>> strcpy( new_filename, filename ); >>>> >>>> strcat( new_filename, ".enc" ); >>>> >>>> char* data; >>>> >>>> int fileSize = read_whole_file( filename, &data ); >>>> >>>> write_data( new_filename, data, fileSize, (unsigned char*)"mykey" ); >>>> >>>> free( data ); >>>> >>>> } >>>> >>>> >>>>> int write_data(const char *filename, char *out, int len, unsigned char >>>>> *key) >>>> >>>> { >>>> >>>> int total, written; >>>> >>>> BIO *cipher, *buffer, *file; >>>> >>>> >>>> >>>> /* Create a buffered file BIO for writing */ >>>> >>>> file = BIO_new_file(filename, "wb"); >>>> >>>> if (!file) >>>> >>>> return 0; >>>> >>>> >>>> >>>> /* Create a buffering filter BIO to buffer writes to the file */ >>>> >>>> buffer = BIO_new(BIO_f_buffer( )); >>>> >>>> >>>> >>>> /* Create a base64 encoding filter BIO */ >>>> >>>> // b64 = BIO_new(BIO_f_base64( )); >>>> >>>> >>>> >>>> /* Create the cipher filter BIO and set the key. The last parameter >>>>> of >>>> >>>> BIO_set_cipher is 1 for encryption and 0 for decryption */ >>>> >>>> cipher = BIO_new(BIO_f_cipher( )); >>>> >>>> BIO_set_cipher(cipher, EVP_des_ede3_cbc( ), key, NULL, 1); >>>> >>>> >>>> >>>> /* Assemble the BIO chain to be in the order cipher-b64-buffer-file */ >>>> >>>> // BIO_push(cipher, b64); >>>> >>>> // BIO_push(b64, buffer); >>>> >>>> BIO_push(cipher,buffer); >>>> >>>> BIO_push(buffer, file); >>>> >>>> >>>>> /* This loop writes the data to the file. It checks for errors as >>>>> if the >>>> >>>> underlying file were non-blocking */ >>>> >>>> for (total = 0; total < len; total += written) >>>> >>>> { >>>> >>>> if ((written = BIO_write(cipher, out + total, len - total)) <= 0) >>>> >>>> { >>>> >>>> if (BIO_should_retry(cipher)) >>>> >>>> { >>>> >>>> written = 0; >>>> >>>> continue; >>>> >>>> } >>>> >>>> break; >>>> >>>> } >>>> >>>> } >>>> >>>> >>>> >>>> /* Ensure all of our data is pushed all the way to the file */ >>>> >>>> BIO_flush(cipher); >>>> >>>> >>>> >>>> BIO_free_all(cipher); >>>> >>>> } >>>> >>>> >>>>> BIO* decrypt_open( const char *filename, unsigned char *key ){ >>>> >>>> int total, written; >>>> >>>> BIO *cipher, *buffer, *file; >>>> >>>> //char *b = malloc(len); >>>> >>>> >>>> >>>> /* Create a buffered file BIO for reading */ >>>> >>>> file = BIO_new_file(filename, "rb"); >>>> >>>> if (!file) >>>> >>>> return 0; >>>> >>>> >>>> >>>> /* Create a buffering filter BIO to buffer writes to the file */ >>>> >>>> buffer = BIO_new(BIO_f_buffer( )); >>>> >>>> >>>> >>>> /* Create a base64 encoding filter BIO */ >>>> >>>> // b64 = BIO_new(BIO_f_base64( )); >>>> >>>> >>>> >>>> /* Create the cipher filter BIO and set the key. The last parameter >>>>> of >>>> >>>> BIO_set_cipher is 1 for encryption and 0 for decryption */ >>>> >>>> cipher = BIO_new(BIO_f_cipher( )); >>>> >>>> BIO_set_cipher(cipher, EVP_des_ede3_cbc( ), key, NULL, 0); >>>> >>>> >>>> >>>> /* Assemble the BIO chain to be in the order cipher-b64-buffer-file */ >>>> >>>> // BIO_push(cipher, b64); >>>> >>>> // BIO_push(b64, buffer); >>>> >>>> BIO_push(cipher,buffer); >>>> >>>> BIO_push(buffer, file); >>>> >>>> return cipher; >>>> >>>> } >>>> >>>> char* decrypt_read( BIO* cipher, int len, char* b ){ >>>> >>>> int total, written; >>>> >>>> >>>>> // char b[len + 1]; >>>> >>>> for (total = 0; total < len; total += written) >>>> >>>> { >>>> >>>> if ((written = BIO_read(cipher, b, len - total)) <= 0) >>>> >>>> { >>>> >>>> if (BIO_should_retry(cipher)) >>>> >>>> { >>>> >>>> written = 0; >>>> >>>> continue; >>>> >>>> } >>>> >>>> break; >>>> >>>> } >>>> >>>> } >>>> >>>> >>>> >>>> b[total] = '\0'; >>>> >>>> >>>> >>>> return b; >>>> >>>> } >>>> >>>> >>>>> int main(void) >>>> >>>> { >>>> >>>> //chdir("subdirectory"); >>>> >>>> char *file_="test.txt"; >>>> >>>> char* data = "howdy\n"; >>>> >>>> write_data( file_, data, strlen(data), "mykey"); >>>> >>>> >>>>> BIO* cipher = decrypt_open( file_, (unsigned char*)"mykey" ); >>>> >>>> char b[999999]; >>>> >>>> decrypt_read( cipher, 999999, b ); >>>> >>>> BIO_flush( cipher ); >>>> >>>> BIO_free_all( cipher ); >>>> >>>> printf(">%s\n",b); >>>> >>>> >>>>> //char* test="plain.txt"; >>>> >>>> //encrypt_file(test); >>>> >>>> >>>>> } >>>> >>>> >>> /////////////////////////////////////////////////////////// >>> >>> 1. So, first run creates and writes encrypted file "test.txt" and then >>> decrypts and prints out the contents, "howdy", >>> >>> 2. Now, comment out line 141 // write_data( ... re-run to verify >>> "howdy", works fine >>> >>> 3. make directory "temp", move "test.txt" into "temp" and change line >>> 139 to reflect that: char *file_="temp/test.txt";.. re-run - I get no >>> results ?? >>> >>> 4. Even more weird: change line 139 back to just "test.txt", and replace >>> file_ on line 143 with "temp/test.txt" ... so it reads: BIO* cipher = >>> decrypt_open( "temp/test.txt", (unsigned char*)"mykey" ); // re-run... now >>> it works again all of a sudden. BUT - if you comment out line 139 // char >>> *file_="test.txt";.... then it doesn't work again? Even though *file_ isn't >>> being used??? >>> >> >> >