, !
JavaCard. JavaCard . , , JavaCard. , , JavaCard, .. . JavaCard.
, - JavaCard — , JavaCard Virtual Machine ( Java Virtual Machine, -) JavaCard Runtime Environment ( Java Runtime Environment ).
En términos de terminología, las aplicaciones se llaman Applets y están contenidas en Paquetes. Los paquetes se distribuyen en archivos CAP (en lugar de archivos Jar). Los paquetes y las aplicaciones tienen su propio AID (Identificador de aplicación). Esto es necesario para que puedan identificarse de forma exclusiva en comandos como: SELECCIONAR, INSTALAR, ELIMINAR, etc. (SELECT se describe en ISO7816-4, y JavaCard y otros comandos se describen en la Plataforma Global).El ciclo de vida de los Applets es ligeramente diferente del ciclo de vida habitual de las aplicaciones informáticas. Un applet es cualquier clase que hereda de la clase base Applet. Al instalar aplicaciones, se llama a su método de instalación estática. Este método debe crear un objeto de la clase correspondiente y llamar al método de registro en él. Posteriormente, el objeto se guardará en el sistema y recibirá su propio AID, que se utilizará para una mayor comunicación con la aplicación. El objeto y sus campos de datos se almacenan en NVM (memoria no volátil). Cada objeto o conjunto creado por la aplicación utilizando el "nuevo" operador también estará en NVM. Esto significa que, a diferencia de los programas de computadora tradicionales, el estado de las aplicaciones JavaCard es constante y no se pierde incluso cuando la tarjeta está apagada.Comunicación con la aplicación.
En cualquier momento, cada canal lógico abierto tiene una aplicación activa. Una aplicación activa es aquella que recibe todas las APDU enviadas por el terminal. Al recibir la APDU, la JavaCard llama al método de proceso de la aplicación activa, que toma la APDU recibida como el único parámetro. Este método es el núcleo del Applet, porque procesa las solicitudes del terminal. La APDU resultante también se usa para enviar respuestas.Un applet se puede activar de dos maneras:- al restablecer la tarjeta o al abrir un canal lógico, el sistema generalmente activa la aplicación que está marcada como Aplicación predeterminada
- usando el comando SELECT con P1 = 0x04 y el AID (total o parcial) de la aplicación en Datos
Cuando la aplicación se activa utilizando el comando SELECCIONAR, inmediatamente después de la activación se llamará al método de proceso con la APDU que contiene este comando. Por lo tanto, el Applet puede enviar información en respuesta a un comando SELECT cuando se activa. La clase Applet proporciona el método selectionApplet () para determinar si el comando recibido provocó la activación de la aplicación.La aplicación también tiene la capacidad de reescribir los métodos select () y deselect () para inicializar respectivamente durante la activación y des-inicializar durante la desactivación. Se llamará a estos métodos independientemente de cómo se activó la aplicación.Los canales lógicos se pueden abrir y cerrar con el comando MANAGE CHANNEL. A través de canales lógicos abiertos, puede enviar cualquier comando, incluido SELECT. Los SELECT y MANAGE CHANNEL son los únicos comandos procesados directamente por el sistema y no por la aplicación activa. Aunque en el caso del comando SELECT, podemos decir que es procesado tanto por el sistema como por la aplicación activa.Las reglas completas para invocar la aplicación y procesar el comando SELECT son bastante complejas, y existen pocas contradicciones entre JavaCard y Global Platform. Sin embargo, trataré este tema en uno de mis próximos artículos. Ahora vale la pena decir que las tarjetas a menudo siguen las reglas descritas en la Plataforma Global.Gestión de la memoria
Como dije anteriormente, los objetos y las matrices se almacenan por defecto en NVM. Además de NVM, JavaCard también hace posible crear matrices en RAM utilizando varios métodos de la clase JCSystem. Hay 2 tipos de memoria temporal: Borrar al restablecer y Borrar al deseleccionar. La primera se borra cuando la tarjeta se apaga o se reinicia. El segundo se borra cuando el Applet deja de estar activo (es decir, cuando SELECCIONA otra aplicación, apaga, reinicia, etc.). Cabe señalar que, aunque los contenidos de la matriz se borran (es decir, todos los ceros o falsos se escriben allí), la matriz en sí permanece y, por ejemplo, se puede almacenar en el campo de datos del objeto.Lo que se guarda en NVM:- Todos los objetos y sus campos de datos.
- Todos los arreglos.
- El contenido de las matrices creadas por el nuevo operador.
Lo que se almacena en la RAM (CLEAR_ON_RESET o CLEAR_ON_DESELECT):- , JCSystem.makeTransient<>Array. , , , JCSystem.makeTransientObjectArray(), NVM. RAM.
- Global Arrays: (APDU Install Parameters ), Global Arrays, JCSystem.makeGlobalArray().
- . .
, , , . , , :
1) , , , - .
2) — ( ) . , , . . , , (JCSystem.requestObjectDeletion()).
Posteriormente, el código de la aplicación rara vez se obtiene "limpio" en términos de programación orientada a objetos. Usar el byte común [] para muchas operaciones diferentes es una práctica muy común. Las clases que consisten únicamente en métodos estáticos y se ejecutan en byte [] tampoco son infrecuentes. Además, la creación de clases y objetos se minimiza. Poca memoria y debe protegerse a toda costa.También vale la pena señalar el papel del objeto APDU. Su búfer ubicado en la RAM se borra antes de recibir cada comando. Es habitual usarlo no solo para formar una respuesta, sino a menudo incluso como un búfer temporal. Su tamaño es de al menos 256 bytes o mucho mayor si la tarjeta admite Longitud extendida.Cortafuegos Applet
Una característica importante de JavaCard que puede confundir a los programadores es la presencia del llamado Applet Firewall. El objetivo de Firewall es evitar que cualquier Applet acceda a los datos de otro. Debo decir de inmediato que JavaCard permite la comunicación entre aplicaciones que usan interfaces compartibles, y también que los paquetes son bibliotecas de clases y funciones que se pueden usar en diferentes aplicaciones. Por eso es necesario un firewall. Los principios básicos del Applet Firewall son los siguientes:- Cada aplicación pertenece a un contexto. Todas las aplicaciones del mismo paquete pertenecen al mismo contexto.
- Cada objeto pertenece a una aplicación o sistema.
- Un paquete sin aplicaciones (biblioteca) no tiene contexto. Los objetos de sus clases pertenecen a la aplicación que los creó.
- Siempre hay un contexto activo en el sistema.
- (/ ) , .
- .
- . . , , firewall.
- CLEAR_ON_DESELECT , .
Shareable Interface . , , , Shareable Interface. , , , , , byte[] , . .
La aplicación también tiene acceso a ciertos objetos que pertenecen al sistema. Dichos objetos se denominan puntos de entrada. Hay dos tipos de puntos de entrada: temporales y permanentes. Los puntos de entrada permanentes son simples, se permite el acceso a ellos desde cualquier contexto. Un ejemplo de esto son los objetos de la clase AID. Los puntos de entrada temporales, por otro lado, tienen una restricción que impide que se almacenen en los campos de datos del objeto o en los campos estáticos de la clase. Un ejemplo de un punto de entrada temporal es un objeto APDU.A partir de JavaCard 3.0.4, también es posible crear matrices globales utilizando el método JCSystem.makeGlobalArray (). Su comportamiento es exactamente el mismo que el de los puntos de entrada temporales. Se necesitan principalmente como parámetro para los métodos llamados utilizando la técnica de Interfaz compartible.Atomicidad y transacciones
JavaCard . , ( , NonAtomic ). , , , Util.arrayCopy ( ), .
, JavaCard JCSystem.beginTransaction() JCSystem.commitTransaction() . , JCSystem.beginTransaction() JCSystem.commitTransaction(), . - , JCSystem.abortTransaction(), . , . , TransactionException.
RMI
JavaCard es compatible con la tecnología RMI (Remote Metod Invocation). En este artículo no dedicaré esta tecnología. Solo puedo decir que esta funcionalidad no es común y que muchas tarjetas no la admiten.API
La mayor parte de la API JavaCard está dedicada a la criptografía. Hay clases para encriptar, crear y verificar una firma digital, generar claves y números aleatorios, calcular sumas de verificación y hashes, y también para implementar esquemas de intercambio de claves. Además de la criptografía, JavaCard también ofrece clases para almacenar y verificar PIN e incluso datos biométricos. Las clases restantes proporcionan acceso a la funcionalidad descrita en otros capítulos o son auxiliares para trabajar con cadenas, números, TLV, etc. En cuanto a la API, se interpretará en otra serie de artículos.Limitaciones clave de JavaCard en comparación con Java
El lenguaje de programación de la aplicación JavaCard es Java. Casi Java Por lo tanto, los tipos char, float, double, long y enum no son compatibles. El tipo int es opcional para las tarjetas (generalmente las tarjetas modernas lo admiten) y su uso, si no se activa mediante la opción correspondiente, provocará un error al convertir la aplicación en un archivo CAP. Olvídate de for, iterator y lambda. El convertidor admite genéricos, importación estática y anotaciones (solo Runtime Invisible) desde la versión 3.0.0, como no afectan la ejecución del código.Para compilar el código, se utiliza un compilador JDK ordinario. Los errores de incompatibilidad serán notorios solo cuando se convierte a un archivo CAP o cuando se usa el IDE inteligente para JavaCard.El mayor problema para los programadores, de hecho, es la falta de un int por defecto. Por lo general, realmente no son necesarios, por lo que no quiero activarlos innecesariamente. Sin embargo, el compilador de Java tiene la costumbre de transmitir automáticamente el resultado de todas las operaciones aritméticas a int. Para evitar esto, debe usar un tipo de conversión explícito para abreviar o byte en el código, lo que hace que el código sea menos legible.Otra limitación se produce en la inicialización de campos estáticos, a saber, que pueden inicializarse solo con constantes y matrices que contienen constantes, pero no con objetos.Conclusión
JavaCard. , , , , . JavaCard. , Global Platform, .