2016-05-24 9 views
1

Работаю над проектом для чтения и записи данных на смарт-карты. Картодержателем am используется ACR38U-H1 от ACS. Следуя их командам APDU, я могу получить доступ к карте и прочитать некоторые данные. Но я подозреваю, что все еще не могу прочитать точные данные внутри, потому что всегда получаю ответ на команду APDU0x6e 0x00, 0x00 вместо 0x90 0x00.Почему ACR38U-CCID всегда возвращает 0x6e 0x00?

Что я делаю неправильно?
Возможно, проблема в смарт-карте? Код

Python:

#! /usr/bin/env python 
from smartcard.scard import * 
import smartcard.util 


SELECT = [ 
    #0xA0, 0xA4, 0x00, 0x00, 0x02, 0x3F, 0x00 
    0XFF, 0xA4, 0x00, 0x00, 0x01, 0x05 
] 

COMMAND = [ 
    0x00, 0xC0, 0x00, 0x00, 0x00, 0x0B 
] 

try: 
    hresult, hcontext = SCardEstablishContext(SCARD_SCOPE_USER) 
    if hresult != SCARD_S_SUCCESS: 
     raise Exception('Failed to establish context : ' + 
      SCardGetErrorMessage(hresult)) 
    print 'Context established!' 

    try: 
     hresult, readers = SCardListReaders(hcontext, []) 
     if hresult != SCARD_S_SUCCESS: 
      raise Exception('Failed to list readers: ' + 
       SCardGetErrorMessage(hresult)) 
     print 'PCSC Readers:', readers 

     if len(readers) < 1: 
      raise Exception('No smart card readers') 

     reader = readers[0] 
     print "Using reader:", reader 

     try: 
      hresult, hcard, dwActiveProtocol = SCardConnect(hcontext, reader, 
       SCARD_SHARE_SHARED, SCARD_PROTOCOL_T1 | SCARD_PROTOCOL_T1) 
      if hresult != SCARD_S_SUCCESS: 
       raise Exception('Unable to connect: ' + 
        SCardGetErrorMessage(hresult)) 
      print 'Connected with active protocol', dwActiveProtocol 

      try: 
       hresult, response = SCardTransmit(hcard, dwActiveProtocol, 
        SELECT) 
       if hresult != SCARD_S_SUCCESS: 
        raise Exception('Failed to transmit: ' + 
         SCardGetErrorMessage(hresult)) 
       print 'Select: ' + smartcard.util.toHexString(response, 
        smartcard.util.HEX) 
#========================================================================== 
       hresult, response = SCardTransmit(hcard, dwActiveProtocol, 
        COMMAND) 
       if hresult != SCARD_S_SUCCESS: 
        raise Exception('Failed to transmit: ' + 
         SCardGetErrorMessage(hresult)) 
       print 'Command: ' + smartcard.util.toHexString(response, 
        smartcard.util.HEX) 
# ========================================================================= 
      finally: 
       hresult = SCardDisconnect(hcard, SCARD_UNPOWER_CARD) 
       if hresult != SCARD_S_SUCCESS: 
        raise Exception('Failed to disconnect: ' + 
         SCardGetErrorMessage(hresult)) 
       print 'Disconnected' 

     except Exception, message: 
      print "Exception:", message 

    finally: 
     hresult = SCardReleaseContext(hcontext) 
     if hresult != SCARD_S_SUCCESS: 
      raise Exception('Failed to release context: ' + 
        SCardGetErrorMessage(hresult)) 
     print 'Released context.' 

except Exception, message: 
    print "Exception:", message 

Результат этого кода:

Context established! 
PCSC Readers: ['ACS ACR38U-CCID 00 00'] 
Using reader: ACS ACR38U-CCID 00 00 
Connected with active protocol 2 
Select: 0x6E 0x00 
Command: 0x67 0x00 
Disconnected 
Released context. 

результат открытого инструмента:

[17:06:00]:~$ opensc-tool -s ff:a4:00:00:01:05 
Using reader with a card: ACS ACR38U-CCID 00 00 
Sending: FF A4 00 00 01 05 
Received (SW1=0x6E, SW2=0x00) 
+0

С какой смарт-картой вы пытаетесь читать? –

+0

@MichaelRoland, это карточка карты здоровья Российской Федерации (Params: 'ISO 7816 T = 0, T = 1, EMV, CAC, 2/3 BUS I2C/Extended I2C карты памяти') –

