为什么ACR38U-CCID总是返回0x6e 0x00?

时间:2016-05-24 14:08:40

标签: linux smartcard apdu pcsc pyscard

正致力于一个项目,用于读取和写入智能卡数据。我正在使用的读卡器是来自ACR38U-H1的{​​{1}}。按照ACS命令,我可以访问卡并读取一些数据。但我怀疑我仍然无法读取内部的确切数据,因为我始终得到对命令APDU APDU而不是0x6e 0x00, 0x00的响应。

我做错了什么? 也许问题出在智能卡上?

Python代码:

0x90 0x00

此代码的结果:

#! /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.

2 个答案:

答案 0 :(得分:0)

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

在这里,您似乎正在尝试选择MF(AID = 3F00,注释#命令) OR 命令似乎错误,因为没有AID是1字节长度,请检查您的命令

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

并且获得6E 00 不支持课程

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

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

此命令用于从上一个命令指定的长度的卡中获取响应,其返回代码如-61 XX,APDU序列应该像 CLASS,INS,P1,P2,Le //请检查您的获取响应命令

这里获得响应给出6700,这似乎是正确的,因为之前的命令已经失败并且卡没有任何东西可以返回它,因此无法返回Le数据(0x0B - 假设它是你的Le)

我建议,在发出任何命令之前,要好好理解你的卡,好像它是专有卡所以你应该在发送命令之前知道文件结构/ CLASS字节USED,当你用正确的CLA值拍摄时,希望你不会得到 - CLA不支持错误。

希望此信息有助于识别问题。

答案 1 :(得分:0)

您正在使用SELECT_CARD_TYPE APDU命令(0xFF00000101),该命令适用于 I2C存储卡(特别是16千位) - 请参阅{中的第9.3.1.1节{3}}

SELECT_CARD_TYPE命令(CLA设置为0xFF)不会发送到卡但发送给读卡器(由于卡不使用I2C,因此拒绝接收卡)。

您的卡是一张微处理器卡,说reader reference manual,因此您需要使用&#34;正常&#34; ISO 7816 APDU - 应在卡片文档中指定。

尽管如此,T=1 protocol script工具似乎可以阅读(并且以有限的方式模拟)FOMS卡(我还没试过)。

鉴于脚本来源,该卡似乎支持在Smart Card Shell 3new CardFile()后面使用的标准ISO 7816-4 SELECTREAD_BINARY APDU命令。

祝你好运!

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