integración de sealsign bss en aplicaciones android

24
ElevenPaths, innovación radical y disruptiva en seguridad

Upload: elevenpaths

Post on 08-Aug-2015

80 views

Category:

Technology


0 download

TRANSCRIPT

ElevenPaths, innovación radical y disruptiva en seguridad

2015 © Telefonica Digital Identity & Privacy, S.L.U. All Rights Reserved. Página 2 de 24

CONTENIDOS

Introducción ................................................................................................................... 4

1 Tareas comunes .......................................................................................................... 5

1.1 Inclusión de Proxies de los Servicios Web ................................................................................ 5

1.2 Inclusión del Cliente SealSignBSSClientLibrary ......................................................................... 5

2 Actividad SealSignBSSPanel ......................................................................................... 6

2.1 Firma Biométrica ...................................................................................................................... 6

2.1.1 Inclusión del Panel de Firma ....................................................................................................... 6

2.1.2 Permisos de Acceso al Servicio Web SealSign ............................................................................ 6

2.1.3 Opciones de Configuración del Panel de Firma .......................................................................... 6

2.1.4 Inicio de la Firma ........................................................................................................................ 7

2.1.5 Fin de Firma ................................................................................................................................ 8

2.2 Verificación de Documentos Firmados ..................................................................................... 9

2.2.1 Captura de la Firma .................................................................................................................... 9

2.2.2 Verificación de la Firma ............................................................................................................ 10

2.3 Firma Biométrica Desconectada ............................................................................................. 11

2.3.1 Captura Desconectada Pasando el Documento como Extra .................................................... 11

2.3.2 Captura Desconectada Pasando el Documento mediante File Provider .................................. 12

2.3.3 Sincronización de la Firma con el Servidor ............................................................................... 13

2.4 Firma Biométrica con Document Provider (Documento en el Servidor) ................................ 14

2.4.1 Inicio de la Firma ...................................................................................................................... 14

3 Vista Personalizada SealSignBSSView ......................................................................... 16

3.1 Firma Biométrica .................................................................................................................... 16

3.1.1 Inclusión del Panel de Firma ..................................................................................................... 16

3.1.2 Permisos de Acceso al Servicio Web SealSign .......................................................................... 16

3.1.3 Registro de Eventos .................................................................................................................. 17

3.1.4 Establecer Fondo de Firma Transparente ................................................................................ 17

3.1.5 Borrar la Captura ...................................................................................................................... 17

3.1.6 Inicio de la Firma ...................................................................................................................... 17

3.1.7 Criptografía en Cliente.............................................................................................................. 18

3.1.8 Fin de Firma .............................................................................................................................. 18

3.2 Verificación de Documentos Firmados ................................................................................... 18

3.2.1 Captura de la Firma .................................................................................................................. 18

3.2.2 Verificación de la Firma ............................................................................................................ 19

3.3 Firma Biométrica Desconectada ............................................................................................. 20

3.3.1 Captura Desconectada ............................................................................................................. 20

3.3.2 Sincronización de la Firma con el Servidor ............................................................................... 20

2015 © Telefonica Digital Identity & Privacy, S.L.U. All Rights Reserved. Página 3 de 24

3.4 Firma Biométrica con Document Provider (Documento en el Servidor) ................................ 21

3.4.1 Inicio de la Firma ...................................................................................................................... 21

3.4.2 Criptografía en Cliente.............................................................................................................. 21

4 Integración de BioSigner para Android ....................................................................... 22

2015 © Telefonica Digital Identity & Privacy, S.L.U. All Rights Reserved. Página 4 de 24

1 Introducción

SealSign BSS (Biometric Signature Services) es un módulo dirigido a facilitar la integración de la firma manuscrita biométrica en aplicaciones corporativas. SealSign BSS expone su funcionalidad a través de Servicios Web basados en la tecnología WCF (Windows Communication Framework). Estos servicios pueden ser invocados por aplicaciones implementadas sobre la mayoría de las tecnologías del mercado.

Este documento recoge la descripción de dichos servicios así como ejemplos de desarrollo para ayudar a la integración de aplicaciones con el servidor de firma de SealSign.

Este documento no pretende ser un manual sobre los aspectos concretos de la firma electrónica sino un manual de referencia técnica, orientado al desarrollador, sobre cómo integrar SealSign BSS en Aplicaciones Android.

2015 © Telefonica Digital Identity & Privacy, S.L.U. All Rights Reserved. Página 5 de 24

2 Tareas comunes

2.1 Inclusión de Proxies de los Servicios Web

Para interactuar con la plataforma servidora se hace uso de la capa de servicios Web. El documento “SealSign BSS - Referencia de Servicios Web” detalla cada servicio y sus parámetros. Dentro del SDK de Android se incluyen las clases proxy necesarias generadas con la herramienta www.easywsdl.com. Estas clases se aportan como facilitador de la integración pero no son parte del SDK de SealSignDSS y, por lo tanto, no están soportadas.

Para incluir dichas clases en el proyecto hay que seguir los pasos indicados en el fichero readme.txt incluido. Se pueden consultar aspectos de integración de los proxies en http://easywsdl.com/Home/ Faq.

2.2 Inclusión del Cliente SealSignBSSClientLibrary

Para incluir las funciones de criptografía en el cliente de la plataforma es necesario añadir la librería SealSignBSSClientLibrary.jar en el directorio libs del proyecto:

2015 © Telefonica Digital Identity & Privacy, S.L.U. All Rights Reserved. Página 6 de 24

3 Actividad SealSignBSSPanel

3.1 Firma Biométrica

Se puede invocar al componente de firma de dos formas diferentes. Una mediante llamada a una actividad o bien mediante la incorporación de una vista personalizada. En este apartado se explica en detalle cómo integrar las llamadas a la actividad SealSignBSSPanel. La actividad se encarga de gestionar el interfaz de usuario de firma y la criptografía, simplificando la integración en el desarrollo.

3.1.1 Inclusión del Panel de Firma El panel de firma es una actividad incluida en la librería cliente. Para poder consumirla es necesario definir la actividad en el AndroidManifest.xml:

<activity android:name="es.smartaccess.sealsignbss.SealSignBSSPanel" android:theme="@style/Theme.Transparent"> </activity>

En este ejemplo se establece un fondo transparente para la actividad para no romper la experiencia de usuario ya que por defecto es opaco. Esto es opcional y se consigue mediante un tema (@style/Theme.Transparent en el ejemplo anterior). Sería necesario añadir el estilo al fichero styles.xml. Por ejemplo:

