1 /** 2 * LICENCIA LGPL: 3 * 4 * Esta librería es Software Libre; Usted puede redistribuirla y/o modificarla 5 * bajo los términos de la GNU Lesser General Public License (LGPL) tal y como 6 * ha sido publicada por la Free Software Foundation; o bien la versión 2.1 de 7 * la Licencia, o (a su elección) cualquier versión posterior. 8 * 9 * Esta librería se distribuye con la esperanza de que sea útil, pero SIN 10 * NINGUNA GARANTÍA; tampoco las implícitas garantías de MERCANTILIDAD o 11 * ADECUACIÓN A UN PROPÓSITO PARTICULAR. Consulte la GNU Lesser General Public 12 * License (LGPL) para más detalles 13 * 14 * Usted debe recibir una copia de la GNU Lesser General Public License (LGPL) 15 * junto con esta librería; si no es así, escriba a la Free Software Foundation 16 * Inc. 51 Franklin Street, 5º Piso, Boston, MA 02110-1301, USA o consulte 17 * <http://www.gnu.org/licenses/>. 18 * 19 * Copyright 2011 Agencia de Tecnología y Certificación Electrónica 20 */ 21 package es.accv.arangi.base.mityc; 22 import java.security.cert.X509Certificate; 23 import java.util.Date; 24 25 import es.accv.arangi.base.certificate.validation.OCSPResponse; 26 import es.accv.arangi.base.util.validation.ValidationResult; 27 import es.mityc.javasign.certificate.AbstractCertStatus; 28 import es.mityc.javasign.certificate.IOCSPCertStatus; 29 import es.mityc.javasign.certificate.RevokedInfo; 30 31 /** 32 * Estado de una respuesta OCSP 33 * 34 * @author <a href="mailto:jgutierrez@accv.es">José M Gutiérrez</a> 35 */ 36 public class OCSPStatus extends AbstractCertStatus implements IOCSPCertStatus { 37 38 /** Contenido binario de la respuesta OCSP. */ 39 private byte[] respOCSP = null; 40 /** Fecha de la respuesta OCSP. */ 41 private Date dateResponse = null; 42 // private String tiempoRespuesta = null; 43 /** Identificador del OCSP responder. */ 44 private String responderID = null; 45 /** Tipo del identificador del OCSP responder. */ 46 private TYPE_RESPONDER responderType; 47 48 /** 49 * <p>Constructor.</p> 50 * 51 * @param resp Respuesta OCSP del estado del certificado 52 * @param cert Certificado sobre el que se realiza la consulta de estado 53 */ 54 public OCSPStatus(OCSPResponse resp, X509Certificate cert) { 55 super(); 56 setRespOCSP(resp.toDER()); 57 setRespondeDate(resp.getBasicOCSPResponse().getProducedAt()); 58 59 //-- el responder ID lo probamos primero por X509Name 60 String responderId = resp.getResponderIdName(); 61 if (responderId != null) { 62 setResponder(responderId, IOCSPCertStatus.TYPE_RESPONDER.BY_NAME); 63 } else { 64 //-- el responder ID es un keyhash 65 setResponder(resp.getResponderIdKeyHash(), IOCSPCertStatus.TYPE_RESPONDER.BY_KEY); 66 } 67 68 if (resp.getStatus() == ValidationResult.RESULT_VALID) { 69 setCertStatus(CERT_STATUS.valid); 70 } else if (resp.getStatus() == ValidationResult.RESULT_CERTIFICATE_REVOKED) { 71 setCertStatus(CERT_STATUS.revoked); 72 setRevokedInfo(new RevokedInfo(resp.getSingleResponses()[0].getRevocationReason(), resp.getSingleResponses()[0].getRevocationTime())); 73 } else { 74 setCertStatus(CERT_STATUS.unknown); 75 } 76 setCertificate(cert); 77 } 78 79 /** 80 * <p>Establece el contenido binario de la respuesta OCSP.</p> 81 * @param binary byte[] con el contenido binario de la respuesta OCSP 82 */ 83 private void setRespOCSP(final byte[] binary) { 84 respOCSP = (binary != null) ? (byte[]) binary.clone() : null; 85 } 86 87 /** 88 * <p>Establece los datos de identificación del OCSP responder. </p> 89 * @param id cadena identificativa 90 * @param tipoResponder tipo de identificador del OCSP responder 91 */ 92 private void setResponder(final String id, final IOCSPCertStatus.TYPE_RESPONDER tipoResponder) { 93 this.responderID = new String(id); 94 responderType = tipoResponder; 95 // switch (tipoResponder) { 96 // case BY_KEY: 97 // responderType = TYPE_RESPONDER.BY_KEY; 98 // break; 99 // default: 100 // responderType = TYPE_RESPONDER.BY_NAME; 101 // break; 102 // } 103 } 104 105 /** 106 * <p>Establece la fecha de la respuesta de la consulta de estado.</p> 107 * @param date fecha de la respuesta 108 */ 109 private void setRespondeDate(final Date date) { 110 dateResponse = (Date) date.clone(); 111 } 112 113 114 /** 115 * <p>Devuelve la cadena identificadora del OCSP Responder que generó esta respuesta OCSP.</p> 116 * @return cadena identificadora 117 * @see es.mityc.javasign.certificate.IOCSPCertStatus#getResponderID() 118 */ 119 public String getResponderID() { 120 return (responderID != null) ? new String(responderID) : null; 121 } 122 123 /** 124 * <p>Devuelve el tipo de identificador del OCSP Responder.</p> 125 * @return tipo de identificador según {@link #responderType} 126 * @see es.mityc.javasign.certificate.IOCSPCertStatus#getResponderType() 127 */ 128 public TYPE_RESPONDER getResponderType() { 129 return responderType; 130 } 131 132 /** 133 * <p>Devuelve la fecha de emisión de la respuesta OCSP.</p> 134 * @return fecha de la respuesta OCSP 135 * @see es.mityc.javasign.certificate.IOCSPCertStatus#getResponseDate() 136 */ 137 public Date getResponseDate() { 138 return (dateResponse != null) ? (Date) dateResponse.clone() : null; 139 } 140 141 /** 142 * <p>Devuelve la respuesta OCSP en formato binario.</p> 143 * @return byte[] con la respuesta según la RFC 2560 144 * @see es.mityc.javasign.certificate.ICertStatus#getEncoded() 145 */ 146 public byte[] getEncoded() { 147 return respOCSP; 148 } 149 150 } 151