4

私は JCOP V2.4.2 R3 Java カードを持っており、そのデータシートに「カードは通信プロトコルT=1T=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=1T=0プロトコルを混同したと思います!

互換性のあるすべてT=1のスマート カードは、拡張 APDU を送受信できますか? T=0また、プロトコルを介して拡張 APDU を送受信することはできませんか? ExtendedLength拡張 SELECT APDU コマンドをセキュリティ ドメインに送信する場合、SD はインターフェイスを実装する必要がありますか?

拡張 APDU 送信の要件は何ですか?

  1. AT=1対応カードリーダー
  2. AT=1対応のスマートカード
  3. ExtendedLengthインターフェイスを実装したアプレット

そうですか?

T=0/1拡張互換性とスマート カードの互換性について、私は本当に混乱しています。どんな光でも大歓迎です。

T=1プロトコルを使用して上記のアプレットに拡張 APDU を正常に送信できることに注意してください。

4

3 に答える 3

6

すべての ISO 互換カードが拡張 APDU を送受信できるわけではありません。これは非常にオプションの機能です。あなたのカードはどのバージョンの JCOP を実装していますか?

T=0 と T=1 に関して: カードが両方のプロトコルのサポートを示している場合、どちらを使用するかを決定するのはカード リーダーです。PC/SC カード リーダーの場合、これについてできることはあまりありません。

追加するために更新: これで、拡張 APDU を上記のアプレットに正常に送信できると言います。したがって、このカードは拡張 APDU をサポートしているようです。しかし、組み込みの SELECT コマンドは、Le が存在しない場合、それらの使用例がないため、それらを許可しない可能性があります。

于 2015-03-04T13:49:16.277 に答える