Windows 7 以降、Windows ロゴ プログラム (WLP) を通じてロゴ認定を受けたスマート カード ミニドライバーは、Windows プラグ アンド プレイ コンポーネントによって自動的にダウンロードされ、インストールされます。 Windows 7 では、PIV 互換カードと GIDS カード エッジをサポートするカード用のクラス ミニドライバーも導入されています。
スマート カードがリーダーに挿入されると、Windows によって以下の検出プロセスが実行されます。
スマート カードのプラグ アンド プレイ プロセス:
このプロセスでは、プラグ アンド プレイを通じて Windows Update からロゴ認定ミニドライバーが要求され、ダウンロードされます。
Winscard 検出プロセス: このプロセスでは、互換性のあるスマート カードが PIV 互換または GIDS 互換のクラス ミニドライバーと関連付けられます。
Windows スマート カード クラス ミニドライバー検出プロセス: このプロセスでは、インストールされたミニドライバーがスマート カードと関連付けられます。
次の表に、さまざまな検出プロセスで使用される AID 値をまとめています。
AID 名 | AID 値 | 説明 |
---|---|---|
PIV AID | A0 00 00 03 08 00 00 10 00 xx yy | バージョン情報を含まない PIV AID です。 Microsoft スマート カード フレームワークでは、最下位 2 バイトは無視されます。 |
MS GIDS AID | A0 00 00 03 97 42 54 46 59 xx yy | バージョン情報を含まない Microsoft (MS) GIDS AID です。 最下位 2 バイトはカードに送信されませんが、以下のようにホストによって予約されます。
|
SC PNP AID | A0 00 00 03 97 43 49 44 5F 01 00 | スマート カードのプラグ アンド プレイ AID です。 |
次の表に、検出プロセスで使用されるファイルをまとめています。
コマンド | 命令 (INS) 値 |
---|---|
MF | 0x3F00 |
EF.ATR | 0x2F01 |
次の表に、さまざまな検出プロセスで使用されるコマンドをまとめています。
コマンド | 命令 (INS) 値 |
---|---|
選択 | 0xA4 |
データの取得 | 0xCA |
GET RESPONSE | 0xC0 |
スマート カードのプラグ アンド プレイ プロセス
互換性のあるインボックス ミニドライバーが利用できない場合、プラグ アンド プレイによってスマート カード ミニドライバーがインストールされます。 プラグ アンド プレイにより、インストールされているスマート カード ミニドライバーも Windows Update を通じて更新されます。
どちらのタスクでも、プラグ アンド プレイ側でスマート カードの一意の ID を取得できる必要があります。 Windows 7 以降では、以下に解説するスマート カード検出プロセスを使用して、プラグ アンド プレイによりカードの一意の ID が取得されます。
プラグ アンド プレイが、ATR から履歴バイトを取得します。 これらのバイトは、この検出プロセスで後ほど使用されます。
プラグ アンド プレイが、SC PNP AID を見つけるために SELECT コマンドを発行し、Windows 独自のタグ 0x7F68 (ASN.1 DER エンコード) を見つけるために GET DATA コマンドを発行します。 詳細については、後出のサブセクション「Windows スマート カード フレームワークのカード識別子」を参照してください。 このコマンドが成功すると、一意の識別子の一覧が返されます。 プラグ アンド プレイは、一覧内の最初の識別子をスマート カードのデバイス ID として使用し、その値をカードの一意の ID に使用します。 詳細については、「デバイス ID」を参照してください。
プラグ アンド プレイが、スマート カード用の一意の ID を取得した場合は、手順 12 に進みます。
Windows が上記の手順でデバイス ID を取得できない場合は、MF と EF.ATR の SELECT コマンドを発行し、続けて READ BINARY コマンドを発行します。Windows が WU のデバイス ID として使用できる一意の識別子の取得に成功した場合は、手順 12 に進みます。
プラグ アンド プレイは、上記の手順で一意の識別子を取得できない場合、PIV AID に対して SELECT コマンドを発行します。 プラグ アンド プレイが取得に成功した場合、スマート カードは PIV 互換デバイスと見なされます。 プラグ アンド プレイは、以下のものをカードの一意の ID として使用します。
- デバイスの互換 ID としての PIV 互換デバイス ID。 詳細については、「互換 ID」をご覧ください。
- デバイス ID としてのカードの ATR 履歴バイト。 ATR 履歴バイトがない場合、Windows はデバイス ID として PIV 互換デバイス ID を使用します。
プラグ アンド プレイが、スマート カード用の一意の ID を取得した場合は、手順 12 に進みます。
手順 4 の SELECT コマンドが失敗した場合、Windows は MS GIDS AID に対して SELECT コマンドを発行します。プラグ アンド プレイが MS GIDS AID の選択に成功した場合、スマート カードは GIDS 互換デバイスと見なされます。 プラグ アンド プレイは、以下のものをカードの一意の ID として使用します。
- 互換 ID としての GIDS 互換デバイス ID。
- デバイス ID としてのカードの ATR 履歴バイト。 ATR 履歴バイトがない場合、プラグ アンド プレイはデバイス ID として GIDS 互換デバイス ID を使用します。
プラグ アンド プレイが、スマート カード用の一意の ID を取得した場合は、手順 12 に進みます。
プラグ アンド プレイが PIV AID か MS GIDS AID を選択できない場合、カードの ATR 履歴バイト (存在する場合) がスマート カードの一意の ID に対応するデバイス ID として使用されます。
プラグ アンド プレイに ATR 履歴バイトがないと、Windows Update に関する情報が不足します。 プラグ アンド プレイは検出プロセスに失敗し、SCARD_E_UNEXPECTED が返されます。
プラグ アンド プレイが、スマート カード用の一意の ID を取得した場合は、手順 12 に進みます。
プラグ アンド プレイが検出プロセスを停止し、一意の識別子を使用します。
Windows 8 以降では、プラグ アンド プレイがカードのドライバーを見つけることができない場合、カードはインボックス NULL ドライバーとペアリングされます。 ここで PC にスマート カード リーダーが接続されているときにカードを機能させるために、カードに固有の追加ソフトウェアが必要になります。
Winscard の検出プロセス
Winscard (Winscard.dll) の検出プロセスは、システム内のカードをインストールされたミニドライバーに関連付けるために使用されます。 このプロセスは、SCardListCards か SCardLocateCards が呼び出されたときに開始されます。
Windows 7 以降では、Winscard の検出プロセスは、以下に解説する流れで進みます。
Winscard が、コンピューターにインストールされているスマート カードを表すさまざまなサブキーについて、Calais キーがあるレジストリを検索します。 これらのサブキーは次の場所にあります。
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Cryptography\Calais\SmartCards
Winscard が、SmartCards サブキー配下の各サブキーを検索して、サブキーの ATR 値とスマート カードから取得された ATR 値を照合します。 一致するものが見つかった場合は、手順 6 に進みます。
Winscard が、ミニドライバーの SmartCards サブキー値と、PIV デバイスの ATR キャッシュ (PIV カード) サブキーか IDMP の ATR キャッシュ (Microsoft GIDS 互換カードのもの) サブキー内の値を照合します。 一致するものが見つかった場合は、手順 6 に進みます。
Winscard が、MS GIDS AID に対して SELECT コマンドを発行します。 このコマンドが成功した場合は、手順 6 に進みます。
手順 4 が失敗した場合、Winscard が PIV AID に対して SELECT コマンドを発行します。 このコマンドが成功した場合は、手順 6 に進みます。
Winscard が、カードの名前を返します。これは、カードに一致するミニドライバーのレジストリ キーに対応しています。
次の表に、Winscard の検出プロセスで使用されるさまざまなレジストリ キーについての解説をまとめています。
レジストリ キー | 用途 |
---|---|
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Cryptography\Calais\SmartCards | Winscard は、このキーを手順 1 の Calais\SmartCards キーとして使用します。 |
HKEY_LOCAL_MACHINE\ SOFTWARE\Microsoft \Cryptography\Calais\PIV Device ATR Cache | 手順 4 で一致するものが見つかった場合は、一致したカードの完全な ATR が、このレジストリ キーにバイナリ値として格納されます。 エントリの名前がランダムに選択されます。 このエントリがキャッシュされた後で、パフォーマンスを向上させるために手順 3 で使用されます。 |
HKEY_LOCAL_MACHINE\ SOFTWARE\Microsoft \Cryptography\Calais\IDMP ATR Cache | 手順 5 で一致するものが見つかった場合は、このレジストリ キー内に一致したカードの完全な ATR がバイナリ値として格納されます。 エントリの名前がランダムに選択されます。 このエントリがキャッシュされた後で、パフォーマンスを向上させるために手順 3 で使用されます。 |
Windows スマート カード クラス ミニドライバーの検出プロセス
Windows スマート カード クラス ミニドライバーは、CardAcquireContext が呼び出されると、以下の検出プロセスを実行します。 ミニドライバーは、関連付けられているカードを PIV 互換または Microsoft GIDS 互換としてマークするために、この検出プロセスを実行します。
ミニドライバーは、PIV AID に対して SELECT コマンドを発行します。 コマンドが成功すると、カードは PIV 互換としてマークされ、検出プロセスは停止します。
成功しなかった場合、ミニドライバーは MS GIDS AID に対して SELECT コマンドを発行します。 コマンドが成功した場合、または AID が見つからなかった場合、ミニドライバーはカードを MS GIDS としてマークします。
スマート カードが過去にクラス ミニドライバーを使用する Winscard 検出プロセスを通じて検出されている場合は、PIV や GIDS AID に対する SELECT コマンドに応答しない可能性があります。 この状況は、カスタム AID を使用して GIDS カード エッジを実装するベンダーのカードに違いありません。 そのようなカードでは、追加のデータ オブジェクトを使用して Microsoft スマート カード データ モデルを拡張できます。
PIV/GIDS スマート カード ベンダーは、Windows スマート カード クラス ミニドライバーを使用し、INF のみのインストール パッケージを提供することでブランディングできます。 互換性のあるカードでのクラス ミニドライバーの使用の詳細については、「スマート カードのプラグ アンド プレイ」の INF サンプルを参照してください。 INF でのプラグ アンド プレイ照合には履歴バイトのみが使用されます。
ベンダーが提供する INF ファイルは、以下の情報を含むエントリを、Calais\SmartCards レジストリのサブキーに作成します。
エントリ名 | Type | Value |
---|---|---|
80000001 | String | カードのミニドライバーの場所です。 これは、ベンダー提供のミニドライバーへの完全なパス、または system32 ディレクトリ内もしくはドライバー ストア内のファイル名であり得ます。 ドライバー パッケージによって提供されるミニドライバーは、ミニドライバーへの完全なパスを指定し、ミニドライバーはドライバー ストアから実行することをお勧めします。 インボックス ミニドライバーの msclmd.dll は、%windir%\system32 ディレクトリに格納されます。 |
ATR | バイナリ | カードの ATR です。 |
ATRMask | バイナリ | カードの ATR マスクです。 |
Crypto Provider | String | Microsoft Base Smart Card Crypto Provider |
Smart Card Key Storage Provider | String | Microsoft スマート カード キー記憶域プロバイダー |
選択メカニズム
Microsoft 識別子を含むアプリケーション
Windows スマート カード フレームワークは、Microsoft プラグ アンド プレイ AID を使用してアプリケーションの選択を試みます。 指定した AID をカードがサポートしていない場合は、SELECT コマンドの後にエラーが返されます。 SELECT コマンドが正常に完了すると、フレームワークは GET DATA コマンドを発行して、カードとそれに対応するスマート カード ミニドライバーの識別を試みます。
GET DATA コマンドは、SC プラグ アンド プレイ AID がサポートされているかどうかに関係なく実行されます。 これにより、他の AID に関連付けられているアプリケーションや、AID に関連付けられていないアプリケーションであっても、この仕様でカード選択メカニズムを実装できます。
データの取得
カードでプラグ アンド プレイ MS AID が選択されると、スマート カード フレームワークは、0x7F68 の Windows 独自のタグを使用して GET DATA コマンドを発行します。 カードが GET DATA コマンドと独自のタグをサポートしていれば、応答として 1 つ以上の一意の識別子のリストが返されます。 一意の識別子は、後出の「Windows スマート カード フレームワークのカード識別子」セクションの定義に従った構造になっている必要があります。
Windows スマート カード フレームワークは、一覧内の最初の一意の識別子のみを使用して、適切なスマート カード ミニドライバーを検索、インストールします。 その他の識別子は、将来使用される可能性があります。
SELECT PIV AID コマンド
PIV アプリケーションを特定するために、Windows は SELECT PIV AID コマンドを発行します。 このコマンドが成功すると、カードに存在している PIV アプリケーションが選択されます。 この場合には、Windows スマート カード フレームワークは、PIV 準拠のミニドライバーをカードに関連付けることができます。
SELECT MS GIDS AID コマンド
MS GIDS アプリケーションを特定するためには、SELECT MS GIDS AID コマンドが使用されます。 このコマンドが成功すると、カードに存在している MS GIDS アプリケーションが選択されます。 Windows スマート カード フレームワークで、MS GIDS 準拠のミニドライバーをカードに関連付けられるようになりました。
ATR 履歴バイトの使用
以下の状況下では、Windows スマート カード フレームワークは、ATR 履歴バイトを使用して読み込むミニドライバーを決定する状態に戻ります。
- スマート カードが GET DATA コマンドをサポートしていない
- スマート カードがこの仕様の AID 選択方法をサポートしていない
ATR 履歴バイトの使用は、挿入されたカードの識別に使われていた従来の方法です。 フレームワークは、すべての履歴バイトを使用して履歴バイトを検索します。
Windows スマート カード フレームワークのカード識別子
スマート カードが GET DATA コマンドをサポートしている場合、Windows スマート カード フレームワークでは、次の ASN.1 構造体の書式設定で DER-TLV エンコードのバイト配列がカードから返されることが想定されます。
CardID ::= SEQUENCE {
version Version DEFAULT v1,
vendor VENDOR,
guids GUIDS }
Version ::= INTEGER {v1(0), v2(1), v3(2)}
VENDOR ::= IA5STRING(SIZE(0..8))
GUID ::= OCTET STRING(SIZE(16))
GUIDS ::= SEQUENCE OF GUID
Version メンバーは、0 (v1) に設定する必要があります。
VENDOR メンバーは、"MSFT" に設定する必要があります。
GUID メンバーは、カード/アプリケーションの組み合わせを一意に特定する 16 バイトの GUID です。 この値は、適切なスマート カード ミニドライバーを検出して読み込むために使用されます。
Note
アプリケーションを発行する IHV や ISV は、そのカード/アプリケーションの組み合わせに対して一意の GUID を作成する必要があります。