<style name="Theme.Transparent" parent="android:Theme">

<item name="android:windowIsTranslucent">true</item>

<item name="android:windowBackground">@android:color/transparent</item>

<item name="android:windowContentOverlay">@null</item>

<item name="android:windowNoTitle">true</item>

<item name="android:windowIsFloating">true</item>

<item name="android:backgroundDimEnabled">false</item>

</style>

3.1.2 Permisos de Acceso al Servicio Web SealSign Para poder acceder a los servicios Web de la plataforma es necesario que la aplicación Android tenga los permisos de acceso a red:

<uses-permission android:name="android.permission.INTERNET" />

Es importante tener en cuenta que las llamadas a servicios Web o cualquier conexión no puede hacerse dentro del hilo principal del interfaz de usuario, por lo que habrá que hacerlas desde otro hilo o dentro de una tarea asíncrona.

3.1.3 Opciones de Configuración del Panel de Firma A continuación se muestran las opciones de configuración del panel de firma que se pueden establecer mediante las propiedades del Intent de la actividad:

WIDTH_PORT: El ancho de la superficie de firma en modo normal (Portrait). Por defecto ocupará toda la pantalla.

HEIGHT_PORT: El alto de la superficie de firma en modo normal (Portrait). Por defecto ocupará toda la pantalla.

2015 © Telefonica Digital Identity & Privacy, S.L.U. All Rights Reserved. Página 7 de 24

WIDTH_LAND: El ancho de la superficie de firma en modo apaisado (Landscape). Por defecto ocupará toda la pantalla.

HEIGHT_LAND: El alto de la superficie de firma en modo apaisado (Landscape). Por defecto ocupará toda la pantalla.

BUTTON_UPPER_MARGIN: Margen superior de los botones con el borde de la región de firma. El valor por defecto es de 6 píxeles.

BUTTON_SIDE_MARGIN: Margen lateral de los botones con el borde de la región de firma. El valor por defecto es de 4 píxeles.

BOTTOM_MARGIN: Margen inferior de la región de firma con el borde de la pantalla. El valor por defecto es de 5 píxeles.

BUTTON_M_SAVE_TEXT: Texto que aparece en el botón de salvar firma. El valor por defecto es "Salvar".

BUTTON_M_CLEAR_TEXT: Texto que aparece en el botón de borrar firma. El valor por defecto es "Borrar".

DIALOG_TITLE_TEXT: Texto que aparece en la barra de título del dialogo que se abre mientras se salva la firma. El valor por defecto es "Salvando firma".

DIALOG_MSG_TEXT: Texto que aparece en el mensaje del dialogo que se abre mientras se salva la firma. El valor por defecto es "Por favor, espere...”.

DATE_TEXT: El texto que aparece en la parte de abajo de la zona de firma. Por defecto, se calcula a partir de la hora del sistema.

ETIQUETA_TEXT: Texto que aparece por encima de la superficie de firma. No tiene valor por defecto y no se muestra.

ETIQUETA_BOTTOM_PADDING: Margen inferior de la etiqueta. El valor por defecto es de 5 píxeles.

ETIQUETA_SIDE_PADDING: Margen lateral de la etiqueta. El valor por defecto es de 4 píxeles.

ETIQUETA_UPPER_PADDING: Margen superior de la etiqueta. El valor por defecto es de 6 píxeles.

ETIQUETA_SIZE_TEXT: Tamaño del texto de la etiqueta. El valor por defecto es de 16 píxeles.

TRANSPARENT_SIGNATURE: Fondo transparente en la imagen de la firma resultante. El valor por defecto es false.

3.1.4 Inicio de la Firma Para firmar biométricamente, se realizan los siguientes pasos:

1. Se notifica a la plataforma el documento a firmar.

2. Con los datos obtenidos del servidor (instancia y token de firma) se realiza la operación de fusión de datos biométricos y criptografía mediante la librería cliente SealSignBSSClientLibrary.

3. Se notifica el resultado de la operación a la plataforma para finalizar la operación de firma y componer el documento final.

Se notifica el inicio de firma a la plataforma servidora mediante la llamada al método BeginSignature. El servicio consumido es el /SealSignBSSService/BiometricSignatureServiceBasic.svc.

2015 © Telefonica Digital Identity & Privacy, S.L.U. All Rights Reserved. Página 8 de 24

Los valores retornados y la sintaxis del método se pueden consultar en el documento “SealSign BSS - Referencia de Servicios Web”:

byte[] documentBytes = null; InputStream fileStream = getAssets().open("sample.pdf"); int size = fileStream.available(); documentBytes = new byte[size]; fileStream.read(documentBytes); fileStream.close(); BSBBiometricSignatureParameters biometricParameters = new BSBBiometricSignatureParameters(); biometricParameters.imageParameters = new BSBBiometricImageParameters(); biometricParameters.imageParameters.autoSize = false; biometricParameters.imageParameters.height = 180; biometricParameters.imageParameters.width = 250; biometricParameters.imageParameters.offsetX = 100; biometricParameters.imageParameters.offsetY = 100; biometricParameters.imageParameters.onAllPages = true; biometricParameters.imageParameters.signatureVisible = true; BSBBiometricSignatureBeginResponseBasic beginResponse = service.BeginSignature(SignatureProfile.PDF, BiometricSignatureType.Default, "", "", es.sealsign.bss.BSBEnums.BiometricSignatureFlags.getStatusFlags("Default"), biometricParameters, es.sealsign.bss.BSBEnums.SignatureFlags.getStatusFlags("Default"), null, null, documentBytes); Intent myIntent = new Intent(MainPanelActivity.this, SealSignBSSPanel.class); myIntent.putExtra(SealSignBSSConstants.WIDTH_PORT, 500); // Default and max. value = 640 myIntent.putExtra(SealSignBSSConstants.HEIGHT_PORT, 400); // Default and max. value = 480 myIntent.putExtra(SealSignBSSConstants.WIDTH_LAND, 800); // Default and max. value = 640 myIntent.putExtra(SealSignBSSConstants.HEIGHT_LAND, 500); // Default and max. value = 480 myIntent.putExtra(SealSignBSSConstants.BUTTON_UPPER_MARGIN, 10); // Default value = 6 myIntent.putExtra(SealSignBSSConstants.BUTTON_SIDE_MARGIN, 10); // Default value = 4 myIntent.putExtra(SealSignBSSConstants.BOTTOM_MARGIN, 15); // Default value = 5 myIntent.putExtra(SealSignBSSConstants.BUTTON_M_SAVE_TEXT, "Save"); // Default value = "Salvar" myIntent.putExtra(SealSignBSSConstants.BUTTON_M_CLEAR_TEXT, "Clear"); // Default value = "Borrar" myIntent.putExtra(SealSignBSSConstants.DIALOG_TITLE_TEXT, "Saving signature"); // Default value = "Salvando firma" myIntent.putExtra(SealSignBSSConstants.DIALOG_MSG_TEXT, "Please wait..."); // Default value = "Por favor, espere..." myIntent.putExtra(SealSignBSSConstants.DATE_TEXT, new java.util.Date().toString()); myIntent.putExtra(SealSignBSSConstants.BIOMETRIC_INSTANCE, beginResponse.instance.toString()); myIntent.putExtra(SealSignBSSConstants.BIOMETRIC_STATE, beginResponse.biometricState); startActivityForResult(myIntent, 0);

