Pre-informe / CC51B / Carlos Castillo (ChaTo)

El siguiente es un pre-informe sobre el tema JavaCard, para el curso Arquitectura de Computadores

La tecnología JavaCard tiene por objeto permitir el desarrollo de aplicaciones en Java que puedan ser usadas en tarjetas inteligentes.

Las principales complicaciones tienen que ver con lo limitado de los recursos de hardware.

Tarjetas inteligentes

Existen dos tipos básicos de tarjetas: unas son las tarjetas que simplemente tienen una banda magnética, y otras son las que incorporan un chip.

De estas últimas, existen a su vez dos subclases: las tarjetas de memoria y las tarjetas inteligentes. La diferencia es que el segundo tipo contiene un pequeño microprocesador para hacer calculos en los datos almacenados localmente.

Las tarjetas inteligentes consisten de una interfaz de comunicaciones, una memoria y una CPU. No poseen fuente de poder, teclado o pantalla.

Interfaz de comunicaciones

La interfaz de comunicaciones está hecha para comunicarse con un dispositivo que acepte tarjetas (CAD - Card Acceptance Device) a través de un conjunto de 8 pines.

El mecanismo de envío y recepción es a través de paquetes llamados APDU (Application Protocol Data Units).

La tarjeta sólo reacciona a los requerimientos de datos externos, nunca inicia por sí sola una comunicación.

CPU

Incluso con los grandes avances, las tarjetas inteligentes tienen CPUs de 8 bits, lentas y sin facilidades en hardware para multitasking ni memoria virtual. Esto representa para el programador encontrarse con un ambiente de hardware similar al que era el estándar 15 años atrás.

Memoria

Hay tres tipos de memoria en una tarjeta:

Memoria ROM

Es una memoria no-volátil, sólo de lectura, que contiene el código y los datos permanentes.

Memoria RAM

Es una memoria volátil y rápida. Se usa para mantener el stack y los datos temporales.

Memoria EEPROM

La memoria EEPROM es similar a la ROM, con la diferencia de que con algo de tiempo extra se puede re-escribir. Es una memoria lenta, pero persistente. A este nivel, cumple una función similar a la que tiene el disco duro en un computador normal.

Una gran limitación de la EEPROM es que sufre de desgaste y con la tecnología disponible un bit después de 100,000 escrituras o más deja de ser confiable.

Especificaciones para una JavaCard

Una JavaCard debe tener al menos:

La JavaCard Virtual Machine

La principal diferencia entre la JCVM y la JVM (Java Virtual Machine) es que en JavaCard la aplicación se ejecuta en parte en el CAD (host) y en parte en la tarjeta.

La parte de la ejecución que ocurre fuera de la tarjeta implica la preparación del programa en un JavaCard Converter, el cual hace el trabajo que tiene relación con preparar las clases, resolver referencias, etc. Es como un pre-procesador.

La segunda parte es la ejecución de los bytecodes (el assembler de Java) en la tarjeta.

Relación con Java

Lo que se pierde respecto a Java

Algunas de las cosas que se mantienen

Algo nuevo

El uso de un PIN (Personal Identification Number) es ampliamente usado en tarjetas inteligentes. Se provee de un PIN que debe ser ingresado por el usuario para evitar que alguien utilice una tarjeta robada.

Después de ingresar varias veces un PIN incorrecto, la JCVM entra en un estado halt del que solo puede salir si es llevada la tarjeta a la persona que emitió la tarjeta.

Limitaciones extra

Por eficiencia, se admite un máximo de 127 metodos en cada clase, incluyendo los metodos heredados. Además, no pueden haber más de 255 bytes en variables de instancia.

Uso del software para acomodarse al hardware

Aun cuando lo normal en Java es crear un nuevo objeto para varias operaciones, por ejemplo, para arrojar una excepción, en JavaCard dado que no hay recolección de basura y existe una buena posibilidad de quedarse sin memoria, se prefiere mas bien tener un objeto de cada clase e irlo cambiando durante la ejecución del programa.

Manejo de zonas criticas

Dado que existe una alta probabilidad de que una transacción quede a medio camino y por el uso normal (para manejo de dinero) que se hace de estas tarjetas, la integridad de los datos es un asunto crucial.

Para ello, existen las funciones System.beginTranscation() y System.commitTransaction(), junto a funciones de rollback incorporadas en la tarjeta que aseguran que una operación no sea interrumpida incorrectamente si el usuario, por ejemplo, retira la tarjeta del terminal.

El sistema de archivos

El sistema de archivos contempla dos tipos de archivo, de acuerdo a lo indicado en la normativa ISO 7816-4

Un archivo elemental contiene referencias a arreglos de bytes, mientras que un archivo dedicado contiene colecciones de archivos elementales, como un directorio.

Cuando se usa un EF, la JCVM referencia al arreglo de bytes y no intenta pedir nuevo espacio para lo que está escribiendo.

No existe soporte nativo para records en los archivos, y todo tiene que interpretarse por software. Un archivo es un conjunto de bytes solamente.

Existen dos tipos de archivo: lineales (un listado de registros) y cíclicos (un anillo de registros). Un archivo puede tener hasta 127 registros y ninguno de ellos puede sobrepasar los 255 bytes.

Criptografía

Existe soporte para encriptación simétrica y asimétrica (de llave pública), con mecanismos para autentificación y protección de datos.

Fuentes de información




Carlos Castillo - chato@usa.net