Не удается выбрать AID Card Manager при тестировании для отправки APDU
Я пытаюсь загрузить апплет в смарт-карту, прежде чем я хотел сделать небольшой тест со следующим кодом:
import javax.smartcardio.*;
import java.util.*;
public class TestSmartCardIO {
public static String toString(byte[] bytes) {
StringBuffer sbTmp = new StringBuffer();
for(byte b : bytes){
sbTmp.append(String.format("%X", b));
}
return sbTmp.toString();
}
public static void main(String[] args) {
try {
TerminalFactory factory = TerminalFactory.getDefault();
List terminals = factory.terminals().list();
System.out.println("Terminals count: " + terminals.size());
System.out.println("Terminals: " + terminals);
// Get the first terminal in the list
CardTerminal terminal = (CardTerminal) terminals.get(0);
// Establish a connection with the card using
// "T=0", "T=1", "T=CL" or "*"
Card card = terminal.connect("*");
System.out.println("Card: " + card);
// Get ATR
byte[] baATR = card.getATR().getBytes();
System.out.println("ATR: " + TestSmartCardIO.toString(baATR) );
CardChannel channel = card.getBasicChannel();
/*SELECT Command
See GlobalPlatform Card Specification (e.g. 2.2, section 11.9)
CLA: 00
INS: A4
P1: 04 i.e. b3 is set to 1, means select by name
P2: 00 i.e. first or only occurence
Lc: 08 i.e. length of AID see below
Data: A0 00 00 00 03 00 00 00
AID of the card manager,
in the future should change to A0 00 00 01 51 00 00*/
byte[] baCommandAPDU = {(byte) 0x00, (byte) 0xA4, (byte) 0x04, (byte) 0x00, (byte) 0x08, (byte) 0xA0, (byte) 0x00,
(byte) 0x00, (byte) 0x00, (byte) 0x03, (byte) 0x00, (byte) 0x00, (byte) 0x00};
System.out.println("APDU >>>: " + TestSmartCardIO.toString(baCommandAPDU));
ResponseAPDU r = channel.transmit(new CommandAPDU(baCommandAPDU));
System.out.println("APDU <<<: " + TestSmartCardIO.toString(r.getBytes()));
// Disconnect
// true: reset the card after disconnecting card.
card.disconnect(true);
} catch(Exception ex) {
ex.printStackTrace();
}
}
}
Поэтому я просто хотел проверить, распознана ли карта и могу ли я правильно отправлять APDU. Я пытаюсь выбрать AID Card Manager через APDU, но получаю:
Terminals count: 1
Terminals: [PC/SC terminal OT MicroSD smartcard Reader 1]
Card: PC/SC card in OT MicroSD smartcard Reader 1, protocol T=1, state OK
ATR: 3BDB96081B1FE451F83031C0641A181019005D
APDU >>>: 0A4408A00003000
APDU <<<: 6A82
А также SW1 = 6A
а также SW2 = 82
означает, что карта не находит AID Card Manager... Это нормально? Я не очень понимаю, интересно, связано ли это с тем, что карта использует протокол T = 1
? Большое спасибо за Вашу помощь
2 ответа
Ранее Global Platform заимствовала RID (первые 5 байтов AID) из VISA. Это из-за исторических причин. Global Platform теперь является отдельной организацией, но Open Platform - как ее называли - была запущена (по крайней мере) VISA. Есть много МПОГ зарегистрированных.
Однако из того, что я понял, VISA больше не хотела использовать Global Platform для использования своих RID. Поэтому был запрошен новый МПОГ. Вместо довольно низкого A000000003
RID, Global Platform теперь использует свои собственные: A000000151
RID. Другое отличие состоит в том, что последние байты (которые могут быть любыми, до 15 - 5 = 10 байтов, указанных организацией) теперь состоят из двух байтов вместо трех. Некоторые версии ОС действительно ошибаются и по-прежнему используют три 00
байт.
Так вы раньше имели A000000003 000000
для Open Platform и более ранних реализаций GP, а также для более поздних карт или спецификаций Global Platform, которые у вас есть A000000151 0000
выбрать менеджер карт. Работа с SELECT не совсем понятна из ISO/IEC 7816-4. Обычно, если вы предоставите меньший AID (не менее 5 байт) в SELECT by NAME, будет выбрано соответствующее приложение.
Просто дружеское напоминание о том, что работа с globalplatform/javacards "в дикой природе" может быть непростой задачей, а правильная работа зависит от многих факторов. Возможно, вы захотите взглянуть на GlobalPlatformPro (ранее известный как GPJ) для этого.
Он должен скрывать многие раздражающие технические детали (например, пытаться выяснить ISD AID) от ваших ежедневных задач, а также предоставлять вам исходный код для подробного изучения вещей, если вы хотите.