(バイヤーは注意してください: この方法は単に機能しないようです -- コメントを参照してください)
(GlobalPlatform カード仕様 2.2.1 のコンテキストで)
図 5-2 に示されているアプリケーション ライフ サイクル状態の規則に従う必要があります (ここでは「5」とマークされた矢印が適用されます)。
正しい方法は次のとおりです。
GPSystem.setCardContentState((byte)(GPSystem.getCardContentState() | GPSystem.APPLICATION_LOCKED));
また
GPSystem.getRegistryEntry(JCSystem.getAID()).setState((byte)(GPSystem.getCardContentState() | GPSystem.APPLICATION_LOCKED))
アプリケーションの0x80
ライフサイクル状態が無効です。表 11-4 を参照してください (少なくともビットb1
とb2
ビットが設定されている必要がありますb3
。ビットもおそらく同様です)。
編集>
(私は、OPEN がエンティティがロックされた元の状態を保持しているという事実の記憶のみに基づいて、この回答を書くことを告白します)
私はこれについて非常に興味があるので、次のアプレットを使用していくつかのテストを行いました (抜粋):
public void process(APDU apdu) {
byte[] buffer = apdu.getBuffer();
if(selectingApplet()) {
return;
}
short claIns = Util.getShort(buffer, ISO7816.OFFSET_CLA);
switch(claIns) {
case (short) 0x8007:
buffer[0]=GPSystem.getCardContentState();
if(buffer[0]==buffer[ISO7816.OFFSET_P1]) {
if(GPSystem.setCardContentState(buffer[ISO7816.OFFSET_P2])) {
buffer[1]=0x01;
} else {
buffer[1]=0x00;
}
} else {
buffer[1]=(byte)0xFF;
}
buffer[2]=GPSystem.getCardContentState();
apdu.setOutgoingAndSend((short)0, (short)3);
return;
default: {
ISOException.throwIt(ISO7816.SW_INS_NOT_SUPPORTED);
return;
}
}
}
そして、次の APDU:
8007070F03 // To test transition into Application Specific State
80070F8F03 // To test my theory
80070F8003 // To test the GPSystem.APPLICATION_LOCKED constant directly
私の一連のカード (Gemalto、Morpho、JCOP - 残念ながら、それらはすべて GP 2.1.1 です) の結果は、Michael Roland の優れた回答と GP 仕様と一致しています。アプリケーション自体をブロックしようとする試みは拒否されました。
すべての GP 2.1.1 カードの受信応答 APDU:
8007070F03 -> 07010F9000 // Succeeded in transition from `07` to `0F`
80070F8F03 -> 0F000F9000 // Failed transition from `0F` to `8F`
80070F8003 -> 0F000F9000 // Failed transition from `0F` to `80`
注意:このツールは、カード認識データを解析するため、実装されている GP のバージョンを判断するのに非常に役立ちます。