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 * <arangi-xades><br>
289 * <document>...</document><br>
290 * <ds:Signature>...</ds:Signature><br>
291 * </arangi-xades><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 * <arangi-xades><br>
324 * <document>...</document><br>
325 * <ds:Signature>...</ds:Signature><br>
326 * </arangi-xades><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 * <arangi-xades><br>
362 * <document>...</document><br>
363 * <ds:Signature>...</ds:Signature><br>
364 * </arangi-xades><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 * <arangi-xades><br>
390 * <document>...</document><br>
391 * <ds:Signature>...</ds:Signature><br>
392 * </arangi-xades><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 }