APDU 6E00 статус для каждого класса
Я новичок в APDU и связи смарт-карт, и я не могу понять, как успешно отправлять команды APDU. Когда я пытаюсь, например, эту команду:
00 A4 00 00 02 3F 00 00
Я получаю 6E 00
ответ. Я пытался выяснить, какой класс я должен использовать для своей карты, но для каждого класса, который я пробовал в диапазоне 00-FF
Я всегда получаю ошибку "Класс не поддерживается".
Я подумал, что это может быть связано с некоторой аутентификацией на карте, но я понятия не имею, как сделать это правильно.
Я использовал следующий код Python (pyscard):
from smartcard.System import readers
from smartcard.util import toHexString
r = readers()
con = r[0].createConnection()
con.connect()
for c in range(0x00, 0xFF):
comm = [c, 0xA4, 0x00, 0x00, 0x02, 0x3F00, 0x00]
data, sw1, sw2 = con.transmit(comm)
if sw1 != 0x6e:
print comm
print 'Response:'
print data, '\n'
print 'Status:'
print '%x %x' % (sw1, sw2)
РЕДАКТИРОВАТЬ: ATR карты 3B 04 49 32 43 2E
3 ответа
Решил проблему, моя карта - карта I2C, поэтому команды APDU не будут работать с ней. Я получил его, работая с Синхронным API Omnisoft, через C++. Не совсем то, что я имел в виду, но пока это кажется единственным вариантом.
Спасибо всем, кто мне помог!
Поскольку вы пытаетесь отправить SELECT APDU, почему бы не попробовать самый простой, то есть выбрать домен безопасности эмитента?
Попробуйте эту команду:
00 A4 04 00 00
Вам не нужно беспокоиться об аутентификации на этом этапе. SELECT должен работать на всех уровнях безопасности.
Не эксперт, но, глядя на документацию по pyscard, я думаю, что вы играете не с теми байтами. В данном примере (на котором, по-видимому, основан ваш код) написано
SELECT = [0xA0, 0xA4, 0x00, 0x00, 0x02]
DF_TELECOM = [0x7F, 0x10]
data, sw1, sw2 = connection.transmit( SELECT + DF_TELECOM )
где это выглядит A0 A4 00 00 02
это команда (которая не должна быть изменена) и 7F 10
определяет тип карты для разговора (которая почти наверняка отличается в зависимости от того, какая у вас карта).
Попробуйте вместо этого:
from itertools import product
for x,y in product(range(256), repeat=2):
data, sw1, sw2 = con.transmit([0xA0, 0xA4, 0x00, 0x00, 0x02, x, y])
if sw1 != 0x6e:
print("Your card responds to {:02X} {:02X}".format(x, y))
print("Response: {}".format(data))
print("Status: {:02X} {:02X}".format(sw1, sw2))
Я также нашел сводную таблицу команд; Надеюсь, что вы найдете ее полезной.