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.signature;
22  
23  import java.io.File;
24  import java.io.FileNotFoundException;
25  import java.io.InputStream;
26  import java.net.MalformedURLException;
27  import java.net.URL;
28  
29  import org.w3c.dom.Document;
30  
31  import es.accv.arangi.base.certificate.Certificate;
32  import es.accv.arangi.base.device.DeviceManager;
33  import es.accv.arangi.base.document.IDocument;
34  import es.accv.arangi.base.exception.certificate.NormalizeCertificateException;
35  import es.accv.arangi.base.exception.device.LoadingObjectException;
36  import es.accv.arangi.base.exception.document.HashingException;
37  import es.accv.arangi.base.exception.signature.CounterSignatureException;
38  import es.accv.arangi.base.exception.signature.NoCoincidentDocumentException;
39  import es.accv.arangi.base.exception.signature.NoDocumentToSignException;
40  import es.accv.arangi.base.exception.signature.SignatureException;
41  import es.accv.arangi.base.exception.signature.SignatureNotFoundException;
42  import es.accv.arangi.base.exception.signature.XMLDocumentException;
43  import es.accv.arangi.base.exception.timestamp.MalformedTimeStampException;
44  import es.accv.arangi.base.exception.timestamp.ResponseTimeStampException;
45  import es.accv.arangi.base.signature.XAdESBESSignature;
46  import es.accv.arangi.base.signature.util.TSAData;
47  import es.accv.arangi.base.signature.util.XAdESAttachedSignatureOptions;
48  import es.accv.arangi.base.signature.util.XAdESDataObjectFormat;
49  import es.accv.arangi.base.signature.util.XAdESDetachedSignatureOptions;
50  import es.accv.arangi.base.util.validation.ValidationResult;
51  import es.accv.arangi.device.ACCVDeviceManager;
52  import es.accv.arangi.timestamp.TimeStamp;
53  import es.accv.arangi.util.ArangiUtil;
54  
55  /**
56   * Clase que maneja firmas en formato XAdES-T de acuerdo al estándar 
57   * <a href="http://uri.etsi.org/01903/v1.3.2/ts_101903v010302p.pdf" target="etsi">
58   * ETSI TS 101 903</a><br><br>
59   * 
60   * El servidor de Sellado de Tiempo utilizado para completar XAdES-BES o generar XAdES-T será el
61   * proporcionado por la Agencia de tecnologia y certificación electrónica (ACCV): http://tss.accv.es:8318/tsa. 
62   * 
63   * Ejemplo de uso: <br><br>
64   * 
65   * <code> 
66   * KeyStoreManager manager = new KeyStoreManager (..., ...);<br>
67   * InputStreamDocument documentTexto = new InputStreamDocument (new FileInputStream (...));<br>
68   * InputStreamDocument documentXML = new InputStreamDocument (new FileInputStream (...));<br>
69   * File file = new File (...);<br>
70   * URL url = new URL (...);<br><br>
71   * 
72   * //-- Genera una firma attached. El documento se guardará en la firma en base64<br>
73   * XAdESTSignature signature1 = XAdESTSignature.signAttached(manager, documentTexto);<br><br>
74   * 
75   * //-- Genera una firma detached que referencia al fichero en disco<br>
76   * XAdESTSignature signature2 = XAdESTSignature.signDetached(manager, file);<br><br>
77   * 
78   * //-- Genera una firma detached que referencia a "2011/04/29/certificados/CER-2584665.pdf"<br>
79   * XAdESTSignature signature3 = XAdESTSignature.signDetached(manager, file, "2011/04/29/certificados/CER-2584665.pdf");<br><br>
80   * 
81   * //-- Genera una firma detached que referencia al fichero ubicado en la URL<br>
82   * XAdESTSignature signature4 = XAdESTSignature.signDetached(manager, url);<br><br>
83   * 
84   * //-- Genera una firma attached dentro del propio documento<br>
85   * XAdESTSignature signature5 = XAdESTSignature.signAttached(manager, documentoXML, "titulo", "documento");<br><br>
86   * </code>
87   * 
88   * @author <a href="mailto:jgutierrez@accv.es">José M Gutiérrez</a>
89   */
90  public class XAdESTSignature extends es.accv.arangi.base.signature.XAdESTSignature {
91  
92  	/**
93  	 * Construye el objeto en base a un XML que tiene el formato
94  	 * XAdES-T
95  	 * 
96  	 * @param xmlDocument Documento XML
97  	 */
98  	public XAdESTSignature(Document xmlDocument) {
99  		super(xmlDocument);
100 	}
101 
102 	/**
103 	 * Construye el objeto en base a un fichero XAdES-T
104 	 * 
105 	 * @param xmlFile Fichero XAdES-T
106 	 * @throws FileNotFoundException El fichero no existe
107 	 * @throws XMLDocumentException El fichero no parece un XML válido
108 	 */
109 	public XAdESTSignature(File xmlFile) throws FileNotFoundException,
110 			XMLDocumentException {
111 		super(xmlFile);
112 	}
113 	
114 	/**
115 	 * Construye el objeto en base a un array de bytes.
116 	 * 
117 	 * @param signature Firma XAdES-T
118 	 * @throws XMLDocumentException El fichero no parece un XML válido
119 	 */
120 	public XAdESTSignature(byte[] signature) throws XMLDocumentException {
121 		super(signature);
122 	}
123 
124 	/**
125 	 * Construye el objeto en base a un stream de lectura.
126 	 * 
127 	 * @param isSignature Firma XAdES-T
128 	 * @throws XMLDocumentException El fichero no parece un XML válido
129 	 */
130 	public XAdESTSignature(InputStream isSignature) throws XMLDocumentException {
131 		super(isSignature);
132 	}
133 
134 
135 	/**
136 	 * Construye el objeto en base a una firma XAdES-BES (o XAdES-EPES) añadiéndole un 
137 	 * sello de tiempo
138 	 * 
139 	 * @param besSignature Firma en formato XAdES-BES
140 	 * @throws HashingException Error obteniendo el hash del documento
141 	 * @throws NormalizeCertificateException Alguno de los certificados no puede ser 
142 	 * 	normalizado al formato reconocido por el proveedor criptográfico de Arangí o su 
143 	 * 	firma no es correcta o no puede ser analizada
144 	 * @throws NoDocumentToSignException La firma no es attached por lo que no hay documento con
145 	 * 	el que validarla. 
146 	 * @throws XMLDocumentException Error completando el XML del XAdES-BES a XAdES-T
147 	 * @throws MalformedTimeStampException El sello de tiempos obtenido no está bien formado
148 	 * @throws ResponseTimeStampException No se ha podido obtener correctamente el sello de tiempos
149 	 */
150 	public XAdESTSignature(XAdESBESSignature besSignature) throws HashingException, SignatureException, NormalizeCertificateException, NoDocumentToSignException, XMLDocumentException, MalformedTimeStampException, ResponseTimeStampException, MalformedURLException  {
151 		
152 		super(besSignature, ArangiUtil.getACCVCaList(), new URL (TimeStamp.URL_ACCV_TSA_SERVER));
153 		
154 	}
155 
156 	/**
157 	 * Realiza una firma XAdES-T detached (el fichero no se incluirá en la firma). No completa los campos 
158 	 * no obligatorios del tag 'SignedSignatureProperties':'signaturePolicyIdentifier', 
159 	 * 'signatureProductionPlace' y 'signerRole'.
160 	 * 
161 	 * @param manager Dispositivo criptográfico que realizará la firma
162 	 * @param document Fichero a firmar
163 	 * @return Firma XADES-T
164 	 * @throws LoadingObjectException No ha sido posible cargar la clave privada o el certificado usados
165 	 *  para realizar la firma
166 	 * @throws SignatureException No se puede realizar la firma
167 	 * @throws NoDocumentToSignException El fichero a firmar no existe o es nulo
168 	 * @deprecated Usar {@link #signDetached(DeviceManager,IDocument,String,XAdESDetachedSignatureOptions) signDetached}
169 	 */
170 	public static XAdESTSignature signDetached (ACCVDeviceManager manager, File document) throws LoadingObjectException, SignatureException, NoDocumentToSignException {
171 
172 		return signDetached(manager, document, null, null, null);
173 		
174 	}
175 	
176 	/**
177 	 * Realiza una firma XAdES-T detached (el fichero no se incluirá en la firma). No completa los campos 
178 	 * no obligatorios del tag 'SignedSignatureProperties':'signaturePolicyIdentifier', 
179 	 * 'signatureProductionPlace' y 'signerRole'.
180 	 * 
181 	 * @param manager Dispositivo criptográfico que realizará la firma
182 	 * @param document Fichero a firmar
183 	 * @param digitalSignatureAlgorithm Algoritmo de firma (si nulo algoritmo por defecto)
184 	 * @param dof Información para construir el tag DataObjectFormat (puede ser null)
185 	 * @param claimedRoles Roles de la firma (puede ser null)
186 	 * @return Firma XADES-T
187 	 * @throws LoadingObjectException No ha sido posible cargar la clave privada o el certificado usados
188 	 *  para realizar la firma
189 	 * @throws SignatureException No se puede realizar la firma
190 	 * @throws NoDocumentToSignException El fichero a firmar no existe o es nulo
191 	 * @deprecated Usar {@link #signDetached(DeviceManager,IDocument,String,XAdESDetachedSignatureOptions) signDetached}
192 	 */
193 	public static XAdESTSignature signDetached (ACCVDeviceManager manager, File document, 
194 			String digitalSignatureAlgorithm, XAdESDataObjectFormat dof, String[] claimedRoles) throws LoadingObjectException, SignatureException, NoDocumentToSignException {
195 		
196 		try {
197 			return new XAdESTSignature (es.accv.arangi.base.signature.XAdESTSignature.signDetached((DeviceManager) manager, 
198 					manager.getSignatureAlias(), document, digitalSignatureAlgorithm,
199 				new URL (TimeStamp.URL_ACCV_TSA_SERVER), dof, claimedRoles).getDOM());
200 		} catch (MalformedURLException e) {
201 			// No se va a dar, la URL de la tsa de la accv está bien formada
202 			return null;
203 		}
204 		
205 	}
206 	
207 	/**
208 	 * Realiza una firma XAdES-T detached (el fichero no se incluirá en la firma). No completa los campos 
209 	 * no obligatorios del tag 'SignedSignatureProperties':'signaturePolicyIdentifier', 
210 	 * 'signatureProductionPlace' y 'signerRole'.
211 	 * 
212 	 * @param manager Dispositivo criptográfico que realizará la firma
213 	 * @param urlDocument Documento a firmar. Se encuentra en una URL accesible.
214 	 * @return Firma XADES-T
215 	 * @throws LoadingObjectException No ha sido posible cargar la clave privada o el certificado usados
216 	 *  para realizar la firma
217 	 * @throws SignatureException No se puede realizar la firma
218 	 * @throws NoDocumentToSignException El fichero a firmar no existe o es nulo
219 	 * @deprecated Usar {@link #signDetached(DeviceManager,IDocument,String,XAdESDetachedSignatureOptions) signDetached}
220 	 */
221 	public static XAdESTSignature signDetached (ACCVDeviceManager manager, URL urlDocument) throws LoadingObjectException, SignatureException, NoDocumentToSignException {
222 		
223 		return signDetached(manager, urlDocument, null, null, null);
224 		
225 	}
226 	
227 	/**
228 	 * Realiza una firma XAdES-T detached (el fichero no se incluirá en la firma). No completa los campos 
229 	 * no obligatorios del tag 'SignedSignatureProperties':'signaturePolicyIdentifier', 
230 	 * 'signatureProductionPlace' y 'signerRole'.
231 	 * 
232 	 * @param manager Dispositivo criptográfico que realizará la firma
233 	 * @param urlDocument Documento a firmar. Se encuentra en una URL accesible.
234 	 * @param digitalSignatureAlgorithm Algoritmo de firma (si nulo algoritmo por defecto)
235 	 * @param dof Información para construir el tag DataObjectFormat (puede ser null)
236 	 * @param claimedRoles Roles de la firma (puede ser null)
237 	 * @return Firma XADES-T
238 	 * @throws LoadingObjectException No ha sido posible cargar la clave privada o el certificado usados
239 	 *  para realizar la firma
240 	 * @throws SignatureException No se puede realizar la firma
241 	 * @throws NoDocumentToSignException El fichero a firmar no existe o es nulo
242 	 * @deprecated Usar {@link #signDetached(DeviceManager,IDocument,String,XAdESDetachedSignatureOptions) signDetached}
243 	 */
244 	public static XAdESTSignature signDetached (ACCVDeviceManager manager, URL urlDocument, 
245 			String digitalSignatureAlgorithm, XAdESDataObjectFormat dof,
246 			String[] claimedRoles) throws LoadingObjectException, SignatureException, NoDocumentToSignException {
247 		
248 		try {
249 			return new XAdESTSignature (es.accv.arangi.base.signature.XAdESTSignature.signDetached((DeviceManager) manager, 
250 					manager.getSignatureAlias(), urlDocument, digitalSignatureAlgorithm,
251 				new URL (TimeStamp.URL_ACCV_TSA_SERVER), dof, claimedRoles).getDOM());
252 		} catch (MalformedURLException e) {
253 			// No se va a dar, la URL de la tsa de la accv está bien formada
254 			return null;
255 		}
256 	}
257 	
258 	/**
259 	 * Realiza una firma XAdES-T detached (el fichero no se incluirá en la firma). No completa los campos 
260 	 * no obligatorios del tag 'SignedSignatureProperties':'signaturePolicyIdentifier', 
261 	 * 'signatureProductionPlace' y 'signerRole'.
262 	 * 
263 	 * @param manager Dispositivo criptográfico que realizará la firma
264 	 * @param document Contenido a firmar. 
265 	 * @param reference Referencia al documento a firmar (se incluirá en el XAdES-T). Ej. Path al documento dentro de un gestor documental.
266 	 * @return Firma XADES-T
267 	 * @throws LoadingObjectException No ha sido posible cargar la clave privada o el certificado usados
268 	 *  para realizar la firma
269 	 * @throws SignatureException No se puede realizar la firma
270 	 * @deprecated Usar {@link #signDetached(DeviceManager,IDocument,String,XAdESDetachedSignatureOptions) signDetached}
271 	 */
272 	public static XAdESTSignature signDetached (ACCVDeviceManager manager, IDocument document, String reference) throws LoadingObjectException, SignatureException {
273 		
274 		return signDetached(manager, document, null, reference, null, null);
275 		
276 	}
277 	
278 	/**
279 	 * Realiza una firma XAdES-T detached (el fichero no se incluirá en la firma). No completa los campos 
280 	 * no obligatorios del tag 'SignedSignatureProperties':'signaturePolicyIdentifier', 
281 	 * 'signatureProductionPlace' y 'signerRole'.
282 	 * 
283 	 * @param manager Dispositivo criptográfico que realizará la firma
284 	 * @param document Contenido a firmar. 
285 	 * @param digitalSignatureAlgorithm Algoritmo de firma (si nulo algoritmo por defecto)
286 	 * @param reference Referencia al documento a firmar (se incluirá en el XAdES-T). Ej. Path al documento dentro de un gestor documental.
287 	 * @param dof Información para construir el tag DataObjectFormat (puede ser null)
288 	 * @param claimedRoles Roles de la firma (puede ser null)
289 	 * @return Firma XADES-T
290 	 * @throws LoadingObjectException No ha sido posible cargar la clave privada o el certificado usados
291 	 *  para realizar la firma
292 	 * @throws SignatureException No se puede realizar la firma
293 	 * @deprecated Usar {@link #signDetached(DeviceManager,IDocument,String,XAdESDetachedSignatureOptions) signDetached}
294 	 */
295 	public static XAdESTSignature signDetached (ACCVDeviceManager manager, IDocument document, 
296 			String digitalSignatureAlgorithm, String reference,
297 			XAdESDataObjectFormat dof, String[] claimedRoles) throws LoadingObjectException, SignatureException {
298 		
299 		try {
300 			return new XAdESTSignature (es.accv.arangi.base.signature.XAdESTSignature.signDetached((DeviceManager) manager, 
301 					manager.getSignatureAlias(), document, digitalSignatureAlgorithm,
302 				reference, new URL (TimeStamp.URL_ACCV_TSA_SERVER), dof, claimedRoles).getDOM());
303 		} catch (MalformedURLException e) {
304 			// No se va a dar, la URL de la tsa de la accv está bien formada
305 			return null;
306 		}
307 	}
308 	
309 	/**
310 	 * Realiza una firma XAdES-T detached (el fichero no se incluirá en la firma). No completa los campos 
311 	 * no obligatorios del tag 'SignedSignatureProperties':'signaturePolicyIdentifier', 
312 	 * 'signatureProductionPlace' y 'signerRole'.
313 	 * 
314 	 * @param manager Dispositivo criptográfico que realizará la firma
315 	 * @param document Contenido a firmar. 
316 	 * @param reference Referencia al documento a firmar (se incluirá en el XAdES-T). Ej. Path al documento dentro de un gestor documental.
317 	 * @param options Opciones para la firma
318 	 * @return Firma XADES-T
319 	 * @throws LoadingObjectException No ha sido posible cargar la clave privada o el certificado usados
320 	 *  para realizar la firma
321 	 * @throws SignatureException No se puede realizar la firma
322 	 */
323 	public static XAdESTSignature signDetached (ACCVDeviceManager manager, IDocument document, 
324 			String reference, XAdESDetachedSignatureOptions options) throws LoadingObjectException, SignatureException {
325 		
326 		try {
327 			return new XAdESTSignature (es.accv.arangi.base.signature.XAdESTSignature.signDetached((DeviceManager) manager, 
328 					manager.getSignatureAlias(), document, reference, new TSAData(new URL (TimeStamp.URL_ACCV_TSA_SERVER)), options).getDOM());
329 		} catch (MalformedURLException e) {
330 			// No se va a dar, la URL de la tsa de la accv está bien formada
331 			return null;
332 		}
333 	}
334 	
335 	/**
336 	 * Realiza una firma XAdES-T atached (el documento se incluye en la firma). No completa los campos no 
337 	 * obligatorios del tag 'SignedSignatureProperties':'signaturePolicyIdentifier', 'signatureProductionPlace' 
338 	 * y 'signerRole'.
339 	 * 
340 	 * Si el documento es un XML y los parámetros <code>idToSign</code> y <code>signatureParent</code>
341 	 * no son nulos la firma y los campos propios de XAdES se añadirán al XML. En caso contrario el fichero 
342 	 * XAdES resultante seguirá la plantilla de Arangí, por ejemplo:<br>
343 	 * <code>
344 	 * 	&lt;arangi-xades&gt;<br>
345 	 *  &nbsp;&nbsp;&lt;document&gt;...&lt;/document&gt;<br>
346 	 *  &nbsp;&nbsp;&lt;ds:Signature&gt;...&lt;/ds:Signature&gt;<br>
347 	 * 	&lt;/arangi-xades&gt;<br>
348 	 * </code>
349 	 * 
350 	 * @param manager Dispositivo criptográfico que realizará la firma
351 	 * @param document Documento a firmar
352 	 * @param idToSign Valor del atributo 'ID' que indica lo que se firmará dentro del documento. Si tiene 
353 	 *  valor nulo el XML de la firma tendrá el formato por defecto de las firmas XAdES de Arangí.
354 	 * @param signatureParent Nombre del tag que será el padre de los nodos de firma. Si tiene valor nulo
355 	 * 	la firma colgará del nodo raíz.
356 	 * @return Firma XADES-T
357 	 * @throws XMLDocumentException Error montando el fichero XML
358 	 * @throws LoadingObjectException No ha sido posible cargar la clave privada o el certificado usados
359 	 *  para realizar la firma
360 	 * @throws SignatureException No se puede realizar la firma
361 	 * @deprecated Usar {@link #signAttached(DeviceManager,IDocument,XAdESAttachedSignatureOptions) signAttached}
362 	 */
363 	public static XAdESTSignature signAttached (ACCVDeviceManager manager, IDocument document, String idToSign,
364 			String signatureParent) throws XMLDocumentException, LoadingObjectException, SignatureException  {
365 	
366 		return signAttached(manager, document, null, idToSign, signatureParent, null, null);
367 		
368 	}
369 	
370 	/**
371 	 * Realiza una firma XAdES-T atached (el documento se incluye en la firma). No completa los campos no 
372 	 * obligatorios del tag 'SignedSignatureProperties':'signaturePolicyIdentifier', 'signatureProductionPlace' 
373 	 * y 'signerRole'.
374 	 * 
375 	 * Si el documento es un XML y los parámetros <code>idToSign</code> y <code>signatureParent</code>
376 	 * no son nulos la firma y los campos propios de XAdES se añadirán al XML. En caso contrario el fichero 
377 	 * XAdES resultante seguirá la plantilla de Arangí, por ejemplo:<br>
378 	 * <code>
379 	 * 	&lt;arangi-xades&gt;<br>
380 	 *  &nbsp;&nbsp;&lt;document&gt;...&lt;/document&gt;<br>
381 	 *  &nbsp;&nbsp;&lt;ds:Signature&gt;...&lt;/ds:Signature&gt;<br>
382 	 * 	&lt;/arangi-xades&gt;<br>
383 	 * </code>
384 	 * 
385 	 * @param manager Dispositivo criptográfico que realizará la firma
386 	 * @param document Documento a firmar
387 	 * @param digitalSignatureAlgorithm Algoritmo de firma (si nulo algoritmo por defecto)
388 	 * @param idToSign Valor del atributo 'ID' que indica lo que se firmará dentro del documento. Si tiene 
389 	 *  valor nulo el XML de la firma tendrá el formato por defecto de las firmas XAdES de Arangí.
390 	 * @param signatureParent Nombre del tag que será el padre de los nodos de firma. Si tiene valor nulo
391 	 * 	la firma colgará del nodo raíz.
392 	 * @param dof Información para construir el tag DataObjectFormat (puede ser null)
393 	 * @param claimedRoles Roles de la firma (puede ser null)
394 	 * @return Firma XADES-T
395 	 * @throws XMLDocumentException Error montando el fichero XML
396 	 * @throws LoadingObjectException No ha sido posible cargar la clave privada o el certificado usados
397 	 *  para realizar la firma
398 	 * @throws SignatureException No se puede realizar la firma
399 	 * @deprecated Usar {@link #signAttached(DeviceManager,IDocument,XAdESAttachedSignatureOptions) signAttached}
400 	 */
401 	public static XAdESTSignature signAttached (ACCVDeviceManager manager, IDocument document, 
402 			String digitalSignatureAlgorithm, String idToSign,
403 			String signatureParent, XAdESDataObjectFormat dof, String[] claimedRoles) throws XMLDocumentException, LoadingObjectException, SignatureException  {
404 	
405 		try {
406 			return new XAdESTSignature (es.accv.arangi.base.signature.XAdESTSignature.signAttached((DeviceManager) manager, 
407 					manager.getSignatureAlias(), document, digitalSignatureAlgorithm, 
408 				idToSign, signatureParent, new URL (TimeStamp.URL_ACCV_TSA_SERVER), dof, claimedRoles).getDOM());
409 		} catch (MalformedURLException e) {
410 			// No se va a dar, la URL de la tsa de la accv está bien formada
411 			return null;
412 		}
413 
414 	}
415 	
416 	/**
417 	 * Realiza una firma XAdES-T atached (el documento se incluye en la firma). No completa los campos no 
418 	 * obligatorios del tag 'SignedSignatureProperties':'signaturePolicyIdentifier', 'signatureProductionPlace' 
419 	 * y 'signerRole'.<br><br>
420 	 * 
421 	 * El fichero XAdES seguirá la plantilla de Arangí. Ejemplo:<br>
422 	 * <code>
423 	 * 	&lt;arangi-xades&gt;<br>
424 	 *  &nbsp;&nbsp;&lt;document&gt;...&lt;/document&gt;<br>
425 	 *  &nbsp;&nbsp;&lt;ds:Signature&gt;...&lt;/ds:Signature&gt;<br>
426 	 * 	&lt;/arangi-xades&gt;<br>
427 	 * </code>
428 	 * 
429 	 * @param manager Dispositivo criptográfico que realizará la firma
430 	 * @param document Documento a firmar
431 	 * @return Firma XADES-T
432 	 * @throws XMLDocumentException Error montando el fichero XML
433 	 * @throws LoadingObjectException No ha sido posible cargar la clave privada o el certificado usados
434 	 *  para realizar la firma
435 	 * @throws SignatureException No se puede realizar la firma
436 	 * @deprecated Usar {@link #signAttached(DeviceManager,IDocument,XAdESAttachedSignatureOptions) signAttached}
437 	 */
438 	public static XAdESTSignature signAttached (ACCVDeviceManager manager, IDocument document) throws XMLDocumentException, LoadingObjectException, SignatureException  {
439 		
440 		return signAttached(manager, document, (String)null, null);
441 		
442 	}
443 	
444 	/**
445 	 * Realiza una firma XAdES-T atached (el documento se incluye en la firma). No completa los campos no 
446 	 * obligatorios del tag 'SignedSignatureProperties':'signaturePolicyIdentifier', 'signatureProductionPlace' 
447 	 * y 'signerRole'.<br><br>
448 	 * 
449 	 * El fichero XAdES seguirá la plantilla de Arangí. Ejemplo:<br>
450 	 * <code>
451 	 * 	&lt;arangi-xades&gt;<br>
452 	 *  &nbsp;&nbsp;&lt;document&gt;...&lt;/document&gt;<br>
453 	 *  &nbsp;&nbsp;&lt;ds:Signature&gt;...&lt;/ds:Signature&gt;<br>
454 	 * 	&lt;/arangi-xades&gt;<br>
455 	 * </code>
456 	 * 
457 	 * @param manager Dispositivo criptográfico que realizará la firma
458 	 * @param document Documento a firmar
459 	 * @param digitalSignatureAlgorithm Algoritmo de firma (si nulo algoritmo por defecto)
460 	 * @param dof Información para construir el tag DataObjectFormat (puede ser null)
461 	 * @param claimedRoles Roles de la firma (puede ser null)
462 	 * @return Firma XADES-T
463 	 * @throws XMLDocumentException Error montando el fichero XML
464 	 * @throws LoadingObjectException No ha sido posible cargar la clave privada o el certificado usados
465 	 *  para realizar la firma
466 	 * @throws SignatureException No se puede realizar la firma
467 	 * @deprecated Usar {@link #signAttached(DeviceManager,IDocument,XAdESAttachedSignatureOptions) signAttached}
468 	 */
469 	public static XAdESTSignature signAttached (ACCVDeviceManager manager, IDocument document, 
470 			String digitalSignatureAlgorithm, XAdESDataObjectFormat dof, String[] claimedRoles) throws XMLDocumentException, LoadingObjectException, SignatureException  {
471 		
472 		try {
473 			return new XAdESTSignature (es.accv.arangi.base.signature.XAdESTSignature.signAttached((DeviceManager) manager, 
474 					manager.getSignatureAlias(), document, digitalSignatureAlgorithm,
475 				new URL (TimeStamp.URL_ACCV_TSA_SERVER), dof, claimedRoles).getDOM());
476 		} catch (MalformedURLException e) {
477 			// No se va a dar, la URL de la tsa de la accv está bien formada
478 			return null;
479 		}
480 	}
481 	
482 	/**
483 	 * Realiza una firma XAdES-T attached (el documento se incluye en la firma). No completa los campos no 
484 	 * obligatorios del tag 'SignedSignatureProperties':'signaturePolicyIdentifier', 'signatureProductionPlace' 
485 	 * y 'signerRole'.<br><br>
486 	 * 
487 	 * El fichero XAdES seguirá la plantilla de Arangí. Ejemplo:<br>
488 	 * <code>
489 	 * 	&lt;arangi-xades&gt;<br>
490 	 *  &nbsp;&nbsp;&lt;document&gt;...&lt;/document&gt;<br>
491 	 *  &nbsp;&nbsp;&lt;ds:Signature&gt;...&lt;/ds:Signature&gt;<br>
492 	 * 	&lt;/arangi-xades&gt;<br>
493 	 * </code>
494 	 * 
495 	 * @param manager Dispositivo criptográfico que realizará la firma
496 	 * @param document Fichero a firmar
497 	 * @return Firma XADES-T
498 	 * @throws XMLDocumentException Error montando el fichero XML
499 	 * @throws LoadingObjectException No ha sido posible cargar la clave privada o el certificado usados
500 	 *  para realizar la firma
501 	 * @throws SignatureException No se puede realizar la firma
502 	 * @deprecated Usar {@link #signAttached(DeviceManager,IDocument,XAdESAttachedSignatureOptions) signAttached}
503 	 */
504 	public static XAdESTSignature signAttached (ACCVDeviceManager manager, File document) throws LoadingObjectException, SignatureException, NoDocumentToSignException, XMLDocumentException {
505 		
506 		return signAttached(manager, document, null, null, null);
507 
508 	}
509 	
510 	/**
511 	 * Realiza una firma XAdES-T attached (el documento se incluye en la firma). No completa los campos no 
512 	 * obligatorios del tag 'SignedSignatureProperties':'signaturePolicyIdentifier', 'signatureProductionPlace' 
513 	 * y 'signerRole'.<br><br>
514 	 * 
515 	 * El fichero XAdES seguirá la plantilla de Arangí. Ejemplo:<br>
516 	 * <code>
517 	 * 	&lt;arangi-xades&gt;<br>
518 	 *  &nbsp;&nbsp;&lt;document&gt;...&lt;/document&gt;<br>
519 	 *  &nbsp;&nbsp;&lt;ds:Signature&gt;...&lt;/ds:Signature&gt;<br>
520 	 * 	&lt;/arangi-xades&gt;<br>
521 	 * </code>
522 	 * 
523 	 * @param manager Dispositivo criptográfico que realizará la firma
524 	 * @param document Fichero a firmar
525 	 * @param digitalSignatureAlgorithm Algoritmo de firma (si nulo algoritmo por defecto)
526 	 * @param dof Información para construir el tag DataObjectFormat (puede ser null)
527 	 * @param claimedRoles Roles de la firma (puede ser null)
528 	 * @return Firma XADES-T
529 	 * @throws XMLDocumentException Error montando el fichero XML
530 	 * @throws LoadingObjectException No ha sido posible cargar la clave privada o el certificado usados
531 	 *  para realizar la firma
532 	 * @throws SignatureException No se puede realizar la firma
533 	 * @deprecated Usar {@link #signAttached(DeviceManager,IDocument,XAdESAttachedSignatureOptions) signAttached}
534 	 */
535 	public static XAdESTSignature signAttached (ACCVDeviceManager manager, File document, 
536 			String digitalSignatureAlgorithm, XAdESDataObjectFormat dof,
537 			String[] claimedRoles) throws LoadingObjectException, SignatureException, NoDocumentToSignException, XMLDocumentException {
538 		
539 		try {
540 			return new XAdESTSignature (es.accv.arangi.base.signature.XAdESTSignature.signAttached((DeviceManager) manager, 
541 					manager.getSignatureAlias(), document, digitalSignatureAlgorithm,
542 				new URL (TimeStamp.URL_ACCV_TSA_SERVER), dof, claimedRoles).getDOM());
543 		} catch (MalformedURLException e) {
544 			// No se va a dar, la URL de la tsa de la accv está bien formada
545 			return null;
546 		}
547 	}
548 	
549 	/**
550 	 * Realiza una firma XAdES-T attached (el documento se incluye en la firma). No completa los campos no 
551 	 * obligatorios del tag 'SignedSignatureProperties':'signaturePolicyIdentifier', 'signatureProductionPlace' 
552 	 * y 'signerRole'.<br><br>
553 	 * 
554 	 * El fichero XAdES seguirá la plantilla de Arangí. Ejemplo:<br>
555 	 * <code>
556 	 * 	&lt;arangi-xades&gt;<br>
557 	 *  &nbsp;&nbsp;&lt;document&gt;...&lt;/document&gt;<br>
558 	 *  &nbsp;&nbsp;&lt;ds:Signature&gt;...&lt;/ds:Signature&gt;<br>
559 	 * 	&lt;/arangi-xades&gt;<br>
560 	 * </code>
561 	 * 
562 	 * @param manager Dispositivo criptográfico que realizará la firma
563 	 * @param document Fichero a firmar en una URL
564 	 * @return Firma XADES-T
565 	 * @throws XMLDocumentException Error montando el fichero XML
566 	 * @throws LoadingObjectException No ha sido posible cargar la clave privada o el certificado usados
567 	 *  para realizar la firma
568 	 * @throws SignatureException No se puede realizar la firma
569 	 * @deprecated Usar {@link #signAttached(DeviceManager,IDocument,XAdESAttachedSignatureOptions) signAttached}
570 	 */
571 	public static XAdESTSignature signAttached (ACCVDeviceManager manager, URL document) throws LoadingObjectException, SignatureException, NoDocumentToSignException, XMLDocumentException {
572 		
573 		return signAttached(manager, document, null, null, null);
574 
575 	}
576 	
577 	/**
578 	 * Realiza una firma XAdES-T attached (el documento se incluye en la firma). No completa los campos no 
579 	 * obligatorios del tag 'SignedSignatureProperties':'signaturePolicyIdentifier', 'signatureProductionPlace' 
580 	 * y 'signerRole'.<br><br>
581 	 * 
582 	 * El fichero XAdES seguirá la plantilla de Arangí. Ejemplo:<br>
583 	 * <code>
584 	 * 	&lt;arangi-xades&gt;<br>
585 	 *  &nbsp;&nbsp;&lt;document&gt;...&lt;/document&gt;<br>
586 	 *  &nbsp;&nbsp;&lt;ds:Signature&gt;...&lt;/ds:Signature&gt;<br>
587 	 * 	&lt;/arangi-xades&gt;<br>
588 	 * </code>
589 	 * 
590 	 * @param manager Dispositivo criptográfico que realizará la firma
591 	 * @param document Fichero a firmar en una URL
592 	 * @param digitalSignatureAlgorithm Algoritmo de firma (si nulo algoritmo por defecto)
593 	 * @param dof Información para construir el tag DataObjectFormat (puede ser null)
594 	 * @param claimedRoles Roles de la firma (puede ser null)
595 	 * @return Firma XADES-T
596 	 * @throws XMLDocumentException Error montando el fichero XML
597 	 * @throws LoadingObjectException No ha sido posible cargar la clave privada o el certificado usados
598 	 *  para realizar la firma
599 	 * @throws SignatureException No se puede realizar la firma
600 	 * @deprecated Usar {@link #signAttached(DeviceManager,IDocument,XAdESAttachedSignatureOptions) signAttached}
601 	 */
602 	public static XAdESTSignature signAttached (ACCVDeviceManager manager, URL document, 
603 			String digitalSignatureAlgorithm, XAdESDataObjectFormat dof,
604 			String[] claimedRoles) throws LoadingObjectException, SignatureException, NoDocumentToSignException, XMLDocumentException {
605 		
606 		try {
607 			return new XAdESTSignature (es.accv.arangi.base.signature.XAdESTSignature.signAttached((DeviceManager) manager, 
608 					manager.getSignatureAlias(), document, digitalSignatureAlgorithm,
609 				new URL (TimeStamp.URL_ACCV_TSA_SERVER), dof, claimedRoles).getDOM());
610 		} catch (MalformedURLException e) {
611 			// No se va a dar, la URL de la tsa de la accv está bien formada
612 			return null;
613 		}
614 	}
615 	
616 	/**
617 	 * Realiza una firma XAdES-T attached (el documento se incluye en la firma). 
618 	 * 
619 	 * @param manager Dispositivo criptográfico que realizará la firma
620 	 * @param document Documento a firmar
621 	 * @param options Opciones para la firma
622 	 * @return Firma XADES-T
623 	 * @throws XMLDocumentException Error montando el fichero XML
624 	 * @throws LoadingObjectException No ha sido posible cargar la clave privada o el certificado usados
625 	 *  para realizar la firma
626 	 * @throws SignatureException No se puede realizar la firma
627 	 */
628 	public static XAdESTSignature signAttached (ACCVDeviceManager manager, IDocument document, 
629 			XAdESAttachedSignatureOptions options) throws XMLDocumentException, LoadingObjectException, SignatureException  {
630 		
631 		try {
632 			return new XAdESTSignature (es.accv.arangi.base.signature.XAdESTSignature.signAttached((DeviceManager) manager, 
633 					manager.getSignatureAlias(), document, new TSAData(new URL (TimeStamp.URL_ACCV_TSA_SERVER)), options).getDOM());
634 		} catch (MalformedURLException e) {
635 			// No se va a dar, la URL de la tsa de la accv está bien formada
636 			return null;
637 		}
638 	}
639 	
640 	/**
641 	 * La definición de las contrafirmas en XAdES puede observarse en el punto 7.2.4
642 	 * del estándar de la ETSI.<br><br>
643 	 * 
644 	 * Este método realiza una contrafirma para la última firma del XAdES. Es útil 
645 	 * cuando se sabe que el XAdES contiene sólo una firma.<br><br>
646 	 * 
647 	 * Como resultado el XAdES a la que hace referencia este objeto se modificará 
648 	 * para añadir la contrafirma.
649 	 * 
650 	 * @param manager Dispositivo criptográfico que realizará la contrafirma
651 	 * @throws LoadingObjectException No es posible obtener la clave privada o el
652 	 * 	certificado del alias
653 	 * @throws CounterSignatureException Errores durante el proceso de contrafirma
654 	 */
655 	public void counterSign (ACCVDeviceManager manager) throws LoadingObjectException, CounterSignatureException {
656 		counterSign(manager, null, null);
657 	}
658 	
659 	/**
660 	 * La definición de las contrafirmas en XAdES puede observarse en el punto 7.2.4
661 	 * del estándar de la ETSI.<br><br>
662 	 * 
663 	 * Este método realiza una contrafirma para la firma cuyo certificado se pasa
664 	 * en el parámetro 'signatureToCounterSignCertificate'. Es útil cuando se quiere
665 	 * contrafirmar un XAdES que contiene varias firmas. Para saber qué firma se
666 	 * desea contrafirmar se puede llamar primero a 
667 	 * {@link #getCertificates() getCertificates} para ver los certificados de cada
668 	 * una de las firmas que contiene el XAdES.<br><br>
669 	 * 
670 	 * Como resultado el XAdES a la que hace referencia este objeto se modificará 
671 	 * para añadir la contrafirma.
672 	 * 
673 	 * @param manager Dispositivo criptográfico que realizará la contrafirma
674 	 * @param signatureToCounterSignCertificate Certificado de la firma que se 
675 	 * 	contrafirmará
676 	 * @param digitalSignatureAlgorithm Algoritmo de firma (si nulo algoritmo por defecto)
677 	 * @throws LoadingObjectException No es posible obtener la clave privada o el
678 	 * 	certificado del alias
679 	 * @throws CounterSignatureException Errores durante el proceso de contrafirma
680 	 */
681 	public void counterSign (ACCVDeviceManager manager, Certificate signatureToCounterSignCertificate,
682 			String digitalSignatureAlgorithm) throws LoadingObjectException, CounterSignatureException {
683 		
684 		try {
685 			counterSign((DeviceManager)manager, manager.getSignatureAlias(), signatureToCounterSignCertificate, 
686 					digitalSignatureAlgorithm, new URL (TimeStamp.URL_ACCV_TSA_SERVER));
687 		} catch (MalformedURLException e) {
688 			// No se va a dar, la URL es correcta
689 		}
690 	
691 	}
692 	
693 	/**
694 	 * Añade una Cofirma a la firma XAdES-T. Realizará una firma de las mismas características que 
695 	 * la primera que encuentre (attached o dettached).<br><br>
696 	 * 
697 	 * Si la firma es dettached y la referencia al documento que hay en la firma no
698 	 * es una URL será necesario usar el método {@link #coSign(ACCVDeviceManager, IDocument)}
699 	 * al que le proporcionaremos este documento.  
700 	 * 
701 	 * @param manager Dispositivo criptográfico que realizará la cofirma
702 	 * @throws SignatureNotFoundException No existe ninguna firma que cofirmar
703 	 * @throws NoDocumentToSignException El fichero a firmar no existe o es nulo
704 	 * @throws HashingException Error realizando el hash del documento
705 	 * @throws LoadingObjectException No ha sido posible cargar la clave privada o el certificado usados
706 	 *  para realizar la firma
707 	 * @throws SignatureException No ha sido posible parsear la firma XAdES o no se puede realizar la cofirma
708 	 * @throws NoCoincidentDocumentException El documento que se quiere firmar no se corresponde con el de
709 	 * 	la firma XAdES  
710 	 */
711 	public void coSign (ACCVDeviceManager manager)  throws SignatureNotFoundException, 
712 		NoDocumentToSignException, HashingException, LoadingObjectException, SignatureException, NoCoincidentDocumentException {
713 		coSign (manager, null, null);
714 	}
715 	
716 	
717 	/**
718 	 * Añade una Cofirma a la firma XAdES-T. Realizará una firma de las mismas características que 
719 	 * la primera que encuentre (attached o dettached).<br><br>
720 	 * 
721 	 * Este método es útil si la firma es dettached i la referencia al documento que hay en la firma no
722 	 * es una URL.  
723 	 * 
724 	 * @param manager Dispositivo criptográfico que realizará la cofirma
725 	 * @param signedDoc contenido a firmar. El mismo utilizado en la generación de las otras firmas.
726 	 * @param digitalSignatureAlgorithm Algoritmo de firma (si nulo algoritmo por defecto)
727 	 * @throws SignatureNotFoundException No existe ninguna firma que cofirmar
728 	 * @throws NoDocumentToSignException El fichero a firmar no existe o es nulo
729 	 * @throws HashingException Error realizando el hash del documento
730 	 * @throws LoadingObjectException No ha sido posible cargar la clave privada o el certificado usados
731 	 *  para realizar la firma
732 	 * @throws SignatureException No ha sido posible parsear la firma XAdES o no se puede realizar la cofirma
733 	 * @throws NoCoincidentDocumentException El documento que se quiere firmar no se corresponde con el de
734 	 * 	la firma XAdES  
735 	 */
736 	public void coSign (ACCVDeviceManager manager, IDocument signedDoc, String digitalSignatureAlgorithm)  throws SignatureNotFoundException, 
737 		NoDocumentToSignException, HashingException, LoadingObjectException, SignatureException, NoCoincidentDocumentException {
738 		try {
739 			coSign ((DeviceManager)manager, manager.getSignatureAlias(), signedDoc, digitalSignatureAlgorithm, new URL (TimeStamp.URL_ACCV_TSA_SERVER));
740 		} catch (MalformedURLException e) {
741 			// No se va a dar, la URL es correcta
742 		}
743 	}
744 	
745 	
746 	/**
747 	 * Añade un sello de tiempos a la firma XAdES-BES. El servidor de Sellado de Tiempo 
748 	 * será el proporcionado por la Agencia de tecnologia y certificación electrónica (ACCV).
749 	 * 
750 	 * La firma XAdES-BES es necesario que sea attached. En el caso que no sea así deberá usar el 
751 	 * método {@link #completeToXAdEST (XAdESBESSignature, IDocument)}.
752 	 * 
753 	 * @param xadesBES firma XAdES-BES
754 	 * @return XAdES-T
755 	 * @throws HashingException Error obteniendo el hash del documento
756 	 * @throws SignatureException Error tratando el objeto firma o la firma XAdES-BES no es
757 	 * 	válida
758 	 * @throws XMLDocumentException Error completando el XML del XAdES-BES a XAdES-T
759 	 * @throws MalformedTimeStampException El sello de tiempos obtenido no está bien formado
760 	 * @throws ResponseTimeStampException No se ha podido obtener correctamente el sello de tiempos
761 	 */
762 	public static XAdESTSignature completeToXAdEST (XAdESBESSignature xadesBES) throws SignatureException, MalformedTimeStampException, ResponseTimeStampException, HashingException, XMLDocumentException  {
763 		return completeToXAdEST (xadesBES, null);
764 	}
765 	
766 	/**
767 	 * Añade un sello de tiempos a la firma XAdES-BES. El servidor de Sellado de Tiempo 
768 	 * será el proporcionado por la Agencia de tecnologia y certificación electrónica (ACCV).
769 	 * 
770 	 * @param xadesBES firma XAdES-BES
771 	 * @param document documento firmado en el XAdES-BES. Útil en el caso que el XAdES sea detached.
772 	 * @return XAdES-T
773 	 * @throws HashingException Error obteniendo el hash del documento
774 	 * @throws SignatureException Error tratando el objeto firma o la firma XAdES-BES no es
775 	 * 	válida
776 	 * @throws XMLDocumentException Error completando el XML del XAdES-BES a XAdES-T
777 	 * @throws MalformedTimeStampException El sello de tiempos obtenido no está bien formado
778 	 * @throws ResponseTimeStampException No se ha podido obtener correctamente el sello de tiempos
779 	 */
780 	public static XAdESTSignature completeToXAdEST (XAdESBESSignature xadesBES, IDocument document) throws SignatureException, MalformedTimeStampException, ResponseTimeStampException, HashingException, XMLDocumentException  {
781 		try {
782 			return new XAdESTSignature (es.accv.arangi.base.signature.XAdESTSignature.completeToXAdEST (xadesBES, document, 
783 					ArangiUtil.getACCVCaList(), new URL (TimeStamp.URL_ACCV_TSA_SERVER)).getDOM());
784 		} catch (MalformedURLException e) {
785 			// No se va a dar, la URL de la tsa de la accv está bien formada
786 			return null;
787 		}
788 	}
789 	
790 	/**
791 	 * Comprueba que las firmas son correctas en firmas attached y sus certificados son válidos. Sólo
792 	 * serán validados los certificados tratados por Arangí.<br><br>
793 	 * 
794 	 * Sobre la validación de certificados hay que tener en cuenta:<br>
795 	 * <ul>
796 	 * 	<li>El sello de tiempos sólo será útil mientras el certificado 
797 	 *  no caduque. Después, al ser imposible obtener la información de revocación
798 	 *  para este certificado, este método devolverá siempre un resultado falso aunque el 
799 	 *  certificado fuera válido cuando se generó la firma .</li>
800 	 * </ul><br><br>
801 	 * 
802 	 * IMPORTANTE: este método sólo puede ser utilizado si la firma es attached (el documento
803 	 * que originó la firma se incluye en ésta). Si no es así utilizar el método con el mismo nombre 
804 	 * pero con el documento que originó la firma como parámetro.
805 	 * 
806 	 * @return Para cada certificado el resultado de comprobar si la firma es correcta y el certificado es
807 	 * 	válido
808 	 * @throws SignatureException Error tratando el objeto firma
809 	 */
810 	public ValidationResult[] isValid() throws SignatureException {
811 		
812 		return super.isValid (ArangiUtil.getACCVCaList());
813 	}
814 	
815 	/**
816 	 * Comprueba que las firmas son correctas y sus certificados son válidos. Sólo
817 	 * serán validados los certificados tratados por Arangí.<br><br> 
818 	 * 
819 	 * Sobre la validación de certificados hay que tener en cuenta:<br>
820 	 * <ul>
821 	 * 	<li>El sello de tiempos sólo será útil mientras el certificado 
822 	 *  no caduque. Después, al ser imposible obtener la información de revocación
823 	 *  para este certificado, este método devolverá siempre un resultado falso aunque el 
824 	 *  certificado fuera válido cuando se generó la firma .</li>
825 	 * </ul>
826 	 * 
827 	 * @param document documento firmado en el XAdES-T.
828 	 * @return Para cada certificado resultado de comprobar si la firma es correcta y el certificado es
829 	 * 	válido
830 	 * @throws SignatureException Error tratando el objeto firma
831 	 */
832 	public ValidationResult[] isValid(IDocument document) throws SignatureException {
833 		
834 		return super.isValid (document, ArangiUtil.getACCVCaList());
835 	}
836 
837 	
838 }