2

Microsoft SmartCard APIを使用して SCM 非接触 RFID カード リーダーに取り組んでいます。

私が理解したところでは、スマート カードを操作する通常のプロセスは次の とおり です
。挿入する必要があります。 4. カードが検出されると、関数 SCardGetStatusChange() が戻ります。 5. SCardConnect() を使用して、選択したリーダーを介してカードに接続します 6. SCardTransmit() を使用してカードに話しかけます




5 までのすべてのステップは正常に機能しています。つまり、正しいカード ハンドルを取得したことを意味します。ネゴシエートされたプロトコルとカードの ATR を返す SCardStatus() 関数を発行することで、カードをさらに検証できます。これも正しいものです。しかし、SCardTransmit() を使用して APDU コマンドを送信しようとすると、エラーが返されます (エラー コード 14、SCARD_E_CANT_DISPOSE と推測されます)。

何がうまくいかないのか、何が欠けているのかわかりません。{0xFF、0xCA、0x00、0x00、0x00} を発行してカード UID を読み取る非常に基本的な APDU など、さまざまな APDU を試しました。SCM TestResMan デバッグ ツールを使用してこの APDU を検証したところ、カードの正しい UID が返されました。MiFARE 1k カードと SCM コンタクトレス SCL011 リーダーを使用しています。

以下の SCardTransmit() コード スニペットを見つけてください (以前の関数はすべて成功を返しました)。

SCARD_IO_REQUEST sioreq;
sioreq.dwProtocol = 2; // SCARD_PROTOCOL_T1
sioreq.cbPciLength = 8;

SCARD_IO_REQUEST rioreq;
rioreq.dwProtocol = 2; // SCARD_PROTOCOL_T1
rioreq.cbPciLength = 8;

byte sendbuffer[256], receivebuffer[256];
ULONG sendbufferLen, receivebufferLen, sizeofUID;

sendbuffer[0] = 0xFF; // CLA - Instruction Class
sendbuffer[1] = 0xCA; // Instruction code
sendbuffer[2] = 0x00; // P1 - 1st parameter
sendbuffer[3] = 0x00; // P2 - 2nd parameter
sendbuffer[4] = 0x00;
sendbufferLen = 0x05;

retval = objScWrapper->SCardTransmit(hCardHandle, &sioreq, sendbuffer,
                                     sendbufferLen, NULL, receivebuffer, 
                                     &receivebufferLen);

誰か手がかりや指針があれば教えてください...
TIA !!

4

2 に答える 2

5

受信バッファ サイズは 256 バイトですが、256 バイト (Le = 00h) を要求しており、受信バッファはステータス ワード (SW1 と SW2 の 2 バイトで構成) も必要としています。

したがって、エラー コード 14 は、受信バッファーの一般的な OUT_OF_MEMORY だと思います。

コマンド バッファも小さすぎて、5 バイトのヘッダー + 最大 255 バイトのコマンド データを収めることができません。もちろん、どちらも長すぎる ADPU を処理するには小さすぎます。

Windows は現在、PCSC 互換リーダーのスマート カード リーダー バッファー サイズに関してかなりうるさいです。コマンド バッファには少なくとも 5 + 255 = 260 バイト、受信バッファには 256 + 2 バイトを使用します。バッファーを再利用するか、安全に破棄しないと、メモリ リークが発生します。

于 2012-03-15T23:10:42.270 に答える
0

ほとんどの場合、ここからは良さそうです...いくつかの質問に答えて、どこにでも行けるかどうかを確認してください...

1) SCardConnect で接続する場合、排他的アクセス、共有アクセス、または直接アクセスのいずれで接続しますか? 2) カードに接続するときに、カードが接続されているプロトコルが T1 であることを確認しますか? 3) SCARD_IO_REQUEST rioreq の目的は何ですか? サンプルの行 このオブジェクトは使用されていないようです? 4) API 呼び出しを行うためにラッパーを使用しているようです。ラッパーで内部 SCardTrasmit 実装を共有できますか?

更新された質問に基づいて、この回答を編集します。

于 2012-03-07T16:51:47.580 に答える