以下に、図面を参照しつつ、本願の開示するシーケンス処理プログラム、シーケンス処理装置およびシーケンス処理方法の一実施形態について説明する。以下の実施例では、シーケンス処理の一例として署名処理を例に説明する。なお、関数に基づきリーダライタのオープンやクローズの処理の他、ICカードとの接続や接続解除の処理などの一連の所定単位のシーケンス処理を行うシステム又はプログラムも同様である。後述する実施例は一実施形態にすぎず、本願の開示するシーケンス処理プログラム、シーケンス処理装置およびシーケンス処理方法を限定するものではない。また、後述する各実施例は処理内容に矛盾を生じさせない範囲で適宜組み合わせることもできる。
[署名装置の構成(実施例1)]
図1は、実施例1に係る署名装置の構成を示す機能ブロック図である。なお、図1に示す署名装置200は、関数に基づきリーダライタのオープンやクローズの処理の他、ICカードとの接続や接続解除の処理などの一連の所定単位のシーケンス処理の一例として、署名処理を実行する装置であり、シーケンス処理装置の一例である。図1に示すように、実施例1に係る署名装置200は、リーダライタ100と接続する。なお、署名装置200は、例えば、パーソナルコンピュータ、携帯電話装置、PHS(Personal Handy-phone System)端末、スマートフォン、PDA(Personal Digital Assistant)などのコンピュータである。また、リーダライタ100は、署名装置200と有線通信もしくは無線通信によって接続されるか、署名装置200に内蔵されてもよい。
リーダライタ100は、接触型または非接触型のIC(Integrated Circuit)カードに記憶されている情報を読み取ったり書き込んだりするデバイスである。例えば、リーダライタ100は、近距離無線通信によって、非接触型のICカードに対して情報の読み書きを行う。署名装置200は、リーダライタ100を介して、ICカードに記憶されている情報を取得し、取得した情報を用いて、PKI(Public Key Infrastructure)に基づく署名処理などを行う。例えば、署名装置200が、ウェブブラウザを介して外部のサーバに接続する際に、ICカードの情報を用いて接続認証に関する署名処理を行う場合がある。そのほか、署名装置200が、ICカードの情報を用いてアプリケーション利用時のユーザ認証に関する署名処理を行う場合がある。
例えば、Windows(登録商標)のOS(Operating System)が搭載された署名装置200は、CryptoAPI(Cryptographic API)というWindows標準のインターフェースを有する。そして、署名装置200は、上位のアプリケーションの要求に応じて、CryptoAPIの下で、CSP(Crypto Service Provider)というカード固有のライブラリを動作させることによって署名処理を行う。CSPは、CryptoAPIの実処理を担い、例えば、暗号化やハッシュ値の計算を行う。また、CSPは、例えば、ICカードを提供するベンダによって作成され、ICカードに依存した処理を実行する。また、署名装置200には、複数のCSPがインストールされ得る。
また、図1に示すように、署名装置200は、入力部210と、出力部220と、記憶部230と、制御部240とを有する。入力部210は、キーボードやマウス、タッチパッドなどの入力デバイスを有し、各種情報の入力を受け付ける。出力部220は、モニタやディスプレイなどの出力デバイスを有し、各種情報の出力を受け付ける。なお、出力部220は、入力部210が有するキーボードやマウスなどの入力デバイスと協働したポインティングデバイス機能を実現することができる。
また、図1に示すように、記憶部230は、記録データ231、シーケンスパターンデータ232、関数フラグ対応表データ233および状態乖離記録データ234を記憶する。なお、記憶部230は、例えば、RAM(Random Access Memory)やフラッシュメモリ(flash memory)などの半導体メモリ素子により実装できる。
記憶部230には、記録データ231として、後述する制御部240により署名処理として実行され得るシーケンスごとにシーケンス内で順に実行される各関数の情報が、呼出し元のモジュール名に対応付けて記憶される。なお、署名処理として実行され得るシーケンスとは、該当する署名処理について呼出しが行われた開始関数から終了関数までの一連の処理を意味する。なお、終了関数についての処理が完了しても、次の関数の呼出しが所定の時間内、例えば、1分以内に行われれば、同一のシーケンスとして取り扱うものとする。以下、図2を用いて、記憶部230に記憶される記録データの一例について説明する。
図2は、記録データの一例を示す図である。なお、図2に示す記録データは、制御部240により署名処理において呼び出しが行われた各関数のある時点の呼出しの経過を示すものとする。図2に示すように、記録データ231は、「呼出しモジュール名」、「プロセスID」、「モード」、「使用回数」、「最終使用日」、「終了時刻」、「関数名」および「回数カウント」の複数のデータ項目を有する。呼出しモジュール名は、署名処理において関数の呼出しを行うアプリケーションを特定する情報である。図2に示すように、「呼出し元モジュール名」のデータ項目には、例えば、「****.exe」が記憶されている。プロセスIDは、実行中である署名処理を特定するための情報である。図2に示すように、「プロセスID」のデータ項目には、例えば、「29346」が記憶されている。モードは、署名処理において動作するモードを特定する情報であり、システム上、比較モード、記録モード、終了の3つのモードがある。図2に示すように、「モード」のデータ項目には、比較モードを示す「比較」が記憶されている。なお、比較モード、記録モード、終了の各モードについては制御部240の説明で後述する。使用回数は、シーケンスパターンとして使用された回数を特定する情報である。なお、使用回数は、記録データの記憶時に使用されず、後述するシーケンスパターンとなった際に利用されるデータ項目であるので、図2に示すように、何も記憶されていない。最終使用日は、シーケンスパターンとして使用された最終の日付を特定する情報である。なお、最終使用日は、使用回数と同様に、記録データの記憶時に使用されず、後述するシーケンスパターンとなった際に利用されるデータ項目であるので、図2に示すように、何も記憶されていない。終了時刻は、同一のプロセスIDが付与された署名処理において終了関数の呼出しが行われた時刻を特定する情報である。なお、終了時刻は、図2は、署名処理において終了関数の呼出しが行われる前の途中経過を表しているので、図2に示すように、現時点では何も記憶されていない。関数名は、CSPの処理において呼出しが行われた関数名を特定する情報である。図2に示すように、「関数名」のデータ項目には、現時点で、開始関数である「1:CPAcquireContext」から順に、「2:CPCreateHash」、「3:CPHashData」、「4:CPSignHash」の4つの関数名が記憶されている。回数カウントは、署名処理において呼出しが行われた関数のうち、繰り返し呼出しが行われた関数の呼出し回数を示す情報である。図2に示すように、関数名「4:CPSignHash」に対応する「回数カウント」のデータ項目には、現時点で、「2」が記憶されている。なお、図2には、関数名のみを順に記憶する場合の一例を示しているが、関数名と関数を呼び出すためのパラメータとの組合せを順に記憶するようにしてもよい。
また、記憶部230には、シーケンスパターンデータ232として、署名処理として実行され得る複数の個別シーケンスごとに各シーケンス内で順に実行される関数と、ICカードまたはリーダライタ100への接続または解除処理の要否とが対応付けて記憶される。このシーケンスパターンデータ232は、後述する制御部240による一致判定に用いられる。一致判定の処理については後述する。なお、署名処理において終了関数の呼出しから一定時間が経過することにより、署名処理に伴って逐次記憶された上述の記録データが一連の処理シーケンスを表すシーケンスパターンデータ232となる。以下、図3を用いて、記憶部230に記憶されるシーケンスパターンデータの一例について説明する。
図3は、シーケンスパターンデータの一例を示す図である。なお、図3には、図2に示すような記録データ231に基づいて作成されるシーケンスパターンを示す。例えば、図2に示すような記録データ231がシーケンスとしての条件を満足すれば、記録データ231から別スレッドとして立ち上げられてシーケンスパターンデータ232として記憶される。なお、シーケンスパターンデータ232の元となった記録データ231は記憶部231から削除してもよい。図3に示すように、シーケンスパターンデータ232は、「パターンID」、「呼出しモジュール名」、「プロセスID」、「モード」、「使用回数」、「最終使用日」、「終了時刻」および「関数名」の複数のデータ項目を有する。パターンIDは、シーケンスパターンを特定する情報である。図3に示すように、「パターンID」のデータ項目には、例えば、「000001」が記憶されている。なお、「呼出しモジュール名」、「プロセスID」、「モード」、「使用回数」、「最終使用日」、「終了時刻」および「関数名」は、上述した記録データと同様の情報である。図3に示すように、「呼出しモジュール名」のデータ項目には、例えば、「****.exe」が記憶されている。また、図3に示すように、「プロセスID」のデータ項目には、例えば、「29346」が記憶されている。また、図3に示すように、「モード」のデータ項目には、「終了」が記憶されている。また、図3に示すように、「使用回数」のデータ項目には、例えば、「1回」が記憶されている。なお、図3には、「使用回数」として「1」が記憶されているので、図3に示すシーケンスパターンデータ232が、署名処理において、後述する一致判定に1度使用されたことになる。また、図3に示すように、「最終使用日」のデータ項目には、例えば、「2011/1/1」が記憶されている。なお、図3には、「最終使用日」として「2011/1/1」が記憶されているので、図3に示すシーケンスパターンデータ232が、署名処理において、後述する一致判定に2011年1月1日に最後に使用されたことになる。また、図3に示すように、「終了時刻」のデータ項目には、例えば、「2010/1/1 12:00:00」が記憶されている。また、「関数名」のデータ項目には、開始関数から終了関数まで9つの関数名が順に記憶されている。図3に示すように、「1:CPAcquireContext」、「2:CPCreateHash」、「3:CPHashData」、「4:CPGetHashParam」、「5:CPDestroyHash」、「6:CPCreateHash」、「7:CPSignHash」、「8:CPDestroyHash」、「9:CPReleaseContext」の各関数名が順に記憶されている。
そして、図3に示すように、シーケンスパターンデータ232には、各関数名ごとに、ICカードまたはリーダライタ100への接続処理または接続解除処理の要否を示すフラグが対応付けて記憶されている。さらに、図3に示すように、シーケンスパターンデータ232には、関数名に対応付けて回数任意の関数であるか否かを示すフラグが対応付けて記憶されている。なお、RWオープンはリーダライタ100のオープン処理、言い換えればリーダライタ100への接続処理を示す。RWクローズはリーダライタ100のクローズ処理、言い換えればリーダライタ100との接続解除処理を示す。なお、以下では、リーダライタ100への接続処理をオープン処理と表記し、リーダライタ100との接続解除処理をクローズ処理と表記するものとする。また、カードオープンはICカードへのアクセスについてのオープン処理、言い換えればICカードへの接続処理を示す。カードクローズはICカードへのアクセスについてのクローズ処理、言い換えればICカードとの接続解除処理を示す。なお、以下では、ICカードに対する処理を、接続処理および接続解除処理と表記するものとする。また、回数任意は、繰り返し実行される回数に関わらず、1つの関数として取り扱う関数を示す。そして、フラグが「1」である場合には該当の処理を実行することを意味し、フラグが「0」である場合には該当の処理を実行しないことを意味する。例えば、図3に示すシーケンスパターンデータでは、関数名「1:CPAcquireContext」に対応付けて、RWオープンに関するフラグ「1」が記憶されている。一方、図3に示すシーケンスパターンデータでは、関数名「1:CPAcquireContext」に対応付けて、RWクローズ、カードオープン、カードクローズ、回数任意に関するフラグ「0」が記憶されている。このため、関数名「1:CPAcquireContext」の処理では、リーダライタ100のオープン処理を実行することとなる。一方で、関数名「1:CPAcquireContext」の処理では、リーダライタ100のクローズ処理、ICカードの接続処理および接続解除処理を実行しない。
なお、図2や図3に示す各種データは一例であり、そのデータ形式は任意のものを採用することができる。
また、記憶部230には、関数フラグ対応表データ233として、予め関数ごとに、ICカードまたはリーダライタ100への接続または解除処理の要否を規定したデータが記憶される。この関数フラグ対応表データ233は、後述する制御部240によるシーケンスパターンデータの生成に用いられる。シーケンスパターンデータの生成については後述する。以下、図4を用いて、関数フラグ対応表データ233の一例について説明する。
図4は、関数フラグ対応表データの一例を示す図である。図4に示すように、関数フラグ対応表データ233は、「関数名」のデータ項目に記憶された各関数名ごとに、RWオープン、RWクローズ、カードオープン、カードクローズおよび回数任意の各データ項目のデータが対応付けて記憶されている。例えば、関数フラグ対応表データ233には、「関数名」ごとに、RWオープン、RWクローズ、カードオープン、カードクローズおよび回数任意について、「1」または「0」のフラグが記憶されている。
図4に示すように、関数フラグ対応表データ233には、関数名「CPAcquireContext」について、例えば、RWオープンに対するフラグとして「1」が記憶され、RWクローズ、カードオープンおよびカードクローズに対するフラグとして「0」が記憶されている。つまり、関数フラグ対応表データ233は、関数名「CPAcquireContext」の処理にて、RWオープンの処理を行い、RWクローズ、カードオープンおよびカードクローズの処理を行わないことを予め規定している。また、図4に示すように、関数フラグ対応表データ233には、関数名「CPAcquireContext」について、例えば、回数任意に対するフラグとして「0」が記憶されている。つまり、関数フラグ対応表データ233は、関数名「CPAcquireContext」が回数任意ではないことを予め規定している。なお、関数フラグ対応表データは、例えば、CSPとともに、ICカードを提供するベンダによって作成され、CSPとともに、署名装置200にインストールされる。
また、記憶部230には、状態乖離記録データ234が記憶されている。この状態乖離記録データ234には、ICカードまたはリーダライタ100への接続または解除処理を伴って関数を実行した場合には、当該処理後のICカードまたはリーダライタ100との接続状態を保持するためのデータを含んでいる。さらに、この状態乖離記録データ234には、ICカードまたはリーダライタ100への接続または解除処理を行わずに関数を実行した場合に、当該処理を行ったものとしてICカードまたはリーダライタ100との接続状態を保持するためのデータを含んでいる。この状態乖離記録データ234は、後述する制御部240によるリカバリ処理に用いられる。リカバリ処理については後述する。以下、図5を用いて、状態乖離記録データ234の一例について説明する。
図5は、状態乖離記録データの一例を示す図である。図5に示すように、状態乖離記録データ234には、シーケンスパターンデータ232に従って関数の処理を実行した後の、リーダライタ100との接続状況が現状のステータスとして記憶されている。また、図5に示すように、状態乖離記録データ234には、シーケンスパターンデータ232に従わずに関数の処理を実行したと仮定した場合の、リーダライタ100との仮想的な接続状況が本来のステータスとして記憶されている。また、図5に示すように、状態乖離記録データ234には、ICカードについても、リーダライタ100の場合と同様に、現状のステータスと本来のステータスとが記憶されている。
ここで、図5に示す状態乖離記録データ234において、ICカードについての現状のステータスは「オープン(接続)」となっている。これに対し、図5に示す状態乖離記録データ234において、ICカードについての本来のステータスは「クローズ(接続解除)」となっている。つまり、上述したシーケンスパターンデータ232に従って関数の処理を行った場合には、関数の処理に含まれるRWオープン、RWクローズ、カードオープン、カードクローズのうち実行されないものが出てくる可能性がある。このとき、状態乖離記録データ234を参照すれば、リーダライタ100やICカードとの現在の接続状況と本来の接続状況との乖離を把握することができる。
制御部240は、図1に示すように、判定部241および実行部242を有する。また、制御部240は、例えば、上述したCryptoAPIやCSPなどを有する。判定部241および実行部242は、例えば、ベンダから提供されるCSPごとに、CSPの機能として実現される。なお、制御部240は、例えば、電子回路や集積回路により実装することができる。電子回路としては、例えば、CPU(Central Processing Unit)やMPU(Micro Processing Unit)がある。また、集積回路としては、例えば、ASIC(Application Specific Integrated Circuit)やFPGA(Field Programmable Gate Array)などがある。
制御部240は、記憶部230に記憶されている定義情報を参照して、署名処理に際して呼出しが行われる関数について、開始関数、終了関数および回数任意関数を定義するものとする。なお、定義情報は、ICカードを提供するベンダによって作成され、CSPとともに署名装置200にインストールされる。そして、この定義情報は、記憶部230に予め記憶される。
図6は、予め定義される開始関数、終了関数および回数任意関数の一例を示す図である。図6に示すように、定義情報には、開始関数、終了関数および回数任意関数と、各関数に対応する関数名とが対応付けて記憶されている。例えば、図6に示す定義情報には、「CPAcquireContext」が開始関数として予め定義され、「CPReleaseContext」が終了関数として予め定義され、「CPSignHash」が回数任意関数として予め定義される。「CPAcquireContext」は、リーダライタ100のオープン処理を実行する関数である。「CPReleaseContext」は、リーダライタ100のクローズ処理を実行する関数である。「CPSignHash」は、例えば、ハッシュ値を計算する関数である。
判定部241は、ICカードに記憶された情報に基づいて実行される署名処理に際して関数の呼出しが行われた場合に、記憶部230のシーケンスパターンデータ232を参照して、ICカードまたはリーダライタ100への接続または解除処理の要否を判定する。
まず、判定部241は、システムのモードが比較モードであるか否かを判定する。判定部241は、比較モードである場合には、呼出しが行われた関数までのシーケンスが一致するシーケンスパターンデータ232を記憶部230から取得する。続いて、判定部241は、取得したシーケンスパターンデータ232を参照し、呼出しが行われた関数の処理においてICカードまたはリーダライタ100への接続処理または解除処理の要否を判定する。
例えば、呼び出された関数が「CPAcquireContext」であり、一致するシーケンスパターンデータ232として図3に示すデータを取得したとする。この場合、判定部241は、図3に示すシーケンスパターンデータ232にて、関数名「CPAcquireContext」に対応付けられているRWオープン、RWクローズ、カードオープン、カードクローズおよび回数任意のフラグを参照する。判定部241は、RWオープンのフラグが「1」であるので、関数「CPAcquireContext」の処理においてリーダライタ100のオープン処理を実行する。このとき、判定部241は、関数「CPAcquireContext」の処理において、リーダライタ100のオープン処理を実行することを示すフラグ「open=true」をセットする。
また、判定部241は、RWクローズ、カードオープンおよびカードクローズのフラグが「0」であるので、関数「CPAcquireContext」の処理においてRWクローズ、カードオープンおよびカードクローズの処理を実行しない。このとき、判定部241は、関数「CPAcquireContext」の処理において、リーダライタ100のクローズ処理を実行しないことを示すフラグ「close=false」をセットする。同様に、判定部241は、関数「CPAcquireContext」の処理において、ICカードの接続処理を実行しないことを示すフラグ「open=false」をセットする。同様に、判定部241は、関数「CPAcquireContext」の処理において、ICカードの接続解除処理を実行しないことを示すフラグ「close=false」をセットする。また、判定部241は、回数任意のフラグが「0」であるので、関数「CPAcquireContext」を回数任意関数として取り扱わない。
そして、判定部241は、セットしたフラグを踏まえて関数の処理を実行するように、実行部242に指示する。また、判定部241は、呼出しが行われた関数までのシーケンスが一致するシーケンスパターンデータ232が記憶部230にない場合には、リカバリ処理を実行するように、実行部242に指示する。また、判定部241は、システムのモードが比較モードではない場合には、記録モードであるものとして、関数の処理を実行するように実行部242に指示する。
実行部242は、判定部241からの指示に従って関数の処理を実行する。また、実行部242は、判定部241からの指示に応じてリカバリ処理を実行する。
例えば、実行部242が、判定部241からフラグを踏まえて関数の処理を実行するように指示を受けた場合について説明する。実行部242は、呼出しが行われた関数が終了関数である場合には、終了処理1を実行する。以下、実行部242が実行する終了処理1について説明する。
例えば、シーケンスパターンデータ232と完全一致で終わった場合には、実行部242は、まず、既存のシーケンスパターンの使用回数のデータ項目を更新(1だけインクリメント)し、最終使用日のデータ項目を更新し、終了時刻のデータ項目を更新する。続いて、実行部242は、シーケンスパターンデータ232を並び変えて、モードを終了に変更し、終了処理1を完了する。
また、呼出しが行われた関数が終了関数ではあるが、シーケンスパターンデータ232側に続きがある場合には、実行部242は、まず、現在の記録データ231をシーケンスの1パターンとして保存する。続いて、実行部242は、モードを比較モードから終了に変更し、図4に示す関数フラグ対応表を元に、シーケンスの1パターンとして保存した記録データ231とフラグとを対応付けたシーケンスパターンデータ232を作成する。なお、記録データ231からシーケンスパターンデータ232を作成する際、終了関数の次に開始関数がある場合、実行部242は、リーダライタ100のクローズ処理とオープン処理のフラグを0にする。
なお、実行部242は、最終使用日が新しいものほど上位にくるように、シーケンスパターンデータ232を並び替えて記憶部230に格納するが、最終使用日が同一のものがある場合には使用回数が多いものを上位となるようにする。そして、実行部242は、判定部241によりセットされたフラグを踏まえて関数の処理を実行する。
また、実行部242が、判定部241からリカバリ処理を実行するように指示を受けた場合について説明する。実行部242は、システムのモードを比較モードから記録モードに変更する。続いて、実行部242は、記憶部230の状態乖離記録データ234を取得し、取得した状態乖離記録データ234に基づいてリカバリ処理を実行する。なお、リカバリ処理については、図7を用いて後述する。
また、実行部242が、判定部241から関数の処理を実行するように指示を受けた場合について説明する。実行部242は、呼出しが行われた関数が終了関数である場合には、終了処理2を実行する。以下、実行部242が実行する終了処理2について説明する。
実行部242は、上述した終了処理1と同様に、例えば、現在の記録データ231をシーケンスパターンとして保存する。このとき、実行部242は、使用回数のデータ項目を更新(1を記録)し、最終使用日のデータ項目を記録し、終了時刻のデータ項目を記録し、モードを比較モードから終了に変更する。続いて、実行部242は、図4に示す関数フラグ対応表を元に、保存した記録データ231とフラグとを対応付けたシーケンスパターンデータ232を作成して、作成したシーケンスパターンデータ232を記憶部230に格納する。続いて、実行部242は関数の処理を実行する。
ここで、図7を用いて、上述した判定部241および実行部242による処理の一例を説明する。図7は、シーケンスパターンにより省略される処理の一例を示す図である。図7の左側には、ある署名処理におけるシーケンスを示す。図7の右側には、図7の左側に示すシーケンスに含まれる関数の処理が、シーケンスパターンデータ232により一部省略されたシーケンスを示す。なお、図7に示すシーケンスには、アプリシーケンス単位1、リーダアクセス単位2およびカードアクセス単位3のアクセス単位を明記する。
例えば、関数Aの呼出しが行われると、判定部241は、関数Aを開始関数として有するシーケンスパターンデータ232を取得する。そして、判定部241は、取得したシーケンスパターンデータ232に従い、関数Aの処理において「リーダライタOPEN」を実行するようにフラグをセットする。実行部242は、判定部241によりセットされたフラグを踏まえて、図7の右側に示すように、関数Aの処理「リーダライタOPEN」を実行する。関数Aに続いて、関数Bの呼出しが行われると、判定部241は、関数Bまでのシーケンス「関数A→関数B」が一致するシーケンスパターンデータ232を取得する。そして、判定部241は、取得したシーケンスパターンデータ232に従い、関数Bの処理において「カード接続」を実行し、「カード接続解除」を実行しないようにフラグをセットする。実行部242は、判定部241によりセットされたフラグを踏まえて、図7の右側に示すように、関数Bの処理において「カード接続」を実行し、「カード接続解除」を実行しない。このようにすることで、図7の左側に示すシーケンスに含まれる関数の処理のうち、図7の右側に示す各関数におけるカード接続、カード接続解除、リーダライタOPEN,リーダライタCLOSEなどの複数の処理4が省略される。
続いて、図7を用いて、リカバリ処理について説明する。例えば、判定部241は、関数Bに続いて、関数Fの呼出しが行われると、関数Fまでのシーケンス「関数A→関数B→関数F」が一致するシーケンスパターンデータ232を取得する。このとき、判定部241は、一致するシーケンスパターンデータ232がない場合には、リカバリ処理を実行するように実行部242に指示する。実行部242は、比較モードを記録モードに変更した後、関数Fの直前に呼び出された関数Bの処理のうち、実行したものとして省略した関数Fの呼出し直前の処理をリカバリ処理として実行する。例えば、図7に示すように、関数Bの処理のうち、関数Fの呼出し直前の処理「カード接続解除」を実行する。続いて、実行部242は、関数Fの処理を実行する。このようにリカバリ処理を実行することで、以後の署名処理において、リーダライタ100やICカードとの接続状態を保持する。
[実施例1による処理]
次に、図8を用いて、実施例1に係る署名装置200による処理の流れを説明する。図8は、実施例1に係る署名装置による処理の流れを示す図である。
以下に説明する図8に示す処理では、未だシーケンスパターンデータ232が登録されていない場合や、開始関数に該当するシーケンスパターンデータ232が登録されていない場合、システム内部を記録モードに移行させる。そして、図8に示す処理では、開始関数の呼出し後、終了関数まで呼出しが行われるまで、一連の処理とみなせる各関数を実行順に記録し、記録された関数に基づいてシーケンスパターンデータ232を作成する。また、図8に示す処理では、開始関数に該当するシーケンスパターンデータ232が既に登録されている場合、システム内部を比較モードに移行させる。そして、図8に示す処理では、開始関数から順に各関数をシーケンスパターンデータ232と比較し、呼出しが行われた関数までのシーケンスと一致するシーケンスパターンデータ232に基づいて、ICカードやリーダライタ100への接続の要否を判定する。なお、以下では、説明の便宜から、上述の記録データ231をシーケンス記録と表記し、上述のシーケンスパターンデータ232をシーケンスパターンと表記する。
図8に示すように、判定部241は、関数の呼出しがあったか否かの判定を行う(S101)。関数の呼出しがない場合には(S101「No」)、同判定を繰り返し行う。判定部241は、関数の呼出しがあった場合には(S101「Yes」)、呼出し元モジュール名ごとに関数名を追記する(S102)。
すなわち、判定部241は、呼出元モジュール名とプロセスIDをキーにシーケンス記録を作成する。例えば、関数名が「CPHashData」である関数の呼出しがあったとする。この場合、判定部241は、記憶部230のシーケンス記録を参照し、関数の呼出しを行った呼出元モジュール名「****.exe」、および該当処理のプロセスID「29346」が一致するシーケンス記録を検索する。例えば、現時点のシーケンス記録が上述した図2の状態である場合には、一致するシーケンス記録が検索できるので、判定部241は、既にある図2のシーケンス記録に関数名「CPHashData」を追記する。なお、判定部241は、関数名が「CPSignHash」の関数の呼出しが行われた場合には、この関数が図6に定義される回数任意関数であるので、図2に示すシーケンス記録の回数カウントを、例えば、「1→2」に更新し、関数名「CPSignHash」の追記は行わない。一方、一致するシーケンス記録が検索できなかった場合には、判定部241は、関数の呼出しを行った呼出元モジュール名および該当処理のプロセスIDに対応付けてシーケンス記録を新規に作成し、記憶部230に格納する。
続いて、判定部241は、呼ばれた関数が開始関数か否かの判定を行う(S103)。例えば、判定部241は、図6に示し定義情報に基づいて、呼び出された関数の関数名が「CPAcquireContext」と一致するか否かを判定する。判定部241は、呼ばれた関数が開始関数である場合には(S103「Yes」)、同一呼出しモジュール名かつ同じプロセスIDのシーケンス記録が残っているか否かの判定を行う(S104)。例えば、判定部241は、呼出元モジュール名が「****.exe」で、プロセスID「29346」であるシーケンス記録が記憶部230に残っているか否かを判定する。
判定部241は、同一呼出しモジュール名かつ同じプロセスIDのシーケンス記録が残っている場合には(S104「Yes」)、直前に呼ばれた関数処理の終了時刻から1分以内か否かの判定を行う(S105)。例えば、判定部241は、記憶部230に残っているシーケンス記録の終了時刻を参照し、内部タイマなどが示す現時刻と終了時刻とを比較して、現時刻が、シーケンス記録の終了時刻から1分以内であるか否かを判定する。すなわち、判定部241は、S105の判定により、今回のリーダアクセスを前回のリーダアクセスとひとまとまりの処理とみなすかどうかを判定している。ここで、リーダアクセスとは、開始関数の処理から終了関数の処理が完了するまでのリーダライタへのアクセスに該当する。また、ひとまとまりの処理とは、同一のアプリケーションプログラムにより行われる一連の処理とみなせる処理に該当する。
判定部241は、終了時刻から1分以内である場合には(S105「Yes」)、直前のシーケンスパターンを複製し、モードを「終了」から「比較モード」に戻してシーケンス記録を作成する(S106)。例えば、仮に、図6に示す終了関数「CPReleaseContext」の呼出しが行われた時刻から1分以内に、同一呼出しモジュール名かつ同じプロセスIDの関数の呼出しが行われたものとする。この場合には、判定部241は、直前に作成されたシーケンスパターンを複製し、「モード」のデータ項目を比較モードに戻して、この複製データをシーケンス記録として復活させて、関数名の追記を行い、記憶部230に記憶する。続いて、判定部241は、現在のモードが「比較モード」であるか否かの判定を行う(S107)。
判定部241は、「比較モード」である場合には(S107「Yes」)、呼出し元モジュール名に対応するシーケンスパターンを取得する(S108)。例えば、呼出し元モジュール名が「****.exe」であれば、呼出し元モジュール名が「****.exe」であるシーケンスパターンを全て取得する。続いて、判定部241は、取得したシーケンスパターンと、シーケンス記録とが一致するか否かの判定を行う(S109)。例えば、現時点でのシーケンス記録が上述の図2の状態であり、取得したシーケンスパターンが上述の図3の状態であるとする。この場合、シーケンス記録の関数名「1:CPAcquireContext」、「2:CPCreateHash」、「3:CPHashData」、「4:CPSignHash」と、シーケンスパターンの関数名「1:CPAcquireContext」、「2:CPCreateHash」、「3:CPHashData」、「4:CPGetHashParam」とが一致しない。よって、判定部241は、取得したシーケンスパターンとシーケンス記録とを順に比較した結果、一致しない旨の判定を行うこととなる。ここで、判定部241は、取得したシーケンスパターンとシーケンス記録とを順に比較し、一致するシーケンスパターンを検出した時点で、S109の判定結果を「Yes」とし、次の処理に進むようにしてもよい。また、判定部241は、シーケンス記録とシーケンスパターンの比較を行うたびに、一致するシーケンスパターンのみを残していき、次の比較では残ったシーケンスパターンとの比較を行うようにしてもよい。
判定部241は、シーケンス記録と一致するシーケンスパターンがある場合には(S109「Yes」)、シーケンスパターンに従ってフラグをセットする(S110)。すなわち、判定部241は、シーケンスパターンに沿って、リーダライタ100やリーダライタ100に挿入されるICカードのオープン処理やクローズ処理を省略できるようにフラグをセットする。例えば、判定部241は、呼び出された関数が関数名「CPAcquireContext」の関数である場合には、シーケンスパターンにおいて関数名「CPAcquireContext」に対応付けられているフラグを参照する。そして、判定部241は、関数名「CPAcquireContext」の関数の処理のうち、実行する処理についてはフラグ「True」をセットし、実行せずにスキップする処理についてはフラグ「false」をセットする。例えば、図3に示すシーケンスパターンでは、RWオープンに関するフラグのみが「1」となっている。そこで、判定部241は、リーダライタ100のオープン処理についてはフラグ「true」をセットし、リーダライタ100のクローズ処理、ICカードの接続処理および接続解除処理についてはフラグ「false」をセットする。また、関数名「CPAcquireContext」に対応する回数任意に関するフラグは「0」となっている。よって、判定部241は、関数名「CPAcquireContext」の関数の処理は回数任意ではないものとして取り扱う。
続いて、実行部242は、呼ばれた関数が終了関数だった場合には、終了処理1を実行し(S111)、終了関数ではなかった場合には後述するS112の処理にそのまま移行する。終了処理1は、シーケンス記録の終了処理に該当する。例えば、シーケンスパターンと完全一致で終わった場合には、実行部242は、まず、既存のシーケンスパターンの使用回数のデータ項目を更新し、最終使用日のデータ項目を更新し、終了時刻のデータ項目を更新する。例えば、図2に示すようなシーケンス記録の各関数名と、図3に示すようなシーケンスパターンの各関数名とが完全に一致した場合には、シーケンスパターンの使用回数を1インクリメントし、最終使用日を現在の日付に更新し、終了時刻を現時刻に更新する。続いて、実行部242は、最終使用日が新しいものほど上位にくるように、シーケンスパターンを並び変えてモードを終了に変更し、終了処理1を完了する。なお、実行部242は、最終使用日が同一のものがある場合には使用回数が多いものを上位となるようにシーケンスパターンを並び変える。また、シーケンスパターン側に続きがある場合には、実行部242は、まず、現在のシーケンス記録をパターンとして保存してモードを終了に変更する。つまり、実行部242は、シーケンス記録を、比較してきたシーケンスパターンとは異なる新たなパターンとして立ち上げる。そして、実行部242は、新たに立ち上げたパターンに含まれる各関数に対して、関数フラグ対応表を元にフラグを対応付けたシーケンスパターンを作成する。なお、実行部242は、シーケンス記録からシーケンスパターンを作成する際、終了関数の次に開始関数がある場合、リーダライタ100のクローズ処理とオープン処理のフラグを0にする。また、実行部242は、作成したシーケンスパターンを、最終使用日が新しいものほど上位にくるように並び替えて記憶部230に格納するが、最終使用日が同一のものがある場合には使用回数が多いものを上位となるように並び替えて格納する。
続いて、実行部242は、フラグを踏まえて関数の処理を実行する(S112)。例えば、実行部242は、本来の処理ではICカードの接続解除処理を行うべきところで、カードオープンについてセットされたフラグが「close=false」となっている場合には、ICカードの接続解除処理を行わずにスキップするようにする。そして、実行部242は、状態乖離記録データ234を更新して(S113)、処理を終了する。
なお、上述したS109において、判定部241は、シーケンス記録と一致するシーケンスパターンがない場合には(S109「No」)、モードを「比較モード」から「記録モード」に変更する(S114)。続いて、実行部242は、状態乖離記録データ234に基づいて、リカバリ処理を決定し(S115)、決定したリカバリ処理を実行する(S116)。例えば、実行部242は、関数名「CPHashData」の関数の呼出しがあった時点で、シーケンス記録とシーケンスパターンが不一致となった場合には、シーケンス記録を参照し、関数名「CPHashData」の関数の直前に呼び出された関数「CPCreateHash」を特定する。そして、実行部242は、関数名「CPCreateHash」の関数の処理の中から、関数名「CPHashData」の関数の呼出し直前に実行すべきであった処理をリカバリ処理として実行する。なお、S115の処理は、一つ前に呼ばれた関数までは、蓄積されたシーケンスパターンとシーケンス記録とが一致していたが、今呼ばれた関数から、シーケンスパターンとシーケンス記録とが一致しなくなった場合の処理に該当する。つまり、シーケンスパターンと一致することを前提にリーダライタ100やリーダライタ100に挿入されるICカードのオープン処理やクローズ処理を省略してきているので、一致しなくなった時点で処理を本来の状態(元の状態)に戻す趣旨である。
続いて、実行部242は、呼ばれた関数が終了関数だった場合には、終了処理2を実行する(S117)。終了処理2は、基本的には、上述した終了処理1と同様であり、シーケンス記録の終了処理に該当する。例えば、実行部242は、現在のシーケンス記録をパターンとして保存する。このとき、実行部242は、使用回数のデータ項目に0を記録し、最終使用日のデータ項目を記録し、終了時刻のデータ項目を記録し、モードを「終了」に変更する。続いて、実行部242は、関数フラグ対応表を元に、パターンとフラグとを対応付けたシーケンスパターンを作成して、作成したシーケンスパターンを記憶部230に格納する。
そして、実行部242は、関数の処理を実行して(S118)、処理を終了する。なお、S118において実行される関数の処理は、実行すべき全ての処理をそのまま実行する。
なお、上述したS107において、判定部241は、「比較モード」でない場合には(S107「No」)、記録モードであるものとして、上述したS117の処理に移行する。なお、上述したS103において、判定部241は、呼ばれた関数が開始関数ではない場合には(S103「No」)、上述したS107の処理に移行する。なお、上述したS104において、判定部241は、同一呼出しモジュール名かつ同じプロセスIDのシーケンス記録が残っていない場合には(S104「No」)、上述したS107の処理に移行する。なお、上述したS105において、判定部241は、終了時刻から1分以内ではない場合には(S105「No」)、上述したS107の処理に移行する。
[実施例1による効果]
上述してきたように、署名装置200は、呼出しが行われた関数までのシーケンスと一致するシーケンスパターンに基づいて、ICカードやリーダライタ100への接続の要否を判定する。そして、署名装置200は、ICカードやリーダライタ100への接続の不要が判定された場合には、当該処理を行わずに、呼出しが行われた関数を実行する。一方、署名装置200は、ICカードやリーダライタ100への接続の要が判定された場合には、当該処理を行って、呼出しが行われた関数を実行する。このようなことから、実施例1によれば、署名処理における各関数間で重複して実行されるリーダライタ100のオープン処理やクローズ処理、ICカードとの接続処理や接続解除処理を省略できるので、結果として、処理性能を改善できる。
また、署名装置200は、現時点までに呼出しが行われた関数のシーケンスと、1つ前の関数までは一致していたシーケンスパターンとが一致しなくなった場合には、関数フラグ対応表を元に、現時点までのシーケンスから新たなシーケンスパターンを生成する。このようなことから、実施例1によれば、署名処理において、上位のアプリケーションやアプリケーションバージョンに応じて発生し得る複数の異なるシーケンスから、新たなシーケンスパターンとして動的に生成できる。
また、署名装置200は、呼出しが行われた関数までのシーケンスと、1つ前の関数まで一致していたシーケンスパターンとが一致しなくなった場合には、状態乖離記録データ234に基づいてリカバリ処理を実行する。このようなことから、以後の署名処理において、リーダライタ100やICカードとの接続状態を保持することでき、結果として、以後の署名処理を確実に実施できる。