2016-01-12 190 views
1

我正尝试在Objective-C中使用PCSC命令读取智能卡。APDU命令错误 - 响应6C6B

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响应。你能帮我解决这个问题吗?

回答

2

状态字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将其解释为壳体1命令(见ISO 7816-3,第12.1.2节为命令APDU的情况下描述)。

祝你好运!


PS:请考虑检查您的receive_length变量为同样的问题。


编辑>关于61XX状态:

由于@guidot写道,你需要发出GET RESPONSE(另一个命令)接收到该状态字后,立即得到响应数据。

援引ISO 7816-4:

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

上面提到的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个字节)。

+0

@vip,感谢您的回复。现在我发送了无符号字符get_cplc_command [] = {0x00,0xA4,0x04,0x00,0x0c,0xA0,0x00,0x00,0x02,0x43,0x00,0x13,0x00,0x00,0x00,0x01,0x01}作为命令。现在响应是6121.我试图改变第四个参数的sizeof,它给了我兼容性错误。如果回复代码6121,请告诉我如何纠正此问题。 –

+0

@SaiKiran:这应该是一个单独的问题。尽管如此,简短的回答是:命令正常工作,你有一个T = 0卡,需要发送GET RESPONSE来检索答案。我建议您熟悉ISO 7816-3和ISO 7816-4。 – guidot

+0

@SaiKiran我更新了答案。兼容性错误很奇怪,应该可以将'int'强制转换为'DWORD'而不会出现任何问题....可能是Objective-C专业。祝你好运! – vlp