您混淆了概念。我会尽力让它更加清晰。
免责声明:以下某些内容我不确定!
A) 卡类型
有两种双界面卡:
- 双芯片双界面。
- 单芯片双界面。
如上图所示,关于卡的类型,您可能会通过不同的接口收到相等或不同的响应,针对发送到卡的特定命令。
可用的卡通常是单芯片双界面。值得注意的是,双芯片双界面可以配置为在不同的接口上对相同命令产生相等的响应。
B) APDU处理实体
在Java卡中,接收APDU命令的应用程序可以根据接收命令的接口决定是否对特定的传入命令做出相等或不同的响应。
例如,下面代码段展示的小应用,在响应APDU命令=
00 10 00 00 00
时,当接口为"contact"时返回"Contact",当接口为"contactless"时返回
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.
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.
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的颜色或延迟蜂鸣声。这些命令被认为是发送给读卡器本身而不是卡片的伪APDU命令,通常以
0xFF
开头(我认为读卡器制造商选择此值是因为它已在ISO7816-3中为T=0中的PPSS和T=1中的NAD定义,并因此被指定为普通应用程序命令的INVALID)。
USB智能卡读卡器基于PCSC构建的规范。您可以从
here免费下载它们。其中定义了一些通常由读卡器制造商在其产品中实现的伪APDU命令。他们还可以向他们的读卡器添加一些专有的伪APDU命令,以增加与存储卡(例如SLE4432/42)或与Mifare卡工作的能力。
读卡器有一个名为“
Direct Transmit”命令的伪APDU命令,用于向卡片发送有效负载。对于您提问中提到的读卡器,其直接传输命令如下:
![enter image description here](https://istack.dev59.com/BQOxl.webp)
我很快会在这里添加一些内容!...