Re: Sign error after sucessfully compilation xmlsec and friends on win32

Aleksey Sanin <[email protected]>
Newsgroups gmane.text.xml.xmlsec
Message-ID <[email protected]>
Try to compile everything with static linking. There is a bug in some
versions of MSVC with duplicating static symbols when dynamic linking is
used

Aleksey

On 10/27/14 6:01 PM, Jano Crema wrote:
> func=xmlSecPtrListCopy:file=..\src\list.c:line=184:obj=unknown:subj=dst->id
> == s
> rc->id:error=100:assertion:
> func=xmlSecDSigReferenceCtxInitialize:file=..\src\xmldsig.c:line=1335:obj=unknow
> n:subj=xmlSecPtrListCopy:error=1:xmlsec library function failed:
> func=xmlSecDSigReferenceCtxCreate:file=..\src\xmldsig.c:line=1269:obj=unknown:su
> bj=xmlSecDSigReferenceCtxInitialize:error=1:xmlsec library function failed:
> func=xmlSecDSigCtxProcessSignedInfoNode:file=..\src\xmldsig.c:line=781:obj=unkno
> wn:subj=xmlSecDSigReferenceCtxCreate:error=1:xmlsec library function failed:
> func=xmlSecDSigCtxProcessSignatureNode:file=..\src\xmldsig.c:line=547:obj=unknow
> n:subj=xmlSecDSigCtxProcessSignedInfoNode:error=1:xmlsec library
> function failed
> :
> func=xmlSecDSigCtxSign:file=..\src\xmldsig.c:line=303:obj=unknown:subj=xmlSecDSi
> gCtxSignatureProcessNode:error=1:xmlsec library function failed:
> Error: signature failed
> 
> XML:
> <?xml version="1.0" encoding="UTF-8"?>
> <programadores>
> <nome>jano</nome>
> </programadores>
> 
> CODE:
> 
> int sign_file(const char* xml_file, const char* key_file, const char*
> cert_file);
> 
> int
> main(int argc, char **argv) {
> #ifndef XMLSEC_NO_XSLT
>     xsltSecurityPrefsPtr xsltSecPrefs = NULL;
> #endif /* XMLSEC_NO_XSLT */
> 
>     assert(argv);
> 
>     if(argc != 4) {
>         fprintf(stderr, "Error: wrong number of arguments.\n");
>         fprintf(stderr, "Usage: %s <xml-file> <key-file> <cert-file>\n",
> argv[0]);
>         return(1);
>     }
> 
>     /* Init libxml and libxslt libraries */
>     xmlInitParser();
>     LIBXML_TEST_VERSION
>     xmlLoadExtDtdDefaultValue = XML_DETECT_IDS | XML_COMPLETE_ATTRS;
>     xmlSubstituteEntitiesDefault(1);
> #ifndef XMLSEC_NO_XSLT
>     xmlIndentTreeOutput = 1;
> #endif /* XMLSEC_NO_XSLT */
> 
>     /* Init libxslt */
> #ifndef XMLSEC_NO_XSLT
>     /* disable everything */
>     xsltSecPrefs = xsltNewSecurityPrefs();
>     xsltSetSecurityPrefs(xsltSecPrefs,  XSLT_SECPREF_READ_FILE,      
>  xsltSecurityForbid);
>     xsltSetSecurityPrefs(xsltSecPrefs,  XSLT_SECPREF_WRITE_FILE,      
> xsltSecurityForbid);
>     xsltSetSecurityPrefs(xsltSecPrefs,  XSLT_SECPREF_CREATE_DIRECTORY,
> xsltSecurityForbid);
>     xsltSetSecurityPrefs(xsltSecPrefs,  XSLT_SECPREF_READ_NETWORK,    
> xsltSecurityForbid);
>     xsltSetSecurityPrefs(xsltSecPrefs,  XSLT_SECPREF_WRITE_NETWORK,  
>  xsltSecurityForbid);
>     xsltSetDefaultSecurityPrefs(xsltSecPrefs);
> #endif /* XMLSEC_NO_XSLT */
> 
>     /* Init xmlsec library */
>     if(xmlSecInit() < 0) {
>         fprintf(stderr, "Error: xmlsec initialization failed.\n");
>         return(-1);
>     }
> 
>     /* Check loaded library version */
>     if(xmlSecCheckVersion() != 1) {
>         fprintf(stderr, "Error: loaded xmlsec library version is not
> compatible.\n");
>         return(-1);
>     }
> 
>     /* Load default crypto engine if we are supporting dynamic
>      * loading for xmlsec-crypto libraries. Use the crypto library
>      * name ("openssl", "nss", etc.) to load corresponding
>      * xmlsec-crypto library.
>      */
> #ifdef XMLSEC_CRYPTO_DYNAMIC_LOADING
>     if(xmlSecCryptoDLLoadLibrary(BAD_CAST XMLSEC_CRYPTO) < 0) {
>         fprintf(stderr, "Error: unable to load default xmlsec-crypto
> library. Make sure\n"
>                         "that you have it installed and check shared
> libraries path\n"
>                         "(LD_LIBRARY_PATH) envornment variable.\n");
>         return(-1);
>     }
> #endif /* XMLSEC_CRYPTO_DYNAMIC_LOADING */
> 
>     /* Init crypto library */
>     if(xmlSecCryptoAppInit(NULL) < 0) {
>         fprintf(stderr, "Error: crypto initialization failed.\n");
>         return(-1);
>     }
> 
>     /* Init xmlsec-crypto library */
>     if(xmlSecCryptoInit() < 0) {
>         fprintf(stderr, "Error: xmlsec-crypto initialization failed.\n");
>         return(-1);
>     }
> 
>     if(sign_file(argv[1], argv[2], argv[3]) < 0) {
>         return(-1);
>     }
> 
>     /* Shutdown xmlsec-crypto library */
>     xmlSecCryptoShutdown();
> 
>     /* Shutdown crypto library */
>     xmlSecCryptoAppShutdown();
> 
>     /* Shutdown xmlsec library */
>     xmlSecShutdown();
> 
>     /* Shutdown libxslt/libxml */
> #ifndef XMLSEC_NO_XSLT
>     xsltFreeSecurityPrefs(xsltSecPrefs);
>     xsltCleanupGlobals();
> #endif /* XMLSEC_NO_XSLT */
>     xmlCleanupParser();
> 
>     return(0);
> }
> 
> /**
>  * sign_file:
>  * @xml_file:           the XML file name.
>  * @key_file:           the PEM private key file name.
>  * @cert_file:          the x509 certificate PEM file.
>  *
>  * Signs the @xml_file using private key from @key_file and dynamicaly
>  * created enveloped signature template. The certificate from @cert_file
>  * is placed in the <dsig:X509Data/> node.
>  *
>  * Returns 0 on success or a negative value if an error occurs.
>  */
> int
> sign_file(const char* xml_file, const char* key_file, const char*
> cert_file) {
>     xmlDocPtr doc = NULL;
>     xmlNodePtr signNode = NULL;
>     xmlNodePtr refNode = NULL;
>     xmlNodePtr keyInfoNode = NULL;
>     xmlSecDSigCtxPtr dsigCtx = NULL;
>     int res = -1;
> 
>     assert(xml_file);
>     assert(key_file);
>     assert(cert_file);
> 
>     /* load doc file */
>     doc = xmlParseFile(xml_file);
>     if ((doc == NULL) || (xmlDocGetRootElement(doc) == NULL)){
>         fprintf(stderr, "Error: unable to parse file \"%s\"\n", xml_file);
>         goto done;
>     }
> 
>     /* create signature template for RSA-SHA1 enveloped signature */
>     signNode = xmlSecTmplSignatureCreate(doc, xmlSecTransformExclC14NId,
>                                          xmlSecTransformRsaSha1Id, NULL);
>     if(signNode == NULL) {
>         fprintf(stderr, "Error: failed to create signature template\n");
>         goto done;
>     }
> 
>     /* add <dsig:Signature/> node to the doc */
>     xmlAddChild(xmlDocGetRootElement(doc), signNode);
> 
>     /* add reference */
>     refNode = xmlSecTmplSignatureAddReference(signNode,
> xmlSecTransformSha1Id,
>                                         NULL, NULL, NULL);
>     if(refNode == NULL) {
>         fprintf(stderr, "Error: failed to add reference to signature
> template\n");
>         goto done;
>     }
> 
>     /* add enveloped transform */
>     if(xmlSecTmplReferenceAddTransform(refNode,
> xmlSecTransformEnvelopedId) == NULL) {
>         fprintf(stderr, "Error: failed to add enveloped transform to
> reference\n");
>         goto done;
>     }
> 
>     /* add <dsig:KeyInfo/> and <dsig:X509Data/> */
>     keyInfoNode = xmlSecTmplSignatureEnsureKeyInfo(signNode, NULL);
>     if(keyInfoNode == NULL) {
>         fprintf(stderr, "Error: failed to add key info\n");
>         goto done;
>     }
> 
>     if(xmlSecTmplKeyInfoAddX509Data(keyInfoNode) == NULL) {
>         fprintf(stderr, "Error: failed to add X509Data node\n");
>         goto done;
>     }
> 
>     /* create signature context, we don't need keys manager in this
> example */
>     dsigCtx = xmlSecDSigCtxCreate(NULL);
>     if(dsigCtx == NULL) {
>         fprintf(stderr,"Error: failed to create signature context\n");
>         goto done;
>     }
> 
>     /* load private key, assuming that there is not password */
>     dsigCtx->signKey = xmlSecCryptoAppKeyLoad(key_file,
> xmlSecKeyDataFormatPem, NULL, NULL, NULL);
>     if(dsigCtx->signKey == NULL) {
>         fprintf(stderr,"Error: failed to load private pem key from
> \"%s\"\n", key_file);
>         goto done;
>     }
> 
>     /* load certificate and add to the key */
>     if(xmlSecCryptoAppKeyCertLoad(dsigCtx->signKey, cert_file,
> xmlSecKeyDataFormatPem) < 0) {
>         fprintf(stderr,"Error: failed to load pem certificate \"%s\"\n",
> cert_file);
>         goto done;
>     }
> 
>     /* set key name to the file name, this is just an example! */
>     if(xmlSecKeySetName(dsigCtx->signKey, key_file) < 0) {
>         fprintf(stderr,"Error: failed to set key name for key from
> \"%s\"\n", key_file);
>         goto done;
>     }
> 
>     /* sign the template */
>     if(xmlSecDSigCtxSign(dsigCtx, signNode) < 0) {
>         fprintf(stderr,"Error: signature failed\n");
>         goto done;
>     }
> 
>     /* print signed document to stdout */
>     const char* fname = "jano.xml";
>     xmlSaveFile(fname,doc);
>     //xmlDocDump(stdout, doc);
> 
>     /* success */
>     res = 0;
> 
> done:
>     /* cleanup */
>     if(dsigCtx != NULL) {
>         xmlSecDSigCtxDestroy(dsigCtx);
>     }
> 
>     if(doc != NULL) {
>         xmlFreeDoc(doc);
>     }
>     return(res);
> }
> 
> 
> 
> _______________________________________________
> xmlsec mailing list
> [email protected]
> http://www.aleksey.com/mailman/listinfo/xmlsec
> 
_______________________________________________
xmlsec mailing list
[email protected]
http://www.aleksey.com/mailman/listinfo/xmlsec
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.