Oracle Solaris セキュリティーサービス開発ガイド

第 10 章 スマートカードフレームワークの使用

スマートカードとは、マイクロプロセッサとメモリーを備えたポータブルコンピュータのことです。通常、スマートカードの形状と大きさはクレジットカードと同じです。スマートカードを使用すると、認証や暗号化を通じて保護される機密情報を非常に安全に保存できます。

この章で扱う内容は、次のとおりです。

Oracle Solaris スマートカードフレームワークの概要

Solaris オペレーティングシステムでは、スマートカード端末を持つコンシューマアプリケーションへの接続にスマートカードフレームワークが使用されます。コンシューマアプリケーションは、スマートカードフレームワーク (SCF) API の呼び出しを行います。スマートカード端末は、基本的にはデバイスドライバであるインタフェースデバイス (IFD) ハンドラを介してコンシューマアプリケーションとのやりとりを行います。IFD ハンドラは、端末インタフェースを通じてフレームワークに接続します。次の図を参照してください。

図 10–1 スマートカードフレームワーク

スマートカードフレームワークのアーキテクチャーを示しています。

Solaris オペレーティングシステムでは、スマートカードの構成情報を非公開ファイルに格納します。この方法は、通常 /etc/reader.conf が使用される Linux の実装とは対照的です。構成ファイルの項目を変更するには、コマンド smartcard(1M) を使用します。

現時点では、スマートカードフレームワークは Solaris 暗号化フレームワークに依存していません。

スマートカードのコンシューマアプリケーションの開発

SCF API には、スマートカードにアクセスするための 1 組のインタフェースが用意されています。これらのインタフェースを使用すると、低レベルのアプリケーションプロトコルデータユニット (APDU) 形式でスマートカードとの通信を行うことができます。これらのインタフェースは、C と Java の両方で提供されます。これらのインタフェースは、Solaris オペレーティングシステムでサポートされているすべてのリーダー、および APDU で通信を行うすべてのスマートカードで動作します。SCF API は、次のコンポーネントに基づいています。

SCF API には、次のような機能が備わっています。

次の節では、それぞれの SCF インタフェースについて説明します。

SCF セッションインタフェース

SCF セッションには、次の関数が使用されます。

SCF_Session_getSession(3SMARTCARD)

システムのスマートカードフレームワークを使ってセッションを確立します。セッションが開いたら、SCF_Session_getTerminal(3SMARTCARD) を使ってスマートカード端末にアクセスできます。

SCF_Session_close(3SMARTCARD)

セッションが開いたときに割り当てられたリソースを解放します。また、そのセッションに関連付けられている端末またはカードをすべて閉じます。

SCF_Session_getInfo(3SMARTCARD)

セッションに関する情報を取得します。

SCF_Session_freeInfo(3SMARTCARD)

SCF_Session_getInfo(3SMARTCARD) によって戻された記憶領域を解放します。

SCF_Session_getTerminal(3SMARTCARD)

セッション内で特定のスマートカード端末によるコンテキストを確立します。カードの動作 (挿入または取り外し) の検出には、端末オブジェクトが使用されます。端末オブジェクトは、特定のカードにアクセスするためのカードオブジェクトの作成にも使用されます。

SCF 端末インタフェース

SCF 端末のアクセスには、次の関数が使用されます。

SCF_Terminal_close(3SMARTCARD)

端末が開いたときに割り当てられたリソースを解放します。また、端末に関連付けられているカードもすべて閉じます。

SCF_Terminal_getInfo(3SMARTCARD)

端末に関する情報を取得します。

SCF_Terminal_freeInfo(3SMARTCARD)

SCF_Terminal_getInfo(3SMARTCARD) によって戻された記憶領域を解放します。

SCF_Terminal_waitForCardPresent(3SMARTCARD)

特定の端末にカードが装着されるまでブロックおよび待機します。

SCF_Terminal_waitForCardAbsent(3SMARTCARD)

