Tarjetas inteligentes. Parte 3. TLV

Hola giktayms

En la última parte, vimos cómo se produce la comunicación entre el terminal y la tarjeta. Observamos los formatos C-APDU y R-APDU, pero no prestamos atención a los datos que contienen estas APDU. En esta parte, consideraremos los formatos más comunes en los que se transmite información entre el terminal y la tarjeta (y viceversa). Todos pertenecen a una familia: TLV.

TLV significa T ag, L ength, V alue y se usa para estructurar información. En un nivel muy abstracto, los TLV pueden considerarse como una versión binaria de XML. Sin embargo, ¿qué es Etiqueta, Longitud, Valor?

  • Etiqueta : dice qué tipo de información hay en el TLV. Una vista puede ser, por ejemplo, una línea o número simple, un identificador o incluso una estructura compleja. En algunas realizaciones, Tag también contiene metainformación sobre TLV.
  • Longitud : la longitud, en bytes, del elemento Value.
  • Valor : datos contenidos en TLV

Cada variante TLV tiene sus propias reglas de codificación para cada elemento. A continuación, veremos las opciones de TLV más comunes. Quiero señalar de inmediato que este artículo estará dedicado principalmente a BER-TLV, ya que este es el formato más extendido, flexible y complejo. Otras opciones de TLV se considerarán solo brevemente.

BER-TLV


Entonces, estamos hablando del personaje principal de este artículo: BER-TLV. Esto forma parte del estándar ASN.1 y se utiliza no solo en el campo de las tarjetas inteligentes.

Etiqueta

El primer byte de la etiqueta tiene el siguiente formato:
b8b7b6b5b4b3b2b1
ClaseUn tipoEtiqueta

Existen las siguientes clases:
b8b7Descripción
0 00 0Genérico: tipos de datos básicos, como datos de cadena o números. Raramente utilizado en tarjetas inteligentes.
0 01Aplicado: tipos cuyo significado varía según la aplicación
10 0Sensible al contexto: tipos cuyo significado depende de un tipo compuesto dado
11Privado: tipos cuyo significado depende de una organización específica

Dado que la especificación describe el valor completo de la etiqueta, recordar el valor de las clases es completamente superfluo. La clase no afecta cómo se procesará la etiqueta.

El más interesante es el bit 6. Cuando es 1, este TLV contiene otros TLV. Si, por el contrario, su valor es 0, el TLV contiene datos simples o datos que no están estructurados en formato TLV.

Los bits restantes (5-1) suelen ser solo el número de etiqueta. Sin embargo, si son todas unidades, el número de etiqueta continúa en el segundo byte. Si el bit8 del segundo byte es 1, entonces el número continúa en el tercer byte, etc. En la práctica, las tarjetas inteligentes solo usan etiquetas escritas en uno o dos bytes.

Longitud

La longitud puede ser definida e indefinida.

Una longitud indefinida se escribe en un byte con un valor de 0x80. Este método solo es válido para TLV compuestos (es decir, TLV que contienen otros TLV). En este caso, el TLV debe contener necesariamente TLV-NULL como último elemento, que está codificado como "00 00". A menudo se usa un método similar en estándares más modernos, pero, en general, no es muy común.

Se escribe una longitud específica en uno o más bytes.
Longitud de datosCodificación
0x00 <= x <= 0x7Fel valor se escribe sin cambios en un byte
0x80 <= x <= 0xFF0x81 y el valor en el segundo byte
0x100 <= x <= 0xFFFF0x82 y el valor en el segundo y tercer bytes
0x10000 <= x <= 0xFFFFFF0x83 y valor en los siguientes tres bytes
0x1000000 <= x <= 0xFFFFFFFF0x84 y valor en los siguientes cuatro bytes

En principio, esta tabla podría continuar más. Sin embargo, no se encuentran grandes TLV en el campo de las tarjetas inteligentes. La longitud registrada en más de tres bytes (incluido el prefijo 0x82), personalmente no he visto. Los valores siempre se escriben en formato Big Endian.

Tenga en cuenta que en las tarjetas inteligentes, este método de longitud de grabación a menudo se usa incluso fuera del TLV (es decir, solo LV), pero, por regla general, con la excepción de que el valor 0x80 también se puede escribir como está, en un byte.

Valor

El valor puede ser una secuencia TLV o solo bytes, cuyo significado depende del contexto y la aplicación. No es aceptable mezclar ambos tipos de datos en el mismo TLV. Los TLV contenidos en un TLV compuesto pueden ser de cualquier tipo, compuestos o simples. Este elemento falta cuando la longitud del TLV es 0.

