2016-11-14 13 views
2

そのアプレット内のJava Cardアプレットに送信されたすべてのAPDUコマンドを保存することはできますか?Java Cardアプレット内のすべてのAPDUをログに記録

たとえば、端末が00 B2 01 0C 00を送信した場合、後で分析できるように、アプレットのどこかに保存します。

+0

あなたはJava Cardの中に保存することを意味しますか?または実行時/端末/ IFD /などでJava Cardを呼び出す? –

+2

私は後で分析するためにJava Cardの中に保存することを意味します – Clarke

答えて

5

確かに可能です。何らかの永続バッファを生成する必要があります。これを行うには様々なトリックがあります。

最も簡単なのは、リストを生成することです。各ノードには、コマンドをコピーする新しい配列があります。単にコマンドのサイズを決めてから、すべてをコピーしてください。タイプ2とタイプ4のコマンドのLeバイトをコピーするのを忘れないでください。

おそらく最も良い方法は、巨大な配列を生成し、それにすべてのコマンドをコピーすることです。永続的な配列は、単にnew byte[size]を使って生成されたフィールドです。配列の最大サイズは32 Ki - 1です。コマンドの前にコマンドのサイズを格納するか、別の固定配列に格納することができます。

カード上の永続的な記憶領域の量は、ごくわずかですから、最も古いコマンドを再利用または上書きする何らかの種類の循環バッファを生成することができます。多くの場合、ガベージコレクションは可能ではないことを念頭に置いてください。存在する場合、通常は起動時にのみ実行され、時間がかかることがあります。

すぐに、アプレットのprocessメソッドでヘッダーをコピーできます。コマンドデータの残りの部分は、バイトを受信した後にのみコピーしてください。 setIncomingAndReceiveを使用した後に、最後にsetOutgoing/setOutgoingAndSendをLeバイトとして使用します。

最後に、ログを読み取るためのコマンドも必要です。 Leバイトを含めると、コマンドは4 + 1 + 255 + 1 = 262バイトになることに注意してください。コマンド応答は、256バイト+ステータスワードしか保持しません。だからあなたは複数の部分でそれを読む必要があるかもしれません。カウンタを使用して特定のAPDUおよびオフセットを示す。

APDUの長さはすべて自分自身で1つの章に値するので、今は外しておきます。


私はまた、あなたが気にしない場合は、運動など実際の実装を残しておきます、あなたは、おそらくのようなインターフェースを持っていると思います:

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)メソッドのシグネチャを2回呼び出すとエラーになる可能性があります)。

+0

私はそれ自体は簡単だとは言いませんでした。 –

+3

+1循環バッファーは素晴らしい解決策です。ただし、そのサイズに注意してください。期間が短すぎると、すぐに永続メモリが破損します。もう一つは、ログの有効化/無効化のために何らかのスイッチを実装する必要があります。デバッグのみを有効にする必要があります。このようなロギングメカニズムは、アプレット全体を大幅に遅くします。 – vojta

+0

すべてtrueです。もちろん、あなたは選択肢があります:たくさんのメモリ(そこにはないかもしれません)*または*メモリを再利用してください。しかし、あなたは正しいです、通常、10Kの書き込み以降、スマートカードはそれを1日と呼びます。減速に関しては、永続メモリへの書き込みは、メモリタイプごとに異なりますが、通常非常に遅いです。 –

関連する問題