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