Firma electrónica manuscrita (StepOver) - II Encuentro nacional sobre firma y...
2015 10 - Curso Cliente @firma INAP día 2
1. Módulo 2:
Usando el Cliente @firma
Presentación
Ministerio de Hacienda y Administraciones Públicas
2. AGENDA
La forja del Cliente @firma
Integración de los applets @firma
Despliegue y carga del MiniApplet
Uso de los applets @firma
Filtros de certificados
Uso del Cliente @firma por otras aplicaciones
Clases de interés
4. El proyecto Cliente @Firma está alojado en:
Forja del CTT
Descargas (Binarios, fuentes, documentación,…)
Repositorio SVN con el código del proyecto.
Foros
Listas de correo.
GitHub
Repositorio GIT con el código del proyecto
Los binarios se construyen mediante Maven.
El repositorio Maven con los artefactos se encuentra en los repositorios de la
Universidad Jaume I.
LA FORJA DEL CLIENTE @FIRMA
5. La construcción de los binarios del proyecto y el uso de estos por parte de
otros proyectos se realiza mediante Maven.
Pasos a seguir:
Descargarse los proyectos desde uno de los repositorios:
El SVN del CTT.
GitHub.
Construir los binarios:
mvn clean install (podemos saltar los tests con –DskipTests)
Construir los proyectos Eclipse mediante Maven:
mvn eclipse:clean eclipse:eclipse
Importar los proyectos a Eclipse.
LA FORJA DEL CLIENTE @FIRMA
7. El proyecto Cliente @Firma cuenta en su suite de productos con dos
applets orientados a la realización de operaciones criptográficas:
Applet Cliente @firma.
MiniApplet @firma.
Los applets del Cliente @firma están orientados a ser integrados en un
flujo de trabajo web en el que realizarán las operaciones criptográficas
que requiere el sistema. Se deberá definir una:
Entrada de datos: Fichero en disco, datos cargados en memoria, datos en
servidor,…
Salida de datos: Fichero en disco, formulario web, servicio remoto,…
Las operaciones de los applets serán invocadas mediante llamadas
JavaScript desde la interfaz web.
INTRODUCCIÓN
8. APPLET CLIENTE @FIRMA
Applet cliente con todas las funcionalidades de @firma:
Firma/Multifirma de datos.
Operaciones automatizadas de firma masiva.
Cifrado simétrico de datos.
Generación de sobres electrónicos.
Acceso a distintos almacenes de certificados y claves.
Características:
Interfaces de entrada/salida unificadas para todas las operaciones.
Configuración en caliente de los almacenes de certificados.
Configuración por medio de fichero de propiedades JavaScript.
Sistema de filtros de certificados completamente configurables.
Solicitud de permisos para acceso a disco
Muy extendido:
Desplegado en cientos de organismos públicos.
9. MINIAPPLET @FIRMA
Applet cliente con funcionalidades de firma.
Funcionalidades:
Despliegue e integración simplificadas.
Ejecución asíncrona de las operaciones de firma.
Mejor sistema de tratamiento de errores.
Sistema de filtros de certificados simplificado.
Políticas de firma de la AGE preconfiguradas.
No dispone de funcionalidades de cifrado, generación de sobres digitales,
firma masiva integrada…
Despliegue compatible con el Cliente de firma móvil.
Gran estabilidad y fiabilidad.
10. Permite que aplicaciones web hagan uso de sus funcionalidades a través
de interfaces JavaScript.
Orientado a la integración en flujos de trabajo web:
Trámites web para usuarios.
Procedimientos internos (Portafirmas).
Compatibilidad dependiente del navegador web y su versión.
Sujeto a múltiples restricciones de seguridad en el entorno del usuario.
Necesitan estar firmados con un certificado de firma reconocido por el
sistema.
Configurables al compilar para:
Eliminar o agregar módulos.
Suspender la ofuscación de código.
CARACTERÍSTICAS DE LOS APPLETS
12. COMPONENTES DEL MINIAPPLET
El MiniApplet @firma está compuesto por:
Un applet Java con toda la funcionalidad criptográfica.
miniapplet-full_X_Y.jar
Una biblioteca JavaScript para el despliegue y uso del applet.
miniapplet.js
Servicios externos:
Servlet de firma trifásica.
afirma-server-triphase-signer.war
Servlets para la comunicación con aplicaciones nativa.
afirma-signature-retriever.war / afirma-signature-storage.war
Para desplegarlo todo basta un simple servidor de aplicaciones (Tomcat,
Jboss…)
13. DESPLIEGUE DEL MINIAPPLET MEDIANTE JAVASCRIPT
La biblioteca "miniapplet.js" contiene los métodos necesarios para la
carga y el uso del MiniApplet.
La invocación de los métodos del MiniApplet se realizará a partir del
objeto MiniApplet.
La invocación deberá realizarse en:
Un contexto JavaScript situado en el cuerpo del documento HTML.
Un evento de la página web.
Una función invocada desde cualquiera de los sitios anteriores.
14. DESPLIEGUE DEL MINIAPPLET MEDIANTE JAVASCRIPT
El método de carga del MiniApplet se encuentra en la biblioteca
JavaScript "miniapplet.js":
cargarMiniApplet(base, keystore)
base: Ruta de despliegue del MiniApplet.
keystore: Opcional. Almacén de certificados que debe cargarse.
Los almacenes de certificados disponibles están en "miniapplet.js":
MiniApplet.KEYSTORE_WINDOWS
MiniApplet.KEYSTORE_FIREFOX / KEYSTORE_MOZILLA
MiniApplet.KEYSTORE_APPLE
MiniApplet.KEYSTORE_PKCS12
Seguido de ':' y la ruta del almacén.
MiniApplet.KEYSTORE_PKCS11
Seguido de ':' y la ruta de la biblioteca PKCS#11.
MiniApplet.KEYSTORE_JAVA/KEYSTORE_JCEKS/KEYSTORE_JAVACE
15. COMPROBACIÓN DE CARGA
El MiniApplet incorpora el método echo() que sólo muestra información
del sistema, no requiere interacción con el usuario y no puede firmar
cuando el applet se carga correctamente.
Resultado de la llamada a la función:
En caso de encontrarse cargado el applet devolverá una cadena con
información sobre el sistema.
En caso de que no se haya iniciado la carga del applet, por cualquier motivo,
el método echo() devolverá como resultado la cadena "Cliente
JavaScript".
En caso de producirse un error durante la llamada, se lanzará una excepción.
Se pueden realizar llamadas periódicas a este método a la espera de que
se obtenga un resultado distinto a "Cliente JavaScript".
16. CARGA DEL CLIENTE DE FIRMA NAVITO (AUTOFIRMA /
CLIENTE @FIRMA MÓVIL)
Cuando no es posible cargar el MiniApplet @firma el JavaScript de
despliegue delegará en una aplicación nativa la ejecución de las
operaciones de firma y guardado.
Motivos por los que no se podría ejecutar el applet:
Entornos de ejecución no compatible:
Google Chrome 45 (y superiores)
Google Android
Apple iOS
Denegación de permisos por parte del usuario.
No confianza en los certificados de firma.
Etc.
Las aplicaciones nativas compatibles son:
Cliente @firma móvil.
Autofirma.
17. CARGA DEL CLIENTE DE FIRMA NATIVO (AUTOFIRMA /
CLIENTE @FIRMA MÓVIL)
Es posible saltarse el intento de ejecución del MiniApplet @firma y lanzar
directamente la aplicación nativa mediante la función: :
cargarAppAfirma(base, keystore)
base: Ruta de despliegue del MiniApplet.
keystore: Opcional. Almacén de certificados que debe cargarse.
El parámetro keystore será obviado por el Cliente @firma móvil, en
donde se cargará el almacén disponible para su sistema.
La invocación de Autofirma por parte de los navegadores web pueden
implicar en mensaje de confirmación que el usuario deberá aceptar para
la ejecución de la aplicación.
Es responsabilidad de los integradores advertir a los usuarios de la
necesidad de tener instalada AutoFirma y que se permita su ejecución.
19. FUNCIONES DE OPERACIÓN
String sign(dataB64, algorithm, format, extraParams,
successCallback, errorCalback)
– Firma datos.
String coSign(signB64, dataB64, algorithm, format,
extraParams, successCallback, errorCalback)
– Cofirma una firma.
String counterSign(signB64, algorithm, format,
extraParams, successCallback, errorCalback)
– Contrafirma una firma.
void signBatch(batchB64, preSignerUrl, postSignerUrl,
params , successCallback, errorCalback)
– Ejecuta un proceso de firma de lote.
boolean saveDataToFile(dataB64, title, filename,
extension, description)
– Guarda datos a disco.
20. FUNCIONES DE CONFIGURACIÓN
void setStickySignatory(sticky)
– Fija el certificado firmante.
void setServlets(storageServlet, retrieveServlet)
– Establece la ruta de los servicios de guardado y recuperación de
datos para la comunicación bidireccional con aplicaciones nativas.
void checkTime (checkType, maxMillis)
– Compara la hora local y la del sistema. Se puede notificar al usuario
que cambie la hora de su PC si existe un desfase e incluso impedir
la carga del applet si este existe.
void setLocale (locale)
– Establece la localización que se debe usar, para que el applet
muestre los mensajes en el idioma oportuno si los tiene disponibles.
21. FUNCIONES DE UTILIDAD
String getBase64FromText(plainText, charset)
– Codifica a base64.
String getTextFromBase64(base64Data, charset)
– Descodifica un base64.
String getFileNameContentBase64(title, extensions,
description)
– Carga un fichero. El resultado tiene la forma: path|base64
String[] getMultiFileNameContentBase64(title,
extensions, description)
– Carga múltiples ficheros. El resultado tiene la forma: path|base64
String getTextFromBase64(base64Data, charset)
– Descodifica un base64.
22. FUNCIONES DE COMPROBACIÓN DE ENTORNO
void echo()
– Muestra un mensaje por consola.
boolean isAndroid()
– Indica si el sistema operativo es Google Android.
boolean isIOS()
– Indica si el sistema operativo es Apple iOS.
23. FUNCIONES DE GESTIÓN DE ERRORES Y DEPURACIÓN
String getErrorType()
– Recupera el tipo de error producido.
String getErrorMessage()
– Recupera el texto descriptivo del error.
String getCurrentLog()
– Obtiene las trazas de ejecución de la aplicación.
Ejemplo de gestión de errores:
var resultField = document.getElementById("b64signature");
try {
var plainText = document.getElementById("plaintext").value;
var dataB64 = MiniApplet.getBase64FromText(plainText, "UTF-8");
var signature = MiniApplet.sign(dataB64, "SHA1withRSA", "CAdES",
"mode=implicitnexpPolicy=FirmaAGE");
resultField.value = signature;
} catch(e) {
if (MiniApplet.getErrorType() != "es.gob.afirma.core.AOCancelledOperationException") {
resultField.value = MiniApplet.getErrorMessage();
} else {
alert("Error:n" + MiniApplet.getCurrentLog());
}
}
24. MINIAPPLET VS APPLET CLIENTE
El almacén de certificados sólo puede modificarse durante la carga.
Todos las opciones de configuración de una operación se proporcionan
como parámetros de la función que la ejecuta.
El resultado de las operaciones se obtiene como valor de retorno de la
operación o a través de una función callback.
Siempre se opera sobre datos en memoria.
Cualquier selección de fichero (carga o guardado) debe realizarla el
usuario.
Sistema de filtro de certificados predefinidos.
Expansión de variables de configuración.
La gestión de errores se realiza mediante excepciones o funciones
callback.
26. FILTROS DE CERTIFICADOS
El MiniApplet incluye filtros preconfigurados que permiten filtrar los
certificados por diversos criterios.
Los filtros se configuran a través de las siguientes propiedades que se
pueden agregar a los extraParams de una operación de firma:
filter ó filters
Establece el listado completo de filtros que debe cumplir cada certificado para
aparecer en el diálogo de selección.
Los distintos filtros se concatenan con el carácter punto y coma (';').
filters.X
X es un número la serie de números naturales (empezando en 1).
Cada propiedad establece uno de los posibles listados de filtros que debe cumplir
un certificado para aparecer en el diálogo de selección.
Basta con cumplir los filtros de un listado para aparecer.
Para evitar que se muestre el diálogo de selección cuando sólo haya un
certificado que mostrar se puede incluir la propiedad headless con el
valor true.
27. FILTROS DE CERTIFICADOS
Los filtros actualmente soportados por el MiniApplet son:
nonexpired: Muestra sólo los certificados no caducados.
sscd: Muestra los certificados expedidos expresamente para tarjeta
inteligente.
thumbprint: Permite indicar en base 64 la huella digital del certificado que
se desea mostrar.
ssl: Permite establecer el SerialNumber en hexadecimal del certificado que
se desea mostrar.
qualified: Evolución del anterior que tendría en cuenta si el certificado es
de autenticación y hay uno de firma asociado.
dnie: Sólo mostrará los certificados de firma de DNIe.
signingcert: Muestra todos los certificados salvo el de autenticación del
DNIe.
authcert: Muestra todos los certificados salvo el de firma del DNIe.
28. FILTROS DE CERTIFICADOS
Más filtros:
Filtro por KeyUsage que permite establecer si los keyusages particulares del
certificado deben estar establecidos o no:
keyusage.digitalsignature
keyusage.nonrepudiation
keyusage.keyencipherment
keyusage.dataencipherment
keyusage.keyagreement
keyusage.keycertsign
keyusage.crlsign
keyusage.encipheronly
keyusage.decipheronly
29. FILTROS DE CERTIFICADOS
Más filtros:
subject.rfc2254: Establece un filtro según la RFC 2254 que debe cumplir
el Subject del certificado.
issuer.rfc2254: Establece un filtro según la RFC 2254 que debe cumplir
el Issuer del certificado.
subject.contains: Establece un texto que debe estar contenido en el
principal del subject del certificado.
Ignora mayúsculas y minúsculas.
issuer.contains: Establece un texto que debe estar contenido en el
principal del issuer del certificado.
Ignora mayúsculas y minúsculas.
30. FILTRO RFC2254
Filtros conforme al estándar RFC2254.
Implementados en el paquete: afirma-keystores-filters-rfc
Sintaxis:
Sentencias entre paréntesis.
Comprobación del valor de RDN con '=': (c=ES)
El comodín de cadenas es '*': (ou=Metro*)
Caracteres especiales con Unicode: (cn=*28FIRMA29*)
Negación con '!' delante de la expresión: (!(o=*FNMT*))
Condición conjuntiva con '&': (&(l=Madrid)(c=ES))
Condición disyuntiva con '|': (|(o=DIRECCION GENERAL DE LA
POLICIA)(o=FNMT))
32. FIRMA POR LOTES CON EL MINIAPPLET
Proceso de firma de múltiples datos como una única operación.
Se definen todos los datos sobre los que se deberá operar en el inicio de
la operación.
Operación única para el lote, pero configuración separada para cada
operación individual.
Está orientado a reducir en la medida de lo posible la interacción con el
usuario.
Especialmente útil cuando el origen y el destino de los datos es un
servidor remoto, con lo que se combina con la firma trifásica.
Permite trabajar con lotes completos de datos (se firma todo el lote o no
se firma nada, caso común en los portafirmas).
33. FIRMA POR LOTES CON EL MINIAPPLET
XML de ejemplo:
<?xml version="1.0" encoding="UTF-8"?>
<signbatch stoponerror="false" algorithm="SHA512withRSA">
<singlesign Id="1234">
<datasource>dataB64</datasource>
<format>CAdES</format>"
<suboperation>sign</suboperation>
<extraparams>extraParamsB64</extraparams>
<signsaver>
<class>es.gob.afirma.signers.batch.SignSaverFile</class>
<config>configB64</config>
</signsaver>
</singlesign>
…
</signbatch>
35. USO DEL CLIENTE @FIRMA POR OTRAS APLICACIONES
El Cliente @firma lo conforman por un conjunto de bibliotecas Java (en su
gran mayoría).
Las funcionalidades de estas bibliotecas (JAR) pueden ser usadas por
otras aplicaciones Java de escritorio o en servidor.
Podemos distinguir entre 2 casos principales cuando queremos utilizar el
Cliente @firma desde otra aplicación:
Aplicaciones construidas mediante Maven.
El resto de aplicaciones.
En las aplicaciones construidas con Maven podemos agregar los módulos
que nos interesen del Cliente @firma al pom.xml del nuevo proyecto.
En el resto de aplicaciones podemos agregar los JAR del proyecto que
deseemos como bibliotecas de la nueva herramienta.
36. USO DEL CLIENTE @FIRMA POR OTRAS APLICACIONES
En las aplicaciones maven agregaremos al pom.xml del proyecto:
Repositorio del que obtener los módulos:
<repositories>
<repository>
<id>uji</id>
<url>http://devel.uji.es/nexus/content/groups/public/</url>
</repository>
</repositories>
Listado de módulos:
<dependencies>
<dependency>
<groupId>es.gob.afirma</groupId>
<artifactId>id_modulo</artifactId>
</dependency>
…
</dependencies>
37. USO DEL CLIENTE @FIRMA POR OTRAS APLICACIONES
En las aplicaciones que no utilicen maven podremos utilizar directamente
los JAR de los módulos como bibliotecas del proyecto.
Si queremos simplificar, podemos agregar el JAR completo de una de las
aplicaciones construidas del Cliente @firma.
Applet Cliente @firma
Cuenta con todos los módulos cliente del proyecto.
MiniApplet @firma
Incluye los módulos de firma y acceso a los repositorios de claves.
StandAlone
Cuenta con todos los módulos del proyecto, excepto filtros de certificados.
AutoFirma
Incluye los módulos de firma y acceso a los repositorios de claves , excepto filtros
de certificados.
Los applets se distribuyen ofuscados para reducir su tamaño, por lo que será
necesario compilarlos omitiendo la operación de ofuscación.
39. ACCESO A ALMACENES DE CLAVES Y CERTIFICADOS
Módulos relevantes:
afirma-core-keystores
Acceso a los almacenes de claves de Windows y Mac OS X, almacenes PKCS#12
y JKS y tarjetas (PKCS#11).
afirma-keystores-mozilla
Acceso al almacén de Mozilla Firefox.
jmulticard-jse
Uso del DNIe sin drivers.
Clases principales para el uso de los almacenes y certificados:
es.gob.afirma.keystores.AOKeyStore
es.gob.afirma.keystores.AOKeyStoreManagerFactory
es.gob.afirma.keystores.AOKeyStoreManager
es.gob.afirma.keystores.filters.CertificateFilter
40. AOKeyStore
Enumerado con comportamiento y los almacenes de certificados
soportados por el módulo.
Contiene los valores:
WINDOWS
APPLE
MOZ_UNI
PKCS12
JAVA
PKCS11
Contiene los métodos relevantes:
PasswordCallback getStorePasswordCallback(Object parent)
PasswordCallback getCertificatePasswordCallback(Object
parent)
41. AOKeyStoreManagerFactory
Factoría para la obtención de los manejadores de para cada uno de los
almacenes de certificados.
Método para la obtención del manejador:
static AOKeyStoreManager getAOKeyStoreManager(AOKeyStore store, String lib,
String description, PasswordCallback pssCallback, Object parentComponent)
Ejemplo:
// Creamos el PasswordCallback para la obtencion de la contrasena
UIPasswordCallback psc = new UIPasswordCallback(
"Contraseu00F1a del almacén PKCS#12 seleccionado", this.parent);
// Obtenemos el manejador para un almacen en fichero local de tipo PKCS12
AOKeyStoreManager ksm = AOKeyStoreManagerFactory.getAOKeyStoreManager(
AOKeyStore.PKCS12,
"/ruta/almacen.pfx",
"Almacu00E9n PKCS#12 local",
psc,
this.parent);
42. AOKeyStoreManager
Manejador para la gestión de un almacén de certificados.
Métodos de interés:
String[] getAliases()
X509Certificate getCertificate(String alias)
X509Certificate[] getCertificateChain(String alias)
KeyStore.PrivateKeyEntry getKeyEntry(String alias)
void refresh()
Ejemplo:
// Recuperamos los alias y a partir del primero de ellos la referencia a
// clave privada
PrivateKeyEntry scKeyEntry = null;
String[] aliases = ksm.getAliases();
if (aliases.length > 0) {
scKeyEntry = ksm.getKeyEntry(aliases[0]);
}
43. CertificateFilter
Clase abstracta de la que debe heredar un filtro de certificados.
Existen varios filtros de certificados implementados:
– Filtros RFC2254.
– Filtros por KeyUsage.
– Filtro de certificado de firma del DNIe.
– Filtro de certificados SSCD.
– Filtro por número de serie del certificado.
– Filtro de certificados caducados.
– Etc.
Métodos que declara:
– boolean matches(X509Certificate cert)
– String[] matches(String[] aliases, AOKeyStoreManager ksm)
44. MÓDULOS DE FIRMA
Los módulos de firma incorporan al Cliente la compatibilidad con nuevos
formatos de firma electrónica.
Los manejadores de firma de estos módulos implementan la interfaz:
es.gob.afirma.core.signers.AOSigner
Existen manejadores para los formatos:
CAdES
ASiC-CAdES
XAdES
ASiC-XAdES
Factura-e
PAdES
ODF
OOXML
La gestión de los manejadores de firma se realiza a través de la
clase:
es.gob.afirma.core.signers.AOSignerFactory
46. AOSigner
Ejemplo de firma:
Ejemplo de cofirma:
// Instanciamos el manejador de firmas PAdES incluido en el módulo afirma-crypto-pdf
AOSigner signer = new AOPDFSigner();
if (!signer.isValidDataFile(data)) {
throw new IllegalArgumentException("No se ha introducido un documento PDF valido");
}
byte[] signedPDF = signer.sign(data, AOSignConstants.SIGN_ALGORITHM_SHA512WITHRSA, keyEntry.getPrivateKey(),
keyEntry.getCertificateChain(), null);
// Instanciamos el manejador de firmas CAdES incluido en los módulos afirma-crypto-cades y afirma-crypto-
cades-multi
AOSigner signer = new AOCAdESSigner();
if (!signer.isSign(data)) {
throw new IllegalArgumentException("No se ha introducido una firma CAdES valida");
}
if (signer.getData() == null) {
throw new IllegalArgumentException("La firma indicada no tiene los datos firmados incluidos");
}
byte[] cosignature = signer.cosign(data, AOSignConstants.SIGN_ALGORITHM_SHA512WITHRSA,
keyEntry.getPrivateKey(), keyEntry.getCertificateChain(), null);
47. AOSignerFactory
Factoría con la obtener los distintos módulos de firma:
– static AOSigner getSigner(String signFormat)
• Recupera el manejador de firma para un formato dado.
– static AOSigner getSigner(byte[] signData)
• Recupera el manejador de firma capaz de tratar firmas como la indicada.
Ejemplo:
byte[] cosignature = null;
// Cofirmamos en el mismo formato en el que esta firmada
AOSigner signer = AOSignerFactory.getSigner(signature);
if (signer != null) {
cosignature = signer.cosign(
signature, // Firma
AOSignConstants.SIGN_ALGORITHM_SHA1WITHRSA, // Algoritmo
pke.getPrivateKey(), // Referencia a la clave privada del certificado
pke.getCertificateChain(), // Cadena de certificacion
null // Propiedades extra de configuración
);
}
48. FUNCIONES DE UTILIDAD
En los módulos del Cliente se encuentran clases con funciones de utilidad
para las distintas operaciones que debe realizar.
Un integrador/desarrollador puede utilizarlas para integrar el Cliente a
bajo nivel, desarrollar nuevas funcionalidades o valerse de ellas para su
uso por una aplicación externa.
Las principales clases de utilidad son:
AOUtil
AOSignConstants
Base64
MimeHelper
AOUIFactory
49. AOUtil
Utilidades de uso general.
– static URI createURI(String file)
• Crea una URI a partir de una ruta (local o remota).
– static InputStream loadFile(URI uri)
• Abre un flujo de datos a partir de una URI.
– static byte[] getDataFromInputStream(InputStream input)
• Carga los datos de un flujo de datos de entrada.
– static boolean copyFile(File source, File dest)
• Copia el contenido de un fichero a otro.
– static String getCN(X509Certificate c)
• Obtiene el nombre común (o el más descriptivo) de un certificado.
– static String getCN(String principal)
• Obtiene el nombre común (o el más descriptivo) de un nombre X500.
50. AOSignConstants
Clase con constantes de firma:
– Nombres de formatos de firma
• SIGN_FORMAT_CADES, SIGN_FORMAT_FACTURAE, SIGN_FORMAT_PADES,
etc.
– Nombres de algoritmos de firma
• SIGN_ALGORITHM_SHA1WITHRSA, SIGN_ALGORITHM_SHA512WITHRSA, etc.
– Nombres de modos de firma
• SIGN_MODE_IMPLICIT / SIGN_MODE_EXPLICIT
– Nombre de operaciones masivas
• MASSIVE_OPERATION_SIGN, MASSIVE_OPERATION_COUNTERSIGN_LEAFS,
etc.
– Nombres de estructuras de firma
• CMS_CONTENTTYPE_SIGNEDDATA, CMS_CONTENTTYPE_ENVELOPEDDATA,
etc.
– Nombres de configuraciones por defecto
• DEFAULT_SIGN_FORMAT, DEFAULT_MASSIVE_OPERATION,
DEFAULT_CMS_CONTENTTYPE, etc.
51. AOBase64
Clase para la conversión de datos Base64:
– Conversión de datos a base 64
• static String encode(byte[] source )
– Decodificación de datos base 64
• static byte[] decode( String s )
Admite Base 64 "URL Safe".
Admite compresión de datos.
52. MimeHelper
Clase para la identificación de formatos de datos.
Métodos de interés:
– MimeHelper(byte[] data)
• Construye un objeto para el análisis de los datos.
– String getMimeType()
• Devuelve el MimeType de los datos.
– String getExtension()
• Recupera la extensión asidua para un fichero con este tipo de datos.
– static String transformMimeTypeToOid(String mimetype)
• Obtiene el OID asociado a un MimeType concreto.
– static String transformOidToMimeType(String oid)
• Obtiene el MimeType asociado a un OID concreto.
53. AOUIFactory
Factoría para la creación de interfaces gráficas.
Requiere del módulo "afirma-ui-core-jse" u otra implementación.
Los métodos principales son:
– static File getLoadFile(String dialogTitle, String
currentDir, String fileName, String[] extensions, String
description, boolean selectDirectory , boolean
multiSelect, Object icon, Object parent)
– static File getSaveDataToFile(byte[] data, String
dialogTitle, String currentDir, String fileName, File
selectedFile, String[] exts, String description, Object
parent)
– static char[] getPassword(String text, Object parent)