コード例 #1
0
ファイル: gen_xml.c プロジェクト: pablogallardo/livrenfe
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;
}
コード例 #2
0
ファイル: PoleXmlSec.c プロジェクト: MaxMorais/pole
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;
}
コード例 #3
0
ファイル: gen_xml.c プロジェクト: pablogallardo/livrenfe
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;
}