【问题标题】:APDU Command Error - response 6C6BAPDU 命令错误 - 响应 6C6B
【发布时间】:2016-01-12 19:50:51
【问题描述】:

我正在尝试使用 Objective-C 中的 PCSC 命令读取智能卡。

  int count = 17;
unsigned char *get_cplc_command = (unsigned char *)calloc(count, sizeof(unsigned char));
get_cplc_command[1]=-92;
get_cplc_command[2]=4;
get_cplc_command[4]=12;
get_cplc_command[5]=-96;
get_cplc_command[8]=2;
get_cplc_command[9]=67;
get_cplc_command[11]=19;
get_cplc_command[15]=1;
get_cplc_command[16]=1;

receive_length = sizeof(receive_buffer);

ret = SCardTransmit(card, 
                    &sendPCI,
                    get_cplc_command, 
                    sizeof(get_cplc_command),
                    NULL,
                    receive_buffer,
                    &receive_length);

LOG(@"SCardTransmit 0x%08x", ret);

当我执行上述命令时,我得到 6C6B 响应。你能帮我解决这个问题吗?

【问题讨论】:

    标签: smartcard apdu


    【解决方案1】:

    状态字6CXX 表示命令APDU 的Le 字段错误。

    引用 ISO 7816-3,表 14:

    由于 Le 字段错误(SW2 编码 Na,即 可用数据字节的确切数量)。在情况 1 和 3 中,卡 不应该使用这样的值。在情况 2 和 4 中,卡片应准备就绪 以 P3 = SW2 接收相同的命令。

    以及 ISO 7816-4,第 5.1.3 节:

    如果 SW1 设置为 '6C',则进程中止并 在发出任何其他命令之前,同样 可以使用 SW2(可用数据字节的确切数量)作为短 Le 字段重新发出命令。


    (虽然不熟悉 Objective-C)我敢打赌SCardTransmit(即sizeof(get_cplc_command))的第四个参数应该是count——因为sizeof 运算符不会给你分配的数组,但指向它的指针的大小。

    [假设 32 位体系结构和 sizeof(unsigned char*) 等于 4]:发送的命令不是 00A404000CA00000024300130000000101,而是 00A40400,它被解释为 case 1 命令(参见 ISO 7816-3,第 12.1 节.2 用于命令 APDU 案例描述)。

    祝你好运!


    PS:请考虑检查您的receive_length 变量是否存在相同问题。


    EDIT> 关于61XX 状态:

    正如@guidot 所写,您需要在收到此状态字后立即发出 GET RESPONSE(另一个命令)以获取响应数据。

    引用 ISO 7816-4:

    如果 SW1 设置为“61”,则该过程完成之前 发出任何其他命令,可以发出 GET RESPONSE 命令 相同的 CLA 并使用 SW2(数据字节数仍然可用)作为 短乐场。

    上述GET RESPONSE 命令也记录在 ISO 7816-4 中(参见例如here)。

    在您的情况下,APDU 交换可能如下所示:

    > 00A404000CA00000024300130000000101 // SELECT command
    < 6121 // SELECT response -- 33 bytes still available
    > 00C0000021 // GET RESPONSE command
    < XXXX...XX9000 // GET RESPONSE response (33 bytes and a status word)
    

    (您必须调用两次SCardTransmit,一次调用00A404000C...,然后调用00C0000021...。如果重复使用,请记住重置receive_length 变量)。


    注意:您可能想尝试发送 00A404000CA0000002430013000000010100 命令 APDU(具有 Le 字段并设置为 0x00 的同一命令 - 意味着您期望响应数据中最多 256 个字节)。

    【讨论】:

    • @vip,感谢您的回复。现在我已将命令发送为 unsigned char get_cplc_command[] = {0x00, 0xA4, 0x04, 0x00, 0x0C, 0xA0, 0x00, 0x00, 0x02, 0x43, 0x00, 0x13, 0x00, 0x00, 0x00, 0x01, 0x01};现在响应是 6121。我尝试更改第 4 个参数的 sizeof,它给了我兼容性错误。如果响应码 6121,请告诉我如何纠正这个问题。
    • @SaiKiran:这应该是一个单独的问题。尽管如此,简短的回答:命令正常工作,您有一张 T=0 卡,需要发送 GET RESPONSE 来检索答案。我建议您熟悉 ISO 7816-3 和 ISO 7816-4。
    • @SaiKiran 我更新了答案。兼容性错误很奇怪,应该可以将int 转换为DWORD 没有问题......可能是Objective-C 的一种特殊性。祝你好运!
    • @guidot 感谢您的回复。我也在浏览 ISO 参考资料。
    • @vip,您的详细回复确实帮助了我。我会和乐场一起尝试的。
    猜你喜欢
    • 2013-01-28
    • 2014-05-09
    • 2022-06-18
    • 1970-01-01
    • 1970-01-01
    • 2020-09-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多