[英]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.