Я нашел в документах, что они относятся к SIMPLE-TLV и BER-TLV. Я изучал большинство документов EMV и GP, но они не упоминали разные.
Может ли кто-нибудь помочь мне разобраться в различии двух?
Я нашел в документах, что они относятся к SIMPLE-TLV и BER-TLV. Я изучал большинство документов EMV и GP, но они не упоминали разные.
Может ли кто-нибудь помочь мне разобраться в различии двух?
Это спецификация наиболее распространенной кодировки BER, используемой в ИСО/МЭК 7816-4:
Каждый объект данных BER-TLV должен состоять из 2 или 3 последовательных полей (см. иСО/МЭК 8825 и приложение D).
Поле тега T состоит из одного или нескольких последовательных байтов. Это кодирует класс, тип и число. Поле длины состоит из одного или нескольких последовательные байты. Он кодирует целое число L. Если L не равно нулю, то Поле значения V состоит из L последовательных байтов. Если L равно нулю, то объект данных пуст: поле значения отсутствует.
Обратите внимание, что ИСО/МЭК 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 напрямую.
Обратите внимание, что иногда указывается DER вместо BER. В этом случае вы должны использовать только минимальное количество байтов для размера поля длины - например, один байт длины со значением 05
в примерах ниже. Спецификация ISO/IEC для кодирования BER является в основном копией специального стандарта США X.690, также отраженного в международном стандарте ISO/IEC 8825-1 (оба платные).
За спецификацией 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 в нет null, тогда поле значения 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 шестнадцатеричным, где первые 3 крайних левых бита 010 определяют кодирование, специфичное для приложения, добавляя к нему магическое значение 1F (31), чтобы указать, что последует другой байт с фактическим номером тега, снова 1F, поэтому значение 31.
Следует отметить следующие различия:
Простой TLV просто состоит из тега (или типа), длины и значения.
BER-TLV - это специальный TLV, который имеет одно или несколько TLV внутри своего значения. Таким образом, он имеет составную структуру.
Tag1 Len1 Tag2-Len2-Value2 Tag3-Len3-Value3 ... TagN-LenN-ValueN
------------------------Value1------------------------