char *generate_xml(NFE *nfe, EVP_PKEY *key, X509 *cert) { int rc; xmlTextWriterPtr writer; xmlDocPtr doc; xmlBufferPtr buf = xmlBufferCreate(); writer = xmlNewTextWriterDoc(&doc, 0); if (writer == NULL) return NULL; xmlTextWriterStartDocument(writer, NULL, "UTF-8", NULL); rc = gen_inf_nfe(writer, nfe); if (rc < 0) return NULL; xmlTextWriterEndDocument(writer); char *URI = malloc(sizeof(char) * (strlen(nfe->idnfe->chave) + strlen(ID_PREFIX) + 2)); strcpy(URI, "#"); strcat(URI, ID_PREFIX); strcat(URI, nfe->idnfe->chave); rc = sign_xml(doc, key, cert, URI); if(rc) return NULL; xmlNodeDump(buf, NULL, xmlDocGetRootElement(doc), 0, 0); nfe->xml = strdup((char*)buf->content); return (char*)buf->content; }
static PyObject * PoleXmlSec_sign(PyObject *self, PyObject *args) { const char *xml, *key, *certificate, *id_attr_name, *id_node_name; PyObject* result; if (!PyArg_ParseTuple(args, "sssss", &xml, &key, &certificate, &id_attr_name, &id_node_name)) return NULL; result = Py_BuildValue("s", xml); /* 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 xmlsec library */ if(xmlSecInit() < 0) { fprintf(stderr, "XmlSecError: xmlsec initialization failed.\n"); return result; } /* Check loaded library version */ if(xmlSecCheckVersion() != 1) { fprintf(stderr, "XmlSecError: loaded xmlsec library version is not compatible.\n"); return result; } /* 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, "XmlSecError: 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 result; } #endif /* XMLSEC_CRYPTO_DYNAMIC_LOADING */ /* Init crypto library */ if(xmlSecCryptoAppInit(NULL) < 0) { fprintf(stderr, "XmlSecError: crypto initialization failed.\n"); return result; } /* Init xmlsec-crypto library */ if(xmlSecCryptoInit() < 0) { fprintf(stderr, "XmlSecError: xmlsec-crypto initialization failed.\n"); return result; } result = sign_xml(xml, key, certificate, id_attr_name, id_node_name); /* Shutdown xmlsec-crypto library */ xmlSecCryptoShutdown(); /* Shutdown xmlsec library */ xmlSecShutdown(); /* Shutdown crypto library */ /* Se executar essa linha dá erro na conexão HTTPS */ // xmlSecCryptoAppShutdown(); /* Shutdown libxslt/libxml/libxmlsec1 */ #ifndef XMLSEC_NO_XSLT xsltCleanupGlobals(); #endif /* XMLSEC_NO_XSLT */ xmlCleanupParser(); return result; }
char *generate_evento_xml(EVENTO *e, EVP_PKEY *key, X509 *cert) { int rc; xmlTextWriterPtr writer; xmlDocPtr doc; xmlBufferPtr buf = xmlBufferCreate(); NFE *nfe = e->nfe; writer = xmlNewTextWriterDoc(&doc, 0); if (writer == NULL) return NULL; xmlTextWriterStartDocument(writer, NULL, "UTF-8", NULL); rc = xmlTextWriterStartElement(writer, BAD_CAST "evento"); if (rc < 0) return NULL; rc = xmlTextWriterWriteAttribute(writer, BAD_CAST "xmlns", BAD_CAST "http://www.portalfiscal.inf.br/nfe"); if (rc < 0) return NULL; rc = xmlTextWriterWriteAttribute(writer, BAD_CAST "versao", BAD_CAST "1.00"); if (rc < 0) return NULL; rc = xmlTextWriterStartElement(writer, BAD_CAST "infEvento"); if (rc < 0) return NULL; char id[70]; sprintf(id, "ID%d%s%02d", e->type, nfe->idnfe->chave, e->seq); rc = xmlTextWriterWriteAttribute(writer, BAD_CAST "Id", BAD_CAST id); if (rc < 0) return NULL; rc = xmlTextWriterWriteFormatElement(writer, BAD_CAST "cOrgao", "%d", nfe->idnfe->municipio->uf->cUF); if (rc < 0) return NULL; rc = xmlTextWriterWriteFormatElement(writer, BAD_CAST "tpAmb", "%d", nfe->idnfe->tipo_ambiente); if (rc < 0) return NULL; rc = xmlTextWriterWriteFormatElement(writer, BAD_CAST "CNPJ", "%s", nfe->emitente->cnpj); if (rc < 0) return NULL; rc = xmlTextWriterWriteFormatElement(writer, BAD_CAST "chNFe", "%s", nfe->idnfe->chave); if (rc < 0) return NULL; time_t now; char buffer[26]; struct tm *tm_info; time(&now); tm_info = localtime(&(now)); strftime(buffer, 26, "%Y-%m-%dT%H:%M:%S-03:00", tm_info); rc = xmlTextWriterWriteFormatElement(writer, BAD_CAST "dhEvento", "%s", buffer); if (rc < 0) return NULL; rc = xmlTextWriterWriteFormatElement(writer, BAD_CAST "tpEvento", "%d", e->type); if (rc < 0) return NULL; rc = xmlTextWriterWriteFormatElement(writer, BAD_CAST "nSeqEvento", "%d", e->seq); if (rc < 0) return NULL; rc = xmlTextWriterWriteFormatElement(writer, BAD_CAST "verEvento", "%s", "1.00"); if (rc < 0) return NULL; rc = xmlTextWriterStartElement(writer, BAD_CAST "detEvento"); if (rc < 0) return NULL; rc = xmlTextWriterWriteAttribute(writer, BAD_CAST "versao", BAD_CAST "1.00"); if (rc < 0) return NULL; switch(e->type){ case CANCELAMENTO_TYPE: { EVENTO_CANCELAMENTO *ec; ec = (EVENTO_CANCELAMENTO *) e; rc = xmlTextWriterWriteFormatElement(writer, BAD_CAST "descEvento", "%s", "Cancelamento"); if (rc < 0) return NULL; rc = xmlTextWriterWriteFormatElement(writer, BAD_CAST "nProt", "%s", nfe->protocolo->numero); if (rc < 0) return NULL; rc = xmlTextWriterWriteFormatElement(writer, BAD_CAST "xJust", "%s", ec->justificativa); if (rc < 0) return NULL; break; } } rc = xmlTextWriterEndElement(writer); if (rc < 0) return NULL; rc = xmlTextWriterEndElement(writer); if (rc < 0) return NULL; rc = xmlTextWriterEndElement(writer); if (rc < 0) return NULL; xmlTextWriterEndDocument(writer); char *URI = malloc(sizeof(char) * 70); strcpy(URI, "#"); strcat(URI, id); sign_xml(doc, key, cert, URI); xmlNodeDump(buf, NULL, xmlDocGetRootElement(doc), 0, 0); return (char*)buf->content; }