<div dir="ltr">i write a c function which convert a pem cert file to a der cert file, it is ok.</div><div class="gmail_extra"><br><div class="gmail_quote">On Thu, Oct 15, 2015 at 7:51 PM, paul von <span dir="ltr"><<a href="mailto:paulvon73@gmail.com" target="_blank">paulvon73@gmail.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr">Hi All:<div><br></div><div>      i have met a problem. Now i am wirting a c function that convert a PEM x509 cert in a buffer (yes, the pem x509 cert is in the buffer, not in a pem file) into a DER x509 cert in a buffer (not in der file)too. I wrote the c code:</div><div><br></div><div><div>// inBuff-->IN_BIO-->X509-->outBuff </div><div>int buf_cert_convert_pem_to_der(const unsigned char *in, int inLen, unsigned char *out, int *outLen)</div><div>{</div><div><span style="white-space:pre-wrap">        </span>int ret = 0; </div><div><span style="white-space:pre-wrap">   </span>BIO *bio_in = NULL; </div><div><span style="white-space:pre-wrap">    </span>X509 *x509 = NULL; </div><div><span style="white-space:pre-wrap">     </span>unsigned char *der_cert_buff = NULL;</div><div><span style="white-space:pre-wrap">     </span>int len = 0;</div><div><br></div><div><span style="white-space:pre-wrap">    </span>bio_in = BIO_new_mem_buf((void *)in, inLen); </div><div><span style="white-space:pre-wrap">   </span>if(bio_in == NULL) </div><div><span style="white-space:pre-wrap">     </span>{ <span style="white-space:pre-wrap">      </span></div><div><span style="white-space:pre-wrap">         </span>printf("BIO_new_mem_buf a bio_in error! \n");</div><div><span style="white-space:pre-wrap">          </span>ret = -1;</div><div><span style="white-space:pre-wrap">                </span>goto err;<span style="white-space:pre-wrap">               </span></div><div><span style="white-space:pre-wrap"> </span>}</div><div><br></div><div><span style="white-space:pre-wrap">       </span>if (!PEM_read_bio_X509(bio_in, &x509, NULL, NULL))</div><div><span style="white-space:pre-wrap">   </span>{</div><div><span style="white-space:pre-wrap">                </span>printf("PEM_read_bio_X509 read x509 cert from bio error! \n");</div><div><span style="white-space:pre-wrap">         </span>ret = -1;</div><div><span style="white-space:pre-wrap">                </span>goto err;<span style="white-space:pre-wrap">               </span></div><div><span style="white-space:pre-wrap"> </span>}</div><div><br></div><div><span style="white-space:pre-wrap">       </span>len = i2d_X509(x509, NULL); </div><div><span style="white-space:pre-wrap">    </span>if (len <= 0)</div><div><span style="white-space:pre-wrap"> </span>{</div><div><span style="white-space:pre-wrap">                </span>printf("i2d_X509 read x509 cert length error! \n");</div><div><span style="white-space:pre-wrap">            </span>ret = -1;</div><div><span style="white-space:pre-wrap">                </span>goto err;</div><div><span style="white-space:pre-wrap">        </span>}</div><div><br></div><div><span style="white-space:pre-wrap">       </span>if(len > *outLen)</div><div><span style="white-space:pre-wrap">     </span>{</div><div><span style="white-space:pre-wrap">                </span>printf("the out buff length is not enough for the x509 cert error! \n");</div><div><span style="white-space:pre-wrap">               </span>ret = -1;</div><div><span style="white-space:pre-wrap">                </span>goto err;<span style="white-space:pre-wrap">               </span></div><div><span style="white-space:pre-wrap"> </span>}</div><div><br></div><div><span style="white-space:pre-wrap">       </span>der_cert_buff = (unsigned char *)malloc(len);</div><div><span style="white-space:pre-wrap">    </span>if(der_cert_buff == NULL)</div><div><span style="white-space:pre-wrap">        </span>{</div><div><span style="white-space:pre-wrap">                </span>printf("alloc mem error! \n");</div><div><span style="white-space:pre-wrap">         </span>ret = -1;</div><div><span style="white-space:pre-wrap">                </span>goto err;<span style="white-space:pre-wrap">               </span></div><div><span style="white-space:pre-wrap"> </span>}</div><div><br></div><div><span style="white-space:pre-wrap">       </span>memset(der_cert_buff, 0, len);</div><div><span style="white-space:pre-wrap">   </span>len = i2d_X509(x509, &der_cert_buff);   //????</div><div><span style="white-space:pre-wrap">      </span>if (len <= 0)</div><div><span style="white-space:pre-wrap"> </span>{</div><div><span style="white-space:pre-wrap">                </span>printf("i2d_X509 read x509 cert error! \n");</div><div><span style="white-space:pre-wrap">           </span>ret = -1;</div><div><span style="white-space:pre-wrap">                </span>goto err;</div><div><span style="white-space:pre-wrap">        </span>}<span style="white-space:pre-wrap">       </span></div><div><span style="white-space:pre-wrap"> </span>//debug</div><div><span style="white-space:pre-wrap">  </span>printf("der file len: %d bytes \n", len);</div><div><br></div><div><span style="white-space:pre-wrap">     </span>memcpy(out, der_cert_buff, len);</div><div><span style="white-space:pre-wrap"> </span>*outLen = len;</div><div><span style="white-space:pre-wrap">   </span>ret = 0;</div><div><br></div><div>err: </div><div><span style="white-space:pre-wrap">   </span>//  Does der_cert_buff need free manually? when i  free manually, it will collapse. I donot know why. It always free manually when you use **poiter?</div><div>/*<br></div><div><span style="white-space:pre-wrap">        </span>if (der_cert_buff != NULL)</div><div><span style="white-space:pre-wrap">               </span>free(der_cert_buff);</div><div>*/</div><div><span style="white-space:pre-wrap">    </span>if (bio_in != NULL)</div><div><span style="white-space:pre-wrap">              </span>BIO_free(bio_in); </div><div><span style="white-space:pre-wrap">      </span>if (x509 != NULL)</div><div><span style="white-space:pre-wrap">                </span>X509_free(x509);</div><div><br></div><div>    return ret;</div><div>}</div></div><div><br></div><div>Question:</div><div>1. Am i right? when i debug this program i always wrong... I cannot find out the reason. </div><div>2.  In the funtion i2d_X509(x509, &der_cert_buff), Does der_cert_buff  need to be </div><div>free manually? when i free ,it would collapse -:(</div><div>thanks.</div><div><br></div><div>BTWa: I wrote a test c code bellow:</div><div><div>// test for buf_cert_convert_pem_to_der</div><div>#define PEM_CERT_FILE "test_cert.pem"</div><div>#define DER_CERT_FILE "test_cert.der"</div><div>int test5()</div><div>{</div><div><span style="white-space:pre-wrap">  </span>int inLen = 0, outLen = DATA_BUFF_LEN;</div><div><span style="white-space:pre-wrap">   </span>unsigned char in[DATA_BUFF_LEN], out[DATA_BUFF_LEN];</div><div><span style="white-space:pre-wrap">     </span>FILE *pem_f = NULL, *der_f = NULL;</div><div><span style="white-space:pre-wrap">       </span>unsigned long fileLen = 0;</div><div><span style="white-space:pre-wrap">       </span>int ret = 0;</div><div><br></div><div><span style="white-space:pre-wrap">    </span>fileLen = get_file_size(PEM_CERT_FILE);</div><div><span style="white-space:pre-wrap">  </span>if(fileLen < 0)</div><div><span style="white-space:pre-wrap">       </span>{</div><div><span style="white-space:pre-wrap">                </span>printf("get pem file length error\n");</div><div><span style="white-space:pre-wrap">         </span>ret = -1;</div><div><span style="white-space:pre-wrap">                </span>goto err;</div><div><span style="white-space:pre-wrap">        </span>}</div><div><br></div><div><span style="white-space:pre-wrap">       </span>if((pem_f = fopen(PEM_CERT_FILE, "r")) == NULL)</div><div>    {</div><div>        printf("open pem file error! \n");</div><div>        ret = -1;</div><div>        goto err;</div><div>    }</div><div><br></div><div>    memset(in, 0, DATA_BUFF_LEN);</div><div>    do</div><div>    {</div><div>   <span style="white-space:pre-wrap">                </span>ret = fread(in, DATA_BUFF_LEN, 1, pem_f); <span style="white-space:pre-wrap">      </span></div><div>    }while(ret > 0);</div><div><br></div><div><span style="white-space:pre-wrap">        </span>if(ret < 0)</div><div><span style="white-space:pre-wrap">   </span>{</div><div><span style="white-space:pre-wrap">                </span>printf("read pem file error\n");</div><div><span style="white-space:pre-wrap">               </span>ret = -1;</div><div><span style="white-space:pre-wrap">                </span>goto err;</div><div><span style="white-space:pre-wrap">        </span>}</div><div><span style="white-space:pre-wrap">        </span>ret = 0;</div><div><br></div><div><span style="white-space:pre-wrap">        </span>memset(out, 0, DATA_BUFF_LEN);</div><div><span style="white-space:pre-wrap">   </span>ret = buf_cert_convert_pem_to_der(in, fileLen, out, &outLen);</div><div><span style="white-space:pre-wrap">        </span>if(ret != 0)</div><div><span style="white-space:pre-wrap">     </span>{</div><div><span style="white-space:pre-wrap">                </span>printf("buf_cert_convert_pem_to_der error\n");</div><div><span style="white-space:pre-wrap">         </span>ret = -1;</div><div><span style="white-space:pre-wrap">                </span>goto err;</div><div><span style="white-space:pre-wrap">        </span>}</div><div><br></div><div><span style="white-space:pre-wrap">       </span>if((der_f = fopen(DER_CERT_FILE, "wb+")) == NULL)</div><div>    {</div><div>        printf("open der file error! \n");</div><div>        ret = -1;</div><div>        goto err;</div><div>    }</div><div><br></div><div>    ret = fwrite(out, outLen, 1, der_f);</div><div><span style="white-space:pre-wrap"> </span>if(ret <= 0)</div><div><span style="white-space:pre-wrap">  </span>{</div><div><span style="white-space:pre-wrap">                </span>printf("write der file error \n");</div><div><span style="white-space:pre-wrap">             </span>ret = -1;</div><div><span style="white-space:pre-wrap">                </span>goto err;</div><div><span style="white-space:pre-wrap">        </span>}</div><div><span style="white-space:pre-wrap">        </span>ret = 0;</div><div><br></div><div><span style="white-space:pre-wrap">        </span>printf("buf_cert_convert_pem_to_der ok! \n");<span style="white-space:pre-wrap"> </span></div><div><br></div><div>err:</div><div><span style="white-space:pre-wrap">     </span>if(der_f != NULL)</div><div><span style="white-space:pre-wrap">                </span>fclose(der_f);</div><div><span style="white-space:pre-wrap">   </span>if(pem_f != NULL)</div><div><span style="white-space:pre-wrap">                </span>fclose(pem_f);<span style="white-space:pre-wrap">  </span></div><div><span style="white-space:pre-wrap"> </span>return ret;</div><div>}</div></div><div><br></div></div>
</blockquote></div><br></div>