3.1.5 Fin de Firma Se captura en el evento onActivityResult el resultado de la firma, obteniendo en caso de éxito el contexto biométrico que habrá que pasar de vuelta al servidor mediante el método EndSignature. Se

2015 © Telefonica Digital Identity & Privacy, S.L.U. All Rights Reserved. Página 9 de 24

notifica a la plataforma el fin de la firma y se obtiene el documento final. El servicio consumido es el /SealSignBSSService/BiometricSignatureServiceBasic.svc.

Los valores retornados y la sintaxis del método se pueden consultar en el documento “SealSign BSS - Referencia de Servicios Web”:

super.onActivityResult(requestCode, resultCode, data); switch(requestCode) { case (0): if (resultCode == Activity.RESULT_OK) { final byte[] biometricState = data.getByteArrayExtra(SealSignBSSConstants.BIOMETRIC_STATE); final String instance = data.getStringExtra(SealSignBSSConstants.BIOMETRIC_INSTANCE); Thread t = new Thread() { public void run() { try { byte[] signedDocument = service.EndSignature(UUID.fromString(instance), biometricState); File signedFile = new File(MainPanelActivity.this.getFilesDir(), "sample.pdf.signed.pdf"); FileOutputStream signedStream = new FileOutputStream(signedFile.getPath()); signedStream.write(signedDocument); signedStream.close(); } catch (Exception e) { e.printStackTrace(); } } }; t.start(); }

break;

3.2 Verificación de Documentos Firmados

3.2.1 Captura de la Firma Para verificar una firma biométricamente, se realizan los siguientes pasos:

1. Se obtienen los datos biométricos y la instancia temporal mediante la librería cliente SealSignBSSClientLibrary.

2. Se notifica el resultado de la operación a la plataforma para realizar la operación de verificación y obtener el resultado final.

La obtención de los datos biométricos temporales para verificar se realiza de forma parecida al inicio de firma salvo que no se dispone de un token biométrico ni instancia del servidor. Sera necesario pasar la instancia vacía “00000000-0000-0000-0000-000000000000” y un estado biométrico nulo en este caso:

Intent myIntent = new Intent(MainPanelActivity.this, SealSignBSSPanel.class);

2015 © Telefonica Digital Identity & Privacy, S.L.U. All Rights Reserved. Página 10 de 24

myIntent.putExtra(SealSignBSSConstants.WIDTH_PORT, 500); // Default and max. value = 640 myIntent.putExtra(SealSignBSSConstants.HEIGHT_PORT, 400); // Default and max. value = 480 myIntent.putExtra(SealSignBSSConstants.WIDTH_LAND, 800); // Default and max. value = 640 myIntent.putExtra(SealSignBSSConstants.HEIGHT_LAND, 500); // Default and max. value = 480 myIntent.putExtra(SealSignBSSConstants.BUTTON_UPPER_MARGIN, 10); // Default value = 6 myIntent.putExtra(SealSignBSSConstants.BUTTON_SIDE_MARGIN, 10); // Default value = 4 myIntent.putExtra(SealSignBSSConstants.BOTTOM_MARGIN, 15); // Default value = 5 myIntent.putExtra(SealSignBSSConstants.BUTTON_M_SAVE_TEXT, "Save"); // Default value = "Salvar" myIntent.putExtra(SealSignBSSConstants.BUTTON_M_CLEAR_TEXT, "Clear"); // Default value = "Borrar" myIntent.putExtra(SealSignBSSConstants.DIALOG_TITLE_TEXT, "Saving signature"); // Default value = "Salvando firma" myIntent.putExtra(SealSignBSSConstants.DIALOG_MSG_TEXT, "Please wait..."); // Default value = "Por favor, espere..." myIntent.putExtra(SealSignBSSConstants.DATE_TEXT, new java.util.Date().toString()); myIntent.putExtra(SealSignBSSConstants.BIOMETRIC_INSTANCE, "00000000-0000-0000-0000-000000000000"); myIntent.putExtra(SealSignBSSConstants.BIOMETRIC_STATE, (String)null); startActivityForResult(myIntent, 2);

3.2.2 Verificación de la Firma Para ello se realiza una única llamada al método Verify de la plataforma servidora. El servicio consumido es el /SealSignBSSService/BiometricSignatureServiceBasic.svc.

Los valores retornados y la sintaxis del método se pueden consultar en el documento “SealSign BSS - Referencia de Servicios Web”:

case (2): if (resultCode == Activity.RESULT_OK) { final byte[] biometricState = data.getByteArrayExtra(SealSignBSSConstants.BIOMETRIC_STATE); Thread t = new Thread() { public void run() { try { File signedFile = new File(MainPanelActivity.this.getFilesDir(), "sample.pdf.signed.pdf"); FileInputStream documentStream = new FileInputStream(signedFile); byte[] documentBytes = new byte[documentStream.available()]; documentStream.read(documentBytes); documentStream.close(); BSBBiometricSignatureVerification verificationRespone = service.Verify(SignatureProfile.PDF, BiometricSignatureType.Default, "", "", es.sealsign.bss.BSBEnums.BiometricVerificationFlags.getStatusFlags("Default"), null, biometricState, null, documentBytes); Log.i("SealSignBSSBackendSample", verificationRespone.result.toString()); } catch (Exception e) { e.printStackTrace(); }

2015 © Telefonica Digital Identity & Privacy, S.L.U. All Rights Reserved. Página 11 de 24

} }; t.start(); } break;

3.3 Firma Biométrica Desconectada

En algunos escenarios es posible que no haya conexión con el servidor de firma biométrica. SealSign permite realizar una firma preliminar para sincronizar con el servicio cuando el cliente vuelva a tener conexión. Es necesario disponer del documento en cliente para poder asociar de manera única la firma capturada con el mismo.

3.3.1 Captura Desconectada Pasando el Documento como Extra Mediante la llamada al panel de firma se realiza la obtención de los datos biométricos y la operación criptográfica. En lugar de los datos obtenidos del servicio en una llamada normal, se obtiene el token biométrico pasando el documento a firmar como parámetro. Posteriormente, se obtiene también la instancia temporal generada en cliente:

byte[] documentBytes = null; InputStream fileStream = getAssets().open("sample.pdf"); int size = fileStream.available(); documentBytes = new byte[size]; fileStream.read(documentBytes); fileStream.close(); Intent myIntent = new Intent(MainPanelActivity.this, SealSignBSSPanel.class); myIntent.putExtra(SealSignBSSConstants.WIDTH_PORT, 500); // Default and max. value = 640 myIntent.putExtra(SealSignBSSConstants.HEIGHT_PORT, 400); // Default and max. value = 480 myIntent.putExtra(SealSignBSSConstants.WIDTH_LAND, 800); // Default and max. value = 640 myIntent.putExtra(SealSignBSSConstants.HEIGHT_LAND, 500); // Default and max. value = 480 myIntent.putExtra(SealSignBSSConstants.BUTTON_UPPER_MARGIN, 10); // Default value = 6 myIntent.putExtra(SealSignBSSConstants.BUTTON_SIDE_MARGIN, 10); // Default value = 4 myIntent.putExtra(SealSignBSSConstants.BOTTOM_MARGIN, 15); // Default value = 5 myIntent.putExtra(SealSignBSSConstants.BUTTON_M_SAVE_TEXT, "Save"); // Default value = "Salvar" myIntent.putExtra(SealSignBSSConstants.BUTTON_M_CLEAR_TEXT, "Clear"); // Default value = "Borrar" myIntent.putExtra(SealSignBSSConstants.DIALOG_TITLE_TEXT, "Saving signature"); // Default value = "Salvando firma" myIntent.putExtra(SealSignBSSConstants.DIALOG_MSG_TEXT, "Please wait..."); // Default value = "Por favor, espere..." myIntent.putExtra(SealSignBSSConstants.DATE_TEXT, new java.util.Date().toString()); myIntent.putExtra(SealSignBSSConstants.BIOMETRIC_INSTANCE, "00000000-0000-0000-0000-000000000000"); myIntent.putExtra(SealSignBSSConstants.BIOMETRIC_STATE, (String)null); myIntent.putExtra(SealSignBSSConstants.BIOMETRIC_OFFLINE_DOCUMENT, documentBytes); startActivityForResult(myIntent, 3);

2015 © Telefonica Digital Identity & Privacy, S.L.U. All Rights Reserved. Página 12 de 24

3.3.2 Captura Desconectada Pasando el Documento mediante File Provider Es posible que algunos documentos excedan en tamaño el máximo permitido para pasar mediante extras. En este caso se da la posibilidad de utilizar un FileProvider para pasar el documento a firmar a la actividad.

Es necesario registrar el provider en el fichero AndroidManifest.xml:

<provider android:name="android.support.v4.content.FileProvider" android:authorities="es.elevenpaths.fileprovider" android:grantUriPermissions="true" android:exported="false"> <meta-data android:name="android.support.FILE_PROVIDER_PATHS" android:resource="@xml/filepaths" /> </provider>

Mediante la llamada al panel de firma se realiza la obtención de los datos biométricos y la operación criptográfica. En lugar de los datos obtenidos del servicio en una llamada normal, se obtiene el token biométrico pasando el documento a firmar como parámetro. Posteriormente, se obtiene también la instancia temporal generada en cliente:

byte[] documentBytes = null; InputStream fileStream = getAssets().open("big-sample.pdf"); int size = fileStream.available(); documentBytes = new byte[size]; fileStream.read(documentBytes); fileStream.close(); Intent myIntent = new Intent(MainPanelActivity.this, SealSignBSSPanel.class); myIntent.putExtra(SealSignBSSConstants.WIDTH_PORT, 500); // Default and max. value = 640 myIntent.putExtra(SealSignBSSConstants.HEIGHT_PORT, 400); // Default and max. value = 480 myIntent.putExtra(SealSignBSSConstants.WIDTH_LAND, 800); // Default and max. value = 640 myIntent.putExtra(SealSignBSSConstants.HEIGHT_LAND, 500); // Default and max. value = 480 myIntent.putExtra(SealSignBSSConstants.BUTTON_UPPER_MARGIN, 10); // Default value = 6 myIntent.putExtra(SealSignBSSConstants.BUTTON_SIDE_MARGIN, 10); // Default value = 4 myIntent.putExtra(SealSignBSSConstants.BOTTOM_MARGIN, 15); // Default value = 5 myIntent.putExtra(SealSignBSSConstants.BUTTON_M_SAVE_TEXT, "Save"); // Default value = "Salvar" myIntent.putExtra(SealSignBSSConstants.BUTTON_M_CLEAR_TEXT, "Clear"); // Default value = "Borrar" myIntent.putExtra(SealSignBSSConstants.DIALOG_TITLE_TEXT, "Saving signature"); // Default value = "Salvando firma" myIntent.putExtra(SealSignBSSConstants.DIALOG_MSG_TEXT, "Please wait..."); // Default value = "Por favor, espere..." myIntent.putExtra(SealSignBSSConstants.DATE_TEXT, new java.util.Date().toString()); myIntent.putExtra(SealSignBSSConstants.BIOMETRIC_INSTANCE, "00000000-0000-0000-0000-000000000000"); myIntent.putExtra(SealSignBSSConstants.BIOMETRIC_STATE, (String)null); File fileToShare = new File(getFilesDir() + File.separator + "export", "signingDocument.pdf"); fileToShare.delete(); fileToShare.getParentFile().mkdirs();

2015 © Telefonica Digital Identity & Privacy, S.L.U. All Rights Reserved. Página 13 de 24

fileToShare.createNewFile(); FileOutputStream fos = new FileOutputStream(fileToShare.getPath()); fos.write(documentBytes); fos.close(); Uri fileUri = FileProvider.getUriForFile(MainPanelActivity.this, "es.elevenpaths.fileprovider", fileToShare); myIntent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); myIntent.setDataAndType(fileUri, getContentResolver().getType(fileUri));

