[xmlsec] Access violation on xmlSecDSigCtxDestroy when loading a PKCS#12 certificate using mscrypto

Aleksey Sanin aleksey at aleksey.com
Fri May 23 09:34:29 PDT 2008


Thank you for reporting this problem! I fixed it in the svn but I am
also attaching a patch that you can apply directly.

Thanks again!
Aleksey

Satoshi Ito wrote:
> Hello,
> 
> I am encountering an access violation in xmlSecDSigCtxDestroy when I 
> load a key from a PKCS#12 certificate using mscrypto. The issue seems to 
> be that the certificate context is freed twice in xmlSecKeyEmpty (once 
> through xmlSecKeyDataDestroy(key->value), and again through 
> xmlSecPtrListDestroy(key->dataList)). To reproduce, it seems to be 
> sufficient to simply create an xmlSecDSigCtx [xmlSecDSigCtxPtr dsigCtx = 
> xmlSecDSigCtxCreate(NULL)], load the key in the PKCS#12 certificate 
> [dsigCtx->signKey = xmlSecCryptoAppKeyLoad(___, 
> xmlSecKeyDataFormatPkcs12, ___, NULL, NULL)], and then destroy the 
> context immediately [xmlSecDSigCtxDestroy(dsigCtx)]. The signing itself 
> works if the signing code is uncommented and the call to 
> xmlSecDSigCtxDestroy is commented out (and can be verified). What could 
> I be doing wrong? (Apologies in advance if I am missing an obvious and 
> essential step; I am quite new to this, so please be patient with me).
> 
>  
> 
> Sincerely,
> 
> Satoshi Ito
> 
> 
> ------------------------------------------------------------------------
> 
> _______________________________________________
> xmlsec mailing list
> xmlsec at aleksey.com
> http://www.aleksey.com/mailman/listinfo/xmlsec
-------------- next part --------------
Index: src/mscrypto/app.c
===================================================================
--- src/mscrypto/app.c	(revision 988)
+++ src/mscrypto/app.c	(working copy)
@@ -648,7 +648,18 @@
 
 	/* Find the certificate that has the private key */
 	if((TRUE == CertGetCertificateContextProperty(pCert, CERT_KEY_SPEC_PROP_ID, &dwData, &dwDataLen)) && (dwData > 0)) {
-	    keyData = xmlSecMSCryptoCertAdopt(pCert, xmlSecKeyDataTypePrivate | xmlSecKeyDataTypePublic);
+	    tmpcert = CertDuplicateCertificateContext(pCert);
+	    if(tmpcert == NULL) {
+		xmlSecError(XMLSEC_ERRORS_HERE,
+			    NULL,
+			    "CertDuplicateCertificateContext",
+			    XMLSEC_ERRORS_R_CRYPTO_FAILED,
+			    "data=%s",
+			    xmlSecErrorsSafeString(xmlSecKeyDataGetName(x509Data)));
+		goto done;
+	    }
+
+	    keyData = xmlSecMSCryptoCertAdopt(tmpcert, xmlSecKeyDataTypePrivate | xmlSecKeyDataTypePublic);
 	    if(keyData == NULL) {
 		xmlSecError(XMLSEC_ERRORS_HERE,
 			    NULL,
@@ -657,6 +668,7 @@
 			    XMLSEC_ERRORS_NO_MESSAGE);
 		goto done;
 	    }
+        tmpcert = NULL;
 	
 	    tmpcert = CertDuplicateCertificateContext(pCert);
 	    if(tmpcert == NULL) {


More information about the xmlsec mailing list