package es.uji.security.crypto.facturae; import java.io.ByteArrayInputStream; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import org.w3c.dom.Document; import org.w3c.dom.NodeList; import es.uji.security.crypto.ISignFormatProvider; import es.uji.security.crypto.SignatureOptions; import es.uji.security.crypto.SignatureResult; import es.uji.security.crypto.config.OS; import es.uji.security.crypto.jxades.JXAdESSignatureFactory; public class FacturaeSignatureFactory implements ISignFormatProvider { public SignatureResult formatSignature(SignatureOptions signatureOptions) throws Exception { byte[] data = OS.inputStreamToByteArray(signatureOptions.getDataToSign()); // Check if input data is already signed DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance(); documentBuilderFactory.setNamespaceAware(true); DocumentBuilder documentBuilder = documentBuilderFactory.newDocumentBuilder(); Document document = documentBuilder.parse(new ByteArrayInputStream(data)); NodeList result = document.getElementsByTagNameNS("http://www.w3.org/2000/09/xmldsig#", "Signature"); int numSignatures = result.getLength(); if (numSignatures > 0) { SignatureResult signatureResult = new SignatureResult(); signatureResult.setValid(false); signatureResult.addError("CoSign for Facturae not supported"); return signatureResult; } // Call jXAdES format signature signatureOptions.setCoSignEnabled(false); signatureOptions .setPolicyIdentifier("http://www.facturae.es/politica_de_firma_formato_facturae/politica_de_firma_formato_facturae_v3_1.pdf"); signatureOptions .setPolicyDescription("Pol\u00edtica de firma electr\u00f3nica para facturaci\u00f3n electr\u00f3nica con formato Facturae"); /*signatureOptions .setPolicyDescription("facturae31");*/ signatureOptions.setDataToSign(new ByteArrayInputStream(data)); JXAdESSignatureFactory signatureFactory = new JXAdESSignatureFactory(); return signatureFactory.formatSignature(signatureOptions); } }