繁体   English   中英

记录Java Card小程序中的所有APDU

[英]Log all APDUs inside a Java Card applet

是否可以将发送到Java Card小程序的所有APDU命令保存在该小程序中?

例如:终端发送00 B2 01 0C 00 ,我想将其保存在我的applet内的某个地方,以便以后进行分析。

当然可以。 需要生成某种持久缓冲区。 有很多技巧可以做到这一点。

最简单的方法是生成一个列表,其中每个节点都有一个新数组,您可以在其中复制命令。 只需简单地确定命令大小,然后复制所有内容即可。不要忘记为类型2和类型4命令复制Le字节。

最好的方法可能是生成一个巨大的数组并将每个命令复制到该数组。 持久数组只是使用new byte[size]生成的字段。 请注意,数组的最大大小为32 Ki-1您可能希望将命令的大小存储在命令之前或单独的持久性数组中。

由于卡上持久性存储的数量通常很少,因此您可能需要生成某种循环缓冲区,以便在其中重复使用或覆盖最早的命令。 请注意,通常不可能进行垃圾回收,如果存在,则通常仅在启动期间运行,可能会花费很长时间。

您可以立即在applet的process方法中复制标题。 收到字节后,您仅应复制其余命令数据,例如,在使用setIncomingAndReceive并最终为Le字节使用setOutgoing / setOutgoingAndSend

最后,您还需要一些命令来读出日志。 请注意,如果包含Le字节,则命令可以是4 + 1 + 255 + 1 = 262个字节。 命令响应仅包含256个字节+状态字。 因此,您可能需要分多个部分读取它,例如使用计数器来指示特定的APDU和偏移量。

扩展长度的APDU本身值得一章,因此我暂时将其省略。


如果您不介意的话,我也会把实际的实现留作练习,您可能会有一个接口,例如:

interface APDULogger {
    short logNewCommand(byte[] commandHeader, short commandHeaderOffset);
    void logNc(short nc);
    void logCommandData(byte[] commandData, short commandDataOffset, short commandDataSize);
    void logNe(short ne);
}

interface APDURetreiver {
    void retrieveCommand(short history, byte[] commandHeader, short commandHeaderOffset);
    short retrieveNc();
    short retrieveCommandData(byte[] commandData, short commandDataOffset, short maxCommandDataSize);
    short retrieveNe();
}

但是请注意,这只是我的主意。 您可能也想保持某种状态(两次调用logNe(short)方法签名可能是一个错误)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM