2

最近、いくつかのカードが付属しているスマートカードリーダー(Gemplus USBスマートカードリーダー)を購入しました。それらを操作する方法についていくつかのチュートリアルを読んでいますが、いくつか質問があります。スマートカードと通信(APDUの送信)しようとしていますが、成功しません。アプレットを仮想スマートカードにインストールしました(Netbeansを使用)。

私のプロセス方法は次のようなものです。

    byte[] buffer = apdu.getBuffer();
    byte CLA = (byte) (buffer[ISO7816.OFFSET_CLA] & 0xFF);
    byte INS = (byte) (buffer[ISO7816.OFFSET_INS] & 0xFF);

    if (CLA != HW_CLA){
        ISOException.throwIt(ISO7816.SW_CLA_NOT_SUPPORTED);
    }        
    switch (INS) {
        case HW_INS_ADD:               
            add(apdu);
            break;
        case HW_INS_SUBTRACT:                
            subtract(apdu);
            break;
        default:
            ISOException.throwIt(ISO7816.SW_INS_NOT_SUPPORTED);
    }

addandメソッドはsubtract、宣言された変数(バランス)に5単位を加算または減算します。操作後の残高をカードに保存したいのですが。その値をカードに書き込む方法を知っている人はいますか?そして、可能であれば、どうすれば前にそれを読むことができますか?

助けに感謝します。ありがとうございました。

4

3 に答える 3

2

答えは簡単です。JavaCardアプレットクラスにフィールドを追加するだけです。「起動」すると、Javacardアプレットはアンインストールされるまで「実行」されます。

もちろん、「実行」は間違った用語です。内部状態を保持し、最初のAPDUの受信後にカードがスマートカードリーダーから取り外された場合でも、次のAPDUがAPDUから受信された場合、その状態はまだ存在します。

于 2013-01-23T10:15:06.057 に答える
2

永続(永続メモリはEEPROMまたはフラッシュを意味します)フィールド内の状態は、アプレットインスタンスが削除されるまで保持されます。非一時的な配列要素内の状態についても同じことが言えます。もちろん、これを実現するには、配列への永続的な参照を保持する必要があります。一時的(一時的はRAMを意味します)CLEAR_ON_DESELECTアレイの内容は、コンテキストスイッチが作成されるとクリアされます。たとえば、別のアプレットが選択されたとき(および現在のアプレットが選択解除されたとき)、またはソフトリセットまたはハードリセットが発生したときです。もちろんCLEAR_ON_RESET、アレイはリセット時(電源の喪失を含む)にのみワイプされます。

基本的に、すべてのオブジェクトインスタンスは永続メモリに存在します。これは、で作成されたオブジェクトインスタンスを意味しますnew。これは、APIが結果が一時的であることを明示的に指定していない、プラットフォームによって作成されたオブジェクトにも当てはまります。APDUバッファ自体process、メソッドが呼び出されるたびに常にクリアされます。

天びんのようなものを保存したい場合、特に操作がアトミックでない場合は、JavaCardトランザクションメカニズムについて知っておく必要があります。

多くのJavaCardシミュレーター は、シミュレーターを含むプロセスが終了したときに状態を保持しないことに注意してください。これは、実際のJavaCard実装がどのように動作するかを適切に表したものではありません。

于 2013-01-23T23:32:01.213 に答える
0

実際には、これらの値を保存しています:)一時変数またはローカル変数として宣言された値は、EEPROMに保存されません。そうでない場合、すべての値はEEPROMに保存され、不揮発性になります。取り外した後、カードを挿入するとアクセスできます。

しかし、あなたが投稿したコードから、私はあなたが使用している変数のタイプを言うことができません。正確な回答が必要な場合は、完全なコードを投稿するだけで、正確に回答します。

于 2013-02-12T11:41:59.003 に答える