nfc javacard apdu

nfc - SIMPLE-TLV vs BER-TLV



javacard apdu (2)

He encontrado en los documentos que se refieren a SIMPLE-TLV y BER-TLV . He examinado la mayoría de los documentos EMV y GP, pero no han mencionado los diferentes.

¿Alguien podría ayudarme a entender la diferencia de dos?


Campos de datos en ISO / IEC 7816-4 para tarjetas inteligentes

Codificación BER

Esta es la especificación de la codificación BER más común utilizada por ISO / IEC 7816-4:

Cada objeto de datos BER-TLV consta de 2 o 3 campos consecutivos (ver ISO / IEC 8825 y anexo D).

El campo de etiqueta T consta de uno o más bytes consecutivos. Codifica una clase, un tipo y un número. El campo de longitud consta de uno o más bytes consecutivos. Codifica un entero L. Si L no es nulo, el campo de valor V consta de L bytes consecutivos. Si L es nulo, entonces el objeto de datos está vacío: no hay ningún campo de valor.

Tenga en cuenta que ISO / IEC 7816 solo permite el uso de hasta 5 bytes de longitud (especificando un tamaño de hasta 2 ^ 32 - 1 bytes) en el estándar actual. La codificación de longitud indefinida tampoco es compatible. Estas limitaciones son específicas de las tarjetas inteligentes. Tenga en cuenta que las codificaciones de 4 y 5 bytes de longitud se introdujeron en una versión posterior de ISO / IEC 7816-4; las aplicaciones anteriores de lectura de tarjetas / tarjetas solo pueden admitir 3 bytes de longitud (es decir, un tamaño de valor de hasta 64 KB de bytes, en lugar de 4GiB).

La especificación BER TLV es mucho más amplia, como lo indica la parte "simple" de SIMPLE-TLV. No voy a entrar en detalles demasiado ya que hay mucha información disponible en Internet.

Normalmente, la BER solo debe usarse como una codificación de estructuras ASN.1, con la sintaxis ASN.1 que define la estructura. Sin embargo, la norma ISO 7816-4 confunde esto y solo especifica los bytes de la etiqueta BER directamente.

Tenga en cuenta que a veces se especifica DER en lugar de BER. En ese caso, muchos solo usan el número mínimo de bytes para el tamaño del campo de longitud, por ejemplo, 05 en las siguientes muestras. También tenga en cuenta que la especificación ISO / IEC de la codificación BER es básicamente una copia del estándar X.690 específico de EE. UU.

Codificación SIMPLE-TLV

A la especificación BER le sigue la especificación SIMPLE-TLV, que es específica de ISO 7816-4. Tenga en cuenta que el estándar se olvida de especificar directamente la endianidad. Puede asumir la codificación big endian dentro de ISO / IEC 7816-4.

Cada objeto de datos SIMPLE-TLV constará de 2 o 3 campos consecutivos.

El campo de etiqueta T consiste en un byte único que codifica solo un número de 1 a 254 (por ejemplo, un identificador de registro). No codifica clase ni tipo de construcción. El campo de longitud consta de 1 o 3 bytes consecutivos. Si el byte principal del campo de longitud está en el rango de ''00'' a ''FE'', entonces el campo de longitud consiste en un byte único que codifica un entero L valorado de 0 a 254. Si el byte principal es igual a ''FF'' , entonces el campo de longitud continúa en los dos bytes subsiguientes que codifican un entero L con un valor de 0 a 65535. Si L no es nulo, entonces el campo de valor V consiste en bytes consecutivos. Si L es nulo, entonces el objeto de datos está vacío: no hay ningún campo de valor.

Muestras

Las siguientes muestras se utilizan para transmitir el mismo número de etiqueta (que define el campo) y el valor, excepto uno que define la etiqueta número 31 para BER.

Muestra SIMPLE-TLV

0F 05 48656C6C6F // tag number 15, length 5 then the value 0F FF0005 48656C6C6F // tag number 15, length 5 (two bytes), then the value

Muestra BER-TLV:

4F 05 48656C6C6F // *application specific*, primitive encoding of tag number 15, length 5 then the value 4F 8105 48656C6C6F // the same, using two bytes to encode the length 4F 820005 48656C6C6F // the same, using three bytes to encode the length 4F 83000005 48656C6C6F // the same, using four bytes to encode the length 4F 8400000005 48656C6C6F // the same , using five bytes to encode the length 5F0F 05 48656C6C6F // **invalid** encoding of the same, with two bytes for the tag, specifiying a tag number 15 which is smaller than 31 5F1F 05 48656C6C6F // application specific, primitive encoding of **tag number 31**

En el último ejemplo con la codificación de la etiqueta de dos bytes, el primer byte es 40 hex, donde los primeros 3 bits más a la izquierda 010 especifican la codificación específica de la aplicación, agregándole el valor mágico 1F (31) para indicar que otro byte seguirá con el real número de etiqueta, de nuevo 1F, así que el valor 31.

Diferencias

Las siguientes diferencias deben ser notadas:

  • SIMPLE-TLV es un método diferente de codificación de etiqueta y longitud (aunque la codificación puede parecer similar, por ejemplo, cuando se utiliza un solo byte para indicar la parte de longitud)
  • SIMPLE-TLV no contiene información sobre la clase del campo, por ejemplo, si está definido para ASN.1 (porque no está vinculado a ASN.1)
  • SIMPLE-TLV no contiene información si es primitiva o está construida (la primitiva especifica directamente un valor, construida significa estructuras TLV anidadas)
  • SIMPLE-TLV tiene restricciones con respecto al número de etiqueta (entre 1 y 254, inclusive) y la longitud (hasta 65535)

El TLV simple simplemente consiste en Etiqueta (o Tipo), Longitud y Valor.

El BER-TLV es un TLV especial que tiene uno o más TLV dentro de su Valor. Por eso tiene estructura compuesta.

Tag1 Len1 Tag2-Len2-Value2 Tag3-Len3-Value3 ... TagN-LenN-ValueN ------------------------Value1------------------------