/** * LICENCIA LGPL: * * Esta librería es Software Libre; Usted puede redistribuirlo y/o modificarlo * bajo los términos de la GNU Lesser General Public License (LGPL) * tal y como ha sido publicada por la Free Software Foundation; o * bien la versión 2.1 de la Licencia, o (a su elección) cualquier versión posterior. * * Esta librería se distribuye con la esperanza de que sea útil, pero SIN NINGUNA * GARANTÍA; tampoco las implícitas garantías de MERCANTILIDAD o ADECUACIÓN A UN * PROPÓSITO PARTICULAR. Consulte la GNU Lesser General Public License (LGPL) para más * detalles * * Usted debe recibir una copia de la GNU Lesser General Public License (LGPL) * junto con esta librería; si no es así, escriba a la Free Software Foundation Inc. * 51 Franklin Street, 5º Piso, Boston, MA 02110-1301, USA o consulte * <http://www.gnu.org/licenses/>. * * Copyright 2008 Ministerio de Industria, Turismo y Comercio * */ package es.mityc.firmaJava.ocsp.config; import java.io.IOException; import java.security.cert.CertificateException; import java.security.cert.X509Certificate; import java.util.Hashtable; import java.util.Iterator; import java.util.Vector; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.bouncycastle.asn1.ASN1OctetString; /** * Contiene datos sobre servidores OCSPs * * @author Ministerio de Industria, Turismo y Comercio * @version 0.9 beta */ public final class ProveedorInfo implements Cloneable, ConstantesProveedores { private static Log logger = LogFactory.getLog(ProveedorInfo.class); private String nombre = null; private String descripcion = null; // Si lo de clonar no se puede siempre se puede usar un // HashTable q tmb va sincronizado (aunq va mejor esto otro) //private ConcurrentHashMap<String, String> caHash = null; private Hashtable<String, String> caHash = null; private Vector<ServidorOcsp> servidores = null; protected Object clone() throws CloneNotSupportedException { ProveedorInfo copy = (ProveedorInfo) super.clone(); copy.nombre = nombre; copy.descripcion = descripcion; copy.caHash = new Hashtable<String, String> (); copy.caHash = getCAList(); copy.servidores = new Vector<ServidorOcsp>(); copy.servidores = getServidores(); return copy; } /** * Constructor de la clase. */ public ProveedorInfo() { nombre = EMPTY_STRING; descripcion = EMPTY_STRING; caHash = new Hashtable<String, String>(); servidores = new Vector<ServidorOcsp>(); } /** * Obtiene el nombre del proveedor */ public String getNombre() { return nombre; } protected void setNombre(String nombre) { this.nombre = nombre; } /** * Obtiene la descripcion del proveedor. */ public String getDescripcion() { return descripcion; } protected void setDescripcion(String descripcion) { this.descripcion = descripcion; } /** * Obtiene la lista de servidores OCSP con los que se puede validar el certificado indicado */ public Vector<ServidorOcsp> getServidores() { Vector<ServidorOcsp> copy = null; int total2 = servidores.size(); try { copy = new Vector<ServidorOcsp>(); for (int i=0;i<total2;i++) copy.add((ServidorOcsp)servidores.get(i).clone()); } catch (CloneNotSupportedException e) { logger.error(e.getMessage()); } return copy; } /** * Obtiene el primer Servidor ocsp de la lista de servidores con los que se puede validar el certificado indicado */ public ServidorOcsp getServidor() { Iterator<ServidorOcsp> lista = getServidores().iterator(); ServidorOcsp servidorOcsp = null; if (lista.hasNext()) { servidorOcsp = lista.next(); } return servidorOcsp; } protected Hashtable<String, String> getCAList() { return (Hashtable<String, String>)caHash.clone(); } /** * Indica el certificado indicado puede ser validado por este OCSP. * @param cert * @return true si puede ser validado, false en otro caso. */ public boolean puedeValidar(Object certObj) { X509Certificate cert = null; if (certObj == null) { logger.error (CERTIFICATE_TYPE_EXCEPTION); return false; } try { if (certObj instanceof String) { cert = UtilidadesX509.getCertificate((String)certObj); } else if (certObj instanceof byte[]) { cert = UtilidadesX509.getCertificate((byte[])certObj); } else if (certObj instanceof X509Certificate) { cert = (X509Certificate)certObj; } else { logger.error (CERTIFICATE_TYPE_EXCEPTION); return false; } } catch (CertificateException e) { logger.error (e.getMessage()); return false; } String nameHash = EMPTY_STRING; String pkHash = EMPTY_STRING; try { ASN1OctetString issuerNameHash = UtilidadesX509.getIssuerNameHash(cert); ASN1OctetString issuerKeyHash = UtilidadesX509.getIssuerKeyHash(cert); nameHash = issuerNameHash.toString().replace(ALMOHADILLA, EMPTY_STRING); pkHash = issuerKeyHash.toString().replace(ALMOHADILLA, EMPTY_STRING); return puedeValidar (nameHash,pkHash); } catch (IOException ex) { logger.error(ex.getMessage()); return false; } } /** * (Version desarrollo. Def sera protected..) Indica el certificado indicado puede ser validado por este OCSP. * @param nameHash * @param pkHash * @return true si puede ser validado, false en otro caso. */ protected boolean puedeValidar(String nameHash, String pkHash) { if (caHash.containsKey(nameHash)) return (((String)caHash.get(nameHash)).equals(pkHash)); return false; } protected void addServidor (ServidorOcsp server) { this.servidores.add(server); } protected void addCA(String nameHash, String pkHash) { if (UtilidadesX509.isEmpty(nameHash)) return; if (false == caHash.containsKey(nameHash)) caHash.put(nameHash, pkHash); } }