Java tutorial
/** * LICENCIA LGPL: * * Esta librera es Software Libre; Usted puede redistribuirlo y/o modificarlo * bajo los trminos de la GNU Lesser General Public License (LGPL) * tal y como ha sido publicada por la Free Software Foundation; o * bien la versin 2.1 de la Licencia, o (a su eleccin) cualquier versin posterior. * * Esta librera se distribuye con la esperanza de que sea til, pero SIN NINGUNA * GARANT?A; tampoco las implcitas garantas de MERCANTILIDAD o ADECUACIN A UN * PROPSITO PARTICULAR. Consulte la GNU Lesser General Public License (LGPL) para ms * detalles * * Usted debe recibir una copia de la GNU Lesser General Public License (LGPL) * junto con esta librera; si no es as, escriba a la Free Software Foundation Inc. * 51 Franklin Street, 5 Piso, Boston, MA 02110-1301, USA. * */ package es.mityc.firmaJava.policy; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.w3c.dom.Element; import es.mityc.firmaJava.libreria.xades.ResultadoValidacion; import es.mityc.firmaJava.libreria.xades.XAdESSchemas; import es.mityc.firmaJava.libreria.xades.errores.PolicyException; /** * Implementacin de la poltica de factura electrnica v 3.1: * http://www.facturae.es/politica de firma formato facturae/politica de firma formato facturae v3_1.pdf * * @author Ministerio de Industria, Turismo y Comercio * @version 1.0 */ public class Facturae31Manager extends FacturaeManager { private final static Log logger = LogFactory.getLog(Facturae31Manager.class); private static final String PREFIX_POLICY_PROP = "facturae31"; private static ConfigFacturae config = null; static { try { config = FacturaeManager.loadConfig(PREFIX_POLICY_PROP); } catch (ConfigFacturaeException ex) { logger.fatal("No se pudo cargar la configuracion del validador", ex); } } public Facturae31Manager() throws InstantiationException { if (config == null) throw new InstantiationException("No hay configuracin disponible"); } public String getIdentidadPolicy() { return config.policyIdValidador; } /** * Valida que se cumpla la policy especificada en el documento: * http://www.facturae.es/politica de firma formato facturae/politica de firma formato facturae v3_0.pdf * * <p>Detalles para firma bsica:<ul> * <li>La firma ha de ser enveloped</li> * <li>El certificado firmante ha de estar en un elemento KeyInfo</li> * <li>El rol debe estar vaco, o ser de tipo ClaimedRol y contener uno de los siguientes valores:<ul> * <li>"emisor" o "supplier" si la firma la realiza el emisor</li> * <li>"receptor" o "customer" si la firma la realiza el receptor</li> * <li>"tercero" o "third party" si la firma la realiza una persona o entidad distinta al emisor o receptor de la factura</li> * Este validador slo comprobar que la semntica de los nombres es la correcta. * </ul></li> * <li>Que haya un elemento SignaturePolicyIdentifier (XADES-EPES) con los valores:<ul> * <li><xades:SigPolicyId><xades:Identifier>http://www.facturae.es/politica de firma formato facturae/politica de firma formato facturae v3_0.pdf</xades:Identifier></xades:SigPolicyId></li> * <li>la huella digital del documento de policy en un elemento <xades:SigPolicyHash> * </ul></li> * <li>Si la firma es <i>menor</i> a XADES-C (no contiene informacin de validacin) validar el certificado firmante. Este validador no implementa esta caracterstica</li> * </ul></p> * Detalles para firma avanzada (XADES-XL):<ul> * <li>El sello de tiempo debe estar a menos de tres das de la fecha del campo xades:SigningTime y no puede superar a la fecha de caducidad del certificado firmante</li> * <li>La informacin del estado del certificado firmante ha de ser posterior a 24 despus de la fecha indicada en SigningTime</li> * <li>La ruta de certificacin ha de ser completa</li> * </ul> * <p>Certificados electrnicos:<ul> * <li>Los certificados han de cumplir lo indicado en los apartados a) c) del artculo 18 del Reglamento que est recogido en R.D. 1496/2003 del 28 de Noviembre. * Este validador no implementa esta comprobacin</li> * </ul></p> * <p>Sellos de tiempo:<ul> * <li>Se admiten los sellos de tiempo expedidos por aquellas Autoridades de Sellado de Tiempo que cumplan con la norma ETSI TS 102 023 "Policy requirements for time-stamping authorities". * Este validador no implementa esta comprobacin.</li> * </ul></p> * */ public void validaPolicy(Element nodoFirma, final ResultadoValidacion resultadoValidacion) throws PolicyException { if (!isValidSchema(nodoFirma, resultadoValidacion)) { throw new PolicyException(I18n.getResource(ConstantesFacturaePolicy.ERROR_POLICY_GENERICO_01)); } if (!isValidPolicyHash(nodoFirma, resultadoValidacion, config)) { throw new PolicyException(I18n.getResource(ConstantesFacturaePolicy.ERROR_POLICY_GENERICO_01)); } if (!isEnveloped(nodoFirma, resultadoValidacion)) { throw new PolicyException(I18n.getResource(ConstantesFacturaePolicy.ERROR_POLICY_GENERICO_01) + ConstantesFacturaePolicy.ESPACIO + I18n.getResource(ConstantesFacturaePolicy.ERROR_NOT_ENVELOPED)); } if (!isCertificateInKeyInfoNode(nodoFirma, resultadoValidacion)) { throw new PolicyException(I18n.getResource(ConstantesFacturaePolicy.ERROR_POLICY_GENERICO_01) + ConstantesFacturaePolicy.ESPACIO + I18n.getResource(ConstantesFacturaePolicy.ERROR_KEYINFO_POLICY)); } if (!isValidRole(nodoFirma, resultadoValidacion)) { throw new PolicyException(I18n.getResource(ConstantesFacturaePolicy.ERROR_POLICY_GENERICO_01) + ConstantesFacturaePolicy.ESPACIO + I18n.getResource(ConstantesFacturaePolicy.ERROR_ROLE_POLICY)); } comprobarTimestamp(nodoFirma); comprobarInfoCertificado(nodoFirma); comprobarCertificadoConfianza(nodoFirma); comprobarTsaConfianza(nodoFirma); } /** * Comprueba que el esquema de la firma es el esperado * * @param nodoFirma * @param rs * @return <code>true</code> si el esquema es el vlido, <code>false</code> en otro caso */ protected boolean isValidSchema(Element nodoFirma, final ResultadoValidacion rs) { XAdESSchemas schema = rs.getDatosFirma().getEsquema(); if (XAdESSchemas.XAdES_122.equals(schema) || XAdESSchemas.XAdES_132.equals(schema)) return true; return false; } /** * @see es.mityc.firmaJava.policy.IFirmaPolicy#escribePolicy(org.w3c.dom.Element, java.lang.String, java.lang.String, es.mityc.firmaJava.libreria.xades.XAdESSchemas) */ public void escribePolicy(Element nodoFirma, String namespaceDS, String namespaceXAdES, XAdESSchemas schema) throws PolicyException { escribePolicy(nodoFirma, namespaceDS, namespaceXAdES, schema, config); } }