您正在混合概念。我会尽量说清楚一点。
声明:我不确定以下几行!
A) 卡片类型
双接口卡有两种:
- 双接口双芯片。
- 双接口单芯片。
正如您在上面看到的,关于卡的类型,对于通过不同接口发送到卡的特定命令,您可能会收到相同或不同的响应。
可用的卡通常是双接口单芯片。还值得注意的是,双芯片双接口可以配置为对不同接口上的相同命令具有相同响应。
B) APDU 处理程序实体
在 Java Cards 中,接收 APDU 命令的小程序可以根据接收命令的接口决定是否响应特定的传入命令。
例如下面sn-p所示的小程序,响应APDU Command = 00 10 00 00 00,接口为contact时返回“Contact”,接口为非接触时返回Contactless:
package testPack;
import javacard.framework.*;
public class TestApp extends Applet
{
private static final byte[] data = { (byte)'C', (byte)'o', (byte)'n', (byte)'t', (byte)'a', (byte)'c', (byte)'t',
(byte)'l', (byte)'e', (byte)'s', (byte)'s'};
public static void install(byte[] bArray, short bOffset, byte bLength)
{
new TestApp().register(bArray, (short) (bOffset + 1), bArray[bOffset]);
}
public void process(APDU apdu)
{
if (selectingApplet())
{
return;
}
byte transportMedia = (byte) (APDU.getProtocol() & APDU.PROTOCOL_MEDIA_MASK);
boolean isContactless = (transportMedia == APDU.PROTOCOL_MEDIA_CONTACTLESS_TYPE_A) ||
(transportMedia == APDU.PROTOCOL_MEDIA_CONTACTLESS_TYPE_B);
byte[] buf = apdu.getBuffer();
switch (buf[ISO7816.OFFSET_INS])
{
case (byte)0x10:
apdu.setOutgoing();
if (isContactless){
apdu.setOutgoingLength((short)0x0B);
apdu.sendBytesLong(data, (short)0, (short)0x0B);
}else{
apdu.setOutgoingLength((short)0x07);
apdu.sendBytesLong(data, (short)0, (short)0x07);
}
break;
default:
ISOException.throwIt(ISO7816.SW_INS_NOT_SUPPORTED);
}
}
}
工作如下:
Connect successful. # via the "Contact" Interface
Send: 00 A4 04 00 06 01 02 03 04 05 00 00
Recv: 90 00
Send: 00 10 00 00 00
Recv: 43 6F 6E 74 61 63 74 90 00
Disconnect successful.
Connect successful. # via the "Contactless" Interface
Send: 00 A4 04 00 06 01 02 03 04 05 00 00
Recv: 90 00
Send: 00 10 00 00 00
Recv: 43 6F 6E 74 61 63 74 6C 65 73 73 90 00
请注意,安全域和卡管理器(负责响应 SELECT APDU 命令的实体)通常对两个接口有相同的响应。
C) APDU 命令与伪 APDU
读卡器可能支持读卡器功能管理/控制命令。例如,您可以更改 LED 的颜色,或延迟哔声。这些应该发送给读卡器本身而不是卡的命令被命名为 Pseudo-APDU 命令,通常以0xFF 开头(我认为读卡器制造商选择这个值是因为它已经在 ISO7816-3 中定义为T=0 中的 PPSS 和 T=1 中的 NAD,因此对于正常的小程序命令指示为无效)。
USB智能卡读卡器基于它构建的规格是PCSC。您可以从here 免费下载它们。定义了一些伪 APDU 命令,通常阅读器制造商在其产品中实现它们。他们还可以向他们的阅读器添加一些专有的伪 APDU 命令,以增加使用存储卡(例如 SLE4432/42)或使用 Mifare 卡的能力。
读卡器有一个名为 Direct Transmint 命令的伪 APDU 命令,它用于向卡发送有效载荷。对于您的读者,正如您在问题中提到的,直接传输命令如下:
我很快就会在这里添加一些东西! ...