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???