By the way sorry for the font size, it does not mean anything, it just mixed up during cut and paste.
The function to dump x509 into a certificate is is PEM_write_bio_X509() and the function to dump a x509 der file is bio_write(). Here is the doc on bio_write http://www.manpagez.com/man/3/BIO_write/osx-10.3.php erwin On Wed, Jul 27, 2011 at 8:20 PM, Erwin Himawan <ehima...@gmail.com> wrote: > ** > I would not use the X509_print_fp(), since it does not give you the PEM or > DER file. > Use intead PEM_write_bio or write_bio() for PEM and DER respectively. > Also check for error for the status of these two bio write function. > > hopefully it helps > > *From:* Andrea Saracino <saracino.and...@gmail.com> > *Sent:* Wednesday, July 27, 2011 6:05 PM > *To:* openssl-users@openssl.org > *Subject:* Re: X509 verify > > Hi Erwin, thanks for your fast answer. > I dumped both the certificates in 2 PEM files, then I used the > X509_print_fp() to obtain the readable version of both of them. The two > resulting files are identical. Perhaps there is something wrong in the > invocation of the i2d/d2i functions. I'm posting an extract of the code: > > ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// > struct T_G_4{ > > unsigned char nonce[NONCE_SIZE]; > int cert_size; > unsigned char certificate[MAX_MSG_SIZE-NONCE_SIZE-sizeof(int)]; > } > > /*...*/ > T_G_4 * TG4=new T_G_4; > /*...*/ > peer_certificate=/* initialization function */ //this is a private member > of a class and the two functions are members of the same class > EVP_PKEY * pubkey=EVP_PKEY_new(); > EVP_PKEY_set1_RSA(pubkey, rsa_ca_pub_key); > > X509_verify(peer_certificate,pubkey); //this verification returns 1 > > unsigned char * serialized certificate=NULL; //following the example of the > openssl d2i_X509 page, NULL pointer avoids the management of the increasing > pointer > TG4->cert_size=i2d(peer_certificate,&serialized_certificate); > //serialization > memcpy(TG4->certificate,serialized_certificate,TG4->cert_size); > //initialize the remaining fields and return TG4 > //passing the structure to another function > //other function: > /*...*/ > unsigned char * serialized_certificate=new unsigned char [TG4->cert_size]; > memcpy(serialized_certificate,TG4->certificate,TG4->cert_size); > peer_certificate = d2i_X509(NULL,(const unsigned char > **)&serialized_certificate,TG4->cert_size); //deserialization > X509_verify(peer_certificate,pubkey); //now it returns 0... :( > > /*...*/ > > Is there something wrong in this code? > Thanks in advance. > > Best Regards > > Andrea Saracino > > 2011/7/27 Erwin Himawan <ehima...@gmail.com> > >> The way I would verify this is by writting the original X509 object into >> PEM file and dumping the X509 object resulted from d2i_x509() into another >> PEM file and compares both files using the openssl ; either using asnparse >> or x509 command. >> >> >> On Wed, Jul 27, 2011 at 9:46 AM, Andrea Saracino < >> saracino.and...@gmail.com> wrote: >> >>> Hello everyone, >>> I've found some issues using the function X509_verify() on a simple X509 >>> certificate. After the creation, if I call: >>> >>> X509_verify(certificate,ca_key); >>> >>> the function returns 1, but if I call the i2d_X509() function on the >>> certificate and then the d2i_X509() on the obtained byte string, the >>> X509_verify() on the resultant certificate returns 0. >>> >>> I printed the certificate, in a readable format, before and after the >>> i2d() and d2i() execution and the result is exactly the same. The various >>> fields (issuer, subject...) have the correct values. Any ideas? >>> >>> Best Regards >>> >>> Andrea Saracino >>> >>> >>> >>> >> >