startActivityForResult(myIntent, 4);

3.3.3 Sincronización de la Firma con el Servidor Una vez reestablecida la comunicación con el servicio, será necesario sincronizar la firma o firmas generadas de forma desconectada para obtener el documento final incluyendo todos los elementos necesarios mediante la llamada al método SyncOfflineSignatures. El servicio consumido es el /SealSignBSSService/BiometricSignatureServiceBasic.svc:

if (resultCode == Activity.RESULT_OK) { final byte[] biometricState = data.getByteArrayExtra(SealSignBSSConstants.BIOMETRIC_STATE); final String instance = data.getStringExtra(SealSignBSSConstants.BIOMETRIC_INSTANCE); Thread t = new Thread() { public void run() { try { byte[] documentBytes = null; InputStream fileStream = getAssets().open("sample.pdf"); int size = fileStream.available(); documentBytes = new byte[size]; fileStream.read(documentBytes); fileStream.close(); BSBOfflineBiometricSignature offlineSignature = new BSBOfflineBiometricSignature(); offlineSignature.biometricSignatureType = BiometricSignatureType.Default; offlineSignature.id = ""; offlineSignature.account = ""; offlineSignature.biometricOptions = es.sealsign.bss.BSBEnums.BiometricSignatureFlags.getStatusFlags("Default"); offlineSignature.biometricParameters = null; offlineSignature.options = es.sealsign.bss.BSBEnums.SignatureFlags.getStatusFlags("Default"); offlineSignature.parameters = null; offlineSignature.instance = UUID.fromString(instance); offlineSignature.offlineBiometricState = biometricState; BSBArrayOfOfflineBiometricSignature offlineSignatures = new BSBArrayOfOfflineBiometricSignature(); offlineSignatures.add(offlineSignature); byte[] signedDocument = service.SyncOfflineSignatures(SignatureProfile.PDF, offlineSignatures, null, documentBytes); File signedFile = new File(MainPanelActivity.this.getFilesDir(), "sample.pdf.signed.pdf");

2015 © Telefonica Digital Identity & Privacy, S.L.U. All Rights Reserved. Página 14 de 24

FileOutputStream signedStream = new FileOutputStream(signedFile.getPath()); signedStream.write(signedDocument); signedStream.close(); } catch (Exception e) { e.printStackTrace(); } } }; t.start();

3.4 Firma Biométrica con Document Provider (Documento en el

Servidor)

El procedimiento de firma con un document provider es similar al de firma biométrica, con la diferencia de que el documento no tiene por qué estar en el cliente. En su lugar, se especifica una URI que el document provider utilizará para obtener el documento de un Backend documental en la parte servidora.

3.4.1 Inicio de la Firma Mediante la llamada al método BeginSignatureProvider se notifica el inicio de firma a la plataforma servidora. El servicio consumido es el /SealSignBSSService/BiometricSignatureService Basic.svc.

Los valores retornados y la sintaxis del método se pueden consultar en el documento “SealSign BSS - Referencia de Servicios Web”:

BSBBiometricSignatureBeginResponseBasic beginResponse = service.BeginSignatureProvider("", "", demoURI, null, null); Intent myIntent = new Intent(MainPanelActivity.this, SealSignBSSPanel.class); myIntent.putExtra(SealSignBSSConstants.WIDTH_PORT, 500); // Default and max. value = 640 myIntent.putExtra(SealSignBSSConstants.HEIGHT_PORT, 400); // Default and max. value = 480 myIntent.putExtra(SealSignBSSConstants.WIDTH_LAND, 800); // Default and max. value = 640 myIntent.putExtra(SealSignBSSConstants.HEIGHT_LAND, 500); // Default and max. value = 480 myIntent.putExtra(SealSignBSSConstants.BUTTON_UPPER_MARGIN, 10); // Default value = 6 myIntent.putExtra(SealSignBSSConstants.BUTTON_SIDE_MARGIN, 10); // Default value = 4 myIntent.putExtra(SealSignBSSConstants.BOTTOM_MARGIN, 15); // Default value = 5 myIntent.putExtra(SealSignBSSConstants.BUTTON_M_SAVE_TEXT, "Save"); // Default value = "Salvar" myIntent.putExtra(SealSignBSSConstants.BUTTON_M_CLEAR_TEXT, "Clear"); // Default value = "Borrar" myIntent.putExtra(SealSignBSSConstants.DIALOG_TITLE_TEXT, "Saving signature"); // Default value = "Salvando firma" myIntent.putExtra(SealSignBSSConstants.DIALOG_MSG_TEXT, "Please wait..."); // Default value = "Por favor, espere..." myIntent.putExtra(SealSignBSSConstants.DATE_TEXT, new java.util.Date().toString()); myIntent.putExtra(SealSignBSSConstants.BIOMETRIC_INSTANCE, beginResponse.instance.toString()); myIntent.putExtra(SealSignBSSConstants.BIOMETRIC_STATE, beginResponse.biometricState); startActivityForResult(myIntent, 1);

2015 © Telefonica Digital Identity & Privacy, S.L.U. All Rights Reserved. Página 15 de 24

3.4.1.1 Fin de la Firma Se notifica a la plataforma el fin de la firma. El servicio consumido es el /SealSignBSSService/Biometric SignatureServiceBasic.svc.

Los valores retornados y la sintaxis del método se pueden consultar en el documento “SealSign BSS - Referencia de Servicios Web”:

if (resultCode == Activity.RESULT_OK) { final byte[] biometricState = data.getByteArrayExtra(SealSignBSSConstants.BIOMETRIC_STATE); final String instance = data.getStringExtra(SealSignBSSConstants.BIOMETRIC_INSTANCE); Thread t = new Thread() { public void run() { try { service.EndSignatureProvider(UUID.fromString(instance), biometricState, demoURI, null, false); } catch (Exception e) { e.printStackTrace(); } } }; t.start(); } break;

2015 © Telefonica Digital Identity & Privacy, S.L.U. All Rights Reserved. Página 16 de 24

4 Vista Personalizada SealSignBSSView

4.1 Firma Biométrica

La integración de los procesos de firma en la aplicación utilizando la vista personalizada SealSignBSSView permite mayor flexibilidad en el tratamiento del interfaz de usuario y flujo de información. En cambio requiere completar el interfaz con los botones necesarios para llevar a cabo las acciones sobre la captura (limpiar panel, firmar, etc.).

4.1.1 Inclusión del Panel de Firma Para incluir el panel de firma en una aplicación se siguen los pasos de cualquier vista. En este ejemplo, se añade como parte de un LinearLayout

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="fill_parent" android:layout_height="fill_parent" android:orientation="vertical" tools:context="es.elevenpaths.sealsignbssbackendsample.MainPanelActivity" >

<Button android:id="@+id/signButton" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center" android:layout_marginTop="5dp" android:onClick="sign" android:text="Sign" /> <Button android:id="@+id/clearButton" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center" android:layout_marginTop="5dp" android:onClick="clear" android:text="Clear" /> <es.smartaccess.sealsignbss.SealSignBSSView android:id="@+id/signatureView" android:layout_width="fill_parent" android:layout_height="fill_parent" android:layout_marginBottom="5dp" android:layout_marginLeft="5dp" android:layout_marginRight="5dp" android:layout_marginTop="5dp" />

</LinearLayout>

4.1.2 Permisos de Acceso al Servicio Web SealSign Para poder acceder a los servicios Web de la plataforma es necesario que la aplicación Android tenga los permisos de acceso a red:

<uses-permission android:name="android.permission.INTERNET" />

2015 © Telefonica Digital Identity & Privacy, S.L.U. All Rights Reserved. Página 17 de 24

Es importante tener en cuenta que las llamadas a servicios Web o cualquier conexión no puede hacerse dentro del hilo principal del interfaz de usuario, por lo que habrá que hacerlas desde otro hilo o dentro de una tarea asíncrona.

4.1.3 Registro de Eventos Es posible recibir eventos del panel implementando el interfaz SealSignBSSEventListener. Los eventos que incluye el interfaz son:

void onSignatureCleared(): Se ha borrado la firma de la tableta.

void onSignatureStarted(): Ha comenzado la captura de firma y se ha tomado la primera muestra.

void onSignatureCanceled(): Se ha cancelado la captura.

SealSignBSSView signatureView = (SealSignBSSView)findViewById(R.id.signatureView); signatureView.setOnSealSignBSSEventListener(this)

4.1.4 Establecer Fondo de Firma Transparente La firma por defecto se muestra en la imagen sobre fondo blanco. Si en la representación gráfica es necesario que el fondo sea transparente, se puede utilizar el método setTransparentSignature:

SealSignBSSView signatureView = (SealSignBSSView)findViewById(R.id.signatureView); signatureView.setTransparentSignature(true);

4.1.5 Borrar la Captura Para reiniciar y borrar la captura realizada se puede llamar al método cleanSignature del panel de firma:

SealSignBSSView signatureView = (SealSignBSSView)findViewById(R.id.signatureView); signatureView.cleanSignature();

4.1.6 Inicio de la Firma Para firmar biométricamente, se realizan los siguientes pasos:

1. Se notifica a la plataforma el documento a firmar.

2. Con los datos obtenidos del servidor (instancia y token de firma) se realiza la operación de fusión de datos biométricos y criptografía mediante la utilización de la librería cliente SealSignBSSClientLibrary.

3. Se notifica el resultado de la operación a la plataforma para finalizar la operación de firma y componer el documento final.

4. Se notifica el inicio de firma a la plataforma servidora mediante la llamada al método BeginSignature. El servicio consumido es el /SealSignBSSService/BiometricSignatureService Basic.svc.

Los valores retornados y la sintaxis del método se pueden consultar en el documento “SealSign BSS - Referencia de Servicios Web”:

byte[] documentBytes = null; InputStream fileStream = getAssets().open("sample.pdf"); int size = fileStream.available(); documentBytes = new byte[size]; fileStream.read(documentBytes); fileStream.close();

2015 © Telefonica Digital Identity & Privacy, S.L.U. All Rights Reserved. Página 18 de 24

BSBBiometricSignatureParameters biometricParameters = new BSBBiometricSignatureParameters(); biometricParameters.imageParameters = new BSBBiometricImageParameters(); biometricParameters.imageParameters.autoSize = false; biometricParameters.imageParameters.height = 180; biometricParameters.imageParameters.width = 250; biometricParameters.imageParameters.offsetX = 100; biometricParameters.imageParameters.offsetY = 100; biometricParameters.imageParameters.onAllPages = true; biometricParameters.imageParameters.signatureVisible = true; BSBBiometricSignatureBeginResponseBasic beginResponse = service.BeginSignature(SignatureProfile.PDF, BiometricSignatureType.Default, "", "", es.sealsign.bss.BSBEnums.BiometricSignatureFlags.getStatusFlags("Default"), biometricParameters, es.sealsign.bss.BSBEnums.SignatureFlags.getStatusFlags("Default"), null, null, documentBytes);

4.1.7 Criptografía en Cliente Mediante la llamada al panel de firma se realiza la obtención de los datos biométricos y la operación criptográfica:

byte[] finalBiometricState = signatureView.getSignature(beginResponse.instance.toString(), beginResponse.biometricState);

4.1.8 Fin de Firma Se notifica a la plataforma el fin de la firma y se obtiene el documento final mediante el método EndSignature. Se notifica a la plataforma el fin de la firma y se obtiene el documento final. El servicio consumido es el /SealSignBSSService/BiometricSignatureServiceBasic.svc.

Los valores retornados y la sintaxis del método se pueden consultar en el documento “SealSign BSS - Referencia de Servicios Web”:

byte[] signedDocument = service.EndSignature(beginResponse.instance, finalBiometricState); File signedFile = new File(MainViewActivity.this.getFilesDir(), "sample.pdf.signed.pdf"); FileOutputStream signedStream = new FileOutputStream(signedFile.getPath()); signedStream.write(signedDocument); signedStream.close();

4.2 Verificación de Documentos Firmados

4.2.1 Captura de la Firma Para verificar una firma biométricamente, se realizan los siguientes pasos:

1. Se obtienen los datos biométricos y la instancia temporal mediante la librería cliente SealSignBSSClientLibrary.

2. Se notifica el resultado de la operación a la plataforma para realizar la operación de verificación y obtener el resultado final.

La obtención de los datos biométricos temporales para verificar se realiza de forma parecida al inicio de firma salvo que no disponemos de un token biométrico ni instancia del servidor. Sera necesario

2015 © Telefonica Digital Identity & Privacy, S.L.U. All Rights Reserved. Página 19 de 24

pasar la instancia vacía “00000000-0000-0000-0000-000000000000” y un estado biométrico nulo en este caso:

Intent myIntent = new Intent(MainPanelActivity.this, SealSignBSSPanel.class); myIntent.putExtra(SealSignBSSConstants.WIDTH_PORT, 500); // Default and max. value = 640 myIntent.putExtra(SealSignBSSConstants.HEIGHT_PORT, 400); // Default and max. value = 480 myIntent.putExtra(SealSignBSSConstants.WIDTH_LAND, 800); // Default and max. value = 640 myIntent.putExtra(SealSignBSSConstants.HEIGHT_LAND, 500); // Default and max. value = 480 myIntent.putExtra(SealSignBSSConstants.BUTTON_UPPER_MARGIN, 10); // Default value = 6 myIntent.putExtra(SealSignBSSConstants.BUTTON_SIDE_MARGIN, 10); // Default value = 4 myIntent.putExtra(SealSignBSSConstants.BOTTOM_MARGIN, 15); // Default value = 5 myIntent.putExtra(SealSignBSSConstants.BUTTON_M_SAVE_TEXT, "Save"); // Default value = "Salvar" myIntent.putExtra(SealSignBSSConstants.BUTTON_M_CLEAR_TEXT, "Clear"); // Default value = "Borrar" myIntent.putExtra(SealSignBSSConstants.DIALOG_TITLE_TEXT, "Saving signature"); // Default value = "Salvando firma" myIntent.putExtra(SealSignBSSConstants.DIALOG_MSG_TEXT, "Please wait..."); // Default value = "Por favor, espere..." myIntent.putExtra(SealSignBSSConstants.DATE_TEXT, new java.util.Date().toString()); myIntent.putExtra(SealSignBSSConstants.BIOMETRIC_INSTANCE, "00000000-0000-0000-0000-000000000000"); myIntent.putExtra(SealSignBSSConstants.BIOMETRIC_STATE, (String)null); startActivityForResult(myIntent, 2);

4.2.2 Verificación de la Firma Para ello se realiza una única llamada al método Verify de la plataforma servidora. El servicio consumido es el /SealSignBSSService/BiometricSignatureServiceBasic.svc.

Los valores retornados y la sintaxis del método se pueden consultar en el documento “SealSign BSS - Referencia de Servicios Web”:

File signedFile = new File(MainViewActivity.this.getFilesDir(), "sample.pdf.signed.pdf"); FileInputStream documentStream = new FileInputStream(signedFile); byte[] documentBytes = new byte[documentStream.available()]; documentStream.read(documentBytes); documentStream.close(); byte[] finalBiometricState = signatureView.getSignature("00000000-0000-0000-0000-000000000000", null); BSBBiometricSignatureVerification verificationRespone = service.Verify(SignatureProfile.PDF, BiometricSignatureType.Default, "", "", es.sealsign.bss.BSBEnums.BiometricVerificationFlags.getStatusFlags("Default"), null, finalBiometricState, null, documentBytes); Log.i("SealSignBSSBackendSample", verificationRespone.result.toString());

2015 © Telefonica Digital Identity & Privacy, S.L.U. All Rights Reserved. Página 20 de 24

4.3 Firma Biométrica Desconectada

En algunos escenarios es posible que no haya conexión con el servidor de firma biométrica. SealSign permite realizar una firma preliminar para sincronizar con el servicio cuando el cliente vuelva a tener conexión. Es necesario disponer del documento en cliente para poder asociar de manera única la firma capturada con el mismo.

4.3.1 Captura Desconectada Mediante la llamada al panel de firma se realiza la obtención de los datos biométricos y la operación criptográfica. En lugar de los datos obtenidos del servicio en una llamada normal, se obtiene el token biométrico pasando el documento a firmar como parámetro. Posteriormente, se obtiene también la instancia temporal generada en cliente:

byte[] documentBytes = null; InputStream fileStream = getAssets().open("sample.pdf"); int size = fileStream.available(); documentBytes = new byte[size]; fileStream.read(documentBytes); fileStream.close(); byte[] finalBiometricState = signatureView.getOfflineSignature(documentBytes); String instance = signatureView.getBiometricInstance();

4.3.2 Sincronización de la Firma con el Servidor Una vez reestablecida la comunicación con el servicio, será necesario sincronizar la firma o firmas generadas de forma desconectada para obtener el documento final incluyendo todos los elementos necesarios mediante la llamada al método SyncOfflineSignatures. El servicio consumido es el /SealSignBSSService/BiometricSignatureServiceBasic.svc:

BSBOfflineBiometricSignature offlineSignature = new BSBOfflineBiometricSignature(); offlineSignature.biometricSignatureType = BiometricSignatureType.Default; offlineSignature.id = ""; offlineSignature.account = ""; offlineSignature.biometricOptions = es.sealsign.bss.BSBEnums.BiometricSignatureFlags.getStatusFlags("Default"); offlineSignature.biometricParameters = null; offlineSignature.options = es.sealsign.bss.BSBEnums.SignatureFlags.getStatusFlags("Default"); offlineSignature.parameters = null; offlineSignature.instance = UUID.fromString(instance); offlineSignature.offlineBiometricState = finalBiometricState; BSBArrayOfOfflineBiometricSignature offlineSignatures = new BSBArrayOfOfflineBiometricSignature(); offlineSignatures.add(offlineSignature); byte[] signedDocument = service.SyncOfflineSignatures(SignatureProfile.PDF, offlineSignatures, null, documentBytes); File signedFile = new File(MainViewActivity.this.getFilesDir(), "sample.pdf.signed.pdf"); FileOutputStream signedStream = new FileOutputStream(signedFile.getPath()); signedStream.write(signedDocument); signedStream.close();

2015 © Telefonica Digital Identity & Privacy, S.L.U. All Rights Reserved. Página 21 de 24

4.4 Firma Biométrica con Document Provider (Documento en el

Servidor)

El procedimiento de firma con un document provider es similar al de firma biométrica, con la diferencia de que el documento no tiene por qué estar en el cliente. En su lugar, se especifica una URI que el document provider utilizará para obtener el documento de un Backend documental en la parte servidora.

4.4.1 Inicio de la Firma Mediante la llamada al método BeginSignatureProvider se notifica el inicio de firma a la plataforma servidora. El servicio consumido es el /SealSignBSSService/BiometricSignatureServiceBasic.svc.

Los valores retornados y la sintaxis del método se pueden consultar en el documento “SealSign BSS - Referencia de Servicios Web”:

BSBBiometricSignatureBeginResponseBasic beginResponse = service.BeginSignatureProvider("", "", demoURI, null, null);

4.4.2 Criptografía en Cliente Mediante la llamada al panel de firma se realiza la obtención de los datos biométricos y la operación criptográfica:

byte[] finalBiometricState = signatureView.getSignature(beginResponse.instance.toString(), beginResponse.biometricState);

4.4.2.1 Fin de la Firma Se notifica a la plataforma el fin de la firma. El servicio consumido es el /SealSignBSSService/Biometric SignatureServiceBasic.svc.

Los valores retornados y la sintaxis del método se pueden consultar en el documento “SealSign BSS - Referencia de Servicios Web”:

service.EndSignatureProvider(beginResponse.instance, finalBiometricState, demoURI, null, false);

2015 © Telefonica Digital Identity & Privacy, S.L.U. All Rights Reserved. Página 22 de 24

5 Integración de BioSigner para Android

La aplicación BioSigner para Android de ElevenPaths permite la firma biométrica de documentos electrónicos de diferentes formatos (PDF, Office, XML).

Esta aplicación puede ser invocada como un componente que realice la operación de firma desde una página web que se visualiza desde el navegador del dispositivo móvil. El documento a firmar en este modo debe poder ser accesible por el servidor SealSign y la lógica necesaria para recuperar el documento se implementa en los proveedores de documentos.

1. Instalar la aplicación BioSigner, en el dispositivo. A través de Google Play, localizar e instalar la aplicación “Mobile BioSigner” de ElevenPaths.

2. Crear una página web que invoque al componente de firma de BioSigner indicando los parámetros necesarios. La invocación de BioSigner desde una página web se realiza invocando a una URL especial que se ha registrado en el dispositivo al instalar la aplicación. La URL tiene la siguiente sintaxis: intent:#Intent;action=es.smartaccess.mobilebiosigner.SIGNFE;launchFlags=0x

10000000;component=es.smartaccess.mobilebiosigner/.MobileBioSignerFE;S.par

ametro1=valor;S.parametro2=valor;…;end

Los parámetros son:

a. viewerurl: Se abrirá dicha URL en un visor web por detrás de los campos de firma.

b. uri: Es el primer valor, se pasará al document provider del servidor para identificar el documento.

c. providerParameter: Es un valor opcional que se pasa al document provider del servidor con información adicional sobre el documento (p.e. metadatos asociados al documento).

d. serviceUrl: identifica la URL del servidor de SealSign Engine que se va a utilizar.

e. serviceUsername: Si se especifica. La conexión al servidor de firma se realizará con este usuario, en caso de no especificar este parámetro se realizará una conexión anónima.

f. servicePassword: Indica la contraseña que se utilizará en la conexión al servidor de firma SealSign en caso de especificar un nombre de usuario.

g. exitUrl: Especifica la URL de salida a la que se navegará después de la operación de firma.

Un ejemplo completo de integración con BioSigner podría ser este:

intent:#Intent;action=es.smartaccess.mobilebiosigner.SIGNFE;launchFlags=0x

10000000;component=es.smartaccess.mobilebiosigner/.MobileBioSignerFE;S.vie

werurl= http://www.smartaccess.es;S.uri= demo://1-2-z.pdf;S.exitUrl=

http://www.google.es;end

2015 © Telefonica Digital Identity & Privacy, S.L.U. All Rights Reserved. Página 23 de 24

6 Recursos

Para información acerca de los distintos servicios de SealSign puede accederse a esta dirección: https://www.elevenpaths.com/es/tecnologia/sealsign/index.html

Además en el blog de ElevenPaths es posible encontrar artículos interesantes y novedades acerca de este producto.

Puede encontrarse más información acerca de los productos de Eleven Paths en YouTube, en Vimeo y en Slideshare.

2015 © Telefonica Digital Identity & Privacy, S.L.U. All Rights Reserved. Página 24 de 24

La información contenida en el presente documento es propiedad de Telefónica Digital Identity & Privacy, S.L.U. (“TDI&P”) y/o de cualquier otra entidad dentro del Grupo Telefónica o sus licenciantes. TDI&P y/o cualquier compañía del Grupo Telefónica o los licenciantes de TDI&P se reservan todos los derechos de propiedad industrial e intelectual (incluida cualquier patente o copyright) que se deriven o recaigan sobre este documento, incluidos los derechos de diseño, producción, reproducción, uso y venta del mismo, salvo en el supuesto de que dichos derechos sean expresamente conferidos a terceros por escrito. La información contenida en el presente documento podrá ser objeto de modificación en cualquier momento sin necesidad de previo aviso.

La información contenida en el presente documento no podrá ser ni parcial ni totalmente copiada, distribuida, adaptada o reproducida en ningún soporte sin que medie el previo consentimiento por escrito por parte de TDI&P.

El presente documento tiene como único objetivo servir de soporte a su lector en el uso del producto o servicio descrito en el mismo. El lector se compromete y queda obligado a usar la información contenida en el mismo para su propio uso y no para ningún otro.

TDI&P no será responsable de ninguna pérdida o daño que se derive del uso de la información contenida en el presente documento o de cualquier error u omisión del documento o por el uso incorrecto del servicio o producto. El uso del producto o servicio descrito en el presente documento se regulará de acuerdo con lo establecido en los términos y condiciones aceptados por el usuario del mismo para su uso.

TDI&P y sus marcas (así como cualquier marca perteneciente al Grupo Telefónica) son marcas registradas. TDI&P y sus filiales se reservan todo los derechos sobre las mismas.

PUBLICACIÓN:

Junio 2015

En ElevenPaths pensamos de forma diferente cuando hablamos de seguridad. Liderados por Chema Alonso, somos un equipo de expertos con inquietud para replantearnos la industria y gran experiencia y conocimiento en el sector de la seguridad. Dedicamos toda nuestra experiencia y esfuerzos en crear productos innovadores para que la vida digital sea más segura para todos.

La evolución de las amenazas de seguridad en la tecnología es cada vez más rápida y constante. Por eso, desde junio de 2013, nos hemos constituido como una start-up dentro de Telefónica para trabajar de forma ágil y dinámica, y ser capaces de transformar el concepto de seguridad anticipándonos a los futuros problemas que afecten a nuestra identidad, privacidad y disponibilidad online.

Con sede en Madrid, estamos presentes también en Londres, EE.UU, Brasil, Argentina, y Colombia.

TIENES ALGO QUE CONTARNOS, PUEDES HACERLO EN:

elevenpaths.com Blog.elevenpaths.com @ElevenPaths Facebook.com/ElevenPaths YouTube.com/ElevenPaths