私は JCOP V2.4.2 R3 Java カードを持っており、そのデータシートに「カードは通信プロトコルT=1
とT=0
通信プロトコルの両方をサポートしています」と記載されています。
T=0 プロトコルと T=1 プロトコルの両方をサポートする ACR38 スマート カード リーダーもあります。(1枚のカードでT=0通信成功、このカードでT=1通信成功。)
以下のプログラムを作成し、カードにアップロードして、拡張 APDU を送受信します。
package extAPDU;
import javacard.framework.APDU;
import javacard.framework.Applet;
import javacard.framework.ISOException;
import javacardx.apdu.ExtendedLength;
public class ExAPDU extends Applet implements ExtendedLength {
private ExAPDU() {
}
public static void install(byte bArray[], short bOffset, byte bLength)
throws ISOException {
new ExAPDU().register();
}
public void process(APDU arg0) throws ISOException {
short number = arg0.setIncomingAndReceive();
arg0.setOutgoingAndSend((short)0, (short)(number+7));
}
}
CAD 側では、Python スクリプトを使用してさまざまな APDU をカードに送信しました。質問は次のとおりです。
1- T=0 プロトコルで通信を開始できないのはなぜですか (カードがこのプロトコルをサポートしていると言われていますが):
Python スクリプト:
from smartcard.scard import *
import smartcard.util
from smartcard.System import readers
from smartcard.CardConnection import CardConnection
r=readers()
print r
connection =r[0].createConnection()
connection.connect(CardConnection.T0_protocol)
normalCommand=[0x00,0xa4,0x04,0x00,0x06,0x01,0x02,0x03,0x04,0x05,0x06]
data,sw1,sw2=connection.transmit(normalCommand)
print "SW for Normal Command:"
print data,hex(sw1),hex(sw2)
出力:
>>> ================================ RESTART ================================
>>>
['ACS CCID USB Reader 0']
Traceback (most recent call last):
File "C:\extAPDU.py", line 13, in <module>
connection.connect(CardConnection.T0_protocol)
File "D:\PythonX\Lib\site-packages\smartcard\CardConnectionDecorator.py", line 54, in connect
self.component.connect(protocol, mode, disposition)
File "D:\PythonX\Lib\site-packages\smartcard\pcsc\PCSCCardConnection.py", line 118, in connect
raise CardConnectionException('Unable to connect with protocol: ' + dictProtocol[pcscprotocol] + '. ' + SCardGetErrorMessage(hresult))
CardConnectionException: Unable to connect with protocol: T0. The requested protocols are incompatible with the protocol currently in use with the smart card.
>>>
2- T=1 プロトコルの拡張形式の Select APDU コマンドでカードが正常に動作しない理由:
Python スクリプト:
from smartcard.scard import *
import smartcard.util
from smartcard.CardConnection import CardConnection
from smartcard.System import readers
r=readers()
print r
connection =r[0].createConnection()
connection.connect(CardConnection.T1_protocol)
normalCommand=[0x00,0xa4,0x04,0x00,0x00,0x00,0x06,0x01,0x02,0x03,0x04,0x05,0x06]
data,sw1,sw2=connection.transmit(normalCommand)
print "SW for Normal Command:"
print data,hex(sw1),hex(sw2)
出力:
>>> ================================ RESTART ================================
>>>
['ACS CCID USB Reader 0']
SW for Normal Command:
[] 0x67 0x0
>>>
私はこの概念を誤解していて、拡張 APDUT=1
とT=0
プロトコルを混同したと思います!
互換性のあるすべてT=1
のスマート カードは、拡張 APDU を送受信できますか? T=0
また、プロトコルを介して拡張 APDU を送受信することはできませんか? ExtendedLength
拡張 SELECT APDU コマンドをセキュリティ ドメインに送信する場合、SD はインターフェイスを実装する必要がありますか?
拡張 APDU 送信の要件は何ですか?
- AT=1対応カードリーダー
- AT=1対応のスマートカード
ExtendedLength
インターフェイスを実装したアプレット
そうですか?
T=0/1
拡張互換性とスマート カードの互換性について、私は本当に混乱しています。どんな光でも大歓迎です。
T=1
プロトコルを使用して上記のアプレットに拡張 APDU を正常に送信できることに注意してください。