簡體   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