为什么一个ACR38U-CCID总是return 0x6e 0x00?
Why a ACR38U-CCID always return 0x6e 0x00?
我正在从事一个从智能卡读取数据和向智能卡写入数据的项目。 Reader 使用的卡是 ACS
的 ACR38U-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 SELECT
和 READ_BINARY
APDU 命令,它们在 new CardFile()
and CardFile.readBinary()
.
后面使用
祝你好运!
免责声明:我既没有使用过任何 FOMS 卡,也没有使用过 scsh3 工具。
我正在从事一个从智能卡读取数据和向智能卡写入数据的项目。 Reader 使用的卡是 ACS
的 ACR38U-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 SELECT
和 READ_BINARY
APDU 命令,它们在 new CardFile()
and CardFile.readBinary()
.
祝你好运!
免责声明:我既没有使用过任何 FOMS 卡,也没有使用过 scsh3 工具。