Hi,

I'm decrypting a string (test12345678) found in an input-file. 
When I decrypt using two file-BIO's (in the following code-extract this means 
replacing out=BIO_new(BIO_s_mem) by out=BIO_new(BIO_s_file) and a 
BIO_write_filename(out,outf) ), then the outputfile contains the full decrypted string 
"test12345678".

When I do the same using a mem-BIO (see code below), the decrypted string returned is 
always 8 characters, and if the encrypted string is smaller then 8 characters 
nothing happens ! I must be overlooking something MEM_BUF-related, but I just don't 
see it.

Any ideas/hints on how to resolve this ?
Thanks ! & kind regards,
dirk L.

example code:
#include <stdio.h>
#include <string.h>
#include <openssl/evp.h>
#include <openssl/bio.h>
#include <openssl/err.h>
#include <openssl/buffer.h>
#include <openssl/md5.h> 

#define ATTRMAX 50
#define BUFFERSIZE 256
#define BSIZE   (8*1024)

main(argc, argv)
int  argc;
char *argv[];
{
    char inf[19] = "test_encrypted.pas";
    char *pw=NULL;
    int ret;

    ret = get_passphrase(inf,&pw);
    if(ret == 0){
      fprintf(stdout,"the password is %s\n",pw);
    }else{
      fprintf(stdout,"Unable to retrieve the password from file %s\n",inf);
    }
}

int get_passphrase(char *inf,char **pass){
    int         done = 0,inl;
    int         bsize=BSIZE;
    char        cipher_name[5]="des3";
    const       EVP_CIPHER *cipher=NULL;
    char        str[5]  ="test";
    unsigned char *buff=NULL;
    BUF_MEM *bptr;
    BIO *in=NULL,*benc=NULL,*out=NULL;
    unsigned char key[24],iv[MD5_DIGEST_LENGTH];
   
    fprintf(stdout,"Begin decrypt\n");
    OpenSSL_add_all_ciphers();
    cipher=EVP_get_cipherbyname(cipher_name);
    if (cipher == NULL){
       fprintf(stdout,"%s is an unknown cipher\n",cipher_name);
       return 1;
    }           
    
    /*read input-filename*/
    if(inf==NULL){
      fprintf(stdout,"input-filename not specified\n"); 
      return 1;
    }else{
      in=BIO_new(BIO_s_file());
      if(in==NULL){
        fprintf(stdout,"unable to open input-filename %s\n",inf); 
        return 1;
      }else{
        if (BIO_read_filename(in,inf) <= 0){
          fprintf(stdout,"1)unable to read from input-filename %s\n",inf); 
          return 1;
        }else{
          out=BIO_new(BIO_s_mem());
          if(out==NULL){
            fprintf(stdout,"unable to create mem-BIO\n"); 
            return 1;
          }
          if((cipher!=NULL)&&(str!=NULL)){
            EVP_BytesToKey(cipher,EVP_md5(),NULL, (unsigned char *)str, 
strlen(str),1,key,iv); 
            /*zero the variable str*/
            memset(str,0,strlen(str));
            
            /*create the encrypt/decrypt BIO*/
            if ((benc=BIO_new(BIO_f_cipher())) == NULL){
              fprintf(stdout,"unable to create decrypt-BIO \n"); 
              return 1;
            }else{
              BIO_set_cipher(benc,cipher,key,iv,0); 
          
              /* decrypt on the go */
              if (benc != NULL)
                out=BIO_push(benc,out);

              buff=(unsigned char *)OPENSSL_malloc(EVP_ENCODE_LENGTH(bsize));
              if (buff == NULL){
                fprintf(stdout,"unable to assign buffer\n"); 
                return 1;
              }     

              for (;;) {
                inl=BIO_read(in,(char *)buff,bsize);
                if (inl <= 0) break;
                if (BIO_write(out,(char *)buff,inl) != inl){
                   fprintf(stdout,"error writing output file\n");
                   goto end;
                }
              }
              BIO_get_mem_ptr(out, &bptr);

              fprintf(stdout,"read from out %s, length %d\n",bptr->data,bptr->length);
              *pass=strdup(bptr->data);

              if (!BIO_flush(out)) {
                fprintf(stdout,"bad decrypt\n");
                goto end;
              }

              end:                           
              fprintf(stdout,"passphrase successfully decrypted\n");
            }
          }else{
            fprintf(stdout,"2)unable to read from input-filename %s\n",inf); 
            return 1;
          }
        }
      }
    }
    EVP_cleanup();

    if (buff != NULL) OPENSSL_free(buff);
    if (in != NULL) BIO_free(in);
    if (out != NULL) BIO_free_all(out);

    fprintf(stdout,"End decrypt\n");
    return 0;
}

*****************
Dirk Laurijssen
Syntegra, creating winners in the digital economy.
+32 2 247 92 20 - Check us out at www.syntegra.be
*****************


______________________________________________________________________
OpenSSL Project                                 http://www.openssl.org
User Support Mailing List                    [EMAIL PROTECTED]
Automated List Manager                           [EMAIL PROTECTED]

Reply via email to