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