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 }