SIMPLE-TLV против BER-TLV

Я нашел в документах, что они ссылаются на SIMPLE-TLV и BER-TLV. Я просмотрел большинство документов EMV и GP, но они не упомянули другое.

Может ли кто-нибудь помочь мне понять разницу между двумя?


person nish1013    schedule 17.09.2013    source источник


Ответы (2)


Поля данных в ISO/IEC 7816-4 для смарт-карт

BER-кодирование

Это спецификация более распространенной кодировки BER, используемой в ISO/IEC 7816- 4:

Каждый объект данных BER-TLV должен состоять из 2 или 3 последовательных полей (см. ИСО/МЭК 8825 и приложение D).

Поле тега T состоит из одного или нескольких последовательных байтов. Он кодирует класс, тип и число. Поле длины состоит из одного или нескольких последовательных байтов. Он кодирует целое число L. Если L не равно нулю, то поле значения V состоит из L последовательных байтов. Если L равно null, то объект данных пуст: поле значения отсутствует.

Обратите внимание, что в текущем стандарте ISO/IEC 7816 позволяет использовать только до 5 байтов длины (с указанием размера до 2^32 - 1 байт). Кодирование неопределенной длины также не поддерживается. Эти ограничения относятся к смарт-картам. Обратите внимание, что кодирование длиной 4 и 5 байтов было введено в более поздней версии ISO/IEC 7816-4; более ранние карты / приложения для чтения карт могут поддерживать только 3 байта длины (т. е. размер значения до 64 КБ вместо 4 ГБ).

Спецификация BER TLV намного шире (именно поэтому SIMPLE-TLV называется «простой»). Не буду вдаваться в подробности, так как информации в интернете предостаточно. Чтобы назвать лишь несколько отличий, теги имеют синтаксическое значение и могут состоять из нескольких байтов, а кодировка длины довольно сложна.

Обычно BER следует использовать только как кодирование структур ASN.1, причем синтаксис ASN.1 определяет структуру. Однако ISO 7816-4 все портит и указывает только байты тега BER напрямую.

Обратите внимание, что иногда вместо BER указывается DER. В этом случае вы должны использовать только минимальное количество байтов для размера поля длины - например. байт одиночной длины со значением 05 в приведенных ниже примерах. Спецификация ISO/IEC для кодирования BER в основном является копией американского стандарта X.690, также отраженного в международном стандарте ISO/IEC 8825-1 (оба платные).

Кодировка SIMPLE-TLV

За спецификацией BER в ISO/IEC 7816-4 следует спецификация SIMPLE-TLV. SIMPLE-TLV относится к ISO 7816-4.

Каждый объект данных SIMPLE-TLV должен состоять из 2 или 3 последовательных полей.

Поле тега T состоит из одного байта, кодирующего только число от 1 до 254 (например, идентификатор записи). Он не кодирует ни класс, ни тип конструкции. Поле длины состоит из 1 или 3 последовательных байтов. Если начальный байт поля длины находится в диапазоне от «00» до «FE», то поле длины состоит из одного байта, кодирующего целое число L со значением от 0 до 254. Если начальный байт равен «FF», , то поле длины продолжается двумя последующими байтами, которые кодируют целое число L со значением от 0 до 65535. Если L in не равно нулю, то поле значения V состоит из последовательных байтов. Если L равно null, то объект данных пуст: поле значения отсутствует.

Обратите внимание, что стандарт забывает указать порядок следования байтов напрямую. Однако вы можете использовать кодировку с обратным порядком байтов в рамках ISO/IEC 7816-4.

Образцы

Все следующие образцы используются для передачи одного и того же номера тега (который определяет поле) и значения, за исключением одного, который определяет номер тега 31 для BER.

Образец 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

Образец 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**

В последнем примере с кодировкой двухбайтового тега первый байт равен 40 hex, где первые 3 крайних левых бита 010 определяют специфичную для приложения кодировку, добавляя к ней магическое значение 1F (31), чтобы указать, что еще один байт будет следовать за фактическим номер тега, снова 1F, поэтому значение 31.

Отличия

Следует отметить следующие отличия:

  • SIMPLE-TLV — это другой метод кодирования тега и длины (хотя кодирование может выглядеть одинаково, например, при использовании одного байта для указания части длины)
  • SIMPLE-TLV не содержит информации о классе поля, т.е. если он определен для ASN.1 (поскольку он не связан с ASN.1)
  • SIMPLE-TLV не содержит информации, является ли он примитивным или сконструированным (примитив напрямую указывает значение, сконструированный означает вложенные структуры TLV)
  • SIMPLE-TLV имеет ограничения по номеру тега (от 1 до 254 включительно) и длине (до 65535)
person Maarten Bodewes    schedule 21.09.2013
comment
Во избежание путаницы. Часть 4 стандарта (ISO/IEC 7816-4) Приложение D описывает использование основных правил кодирования ASN.1 и кодирование с помощью BER-TLV. Это диктует использование BER-TLV для кодирования обмениваемых данных. Просто так получилось, что используется BER-TLV, но в остальном BER-TLV не имеет ничего общего с ISO/IEC 7816. - person RWC; 13.06.2014
comment
@RWC Я почти уверен, что в параграфе 6.2 также указывается BER для кодирования объекта данных. По крайней мере, это присутствует со спецификации 98, и я сравнивал с версией 2013 года (хотя версии до 2005 года указывали только поле длины до 3 байтов, если я не ошибаюсь). - person Maarten Bodewes; 13.06.2014

Простой TLV просто состоит из тега (или типа), длины и значения.

BER-TLV — это специальный TLV, значением которого является один или несколько TLV. Таким образом, он имеет составную структуру.

Tag1 Len1 Tag2-Len2-Value2 Tag3-Len3-Value3 ... TagN-LenN-ValueN
          ------------------------Value1------------------------
person David    schedule 19.09.2013
comment
Это не единственная разница. Простой TLV имеет заданную длину для частей тега и длины блока данных, в то время как BER-TLV может иметь переменную длину тега и длину. Тег может храниться в 1 или 3 байтах, длина данных может храниться в 1 или 5 байтах... в простом TLV всегда 1, всегда 2 или всегда 3 и т. д. - person K.L.; 03.12.2014