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/