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