在T=0协议中,case 1& case 2 APDU与case 3和case 4 APDU的TPDU是相同的,因此,对于智能卡端的T=0协议,无法区分case 1&2和案例3&4 APDU。事实上,除非智能卡试图读取数据字节,否则甚至无法区分case 2和3 APDU,如果终端发送的实际APDU是例2 APDU,则会导致失败。
但是,由于在T=1协议中,TPDU对应于APDU,所以卡片知道APDU接收到的是哪种情况。
问题是,Java是否为T=1协议提供了任何方法:
发布于 2017-05-07 02:26:19
1.知道接收到的APDU是否是数据APDU,因此可以安全地调用setIncomingAndReceive()
现在,这是一个有趣的问题;似乎可以使用getIncomingLength:
APDU头中由Lc字段指示的传入字节长度。如果没有传入数据,则返回0(案例1)
但它在特例描述中说:
如果
APDUException.ILLEGAL_USE没有调用setIncomingAndReceive(),或者以前调用了setOutgoing()或setOutgoingNoChaining(),则为setOutgoing()。
对于setIncomingAndReceive(),您可以读到:
此方法只应在case 3或case 4命令上调用,否则可能会导致错误行为。
这里似乎有一个陷阱;我将询问我的一个资源,关于如何处理这个问题。同时,setIncomingAndReceive或getIncomingLength不太可能(但不是不可能)为1或2个APDU抛出异常。
2.从例4中读取的Le字节
好的,是的,通过读取Nc值,然后在接收到的字节中前进,以到达命令后面的Le字节。但是通常情况下,通过调用setOutgoing (返回)更容易使用Ne (实际长度而不是长度的编码):
Ne,预期响应长度
3.知道实际是否从终端接收到Le字节(在APDU缓冲区中的P3为0x00的模糊情况下)
如果P3 = 0x00,那么据我所知,P3 就是的Le字节。我不认为这是模棱两可的。Lc被禁止具有此价值。
备注:
process方法处理APDU期间)是否应该得到一个特定的情况--您可以抛出不需要的异常;https://stackoverflow.com/questions/43823009
复制相似问题