On Thu, Jul 02, 2009, rajeshk_pec99-open...@yahoo.com wrote:

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

DER format is binary data it is not null terminated, your call to
BIO_new_mem_buf() with -1 length will end up with a bogus length on the first
null in the certificate encoding.

You already worked out the lenght of the certifcate "len". Pass that as the
length instead.

Steve.
--
Dr Stephen N. Henson. OpenSSL project core developer.
Commercial tech support now available see: http://www.openssl.org
______________________________________________________________________
OpenSSL Project                                 http://www.openssl.org
User Support Mailing List                    openssl-users@openssl.org
Automated List Manager                           majord...@openssl.org

Reply via email to