Ejemplos

AID (Identificador de aplicación)
4F 08 A0 00 00 01 51 00 00 00

Etiqueta 0x4F: una aplicación TLV simple, en este ejemplo que contiene 8 bytes (cuyo valor es el Identificador de la aplicación, es decir, el identificador de la aplicación).

Estado del ciclo de vida
9F70 01 0F

Etiqueta 0x9F70: un TLV sensible al contexto simple, en este ejemplo que contiene 1 byte. Tenga en cuenta que en el primer byte de la etiqueta (9F), los bits 5-1 son todas unidades, por lo que la etiqueta continúa en el siguiente byte.

Cargar bloque de datos de archivo
C4 82 0x01 0x0c 01 ... otros 266 bytes ... 0a

Etiqueta 0xC4: un TLV privado simple, en este ejemplo, que contiene 268 bytes. La longitud se escribe en tres bytes, el primero de los cuales es el prefijo 0x82.

Datos relacionados con el Registro GlobalPlatform
E3 11 4F 08 A0 00 00 01 51 00 00 00 9F70 01 0F C5 01 00

Etiqueta 0xE3: TLV privado compuesto que contiene otros TLV. En este ejemplo, solo contiene TLV simples. También es permisible que un TLV compuesto o una mezcla de compuesto y simple estén contenidos.

Teóricamente, esto también podría escribirse como
E3 80 4F 08 A0 00 00 01 51 00 00 00 9F70 01 0F C5 01 00 00 00

usando longitud indefinida. En la práctica, sin embargo, la tarjeta solo acepta (o envía) una longitud indefinida cuando lo permite la especificación.

COMPRENSIÓN-TLV


COMPREHENSION-TLV se describe en el estándar ETSI TS 101 220. La longitud se codifica de la misma manera que para el BER-TLV. La etiqueta se codifica de acuerdo con las siguientes tablas:

en un byte (0x01 - 0x7E)
b8b7b6b5b4b3b2b1
CREtiqueta

En tres bytes (0x0001 - 0x7FFF)
Byte 1Byte 2Byte 3
b8-b1b8b7b6b5b4b3b2b1b8-b1
0x7FCREtiqueta


El acrónimo CR significa Comprensión requerida. Cuando este bit es 1, el receptor TLV debería devolver un error si no es compatible con este TLV. Si, por el contrario, es 0, el receptor tiene derecho a ignorar el TLV si no es compatible.

La aplicación principal de COMPREHENSION-TLV es la transferencia de parámetros al SIM-Toolkit (el SIM-Toolkit se usa, entre otras cosas, para el menú SIM en los teléfonos). Para aumentar la compatibilidad entre tarjetas y teléfonos, los parámetros opcionales (es decir, aquellos parámetros sin los cuales al menos puede ejecutar el comando) se envían con CR = 0.

TLV SIMPLE


SIMPLE-TLV se describe en ISO7816-4. A diferencia del BER-TLV en SIMPLE-TLV, una etiqueta es simplemente un número entre 0x01 y 0xFE, que no contiene información sobre la clase y el tipo. La longitud se escribe de la siguiente manera:
Longitud de datosCodificación
0x00 <= x <= 0xFEel valor se escribe sin cambios en un byte
0xFF <= x <= 0xFFFF0xFF y el valor en el segundo y tercer bytes


DGI (Identificador de agrupación de datos)


DGI se describe en las Especificaciones de la tarjeta de plataforma global y en la Especificación del lenguaje de programación GP Systems. La etiqueta siempre está codificada en dos bytes y no contiene ninguna metainformación. La longitud se registra de la misma manera que para SIMPLE-TLV. Los DGI a menudo contienen BER-TLV, pero pueden ser simples.

COMPACT-TLV


COMPACT-TLV se describe en ISO7816-4 y se usa exclusivamente en ATR (Respuesta para restablecer). En este formato, la etiqueta y la longitud se escriben en el mismo byte. La etiqueta está escrita en el nibble anterior, y la longitud está escrita en el menor.

Así que hemos llegado al final de esta parte. Si alguien tiene preguntas, puede escribirlas en los comentarios. La siguiente parte del artículo será sobre JavaCard, y luego hablaremos directamente sobre la Plataforma Global.

El resto del articulo


Parte 1. Principios de funcionamiento
Parte 2. APDU

All Articles