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

wmixvideo / nfe / #6290

19 Apr 2016 08:37PM UTC coverage: 80.934% (+2.4%) from 78.549%
#6290

push

travis-ci

fincatto
Corrigido testes.

4470 of 5523 relevant lines covered (80.93%)

52.06 hits per line

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

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

3
import java.io.ByteArrayOutputStream;
4
import java.io.FileInputStream;
5
import java.io.IOException;
6
import java.io.InputStream;
7
import java.security.KeyStore;
8
import java.security.Provider;
9
import java.security.cert.X509Certificate;
10
import java.util.ArrayList;
11
import java.util.Collections;
12
import java.util.List;
13

14
import javax.xml.crypto.dsig.CanonicalizationMethod;
15
import javax.xml.crypto.dsig.DigestMethod;
16
import javax.xml.crypto.dsig.Reference;
17
import javax.xml.crypto.dsig.SignatureMethod;
18
import javax.xml.crypto.dsig.SignedInfo;
19
import javax.xml.crypto.dsig.Transform;
20
import javax.xml.crypto.dsig.XMLSignature;
21
import javax.xml.crypto.dsig.XMLSignatureFactory;
22
import javax.xml.crypto.dsig.dom.DOMSignContext;
23
import javax.xml.crypto.dsig.dom.DOMValidateContext;
24
import javax.xml.crypto.dsig.keyinfo.KeyInfo;
25
import javax.xml.crypto.dsig.keyinfo.KeyInfoFactory;
26
import javax.xml.crypto.dsig.keyinfo.X509Data;
27
import javax.xml.crypto.dsig.spec.C14NMethodParameterSpec;
28
import javax.xml.crypto.dsig.spec.TransformParameterSpec;
29
import javax.xml.parsers.DocumentBuilderFactory;
30
import javax.xml.transform.OutputKeys;
31
import javax.xml.transform.Transformer;
32
import javax.xml.transform.TransformerException;
33
import javax.xml.transform.TransformerFactory;
34
import javax.xml.transform.TransformerFactoryConfigurationError;
35
import javax.xml.transform.dom.DOMSource;
36
import javax.xml.transform.stream.StreamResult;
37

38
import org.apache.commons.io.Charsets;
39
import org.apache.commons.io.IOUtils;
40
import org.w3c.dom.Document;
41
import org.w3c.dom.Element;
42
import org.w3c.dom.NodeList;
43

44
import com.fincatto.nfe310.NFeConfig;
45

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

51
    public AssinaturaDigital(final NFeConfig config) {
×
52
        this.config = config;
×
53
    }
×
54

55
    public boolean isValida(final InputStream xmlStream) throws Exception {
56
        final DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
×
57
        dbf.setNamespaceAware(true);
×
58

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

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

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

76
        return signatureFactory.unmarshalXMLSignature(validateContext).validate(validateContext);
×
77
    }
78

79
    public String assinarDocumento(final String conteudoXml) throws Exception {
80
        final KeyStore keyStore = KeyStore.getInstance("PKCS12");
×
81
        try (InputStream certificadoStream = new FileInputStream(this.config.getCertificado())) {
×
82
            keyStore.load(certificadoStream, this.config.getCertificadoSenha().toCharArray());
×
83
        }
×
84

85
        final KeyStore.PrivateKeyEntry keyEntry = (KeyStore.PrivateKeyEntry) keyStore.getEntry(keyStore.aliases().nextElement(), new KeyStore.PasswordProtection(this.config.getCertificadoSenha().toCharArray()));
×
86
        final XMLSignatureFactory signatureFactory = XMLSignatureFactory.getInstance("DOM");
×
87

88
        final List<Transform> transforms = new ArrayList<>(2);
×
89
        transforms.add(signatureFactory.newTransform(Transform.ENVELOPED, (TransformParameterSpec) null));
×
90
        transforms.add(signatureFactory.newTransform(AssinaturaDigital.C14N_TRANSFORM_METHOD, (TransformParameterSpec) null));
×
91

92
        final KeyInfoFactory keyInfoFactory = signatureFactory.getKeyInfoFactory();
×
93
        final X509Data x509Data = keyInfoFactory.newX509Data(Collections.singletonList((X509Certificate) keyEntry.getCertificate()));
×
94
        final KeyInfo keyInfo = keyInfoFactory.newKeyInfo(Collections.singletonList(x509Data));
×
95

96
        final DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance();
×
97
        documentBuilderFactory.setNamespaceAware(true);
×
98

99
        final Document document = documentBuilderFactory.newDocumentBuilder().parse(IOUtils.toInputStream(conteudoXml));
×
100

101
        for (final String elementoAssinavel : AssinaturaDigital.ELEMENTOS_ASSINAVEIS) {
×
102
            final NodeList elements = document.getElementsByTagName(elementoAssinavel);
×
103
            for (int i = 0; i < elements.getLength(); i++) {
×
104
                final Element element = (Element) elements.item(i);
×
105
                final String id = element.getAttribute("Id");
×
106
                element.setIdAttribute("Id", true);
×
107

108
                final Reference reference = signatureFactory.newReference("#" + id, signatureFactory.newDigestMethod(DigestMethod.SHA1, null), transforms, null, null);
×
109
                final SignedInfo signedInfo = signatureFactory.newSignedInfo(signatureFactory.newCanonicalizationMethod(CanonicalizationMethod.INCLUSIVE, (C14NMethodParameterSpec) null), signatureFactory.newSignatureMethod(SignatureMethod.RSA_SHA1, null), Collections.singletonList(reference));
×
110

111
                final XMLSignature signature = signatureFactory.newXMLSignature(signedInfo, keyInfo);
×
112
                signature.sign(new DOMSignContext(keyEntry.getPrivateKey(), element.getParentNode()));
×
113
            }
114
        }
115
        return this.converteDocumentParaXml(document);
×
116
    }
117

118
    private String converteDocumentParaXml(final Document document) throws TransformerFactoryConfigurationError, TransformerException, IOException {
119
        try (ByteArrayOutputStream outputStream = new ByteArrayOutputStream()) {
×
120
            final Transformer transformer = TransformerFactory.newInstance().newTransformer();
×
121
            transformer.setOutputProperty(OutputKeys.OMIT_XML_DECLARATION, "yes");
×
122
            transformer.transform(new DOMSource(document), new StreamResult(outputStream));
×
123
            return outputStream.toString(Charsets.UTF_8.name());
×
124
        }
×
125
    }
126
}
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

© 2026 Coveralls, Inc