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.URL;
27  
28  import org.w3c.dom.Document;
29  
30  import es.accv.arangi.base.certificate.Certificate;
31  import es.accv.arangi.base.device.DeviceManager;
32  import es.accv.arangi.base.document.IDocument;
33  import es.accv.arangi.base.exception.device.LoadingObjectException;
34  import es.accv.arangi.base.exception.document.HashingException;
35  import es.accv.arangi.base.exception.signature.CounterSignatureException;
36  import es.accv.arangi.base.exception.signature.NoCoincidentDocumentException;
37  import es.accv.arangi.base.exception.signature.NoDocumentToSignException;
38  import es.accv.arangi.base.exception.signature.SignatureException;
39  import es.accv.arangi.base.exception.signature.SignatureNotFoundException;
40  import es.accv.arangi.base.exception.signature.XMLDocumentException;
41  import es.accv.arangi.base.signature.util.XAdESAttachedSignatureOptions;
42  import es.accv.arangi.base.signature.util.XAdESDataObjectFormat;
43  import es.accv.arangi.base.signature.util.XAdESDetachedSignatureOptions;
44  import es.accv.arangi.base.util.validation.ValidationResult;
45  import es.accv.arangi.device.ACCVDeviceManager;
46  import es.accv.arangi.util.ArangiUtil;
47  
48  /**
49   * Clase que maneja firmas en formato XAdES-BES de acuerdo al estándar 
50   * <a href="http://uri.etsi.org/01903/v1.3.2/ts_101903v010302p.pdf" target="etsi">
51   * ETSI TS 101 903</a><br><br>
52   * 
53   * Ejemplo de uso: <br><br>
54   * 
55   * <code> 
56   * KeyStoreManager manager = new KeyStoreManager (..., ...);<br>
57   * InputStreamDocument documentTexto = new InputStreamDocument (new FileInputStream (...));<br>
58   * InputStreamDocument documentXML = new InputStreamDocument (new FileInputStream (...));<br>
59   * File file = new File (...);<br>
60   * URL url = new URL (...);<br><br>
61   * 
62   * //-- Genera una firma attached. El documento se guardará en la firma en base64<br>
63   * XAdESBESSignature signature1 = XAdESBESSignature.signAttached(manager, documentTexto);<br><br>
64   * 
65   * //-- Genera una firma detached que referencia al fichero en disco<br>
66   * XAdESBESSignature signature2 = XAdESBESSignature.signDetached(manager, file);<br><br>
67   * 
68   * //-- Genera una firma detached que referencia a "2011/04/29/certificados/CER-2584665.pdf"<br>
69   * XAdESBESSignature signature3 = XAdESBESSignature.signDetached(manager, file, "2011/04/29/certificados/CER-2584665.pdf");<br><br>
70   * 
71   * //-- Genera una firma detached que referencia al fichero ubicado en la URL<br>
72   * XAdESBESSignature signature4 = XAdESBESSignature.signDetached(manager, url);<br><br>
73   * 
74   * //-- Genera una firma attached dentro del propio documento<br>
75   * XAdESBESSignature signature5 = XAdESBESSignature.signAttached(manager, documentoXML, "titulo", "documento");<br><br>
76   * </code>
77   * 
78   * @author <a href="mailto:jgutierrez@accv.es">José M Gutiérrez</a>
79   */
80  public class XAdESBESSignature extends es.accv.arangi.base.signature.XAdESBESSignature {
81  
82  	/**
83  	 * Construye el objeto en base a un XML que tiene el formato
84  	 * XAdES-BES
85  	 * 
86  	 * @param xmlDocument Documento XML
87  	 */
88  	public XAdESBESSignature(Document xmlDocument) {
89  		super(xmlDocument);
90  	}
91  
92  	/**
93  	 * Construye el objeto en base a un fichero XAdES-BES
94  	 * 
95  	 * @param xmlFile Fichero XAdES-BES
96  	 * @throws FileNotFoundException El fichero no existe
97  	 * @throws XMLDocumentException El fichero no parece un XML válido
98  	 */
99  	public XAdESBESSignature(File xmlFile) throws FileNotFoundException,
100 			XMLDocumentException {
101 		super(xmlFile);
102 	}
103 
104 	/**
105 	 * Construye el objeto en base a un array de bytes.
106 	 * 
107 	 * @param signature Firma XAdES-BES
108 	 * @throws XMLDocumentException El fichero no parece un XML válido
109 	 */
110 	public XAdESBESSignature(byte[] signature) throws XMLDocumentException {
111 		super(signature);
112 	}
113 
114 	/**
115 	 * Construye el objeto en base a un stream de lectura.
116 	 * 
117 	 * @param isSignature Firma XAdES-BES
118 	 * @throws XMLDocumentException El fichero no parece un XML válido
119 	 */
120 	public XAdESBESSignature(InputStream isSignature) throws XMLDocumentException {
121 		super(isSignature);
122 	}
123 
124 	/**
125 	 * Realiza una firma XAdES-BES detached (el fichero no se incluirá en la firma). No completa los campos 
126 	 * no obligatorios del tag 'SignedSignatureProperties':'signaturePolicyIdentifier', 
127 	 * 'signatureProductionPlace' y 'signerRole'.<br><br>
128 	 * 
129 	 * @param manager Dispositivo criptográfico que realizará la firma
130 	 * @param document Fichero a firmar
131 	 * @return Firma XADES-BES
132 	 * @throws LoadingObjectException No ha sido posible cargar la clave privada o el certificado usados
133 	 *  para realizar la firma
134 	 * @throws SignatureException No se puede realizar la firma
135 	 * @throws NoDocumentToSignException El fichero a firmar no existe o es nulo
136 	 * @deprecated Usar {@link #signDetached(DeviceManager,IDocument,String,XAdESDetachedSignatureOptions) signDetached}
137 	 */
138 	public static XAdESBESSignature signDetached (ACCVDeviceManager manager, File document) throws LoadingObjectException, SignatureException, NoDocumentToSignException {
139 		
140 		return signDetached(manager, document, null, null, null);
141 		
142 	}
143 	
144 	/**
145 	 * Realiza una firma XAdES-BES detached (el fichero no se incluirá en la firma). No completa los campos 
146 	 * no obligatorios del tag 'SignedSignatureProperties':'signaturePolicyIdentifier' y
147 	 * 'signatureProductionPlace'.<br><br>
148 	 * 
149 	 * @param manager Dispositivo criptográfico que realizará la firma
150 	 * @param document Fichero a firmar
151 	 * @param digitalSignatureAlgorithm Algoritmo de firma (si nulo algoritmo por defecto)
152 	 * @param dof Información para construir el tag DataObjectFormat (puede ser null)
153 	 * @param claimedRoles Roles de la firma (puede ser null)
154 	 * @return Firma XADES-BES
155 	 * @throws LoadingObjectException No ha sido posible cargar la clave privada o el certificado usados
156 	 *  para realizar la firma
157 	 * @throws SignatureException No se puede realizar la firma
158 	 * @throws NoDocumentToSignException El fichero a firmar no existe o es nulo
159 	 * @deprecated Usar {@link #signDetached(DeviceManager,IDocument,String,XAdESDetachedSignatureOptions) signDetached}
160 	 */
161 	public static XAdESBESSignature signDetached (ACCVDeviceManager manager, File document, String digitalSignatureAlgorithm, XAdESDataObjectFormat dof, String[] claimedRoles) throws LoadingObjectException, SignatureException, NoDocumentToSignException {
162 		
163 		return new XAdESBESSignature (es.accv.arangi.base.signature.XAdESBESSignature.signDetached((DeviceManager)manager, manager.getSignatureAlias(), document, digitalSignatureAlgorithm, dof, claimedRoles).getDOM());
164 		
165 	}
166 	
167 	/**
168 	 * Realiza una firma XAdES-BES detached (el fichero no se incluirá en la firma). No completa los campos 
169 	 * no obligatorios del tag 'SignedSignatureProperties':'signaturePolicyIdentifier', 
170 	 * 'signatureProductionPlace' y 'signerRole'.<br><br>
171 	 * 
172 	 * @param manager Dispositivo criptográfico que realizará la firma
173 	 * @param urlDocument Documento a firmar. Se encuentra en una URL accesible.
174 	 * @return Firma XADES-BES
175 	 * @throws LoadingObjectException No ha sido posible cargar la clave privada o el certificado usados
176 	 *  para realizar la firma
177 	 * @throws SignatureException No se puede realizar la firma
178 	 * @throws NoDocumentToSignException La URL es nula o no existe
179 	 * @deprecated Usar {@link #signDetached(DeviceManager,IDocument,String,XAdESDetachedSignatureOptions) signDetached}
180 	 */
181 	public static XAdESBESSignature signDetached (ACCVDeviceManager manager, URL urlDocument) throws LoadingObjectException, SignatureException, NoDocumentToSignException {
182 		
183 		return signDetached(manager, urlDocument, null, null, null);
184 
185 	}
186 	
187 	/**
188 	 * Realiza una firma XAdES-BES detached (el fichero no se incluirá en la firma). No completa los campos 
189 	 * no obligatorios del tag 'SignedSignatureProperties':'signaturePolicyIdentifier', 
190 	 * 'signatureProductionPlace' y 'signerRole'.<br><br>
191 	 * 
192 	 * @param manager Dispositivo criptográfico que realizará la firma
193 	 * @param urlDocument Documento a firmar. Se encuentra en una URL accesible.
194 	 * @param digitalSignatureAlgorithm Algoritmo de firma (si nulo algoritmo por defecto)
195 	 * @param dof Información para construir el tag DataObjectFormat (puede ser null)
196 	 * @param claimedRoles Roles de la firma (puede ser null)
197 	 * @return Firma XADES-BES
198 	 * @throws LoadingObjectException No ha sido posible cargar la clave privada o el certificado usados
199 	 *  para realizar la firma
200 	 * @throws SignatureException No se puede realizar la firma
201 	 * @throws NoDocumentToSignException La URL es nula o no existe
202 	 * @deprecated Usar {@link #signDetached(DeviceManager,IDocument,String,XAdESDetachedSignatureOptions) signDetached}
203 	 */
204 	public static XAdESBESSignature signDetached (ACCVDeviceManager manager, URL urlDocument, 
205 			String digitalSignatureAlgorithm, XAdESDataObjectFormat dof,
206 			String[] claimedRoles) throws LoadingObjectException, SignatureException, NoDocumentToSignException {
207 		
208 		return new XAdESBESSignature (es.accv.arangi.base.signature.XAdESBESSignature.signDetached((DeviceManager)manager, 
209 				manager.getSignatureAlias(), urlDocument, digitalSignatureAlgorithm, dof, claimedRoles).getDOM());
210 
211 	}
212 	
213 	/**
214 	 * Realiza una firma XAdES-BES detached (el fichero no se incluirá en la firma). No completa los campos 
215 	 * no obligatorios del tag 'SignedSignatureProperties':'signaturePolicyIdentifier', 
216 	 * 'signatureProductionPlace' y 'signerRole'.<br><br>
217 	 * 
218 	 * @param manager Dispositivo criptográfico que realizará la firma
219 	 * @param document Contenido a firmar
220 	 * @param reference Referencia al documento a firmar (se incluirá en el XAdES-BES). Ej. Path al documento dentro de un gestor documental.
221 	 * @return Firma XADES-BES
222 	 * @throws LoadingObjectException No ha sido posible cargar la clave privada o el certificado usados
223 	 *  para realizar la firma
224 	 * @throws SignatureException No se puede realizar la firma
225 	 * @deprecated Usar {@link #signDetached(DeviceManager,IDocument,String,XAdESDetachedSignatureOptions) signDetached}
226 	 */
227 	public static XAdESBESSignature signDetached (ACCVDeviceManager manager, IDocument document, String reference) throws LoadingObjectException, SignatureException {
228 		
229 		return signDetached(manager, document, null, reference, null, null);
230 
231 	}
232 	
233 	/**
234 	 * Realiza una firma XAdES-BES detached (el fichero no se incluirá en la firma). No completa los campos 
235 	 * no obligatorios del tag 'SignedSignatureProperties':'signaturePolicyIdentifier', 
236 	 * 'signatureProductionPlace' y 'signerRole'.<br><br>
237 	 * 
238 	 * @param manager Dispositivo criptográfico que realizará la firma
239 	 * @param document Contenido a firmar
240 	 * @param digitalSignatureAlgorithm Algoritmo de firma (si nulo algoritmo por defecto)
241 	 * @param reference Referencia al documento a firmar (se incluirá en el XAdES-BES). Ej. Path al documento dentro de un gestor documental.
242 	 * @param dof Información para construir el tag DataObjectFormat (puede ser null)
243 	 * @param claimedRoles Roles de la firma (puede ser null)
244 	 * @return Firma XADES-BES
245 	 * @throws LoadingObjectException No ha sido posible cargar la clave privada o el certificado usados
246 	 *  para realizar la firma
247 	 * @throws SignatureException No se puede realizar la firma
248 	 * @deprecated Usar {@link #signDetached(DeviceManager,IDocument,String,XAdESDetachedSignatureOptions) signDetached}
249 	 */
250 	public static XAdESBESSignature signDetached (ACCVDeviceManager manager, IDocument document, 
251 			String digitalSignatureAlgorithm, String reference, XAdESDataObjectFormat dof, 
252 			String[] claimedRoles) throws LoadingObjectException, SignatureException {
253 		
254 		return new XAdESBESSignature (es.accv.arangi.base.signature.XAdESBESSignature.signDetached((DeviceManager)manager, 
255 				manager.getSignatureAlias(), document, digitalSignatureAlgorithm, reference, dof, claimedRoles).getDOM());
256 
257 	}
258 	
259 	/**
260 	 * Realiza una firma XAdES-BES detached (el fichero no se incluirá en la firma). 
261 	 * 
262 	 * @param manager Dispositivo criptográfico que realizará la firma
263 	 * @param document Contenido a firmar
264 	 * @param reference Referencia al documento a firmar (se incluirá en el XAdES-BES). Ej. Path al documento dentro de un gestor documental.
265 	 * @param options Opciones para la firma
266 	 * @return Firma XADES-BES
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 	 */
271 	public static XAdESBESSignature signDetached (ACCVDeviceManager manager, IDocument document, 
272 			String reference, XAdESDetachedSignatureOptions options) throws LoadingObjectException, SignatureException {
273 		
274 		return new XAdESBESSignature (es.accv.arangi.base.signature.XAdESBESSignature.signDetached((DeviceManager)manager, 
275 				manager.getSignatureAlias(), document, reference, options).getDOM());
276 
277 	}
278 	
279 	/**
280 	 * Realiza una firma XAdES-BES attached (el documento se incluye en la firma). No completa los campos no 
281 	 * obligatorios del tag 'SignedSignatureProperties':'signaturePolicyIdentifier', 'signatureProductionPlace' 
282 	 * y 'signerRole'.
283 	 * 
284 	 * Si el documento es un XML y los parámetros <code>idToSign</code> y <code>signatureParent</code>
285 	 * no son nulos la firma y los campos propios de XAdES se añadirán al XML. En caso contrario el fichero 
286 	 * XAdES resultante seguirá la plantilla de Arangí, por ejemplo:<br>
287 	 * <code>
288 	 * 	&lt;arangi-xades&gt;<br>
289 	 *  &nbsp;&nbsp;&lt;document&gt;...&lt;/document&gt;<br>
290 	 *  &nbsp;&nbsp;&lt;ds:Signature&gt;...&lt;/ds:Signature&gt;<br>
291 	 * 	&lt;/arangi-xades&gt;<br>
292 	 * </code>
293 	 * 
294 	 * @param manager Dispositivo criptográfico que realizará la firma
295 	 * @param document Documento a firmar
296 	 * @param idToSign Valor del atributo 'ID' que indica lo que se firmará dentro del documento. Si tiene 
297 	 *  valor nulo el XML de la firma tendrá el formato por defecto de las firmas XAdES de Arangí.
298 	 * @param signatureParent Nombre del tag que será el padre de los nodos de firma. Si tiene valor nulo
299 	 * 	la firma colgará del nodo raíz.
300 	 * @return Firma XADES-BES
301 	 * @throws XMLDocumentException Error montando el fichero XML
302 	 * @throws LoadingObjectException No ha sido posible cargar la clave privada o el certificado usados
303 	 *  para realizar la firma
304 	 * @throws SignatureException No se puede realizar la firma
305 	 * @deprecated Usar {@link #signAttached(DeviceManager,IDocument,XAdESAttachedSignatureOptions) signAttached}
306 	 */
307 	public static XAdESBESSignature signAttached (ACCVDeviceManager manager, IDocument document, String idToSign,
308 			String signatureParent) throws XMLDocumentException, LoadingObjectException, SignatureException  {
309 		
310 		return signAttached(manager, document, null, idToSign, signatureParent, null, null);
311 
312 	}
313 	
314 	/**
315 	 * Realiza una firma XAdES-BES attached (el documento se incluye en la firma). No completa los campos no 
316 	 * obligatorios del tag 'SignedSignatureProperties':'signaturePolicyIdentifier', 'signatureProductionPlace' 
317 	 * y 'signerRole'.
318 	 * 
319 	 * Si el documento es un XML y los parámetros <code>idToSign</code> y <code>signatureParent</code>
320 	 * no son nulos la firma y los campos propios de XAdES se añadirán al XML. En caso contrario el fichero 
321 	 * XAdES resultante seguirá la plantilla de Arangí, por ejemplo:<br>
322 	 * <code>
323 	 * 	&lt;arangi-xades&gt;<br>
324 	 *  &nbsp;&nbsp;&lt;document&gt;...&lt;/document&gt;<br>
325 	 *  &nbsp;&nbsp;&lt;ds:Signature&gt;...&lt;/ds:Signature&gt;<br>
326 	 * 	&lt;/arangi-xades&gt;<br>
327 	 * </code>
328 	 * 
329 	 * @param manager Dispositivo criptográfico que realizará la firma
330 	 * @param document Documento a firmar
331 	 * @param digitalSignatureAlgorithm Algoritmo de firma (si nulo algoritmo por defecto)
332 	 * @param idToSign Valor del atributo 'ID' que indica lo que se firmará dentro del documento. Si tiene 
333 	 *  valor nulo el XML de la firma tendrá el formato por defecto de las firmas XAdES de Arangí.
334 	 * @param signatureParent Nombre del tag que será el padre de los nodos de firma. Si tiene valor nulo
335 	 * 	la firma colgará del nodo raíz.
336 	 * @param dof Información para construir el tag DataObjectFormat (puede ser null)
337 	 * @param claimedRoles Roles de la firma (puede ser null)
338 	 * @return Firma XADES-BES
339 	 * @throws XMLDocumentException Error montando el fichero XML
340 	 * @throws LoadingObjectException No ha sido posible cargar la clave privada o el certificado usados
341 	 *  para realizar la firma
342 	 * @throws SignatureException No se puede realizar la firma
343 	 * @deprecated Usar {@link #signAttached(DeviceManager,IDocument,XAdESAttachedSignatureOptions) signAttached}
344 	 */
345 	public static XAdESBESSignature signAttached (ACCVDeviceManager manager, IDocument document, 
346 			String digitalSignatureAlgorithm, String idToSign,
347 			String signatureParent, XAdESDataObjectFormat dof, String[] claimedRoles) throws XMLDocumentException, LoadingObjectException, SignatureException  {
348 		
349 		return new XAdESBESSignature (es.accv.arangi.base.signature.XAdESBESSignature.signAttached((DeviceManager)manager, manager.getSignatureAlias(), 
350 				document, digitalSignatureAlgorithm, idToSign, signatureParent, dof, claimedRoles).getDOM());
351 
352 	}
353 	
354 	/**
355 	 * Realiza una firma XAdES-BES attached (el documento se incluye en la firma). No completa los campos no 
356 	 * obligatorios del tag 'SignedSignatureProperties':'signaturePolicyIdentifier', 'signatureProductionPlace' 
357 	 * y 'signerRole'.<br><br>
358 	 * 
359 	 * El fichero XAdES seguirá la plantilla de Arangí. Ejemplo:<br>
360 	 * <code>
361 	 * 	&lt;arangi-xades&gt;<br>
362 	 *  &nbsp;&nbsp;&lt;document&gt;...&lt;/document&gt;<br>
363 	 *  &nbsp;&nbsp;&lt;ds:Signature&gt;...&lt;/ds:Signature&gt;<br>
364 	 * 	&lt;/arangi-xades&gt;<br>
365 	 * </code>
366 	 * 
367 	 * @param manager Dispositivo criptográfico que realizará la firma
368 	 * @param document Documento a firmar
369 	 * @return Firma XADES-BES
370 	 * @throws XMLDocumentException Error montando el fichero XML
371 	 * @throws LoadingObjectException No ha sido posible cargar la clave privada o el certificado usados
372 	 *  para realizar la firma
373 	 * @throws SignatureException No se puede realizar la firma
374 	 * @deprecated Usar {@link #signAttached(DeviceManager,IDocument,XAdESAttachedSignatureOptions) signAttached}
375 	 */
376 	public static XAdESBESSignature signAttached (ACCVDeviceManager manager, IDocument document) throws XMLDocumentException, LoadingObjectException, SignatureException  {
377 		
378 		return signAttached(manager, document, (String)null, null);
379 		
380 	}
381 	
382 	/**
383 	 * Realiza una firma XAdES-BES attached (el documento se incluye en la firma). No completa los campos no 
384 	 * obligatorios del tag 'SignedSignatureProperties':'signaturePolicyIdentifier', 'signatureProductionPlace' 
385 	 * y 'signerRole'.<br><br>
386 	 * 
387 	 * El fichero XAdES seguirá la plantilla de Arangí. Ejemplo:<br>
388 	 * <code>
389 	 * 	&lt;arangi-xades&gt;<br>
390 	 *  &nbsp;&nbsp;&lt;document&gt;...&lt;/document&gt;<br>
391 	 *  &nbsp;&nbsp;&lt;ds:Signature&gt;...&lt;/ds:Signature&gt;<br>
392 	 * 	&lt;/arangi-xades&gt;<br>
393 	 * </code>
394 	 * 
395 	 * @param manager Dispositivo criptográfico que realizará la firma
396 	 * @param document Documento a firmar
397 	 * @param digitalSignatureAlgorithm Algoritmo de firma (si nulo algoritmo por defecto)
398 	 * @param dof Información para construir el tag DataObjectFormat (puede ser null)
399 	 * @param claimedRoles Roles de la firma (puede ser null)
400 	 * @return Firma XADES-BES
401 	 * @throws XMLDocumentException Error montando el fichero XML
402 	 * @throws LoadingObjectException No ha sido posible cargar la clave privada o el certificado usados
403 	 *  para realizar la firma
404 	 * @throws SignatureException No se puede realizar la firma
405 	 * @deprecated Usar {@link #signAttached(DeviceManager,IDocument,XAdESAttachedSignatureOptions) signAttached}
406 	 */
407 	public static XAdESBESSignature signAttached (ACCVDeviceManager manager, IDocument document, 
408 			String digitalSignatureAlgorithm, XAdESDataObjectFormat dof,
409 			String[] claimedRoles) throws XMLDocumentException, LoadingObjectException, SignatureException  {
410 		
411 		return new XAdESBESSignature (es.accv.arangi.base.signature.XAdESBESSignature.signAttached((DeviceManager)manager, 
412 				manager.getSignatureAlias(), document, digitalSignatureAlgorithm, dof, claimedRoles).getDOM());
413 		
414 	}
415 	
416 	/**
417 	 * Realiza una firma XAdES-BES attached (el fichero se incluirá en la firma). No completa los campos 
418 	 * no obligatorios del tag 'SignedSignatureProperties':'signaturePolicyIdentifier', 
419 	 * 'signatureProductionPlace' y 'signerRole'.<br><br>
420 	 * 
421 	 * @param manager Dispositivo criptográfico que realizará la firma
422 	 * @param document Fichero a firmar
423 	 * @return Firma XADES-BES
424 	 * @throws LoadingObjectException No ha sido posible cargar la clave privada o el certificado usados
425 	 *  para realizar la firma
426 	 * @throws SignatureException No se puede realizar la firma
427 	 * @throws NoDocumentToSignException El fichero a firmar no existe o es nulo
428 	 * @throws XMLDocumentException Error montando el fichero XML
429 	 * @deprecated Usar {@link #signAttached(DeviceManager,IDocument,XAdESAttachedSignatureOptions) signAttached}
430 	 */
431 	public static XAdESBESSignature signAttached (ACCVDeviceManager manager, File document) throws LoadingObjectException, SignatureException, NoDocumentToSignException, XMLDocumentException {
432 		
433 		return signAttached(manager, document, null, null, null);
434 		
435 	}	
436 	
437 	/**
438 	 * Realiza una firma XAdES-BES attached (el fichero se incluirá en la firma). No completa los campos 
439 	 * no obligatorios del tag 'SignedSignatureProperties':'signaturePolicyIdentifier', 
440 	 * 'signatureProductionPlace' y 'signerRole'.<br><br>
441 	 * 
442 	 * @param manager Dispositivo criptográfico que realizará la firma
443 	 * @param document Fichero a firmar
444 	 * @param digitalSignatureAlgorithm Algoritmo de firma (si nulo algoritmo por defecto)
445 	 * @param dof Información para construir el tag DataObjectFormat (puede ser null)
446 	 * @param claimedRoles Roles de la firma (puede ser null)
447 	 * @return Firma XADES-BES
448 	 * @throws LoadingObjectException No ha sido posible cargar la clave privada o el certificado usados
449 	 *  para realizar la firma
450 	 * @throws SignatureException No se puede realizar la firma
451 	 * @throws NoDocumentToSignException El fichero a firmar no existe o es nulo
452 	 * @throws XMLDocumentException Error montando el fichero XML
453 	 * @deprecated Usar {@link #signAttached(DeviceManager,IDocument,XAdESAttachedSignatureOptions) signAttached}
454 	 */
455 	public static XAdESBESSignature signAttached (ACCVDeviceManager manager, File document, 
456 			String digitalSignatureAlgorithm, XAdESDataObjectFormat dof,
457 			String[] claimedRoles) throws LoadingObjectException, SignatureException, NoDocumentToSignException, XMLDocumentException {
458 		
459 		return new XAdESBESSignature (es.accv.arangi.base.signature.XAdESBESSignature.signAttached((DeviceManager)manager, 
460 				manager.getSignatureAlias(), document, digitalSignatureAlgorithm, dof, claimedRoles).getDOM());
461 		
462 	}	
463 	
464 	/**
465 	 * Realiza una firma XAdES-BES attached (el fichero se incluirá en la firma). No completa los campos 
466 	 * no obligatorios del tag 'SignedSignatureProperties':'signaturePolicyIdentifier', 
467 	 * 'signatureProductionPlace' y 'signerRole'.<br><br>
468 	 * 
469 	 * @param manager Dispositivo criptográfico que realizará la firma
470 	 * @param document Documento a firmar. Se encuentra en una URL accesible.
471 	 * @return Firma XADES-BES
472 	 * @throws LoadingObjectException No ha sido posible cargar la clave privada o el certificado usados
473 	 *  para realizar la firma
474 	 * @throws SignatureException No se puede realizar la firma
475 	 * @throws NoDocumentToSignException El fichero a firmar no existe o es nulo
476 	 * @throws XMLDocumentException Error montando el fichero XML
477 	 * @deprecated Usar {@link #signAttached(DeviceManager,IDocument,XAdESAttachedSignatureOptions) signAttached}
478 	 */
479 	public static XAdESBESSignature signAttached (ACCVDeviceManager manager, URL document) throws LoadingObjectException, SignatureException, NoDocumentToSignException, XMLDocumentException {
480 		
481 		return signAttached(manager, document, null, null, null);
482 		
483 	}
484 	
485 	/**
486 	 * Realiza una firma XAdES-BES attached (el fichero se incluirá en la firma). No completa los campos 
487 	 * no obligatorios del tag 'SignedSignatureProperties':'signaturePolicyIdentifier', 
488 	 * 'signatureProductionPlace' y 'signerRole'.<br><br>
489 	 * 
490 	 * @param manager Dispositivo criptográfico que realizará la firma
491 	 * @param document Documento a firmar. Se encuentra en una URL accesible.
492 	 * @param digitalSignatureAlgorithm Algoritmo de firma (si nulo algoritmo por defecto)
493 	 * @param dof Información para construir el tag DataObjectFormat (puede ser null)
494 	 * @param claimedRoles Roles de la firma (puede ser null)
495 	 * @return Firma XADES-BES
496 	 * @throws LoadingObjectException No ha sido posible cargar la clave privada o el certificado usados
497 	 *  para realizar la firma
498 	 * @throws SignatureException No se puede realizar la firma
499 	 * @throws NoDocumentToSignException El fichero a firmar no existe o es nulo
500 	 * @throws XMLDocumentException Error montando el fichero XML
501 	 * @deprecated Usar {@link #signAttached(DeviceManager,IDocument,XAdESAttachedSignatureOptions) signAttached}
502 	 */
503 	public static XAdESBESSignature signAttached (ACCVDeviceManager manager, URL document, 
504 			String digitalSignatureAlgorithm, XAdESDataObjectFormat dof,
505 			String[] claimedRoles) throws LoadingObjectException, SignatureException, NoDocumentToSignException, XMLDocumentException {
506 		
507 		return new XAdESBESSignature (es.accv.arangi.base.signature.XAdESBESSignature.signAttached((DeviceManager)manager, 
508 				manager.getSignatureAlias(), document, digitalSignatureAlgorithm, dof, claimedRoles).getDOM());
509 		
510 	}
511 	
512 	/**
513 	 * Realiza una firma XAdES-BES attached (el documento se incluye en la firma). 
514 	 * 
515 	 * @param manager Dispositivo criptográfico que realizará la firma
516 	 * @param document Documento a firmar
517 	 * @param options Opciones para la firma
518 	 * @return Firma XADES-BES
519 	 * @throws XMLDocumentException Error montando el fichero XML
520 	 * @throws LoadingObjectException No ha sido posible cargar la clave privada o el certificado usados
521 	 *  para realizar la firma
522 	 * @throws SignatureException No se puede realizar la firma
523 	 */
524 	public static XAdESBESSignature signAttached (ACCVDeviceManager manager, IDocument document, 
525 			XAdESAttachedSignatureOptions options) throws XMLDocumentException, LoadingObjectException, SignatureException  {
526 		
527 		return new XAdESBESSignature (es.accv.arangi.base.signature.XAdESBESSignature.signAttached((DeviceManager)manager, 
528 				manager.getSignatureAlias(), document, options).getDOM());
529 		
530 	}
531 	
532 	/**
533 	 * La definición de las contrafirmas en XAdES puede observarse en el punto 7.2.4
534 	 * del estándar de la ETSI.<br><br>
535 	 * 
536 	 * Este método realiza una contrafirma para la última firma del XAdES. Es útil 
537 	 * cuando se sabe que el XAdES contiene sólo una firma.<br><br>
538 	 * 
539 	 * Como resultado el XAdES a la que hace referencia este objeto se modificará 
540 	 * para añadir la contrafirma.
541 	 * 
542 	 * @param manager Dispositivo criptográfico que realizará la contrafirma
543 	 * @throws LoadingObjectException No es posible obtener la clave privada o el
544 	 * 	certificado del alias
545 	 * @throws CounterSignatureException Errores durante el proceso de contrafirma
546 	 */
547 	public void counterSign (ACCVDeviceManager manager) throws LoadingObjectException, CounterSignatureException {
548 		counterSign(manager, null, null);
549 	}
550 	
551 	/**
552 	 * La definición de las contrafirmas en XAdES puede observarse en el punto 7.2.4
553 	 * del estándar de la ETSI.<br><br>
554 	 * 
555 	 * Este método realiza una contrafirma para la firma cuyo certificado se pasa
556 	 * en el parámetro 'signatureToCounterSignCertificate'. Es útil cuando se quiere
557 	 * contrafirmar un XAdES que contiene varias firmas. Para saber qué firma se
558 	 * desea contrafirmar se puede llamar primero a 
559 	 * {@link #getCertificates() getCertificates} para ver los certificados de cada
560 	 * una de las firmas que contiene el XAdES.<br><br>
561 	 * 
562 	 * Como resultado el XAdES a la que hace referencia este objeto se modificará 
563 	 * para añadir la contrafirma.
564 	 * 
565 	 * @param manager Dispositivo criptográfico que realizará la contrafirma
566 	 * @param signatureToCounterSignCertificate Certificado de la firma que se 
567 	 * 	contrafirmará
568 	 * @param digitalSignatureAlgorithm Algoritmo de firma (si nulo algoritmo por defecto)
569 	 * @throws LoadingObjectException No es posible obtener la clave privada o el
570 	 * 	certificado del alias
571 	 * @throws CounterSignatureException Errores durante el proceso de contrafirma
572 	 */
573 	public void counterSign (ACCVDeviceManager manager, Certificate signatureToCounterSignCertificate,
574 			String digitalSignatureAlgorithm) throws LoadingObjectException, CounterSignatureException {
575 		
576 		counterSign((DeviceManager)manager, manager.getSignatureAlias(), signatureToCounterSignCertificate,
577 				digitalSignatureAlgorithm);
578 	
579 	}
580 	
581 	/**
582 	 * Añade una Cofirma a la firma XAdES-BES. Realizará una firma de las mismas características que 
583 	 * la primera que encuentre (attached o dettached).<br><br>
584 	 * 
585 	 * Si la firma es dettached i la referencia al documento que hay en la firma 
586 	 * no es una URL será necesario usar el método {@link #coSign(DeviceManager, String, IDocument)}
587 	 * al que le proporcionaremos este documento.  
588 	 * 
589 	 * @param manager Dispositivo criptográfico que realizará la cofirma
590 	 * @throws SignatureNotFoundException No existe ninguna firma que cofirmar
591 	 * @throws NoDocumentToSignException El fichero a firmar no existe o es nulo
592 	 * @throws HashingException Error realizando el hash del documento
593 	 * @throws LoadingObjectException No ha sido posible cargar la clave privada o el certificado usados
594 	 *  para realizar la firma
595 	 * @throws SignatureException No ha sido posible parsear la firma XAdES o no se puede realizar la cofirma
596 	 * @throws NoCoincidentDocumentException El documento que se quiere firmar no se corresponde con el de
597 	 * 	la firma XAdES  
598 	 */
599 	public void coSign (ACCVDeviceManager manager) throws SignatureNotFoundException, 
600 		NoDocumentToSignException, HashingException, LoadingObjectException, SignatureException, NoCoincidentDocumentException {
601 		
602 		coSign (manager, null, null);
603 	}
604 	
605 	
606 	/**
607 	 * Añade una Cofirma a la firma XAdES-BES. Realizará una firma de las mismas características que 
608 	 * la primera que encuentre (attached o dettached).<br><br>
609 	 * 
610 	 * Este método es útil si la firma es dettached i la referencia al documento que hay en la firma no
611 	 * es una URL.  
612 	 * 
613 	 * @param manager Dispositivo criptográfico que realizará la cofirma
614 	 * @param signedDoc contenido a firmar. El mismo utilizado en la generación de las otras firmas.
615 	 * @param digitalSignatureAlgorithm Algoritmo de firma (si nulo algoritmo por defecto)
616 	 * @throws SignatureNotFoundException No existe ninguna firma que cofirmar
617 	 * @throws NoDocumentToSignException El fichero a firmar no existe o es nulo
618 	 * @throws HashingException Error realizando el hash del documento
619 	 * @throws LoadingObjectException No ha sido posible cargar la clave privada o el certificado usados
620 	 *  para realizar la firma
621 	 * @throws SignatureException No ha sido posible parsear la firma XAdES o no se puede realizar la cofirma
622 	 * @throws NoCoincidentDocumentException El documento que se quiere firmar no se corresponde con el de
623 	 * 	la firma XAdES  
624 	 */
625 	public void coSign (ACCVDeviceManager manager, IDocument signedDoc, String digitalSignatureAlgorithm) throws SignatureNotFoundException, 
626 		NoDocumentToSignException, HashingException, LoadingObjectException, SignatureException, NoCoincidentDocumentException {
627 		coSign ((DeviceManager)manager, manager.getSignatureAlias(), signedDoc, digitalSignatureAlgorithm);
628 	}
629 	
630 	
631 	/**
632 	 * Comprueba que las firmas son correctas en firmas attached y sus certificados son válidos. Sólo
633 	 * serán validados los certificados tratados por Arangí.<br><br>
634 	 * 
635 	 * IMPORTANTE: este método sólo puede ser utilizado si la firma es attached (el documento
636 	 * que originó la firma se incluye en ésta). Si no es así utilizar este mismo método pero 
637 	 * pasándole el documento que originó la firma.
638 	 * 
639 	 * @return Para cada certificado el resultado de comprobar si la firma es correcta y el certificado es
640 	 * 	válido
641 	 * @throws SignatureException Error tratando el objeto firma
642 	 */
643 	public ValidationResult[] isValid() throws SignatureException {
644 		
645 		return super.isValid (ArangiUtil.getACCVCaList());
646 	}
647 	
648 	/**
649 	 * Comprueba que las firmas son correctas y sus certificados son válidos.<br><br> 
650 	 * 
651 	 * @param document Documento documento firmado en el XAdES-BES.
652 	 * @return Para cada certificado el resultado de comprobar si la firma es correcta y el certificado es
653 	 * 	válido
654 	 * @throws SignatureException Error tratando el objeto firma
655 	 */
656 	public ValidationResult[] isValid(IDocument document) throws SignatureException {
657 		
658 		return super.isValid (document, ArangiUtil.getACCVCaList());
659 	}
660 
661 	
662 }