【问题标题】:T=0 and T=1 and Get Response command relation?T=0 and T=1 和 Get Response 命令的关系?
【发布时间】:2015-12-26 07:25:32
【问题描述】:

我有一个 Java 卡,上面安装了一个小程序,当我向它发送 00 40 00 00 时,它会返回以下响应:

Connect successful.
Send: 00 40 00 00
Recv: 61 32
Time used: 15.000 ms

Send: 00 C0 00 00 32
Recv: 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E 1F 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 90 00
Time used: 15.000 ms

我使用的工具 (PyAPDUTool) 有一个标记为“自动获取响应”的选项。当我选中此选项时,我不再需要发送 Get Response 命令 (00 c0 00 00 32):

Send: 00 40 00 00
Recv: 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E 1F 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 90 00
Time used: 15.000 ms

好的。现在我想在另一张 Java 卡上具有上述行为。于是我写了如下程序:

package testPrjPack;

import javacard.framework.*;

public class TestPrj extends Applet
{
    public static byte[] data = {(byte)0x01 ,(byte)0x02 ,(byte)0x03 ,(byte)0x04 ,(byte)0x05 ,(byte)0x06 ,(byte)0x07 ,(byte)0x08 ,(byte)0x09 ,(byte)0x0A ,(byte)0x0B ,(byte)0x0C ,(byte)0x0D ,(byte)0x0E ,(byte)0x0F ,(byte)0x10 ,(byte)0x11 ,(byte)0x12 ,(byte)0x13 ,(byte)0x14 ,(byte)0x15 ,(byte)0x16 ,(byte)0x17 ,(byte)0x18 ,(byte)0x19 ,(byte)0x1A ,(byte)0x1B ,(byte)0x1C ,(byte)0x1D ,(byte)0x1E ,(byte)0x1F ,(byte)0x20 ,(byte)0x21 ,(byte)0x22 ,(byte)0x23 ,(byte)0x24 ,(byte)0x25 ,(byte)0x26 ,(byte)0x27 ,(byte)0x28 ,(byte)0x29 ,(byte)0x2A ,(byte)0x2B ,(byte)0x2C ,(byte)0x2D ,(byte)0x2E ,(byte)0x2F ,(byte)0x30 ,(byte)0x31 ,(byte)0x32};

    public static void install(byte[] bArray, short bOffset, byte bLength) 
    {
        new TestPrj().register(bArray, (short) (bOffset + 1), bArray[bOffset]);
    }

    public void process(APDU apdu)
    {
        if (selectingApplet())
        {
            return;
        }

        byte[] buf = apdu.getBuffer();
        switch (buf[ISO7816.OFFSET_INS])
        {
        case (byte)0x40:
            ISOException.throwIt((short)0x6132);            
            break;
        case (byte)0xC0:
            Util.arrayCopyNonAtomic(data,(short)0, buf, (short)0, (short)0x32);
            apdu.setOutgoingAndSend((short)0,(short)0x32);
            break;
        default:
            ISOException.throwIt(ISO7816.SW_INS_NOT_SUPPORTED);
        }
    }

}

在新的 Java 卡上安装 .cap 文件后,我对选中和未选中的 Auto Get Response 选项都有以下响应:

正如您在上面看到的,Auto Get Response 不再起作用,我需要手动发送 Get Response 命令。

我很想知道这个工具或我的程序有什么问题?问题与通信协议有关吗? (第一张卡使用T=0,第二张使用T=1)。

【问题讨论】:

  • PYapdu 工具是开源工具还是它的专有工具?我看到很多地方有人使用这个工具。如果这是开源的,你能把下载链接分享给我吗?
  • @Arjun 我不知道它是否是开源的,但它是免费的。你可以下载它here。安装后,您可以使用 30 天试用版。要将其扩展至 65535 天,您只需在网站上注册(而且是免费的!)。

标签: javacard


【解决方案1】:

没有错。 T=1 根本不使用 GET RESPONSE,因此 Python 没有理由自动处理它。

重要提示:请注意,Java Card 会自动处理GET RESPONSE,因此您永远不必显式实现它。

【讨论】:

  • 谢谢博德维斯先生。因此,您的意思是,此工具使用的库的编写方式是,仅当传输协议为T=0(而不是T=1)时,它才会自动发送响应61XX 的Get Response 命令?
  • @Abraham 我还没有验证它,但这似乎是最合理的解释。以这种方式实现它是正确的。 T=0 是一种面向字节的传输协议,不能同时处理同一 APDU(命令/响应对)的命令和响应数据,因此是 GET RESPONSE。
  • 为什么应用程序应该知道传输协议?是不是只和读卡器驱动和卡有关?我的意思是,谁决定传输协议?(读卡器和卡?还是应用程序?)
  • 视情况而定,但通常是根据ATR中的信息来选择。有些卡允许两者兼而有之;我认为如果 PCSC 层可以选择,它会选择 T=1,但我显然必须重新阅读协议的那部分。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-06-15
  • 2021-08-30
  • 2019-04-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-12-22
相关资源
最近更新 更多