スマートカードとの間でデータの読み取りと書き込みを行うプロジェクトに取り組んでいます。使用しているカードリーダーはACR38U-H1
からACS
です。彼らの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)
I2Cメモリカード(具体的には最大16キロビット)SELECT_CARD_TYPE
で使用することを目的としたAPDUコマンド(0xFF00000101)を使用しています。リーダーリファレンスマニュアルのセクション9.3.1.1を参照してください。
このSELECT_CARD_TYPE
コマンド(にCLA
設定されている0xFF
)は、カードではなくリーダー(カードがI2Cを使用しないため拒否します)に送信されます。
カードはT = 1プロトコルを話すマイクロプロセッサカードであるため、「通常の」ISO 7816 APDUを使用する必要があります。これは、カードのドキュメントで指定する必要があります。
それでもそこにあるスクリプトのためのスマートカードのシェル3読んで(と制限された方法をエミュレートで)ように見えるツールのFOMカードは、(私は試していません)。
スクリプトソースを考えると、カードは、およびの背後で使用される標準のISO7816-4SELECT
およびREAD_BINARY
APDUコマンドをサポートしているようです。new CardFile()
CardFile.readBinary()
がんばろう!
免責事項:私はFOMSカードもscsh3ツールも使用していません。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加