开发 Javacard Applet 时如何访问智能卡 Reader 的密码键盘
How to access Pinpad of a Smartcard Reader when developing a Javacard Applet
我对 Javacard 比较陌生,我正在开发我自己的 Javacard Applet,它到目前为止运行良好。
我也在写一个主机程序来与我的卡通信(通过 APDU),这个程序是用 Java 编写的,并使用 javax.smartcardio 库和 apdu4j。
我现在的目标是使用我的 reader 的集成密码键盘向用户询问 PIN,然后将输入的 PIN 转发到将验证 PIN 的智能卡。我已经在卡上写了验证 PIN 的代码(CLA:0x80,INS:0x04,P1:0x00,P2:0x00,pin 数据),但我不知道如何告诉 Reader 进行探测获取 PIN,然后将此信息转发给卡。
我的卡是 NXP 的 J3H145(Javacard 3.0.4 / ISO7816 / ISO14443),我的 Reader 是 ReinerSCT cyberJack RFID 标准。
提前致谢。
如果有人想知道,我已经知道怎么做了。
public static byte[] verifyPin(Card card) throws CardException {
byte[] command = new byte[]{
0x00, //Timeout
0x00, //Timeout
0x00, //Format
0x0f, //PIN Block
0x00, //PIN length format
0x04, //Max PIN size
0x04, //Min PIN size
0x02, //Entry validation condition (02 = press OK)
0x01, //Number of messages
0x04, //Language
0x09, //Language
0x00, //Message index
0x00, //TeoPrologue
0x00, 0x00,
0x04, 0x00, 0x00, 0x00, //APDU length
(byte) CLA, INS_VERIFY_PIN, 0x00, 0x00};
return card.transmitControlCommand(CONTROL_CODE_VERIFY, command);
}
这是 java 代码,使用 javax.smartcardio 验证 PIN。您可以阅读有关命令数据的详细信息here。 CLA 和 INS_VERIFY_PIN 是 PIN 数据(您的小程序)所需的目标。
您可以使用以下代码获取CONTROL_CODE_VERIFY:
public static void parseControlCodes(Card card) throws CardException {
int CONTROL_CODE_GET_FEATURES = SCard.CARD_CTL_CODE(3400);
byte[] res = card.transmitControlCommand(CONTROL_CODE_GET_FEATURES, new byte[0]);
for(int i = 0; i < res.length; i++){
if(res[i] == 0x06){
CONTROL_CODE_VERIFY = ByteBuffer.wrap(res, i+2, 4).getInt();
}
}
}
Scard.CARD_CTL_CODE是apdu4j的一个方法。
我对 Javacard 比较陌生,我正在开发我自己的 Javacard Applet,它到目前为止运行良好。 我也在写一个主机程序来与我的卡通信(通过 APDU),这个程序是用 Java 编写的,并使用 javax.smartcardio 库和 apdu4j。
我现在的目标是使用我的 reader 的集成密码键盘向用户询问 PIN,然后将输入的 PIN 转发到将验证 PIN 的智能卡。我已经在卡上写了验证 PIN 的代码(CLA:0x80,INS:0x04,P1:0x00,P2:0x00,pin 数据),但我不知道如何告诉 Reader 进行探测获取 PIN,然后将此信息转发给卡。
我的卡是 NXP 的 J3H145(Javacard 3.0.4 / ISO7816 / ISO14443),我的 Reader 是 ReinerSCT cyberJack RFID 标准。
提前致谢。
如果有人想知道,我已经知道怎么做了。
public static byte[] verifyPin(Card card) throws CardException {
byte[] command = new byte[]{
0x00, //Timeout
0x00, //Timeout
0x00, //Format
0x0f, //PIN Block
0x00, //PIN length format
0x04, //Max PIN size
0x04, //Min PIN size
0x02, //Entry validation condition (02 = press OK)
0x01, //Number of messages
0x04, //Language
0x09, //Language
0x00, //Message index
0x00, //TeoPrologue
0x00, 0x00,
0x04, 0x00, 0x00, 0x00, //APDU length
(byte) CLA, INS_VERIFY_PIN, 0x00, 0x00};
return card.transmitControlCommand(CONTROL_CODE_VERIFY, command);
}
这是 java 代码,使用 javax.smartcardio 验证 PIN。您可以阅读有关命令数据的详细信息here。 CLA 和 INS_VERIFY_PIN 是 PIN 数据(您的小程序)所需的目标。 您可以使用以下代码获取CONTROL_CODE_VERIFY:
public static void parseControlCodes(Card card) throws CardException {
int CONTROL_CODE_GET_FEATURES = SCard.CARD_CTL_CODE(3400);
byte[] res = card.transmitControlCommand(CONTROL_CODE_GET_FEATURES, new byte[0]);
for(int i = 0; i < res.length; i++){
if(res[i] == 0x06){
CONTROL_CODE_VERIFY = ByteBuffer.wrap(res, i+2, 4).getInt();
}
}
}
Scard.CARD_CTL_CODE是apdu4j的一个方法。