ここのJavaCard 2.2 API ドキュメントに記載されているように、このアプレットを選択したSELECT APDU コマンドを、ファイルまたは内部アプレットの状態選択に関連する可能性のある他のすべてのSELECT APDU コマンドから区別するためにselectingApplet()アプレット メソッドによって使用されるメソッドであり、 true を返します。このアプレットが選択されている場合。process()
私の質問は、なぜこの方法が必要なのですか? さらに一般的なこと:選択したアプレットが SELECT アプレット コマンドを受信する必要があるのはなぜですか? SELECTアプレット APDU を知る必要がある唯一のエンティティは JCREだと思います。
以下のシナリオを提案します:
- JCREがCADから APDU コマンドを受信
- SELECT APDU コマンドかどうかを確認します。
- SELECT APDU コマンドでない場合は、受信した APDU を
process()選択したアプレットのメソッドに送信します。選択されたアプレットはそれを解釈して実行します(スイッチと if 式を使用し、selectingApplet()メソッドを使用する必要はありません) - SELECT APDU コマンドの場合は、コマンドのデータ フィールドの長さをチェックして、それがSELECTファイルであるか、またはSELECT アプレットであるかを確認します。
- SELECT Fileコマンドの場合、JCREは
process()選択されたアプレットのメソッドに再度送信します。ただし、SELECT アプレットコマンドの場合、JCREdeselet()は現在選択されているアプレットのメソッドを呼び出してselect()から、新しく要求されたアプレットのメソッドを呼び出します。を受信した後True、それを選択して次の APDU コマンドを待機します (さらに、この新しく選択されたアプレットのメソッドに前のSELECT-AppletAPDU コマンドを送信する必要はありません)。process()
上記の実装の何が問題になっていますか? JC 2.2 の現在の実装の利点は何ですか (すべての受信 APDU をprocess()現在選択されているアプレットのメソッドに送信し、異なるSELECTコマンドをselectingApplet()区別します)
現在の実装は脆弱性を提供していると思います! プログラマがアプレットを、そのprocess()メソッドが受信したすべてのAPDUをEEPROMに書き込むように実装すると、カードにインストールされている他のアプレットの AID を取得できます。これは正しいですか?