viernes, 15 de julio de 2016

Problemas de la librería "SmartcardIO" de Java

Hola a todos, hoy quiero hablar de los problemas de la librería SmarcardIO de Java.

   https://docs.oracle.com/javase/7/docs/jre/api/security/smartcardio/spec/javax/smartcardio/package-summary.html

En la empresa en la que trabajo tenemos un software que se comunica con las Smartcards mediante una librería de código nativo que llama a la librería PC/SC del sistema. Y en un momento dado hicimos el cambio para usar la librería "SmartcardIO" de forma que nuestra solución fuera "Java puro" y no requiriese de librerías de código nativo. Y ahí empezaron los problemas.

El primer problema que tuvimos que afrontar es el hecho de no tener un control de los "contextos". La librería SmartcardIO utiliza un sólo contexto para todas las llamadas, y eso da problemas cuando quieres trabajar con varios hilos en paralelo.

El segundo problema que encontramos es que el SmartcardIO, a pesar de forma parte de Java desde el Java 1.6, sólo está implementado en la JVM de Oracle (y la OpenJDK) y no está implementado en otras JVM como la de IBM.

Y para rematar, hoy me he dado cuenta de que cuando se llaman con varios hilos a operaciones sobre la Smart card, el hecho de intentar liberar una terja con "endExclusive" puede generar una excepción desde la Smart card SDCARD_W_RESETCARD:
  https://msdn.microsoft.com/es-es/library/windows/desktop/aa379477(v=vs.85).aspx

Tras lo cual hay que hacer una reconexión forzosamente, y la implemetación de SmartcardIO no contempla el "SCardReconnect".

El resultado de todo esto es que tenemos que hacer una "marcha atrás" y volver a la librería de códio nativo.

Salu2 a to2