gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:24:37 24 4
gpt4 key购买 nike

我正在从事一个从智能卡读取数据和向智能卡写入数据的项目。我使用的读卡器是 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_CARD_TYPE APDU 命令 (0xFF00000101),该命令用于 I2C 存储卡(具体最高 16 kb)——参见第 9.3.1.1 节在reader reference manual .

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

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

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

鉴于脚本源,卡似乎支持标准 ISO 7816-4 SELECTREAD_BINARY APDU 命令,这些命令在 new CardFile() 后面使用和 CardFile.readBinary() .

祝你好运!

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

关于linux - 为什么 ACR38U-CCID 总是返回 0x6e 0x00?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37416083/

24 4 0