gpt4 book ai didi

java - 测试发送APDU时无法选择AID Card Manager

转载 作者:行者123 更新时间:2023-11-29 03:14:11 25 4
gpt4 key购买 nike

我正在尝试将小程序加载到智能卡中,然后我只想使用以下代码进行一些测试:

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。我试图通过 APDU 选择 AID 卡管理器,但我得到:

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 = 6ASW2 = 82表示卡片没有找到AID Card Manager...这正常吗?不是很懂,不知道是不是和网卡使用T = 1协议(protocol)有关?非常感谢您的帮助

最佳答案

之前Global Platform借用了RID (AID 的前 5 个字节)来自 VISA。这是因为历史原因。 Global Platform 现在是一个独立的实体,但 Open Platform - 正如它曾经被称为 - 是由(至少)VISA 发起的。有many RID's registered .

但是据我了解,VISA 不想再使用 Global Platform 来使用他们的 RID。因此请求了一个新的 RID。 Global Platform 现在不再使用相当低的 A000000003 RID,而是使用他们自己的:A000000151 RID。另一个区别是最后一个字节(可以是任何东西,最多 15 - 5 = 10 个字节,由组织指定)现在由两个字节而不是三个字节组成。有些操作系统版本实际上弄错了,仍然使用三个 00 字节。

因此,对于开放平台和早期的 GP 实现,您之前使用 A000000003 000000,对于后来的卡或全局平台规范,您使用 A000000151 0000 来选择卡管理器。 ISO/IEC 7816-4 对 SELECT 的处理并不完全清楚。一般来说,如果您在 SELECT by NAME 中提供较小的 AID(至少 5 个字节),则会选择匹配的应用程序。

关于java - 测试发送APDU时无法选择AID Card Manager,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27600597/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com