I am trying to use d2i_X509_bio to read a DER encoded certificate from memory 
BIO, but I can't get it to work. It works fine if I construct a file BIO to 
read from a file. Am I doing something wrong, or is this a bug?

See the test application below that shows the problem. "der.cer" is DER encoded 
certificate.

>>>>>>>>>>>>>>>>>>>>>>>>>>>
#include <stdio.h>
#include <stdlib.h>
#include <stdarg.h>
#include <string.h>
#include <openssl/crypto.h>
#include <openssl/err.h>
#include <openssl/bio.h>
#include <openssl/evp.h>
#include <openssl/objects.h>

#define MAX_CERT_LEN 20000 /* arbitrary size limit */

int main(int argc, char *argv[]) {

  FILE *fp = 0;
  char derCert[MAX_CERT_LEN];
  long len;

  if (fp = fopen("../der.cer", "rb")) {
    len=fread(derCert, 1, MAX_CERT_LEN - 1, fp);
    derCert[len] = '\0';
   }
  //This is working 
   do
   {
       X509 *x509Cert=NULL;
       BIO *cert;
       if ((cert=BIO_new(BIO_s_file())) == NULL)
        {
            printf("Error Initializing BIO pointer");
            break;
        }

       if (BIO_read_filename(cert,"../der.cer") <= 0)
       {
            printf("Error opening file\n");
            break;
       }

        if (d2i_X509_bio(cert,&x509Cert)!=NULL)
        {
                 printf("\nReading from file success!\n");
        }
    
    }while(0);
 
    //This is not working
    do
    {
       X509 *x509Cert=NULL;
       BIO *cert;
       BIO *bioCert;
      if(( bioCert = BIO_new_mem_buf(derCert, -1)) == NULL)
      {
            printf("Error init BIO pointer");
            break;

      }
        if (d2i_X509_bio(bioCert,&x509Cert)!=NULL)
        {
                 printf("\nReading success!\n");
        }
        else
        {
                 printf("\nError Reading Certificate:%ld\n",ERR_get_error());
        }

      
    }while(0);
}
<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<


Reading from file success!

Error Reading Certificate:218542222

After reading problem
http://marc.info/?l=openssl-users&m=115689073330824&w=2

I also tried to put 
BIO_set_mem_eof_return(bioCert, 0);
after "BIO_set_mem_eof_return" but it is still giving the same error. 

I am new to openssl. Please do see where I am doing mistake?

-- 
Regards,
Rajesh
http://wpcStylePuzzles.blogspot.com
http://wscStylePuzzles.blogspot.com






      Looking for local information? Find it on Yahoo! Local 
http://in.local.yahoo.com/

Reply via email to