【问题标题】:Can't select AID Card Manager when testing to send APDU测试发送APDU时无法选择AID Card Manager
【发布时间】:2014-12-28 21:43:07
【问题描述】:

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

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卡管理器...正常吗? 我不太明白,我想知道它是否与卡使用协议T = 1的事实有关?非常感谢您的帮助

【问题讨论】:

  • 这不应该与T=1T=0 相关,但可以肯定的是,您当然可以明确地尝试T=0。我试过你的程序,它工作正常,我得到了一个预期的长响应,0x9000 作为状态字。 (除非它应该在String.format() 中为"%02X",否则您将省略值你的卡管理器的帮助吗?您还可以删除一些字节并尝试使用较短的部分 SELECT 命令来查找匹配项。
  • 那么,如何确定我的卡是否处于具有卡管理器的 OP 生命周期状态?我认为应该,但我不知道如何确定...我也尝试发送 SELECT 命令:00A4040000,但我得到了奇怪的回复:6F6D847A00015100A562732F672A864886FC6B160C6A2A864886FC6B2211639672A864886FC6B364B692A864886FC6B4159F6E2A47905167823193220722249A801BF42801142425311434253114442531000000000009F651FF900,我不明白...非常感谢您的考虑
  • 顺便说一句,卡管理器的 AID 可能因制造商和卡代而异。您的 AID 仅适用于我的一张卡,这是一张由 OCS(Oberthur Card Systems)发行的 Visa 卡。它不适用于 G&D 发行的 Maestro 卡,也不适用于 MasterCard(我不知道发行人)。
  • 该响应是对 SELECT Card Manager 的正常响应,由于您的 format 错误,它看起来有点奇怪,最后一个字节实际上是 9000(您会看到 90 和 @987654337 @ 因为你忘记了 02%02X)。
  • 从你收到的空选择命令的FCI可以看到,卡管理器的AID其实是A0 00 00 01 51 00 00(包含在标签0x84中)。

标签: java applet javacard apdu pcsc


【解决方案1】:

之前全球平台借用了 VISA 的RID(AID 的前 5 个字节)。这是因为历史原因。全球平台现在是一个独立的实体,但开放平台——正如它曾经被称为——是由(至少)VISA 启动的。有many RID's registered

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

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

【讨论】:

    【解决方案2】:

    只是一个友好的提醒,“在野外”使用 globalplatform/javacards 可能是一项艰巨的任务,把事情做好取决于许多因素。你可能想看看GlobalPlatformPro(以前称为GPJ)。

    它应该从您的日常任务中隐藏许多烦人的技术细节(例如试图找出 ISD AID),同时还为您提供源代码来详细研究事物,如果您愿意的话。

    【讨论】:

      猜你喜欢
      • 2014-10-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-04-03
      • 1970-01-01
      • 2012-02-21
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多