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