• Home
  • Features
  • Pricing
  • Docs
  • Announcements
  • Sign In

wmixvideo / nfe / #6985

02 Jun 2016 11:49PM UTC coverage: 79.364% (+3.7%) from 75.706%
#6985

push

travis-ci

fincatto
Atualizado xsd de validacao de envio de lote, que valida as notas com assinatura.
Atualizado para versão 2.0.0-SNAPSHOT, pois o codigo quebrou a compatibilidade.

0 of 1 new or added line in 1 file covered. (0.0%)

349 existing lines in 68 files now uncovered.

4742 of 5975 relevant lines covered (79.36%)

50.29 hits per line

Source File
Press 'n' to go to next uncovered line, 'b' for previous

72.0
/src/main/java/com/fincatto/nfe310/assinatura/AssinaturaDigital.java
1
package com.fincatto.nfe310.assinatura;
2

3
import com.fincatto.nfe310.NFeConfig;
4
import org.w3c.dom.Document;
5
import org.w3c.dom.Element;
6
import org.w3c.dom.NodeList;
7
import org.xml.sax.InputSource;
8

9
import javax.xml.crypto.dsig.CanonicalizationMethod;
10
import javax.xml.crypto.dsig.DigestMethod;
11
import javax.xml.crypto.dsig.Reference;
12
import javax.xml.crypto.dsig.SignatureMethod;
13
import javax.xml.crypto.dsig.SignedInfo;
14
import javax.xml.crypto.dsig.Transform;
15
import javax.xml.crypto.dsig.XMLSignature;
16
import javax.xml.crypto.dsig.XMLSignatureFactory;
17
import javax.xml.crypto.dsig.dom.DOMSignContext;
18
import javax.xml.crypto.dsig.dom.DOMValidateContext;
19
import javax.xml.crypto.dsig.keyinfo.KeyInfo;
20
import javax.xml.crypto.dsig.keyinfo.KeyInfoFactory;
21
import javax.xml.crypto.dsig.keyinfo.X509Data;
22
import javax.xml.crypto.dsig.spec.C14NMethodParameterSpec;
23
import javax.xml.crypto.dsig.spec.TransformParameterSpec;
24
import javax.xml.parsers.DocumentBuilderFactory;
25
import javax.xml.transform.OutputKeys;
26
import javax.xml.transform.Transformer;
27
import javax.xml.transform.TransformerException;
28
import javax.xml.transform.TransformerFactory;
29
import javax.xml.transform.TransformerFactoryConfigurationError;
30
import javax.xml.transform.dom.DOMSource;
31
import javax.xml.transform.stream.StreamResult;
32
import java.io.ByteArrayOutputStream;
33
import java.io.IOException;
34
import java.io.InputStream;
35
import java.io.StringReader;
36
import java.security.KeyStore;
37
import java.security.Provider;
38
import java.security.cert.X509Certificate;
39
import java.util.ArrayList;
40
import java.util.Collections;
41
import java.util.List;
42

