gpt4 book ai didi

java - 记录 Java 卡小程序内的所有 APDU

转载 作者:行者123 更新时间:2023-11-30 06:08:01 25 4
gpt4 key购买 nike

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

例如:终端发送00 B2 01 0C 00,我想将其保存在我的小程序中的某个位置,以便以后能够分析它。

最佳答案

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

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

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

由于卡上持久存储量通常非常小,您可能需要生成某种循环缓冲区,在其中重用或覆盖最旧的命令。请注意,通常不可能进行垃圾收集,即使存在,它通常也只会在启动期间运行,并且可能需要很长时间。

您可以立即在小程序的process方法中复制 header 。您应该只在收到字节后复制其余的命令数据,例如在使用 setIncomingAndReceive 和最后 setOutgoing/setOutgoingAndSend 来获取 Le 字节之后。

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

扩展长度的 APDU 本身就值得用一章来讨论,所以我暂时将它们排除在外。


如果您不介意的话,我还将把实际的实现作为练习,您可能会有一个如下接口(interface):

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) 方法签名两次可能是一个错误)。

关于java - 记录 Java 卡小程序内的所有 APDU,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40599772/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com