スマートカードとは、マイクロプロセッサとメモリーを備えたポータブルコンピュータのことです。通常、スマートカードの形状と大きさはクレジットカードと同じです。スマートカードを使用すると、認証や暗号化を通じて保護される機密情報を非常に安全に保存できます。
この章で扱う内容は、次のとおりです。
Solaris オペレーティングシステムでは、スマートカード端末を持つコンシューマアプリケーションへの接続にスマートカードフレームワークが使用されます。コンシューマアプリケーションは、スマートカードフレームワーク (SCF) API の呼び出しを行います。スマートカード端末は、基本的にはデバイスドライバであるインタフェースデバイス (IFD) ハンドラを介してコンシューマアプリケーションとのやりとりを行います。IFD ハンドラは、端末インタフェースを通じてフレームワークに接続します。次の図を参照してください。
Solaris オペレーティングシステムでは、スマートカードの構成情報を非公開ファイルに格納します。この方法は、通常 /etc/reader.conf が使用される Linux の実装とは対照的です。構成ファイルの項目を変更するには、コマンド smartcard(1M) を使用します。
現時点では、スマートカードフレームワークは Solaris 暗号化フレームワークに依存していません。
SCF API には、スマートカードにアクセスするための 1 組のインタフェースが用意されています。これらのインタフェースを使用すると、低レベルのアプリケーションプロトコルデータユニット (APDU) 形式でスマートカードとの通信を行うことができます。これらのインタフェースは、C と Java の両方で提供されます。これらのインタフェースは、Solaris オペレーティングシステムでサポートされているすべてのリーダー、および APDU で通信を行うすべてのスマートカードで動作します。SCF API は、次のコンポーネントに基づいています。
端末オブジェクト – 実際のスマートカード端末を抽象化したもの。このオブジェクトは、カードの存在、挿入、または取り外しを検出できます。
カードオブジェクト – 端末に挿入されるスマートカードを表します。このオブジェクトは、APDU 形式の情報を実際のスマートカードに送信します。また、アプリケーションがカードへの排他的アクセスを行えるように相互排他ロックにも対応しています。
SCF API には、次のような機能が備わっています。
スマートカードがリーダーに物理的に存在するかどうか検査する。
スマートカードの動作 (挿入や取り外し) の通知を受信する。
データをスマートカードと交換する。
セッション、端末、およびスマートカードに関する情報を取り出す。
排他的アクセスに備えてスマートカードをロックおよびロック解除する。
次の節では、それぞれの SCF インタフェースについて説明します。
システムのスマートカードフレームワークを使ってセッションを確立します。セッションが開いたら、SCF_Session_getTerminal(3SMARTCARD) を使ってスマートカード端末にアクセスできます。
セッションが開いたときに割り当てられたリソースを解放します。また、そのセッションに関連付けられている端末またはカードをすべて閉じます。
SCF_Session_getInfo(3SMARTCARD) によって戻された記憶領域を解放します。
セッション内で特定のスマートカード端末によるコンテキストを確立します。カードの動作 (挿入または取り外し) の検出には、端末オブジェクトが使用されます。端末オブジェクトは、特定のカードにアクセスするためのカードオブジェクトの作成にも使用されます。
SCF_Terminal_getInfo(3SMARTCARD) によって戻された記憶領域を解放します。
端末でイベントが発生したときにコールバック通知をプログラムで受信できるようにします。シグナルハンドラと同じような働きです。イベントが発生すると、サービススレッドによって用意されたコールバック関数が実行されます。
端末内で特定のスマートカードによるコンテキストを確立します。SCF_Card_exchangeAPDU(3SMARTCARD) で APDU をカードに送信する際にはカードオブジェクトが使用されます。
スマートカードへのアクセスと状態の取得には、次の関数が使用されます。
カードが開いたときに割り当てられたメモリーやスレッドなどのリソースを解放します。また、そのカードによって保持されていたロックも解放します。
SCF_Card_getInfo(3SMARTCARD) によって戻された記憶領域を解放します。
特定のカードに対するロックを取得します。この関数を使用すると、アプリケーションはほかのスマートカードアプリケーションからの干渉を受けないで、多重 APDU トランザクションを実行できます。
特定のカードが削除されたかどうかを確認します。削除された後で別のカードまたは同じカードが再度挿入された場合は、古いカードが削除されたことを報告します。
Solaris OS 用に開発されるスマートカード端末では、Linux のスマートカード端末で使用されるのと同じ API セットが使用されます。以前に IFD ハンドラを開発したことがない場合は、IFD ソースコードを提供する Linux 環境用のいずれかの Web サイト(http://www.musclecard.com/drivers.html など) を参照したほうがよいでしょう。Solaris オペレーティングシステムでスマートカード端末用の IFD ハンドラを開発するには、 /usr/include/smartcard/ifdhandler.h をインクルードし、次のインタフェースを実装する必要があります。
IFDHCreateChannelByName(3SMARTCARD) – 特定のスマートカード端末との通信チャネルを開きます。このインタフェースは、最新バージョンの MUSCLE IFD 仕様の新機能です。このため、IFDHCreateChannelByName() はほかの IFD ハンドラでは使用できません。Solaris ソフトウェアでは、IFDHCreateChannel(3SMARTCARD) 関数の代わりに IFDHCreateChannelByName () が使用されます。
IFDHICCPresence(3SMARTCARD) – リーダー、または論理ユニット番号 (LUN) によって指定されたスロットに ICC (スマートカード) が存在するかどうかを確認します。
IFDHPowerICC(3SMARTCARD) – ICC の電源とリセットの信号を制御します。
IFDHCloseChannel(3SMARTCARD) – LUN によって指定された IFD の通信チャネルを閉じます。
IFDHGetCapabilities(3SMARTCARD) – 指定されたスマートカード、IFD ハンドラ、またはスマートカード端末の性能を戻します。
IFDHSetProtocolParameters(3SMARTCARD) – 特定のスロットまたはカードに対して PTS (Protocol Type Selection) を設定します。PTS の値は、ISO 7816 標準を確認してください。この関数は、フレームワークによって呼び出されないかもしれませんが、実装すべきです。IFDHSetProtocolParameters() を使用して、各種カードが確実にフレームワークと通信できることを確認してください。
IFDHTransmitToICC(3SMARTCARD) – スマートカードと通信するためにフレームワークによって呼び出されます。
IFDHCreateChannel()、IFDHSetCapabilities()、および IFDHControl() は現在使用されていませんが、これらのインタフェースは今後のリリースで必要になる場合があります。
IFDHICCPresence() および IFDHPowerICC() の各関数はテストの際に役に立ちます。たとえば、IFDHICCPresence() 関数を使用して、スロット内にカードが存在するかどうかをテストできます。スマートカードの電源が正常に機能しているかどうかを確認する場合は、IFDHPowerICC() 関数を使用するのも 1 つの方法です。この関数は、挿入されているスマートカードの ATR (Answer to Reset) 値を取得します。
Solaris スマートカードフレームワークは、USB 端末などのホットプラグ可能な端末には対応していません。スマートカード端末に接続してインストールするには、次の手順を実行してください。
スマートカード端末をシステムに物理的に接続します。
IFD ハンドラ用の共有ライブラリをシステムにコピーします。
smartcard(1M) を使用して、端末用の IFD ハンドラをフレームワーク内に登録します。