43
public class AssinaturaDigital {
44
    private static final String C14N_TRANSFORM_METHOD = "http://www.w3.org/TR/2001/REC-xml-c14n-20010315";
45
    private static final String[] ELEMENTOS_ASSINAVEIS = new String[]{"infEvento", "infCanc", "infNFe", "infInut"};
1✔
46
    private final NFeConfig config;
47

48
    public AssinaturaDigital(final NFeConfig config) {
2✔
49
        this.config = config;
2✔
50
    }
2✔
51

52
    public boolean isValida(final InputStream xmlStream) throws Exception {
53
        final DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
×
UNCOV
54
        dbf.setNamespaceAware(true);
×
55

56
        final Document document = dbf.newDocumentBuilder().parse(xmlStream);
×
57
        final NodeList nodeList = document.getElementsByTagNameNS(XMLSignature.XMLNS, "Signature");
×
UNCOV
58
        if (nodeList.getLength() == 0) {
×
59
            throw new IllegalStateException("N\u00e3o foi encontrada a assinatura do XML.");
×
60
        }
61

62
        final String providerName = System.getProperty("jsr105Provider", "org.jcp.xml.dsig.internal.dom.XMLDSigRI");
×
UNCOV
63
        final XMLSignatureFactory signatureFactory = XMLSignatureFactory.getInstance("DOM", (Provider) Class.forName(providerName).newInstance());
×
UNCOV
64
        final DOMValidateContext validateContext = new DOMValidateContext(new X509KeySelector(), nodeList.item(0));
×
65

66
        for (final String tag : AssinaturaDigital.ELEMENTOS_ASSINAVEIS) {
×
67
            final NodeList elements = document.getElementsByTagName(tag);
×
UNCOV
68
            if (elements.getLength() > 0) {
×
69
                validateContext.setIdAttributeNS((Element) elements.item(0), null, "Id");
×
70
            }
71
        }
72

UNCOV
73
        return signatureFactory.unmarshalXMLSignature(validateContext).validate(validateContext);
×
74
    }
75

76
    public String assinarDocumento(final String conteudoXml) throws Exception {
77
        final String certificateAlias = config.getCertificadoKeyStore().aliases().nextElement();
2✔
78
        final KeyStore.PasswordProtection passwordProtection = new KeyStore.PasswordProtection(this.config.getCertificadoSenha().toCharArray());
2✔
79
        final KeyStore.PrivateKeyEntry keyEntry = (KeyStore.PrivateKeyEntry) config.getCertificadoKeyStore().getEntry(certificateAlias, passwordProtection);
2✔
80
        final XMLSignatureFactory signatureFactory = XMLSignatureFactory.getInstance("DOM");
2✔
81

82
        final List<Transform> transforms = new ArrayList<>(2);
2✔
83
        transforms.add(signatureFactory.newTransform(Transform.ENVELOPED, (TransformParameterSpec) null));
2✔
84
        transforms.add(signatureFactory.newTransform(AssinaturaDigital.C14N_TRANSFORM_METHOD, (TransformParameterSpec) null));
2✔
85

86
        final KeyInfoFactory keyInfoFactory = signatureFactory.getKeyInfoFactory();
2✔
87
        final X509Data x509Data = keyInfoFactory.newX509Data(Collections.singletonList((X509Certificate) keyEntry.getCertificate()));
2✔
88
        final KeyInfo keyInfo = keyInfoFactory.newKeyInfo(Collections.singletonList(x509Data));
2✔
89

90
        final DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance();
2✔
91
        documentBuilderFactory.setNamespaceAware(true);
2✔
92

93
        try (StringReader stringReader = new StringReader(conteudoXml)) {
2✔
94
            final Document document = documentBuilderFactory.newDocumentBuilder().parse(new InputSource(stringReader));
2✔
95
            for (final String elementoAssinavel : AssinaturaDigital.ELEMENTOS_ASSINAVEIS) {
10✔
96
                final NodeList elements = document.getElementsByTagName(elementoAssinavel);
8✔
97
                for (int i = 0; i < elements.getLength(); i++) {
10✔
98
                    final Element element = (Element) elements.item(i);
2✔
99
                    final String id = element.getAttribute("Id");
2✔
100
                    element.setIdAttribute("Id", true);
2✔
101

102
                    final Reference reference = signatureFactory.newReference("#" + id, signatureFactory.newDigestMethod(DigestMethod.SHA1, null), transforms, null, null);
2✔
103
                    final SignedInfo signedInfo = signatureFactory.newSignedInfo(signatureFactory.newCanonicalizationMethod(CanonicalizationMethod.INCLUSIVE, (C14NMethodParameterSpec) null), signatureFactory.newSignatureMethod(SignatureMethod.RSA_SHA1, null), Collections.singletonList(reference));
2✔
104

105
                    final XMLSignature signature = signatureFactory.newXMLSignature(signedInfo, keyInfo);
2✔
106
                    signature.sign(new DOMSignContext(keyEntry.getPrivateKey(), element.getParentNode()));
2✔
107
                }
108
            }
109
            return this.converteDocumentParaXml(document);
2✔
110
        }
2✔
111
    }
112

113
    private String converteDocumentParaXml(final Document document) throws TransformerFactoryConfigurationError, TransformerException, IOException {
114
        try (ByteArrayOutputStream outputStream = new ByteArrayOutputStream()) {
2✔
115
            final Transformer transformer = TransformerFactory.newInstance().newTransformer();
2✔
116
            transformer.setOutputProperty(OutputKeys.OMIT_XML_DECLARATION, "yes");
2✔
117
            transformer.transform(new DOMSource(document), new StreamResult(outputStream));
2✔
118
            return outputStream.toString("UTF-8");
2✔
119
        }
2✔
120
    }
121
}
STATUS · Troubleshooting · Open an Issue · Sales · Support · CAREERS · ENTERPRISE · START FREE · SCHEDULE DEMO
ANNOUNCEMENTS · TWITTER · TOS & SLA · Supported CI Services · What's a CI service? · Automated Testing

© 2025 Coveralls, Inc