emv PDOL требует 2 байта возможностей терминала

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

Моя карта EMV предоставляет этот PDOL

9F33 02 9F35 01 9F40 01 -> Total length = 4

Это данные, относящиеся к моей терминальной транзакции

Terminal capabilities : 9F33 -> 0xA0 0xA0 0xC0 
Additional Terminal Capabilities  : 9F35 -> 0x16  
Terminal Type                     : 9F40 -> 0x70 0x00 0x80 0xB0 0x01  

Когда я получаю параметры обработки, передающие (A0 A0) байты 1 и 2 для 2 байтов 9F33 16 для 9F35 и 70 для 9F40 я получаю слово статуса 69 85.

Вот моя команда (в шестнадцатеричном формате)

80 A8 00 00 06 83 04 A0 A0 16 70 00 -> s1 s2 = 69 85

и

Когда я передаю A0 C0 (байт 2 и байт 3) для 9F33, я получаю успех (90 00)

80 A8 00 00 06 83 04 A0 C0 16 70 00 -> s1 s2 = 90 00

Мой вопрос:

Как я могу точно узнать, какие байты необходимы, особенно если требуемая длина меньше фактической длины ?. Где это задокументировано в Спецификации ?. Я просто интуитивно это понял.

Заранее спасибо.


emv
person Derick Beng    schedule 27.01.2018    source источник


Ответы (2)


Любые DOL, когда фактические данные недоступны, должны быть заполнены нулями. Когда фактическая длина данных больше, чем запрошенная в DOL, данные должны быть усечены до длины, ожидаемой в DOL.

Для получения информации о правилах использования DOL см.

EMV 4.3 Книга 3

5.4 Правила использования списка объектов данных (DOL)

кстати, вы нашли ответ на вопрос, почему ответ GPO меняется при изменении значения 9F33?

person Adarsh Nanu    schedule 28.01.2018
comment
Извините, я отредактировал вопрос выше. Это была ошибка типа. Значения не соответствуют никаким RFU. Но, исходя из вашего предложения, как вы узнаете, какие байты нужно предоставить, а для другого установить значение 0 ?. Вы также предлагаете, чтобы я использовал общую длину 9 вместо 4 ?. Я имею ввиду байт после 0x83. - person Derick Beng; 29.01.2018

Это правила из Книги 3, Глава 5.4, как вы правильно указали. «c» - это объяснение моих результатов. В моем случае мне пришлось обрезать крайние правые байты (байты 2 и 3), потому что мой объект данных (9F33) не имеет числового формата.

a. If the tag of any data object identified in the DOL is unknown to the terminal or represents a constructed data object, the terminal shall provide a data element with the length specified and a value of all hexadecimal zeroes.
b. If a data object is in the list and is meaningful to the terminal but represents optional static data that is absent from the terminal, the portion of the command field representing the data object shall be filled with hexadecimal zeroes.
c. If the length specified in the DOL entry is less than the length of the actual data object, the leftmost bytes of the data element shall be truncated if the data object has numeric (n 1) format, or the rightmost bytes of the data shall be truncated for any other format.
d. If the length specified in the DOL entry is greater than the length of the actual data, the actual data shall be padded:
 with leading hexadecimal zeroes if the data has numeric format
 with trailing hexadecimal 'FF's if the data has compressed numeric (cn 1) format
 with trailing hexadecimal zeroes for any other format (an, ans or b including bit combination data 1)
e. If a data object is in the list and is meaningful to the terminal but represents data that is not applicable to the current transaction, the portion of the command field representing the data object shall be filled with hexadecimal zeroes.
person Derick Beng    schedule 31.01.2018
comment
Буква F в 9F делает его нечисловым форматом ». - это неверно. Согласно спецификациям (см. Приложение B1 «Кодирование поля тега объектов данных BER-TLV») «F» означает только то, что последующий байт также является данными тега. Чтобы увидеть формат данных, содержащихся в теге, необходимо ознакомиться с приложением A «Словарь элементов данных». Оба в Книге 3 - person Adarsh Nanu; 01.02.2018
comment
О, ты прав. Я думаю, что не понял определения числа в Книге 3, главе 4.3. Значит ли это, что мы должны сохранить словарь где-нибудь в коде? Нет способа расшифровать его из тега ?. Я отредактировал свой ответ выше, чтобы не распространять неверную информацию. Спасибо. - person Derick Beng; 01.02.2018
comment
да, насколько я понимаю, вы должны учитывать в своем коде тип данных, которые он хранит. Хорошо, что вы также указали разницу в зависимости от типа данных. Кстати, есть ли у вас настоящая причина разницы между A0 A0 и A0 C0, заданная в вашем вопросе? - person Adarsh Nanu; 01.02.2018
comment
да. Фактическая причина - это мои возможности безопасности моих возможностей терминала (Книга 4, приложение A, таблица 27). Поддерживаются коды SDA и DDA C0, а коды SDA A0 и захват карты. На самом деле я не могу объяснить, почему моей карте не понравился A0 из-за возможностей безопасности. - person Derick Beng; 03.02.2018