为什么一个ACR38U-CCID总是return 0x6e 0x00?

Why a ACR38U-CCID always return 0x6e 0x00?

我正在从事一个从智能卡读取数据和向智能卡写入数据的项目。 Reader 使用的卡是 ACSACR38U-H1。按照他们的 APDU 命令,我能够访问卡并读取一些数据。但我怀疑我仍然无法读取内部的确切数据,因为我总是收到对命令 APDU 0x6e 0x00, 0x00 而不是 0x90 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)
SELECT = [
    #0xA0, 0xA4, 0x00, 0x00, 0x02, 0x3F, 0x00
    0XFF, 0xA4, 0x00, 0x00, 0x01, 0x05
]

你似乎在尝试 select MF(AID = 3F00 on commented # command)OR 命令似乎是错误的,因为没有 AID 是 1 字节长度的,请检查您的命令

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

并获取 6E 00 Class 不支持

你的另一个命令是 C0 - GET RESPONSE,

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

此命令用于从前一个命令指定长度的卡中获取响应,代码有 return 代码,如 - 61 XX 和 APDU 序列应该像 CLASS, INS, P1, P2, Le //请检查你的Get Response命令

这里 Get Response 给出 6700,这似乎是正确的,因为之前的命令已经失败并且卡没有任何东西可以 return 所以无法 return Le 数据(0x0B - 假设它是你的乐)

我建议,在执行任何命令之前先了解你的卡,似乎它是一张 专有卡 所以你应该在发送命令之前知道文件 structure/CLASS 使用的字节,当你用正确的 CLA 值拍摄时,希望你不会得到 - CLA not supported 错误。

希望此信息有助于确定问题所在。

您正在使用 SELECT_CARD_TYPE APDU 命令 (0xFF00000101),该命令用于 I2C 存储卡(具体最高 16 kb)——参见第 9.3 节.1.1 在 reader reference manual.

SELECT_CARD_TYPE 命令(将 CLA 设置为 0xFF)不是发送给卡而是发送给 reader(卡拒绝它,因为卡不使用 I2C)。

你的卡是微处理器卡 T=1 protocol 所以你需要使用 "normal" ISO 7816 APDU——哪些应该在你的卡文档中指定。

尽管如此,有一个 script for Smart Card Shell 3 工具似乎可以读取(并以有限的方式模拟)FOMS 卡(我没有尝试过)。

鉴于脚本源,该卡似乎支持标准 ISO 7816-4 SELECTREAD_BINARY APDU 命令,它们在 new CardFile() and CardFile.readBinary().

后面使用

祝你好运!

免责声明:我既没有使用过任何 FOMS 卡,也没有使用过 scsh3 工具。