Я нашел в документах, что они ссылаются на SIMPLE-TLV и BER-TLV. Я просмотрел большинство документов EMV и GP, но они не упомянули другое.
Может ли кто-нибудь помочь мне понять разницу между двумя?
Я нашел в документах, что они ссылаются на SIMPLE-TLV и BER-TLV. Я просмотрел большинство документов EMV и GP, но они не упомянули другое.
Может ли кто-нибудь помочь мне понять разницу между двумя?
Это спецификация более распространенной кодировки 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 (оба платные).
За спецификацией 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.
Следует отметить следующие отличия:
Простой TLV просто состоит из тега (или типа), длины и значения.
BER-TLV — это специальный TLV, значением которого является один или несколько TLV. Таким образом, он имеет составную структуру.
Tag1 Len1 Tag2-Len2-Value2 Tag3-Len3-Value3 ... TagN-LenN-ValueN
------------------------Value1------------------------