+0

Вы уверены, что этот это карта памяти? Можете ли вы опубликовать вывод 'opensc-tool -a'. Я предполагаю, что это обычная 'T = 0' или' T = 1' карта, которая не требует этих APDU '0xFF' (которые фактически предназначены для читателя, а не для карты). Откуда у вас эти параметры - они кажутся мне возможностями читателя, а не карточными. – vlp

ответ

0

Вы используете SELECT_CARD_TYPE команду APDU (0xFF00000101), которая предназначена для использования с карт памяти I2C (до 16 килобит в частности) - см раздел 9.3.1.1 в reader reference manual.

Эта команда SELECT_CARD_TYPECLA установлена ​​в 0xFF) не адресована карточке, а читателю (которая отказывается от нее, так как карта не использует I2C).

Ваша карточка представляет собой микропроцессорную карту, говорящую T=1 protocol, поэтому вам нужно использовать «обычные» APDU ISO 7816 - какие из них должны быть указаны в документации вашей карты.

Тем не менее, есть script инструмент Smart Card Shell 3, который, кажется, читает (и в ограниченном смысле эмулирует) FOMS-карту (я не пробовал).

Учитывая исходный сценарий, кажется, что карта поддерживает стандарт ISO 7816-4 SELECT и READ_BINARY APDU команд, которые используются за new CardFile() и CardFile.readBinary().

Удачи вам!

Отказ от ответственности: Я не работал ни с какой-либо картой FOMS, ни с помощью инструмента scsh3.

0
SELECT = [ 
    #0xA0, 0xA4, 0x00, 0x00, 0x02, 0x3F, 0x00 
    0XFF, 0xA4, 0x00, 0x00, 0x01, 0x05 
] 

Здесь, кажется, вы пытаетесь выбрать MF (AID = 3F00 на комментарий # команды) ИЛИ Команда кажется неправильной, потому что ни AID не имеет длину 1 байты, пожалуйста, проверьте команду

0XFF, 0xA4, 0x00, 0x00, 0x01, 0x05 // check it. 

и получать 6E 00 Класса не поддерживается

другая Ваша Команда C0 - получить ответ,

COMMAND = [ 
    0x00, 0xC0, 0x00, 0x00, 0x00, 0x0B 
] 

Эта команда используется для получения ответа от карты длины, указанной предыдущей командой с кодом возврата, например - 61 XX и последовательностью APDU, как CLASS, INS, P1, P2, Le // пожалуйста, проверьте получить ответ команды

Здесь Получить ответ дает 6700, это кажется правильным, потому что предыдущая команда провален уже и карта не не имеет ничего, чтобы вернуться к нему так не в состоянии вернуть Le данные (0x0B - Пусть это ваш Le)

Я предлагаю, понимаю вашу карточку хорошо перед обжигом любую команду, кажется, это фирменная карта, так что вы должны знать структуру файла/CLASS байт, использовавшиеся до отправляя команду, когда вы снимаете с правильным значением CLA, надеюсь, что вы не получите - CLA не поддерживается ошибка.

Надеемся, что эта информация поможет определить проблему.

+0

Я проверил команду [здесь (страница # 7)] (http://downloads.acs.com.hk/drivers/en/PMA_ACR38x%28CCID%29_v6.01.pdf) и попытался получить ответ, но я получаю '0x6e 0x00' снова. Я пытаюсь получить 'SELECT_CARD_TYPE' для дальнейшего взаимодействия с картой, но это не сработает. Результатом должен быть «0x6e 0x00». Я посылаю это для теста: 'opensc-tool -s ff: a4: 00: 00: 01: 01 Использование считывателя с картой: ACS ACR38U-CCID 00 00 Отправка: FF A4 00 00 01 01 Получено (SW1 = 0x6E, SW2 = 0x00) '. Что я делаю не так? –

+0

@IlyaSoltanov Я вижу, что «выбрать тип карты» - это очень первая команда, которую нужно отправить, и надеемся, что вы отправите правильный байт Lc (от 0x01 до 0x09) согласно используемой карте. этот документ не определяет слово состояния 6E00. Я думаю, вы должны проверить с помощью таблицы карт/руководства, чтобы понять поведение карты - когда он может вернуться 6E00 (класс не поддерживается) – Arjun

+0

К сожалению, на смарт-карте нет документации. –