特定の端末に装着されているカードが取り外されるまでブロックおよび待機します。

SCF_Terminal_addEventListener(3SMARTCARD)

端末でイベントが発生したときにコールバック通知をプログラムで受信できるようにします。シグナルハンドラと同じような働きです。イベントが発生すると、サービススレッドによって用意されたコールバック関数が実行されます。

SCF_Terminal_updateEventListener(3SMARTCARD)

この端末に関連付けられている指定のイベントリスナーを更新します。

SCF_Terminal_removeEventListener(3SMARTCARD)

この端末に関連付けられている指定のイベントリスナーをリスナーリストから削除します。

SCF_Terminal_getCard(3SMARTCARD)

端末内で特定のスマートカードによるコンテキストを確立します。SCF_Card_exchangeAPDU(3SMARTCARD) で APDU をカードに送信する際にはカードオブジェクトが使用されます。

SCF カードとその他のインタフェース

スマートカードへのアクセスと状態の取得には、次の関数が使用されます。

SCF_Card_close(3SMARTCARD)

カードが開いたときに割り当てられたメモリーやスレッドなどのリソースを解放します。また、そのカードによって保持されていたロックも解放します。

SCF_Card_getInfo(3SMARTCARD)

カードに関する情報を取得します。

SCF_Card_freeInfo(3SMARTCARD)

SCF_Card_getInfo(3SMARTCARD) によって戻された記憶領域を解放します。

SCF_Card_lock(3SMARTCARD)

特定のカードに対するロックを取得します。この関数を使用すると、アプリケーションはほかのスマートカードアプリケーションからの干渉を受けないで、多重 APDU トランザクションを実行できます。

SCF_Card_unlock(3SMARTCARD)

特定のカードからロックを削除します。

SCF_Card_exchangeAPDU(3SMARTCARD)

コマンド APDU をカードに送信し、カードの応答を読み取ります。

SCF_Card_waitForCardRemoved(3SMARTCARD)

特定のカードが削除されたかどうかを確認します。削除された後で別のカードまたは同じカードが再度挿入された場合は、古いカードが削除されたことを報告します。

SCF_Card_reset(3SMARTCARD)

特定のカードをリセットします。

SCF_strerror(3SMARTCARD)

状態コードを記述する文字列を取得します。

スマートカード端末用の IFD ハンドラの開発

Solaris OS 用に開発されるスマートカード端末では、Linux のスマートカード端末で使用されるのと同じ API セットが使用されます。以前に IFD ハンドラを開発したことがない場合は、IFD ソースコードを提供する Linux 環境用のいずれかの Web サイト(http://www.musclecard.com/drivers.html など) を参照したほうがよいでしょう。Solaris オペレーティングシステムでスマートカード端末用の IFD ハンドラを開発するには、 /usr/include/smartcard/ifdhandler.h をインクルードし、次のインタフェースを実装する必要があります。


注 –

IFDHCreateChannel()IFDHSetCapabilities()、および IFDHControl() は現在使用されていませんが、これらのインタフェースは今後のリリースで必要になる場合があります。


IFDHICCPresence() および IFDHPowerICC() の各関数はテストの際に役に立ちます。たとえば、IFDHICCPresence() 関数を使用して、スロット内にカードが存在するかどうかをテストできます。スマートカードの電源が正常に機能しているかどうかを確認する場合は、IFDHPowerICC() 関数を使用するのも 1 つの方法です。この関数は、挿入されているスマートカードの ATR (Answer to Reset) 値を取得します。

スマートカード端末のインストール

Solaris スマートカードフレームワークは、USB 端末などのホットプラグ可能な端末には対応していません。スマートカード端末に接続してインストールするには、次の手順を実行してください。

  1. スマートカード端末をシステムに物理的に接続します。

  2. IFD ハンドラ用の共有ライブラリをシステムにコピーします。

  3. smartcard(1M) を使用して、端末用の IFD ハンドラをフレームワーク内に登録します。