Thanks a lot for the response. I applied the feedbacks you gave me. Now I 
changed the parts you mentioned in the previous post. I also checked the error 
messages and they exactly show up after line:
p7 = d2i_PKCS7_bio(in, NULL);

The error messages are:
140258883262112:error:0D0680A8:asn1 encoding routines:ASN1_CHECK_TLEN:wrong 
tag:tasn_dec.c:1319:
140258883262112:error:0D07803A:asn1 encoding routines:ASN1_ITEM_EX_D2I:nested 
asn1 error:tasn_dec.c:381:Type=PKCS7

For the sake of completeness, I just copy the entire function here so that it 
would be easier to see what I have done so far. The corresponding lines are 
being bold as below: 

int decrypt(char* chEnc, int iLength) {
>    BIO *in = NULL, *out = NULL, *tbio = NULL;
>    X509 *rcert = NULL;
>    EVP_PKEY *rkey = NULL;
>    PKCS7 *p7 = NULL;
>    int ret = 1;
>
>
>    OpenSSL_add_all_algorithms();
>    ERR_load_crypto_strings();
>
>
>    /* Read in recipient certificate and private key */
>    tbio = BIO_new_file("signer.pem", "r");
>
>
>    if (!tbio) {
>        fprintf(stderr, "Error Decrypting Data\n");
>        ERR_print_errors_fp(stderr);
>        return 0;
>    }
>
>
>    rcert = PEM_read_bio_X509(tbio, NULL, 0, NULL);
>    BIO_reset(tbio);
>    rkey = PEM_read_bio_PrivateKey(tbio, NULL, 0, NULL);
>    if (!rcert || !rkey) {
>        fprintf(stderr, "Error Decrypting Data\n");
>        ERR_print_errors_fp(stderr);
>        return 0;
>    }
>    in = BIO_new_mem_buf(chEnc, iLength);
>   BIO_flush(in);
>
>
>    p7 = d2i_PKCS7_bio(in, NULL);
>    if (!p7) {
>        fprintf(stderr, "Error in d2i_PKCS7_bio.\n");
>        ERR_print_errors_fp(stderr);
>        return 0;
>    }
>
>
>    if (!PKCS7_decrypt(p7, rkey, rcert, out, 0)) {
>        fprintf(stderr, "Error Decrypting Data, PKCS7_decrypt\n");
>        ERR_print_errors_fp(stderr);
>        return 0;
>    }
>    ret = 0;
>    if (ret) {
>        fprintf(stderr, "Error Signing Data\n");
>        ERR_print_errors_fp(stderr);
>    }
>    if (p7)
>        PKCS7_free(p7);
>    if (rcert)
>        X509_free(rcert);
>    if (rkey)
>        EVP_PKEY_free(rkey);
>    if (in)
>        BIO_free(in);
>    if (out)
>        BIO_free(out);
>    if (tbio)
>        BIO_free(tbio);
>    return ret;
>}


Any idea about the problem?


________________________________
 From: Dave Thompson <dthomp...@prinpay.com>
To: openssl-users@openssl.org 
Sent: Wednesday, July 4, 2012 4:17 AM
Subject: RE: Convert PKCS7_decrypt output to char*
 
>From: owner-openssl-us...@openssl.org On Behalf Of Mohammad khodaei
>Sent: Monday, 02 July, 2012 10:05

>I want to encrypt and decrypt using PKCS7_encrypt() and PKCS7_decrypt(). 
>I use this procedure to encrypt so that I can retreive the encrypted buffer

>into a char* (and not into a file). Here is the code:

>    p7 = PKCS7_encrypt(recips, in, EVP_des_ede3_cbc(), flags);
>    if (!p7)
>        return 0;
    
>    char* chTest = new char[1000];
>    BIO* memorybio = BIO_new(BIO_s_mem());
>    BIO* base64bio = BIO_new(BIO_f_base64());
>    BIO* outbio = BIO_push(base64bio, memorybio);
    
>    /* Copy PKCS#7 */
>    long ll = i2d_PKCS7_bio(outbio, p7);
>    BIO_flush(outbio);
>    BIO_set_flags(memorybio, BIO_FLAGS_MEM_RDONLY);
>    BIO_get_mem_data(memorybio, &chTest);
>    cout << chTest << "\n";

BIO_get_mem_data discards the pointer value (and thus 
leaks your new char[1000] above. It changes chTest to point 
to the internal memory buffer, which I don't  believe is 
guaranteed to be null-terminated (although you may be lucky).

>Now, when I want to do the reverse, I do as follows:

>    BIO* memorybio = BIO_new(BIO_s_mem());
>    int iLength = BIO_puts(memorybio, chEnc);
        
>    BIO* base64bio = BIO_new(BIO_f_base64());
>    BIO* inbio = BIO_push(base64bio, memorybio);
    
>    BIO_flush(inbio);
>    BIO_set_flags(inbio, BIO_FLAGS_MEM_RDONLY);

You can replace all of the memorybio steps and 
eliminate the copy with one BIO_new_mem_buf.

>    p7 = d2i_PKCS7_bio(inbio, &p7);

You don't check this succeeded; in this situation 
it should, but it's better to make certain.
I assume/hope p7 was previously set to null, 
or to the result of a successful PKCS7_new().
If it was uninitialized that could cause all 
sorts of problems (some not clearly indicated).

>    if (!PKCS7_decrypt(p7, rkey, rcert, out, 0))
        return 0;

>The problem is that the PKCS7_decrypt does not work 
>and it is not derypting correctly. Any idea how to solve it?

first *diagnose* what openssl disklikes 
http://www.openssl.org/support/faq.html#PROG6
and if applicable
http://www.openssl.org/support/faq.html#PROG7
http://www.openssl.org/support/faq.html#PROG8

then you can probably correct it.

______________________________________________________________________
OpenSSL Project                                 http://www.openssl.org
User Support Mailing List                    openssl-users@openssl.org
Automated List Manager                          majord...@openssl.org

Reply via email to