<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<HTML><HEAD>
<META http-equiv=Content-Type content="text/html; charset=iso-8859-1">
<META content="MSHTML 6.00.2800.1106" name=GENERATOR>
<STYLE></STYLE>
</HEAD>
<BODY bgColor=#ffffff>
<DIV><FONT face=Courier size=2>Hi!<BR></FONT></DIV>
<DIV><FONT face=Courier size=2>I seem to have found a solution&nbsp;to my 
problem.</FONT></DIV>
<DIV><FONT face=Courier size=2></FONT>&nbsp;</DIV>
<DIV><FONT face=Courier size=2>I wanted to use a X509 pem certificate to 
validate a signature but I did not</FONT></DIV>
<DIV><FONT face=Courier><FONT size=2>find a straightforward solution to load a 
public key from a certificate.</FONT></FONT></DIV>
<DIV><FONT face=Courier><FONT size=2>I have struggled a bit to work this out but 
</FONT></FONT><FONT face=Courier><FONT size=2>it turned out wasn't so bad 
afterall. </FONT></FONT></DIV>
<DIV><FONT face=Courier><FONT size=2>Since I could not load a PEM certificate 
directly I have to </FONT></FONT><FONT face=Courier><FONT size=2>get the (in my 
case) </FONT></FONT></DIV>
<DIV><FONT face=Courier><FONT size=2>RSA public key from the certificate and 
turn it into a xmlSecKeyPtr.</FONT></FONT></DIV>
<DIV><FONT face=Courier><FONT size=2></FONT></FONT>&nbsp;</DIV>
<DIV><FONT face=Courier><FONT size=2>Here is&nbsp;my function which does that 
and returns an xmlSecKeyPtr:</FONT></FONT></DIV>
<DIV><FONT face=Courier size=2></FONT>&nbsp;</DIV>
<DIV><FONT face=Courier size=2></FONT>&nbsp;</DIV>
<DIV><FONT face=Courier size=2>static xmlSecKeyPtr 
ReadPublicKeyFromPemCert(const char* certFile){<BR>&nbsp;xmlSecKeyPtr retval = 
NULL; </FONT></DIV>
<DIV><FONT face=Courier size=2></FONT>&nbsp;</DIV>
<DIV><FONT face=Courier size=2>&nbsp;// Load certificate from 
file<BR>&nbsp;FILE* fid = fopen(certFile, "r");<BR>&nbsp;X509* pCert = 
PEM_read_X509(fid, NULL, NULL, NULL);<BR>&nbsp;fclose(fid);</FONT></DIV>
<DIV><FONT face=Courier size=2></FONT>&nbsp;</DIV>
<DIV><FONT face=Courier size=2>&nbsp;// Get the public key from the 
certificate<BR>&nbsp;EVP_PKEY *pPublicKey = X509_get_pubkey(pCert);</FONT></DIV>
<DIV><FONT face=Courier size=2></FONT>&nbsp;</DIV>
<DIV><FONT face=Courier 
size=2>&nbsp;if(!pPublicKey){<BR>&nbsp;&nbsp;printf("Failed to get public key 
from cert\n");<BR>&nbsp;<BR>&nbsp;&nbsp;return NULL;<BR>&nbsp;}</FONT></DIV>
<DIV><FONT face=Courier size=2></FONT>&nbsp;</DIV>
<DIV><FONT face=Courier size=2>&nbsp;// I only handle RSA 
keys<BR>&nbsp;if(pPublicKey-&gt;type == EVP_PKEY_RSA){<BR>&nbsp;&nbsp;retval = 
xmlSecKeyCreate(xmlSecRsaKey, 
xmlSecKeyOriginX509);<BR>&nbsp;&nbsp;if(xmlSecRsaKeyGenerate(retval, 
pPublicKey-&gt;pkey.rsa) &lt; 0){<BR>&nbsp;&nbsp;&nbsp;printf("Failed to 
generate public key from RSA 
key\n");<BR>&nbsp;&nbsp;&nbsp;xmlSecKeyDestroy(retval);<BR>&nbsp;&nbsp;&nbsp;EVP_PKEY_free(pPublicKey);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;return 
NULL;<BR>&nbsp;&nbsp;}<BR>&nbsp;&nbsp;EVP_PKEY_free(pPublicKey);</FONT></DIV>
<DIV><FONT face=Courier size=2></FONT>&nbsp;</DIV>
<DIV><FONT face=Courier size=2>&nbsp;&nbsp;return 
retval;<BR>&nbsp;}</FONT></DIV>
<DIV><FONT face=Courier size=2></FONT>&nbsp;</DIV>
<DIV><FONT face=Courier size=2>&nbsp;EVP_PKEY_free(pPublicKey);</FONT></DIV>
<DIV><FONT face=Courier size=2></FONT>&nbsp;</DIV>
<DIV><FONT face=Courier size=2>&nbsp;printf("Unknown public key type in 
cert");<BR>&nbsp;<BR>&nbsp;return NULL;<BR>}<BR></FONT></DIV>
<DIV><FONT face=Courier size=2></FONT><FONT face=Courier><FONT 
size=2></FONT>&nbsp;</DIV></FONT>
<DIV><FONT face=Courier size=2></FONT>&nbsp;</DIV>
<DIV><FONT face=Courier size=2>I then use this public key together with 
</FONT><FONT face=Courier size=2>xmlSecDSigValidate and it seems to work 
Ok.</FONT></DIV>
<DIV><FONT face=Courier size=2></FONT>&nbsp;</DIV>
<DIV><FONT face=Courier size=2>Please comment if you see something bad about 
this.</FONT></DIV>
<DIV><FONT face=Courier size=2></FONT>&nbsp;</DIV>
<DIV><FONT face=Courier size=2>Thanks for all help!</FONT></DIV></BODY></HTML>