View Javadoc

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