情報処理装置、情報処理方法、および、情報処理プログラム
【課題】バイパスや内部データの改竄を検知するとともに、その演算負荷を減じることを可能とし、また演算時間を短縮することを可能とする情報処理装置を提供する。
【解決手段】情報処理装置が、予め定められたプログラムの記述に基づいて順に情報処理を実行する情報処理部と、検証用となる変数の値が記憶される検証メモリ部とを有し、少なくとも0と1とを含む2ビット長以上の複数の基本ビット列を組み合わせた固定ビット長のビット列をX(i)として、ビット列X(i)と排他的論理和演算することによりビット列X(j)に変換させる変換ビット列を用いて、情報処理の実行前にビット列X(i)を検証メモリ部に記憶し、情報処理の実行後に検証メモリ部に記憶されているビット列と変換ビット列と排他的論理和演算して検証メモリ部に上書きし、検証メモリ部から読み出した変数の値に基いて検査対象となる情報処理が実行されたか否かを判定する。
【解決手段】情報処理装置が、予め定められたプログラムの記述に基づいて順に情報処理を実行する情報処理部と、検証用となる変数の値が記憶される検証メモリ部とを有し、少なくとも0と1とを含む2ビット長以上の複数の基本ビット列を組み合わせた固定ビット長のビット列をX(i)として、ビット列X(i)と排他的論理和演算することによりビット列X(j)に変換させる変換ビット列を用いて、情報処理の実行前にビット列X(i)を検証メモリ部に記憶し、情報処理の実行後に検証メモリ部に記憶されているビット列と変換ビット列と排他的論理和演算して検証メモリ部に上書きし、検証メモリ部から読み出した変数の値に基いて検査対象となる情報処理が実行されたか否かを判定する。
【発明の詳細な説明】
【技術分野】
【0001】
本発明は、ICカードなどの情報処理部を搭載した情報処理装置において、コンピュータ等の処理や演算におけるバイパスや内部データの改竄など本来意図しない動作を防止するセキュリティの技術に関する。
【背景技術】
【0002】
ICカードなどの情報処理部を搭載した情報処理装置は、高電圧を印加する、レーザービームを照射する、イオンビームを照射するなどの物理的な攻撃を受けることで、搭載しているソフトウェアが、認証処理のバイパスや内部データの改竄など、本来意図しない動作をする可能性がある。
【0003】
このような、バイパスや内部データの改竄の問題に対して、互いにビット反転した関係を表現する表現形式をもつ変数を用い、並列に演算を行い、各演算結果がそれぞれビット反転した関係になっているか否かを判定することにより、誤動作を検知できる技術が知られている(例えば、特許文献1参照)。
【0004】
また、条件分岐条件を複数または並列に動作させ、それぞれの結果を照合することにより、誤動作を検知する技術が知られている(例えば、特許文献2および特許文献3を参照)。
【特許文献1】国際公開第2005/027403号パンフレット
【特許文献2】特開2002−334317号公報
【特許文献3】特開2005−285133号公報
【発明の開示】
【発明が解決しようとする課題】
【0005】
しかしながら、特許文献1から特許文献3に示す技術においては、演算を並列に行うことや、条件分岐条件を複数または並列に動作させるために、バイパスや内部データの改竄を検知するための演算として追加される追加処理に対しての演算負荷が重くなるという問題、または、この追加処理に対しての演算時間が長くなるという問題があった。
【0006】
本発明は、このような事情に鑑みてなされたもので、その目的は、コンピュータ等の処理や演算におけるバイパスや内部データの改竄を検知するとともに、その演算負荷を減じることを可能とする情報処理装置、情報処理方法、および、情報処理プログラムを提供することにある。
【課題を解決するための手段】
【0007】
この発明は上述した課題を解決するためになされたもので、請求項1に記載の発明は、予め定められたプログラムの記述に基づいて順に情報処理を実行する情報処理部を有する情報処理装置であって、検証用となる変数の値が記憶される検証メモリ部、を有し、少なくとも0と1とを含む2ビット長以上の第1の固定ビット長である複数の基本ビット列を組み合わせた第2の固定ビット長のビット列のデータ型を型Aとし、前記型Aのある値を前記検証メモリ部に記憶させることを示す記述を設定記述とし、検査対象となる情報処理である検査対象情報処理を実行することを示す記述を情報処理記述とし、前記検証メモリ部に記憶されている変数をあるビット列で排他的論理和演算して前記検証メモリ部に上書きすることを示す記述を検証演算記述とし、前記検証メモリ部に記憶されている変数の値に基づいて前記検証演算記述による排他的論理和演算が実行されたか否かを示す記述を判定記述とし、前記情報処理記述およびその後に前記検証演算記述が記述されている記述を情報処理検証演算記述として、前記予め定められたプログラムには、前記設定記述と、複数のn個の前記情報処理検証演算記述と、前記判定記述とが、前記設定記述の後に前記n個の情報処理検証演算記述が順に記述され、かつ、前記n個の情報処理検証演算記述の後に前記判定記述が記述されるように予め記述されており、前記情報処理部は、前記設定記述に基づいて、前記型Aのあるビット列aを前記メモリ部に記憶し、前記n個の情報処理検証演算記述に基づいて、前記検査対象情報処理を実行するとともに、前記検証メモリ部から読み出した前記変数と、前記変数と排他的論理和演算する事で前記型Aのあるビット列となるようなビット列bi(i=1〜n)とを排他的論理和演算して前記検証メモリ部に上書きすることをn回実行し、前記判定記述により、前記検証メモリ部から読み出した変数の値が検証値c=a^b1^b2^・・・・^bn(^は、排他的論理和演算)と一致するか否かを判定する事により、前記複数の前記情報処理検証演算記述に含まれている検証演算記述による排他的論理和演算が順に実行されたか否かを判定する、ことを特徴とする情報処理装置である。
【0008】
また、請求項2に記載の発明は、前記設定記述に基づき前記検証メモリ部に記憶されているビット列aと、前記検証値cは、互いにビット反転の関係にあることを特徴とする請求項1に記載の情報処理装置である。
【0009】
また、請求項3に記載の発明は、予め定められたプログラムの記述に基づいて順に情報処理を実行する情報処理部を有する情報処理装置であって、少なくとも0と1とを含む2ビット長以上の第1の固定ビット長である複数の基本ビット列を組み合わせた第2の固定ビット長のビット列のデータ型を型Aとし、前記型Aのビット列の値であって、値が互いに異なるm個の値を、識別子j(j=0,・・・,m−1)と対応づけて、前記型Aのビット列の配列X(j)として記憶するビット列記憶部と、X(k)と排他的論理和演算することでX(l)となるようなビット列の配列Z(k,l)(k,l=0,・・・,m−1)を変換ビット列として記憶する変換ビット列記憶部と、検証用となる変数の値を記憶する検証メモリ部と、を有し、前記予め定められたプログラムは、前記ビット列記憶部に記憶されている前記型Aのある値を前記検証メモリ部に記憶させる事を示す記述である設定記述と、検査対象となる情報処理である検査対象情報処理を実行することを示す記述である情報処理記述と、前記検証メモリ部に記憶されている変数を前記変換ビット列記憶部より読み出した変換ビット列で排他的論理和演算した値を前記検証メモリ部に上書きすることを示す記述である検証演算記述と、前記検証メモリ部に記憶されている変数の値に基づいて前記検証演算記述による排他的論理和演算が実行されたか否かを示す記述である判定記述とを有し、前記情報処理記述およびその後に前記検証演算記述が記述されている記述を情報処理検証演算記述として、前記設定記述の後に、n個の前記情報処理検証演算記述が順に記述され、かつ、前記n個の情報処理検証演算記述の後に前記判定記述が記述されるように予め記述されており、前記設定記述は、前記ビット列記憶部に記憶されている前記型Aの値であるX(p0)(p0は、0〜m−1の間の任意の値の識別子)を前記検証メモリ部に記憶させるように記述されており、前記n個の情報処理検証演算記述のうちi番目の記述の中の検証演算記述には、前記検証メモリ部に記憶されている変数を、前記変換ビット列記憶部より読み出した変換ビット列であるZ(pi−1,pi)(piは0〜m−1の間の任意の識別子)が示す値で排他的論理和演算し、検証メモリ部に上書きするように予め記述されており、前記判定記述には、前記検証メモリ部に記憶されている変数が、X(p0)^Z(p0,p1)^・・・・^Z(pn−1,pn)(^は排他的論理和演算)の値となるX(pn)(pnは0〜m−1の間の任意の識別子)であって、前記ビット列記憶部から読み出したX(pn)の値と一致するか否かを判断するように予め記述されており、前記情報処理部は、前記設定記述に基づいて、前記ビット列記憶部より読み出した前記型Aのある値を前記検証メモリ部に記憶し、前記情報処理検証演算記述に基づいて、前記検査対象情報処理を実行するとともに、前記検証メモリ部から読み出した前記変数と、前記変換ビット列記憶部から読みだした変換ビット列とを排他的論理和演算した値を前記検証メモリ部に上書きし、前記判定記述に基づいて、前記検証メモリ部から読み出した変数の値が、前記ビット列記憶部から読み出した前記型Aのビット列と一致するか否かを判定することにより、前記検証演算記述による排他的論理和演算が実行されたか否かを判定することを特徴とする情報処理装置である。
【0010】
また、請求項4に記載の発明は、前記設定記述に基づいて検証メモリ部に記憶された前記型Aの値と、前記判定記述に基づいて前記ビット列記憶部より読み出された前記型Aの値とは、互いにビット反転の関係にあることを特徴とする請求項3記載の情報処理装置である。
【0011】
また、請求項5に記載の発明は、前記予め定められたプログラムには、少なくとも前記設定記述と、ループ処理を実行することを示す記述とともに、該記述されているループ処理が実行される場合に、該実行されているループ処理内で前記情報処理検証演算記述を実行する事を示す記述であるループ処理記述と、前記判定記述とが、前記設定記述の後に前記ループ処理記述が記述され、かつ、前記ループ処理記述の後に前記判定記述が記述されるように予め記述されており、前記設定記述には、値0の識別子で対応づけられるX(0)の値を前記検証メモリ部に記憶させるように記述されており、前記ループ処理記述中の検証演算記述には、前記検証メモリ部に記憶されている変数を、前記変換ビット列記憶部より読み出した変換ビット列であるZ(i−1,i)(iはループ内i番目に処理される回数値)が示すビット列の値で排他的論理和演算し、前記検証メモリ部に上書きするように予め記述されており、前記判定記述には、前記検証メモリ部に記憶されている変数が、前記ビット列記憶部から読み出したX(n)(n=1〜mであり、ループ回数)の値と一致するか否かを判断するように予め記述されており、前記情報処理部は、前記設定記述に基づいて、前記ビット列記憶部より読み出した前記型Aのある値を前記検証メモリ部に記憶し、前記情報処理検証演算記述に基づいて、前記検査対象情報処理を実行するとともに、前記検証メモリ部から読み出した前記変数と、前記変換ビット列記憶部から読みだした変換ビット列とを排他的論理和演算した値を前記検証メモリ部に上書きし、前記判定記述に基づいて、前記検証メモリ部から読み出した変数の値が、前記ビット列記憶部から読み出した前記型Aのビット列と一致するか否かを判定することにより、前記検証演算記述による排他的論理和演算が実行されたか否かを判定することを特徴とする請求項3又は請求項4に記載の情報処理装置である。
【0012】
また、請求項6に記載の発明は、前記予め定められたプログラムには、下位モジュールを呼び出し、前記検証メモリ部に記憶されている変数を前記下位モジュールに渡すとともに、前記下位モジュールからの返却値を取得する記述であるモジュール呼び出し記述と、前記モジュール呼び出し記述で呼び出した下位モジュールからの返却値が、前記下位モジュールが記述順通りに実行された場合に返却されるビット列であるか否かを検証することを示す返却値判定記述とが、前記モジュール呼出記述の後に前記返却値判定記述が記述されるように予め記述されており、前記情報処理部は、前記モジュール呼出記述に基づいて下位モジュールを呼出し、前記検証メモリ部に記憶されている変数を前記下位モジュールに渡すとともに、前記下位モジュールからの返却値を取得し、前記返却値判定記述に基づいて、前記モジュール呼出し記述で呼出した下位モジュールからの返却値が、前記下位モジュールが記述順通りに実行された場合に返却されるビット列であるか否かを検証する、ことを特徴とする請求項3から請求項5のいずれかに記載の情報処理装置である。
【0013】
また、請求項7に記載の発明は、前記情報処理装置は、モジュール内検証メモリ部を有し、前記モジュール呼出し記述に基づいて呼出される下位モジュールのプログラムは、自モジュールを呼出した上位モジュールより渡された変数を、前記変換ビット列記憶部より読み出した変換ビット列で排他的論理和演算して前記モジュール内検証メモリ部に記憶する事を示す記述であるモジュール内設定記述と、自モジュール内における検査対象となる情報処理であるモジュール内検査対象情報処理を実行する事を示す記述であるモジュール内情報処理記述と、前記モジュール内検証メモリ部に記憶されている変数を前記変換ビット列記憶部より読み出した変換ビット列で排他的論理和演算した値を前記モジュール内検証メモリ部に上書きする事を示す記述であるモジュール内検証演算記述と、前記モジュール内検証メモリ部に記憶されている変数の値を、前記上位モジュールに返却値として返却することを示す返却記述とを有し、前記モジュール内情報処理記述およびその後に前記モジュール内検証演算記述が記述されている記述をモジュール内情報処理検証演算記述として、前記モジュール内設定記述の後に前記モジュール内情報処理検証演算記述が記述され、かつ、前記モジュール内情報処理検証演算記述の後に返却記述が記述されるように記述されており、前記情報処理部は、前記モジュール内設定記述に基づいて、自モジュールを呼出した上位モジュールより渡された変数を前記変換ビット列記憶部より読み出した変換ビット列で排他的論理和演算した値を前記モジュール内検証メモリ部に記憶し、前記モジュール内情報処理検証演算記述に基づいて、前記モジュール内検査対象情報処理を実行するとともに、前記モジュール内検証メモリ部から読み出した前記変数と、前記変換ビット列記憶部から読み出した変換ビット列とを排他的論理和演算した値を前記モジュール内検証メモリ部に上書きし、前記返却記述に基づいて、前記モジュール内検証メモリ部に記憶されている変数の値を、前記上位モジュールに返却値として返却する、ことを特徴とする請求項6に記載の情報処理装置である。
【0014】
また、請求項8に記載の発明は、前記モジュール内設定記述に基づき、前記モジュール内検証メモリ部に記憶される前記上位モジュールより渡された変数と、前記返却記述に基づき、前記上位モジュールに返却される返却値とは、互いにビット反転の関係になるように予め設定されている、ことを特徴とする請求項7記載の情報処理装置である。
【0015】
また、請求項9に記載の発明は、前記検査対象情報処理による情報処理をするプログラムの記述において、2値の値をとる2つの内部変数として、少なくとも0と1とを含む2ビット長以上の第3の固定ビット長である複数の基本ビット列を組み合わせた第4の固定ビット長の変数である2つの変数であって、互いにビット反転の関係にある2つの変数を用いる、ことを特徴とする請求項3から請求項8のいずれかに記載の情報処理装置である。
【0016】
また、請求項10に記載の発明は、予め定められたプログラムの記述に基づいて順に情報処理を実行する情報処理部を有する情報処理装置であって、少なくとも0と1とを含む2ビット長以上の第1の固定ビット長である複数の基本ビット列を組み合わせた第2の固定ビット長のビット列のデータ型を型Aとし、前記型Aのある値を変換前ビット列として記憶する変換前ビット列記憶部と、前記型Aのある値であって、前記変換前ビット列とは値が異なるある値を変換後ビット列として記憶する変換後ビット列記憶部と、前記変換前ビット列と排他的論理和演算することにより前記変換後ビット列に変換させる変換ビット列を記憶する変換ビット列記憶部と、検証用となる変数の値を記憶する検証メモリ部と、を有し、前記予め定められたプログラムには少なくとも、前記変換前ビット列記憶部に記憶されている変換前ビット列を読み出し前記検証メモリ部に記憶させる事を示す記述である設定記述と、検査対象となる情報処理である検査対象情報処理を実行することを示す記述である情報処理記述と、前記検証メモリ部に記憶されている変数を前記変換ビット列記憶部より読み出した変換ビット列で排他的論理和演算した値を前記検証メモリ部に上書きすることを示す記述である検証演算記述と、前記検証メモリ部に記憶されている変数の値に基づいて前記検証演算記述による排他的論理和演算が実行されたか否かを示す記述である判定記述とが、前記設定記述の後に前記情報処理記述が記述され、前記情報処理記述の後に検証演算記述が記述され、かつ、前記検証処理記述の後に前記判定記述が記述されるように予め記述されており、前記情報処理部は、前記設定記述に基づいて、変換前ビット列を前記変換前ビット列記憶部から読み出して前記検証メモリ部に記憶し、前記情報処理記述に基づいて、前記検査対象情報処理を実行し、前記検証演算記述に基づいて、前記検証メモリから読み出した変数と、前記変換ビット列記憶部から読み出した変換ビット列とを排他的論理和演算して前記検証メモリ部に上書きし、前記判定記述により、前記検証メモリ部から読み出した変数の値が、前記変換後ビット列記憶部より読み出した前記変換後ビット列と一致するか否かを判定する事により、前記検証演算記述による排他的論理和演算が実行されたか否かを判定することを特徴とする情報処理装置である。
【0017】
また、請求項11に記載の発明は、前記設定記述に基づいて検証メモリ部に記憶された前記変換前ビット列と、前記判定記述に基づいて前記変換後ビット列記憶部より読み出された前記変換後ビット列とは、互いにビット反転の関係にあることを特徴とする請求項10記載の情報処理装置である。
【0018】
また、請求項12に記載の発明は、予め定められたプログラムの記述に基づいて順に情報処理を実行する情報処理部と、少なくとも0と1とを含む2ビット長以上の第1の固定ビット長である複数の基本ビット列を組み合わせた第2の固定ビット長のビット列のデータ型を型Aとして、前記型Aのビット列の値であって、値が互いに異なるm個の値を、識別子j(j=0,・・・,m−1)と対応づけて、前記型Aのビット列の配列X(j)として記憶するビット列記憶部と、X(k)と排他的論理和演算することでX(l)となるようなビット列の配列Z(k,l)(k,l=0,・・・,m−1)を変換ビット列として記憶する変換ビット列記憶部と、検証用となる変数の値を記憶する検証メモリ部と、を有し、前記予め定められたプログラムは、前記ビット列記憶部に記憶されている前記型Aのある値を前記検証メモリ部に記憶させる事を示す記述である設定記述と、検査対象となる情報処理である検査対象情報処理を実行することを示す記述である情報処理記述と、前記検証メモリ部に記憶されている変数を前記変換ビット列記憶部より読み出した変換ビット列で排他的論理和演算した値を前記検証メモリ部に上書きすることを示す記述である検証演算記述と、前記検証メモリ部に記憶されている変数の値に基づいて前記検証演算記述による排他的論理和演算が実行されたか否かを示す記述である判定記述とを有し、前記情報処理記述およびその後に前記検証演算記述が記述されている記述を情報処理検証演算記述として、前記設定記述の後に、n個の前記情報処理検証演算記述が順に記述され、かつ、前記n個の情報処理検証演算記述の後に前記判定記述が記述されるように予め記述されており、前記設定記述は、前記ビット列記憶部に記憶されている前記型Aの値であるX(p0)(p0は、0〜m−1の間の任意の値の識別子)を前記検証メモリ部に記憶させるように記述されており、前記n個の情報処理検証演算記述のうちi番目の記述の中の検証演算記述には、前記検証メモリ部に記憶されている変数を、前記変換ビット列記憶部より読み出した変換ビット列であるZ(pi−1,pi)(piは0〜m−1の間の任意の識別子)が示す値で排他的論理和演算し、検証メモリ部に上書きするように予め記述されており、前記判定記述には、前記検証メモリ部に記憶されている変数が、X(p0)^Z(p0,p1)^・・・・^Z(pn−1,pn)(^は排他的論理和演算)の値となるX(pn)(pnは0〜m−1の間の任意の識別子)であって、前記ビット列記憶部から読み出したX(pn)の値と一致するか否かを判断するように予め記述されている情報処理装置において用いられる情報処理であって、前記情報処理部は、前記設定記述に基づいて、前記ビット列記憶部より読み出した前記型Aのある値を前記検証メモリ部に記憶し、前記情報処理検証演算記述に基づいて、前記検査対象情報処理を実行するとともに、前記検証メモリ部から読み出した前記変数と、前記変換ビット列記憶部から読みだした変換ビット列とを排他的論理和演算した値を前記検証メモリ部に上書きし、前記判定記述に基づいて、前記検証メモリ部から読み出した変数の値が、前記ビット列記憶部から読み出した前記型Aのビット列と一致するか否かを判定することにより、前記検証演算記述による排他的論理和演算が実行されたか否かを判定する、ことを特徴とする情報処理方法である。
【0019】
また、請求項13に記載の発明は、予め定められたプログラムの記述に基づいて順に情報処理を実行する情報処理部と、少なくとも0と1とを含む2ビット長以上の第1の固定ビット長である複数の基本ビット列を組み合わせた第2の固定ビット長のビット列のデータ型を型Aとして、前記型Aのビット列の値であって、値が互いに異なるm個の値を、識別子j(j=0,・・・,m−1)と対応づけて、前記型Aのビット列の配列X(j)として記憶するビット列記憶部と、X(k)と排他的論理和演算することでX(l)となるようなビット列の配列Z(k,l)(k,l=0,・・・,m−1)を変換ビット列として記憶する変換ビット列記憶部と、検証用となる変数の値を記憶する検証メモリ部と、を有し、前記予め定められたプログラムは、前記ビット列記憶部に記憶されている前記型Aのある値を前記検証メモリ部に記憶させる事を示す記述である設定記述と、検査対象となる情報処理である検査対象情報処理を実行することを示す記述である情報処理記述と、前記検証メモリ部に記憶されている変数を前記変換ビット列記憶部より読み出した変換ビット列で排他的論理和演算した値を前記検証メモリ部に上書きすることを示す記述である検証演算記述と、前記検証メモリ部に記憶されている変数の値に基づいて前記検証演算記述による排他的論理和演算が実行されたか否かを示す記述である判定記述とを有し、前記情報処理記述およびその後に前記検証演算記述が記述されている記述を情報処理検証演算記述として、前記設定記述の後に、n個の前記情報処理検証演算記述が順に記述され、かつ、前記n個の情報処理検証演算記述の後に前記判定記述が記述されるように予め記述されており、前記設定記述は、前記ビット列記憶部に記憶されている前記型Aの値であるX(p0)(p0は、0〜m−1の間の任意の値の識別子)を前記検証メモリ部に記憶させるように記述されており、前記n個の情報処理検証演算記述のうちi番目の記述の中の検証演算記述には、前記検証メモリ部に記憶されている変数を、前記変換ビット列記憶部より読み出した変換ビット列であるZ(pi−1,pi)(piは0〜m−1の間の任意の識別子)が示す値で排他的論理和演算し、検証メモリ部に上書きするように予め記述されており、前記判定記述には、前記検証メモリ部に記憶されている変数が、X(p0)^Z(p0,p1)^・・・・^Z(pn−1,pn)(^は排他的論理和演算)の値となるX(pn)(pnは0〜m−1の間の任意の識別子)であって、前記ビット列記憶部から読み出したX(pn)の値と一致するか否かを判断するように予め記述されている情報処理装置としてのコンピュータに、前記設定記述に基づいて、前記ビット列記憶部より読み出した前記型Aのある値を前記検証メモリ部に記憶する手順と、前記情報処理検証演算記述に基づいて、前記検査対象情報処理を実行するとともに、前記検証メモリ部から読み出した前記変数と、前記変換ビット列記憶部から読みだした変換ビット列とを排他的論理和演算した値を前記検証メモリ部に上書きする手順と、前記判定記述に基づいて、前記検証メモリ部から読み出した変数の値が、前記ビット列記憶部から読み出した前記型Aのビット列と一致するか否かを判定することにより、前記検証演算記述による排他的論理和演算が実行されたか否かを判定する手順とを実行させるための情報処理プログラムである。
【発明の効果】
【0020】
この発明によれば、情報処理装置が、予め定められたプログラムの記述に基づいて順に情報処理を実行する情報処理部と、検証用となる変数の値が記憶される検証メモリ部とを有し、少なくとも0と1とを含む2ビット長以上の複数の基本ビット列を組み合わせた固定ビット長のビット列をX(i)として、ビット列X(i)と排他的論理和演算することによりビット列X(j)に変換させる変換ビット列を用いて、情報処理の実行前にビット列X(i)を検証メモリ部に記憶し、情報処理の実行後に検証メモリ部に記憶されているビット列と変換ビット列と排他的論理和演算して検証メモリ部に上書きし、検証メモリ部から読み出した変数の値に基いて検査対象となる情報処理が実行されたか否かを判定することにより、コンピュータ等の処理や演算におけるバイパスや内部データの改竄を検知するとともに、その演算負荷を減じることが可能となる効果を奏する。
【発明を実施するための最良の形態】
【0021】
<原理>
まず、本実施形態において用いる原理について説明する。本実施形態においては、全ビット反転するという攻撃が、非常に困難であることに注目し、次のような処理を行う。この処理により、処理プログラムに対してのバイパスや改竄の検知が可能となる。
【0022】
・CV(Complex Value)を、予め準備しておく。このCVとは、“01”と“10”とを組み合わせた、1バイト(byte)長のビット列の全ての組み合わせである。このCVについては、後述する。
・CV(i)をXOR演算(排他的論理和演算)した場合に、CV(j)となる値CVMを、CV(i)とCV(j)との全ての組み合わせに対して予め算出して準備し、変換テーブルに記憶しておく。ここで、iとjとは、上記16通りのCVの内、いずれか1つのCVを示すための識別情報である。
・処理プログラムの間(途中)に、CV(i)を、CV(j)に変換するプログラムを組み込む。
・処理プログラムの間(途中)で変換されたCV(j)の値と、予め算出されるはずのCV(j)の値とが一致するか否かを判定してチェックすることにより、バイパスや改竄を検知する。
【0023】
<原理詳細>
以下、図面を参照して、本発明の実施の形態について説明する。
まず、図1に示すように、“01”と“10”との2ビット固定長である基本ビット列を組み合わせた1バイトフォーマットのデータ(8ビット固定長のデータ)を、CVとする。この場合、基本ビット列が2ビット固定長であり、CVが8ビット固定長であるため、CVは16種類のデータとなる。なお、ここでは、16種類の組み合わせを有するCVについて、それぞれのCVを識別するために、識別情報i(ここで、iは0から15の整数)を用いてCV(i)とする。
【0024】
なお、ここでは、識別情報iとCV(i)との関係において、たとえば、CV(0)とCV(8)とが互いにビット反転の関係にあり、CV(1)とCV(9)とが互いにビット反転の関係にあり、CV(2)とCV(10)とが互いにビット反転の関係にあり、CV(3)とCV(11)とが互いにビット反転の関係にあり、CV(4)とCV(12)とが互いにビット反転の関係にあり、CV(5)とCV(13)とが互いにビット反転の関係にあり、CV(6)とCV(14)とが互いにビット反転の関係にあり、かつ、CV(7)とCV(15)とが互いにビット反転の関係にあるようにする。
【0025】
すなわち、CV(k)とCV(k+8)とが互いにビット反転の関係にあるような順序とする(ここで、kは0から7の整数)。このような識別情報iとCV(i)との関係としておくことにより、後述するように、判定段階において、検査対象となる情報処理前のCVと検査対象となる情報処理後のCVとで、CVの値が互いにビット反転の関係になるように設定しやすくなる。
【0026】
次に、入力値をCV(i)として、排他的論理和演算(XOR)した場合に、出力値がCV(j)となるようなCVMの値を算出する。ここで、iおよびjは、それぞれ、0から15の任意の整数である。なお、以降の説明においては、CVまたはCVM内で用いられるiおよびjは、それぞれ、0から15の任意の整数として説明する。
【0027】
たとえば、図2(a)示すように、「CV(5)(+)CVM=CV(14)」の場合、すなわち、「01100110(+)CVM=10010110」の場合には、この式を満たすCVMの値は、「CVM=11110000(=F0h)」となる。なお、記号「(+)」または「^」は、排他的論理和演算を示す。また、記号「h」は、16進数であることを示す。
【0028】
また、図2(a)と同様に、図2(b)に示すように、「CV(11)(+)CVM=CV(7)」の場合、すなわち、「10100101(+)CVM=01101010」の場合には、この式を満たすCVMの値は、「CVM=11001111(=CFh)」となる。
【0029】
上記図2(a)および図2(b)に示す演算から、CV(i)とCV(j)とを基本ビット列を単位として順に対比してみた場合、すなわち、2ビットずつを順に対比してみた場合、CV(i)の値がビット反転してCV(j)になる箇所のCVMの値が“11”であり、それ以外が“00”である。すなわち、CV(i)とCV(j)との値で、CV(i)の“01”がCV(j)の“10”となる箇所、または、CV(i)の“10”がCV(j)の“01”となる箇所のCVMの値が“11”となり、それ以外のCVMの値が“00”となる。また、CVMは、CV(i)およびCV(j)と同じ8ビット固定長の変数である。
【0030】
以上のようにして、全てのCV(i)とCV(j)との組み合わせに対して、CVMを全て算出する。これにより、図3に示すような、列をCV(i)とし、行をCV(j)として、CV(i)とCV(j)とにCVMが関連付けられたテーブルを算出することができる。
【0031】
なお、本実施形態における情報処理装置は、このテーブルを変換テーブルとして予め内部の記憶部(後述するCVMテーブル3)に記憶しておき、この変換テーブルの値を参照しつつ、以降に説明する処理を実行する。なお、以降、CV(i)とCV(j)とに関連付けられているCVMをCVM(i,j)として表現する。つまり、CVMは、CVM(0,0)、・・・・、CVM(15,15)として表現される。
【0032】
ここで、図3のテーブルにおいては、列方向において、識別情報iと変換前のCVであるCV(i)とが関連付けて記憶されており、行方向において、識別情報jと変換後のCVであるCV(j)とが関連付けて記憶されているとともに、さらに、識別情報iと識別情報jとに関連付けてCVM(i,j)が変換テーブルとして記憶されている。
【0033】
なお、この図3において、列方向のCV(i)と行方向のCV(j)とにおいて、16種類のCV順序は、互いに同じとしてある。すなわち、列方向のCV(0)と行方向のCV(0)とは同じ値であり、列方向のCV(1)と行方向のCV(1)とは同じ値であり、・・・・・、列方向のCV(15)と行方向のCV(15)とは同じである。
【0034】
<CVを用いた基本的な検証の利用方法>
次に、図4を用いて、上記に説明したCVを用いた一例としての、改竄などの検証方法について説明する。
【0035】
まず、図4(a)に「通常版」として示すように、プログラムに、01行目に処理Aが記述されており、02行目に処理Bが記述されており、03行目に処理Cが記述されている場合について説明する。すなわち、処理A、処理B、処理Cが順に記述されている場合の処理について説明する。
【0036】
この処理が実行される場合、記述されている順に、まず、処理Aが実行され、処理Aの次に処理Bが実行され、処理Bの次に処理Cが実行される。しかしながら、この場合、処理Aと処理Bと処理Cとのうちいずれかの処理、または、全ての処理について、バイパスされた場合であっても、そのバイパスされたことを検知することが出来ない。
【0037】
これに対して、図4(b)に「セキュア版」として示すように、プログラムの01行目に、「CurrentCVを初期値CV(0)=55hに設定する」ことを示す記述が記述されている。
【0038】
また、02行目に、「処理Aを実行する」ことを示す記述が記述されており、03行目に、「CurrentCVを、CV(0)=55hからCV(3)=5Ahに変えるように、CurrentCVをCVM(0,3)とXOR演算してCurrentCVに上書きする」ことを示す記述が記述されている。
【0039】
また、04行目に、「処理Bを実行する」ことを示す記述が記述されており、05行目に、「CurrentCVを、CV(3)=5AhからCV(12)=9Ahに変えるように、CurrentCVをCVM(3,12)とXOR演算してCurrentCVに上書きする」ことを示す記述が記述されている。
【0040】
また、06行目に、「処理Cを実行する」ことを示す記述が記述されており、07行目に、「CurrentCVを、CV(12)=9AhからCV(8)=AAhに変えるように、CurrentCVをCVM(12,8)とXOR演算してCurrentCVに上書きする」ことを示す記述が記述されている。
【0041】
また、08行目に、「CurrentCVがCV(8)=AAhと一致する否かを判定し、判定した結果が一致しない場合には、異常と判定して停止する」ことを示す記述が記述されている。
【0042】
この、図4(b)に「セキュア版」として示される処理が実行される場合、まず、01行目の処理の実行により、CurrentCVにCV(0)=55hの値が書き込まれる。これにより、物理的なメモリやレジスタなどの記憶部であるCurrentCVに、CV(0)=55hの値が書き込まれる。
【0043】
次に、01行目の処理の実行により、処理Aが実行される。次に、02行目の処理の実行により、CurrentCVとCVM(0,3)とがXOR演算されてCurrentCVに上書きされることにより、CurrentCVの値が、CV(0)=55hからCV(3)=5Ahに更新される。
【0044】
次に、04行目の処理の実行により、処理Bが実行される。次に、05行目の処理の実行により、CurrentCVとCVM(3,12)とがXOR演算されてCurrentCVに上書きされることにより、CurrentCVの値が、CV(3)=5AhからCV(12)=C0hに更新される。
【0045】
次に、06行目の処理の実行により、処理Cが実行される。次に、07行目の処理の実行により、CurrentCVとCVM(12,8)とがXOR演算されてCurrentCVに上書きされることにより、CurrentCVの値が、CV(12)=C0hからCV(8)=AAhに更新される。
【0046】
次に、08行目の処理の実行により、CurrentCVの値がCV(8)=AAhと一致する否かを判定する。この判定した結果が一致することにより、上記の処理が順に正常になされたと判定し、一致しない場合には、異常と判定して停止する。
【0047】
このように、CurrentCVの値が、1行目の初期値CV(0)から、3行目のCVM(0,3)、5行目のCVM(3,12)、7行目のCVM(12,8)により、CV(3)、CV(12)、CV(8)と順に更新され、08行目の処理の実行により、CurrentCVの値がCV(8)と一致する否かを判定することにより、CurrentCVの値を更新する処理が順に実行されたか否かを検証することができる。
【0048】
ここで、たとえば、3行目のCVM(0,3)の処理のみがバイパスされた場合には、CVは、1行目の初期値CV(0)から、5行目のCVM(3,12)により更新され、7行目のCVM(12,8)により更新されるが、この場合には、3行目のCVM(0,3)の処理がバイパスされているために、7行目のCVM(12,8)により更新されたCVの値はCV(8)とならない。同様に、1行目、3行目、5行目、7行目の処理、すなわち、CVの値を更新する処理のうち、1つでも処理がバイパスされた場合には、CVの値はCV(8)とならない。そのため、CVの値を更新する処理が、全て正常に実行されたか否かを検証することができる。
【0049】
また、2行目の処理A、4行目の処理B、および、6行目の処理Cは、それぞれ、CurrentCVの値が順に更新される処理に挟まれて実行されている。すなわち、1行目の初期値CV(0)から、3行目のCVM(0,3)、5行目のCVM(3,12)、7行目のCVM(12,8)により、CV(3)、CV(12)、CV(8)とCurrentCVの値が順に更新される処理に、2行目の処理A、4行目の処理B、および、6行目の処理Cは挟まれている。
【0050】
そのため、08行目の処理の実行により、CurrentCVの値がCV(8)と一致する否かを判定することにより、CurrentCVの値を更新する処理が順に実行されたか否かを検証することができるとともに、処理A、処理B、処理Cが正しい順序で実行されたか否かを検証することができる。
【0051】
以上のように、処理A、B、Cが正しい順序で全て実行された場合、CurrentCVの値が順に更新され、CurrentCVの値は最後にCV(8)=AAhとなる。これを、処理の最後に検査することによって、動作の正しさを検証することが可能である。つまり、バイパスなどが行われた場合の検知が可能になる。
【0052】
なお、CVM(i,j)において、1回目のCVM(i、j)におけるiの値は、初期設定で設定されたCV(i)の値と同じとなるようにする。この図4(b)では、03行目のCVM(0,3)におけるiの値0と、01行目のCV(0)におけるiの値0とを同じ値とする。
【0053】
また、2回目以降のCVM(i、j)におけるiの値は、1つ前のCVM(i、j)におけるjの値と同じとなるようにする。この図4(b)では、03行目のCVM(0,3)におけるjの値3と、05行目のCVM(3、12)におけるiの値3とを同じ値とする。また、05行目のCVM(3,12)におけるjの値12と、07行目のCVM(12、8)におけるiの値12とを同じ値とする。
【0054】
また、最後のCVM(i、j)におけるjの値は、比較する場合に比較対象とするCV(i)におけるiの値と同じとする。この図4(b)では、07行目のCVM(12,8)におけるjの値8と、05行目のCV(8)におけるiの値8とを同じ値とする
【0055】
このようにCVM(i、j)のiとjとの値を設定することにより、CVの値が、CVM(i、j)と排他的論理和演算され、すなわち、図3のテーブルに基いて順に更新されるため、CVの更新処理が順に実行されたことを検証することが可能である。
【0056】
また、初期設定で設定されたCV(i)と、比較する場合に比較対象とするCV(i)とが、互いにビット反転になるような関係になるようにCVM(i、j)を設定しておくことが望ましい。すなわち、初期設定で設定されたCVをCV(i)として、比較する場合に比較対象とするCVがCV(i+8)となるように、CVM(i、j)の順序を設定しておくことが望ましい。
【0057】
これにより、判定の演算方法として、初期設定で設定されたCVと比較対象とするCVとが、互いにビット反転の関係にあるか否かを判定するだけでよく、判定の精度が向上する効果を奏する。
【0058】
ところで、上記に説明した基本的な適用方法のみでは、次の2点の脆弱性の可能性がある。
【0059】
<脆弱性1>
仮に演算途中で、CurrentCVの値を「ビット反転」させるような改竄が出来るような場合には、CurrentCVの値を別の値、つまり、CVと別のCVに変えることができてしまう。しかしながら、現在のハードウェア製品において、物理攻撃によるビット改竄は、連続した隣同士のビットをまとめて0にしたり、1にしたりする事は可能であるが、複数のビットに対して、ビット反転させるような改竄はきわめて難しい(現在は不可能である)事が分かっている。ここで、CVは、上記に説明したように、“01”および“10”を組み合わせた変数であるため、ビット反転攻撃には耐性がある。そのため、このようなビット反転の攻撃に対しては、CVを用いることにより、対抗できる。
【0060】
<脆弱性2>
上記「セキュア版」プログラムの処理A(図4(b)の行番号02の処理)のみ、処理B(図4(b)の行番号04の処理)のみ、または、処理C(図4(b)の行番号06の処理)だけをうまくバイパス攻撃できてしまうと、図4(b)の行番号01、03、05、07、08のCurrentCVの計算を正常に処理されてしまうため、このようなバイパス攻撃を検知することができない。
【0061】
このような問題について、以降に示す手段を組み合わせることにより解決することが可能である。
【0062】
<IF文の代わりに算術演算を利用する方法>
次に、図5を用いて、IF文の代わりに算術演算を利用する方法について説明する。IF文として、通常、条件判断部、正常系処理部、および、例外系処理部に分かれたプログラムが記述される。バイパス攻撃によって、条件判断部(と、正常系処理部)がバイパスされてしまうと、プログラムカウンタが働いてしまい、条件判断部による条件判断が実行されずに、正常系処理部もしくは例外系処理部が動作させられてしまう可能性がある(図5(a)参照)。
【0063】
ここでは、図5(a)に示すように、例えば、認証データtの値が0であるか否かにより、認証が成功したか否かを判定する場合について説明する。
【0064】
この場合、認証データtの値が0であるか否かを判定し(1行目参照)、認証データtの値が0である場合には、認証の成功または失敗を示す変数sの値を0とし(2行目参照)、認証データtの値が0でない場合には、認証の成功または失敗を示す変数sの値を1とする(3行目および4行目参照)。
これにより、認証が正しい場合、すなわち認証データtの値が0の場合には、認証の成功または失敗を示す変数sの値が0となる。また、それ以外、すなわち、認証が正しくなく、認証データtの値が0でない場合には、認証の成功または失敗を示す変数sの値が1となる。
【0065】
しかし、図5(a)に示す方法で認証データtの値により認証の成功または失敗を示す変数sの値を決定する場合、たとえば、1行目、3行目、4行目などの処理がスキップされ、2行目だけが実行された場合には、認証データtの値に関係なく、認証の成功または失敗を示す変数sの値が0となってしまう。
【0066】
たとえば、認証の成功または失敗を示す変数sの値が1として初期化されており、認証が正しい場合、すなわち認証データtの値が0の場合のみ、認証の成功または失敗を示す変数sの値が0となるものとする。ここで、図5(a)に示す認証方法で、認証データtの値により認証の成功または失敗を示す変数sの値を決定した場合、1行目、3行目、4行目などの処理がスキップされ、2行目だけが実行された場合には、認証データtの値に関係なく、認証の成功または失敗を示す変数sの値が1から0に更新されてしまう。このように、図5(a)に示す判定方法には、バイパス攻撃に対して脆弱性があることになる。
【0067】
この解決手段として、条件判断部に用いられるデータを、算術演算(ここでは、論理演算)だけで算術して変換することで、IF文をなくし、バイパス攻撃に対抗できるようにすることが可能である。図5(a)を用いて説明した判定方法に対して、算術演算を用いた一例としての解決手段の例を、図5(b)に示す。
【0068】
この図5(b)に示されるように、認証の成功または失敗を示す変数sの値を、認証データtの値を用いた計算式で算出する。ここでは、認証データtの値と、f0hとを排他的論理和演算することにより、認証の成功または失敗を示す変数sの値を算出する。
【0069】
この場合も、図5(a)に示される方法と同様に、認証が正しい場合、すなわち認証データtの値が0の場合には、認証の成功または失敗を示す変数sの値が0となり、それ以外、すなわち、認証が正しくなく、認証データtの値が0でない場合には、認証の成功または失敗を示す変数sの値が1となる。
【0070】
この処理は、処理が1行となっているため、この1行の処理が飛ばされた場合には、認証の成功または失敗を示す変数sの値が変更されない。
【0071】
そのため、たとえば、認証の成功または失敗を示す変数sの値が1として初期化されている場合、図5(b)の1行の処理が実行されない場合には、認証の成功または失敗を示す変数sの値が1から変更されることはない。認証の成功または失敗を示す変数sの値が1から0となるのは、図5(b)の1行の処理が実行され、かつ、認証が正しい場合のみ、すなわち認証データtの値が0の場合のみである。このように、図5(b)に示す判定方法には、バイパス攻撃に対して耐性があることになる。
【0072】
<CVを内部変数としての利用する方法>
また、内部変数の値は、演算処理部にRAM(Random Access Memory)などのメモリ(記憶装置)上に展開される。しかしながら、メモリ上に展開される場合に、メモリ周辺を電気的にオール0やオール1にし(全てのデータ端子などをHとなる電位、または、Lとなる電位にし)、メモリから読み出す場合またはメモリに書き込む場合のデータの値を電気的(物理的)に変えてしまうことで、ICカードなどの情報処理装置に対して、誤動作を起こさせる可能性がある。
【0073】
例えば、ICカードなどにおいて、認証処理前と後とを0または1の値である1ビットで示す認証フラグに対して、この認証フラグの値を1に改竄することにより、不正アクセスが容易にできる可能性がある(図6(a)参照)。
【0074】
たとえば、図6(a)に示すように、まず、認証フラグauthflagの値を、認証処理前を0とし、認証処理後を1として予め定義しておく。この図6(a)に示す認証方法では、入力されたパスワード(authData)と格納されているパスワード(keyData)とが一致するか否かを判定し(1行目参照)、一致する場合には、認証フラグauthflagの値をTrue(=1)とし(2行目参照)、一致しない場合には、認証フラグauthflagの値をFalse(=0)とする(3行目および4行目参照)。
【0075】
しかしながら、認証フラグauthflagの値は、0または1であるため、上記に説明したメモリ周辺をオール0やオール1にする攻撃に対して、すなわち電気的な攻撃に対しては、脆弱性を有している。
【0076】
この解決手段として、図6(b)に示すように、認証フラグの値にAAhや55hを用いることで、改竄を困難にすることが可能である。また、この図6(b)では、上記の<IF文の代わりに算術演算を利用する方法>で説明した方法を組み合わせた認証処理方法について説明する。なお、ここでAAhや55hを用いる理由は、55hは二進数で表記すると01010101であり、AAhは二進数で表記すると10101010であり、この2つの値は0と1とが順に交互になっており、かつ、全てのビットが互いにビット反転している。そのため、電気的な改ざんに対して、55hからAAhへの改竄、また、逆に、AAhから55hへの改竄が難しいためである。
【0077】
図6(b)の説明に戻り、図6(b)に示すように、ここでは、認証フラグauthflagの値を、認証処理前を55hとし、認証処理後をAAhとして予め定義しておく。なお、この55hおよびAAhは、図1を用いて説明したCVの値でもあり、55h=CV(0)であり、AAh=CV(8)である。
【0078】
この図6(b)では、入力されたパスワード(authData)と格納されているパスワード(keyData)とが、それぞれ8個ずつあり、それぞれを順に認証する場合について説明する。まず、仮変数tmpの値をAAhに初期化する(1行目参照)。次に、ループ処理により、3行目から8行目までの処理を、ループ変数iの値が0から7まで1つずつ増大させながら8回繰り返す(2行目と9行目とを参照)。
【0079】
次に、このループ処理において、1回目のループ処理においては、ループ変数iの値が0であるため、入力されたパスワードの1つ目(authData[0])と格納されているパスワードの1つ目(keyData[0])との排他的論理和演算をし、この結果を変数cmpに代入する(3行目参照)。この変数cmpの値は、入力されたパスワードの1つ目(authData[0])と格納されているパスワードの1つ目(keyData[0])とが一致する場合には0となり、一致しない場合には0以外となる。
【0080】
次に、変数cmpの値が1であるか否かを判定し(4行目参照)、変数cmpの値が0以外である場合には、仮変数tmpの値を55hに変更し(5行目参照)、ループ処理を終了する(6行目参照)。
【0081】
一方、変数cmpの値が0である場合には、仮変数tmpの値を、仮変数tmpの値と変数cmpの値とを排他的論理和演算した値に変更する(8行目参照)。なお、この仮変数tmpの値を、仮変数tmpの値と変数cmpの値とを排他的論理和演算した値に変更する場合、変数cmpの値は0であるので、仮変数tmpの値はAAhが維持される。次に、2回目のループ処理が1回目のループ処理と同様に実行される。
【0082】
以上より、図6(b)に示す認証方法では、入力されたパスワード(authData)と格納されているパスワード(keyData)とが8個全て一致している場合には、仮変数tmpの値はAAhに維持され、1つでも一致しない場合には、仮変数tmpの値は55hに変更される。
【0083】
以上、図6(b)を用いて説明した認証方法のように、認証フラグauthflagの値として、0と1とが順に交互になっており、かつ、全てのビットが互いにビット反転している2つの変数、たとえば、55hとAAhとを用いることにより、55hからAAhへの改竄、また、逆に、AAhから55hへの改竄が難しいため、認証フラグauthflagの値の改竄が困難となる効果を奏するとともに、上記に説明した電気的な改ざんに対して、耐性を有する効果を奏する。
【0084】
<CVを用いたForループの実行の保証>
次に、図7を用いて、CVを用いたForループの実行の保証について説明する。なお、ここではループ処理としてForループについて説明するが、Whileループなど、他のループについても同様である。
【0085】
<ループ処理:通常版>
まず、図7(a)に示すようなForループにおいては、Forループの実行中にバイパスされてしまい、しかるべき回数の処理が実行されないような誤動作が生じる可能性がある。
【0086】
たとえば、図7(a)では、8回のループ処理により(1行目と3行目参照)、処理Aを8回実行している(2行目参照)。しかしながら、1行目と3行目との処理、すなわち、8回のループ処理がバイパスされた場合には、処理Aが1回しか実行されなくなる。また、2行目のみの処理がバイパスされた場合には、1行目と3行目とによるループ処理は8回成されるものの、処理Aは1度も実行されないことになる。
【0087】
<ループ処理:セキュア版1>
この解決手段として、図7(b)に「セキュア版1」として示すように、ループ中にCVの演算処理を行い、ループ処理の終了後に、CVの値が、演算処理が実行された後に本来あるべきCVの値であるか否かをチェックすることで、Forループが実行されたことを保証することが可能である。
【0088】
たとえば、図7(b)に示すように、まず、currentCVの値をCV(0)に初期設定する(1行目参照)。次に、ループ処理により、3行目と4行目との処理を、ループ変数iの値を0から7に順に1つずつ増大させながら8回繰り返す(2行目と5行目とを参照)。
【0089】
1回目のループ処理、すわなち、ループ変数iの値が0の場合には、3行目の処理では、処理Aが実行される。次に、4行目の処理では、currentCVの値が、currentCVの値とCVM(i,i+1)とを排他的論理和演算した値、すなわち、CV(0)とCVM(0,1)とを排他的論理和演算した値に更新される。この4行目の処理において、CVM(0,1)により、currentCVの値が、CV(0)からCV(1)に更新される。
【0090】
2回目のループ処理、すわなち、ループ変数iの値が1の場合には、3行目の処理では、処理Aが実行される。次に、4行目の処理では、currentCVの値が、currentCVの値とCVM(1,2)とを排他的論理和演算した値に更新される。この4行目の処理において、CVM(1,2)により、currentCVの値がCV(1)からCV(2)に更新される。
【0091】
同様に、3回目のループ処理では、CVM(2,3)により、currentCVの値がCV(2)からCV(3)に更新される。また、4回目のループ処理では、CVM(3,4)により、currentCVの値がCV(3)からCV(4)に更新される。また、5回目のループ処理では、CVM(4,5)により、currentCVの値がCV(4)からCV(5)に更新される。また、6回目のループ処理では、CVM(5,6)により、currentCVの値がCV(5)からCV(6)に更新される。また、7回目のループ処理では、CVM(6,7)により、currentCVの値がCV(6)からCV(7)に更新される。また、8回目のループ処理では、CVM(7,8)により、currentCVの値がCV(7)からCV(8)に更新される。
【0092】
次に、8回のループ処理が終了した後、currentCVの値がCV(8)と一致するか否かを判定し、判定結果が、一致しない場合には異常と判定して処理を停止し、一致する場合にはその後の処理を続ける(6行目参照)。
【0093】
このように、Forループの実行にCVを用いた場合においても、CVの値がCVMにより順に更新されていくことにより、図4(b)を用いて説明したように、処理の実行、および、その順序を検証することが可能である。
【0094】
なお、上記に図7(b)を用いて説明した処理の検証においては、CVM(i,j)におけるiとjとの値を、ループ処理で算出される変数で指定している点が、図4(b)において説明した処理の検証と異なる。
【0095】
<ループ処理:セキュア版2>
なお、図7(c)に「セキュア版2」として示すように、ループ回数を可変にすることも可能である。図7(c)では、ループ処理の回数がn回(ここで、nは1以上の任意の整数)である場合について説明する。なお、ループ処理において、予め定められたループする回数の値を、ループ処理回数nとして説明する。
【0096】
たとえば、図7(c)に示すように、まず、currentCVの値をCV(0)に初期設定する(1行目参照)。次に、ループ処理で更新される最終的なcurrentCVをfinalCVとして、このfinalCVの値を、1行目で初期設定されたcurrentCVの値とループ処理回数nとに基いて算出する(2行目参照)。
【0097】
ここでは、ループ処理回数nについて、CVの種類の数である16に対する剰余を算出し、CV(0)であるcurrentCVを、CVM(0、(算出した剰余の値))と排他的論理和演算して算出する。これにより、finalCVとして、CV(算出した剰余の値)となる。
【0098】
このように、最終的なcurrentCVの値を、1行目で初期設定されたcurrentCVの値とループ処理回数nとに基いて算出することが可能な理由は、図7(b)で説明したループ処理と同様に、後述するこの図7(c)のループ処理でも、CV(0)に初期設定されたcurrentCVの値が、CVM(0,1)、CVM(1,2)、CVM(2,3)・・・・により、CV(1)、CV(2)、CV(3)・・・・と、順に更新されるからである。すなわち、ループ処理が実行される毎に、CVを識別する値(CV(i)のiの値)が、順に1つずつ増大していく。そのため、ループ処理の回数nにより、最終的なcurrentCVの値を、ループ処理を実行する前に算出することが可能である。
【0099】
次に、ループ処理により、4行目から6行目の処理を、ループ変数iの値を0からnに順に1つずつ増大させながらn回繰り返す(3行目と7行目とを参照)。
【0100】
1回目のループ処理、すわなち、ループ変数iの値が0の場合には、4行目の処理では、処理Aが実行される。次に、5行目の処理では、ループ変数iについて、CVの種類の数である16に対する剰余を算出し、算出した剰余の値を変数i0に代入する。この5行目の処理は、CVの種類の数が16であるため、ループ変数iが増大した場合に、たとえば、CV(15)の次に、CV(16)ではなく、CV(0)となるようにするためである。また、同様に、CVM(14,15)の次に、CVM(15,16)ではなく、CVM(15,0)となるようにするためである。なお、この1回目のループ処理では、ループ変数iの値が0であるため、変数i0の値は0となる。
【0101】
次に、6行目の処理では、currentCVの値が、currentCVの値とCVM(i0,i0+1)とを排他的論理和演算した値、すなわち、CV(0)とCVM(0,1)とを排他的論理和演算した値に更新される。この6行目の処理におけるCVM(0,1)により、currentCVの値が、CV(0)からCV(1)に更新される。
【0102】
2回目のループ処理、すわなち、ループ変数iの値が1の場合には、4行目の処理では、処理Aが実行される。次に、5行目の処理では、変数i0の値が1として算出される。次に、6行目の処理では、currentCVの値が、currentCVの値とCVM(1,2)とを排他的論理和演算した値に更新される。この6行目の処理におけるCVM(1,2)により、currentCVの値がCV(1)からCV(2)に更新される。
【0103】
同様に、3回目のループ処理では、CVM(2,3)により、currentCVの値がCV(2)からCV(3)に更新される。また、4回目のループ処理では、CVM(3,4)により、currentCVの値がCV(3)からCV(4)に更新される。
【0104】
以降、図7(b)で説明したループ処理と同様にCVの値が順に更新される。ただし、5行目の処理で、ループ変数iについて、CVの種類の数である16に対する剰余を算出し、算出した剰余の値を変数i0に代入する点が、図7(c)のループ処理と図7(b)のループ処理とでは異なる。そのため、たとえば、ループ回数iの値が15から16になった場合に、i0の値が15から0に戻る点が、図7(c)のループ処理と図7(b)のループ処理とでは異なる。
【0105】
その後、n回のループ処理が終了した後、currentCVの値がループ演算の前に算出したfinalCVの値と一致するか否かを判定し、判定結果が、一致しない場合には異常と判定して処理を停止し、一致する場合にはその後の処理を続ける(8行目参照)。
【0106】
このように、ループ回数を可変にした場合においても、ループ処理で更新される最終的なcurrentCV、すなわちfinalCVを、初期設定されたcurrentCVの値とループ処理回数nとに基いて算出することが可能であるため、図4(b)を用いて説明したループ処理と同様に、Forループの実行にCVを用いてループ処理における処理の実行、および、その順序を検証することが可能である。
【0107】
なお、上記に図7(b)と図7(c)とを用いて説明したループ処理においては、CVの識別情報(CV(i)におけるiの値)を、1つずつ増大するようにCVMを指定する識別情報(CVM(i、j)におけるiとjとの値)を算出したが、これに限られるものではなく、2つずつ増大させてもよいし、異なる方法で算出するようにしてもよい。たとえば、j=jmod16とする方法がある。
【0108】
ただし、ループ処理の1回目のCVM(i、j)におけるiの値は、初期設定で設定されたCV(i)の識別情報iの値と同じとなるようにする。また、2回目以降のCVM(i、j)におけるiの値は、1つ前のCVM(i、j)におけるjの値と同じとなるようにする。また、ループ処理の最後のCVM(i、j)におけるjの値は、比較する場合のCV(i)におけるiの値と同じとする。このようにCVM(i、j)のiとjとの値を設定することにより、または、算出されるように設定することにより、ループ処理が順に実行されたことを検証することが可能である。
【0109】
<CVを用いたモジュールの返却値への応用>
次に、図8を用いて、CVをモジュールの返却値に応用する場合について説明する。たとえば、比較や認証を実行するモジュールなどが、比較結果や認証結果を返却する場合には、一般に、正常終了を示す“0”や異常終了を示す“1”などの、1ビットの簡単な値を用いることがある(図8(a)参照)。たとえば、この図8(a)に示す例では、関数f1()は、返却値として1または0を返している。
【0110】
しかし、モジュールからの返却値が、メモリ上に展開された場合に、そのメモリ周辺をオール0やオール1にすることで、本来の返却値を改竄してしまうことで、ICカードなどに対して、誤動作を起こさせる可能性がある。すなわち、電気的な改竄に対する脆弱性を有している。
【0111】
この解決手段として、図8(b)に「セキュア版」として示すように、モジュールの返却値としての正常終了と異常終了とを示す値として、例えば、55hとAAh、または、66hと99hなどの値を用いる。つまり、正常終了を示す値と、異常終了を示す値とが、互いに完全にビット反転した値とする。これにより、ビット反転は難しいため、電気的な改竄に対する耐性を得ることが可能となる。
【0112】
なお、この55hとAAhとはCV(0)とCV(8)に対応し、また、66hと99hとはCV(5)とCV(13)に対応している。そのため返却値として、CVを用いることが可能である。
【0113】
また、可能であれば、モジュール内のCVの演算に、パラメータを含むようにすると、さらに、誤動作に対する強度が向上する(後述する<CVを用いたグローバル・スタンプ・ラリー>を参照)。
【0114】
<CVを用いたグローバル・スタンプ・ラリー>
次に、図9を用いて、グローバル・スタンプ・ラリーについて説明する。まず、本実施形態でいうグローバル・スタンプ・ラリーについて説明する。なお、ここでは、モジュールの階層構造として、最上位モジュール、Module_A、および、Module_Bとの3つの階層構造を有している場合について説明する。なお、この図9においては、後述するcurrentCVをcCV、currentCVaをcCVa、currentCVbをcCVbとして表記している。
【0115】
ここでは、最上位モジュールで扱うcurrentCVの値を、そのまま下層モジュールに対して渡していき、最終的に下層モジュールから最上位モジュールに処理が戻ってから、最上位モジュールにてCVの値を検証する。これにより、全ての階層モジュールにおいて、しかるべき動作が正しく実行されたことを保証することができる。これを、グローバル・スタンプ・ラリーと称する。
【0116】
なお、このグローバル・スタンプ・ラリーとは、モジュール間の各データの入出力において、このモジュール間の各データの入出力において予め設定されているCVMによりcurrentCVの値を順に変換する、すなわち、currentCVの値をCVMにより更新する。このcurrentCVの値をCVMにより更新することを、ここでは、currentCVにCVMのスタンプを押すと称して説明する。なお、このグローバル・スタンプ・ラリーでは、モジュール内の処理においても、currentCVをCVMで更新する。
【0117】
次に、グローバル・スタンプ・ラリーを導入するための基本ルールについて説明する。
・最上位モジュール(必ずしもmainである必要はない)で、currentCVの初期値を設定する。たとえば、図9(a)の1行目「currentCV=CV(0)」を参照。なお、このCV(0)は55hである。
【0118】
・最上位モジュールは、処理の最後に、モジュールから返却されたcurrentCVの値と、下位モジュールに渡したcurrentCVの値をビット反転した値(本来返却されるべきcurrentCVの値)との排他的論理和演算を行い、00hになっているか否かを判定することにより、下位モジュールに渡したcurrentCVの値と下位モジュールから返却されたcurrentCVの値とが反転の関係になっているか否かを確認する。たとえば、図9(a)の4行目「if(CV(10)^ret)」を参照。
【0119】
・各モジュール(最上位モジュールを含む)は、モジュールを呼び出す場合に、呼び出すモジュールに対して、currentCVの値をパラメータとして渡す(図9のステップS91、S92、S93、S94を参照)。
【0120】
・呼び出された各モジュール(最上位モジュールを含む)は、上位のモジュールから受け取った(または、上位モジュールが最上位モジュールである場合には、初期設定された)currentCVの値に対して、順にスタンプを押していき、モジュール内処理が終了する前に、必ず、currentCVの値がビット反転するようにし、上位モジュールに最後のCVを返却する。言い換えると、受け取った場合のcurrentCVの値と、返却するcurrentCVの値とが、互いにビット反転する関係になるように、スタンプラリーを予め設定しておく(たとえば、図9(c)のCVM(4,7)、CVM(7,8)、CVM(8,12)を参照)。
【0121】
なお、上記に説明したようにスタンプラリーを設定することにより、各モジュールにおいて、呼び出したモジュールの処理が終了した場合において、呼び出したモジュールに渡したCVの値と、呼び出したモジュールから受け取ったCVの値とは、互いにビット反転しているはずである。
【0122】
そこで、各モジュールは、たとえば、呼び出したモジュールが認証など重要なモジュールである場合には、必要に応じて、呼び出したモジュールに渡したcurrentCVの値と、呼び出したモジュールから受け取ったcurrentCVの値とが、互いにビット反転している関係にあるか否かを判定することにより、呼び出したモジュールの動作を検査する。
【0123】
各モジュールは、この判定結果が、呼び出したモジュールに渡したcurrentCVの値と、呼び出したモジュールから受け取ったcurrentCVの値とが、互いにビット反転している関係にない場合、つまり、検査NGの場合には、動作異常と判定して、予め定められた動作異常対処処理を実行する。
なお、呼び出されたモジュールは、返却値として、可能な限りCVを用いるようにする。
【0124】
<グローバル・スタンプ・ラリーの動作>
次に、図9の場合について、一例としてのグローバル・スタンプ・ラリーの動作について説明する。なお、ここでは、currentCVの値を更新する処理のみについて説明する。
まず、図9(a)の最上位モジュールにおいて、currentCVの値がCV(0)に初期設定される(図9(a)1行目参照)。次に、currentCVの値が、CVM(0,2)により、CV(0)からCV(2)に更新される(図9(a)2行目参照)。次に、Module_Aを、Module_A(currentCV)として呼び出すことにより、呼び出すModule_AにCV(2)であるcurrentCVを渡す(図9(a)3行目参照)(ステップS91)。
【0125】
次に、ステップS91で最上位モジュールに呼び出されたModule_Aは、渡されたCV(2)を、Module_A内のローカルな変数であるcurrentCVaとして受け取り、この受け取ったcurrentCVaを、CVM(2,4)により、CV(4)に更新する(図9(b)1行目参照)。次に、Module_Bを、Module_B(currentCVa)として呼び出すことにより、呼び出すModule_BにCV(4)であるcurrentCVaを渡す(図9(b)2行目参照)(ステップS92)。
【0126】
次に、ステップS92でModule_Aに呼び出されたModule_Bは、渡されたCV(4)を、Module_B内のローカルな変数であるcurrentCVbとして受け取り、この受け取ったcurrentCVbを、CVM(4,7)により、CV(7)に更新する(図9(c)1行目参照)。次に、CV(7)であるcurrentCVbを、CVM(7,8)により、CV(8)に更新する(図9(c)2行目参照)。次に、CV(8)であるcurrentCVbを、CVM(8,12)により、CV(12)に更新する(図9(c)3行目参照)。次に、CV(12)であるcurrentCVbを、自モジュールを呼び出したModule_Aに返却する(図9(c)4行目参照)(ステップS93)。
【0127】
ここで、ステップS92でModule_AがModule_Bに渡したcurrentCVaの値であるCV(4)と、ステップS93でModule_BがModule_Aに返却したcurrentCVbの値であるCV(12)とは、互いにビット反転の関係にある。
【0128】
次に、ステップS93でModule_BからCV(12)であるcurrentCVbの値を返却されたModule_Aは、返却されたcurrentCVbの値を、返却値を代入するための変数である返却値retに代入する(図9(b)2行目参照)。次に、返却値ret、すなわち、ステップS93でModule_Bから返却されたcurrentCVbの値と、Module_Bに渡したCV(4)とビット反転の関係にあるCV(12)とを排他的論理和演算することにより、返却値retとModule_Bに渡したCV(4)がビット反転の関係にあるかを判定する。判定値が00hにならない場合は、返却値が誤っているため、処理を中止する(図9(b)3行目参照)。
【0129】
この判定処理により、Module_Bにおいて、処理が正常な順序で実行され、かつ、処理がバイパスされていないことを判定できる。なお、処理が正常な順序で実行され、かつ、バイパスがされていない場合には、ステップS92でModule_AがModule_Bに渡したcurrentCVaの値であるCV(4)と、ステップS93でModule_BがModule_Aに返却したcurrentCVbの値であるCV(12)とは、互いにビット反転の関係にあるはずであることにより、この判定が可能である。
【0130】
次に、Module_Bに渡したcurrentCVaの値と、Module_Bからの返却値retの値と、CV(11)とFFhとを、排他的論理和演算した値で、currentCVaの値を更新する(図9(b)4行目参照)。ここでは、Module_Bに渡したcurrentCVaの値はCV(4)であり、Module_Bからの返却値retの値はCV(12)である。そのため、この演算は、CV(4)とCV(12)とCV(11)とFFhとを排他的論理和演算することになる。ここで、この排他的論理和演算した値はCV(11)となるため、currentCVaの値はCV(11)に更新される。
【0131】
なお、上記図9(b)4行目の処理において、Module_Bに渡したcurrentCVaの値とModule_Bからの返却値retの値とは、上記に説明したように、Module_Bで正常に処理が実行された場合には、互いにビット反転の関係にある。そのため、Module_Bに渡したcurrentCVaの値と、Module_Bからの返却値retの値と、CV(a)と、FFhとを、それぞれ排他的論理和演算した場合、その値はCV(a)となる。この識別変数aは、0から15の任意の整数である。
これは、Module_Bに渡したcurrentCVaの値とModule_Bからの返却値retとの排他的論理和演算した結果は、互いにビット反転した値同士を排他的論理和演算することからFFhとなり、このFFhに対して、更にFFhと排他的論理和演算することにより00hとなるためである。
【0132】
このように、検証をするための変数(この場合は、currentCV、currentCVaまたはcurrentCVb)の値を更新する演算に、モジュールからの返却値retの値を直接用いることにより、検証をするための変数の値にモジュールからの結果を反映させることが可能である。また、このようにモジュールからの返却値の値を反映した検証をするための変数の値を判定することにより、モジュールにおいて記述された順序通りに処理が実行されたか否かを検証することが可能となる。
【0133】
次に、CV(11)であるcurrentCVaの値を、CVM(11,10)により、CV(10)に更新する(図9(b)5行目参照)。次に、CV(10)であるcurrentCVaの値を、自モジュールを呼び出した最上位モジュールに返却する(図9(b)6行目参照)(ステップS94)。
【0134】
このステップS91とステップS94とにおいても、ステップS92とステップS93と同様に、ステップS91で最上位モジュールがModule_Aに渡したcurrentCVの値であるCV(2)と、ステップS94でModule_Aが最上位モジュールに返却したcurrentCVaの値であるCV(10)とは、互いにビット反転の関係にある。
【0135】
次に、ステップS94でModule_AからCV(10)であるcurrentCVの値を返却された最上位モジュールは、返却されたcurrentCVの値を、返却値を代入するための変数retに代入する(図9(a)3行目参照)。次に返却されたcurrentCVの値とModule_Aから返却されるべきcurrentCVの値であるCV(10)との排他的論理和演算を行い、00hになっているか否かを判定することにより、Module_Aに渡したCV(2)とModule_Bから返却されたCV(10)とがビット反転の関係になっているか否かを確認する(図9(a)4行目参照)。
【0136】
次に、currentCVの値と変数retの値とCV(7)とFFhとの排他的論理和演算を行い、currentCVの値とする(図9(a)5行目参照)。次に、currentCVの値を、CVM(7,8)により、CV(8)に更新する(図9(a)6行目参照)。次に、currentCVの値とCV(8)とが、互いにビット反転の関係にあるか否かを判定する(図9(a)7行目参照)。この判定結果が、ビット反転関係にない場合は、処理を中止し、ビット反転関係である場合は、その後の処理を継続する。
【0137】
以上のようにして、複数のモジュール間においても、CVを順に更新していくことにより、処理が順に実行されたことを検証することができ、また、処理がバイパスされていないことを検証することが可能である。
【0138】
以上説明したように、CVを用いることにより、次のような効果を奏する。
(1)バイパス検知、つまり、プログラムステップを飛ばして処理が行われてしまうことを検知することが可能である。
(2)改竄の検知、つまり、プログラム処理中のある値が改竄されてしまうことを検知することが可能である。
【0139】
(3)また、次のことにより、バイパス検知または改竄の検知のために追加される処理で必要となる演算時間を低減することが可能である。
・IF文を減らすこと。
・算術演算ではなく、XOR演算(排他的論理和演算)という論理演算を利用すること。一般的に、算術演算に対比して、論理演算の方が、演算時間が早い。また、本実施形態においては、変換テーブルを用いてXOR演算を実行するため、更に演算時間が早い。
・1バイト単位の変数エリアとワークエリアを2〜3バイト準備するだけでよいこと。
【0140】
次に、図10を用いて、一例としての上記に説明した本実施形態のICカードなどの情報処理装置1の構成について説明する。情報処理装置1は、検証メモリ部2、CVMテーブル3、情報処理部4、CV初期値設定部5、CV演算部6、CV判定部7、および、異常動作対処部8を有する。なお、CVMテーブル3は、変換前ビット列記憶部(ビット列記憶部)31と、変換後ビット列記憶部32と、変換テーブル記憶部(変換ビット列記憶部)33とを有する。なお、このCVMテーブル3において、変換前ビット列記憶部31と、変換後ビット列記憶部32と、変換テーブル記憶部33とは、図3に示すように、一体としたテーブルとしてもよい。また、後述するように変換前ビット列記憶部31と変換後ビット列記憶部32とには、同一の情報が記憶されるため、この変換前ビット列記憶部31と変換後ビット列記憶部32とを一体として1つの記憶部、たとえば、ビット列記憶部34としてもよい。
【0141】
変換前ビット列記憶部31には、少なくとも0と1とを含む2ビット長以上の第1の固定ビット長(たとえば、2ビット長)である複数の基本ビット列(たとえば、“01”と“10”)を組み合わせた第2の固定ビット長(たとえば、1バイト長)のビット列のデータ型を型Aとして、型Aのビット列の値であって、値が互いに異なるm個の値が、変換前ビット列を識別する変換前ビット列識別情報(識別子i(i=0,・・・,m−1))と関連付けて、型Aのビット列の配列X(i)として予め記憶されている(たとえば、図3のiとCV(i)とを参照)。
【0142】
ここで、第1の固定ビット長の値をL1とし、第2の固定ビット長の値をL2とし、基本ビット列の個数をU個とした場合には、変換前ビット列の個数mの値は、m=U(L2/L1)となる。なお、Uの値は最大ではU=2L1であるが、基本ビット列を、後述するように互いにビット反転した2つの基本ビット列とした場合には、U=2となる。たとえば、図3を用いて説明した基本ビット列と変換前ビット列との場合には、基本ビット列の個数が2個で、固定ビット長の値L1が2で、第2の固定ビット長の値L2が8であるため、変換前ビット列の個数mの値は、m=2(8/2)=24=16となる。
【0143】
変換後ビット列記憶部32には、基本ビット列を組み合わせた第2の固定ビット長の変数である変換後ビット列が、変換後ビット列を識別する変換後ビット列識別情報(識別子j(j=0,・・・,m−1))と関連付けて予め記憶されている(たとえば、図3のjとCV(j)とを参照)。よって、この変換後ビット列記憶部32には、変換前ビット列記憶部31と同一の情報が記憶されることになる。そこで、以降においては、変換前ビット列記憶部31と変換後ビット列記憶部32とを一体として、ビット列記憶部34として説明する。
【0144】
変換テーブル記憶部33には、変換前識別情報と変換後識別情報とに関連付けて、当該変換前識別情報で識別される変換前ビット列と排他的論理和演算することにより当該変換後識別情報で識別される変換後ビット列に変換させる変換ビット列が変換テーブルとして予め記憶されている(たとえば、図3のiとjとCVM(i,j)とを参照)。
すなわち、変換テーブル記憶部33には、型Aのビット列X(k)と排他的論理和演算することで型Aのビット列X(l)となるようなビット列の配列Z(k,l)(k,l=0,・・・,m−1)が変換ビット列として記憶されている。
【0145】
なお、この複数の基本ビット列は、互いにビット反転した2つの基本ビット列である(たとえば、“01”と“10”)。
【0146】
また、ビット列記憶部34に記憶されている変換前ビット列と変換後ビット列記憶部32に記憶されている変換後ビット列とは、少なくとも、互いにビット反転の関係にある変換前ビット列と変換後ビット列とを有している。
【0147】
なお、ビット列記憶部34には、複数の変換前ビット列と変換前ビット列識別情報とが関連付けて予め記憶されている。また、変換後ビット列記憶部32には、複数の変換後ビット列と変換後ビット列識別情報とが関連付けて予め記憶されている。また、変換テーブル記憶部33には、複数の変換前識別情報と複数の変換後識別情報とに関連付けて、複数の変換ビット列が変換テーブルとして予め記憶されている。
【0148】
また、ビット列記憶部34に関連付けて記憶されている複数の変換前ビット列と変換前ビット列識別情報との組み合わせと、変換後ビット列記憶部32に関連付けて記憶されている複数の変換後ビット列と変換後ビット列識別情報との組み合わせは、互いに一致するようにされている。
【0149】
検証メモリ部2には、検証用となる変数の値が記憶される。情報処理部4は、予め定められたプログラムの記述に基づいて順に情報処理を実行する。なお、情報処理装置1は、このプログラムを記憶するためのプログラム記憶部を内部に有している。また、情報処理部4は、ループ処理がループされる毎に算出される変数をループ変数として有している。
【0150】
また、情報処理部4は、後述する設定記述に基いて、変換前ビット列識別情報で識別される変換前ビット列をビット列記憶部34から読み出して、CV初期値設定部5を介して検証メモリ部2に記憶する。
また、情報処理部4は、CV演算部6により、検証メモリ部2から読み出した変数と変換ビット列とを排他的論理和演算して、検証メモリ部2に上書きする。
また、情報処理部4は、CV判定部7により、検証メモリ部2から読み出した変数の値に基いて、後述する検証演算記述による排他的論理和演算が実行されたか否かを判定する。
【0151】
また、情報処理部4は、CV判定部7による判定結果が、後述する検証演算記述による排他的論理和演算が実行されていない場合には、異常動作対処部8により、予め定められた異常動作対処を実行する。
【0152】
以降からの情報処理装置1の構成について説明においては、プログラム記憶部に記憶されているプログラムと、情報処理部4の動作についてのみ説明する。
【0153】
予め定められたプログラムには少なくとも、変換前ビット列識別情報で識別される変換前ビット列、すなわちビット列記憶部34に記憶されている型Aのある値を検証メモリ部2に記憶させることを示す記述である設定記述と、検査対象となる情報処理である検査対象情報処理を実行することを示す記述である情報処理記述と、検証メモリ部2に記憶されている変数を変換前識別情報と変換後識別情報とで識別される変換ビット列で、すなわち変換テーブル記憶部33より読み出した変換ビット列で排他的論理和演算した値を検証メモリ部2に上書きすることを示す記述である検証演算記述と、検証メモリ部2に記憶されている変数の値に基いて、検証演算記述による排他的論理和演算が実行されたか否かを判定することを示す記述である判定記述とが、予め記述されている。なお、このプログラムには、設定記述の後に情報処理記述が記述され、情報処理記述の後に検証演算記述が記述され、かつ、検証演算記述の後に判定記述が記述されるように予め記述されている。
【0154】
また、このプログラムには、情報処理記述およびその後に検証演算記述が記述されている記述を情報処理検証演算記述として、設定記述の後に、n個(nは任意の自然数)の情報処理検証演算記述が順に記述され、かつ、n個の情報処理検証演算記述の後に判定記述が記述されるように予め記述されている。
【0155】
この設定記述には、ビット列記憶部34に記憶されている型Aの値であるX(p0)(p0は、0〜m−1の間の任意の値の識別子)を検証メモリ部2に記憶させるように記述されている。また、n個の情報処理検証演算記述のうちi番目の記述の中の検証演算記述には、検証メモリ部2に記憶されている変数を、変換テーブル記憶部33より読み出した変換ビット列であるZ(pi−1,pi)(piは0〜m−1の間の任意の識別子)が示す値で排他的論理和演算し、検証メモリ部2に上書きするように予め記述されている。
【0156】
また、この判定記述には、検証メモリ部2に記憶されている変数が、X(p0)^Z(p0,p1)^・・・・^Z(pn−1,pn)(^は排他的論理和演算)の値となるX(pn)(pnは0〜m−1の間の任意の識別子)であって、ビット列記憶部34から読み出したX(pn)の値と一致するか否かを判断するように予め記述されている。
【0157】
この場合、情報処理部4は、設定記述に基いて、変換前ビット列識別情報で識別される変換前ビット列をビット列記憶部34から読み出して検証メモリ部2に記憶する。すなわち、情報処理部4は、設定記述に基いて、ビット列記憶部34より読み出した型Aのある値を検証メモリ部2に記憶する。
【0158】
次に、情報処理部4は、情報処理検証演算記述に含まれている情報処理記述に基いて、検査対象情報処理を実行し、情報処理検証演算記述に含まれている検証演算記述に基いて、検証メモリ部2から読み出した変数と、変換前識別情報と変換後識別情報とで識別される変換ビット列であって、変換テーブル記憶部33の変換テーブルから読み出した変換ビット列とを排他的論理和演算して検証メモリ部2に上書きする。
すなわち、情報処理部4は、情報処理検証演算記述に基づいて、検査対象情報処理を実行するとともに、検証メモリ部2から読み出した変数と、変換テーブル記憶部33から読み出した変換ビット列とを排他的論理和演算した値を検証メモリ部2に上書きする。
【0159】
次に、情報処理部4は、判定記述に基いて、検証メモリ部2から読み出した変数の値に基いて、検証演算記述による排他的論理和演算が実行されたか否かを判定する。
すなわち、情報処理部4は、判定記述に基づいて、検証メモリ部2から読み出した変数の値が、ビット列記憶部34から読み出した型Aのビット列と一致するか否かを判定することにより、検証演算記述による排他的論理和演算が実行されたか否かを判定する。
【0160】
なお、この判定記述には、検証メモリ部2に記憶されている変数と変換後ビット列識別情報で識別される変換後ビット列とが互いにビット反転の関係にあるか否かを判定することを示す記述が記述されている。
【0161】
この場合、情報処理部4は、この判定記述に基いて、検証メモリ部2から読み出した変数と、ビット列記憶部34から読み出した変換後ビット列識別情報で識別される変換後ビット列とが互いにビット反転の関係にあるか否かを判定する。
【0162】
すなわち、設定記述に基づいて検証メモリ部2に記憶された型Aの値と、判定記述に基づいてビット列記憶部34より読み出された型Aの値とは、互いにビット反転の関係にある。
【0163】
また、予め定められたプログラムには少なくとも、設定記述と、複数の情報処理検証演算記述と、判定記述とが、設定記述の後に複数の情報処理検証演算記述が順に記述され、複数の情報処理検証演算記述の後に判定記述が記述されるように予め記述されている。
【0164】
この場合、情報処理部4は、設定記述に基いて、変換前ビット列識別情報で識別される変換前ビット列をビット列記憶部34から読み出して検証メモリ部2に記憶する。次に、情報処理部4は、複数の情報処理検証演算記述に基いて、検査対象情報処理を実行するとともに、検証メモリ部2から読み出した変数と、変換前識別情報と変換後識別情報とで識別される変換ビット列であって、変換テーブル記憶部33の変換テーブルから読み出した変換ビット列とを排他的論理和演算して検証メモリ部2に順に上書きする。次に、情報処理部4は、判定記述に基いて、検証メモリ部2から読み出した変数と、ビット列記憶部34から読み出した変換後ビット列識別情報で識別される変換後ビット列とに基いて、複数の情報処理検証演算記述に含まれている検証演算記述による排他的論理和演算が順に実行されたか否かを判定する。
【0165】
なお、複数の情報処理検証演算記述のうち最初の情報処理検証演算記述に含まれている検証演算記述の記述において、設定記述に記述されている変換前ビット列識別情報が、検証メモリ部2に記憶されている変数と排他的論理和演算するための変換ビット列を指定するための変換前識別情報として記述されている。
【0166】
また、複数の情報処理検証演算記述のうち2番目以降の情報処理検証演算記述に含まれている検証演算記述の記述において、1つ前の情報処理検証演算記述に含まれている検証演算記述に記述されている変換後識別情報が、検証メモリ部2に記憶されている変数と排他的論理和演算するための変換ビット列を指定するための変換前識別情報として記述されている。
【0167】
また、複数の情報処理検証演算記述のうち最後の情報処理検証演算記述に含まれている検証演算記述の記述において、検証メモリ部2に記憶されている変数を判定するために判定記述に記述されている変換後ビット列識別情報が、検証メモリ部2に記憶されている変数と排他的論理和演算するための変換ビット列を指定するための変換後識別情報として記述されている。
【0168】
<CVを用いたForループの実行の保証>
ここで、情報処理記述の後に検証演算記述が記述されている記述を情報処理検証演算記述とする。また、予め定められたプログラムには少なくとも、設定記述と、ループ処理を実行することを示す記述ともに、該記述されているループ処理が実行される場合に、該実行されているループ処理内で情報処理検証演算記述を実行することを示す記述が記述されているループ処理記述と、判定記述とが、設定記述の後にループ処理記述が記述され、かつ、ループ処理記述の後に判定記述が記述されるように予め記述されている。
【0169】
この場合、情報処理部4は、設定記述に基いて、変換前ビット列識別情報で識別される変換前ビット列をビット列記憶部34から読み出して検証メモリ部2に記憶する。次に、情報処理部4は、ループ処理記述に基いてループ処理を実行するとともに、該実行しているループ処理内で情報処理検証演算記述に基いて、検査対象情報処理を実行するとともに、検証メモリ部2から読み出した変数と、変換前識別情報と変換後識別情報とで識別される変換ビット列であって、変換テーブル記憶部33の変換テーブルから読み出した変換ビット列とを排他的論理和演算して検証メモリ部2に順に上書きする。次に、情報処理部4は、判定記述に基いて、検証メモリ部2から読み出した変数と、ビット列記憶部34から読み出した変換後ビット列識別情報で識別される変換後ビット列とに基いて、ループ処理の実行において情報処理検証演算記述に含まれている検証演算記述による排他的論理和演算が順に実行されたか否かを判定する。
【0170】
また、ループ処理内で実行される情報処理検証演算記述に含まれている検証演算記述の記述において、検証メモリ部2に記憶されている変数と排他的論理和演算するための変換ビット列を指定するための変換前識別情報および変換前識別情報の値がループ変数に基いて算出されるような算出手順が記述されている。
【0171】
なお、この算出手順は、ループ処理が実行される場合に、情報処理検証演算記述に含まれている検証演算記述による排他的論理和演算が最初に実行される場合には、ループ変数に基いて算出される変換前識別情報の値が、設定記述に記述されている変換前ビット列識別情報の値となる、ように予め記述されている。
【0172】
また、この算出手順は、情報処理検証演算記述に含まれている検証演算記述による排他的論理和演算が2回目以降に実行される場合には、ループ変数に基いて算出される変換前識別情報の値が、1つ前に情報処理検証演算記述に含まれている検証演算記述による排他的論理和演算が実行された場合に算出された変換後識別情報の値となるように予め記述されている。
【0173】
また、この算出手順は、情報処理検証演算記述に含まれている検証演算記述による排他的論理和演算が最後に実行される場合には、ループ変数に基いて算出される変換後識別情報の値が、検証メモリ部2に記憶されている変数を判定するために判定記述に記述されている変換後ビット列識別情報の値となるように予め記述されている。
【0174】
また、ループ処理を実行する回数の値が予め定められており、検証メモリ部2に記憶されている変数を判定するために判定記述に記述されている変換後ビット列識別情報の値が、設定記述に記述されている変換前ビット列識別情報の値と、ループ処理を実行する回数の値とに基いて算出される。
【0175】
より具体的には、たとえば、予め定められたプログラムには、少なくとも、設定記述と、ループ処理を実行することを示す記述とともに、該記述されているループ処理が実行される場合に、該実行されているループ処理内で情報処理検証演算記述を実行する事を示す記述であるループ処理記述と、判定記述とが、設定記述の後にループ処理記述が記述され、かつ、ループ処理記述の後に判定記述が記述されるように予め記述されている。
【0176】
この設定記述には、値0の識別子で対応づけられるX(0)の値を検証メモリ部に記憶させるように記述されている。また、ループ処理記述中の検証演算記述には、検証メモリ部に記憶されている変数を、変換テーブル記憶部33より読み出した変換ビット列であるZ(i−1,i)(iはループ内i番目に処理される回数値)が示すビット列の値で排他的論理和演算し、検証メモリ部に上書きするように予め記述されている。また、判定記述には、検証メモリ部に記憶されている変数が、ビット列記憶部34から読み出したX(n)(n=1〜mであり、ループ回数)の値と一致するか否かを判断するように予め記述されている。
【0177】
この場合、情報処理部4は、設定記述に基づいて、ビット列記憶部34より読み出した型Aのある値を検証メモリ部に記憶し、情報処理検証演算記述に基づいて、検査対象情報処理を実行するとともに、検証メモリ部から読み出した変数と、変換テーブル記憶部33から読みだした変換ビット列とを排他的論理和演算した値を検証メモリ部に上書きし、判定記述に基づいて、検証メモリ部から読み出した変数の値が、ビット列記憶部34から読み出した型Aのビット列と一致するか否かを判定することにより、検証演算記述による排他的論理和演算が実行されたか否かを判定する。
【0178】
<CVを用いたモジュールの返却値への応用>
また、予め定められたプログラムには、下位モジュールを呼び出し、検証メモリ部2に記憶されている検証用となる変数を呼び出す下位モジュールに渡すとともに、呼び出された下位モジュールからの返却値を取得することを示す記述であるモジュール呼出記述と、モジュール呼出記述で呼び出した下位モジュールからの返却値が、予め定められたビット列であるか否かを検証することを示す返却値判定記述とが、モジュール呼出記述の後に返却値判定記述が記述されるように予め記述されている。
【0179】
この場合、情報処理部4は、モジュール呼出記述に基づいて、下位モジュールを呼び出し、検証メモリ部2に記憶されている検証用となる変数を呼び出す下位モジュールに渡すとともに、呼び出された下位モジュールからの返却値を取得し、返却値判定記述に基づいて、モジュール呼出記述で呼び出した下位モジュールからの返却値が、下位モジュールが記述順通りに実行された場合に返却されるビット列であるか否かを検証する。
【0180】
また、返却値判定記述には、検証メモリ部2に記憶されている検証用となる変数であって、呼び出すモジュールに渡した変数の値と、モジュール呼出記述で呼び出したモジュールからの返却値の値とが、互いにビット反転の関係にあることを検証することにより、モジュール呼出記述で呼び出したモジュールからの返却値の値を検証することを示す記述が記述されている。
【0181】
この場合、情報処理部4は、返却値判定記述に基づいて、検証メモリ部2に記憶されている検証用となる変数であって、呼び出すモジュールに渡した変数の値と、モジュール呼出記述で呼び出したモジュールからの返却値の値とが、互いにビット反転の関係にあることを検証することにより、モジュール呼出記述で呼び出したモジュールからの返却値の値を検証する。
【0182】
ところで、以降においては、情報処理装置1は、モジュール内検証メモリ部を有しているものとして説明する。このモジュール内検証メモリ部とは、検証メモリ部2と同様のメモリ部である。このようなモジュール内検証メモリ部を用いることにより、すなわち、モジュール内のローカル変数としての変数を用いることにより、モジュール間でプログラムの記述順の通りに処理が実行されたか否かの検証をすることが可能である。
なお、このようなモジュール内検証メモリ部を用いることなく、検証メモリ部2のみを用いても、モジュール間でプログラムの記述順の通りに処理が実行されたか否かの検証を同様に実行することは可能である。検証メモリ部2のみを用いる場合には、この検証メモリ部2には、たとえば、グローバル変数としての変数が記憶される。
【0183】
モジュール呼出し記述に基づいて呼出される下位モジュールのプログラムには、自モジュールを呼出した上位モジュールより渡された変数を、変換ビット列記憶部より読み出した変換ビット列で排他的論理和演算してモジュール内検証メモリ部に記憶する事を示す記述であるモジュール内設定記述と、自モジュール内における検査対象となる情報処理であるモジュール内検査対象情報処理を実行する事を示す記述であるモジュール内情報処理記述と、モジュール内検証メモリ部に記憶されている変数を変換ビット列記憶部より読み出した変換ビット列で排他的論理和演算した値をモジュール内検証メモリ部に上書きする事を示す記述であるモジュール内検証演算記述と、モジュール内検証メモリ部に記憶されている変数の値を、上位モジュールに返却値として返却することを示す返却記述とが記述されている。
なお、モジュール内情報処理記述およびその後にモジュール内検証演算記述が記述されている記述をモジュール内情報処理検証演算記述として、モジュール内設定記述の後にモジュール内情報処理検証演算記述が記述され、かつ、モジュール内情報処理検証演算記述の後に返却記述が記述されるように記述されている。
【0184】
この場合、情報処理部4は、モジュール内設定記述に基づいて、自モジュールを呼出した上位モジュールより渡された変数を変換ビット列記憶部33より読み出した変換ビット列で排他的論理和演算した値をモジュール内検証メモリ部に記憶し、モジュール内情報処理検証演算記述に基づいて、モジュール内検査対象情報処理を実行するとともに、モジュール内検証メモリ部から読み出した変数と、変換ビット列記憶部から読み出した変換ビット列とを排他的論理和演算した値をモジュール内検証メモリ部に上書きし、返却記述に基づいて、モジュール内検証メモリ部に記憶されている変数の値を、上位モジュールに返却値として返却する。
【0185】
なお、モジュール内設定記述に基づき、モジュール内検証メモリ部に記憶される上位モジュールより渡された変数と、返却記述に基づき、上位モジュールに返却される返却値とは、互いにビット反転の関係になるように予め設定されている。
【0186】
この場合、情報処理部4は、モジュール内検証演算記述および返却記述に基づいて、渡された検証用となる変数と互いにビット反転の関係にある返却値を返却する。
【0187】
なお、上記の<CVを用いたモジュールの返却値への応用>の説明においては、下位モジュールを呼び出す場合についてのみ説明したが、これに限られるものではなく、上位モジュールを呼び出す場合、または、階層関係にない任意のモジュールを呼び出す場合にも、同様の処理を実行することが可能である。
【0188】
<CVを内部変数としての利用する方法>
また、検査対象情報処理による情報処理をするプログラムの記述において、2値の値をとる2つの内部変数として、少なくとも0と1とを含む2ビット長以上の第3の固定ビット長である複数の基本ビット列を組み合わせた第4の固定ビット長の変数である2つの変数であって、互いにビット反転の関係にある2つの変数を用いる。
【0189】
<IF文の代わりに算術演算を利用する方法>
また、検査対象情報処理となる情報処理のプログラムの記述において、条件判断の処理がある場合には、条件判断の対象となる変数に基づいた算術演算により条件判断する記述が条件判断記述として予め記述されている。この場合、情報処理部4は、条件判断記述に基づいて、条件判断の対象となる変数に基づいた算術演算により条件判断する。
【0190】
以上図10を用いて説明した一例としての情報処理装置1の構成により、この情報処理装置1は、図4から図9を用いて説明した各処理を実行することが可能である。
【0191】
なお、上記に図1から図9を用いて説明した実施形態の説明においては、基本ビット列として、“01”と“10”などの2ビット固定長の場合について説明したが、基本ビット列は、このような2ビット固定長に限られるものではなく、たとえば、“0101”と“1010”との4ビット固定長であってもよい。または、同様に、基本ビット列として、8ビット固定長などであってもよい。
【0192】
また、本実施形態においては、全ビット反転する攻撃が技術的に難しいことを用いているため、この複数の基本ビット列は、互いにビット反転した2つの基本ビット列であることが望ましい。また、この基本ビット列においては、2ビット表現した場合に、0と1とが順に交互となっている方が望ましい。しかし、たとえば、基本ビット列として、“0110”と“1001”など、少なくとも0と1とを含む2ビット長以上であってもよい。
【0193】
また、上記に図1から図9を用いて説明した実施形態の説明においては、CVとして1バイト固定長(8ビット固定長)の場合について説明したが、これに限られるものではなく、16ビット固定長、32ビット固定長などであってもよい。なお、基本ビット列の固定ビット長、および、CVの固定ビット長は、演算に要する負荷や、演算に要する時間、内部のCVMテーブル3に予め保存することが必要となる情報の情報量、また、固定ビット長に依存するセキュリティの度合いにより、適宜設定されてもよい。
【0194】
なお、図4から図9を用いて説明した各処理においては、プログラム中に記述において、CVMを、CVM(i,j)としてiおよびjの識別情報で指定し、CVMテーブル3から識別情報iおよびjに対応するCVMの値を読み出すようにしていたが、これに限られるものではなく、CVM(i,j)の値そのものを、プログラム中に予め記述するようにしてもよい。
【0195】
なお、上記の説明においては、設定記述、情報処理記述、検証演算記述、および、判定記述が、プログラムの記述に予め記述されているとして説明したが、予め情報処理記述が記述されているプログラムに、設定記述、検証演算記述、および、判定記述を自動的に埋め込む記述埋込装置により、設定記述、情報処理記述、検証演算記述、および、判定記述が、プログラムの記述に記述されるようにしてもよい。
【0196】
なお、上記に説明した実施形態の説明においては、情報処理装置1としてICカードなどについて説明したが、これに限られるものではなく、情報処理装置1はパーソナルコンピュータまたは携帯電話などのコンピュータ装置であってもよい。
【0197】
また、上記に説明した実施形態の説明においては、1つの情報処理装置1におけるモジュール間の入出力にCVを用いる場合について説明したが、これに限られるものではなく、複数の装置間の入出力、例えば、通信機能を有する複数の通信装置間の通信において、その通信の送信および受信としての入出力に、上記実施形態に説明したCVを用いることも可能である。
【0198】
たとえば、図9を用いて説明したモジュール間のグローバル・スタンプ・ラリーにおいて、各モジュールを各通信装置とし、モジュール間のCVの受け渡しを、通信装置間の通信における送受信としてもよい。この場合にも、上記実施形態に説明したCVを用いることにより、モジュールの場合と同様に、各装置における処理の正常性を検査することが可能である。
【0199】
なお、上記の通信としては、有線、無線、接触型、または、非接触型の通信であってもよい。また、このような通信をする通信装置として、たとえば、ICカードとICカード読取装置とであってもよい。
【0200】
なお、情報処理装置1の検証メモリ部2またはCVMテーブル3は、ハードディスク装置や光磁気ディスク装置、フラッシュメモリ等の不揮発性のメモリや、CR−ROM等の読み出しのみが可能な記憶媒体、RAMのような揮発性のメモリ、あるいはこれらの組み合わせにより構成されるものとする。
【0201】
なお、図10における情報処理装置1は専用のハードウェアにより実現されるものであってもよく、また、メモリおよびマイクロプロセッサにより実現させるものであってもよい。
なお、この情報処理装置1は専用のハードウェアにより実現されるものであってもよく、また、この情報処理装置1はメモリおよびCPU(中央情報処理装置)により構成され、情報処理装置1の機能を実現するためのプログラムをメモリにロードして実行することによりその機能を実現させるものであってもよい。
【0202】
また、図10における情報処理装置1の機能を実現するためのプログラムをコンピュータ読み取り可能な記録媒体に記録して、この記録媒体に記録されたプログラムをコンピュータシステムに読み込ませ、実行することにより情報処理装置1の各機能による処理を行ってもよい。なお、ここでいう「コンピュータシステム」とは、OSや周辺機器等のハードウェアを含むものとする。
【0203】
また、「コンピュータシステム」は、WWWシステムを利用している場合であれば、ホームページ提供環境(あるいは表示環境)も含むものとする。
また、「コンピュータ読み取り可能な記録媒体」とは、フレキシブルディスク、光磁気ディスク、ROM、CD−ROM等の可搬媒体、コンピュータシステムに内蔵されるハードディスク等の記憶装置のことをいう。さらに「コンピュータ読み取り可能な記録媒体」とは、インターネット等のネットワークや電話回線等の通信回線を介してプログラムを送信する場合の通信線のように、短時間の間、動的にプログラムを保持するもの、その場合のサーバやクライアントとなるコンピュータシステム内部の揮発性メモリのように、一定時間プログラムを保持しているものも含むものとする。また上記プログラムは、前述した機能の一部を実現するためのものであっても良く、さらに前述した機能をコンピュータシステムにすでに記録されているプログラムとの組み合わせで実現できるものであっても良い。
【0204】
以上、この発明の実施形態を図面を参照して詳述してきたが、具体的な構成はこの実施形態に限られるものではなく、この発明の要旨を逸脱しない範囲の設計等も含まれる。
【図面の簡単な説明】
【0205】
【図1】“01”と“10”との2ビットの組み合わせのみを用いて、1バイトフォーマットを16種類で表現する表現形式を説明する表である。
【図2】図1の表におけるCVに対するCVMを説明する説明図である。
【図3】CV(i)とCV(j)とに対応するCVM(i,j)を示す表である。
【図4】CVを用いた基本的な検証の利用方法を説明する説明図である。
【図5】IF文の代わりに算術演算を利用する方法を説明する説明図である。
【図6】CVを内部変数としての利用する方法を説明する説明図である。
【図7】CVを用いたForループの実行の保証を説明する説明図である。
【図8】CVを用いたモジュールの返却値への応用を説明する説明図である。
【図9】CVを用いたグローバル・スタンプ・ラリーを説明する説明図である。
【図10】本発明の一実施形態による情報処理装置の構成を示すブロック図である。
【符号の説明】
【0206】
1…情報処理装置、2…検証メモリ部、3…CVMテーブル、4…情報処理部、5…CV初期値設定部、6…CV演算部、7…CV判定部、8…異常動作対処部、31…変換前ビット列記憶部、32…変換後ビット列記憶部、33…変換テーブル記憶部、34…ビット列記憶部
【技術分野】
【0001】
本発明は、ICカードなどの情報処理部を搭載した情報処理装置において、コンピュータ等の処理や演算におけるバイパスや内部データの改竄など本来意図しない動作を防止するセキュリティの技術に関する。
【背景技術】
【0002】
ICカードなどの情報処理部を搭載した情報処理装置は、高電圧を印加する、レーザービームを照射する、イオンビームを照射するなどの物理的な攻撃を受けることで、搭載しているソフトウェアが、認証処理のバイパスや内部データの改竄など、本来意図しない動作をする可能性がある。
【0003】
このような、バイパスや内部データの改竄の問題に対して、互いにビット反転した関係を表現する表現形式をもつ変数を用い、並列に演算を行い、各演算結果がそれぞれビット反転した関係になっているか否かを判定することにより、誤動作を検知できる技術が知られている(例えば、特許文献1参照)。
【0004】
また、条件分岐条件を複数または並列に動作させ、それぞれの結果を照合することにより、誤動作を検知する技術が知られている(例えば、特許文献2および特許文献3を参照)。
【特許文献1】国際公開第2005/027403号パンフレット
【特許文献2】特開2002−334317号公報
【特許文献3】特開2005−285133号公報
【発明の開示】
【発明が解決しようとする課題】
【0005】
しかしながら、特許文献1から特許文献3に示す技術においては、演算を並列に行うことや、条件分岐条件を複数または並列に動作させるために、バイパスや内部データの改竄を検知するための演算として追加される追加処理に対しての演算負荷が重くなるという問題、または、この追加処理に対しての演算時間が長くなるという問題があった。
【0006】
本発明は、このような事情に鑑みてなされたもので、その目的は、コンピュータ等の処理や演算におけるバイパスや内部データの改竄を検知するとともに、その演算負荷を減じることを可能とする情報処理装置、情報処理方法、および、情報処理プログラムを提供することにある。
【課題を解決するための手段】
【0007】
この発明は上述した課題を解決するためになされたもので、請求項1に記載の発明は、予め定められたプログラムの記述に基づいて順に情報処理を実行する情報処理部を有する情報処理装置であって、検証用となる変数の値が記憶される検証メモリ部、を有し、少なくとも0と1とを含む2ビット長以上の第1の固定ビット長である複数の基本ビット列を組み合わせた第2の固定ビット長のビット列のデータ型を型Aとし、前記型Aのある値を前記検証メモリ部に記憶させることを示す記述を設定記述とし、検査対象となる情報処理である検査対象情報処理を実行することを示す記述を情報処理記述とし、前記検証メモリ部に記憶されている変数をあるビット列で排他的論理和演算して前記検証メモリ部に上書きすることを示す記述を検証演算記述とし、前記検証メモリ部に記憶されている変数の値に基づいて前記検証演算記述による排他的論理和演算が実行されたか否かを示す記述を判定記述とし、前記情報処理記述およびその後に前記検証演算記述が記述されている記述を情報処理検証演算記述として、前記予め定められたプログラムには、前記設定記述と、複数のn個の前記情報処理検証演算記述と、前記判定記述とが、前記設定記述の後に前記n個の情報処理検証演算記述が順に記述され、かつ、前記n個の情報処理検証演算記述の後に前記判定記述が記述されるように予め記述されており、前記情報処理部は、前記設定記述に基づいて、前記型Aのあるビット列aを前記メモリ部に記憶し、前記n個の情報処理検証演算記述に基づいて、前記検査対象情報処理を実行するとともに、前記検証メモリ部から読み出した前記変数と、前記変数と排他的論理和演算する事で前記型Aのあるビット列となるようなビット列bi(i=1〜n)とを排他的論理和演算して前記検証メモリ部に上書きすることをn回実行し、前記判定記述により、前記検証メモリ部から読み出した変数の値が検証値c=a^b1^b2^・・・・^bn(^は、排他的論理和演算)と一致するか否かを判定する事により、前記複数の前記情報処理検証演算記述に含まれている検証演算記述による排他的論理和演算が順に実行されたか否かを判定する、ことを特徴とする情報処理装置である。
【0008】
また、請求項2に記載の発明は、前記設定記述に基づき前記検証メモリ部に記憶されているビット列aと、前記検証値cは、互いにビット反転の関係にあることを特徴とする請求項1に記載の情報処理装置である。
【0009】
また、請求項3に記載の発明は、予め定められたプログラムの記述に基づいて順に情報処理を実行する情報処理部を有する情報処理装置であって、少なくとも0と1とを含む2ビット長以上の第1の固定ビット長である複数の基本ビット列を組み合わせた第2の固定ビット長のビット列のデータ型を型Aとし、前記型Aのビット列の値であって、値が互いに異なるm個の値を、識別子j(j=0,・・・,m−1)と対応づけて、前記型Aのビット列の配列X(j)として記憶するビット列記憶部と、X(k)と排他的論理和演算することでX(l)となるようなビット列の配列Z(k,l)(k,l=0,・・・,m−1)を変換ビット列として記憶する変換ビット列記憶部と、検証用となる変数の値を記憶する検証メモリ部と、を有し、前記予め定められたプログラムは、前記ビット列記憶部に記憶されている前記型Aのある値を前記検証メモリ部に記憶させる事を示す記述である設定記述と、検査対象となる情報処理である検査対象情報処理を実行することを示す記述である情報処理記述と、前記検証メモリ部に記憶されている変数を前記変換ビット列記憶部より読み出した変換ビット列で排他的論理和演算した値を前記検証メモリ部に上書きすることを示す記述である検証演算記述と、前記検証メモリ部に記憶されている変数の値に基づいて前記検証演算記述による排他的論理和演算が実行されたか否かを示す記述である判定記述とを有し、前記情報処理記述およびその後に前記検証演算記述が記述されている記述を情報処理検証演算記述として、前記設定記述の後に、n個の前記情報処理検証演算記述が順に記述され、かつ、前記n個の情報処理検証演算記述の後に前記判定記述が記述されるように予め記述されており、前記設定記述は、前記ビット列記憶部に記憶されている前記型Aの値であるX(p0)(p0は、0〜m−1の間の任意の値の識別子)を前記検証メモリ部に記憶させるように記述されており、前記n個の情報処理検証演算記述のうちi番目の記述の中の検証演算記述には、前記検証メモリ部に記憶されている変数を、前記変換ビット列記憶部より読み出した変換ビット列であるZ(pi−1,pi)(piは0〜m−1の間の任意の識別子)が示す値で排他的論理和演算し、検証メモリ部に上書きするように予め記述されており、前記判定記述には、前記検証メモリ部に記憶されている変数が、X(p0)^Z(p0,p1)^・・・・^Z(pn−1,pn)(^は排他的論理和演算)の値となるX(pn)(pnは0〜m−1の間の任意の識別子)であって、前記ビット列記憶部から読み出したX(pn)の値と一致するか否かを判断するように予め記述されており、前記情報処理部は、前記設定記述に基づいて、前記ビット列記憶部より読み出した前記型Aのある値を前記検証メモリ部に記憶し、前記情報処理検証演算記述に基づいて、前記検査対象情報処理を実行するとともに、前記検証メモリ部から読み出した前記変数と、前記変換ビット列記憶部から読みだした変換ビット列とを排他的論理和演算した値を前記検証メモリ部に上書きし、前記判定記述に基づいて、前記検証メモリ部から読み出した変数の値が、前記ビット列記憶部から読み出した前記型Aのビット列と一致するか否かを判定することにより、前記検証演算記述による排他的論理和演算が実行されたか否かを判定することを特徴とする情報処理装置である。
【0010】
また、請求項4に記載の発明は、前記設定記述に基づいて検証メモリ部に記憶された前記型Aの値と、前記判定記述に基づいて前記ビット列記憶部より読み出された前記型Aの値とは、互いにビット反転の関係にあることを特徴とする請求項3記載の情報処理装置である。
【0011】
また、請求項5に記載の発明は、前記予め定められたプログラムには、少なくとも前記設定記述と、ループ処理を実行することを示す記述とともに、該記述されているループ処理が実行される場合に、該実行されているループ処理内で前記情報処理検証演算記述を実行する事を示す記述であるループ処理記述と、前記判定記述とが、前記設定記述の後に前記ループ処理記述が記述され、かつ、前記ループ処理記述の後に前記判定記述が記述されるように予め記述されており、前記設定記述には、値0の識別子で対応づけられるX(0)の値を前記検証メモリ部に記憶させるように記述されており、前記ループ処理記述中の検証演算記述には、前記検証メモリ部に記憶されている変数を、前記変換ビット列記憶部より読み出した変換ビット列であるZ(i−1,i)(iはループ内i番目に処理される回数値)が示すビット列の値で排他的論理和演算し、前記検証メモリ部に上書きするように予め記述されており、前記判定記述には、前記検証メモリ部に記憶されている変数が、前記ビット列記憶部から読み出したX(n)(n=1〜mであり、ループ回数)の値と一致するか否かを判断するように予め記述されており、前記情報処理部は、前記設定記述に基づいて、前記ビット列記憶部より読み出した前記型Aのある値を前記検証メモリ部に記憶し、前記情報処理検証演算記述に基づいて、前記検査対象情報処理を実行するとともに、前記検証メモリ部から読み出した前記変数と、前記変換ビット列記憶部から読みだした変換ビット列とを排他的論理和演算した値を前記検証メモリ部に上書きし、前記判定記述に基づいて、前記検証メモリ部から読み出した変数の値が、前記ビット列記憶部から読み出した前記型Aのビット列と一致するか否かを判定することにより、前記検証演算記述による排他的論理和演算が実行されたか否かを判定することを特徴とする請求項3又は請求項4に記載の情報処理装置である。
【0012】
また、請求項6に記載の発明は、前記予め定められたプログラムには、下位モジュールを呼び出し、前記検証メモリ部に記憶されている変数を前記下位モジュールに渡すとともに、前記下位モジュールからの返却値を取得する記述であるモジュール呼び出し記述と、前記モジュール呼び出し記述で呼び出した下位モジュールからの返却値が、前記下位モジュールが記述順通りに実行された場合に返却されるビット列であるか否かを検証することを示す返却値判定記述とが、前記モジュール呼出記述の後に前記返却値判定記述が記述されるように予め記述されており、前記情報処理部は、前記モジュール呼出記述に基づいて下位モジュールを呼出し、前記検証メモリ部に記憶されている変数を前記下位モジュールに渡すとともに、前記下位モジュールからの返却値を取得し、前記返却値判定記述に基づいて、前記モジュール呼出し記述で呼出した下位モジュールからの返却値が、前記下位モジュールが記述順通りに実行された場合に返却されるビット列であるか否かを検証する、ことを特徴とする請求項3から請求項5のいずれかに記載の情報処理装置である。
【0013】
また、請求項7に記載の発明は、前記情報処理装置は、モジュール内検証メモリ部を有し、前記モジュール呼出し記述に基づいて呼出される下位モジュールのプログラムは、自モジュールを呼出した上位モジュールより渡された変数を、前記変換ビット列記憶部より読み出した変換ビット列で排他的論理和演算して前記モジュール内検証メモリ部に記憶する事を示す記述であるモジュール内設定記述と、自モジュール内における検査対象となる情報処理であるモジュール内検査対象情報処理を実行する事を示す記述であるモジュール内情報処理記述と、前記モジュール内検証メモリ部に記憶されている変数を前記変換ビット列記憶部より読み出した変換ビット列で排他的論理和演算した値を前記モジュール内検証メモリ部に上書きする事を示す記述であるモジュール内検証演算記述と、前記モジュール内検証メモリ部に記憶されている変数の値を、前記上位モジュールに返却値として返却することを示す返却記述とを有し、前記モジュール内情報処理記述およびその後に前記モジュール内検証演算記述が記述されている記述をモジュール内情報処理検証演算記述として、前記モジュール内設定記述の後に前記モジュール内情報処理検証演算記述が記述され、かつ、前記モジュール内情報処理検証演算記述の後に返却記述が記述されるように記述されており、前記情報処理部は、前記モジュール内設定記述に基づいて、自モジュールを呼出した上位モジュールより渡された変数を前記変換ビット列記憶部より読み出した変換ビット列で排他的論理和演算した値を前記モジュール内検証メモリ部に記憶し、前記モジュール内情報処理検証演算記述に基づいて、前記モジュール内検査対象情報処理を実行するとともに、前記モジュール内検証メモリ部から読み出した前記変数と、前記変換ビット列記憶部から読み出した変換ビット列とを排他的論理和演算した値を前記モジュール内検証メモリ部に上書きし、前記返却記述に基づいて、前記モジュール内検証メモリ部に記憶されている変数の値を、前記上位モジュールに返却値として返却する、ことを特徴とする請求項6に記載の情報処理装置である。
【0014】
また、請求項8に記載の発明は、前記モジュール内設定記述に基づき、前記モジュール内検証メモリ部に記憶される前記上位モジュールより渡された変数と、前記返却記述に基づき、前記上位モジュールに返却される返却値とは、互いにビット反転の関係になるように予め設定されている、ことを特徴とする請求項7記載の情報処理装置である。
【0015】
また、請求項9に記載の発明は、前記検査対象情報処理による情報処理をするプログラムの記述において、2値の値をとる2つの内部変数として、少なくとも0と1とを含む2ビット長以上の第3の固定ビット長である複数の基本ビット列を組み合わせた第4の固定ビット長の変数である2つの変数であって、互いにビット反転の関係にある2つの変数を用いる、ことを特徴とする請求項3から請求項8のいずれかに記載の情報処理装置である。
【0016】
また、請求項10に記載の発明は、予め定められたプログラムの記述に基づいて順に情報処理を実行する情報処理部を有する情報処理装置であって、少なくとも0と1とを含む2ビット長以上の第1の固定ビット長である複数の基本ビット列を組み合わせた第2の固定ビット長のビット列のデータ型を型Aとし、前記型Aのある値を変換前ビット列として記憶する変換前ビット列記憶部と、前記型Aのある値であって、前記変換前ビット列とは値が異なるある値を変換後ビット列として記憶する変換後ビット列記憶部と、前記変換前ビット列と排他的論理和演算することにより前記変換後ビット列に変換させる変換ビット列を記憶する変換ビット列記憶部と、検証用となる変数の値を記憶する検証メモリ部と、を有し、前記予め定められたプログラムには少なくとも、前記変換前ビット列記憶部に記憶されている変換前ビット列を読み出し前記検証メモリ部に記憶させる事を示す記述である設定記述と、検査対象となる情報処理である検査対象情報処理を実行することを示す記述である情報処理記述と、前記検証メモリ部に記憶されている変数を前記変換ビット列記憶部より読み出した変換ビット列で排他的論理和演算した値を前記検証メモリ部に上書きすることを示す記述である検証演算記述と、前記検証メモリ部に記憶されている変数の値に基づいて前記検証演算記述による排他的論理和演算が実行されたか否かを示す記述である判定記述とが、前記設定記述の後に前記情報処理記述が記述され、前記情報処理記述の後に検証演算記述が記述され、かつ、前記検証処理記述の後に前記判定記述が記述されるように予め記述されており、前記情報処理部は、前記設定記述に基づいて、変換前ビット列を前記変換前ビット列記憶部から読み出して前記検証メモリ部に記憶し、前記情報処理記述に基づいて、前記検査対象情報処理を実行し、前記検証演算記述に基づいて、前記検証メモリから読み出した変数と、前記変換ビット列記憶部から読み出した変換ビット列とを排他的論理和演算して前記検証メモリ部に上書きし、前記判定記述により、前記検証メモリ部から読み出した変数の値が、前記変換後ビット列記憶部より読み出した前記変換後ビット列と一致するか否かを判定する事により、前記検証演算記述による排他的論理和演算が実行されたか否かを判定することを特徴とする情報処理装置である。
【0017】
また、請求項11に記載の発明は、前記設定記述に基づいて検証メモリ部に記憶された前記変換前ビット列と、前記判定記述に基づいて前記変換後ビット列記憶部より読み出された前記変換後ビット列とは、互いにビット反転の関係にあることを特徴とする請求項10記載の情報処理装置である。
【0018】
また、請求項12に記載の発明は、予め定められたプログラムの記述に基づいて順に情報処理を実行する情報処理部と、少なくとも0と1とを含む2ビット長以上の第1の固定ビット長である複数の基本ビット列を組み合わせた第2の固定ビット長のビット列のデータ型を型Aとして、前記型Aのビット列の値であって、値が互いに異なるm個の値を、識別子j(j=0,・・・,m−1)と対応づけて、前記型Aのビット列の配列X(j)として記憶するビット列記憶部と、X(k)と排他的論理和演算することでX(l)となるようなビット列の配列Z(k,l)(k,l=0,・・・,m−1)を変換ビット列として記憶する変換ビット列記憶部と、検証用となる変数の値を記憶する検証メモリ部と、を有し、前記予め定められたプログラムは、前記ビット列記憶部に記憶されている前記型Aのある値を前記検証メモリ部に記憶させる事を示す記述である設定記述と、検査対象となる情報処理である検査対象情報処理を実行することを示す記述である情報処理記述と、前記検証メモリ部に記憶されている変数を前記変換ビット列記憶部より読み出した変換ビット列で排他的論理和演算した値を前記検証メモリ部に上書きすることを示す記述である検証演算記述と、前記検証メモリ部に記憶されている変数の値に基づいて前記検証演算記述による排他的論理和演算が実行されたか否かを示す記述である判定記述とを有し、前記情報処理記述およびその後に前記検証演算記述が記述されている記述を情報処理検証演算記述として、前記設定記述の後に、n個の前記情報処理検証演算記述が順に記述され、かつ、前記n個の情報処理検証演算記述の後に前記判定記述が記述されるように予め記述されており、前記設定記述は、前記ビット列記憶部に記憶されている前記型Aの値であるX(p0)(p0は、0〜m−1の間の任意の値の識別子)を前記検証メモリ部に記憶させるように記述されており、前記n個の情報処理検証演算記述のうちi番目の記述の中の検証演算記述には、前記検証メモリ部に記憶されている変数を、前記変換ビット列記憶部より読み出した変換ビット列であるZ(pi−1,pi)(piは0〜m−1の間の任意の識別子)が示す値で排他的論理和演算し、検証メモリ部に上書きするように予め記述されており、前記判定記述には、前記検証メモリ部に記憶されている変数が、X(p0)^Z(p0,p1)^・・・・^Z(pn−1,pn)(^は排他的論理和演算)の値となるX(pn)(pnは0〜m−1の間の任意の識別子)であって、前記ビット列記憶部から読み出したX(pn)の値と一致するか否かを判断するように予め記述されている情報処理装置において用いられる情報処理であって、前記情報処理部は、前記設定記述に基づいて、前記ビット列記憶部より読み出した前記型Aのある値を前記検証メモリ部に記憶し、前記情報処理検証演算記述に基づいて、前記検査対象情報処理を実行するとともに、前記検証メモリ部から読み出した前記変数と、前記変換ビット列記憶部から読みだした変換ビット列とを排他的論理和演算した値を前記検証メモリ部に上書きし、前記判定記述に基づいて、前記検証メモリ部から読み出した変数の値が、前記ビット列記憶部から読み出した前記型Aのビット列と一致するか否かを判定することにより、前記検証演算記述による排他的論理和演算が実行されたか否かを判定する、ことを特徴とする情報処理方法である。
【0019】
また、請求項13に記載の発明は、予め定められたプログラムの記述に基づいて順に情報処理を実行する情報処理部と、少なくとも0と1とを含む2ビット長以上の第1の固定ビット長である複数の基本ビット列を組み合わせた第2の固定ビット長のビット列のデータ型を型Aとして、前記型Aのビット列の値であって、値が互いに異なるm個の値を、識別子j(j=0,・・・,m−1)と対応づけて、前記型Aのビット列の配列X(j)として記憶するビット列記憶部と、X(k)と排他的論理和演算することでX(l)となるようなビット列の配列Z(k,l)(k,l=0,・・・,m−1)を変換ビット列として記憶する変換ビット列記憶部と、検証用となる変数の値を記憶する検証メモリ部と、を有し、前記予め定められたプログラムは、前記ビット列記憶部に記憶されている前記型Aのある値を前記検証メモリ部に記憶させる事を示す記述である設定記述と、検査対象となる情報処理である検査対象情報処理を実行することを示す記述である情報処理記述と、前記検証メモリ部に記憶されている変数を前記変換ビット列記憶部より読み出した変換ビット列で排他的論理和演算した値を前記検証メモリ部に上書きすることを示す記述である検証演算記述と、前記検証メモリ部に記憶されている変数の値に基づいて前記検証演算記述による排他的論理和演算が実行されたか否かを示す記述である判定記述とを有し、前記情報処理記述およびその後に前記検証演算記述が記述されている記述を情報処理検証演算記述として、前記設定記述の後に、n個の前記情報処理検証演算記述が順に記述され、かつ、前記n個の情報処理検証演算記述の後に前記判定記述が記述されるように予め記述されており、前記設定記述は、前記ビット列記憶部に記憶されている前記型Aの値であるX(p0)(p0は、0〜m−1の間の任意の値の識別子)を前記検証メモリ部に記憶させるように記述されており、前記n個の情報処理検証演算記述のうちi番目の記述の中の検証演算記述には、前記検証メモリ部に記憶されている変数を、前記変換ビット列記憶部より読み出した変換ビット列であるZ(pi−1,pi)(piは0〜m−1の間の任意の識別子)が示す値で排他的論理和演算し、検証メモリ部に上書きするように予め記述されており、前記判定記述には、前記検証メモリ部に記憶されている変数が、X(p0)^Z(p0,p1)^・・・・^Z(pn−1,pn)(^は排他的論理和演算)の値となるX(pn)(pnは0〜m−1の間の任意の識別子)であって、前記ビット列記憶部から読み出したX(pn)の値と一致するか否かを判断するように予め記述されている情報処理装置としてのコンピュータに、前記設定記述に基づいて、前記ビット列記憶部より読み出した前記型Aのある値を前記検証メモリ部に記憶する手順と、前記情報処理検証演算記述に基づいて、前記検査対象情報処理を実行するとともに、前記検証メモリ部から読み出した前記変数と、前記変換ビット列記憶部から読みだした変換ビット列とを排他的論理和演算した値を前記検証メモリ部に上書きする手順と、前記判定記述に基づいて、前記検証メモリ部から読み出した変数の値が、前記ビット列記憶部から読み出した前記型Aのビット列と一致するか否かを判定することにより、前記検証演算記述による排他的論理和演算が実行されたか否かを判定する手順とを実行させるための情報処理プログラムである。
【発明の効果】
【0020】
この発明によれば、情報処理装置が、予め定められたプログラムの記述に基づいて順に情報処理を実行する情報処理部と、検証用となる変数の値が記憶される検証メモリ部とを有し、少なくとも0と1とを含む2ビット長以上の複数の基本ビット列を組み合わせた固定ビット長のビット列をX(i)として、ビット列X(i)と排他的論理和演算することによりビット列X(j)に変換させる変換ビット列を用いて、情報処理の実行前にビット列X(i)を検証メモリ部に記憶し、情報処理の実行後に検証メモリ部に記憶されているビット列と変換ビット列と排他的論理和演算して検証メモリ部に上書きし、検証メモリ部から読み出した変数の値に基いて検査対象となる情報処理が実行されたか否かを判定することにより、コンピュータ等の処理や演算におけるバイパスや内部データの改竄を検知するとともに、その演算負荷を減じることが可能となる効果を奏する。
【発明を実施するための最良の形態】
【0021】
<原理>
まず、本実施形態において用いる原理について説明する。本実施形態においては、全ビット反転するという攻撃が、非常に困難であることに注目し、次のような処理を行う。この処理により、処理プログラムに対してのバイパスや改竄の検知が可能となる。
【0022】
・CV(Complex Value)を、予め準備しておく。このCVとは、“01”と“10”とを組み合わせた、1バイト(byte)長のビット列の全ての組み合わせである。このCVについては、後述する。
・CV(i)をXOR演算(排他的論理和演算)した場合に、CV(j)となる値CVMを、CV(i)とCV(j)との全ての組み合わせに対して予め算出して準備し、変換テーブルに記憶しておく。ここで、iとjとは、上記16通りのCVの内、いずれか1つのCVを示すための識別情報である。
・処理プログラムの間(途中)に、CV(i)を、CV(j)に変換するプログラムを組み込む。
・処理プログラムの間(途中)で変換されたCV(j)の値と、予め算出されるはずのCV(j)の値とが一致するか否かを判定してチェックすることにより、バイパスや改竄を検知する。
【0023】
<原理詳細>
以下、図面を参照して、本発明の実施の形態について説明する。
まず、図1に示すように、“01”と“10”との2ビット固定長である基本ビット列を組み合わせた1バイトフォーマットのデータ(8ビット固定長のデータ)を、CVとする。この場合、基本ビット列が2ビット固定長であり、CVが8ビット固定長であるため、CVは16種類のデータとなる。なお、ここでは、16種類の組み合わせを有するCVについて、それぞれのCVを識別するために、識別情報i(ここで、iは0から15の整数)を用いてCV(i)とする。
【0024】
なお、ここでは、識別情報iとCV(i)との関係において、たとえば、CV(0)とCV(8)とが互いにビット反転の関係にあり、CV(1)とCV(9)とが互いにビット反転の関係にあり、CV(2)とCV(10)とが互いにビット反転の関係にあり、CV(3)とCV(11)とが互いにビット反転の関係にあり、CV(4)とCV(12)とが互いにビット反転の関係にあり、CV(5)とCV(13)とが互いにビット反転の関係にあり、CV(6)とCV(14)とが互いにビット反転の関係にあり、かつ、CV(7)とCV(15)とが互いにビット反転の関係にあるようにする。
【0025】
すなわち、CV(k)とCV(k+8)とが互いにビット反転の関係にあるような順序とする(ここで、kは0から7の整数)。このような識別情報iとCV(i)との関係としておくことにより、後述するように、判定段階において、検査対象となる情報処理前のCVと検査対象となる情報処理後のCVとで、CVの値が互いにビット反転の関係になるように設定しやすくなる。
【0026】
次に、入力値をCV(i)として、排他的論理和演算(XOR)した場合に、出力値がCV(j)となるようなCVMの値を算出する。ここで、iおよびjは、それぞれ、0から15の任意の整数である。なお、以降の説明においては、CVまたはCVM内で用いられるiおよびjは、それぞれ、0から15の任意の整数として説明する。
【0027】
たとえば、図2(a)示すように、「CV(5)(+)CVM=CV(14)」の場合、すなわち、「01100110(+)CVM=10010110」の場合には、この式を満たすCVMの値は、「CVM=11110000(=F0h)」となる。なお、記号「(+)」または「^」は、排他的論理和演算を示す。また、記号「h」は、16進数であることを示す。
【0028】
また、図2(a)と同様に、図2(b)に示すように、「CV(11)(+)CVM=CV(7)」の場合、すなわち、「10100101(+)CVM=01101010」の場合には、この式を満たすCVMの値は、「CVM=11001111(=CFh)」となる。
【0029】
上記図2(a)および図2(b)に示す演算から、CV(i)とCV(j)とを基本ビット列を単位として順に対比してみた場合、すなわち、2ビットずつを順に対比してみた場合、CV(i)の値がビット反転してCV(j)になる箇所のCVMの値が“11”であり、それ以外が“00”である。すなわち、CV(i)とCV(j)との値で、CV(i)の“01”がCV(j)の“10”となる箇所、または、CV(i)の“10”がCV(j)の“01”となる箇所のCVMの値が“11”となり、それ以外のCVMの値が“00”となる。また、CVMは、CV(i)およびCV(j)と同じ8ビット固定長の変数である。
【0030】
以上のようにして、全てのCV(i)とCV(j)との組み合わせに対して、CVMを全て算出する。これにより、図3に示すような、列をCV(i)とし、行をCV(j)として、CV(i)とCV(j)とにCVMが関連付けられたテーブルを算出することができる。
【0031】
なお、本実施形態における情報処理装置は、このテーブルを変換テーブルとして予め内部の記憶部(後述するCVMテーブル3)に記憶しておき、この変換テーブルの値を参照しつつ、以降に説明する処理を実行する。なお、以降、CV(i)とCV(j)とに関連付けられているCVMをCVM(i,j)として表現する。つまり、CVMは、CVM(0,0)、・・・・、CVM(15,15)として表現される。
【0032】
ここで、図3のテーブルにおいては、列方向において、識別情報iと変換前のCVであるCV(i)とが関連付けて記憶されており、行方向において、識別情報jと変換後のCVであるCV(j)とが関連付けて記憶されているとともに、さらに、識別情報iと識別情報jとに関連付けてCVM(i,j)が変換テーブルとして記憶されている。
【0033】
なお、この図3において、列方向のCV(i)と行方向のCV(j)とにおいて、16種類のCV順序は、互いに同じとしてある。すなわち、列方向のCV(0)と行方向のCV(0)とは同じ値であり、列方向のCV(1)と行方向のCV(1)とは同じ値であり、・・・・・、列方向のCV(15)と行方向のCV(15)とは同じである。
【0034】
<CVを用いた基本的な検証の利用方法>
次に、図4を用いて、上記に説明したCVを用いた一例としての、改竄などの検証方法について説明する。
【0035】
まず、図4(a)に「通常版」として示すように、プログラムに、01行目に処理Aが記述されており、02行目に処理Bが記述されており、03行目に処理Cが記述されている場合について説明する。すなわち、処理A、処理B、処理Cが順に記述されている場合の処理について説明する。
【0036】
この処理が実行される場合、記述されている順に、まず、処理Aが実行され、処理Aの次に処理Bが実行され、処理Bの次に処理Cが実行される。しかしながら、この場合、処理Aと処理Bと処理Cとのうちいずれかの処理、または、全ての処理について、バイパスされた場合であっても、そのバイパスされたことを検知することが出来ない。
【0037】
これに対して、図4(b)に「セキュア版」として示すように、プログラムの01行目に、「CurrentCVを初期値CV(0)=55hに設定する」ことを示す記述が記述されている。
【0038】
また、02行目に、「処理Aを実行する」ことを示す記述が記述されており、03行目に、「CurrentCVを、CV(0)=55hからCV(3)=5Ahに変えるように、CurrentCVをCVM(0,3)とXOR演算してCurrentCVに上書きする」ことを示す記述が記述されている。
【0039】
また、04行目に、「処理Bを実行する」ことを示す記述が記述されており、05行目に、「CurrentCVを、CV(3)=5AhからCV(12)=9Ahに変えるように、CurrentCVをCVM(3,12)とXOR演算してCurrentCVに上書きする」ことを示す記述が記述されている。
【0040】
また、06行目に、「処理Cを実行する」ことを示す記述が記述されており、07行目に、「CurrentCVを、CV(12)=9AhからCV(8)=AAhに変えるように、CurrentCVをCVM(12,8)とXOR演算してCurrentCVに上書きする」ことを示す記述が記述されている。
【0041】
また、08行目に、「CurrentCVがCV(8)=AAhと一致する否かを判定し、判定した結果が一致しない場合には、異常と判定して停止する」ことを示す記述が記述されている。
【0042】
この、図4(b)に「セキュア版」として示される処理が実行される場合、まず、01行目の処理の実行により、CurrentCVにCV(0)=55hの値が書き込まれる。これにより、物理的なメモリやレジスタなどの記憶部であるCurrentCVに、CV(0)=55hの値が書き込まれる。
【0043】
次に、01行目の処理の実行により、処理Aが実行される。次に、02行目の処理の実行により、CurrentCVとCVM(0,3)とがXOR演算されてCurrentCVに上書きされることにより、CurrentCVの値が、CV(0)=55hからCV(3)=5Ahに更新される。
【0044】
次に、04行目の処理の実行により、処理Bが実行される。次に、05行目の処理の実行により、CurrentCVとCVM(3,12)とがXOR演算されてCurrentCVに上書きされることにより、CurrentCVの値が、CV(3)=5AhからCV(12)=C0hに更新される。
【0045】
次に、06行目の処理の実行により、処理Cが実行される。次に、07行目の処理の実行により、CurrentCVとCVM(12,8)とがXOR演算されてCurrentCVに上書きされることにより、CurrentCVの値が、CV(12)=C0hからCV(8)=AAhに更新される。
【0046】
次に、08行目の処理の実行により、CurrentCVの値がCV(8)=AAhと一致する否かを判定する。この判定した結果が一致することにより、上記の処理が順に正常になされたと判定し、一致しない場合には、異常と判定して停止する。
【0047】
このように、CurrentCVの値が、1行目の初期値CV(0)から、3行目のCVM(0,3)、5行目のCVM(3,12)、7行目のCVM(12,8)により、CV(3)、CV(12)、CV(8)と順に更新され、08行目の処理の実行により、CurrentCVの値がCV(8)と一致する否かを判定することにより、CurrentCVの値を更新する処理が順に実行されたか否かを検証することができる。
【0048】
ここで、たとえば、3行目のCVM(0,3)の処理のみがバイパスされた場合には、CVは、1行目の初期値CV(0)から、5行目のCVM(3,12)により更新され、7行目のCVM(12,8)により更新されるが、この場合には、3行目のCVM(0,3)の処理がバイパスされているために、7行目のCVM(12,8)により更新されたCVの値はCV(8)とならない。同様に、1行目、3行目、5行目、7行目の処理、すなわち、CVの値を更新する処理のうち、1つでも処理がバイパスされた場合には、CVの値はCV(8)とならない。そのため、CVの値を更新する処理が、全て正常に実行されたか否かを検証することができる。
【0049】
また、2行目の処理A、4行目の処理B、および、6行目の処理Cは、それぞれ、CurrentCVの値が順に更新される処理に挟まれて実行されている。すなわち、1行目の初期値CV(0)から、3行目のCVM(0,3)、5行目のCVM(3,12)、7行目のCVM(12,8)により、CV(3)、CV(12)、CV(8)とCurrentCVの値が順に更新される処理に、2行目の処理A、4行目の処理B、および、6行目の処理Cは挟まれている。
【0050】
そのため、08行目の処理の実行により、CurrentCVの値がCV(8)と一致する否かを判定することにより、CurrentCVの値を更新する処理が順に実行されたか否かを検証することができるとともに、処理A、処理B、処理Cが正しい順序で実行されたか否かを検証することができる。
【0051】
以上のように、処理A、B、Cが正しい順序で全て実行された場合、CurrentCVの値が順に更新され、CurrentCVの値は最後にCV(8)=AAhとなる。これを、処理の最後に検査することによって、動作の正しさを検証することが可能である。つまり、バイパスなどが行われた場合の検知が可能になる。
【0052】
なお、CVM(i,j)において、1回目のCVM(i、j)におけるiの値は、初期設定で設定されたCV(i)の値と同じとなるようにする。この図4(b)では、03行目のCVM(0,3)におけるiの値0と、01行目のCV(0)におけるiの値0とを同じ値とする。
【0053】
また、2回目以降のCVM(i、j)におけるiの値は、1つ前のCVM(i、j)におけるjの値と同じとなるようにする。この図4(b)では、03行目のCVM(0,3)におけるjの値3と、05行目のCVM(3、12)におけるiの値3とを同じ値とする。また、05行目のCVM(3,12)におけるjの値12と、07行目のCVM(12、8)におけるiの値12とを同じ値とする。
【0054】
また、最後のCVM(i、j)におけるjの値は、比較する場合に比較対象とするCV(i)におけるiの値と同じとする。この図4(b)では、07行目のCVM(12,8)におけるjの値8と、05行目のCV(8)におけるiの値8とを同じ値とする
【0055】
このようにCVM(i、j)のiとjとの値を設定することにより、CVの値が、CVM(i、j)と排他的論理和演算され、すなわち、図3のテーブルに基いて順に更新されるため、CVの更新処理が順に実行されたことを検証することが可能である。
【0056】
また、初期設定で設定されたCV(i)と、比較する場合に比較対象とするCV(i)とが、互いにビット反転になるような関係になるようにCVM(i、j)を設定しておくことが望ましい。すなわち、初期設定で設定されたCVをCV(i)として、比較する場合に比較対象とするCVがCV(i+8)となるように、CVM(i、j)の順序を設定しておくことが望ましい。
【0057】
これにより、判定の演算方法として、初期設定で設定されたCVと比較対象とするCVとが、互いにビット反転の関係にあるか否かを判定するだけでよく、判定の精度が向上する効果を奏する。
【0058】
ところで、上記に説明した基本的な適用方法のみでは、次の2点の脆弱性の可能性がある。
【0059】
<脆弱性1>
仮に演算途中で、CurrentCVの値を「ビット反転」させるような改竄が出来るような場合には、CurrentCVの値を別の値、つまり、CVと別のCVに変えることができてしまう。しかしながら、現在のハードウェア製品において、物理攻撃によるビット改竄は、連続した隣同士のビットをまとめて0にしたり、1にしたりする事は可能であるが、複数のビットに対して、ビット反転させるような改竄はきわめて難しい(現在は不可能である)事が分かっている。ここで、CVは、上記に説明したように、“01”および“10”を組み合わせた変数であるため、ビット反転攻撃には耐性がある。そのため、このようなビット反転の攻撃に対しては、CVを用いることにより、対抗できる。
【0060】
<脆弱性2>
上記「セキュア版」プログラムの処理A(図4(b)の行番号02の処理)のみ、処理B(図4(b)の行番号04の処理)のみ、または、処理C(図4(b)の行番号06の処理)だけをうまくバイパス攻撃できてしまうと、図4(b)の行番号01、03、05、07、08のCurrentCVの計算を正常に処理されてしまうため、このようなバイパス攻撃を検知することができない。
【0061】
このような問題について、以降に示す手段を組み合わせることにより解決することが可能である。
【0062】
<IF文の代わりに算術演算を利用する方法>
次に、図5を用いて、IF文の代わりに算術演算を利用する方法について説明する。IF文として、通常、条件判断部、正常系処理部、および、例外系処理部に分かれたプログラムが記述される。バイパス攻撃によって、条件判断部(と、正常系処理部)がバイパスされてしまうと、プログラムカウンタが働いてしまい、条件判断部による条件判断が実行されずに、正常系処理部もしくは例外系処理部が動作させられてしまう可能性がある(図5(a)参照)。
【0063】
ここでは、図5(a)に示すように、例えば、認証データtの値が0であるか否かにより、認証が成功したか否かを判定する場合について説明する。
【0064】
この場合、認証データtの値が0であるか否かを判定し(1行目参照)、認証データtの値が0である場合には、認証の成功または失敗を示す変数sの値を0とし(2行目参照)、認証データtの値が0でない場合には、認証の成功または失敗を示す変数sの値を1とする(3行目および4行目参照)。
これにより、認証が正しい場合、すなわち認証データtの値が0の場合には、認証の成功または失敗を示す変数sの値が0となる。また、それ以外、すなわち、認証が正しくなく、認証データtの値が0でない場合には、認証の成功または失敗を示す変数sの値が1となる。
【0065】
しかし、図5(a)に示す方法で認証データtの値により認証の成功または失敗を示す変数sの値を決定する場合、たとえば、1行目、3行目、4行目などの処理がスキップされ、2行目だけが実行された場合には、認証データtの値に関係なく、認証の成功または失敗を示す変数sの値が0となってしまう。
【0066】
たとえば、認証の成功または失敗を示す変数sの値が1として初期化されており、認証が正しい場合、すなわち認証データtの値が0の場合のみ、認証の成功または失敗を示す変数sの値が0となるものとする。ここで、図5(a)に示す認証方法で、認証データtの値により認証の成功または失敗を示す変数sの値を決定した場合、1行目、3行目、4行目などの処理がスキップされ、2行目だけが実行された場合には、認証データtの値に関係なく、認証の成功または失敗を示す変数sの値が1から0に更新されてしまう。このように、図5(a)に示す判定方法には、バイパス攻撃に対して脆弱性があることになる。
【0067】
この解決手段として、条件判断部に用いられるデータを、算術演算(ここでは、論理演算)だけで算術して変換することで、IF文をなくし、バイパス攻撃に対抗できるようにすることが可能である。図5(a)を用いて説明した判定方法に対して、算術演算を用いた一例としての解決手段の例を、図5(b)に示す。
【0068】
この図5(b)に示されるように、認証の成功または失敗を示す変数sの値を、認証データtの値を用いた計算式で算出する。ここでは、認証データtの値と、f0hとを排他的論理和演算することにより、認証の成功または失敗を示す変数sの値を算出する。
【0069】
この場合も、図5(a)に示される方法と同様に、認証が正しい場合、すなわち認証データtの値が0の場合には、認証の成功または失敗を示す変数sの値が0となり、それ以外、すなわち、認証が正しくなく、認証データtの値が0でない場合には、認証の成功または失敗を示す変数sの値が1となる。
【0070】
この処理は、処理が1行となっているため、この1行の処理が飛ばされた場合には、認証の成功または失敗を示す変数sの値が変更されない。
【0071】
そのため、たとえば、認証の成功または失敗を示す変数sの値が1として初期化されている場合、図5(b)の1行の処理が実行されない場合には、認証の成功または失敗を示す変数sの値が1から変更されることはない。認証の成功または失敗を示す変数sの値が1から0となるのは、図5(b)の1行の処理が実行され、かつ、認証が正しい場合のみ、すなわち認証データtの値が0の場合のみである。このように、図5(b)に示す判定方法には、バイパス攻撃に対して耐性があることになる。
【0072】
<CVを内部変数としての利用する方法>
また、内部変数の値は、演算処理部にRAM(Random Access Memory)などのメモリ(記憶装置)上に展開される。しかしながら、メモリ上に展開される場合に、メモリ周辺を電気的にオール0やオール1にし(全てのデータ端子などをHとなる電位、または、Lとなる電位にし)、メモリから読み出す場合またはメモリに書き込む場合のデータの値を電気的(物理的)に変えてしまうことで、ICカードなどの情報処理装置に対して、誤動作を起こさせる可能性がある。
【0073】
例えば、ICカードなどにおいて、認証処理前と後とを0または1の値である1ビットで示す認証フラグに対して、この認証フラグの値を1に改竄することにより、不正アクセスが容易にできる可能性がある(図6(a)参照)。
【0074】
たとえば、図6(a)に示すように、まず、認証フラグauthflagの値を、認証処理前を0とし、認証処理後を1として予め定義しておく。この図6(a)に示す認証方法では、入力されたパスワード(authData)と格納されているパスワード(keyData)とが一致するか否かを判定し(1行目参照)、一致する場合には、認証フラグauthflagの値をTrue(=1)とし(2行目参照)、一致しない場合には、認証フラグauthflagの値をFalse(=0)とする(3行目および4行目参照)。
【0075】
しかしながら、認証フラグauthflagの値は、0または1であるため、上記に説明したメモリ周辺をオール0やオール1にする攻撃に対して、すなわち電気的な攻撃に対しては、脆弱性を有している。
【0076】
この解決手段として、図6(b)に示すように、認証フラグの値にAAhや55hを用いることで、改竄を困難にすることが可能である。また、この図6(b)では、上記の<IF文の代わりに算術演算を利用する方法>で説明した方法を組み合わせた認証処理方法について説明する。なお、ここでAAhや55hを用いる理由は、55hは二進数で表記すると01010101であり、AAhは二進数で表記すると10101010であり、この2つの値は0と1とが順に交互になっており、かつ、全てのビットが互いにビット反転している。そのため、電気的な改ざんに対して、55hからAAhへの改竄、また、逆に、AAhから55hへの改竄が難しいためである。
【0077】
図6(b)の説明に戻り、図6(b)に示すように、ここでは、認証フラグauthflagの値を、認証処理前を55hとし、認証処理後をAAhとして予め定義しておく。なお、この55hおよびAAhは、図1を用いて説明したCVの値でもあり、55h=CV(0)であり、AAh=CV(8)である。
【0078】
この図6(b)では、入力されたパスワード(authData)と格納されているパスワード(keyData)とが、それぞれ8個ずつあり、それぞれを順に認証する場合について説明する。まず、仮変数tmpの値をAAhに初期化する(1行目参照)。次に、ループ処理により、3行目から8行目までの処理を、ループ変数iの値が0から7まで1つずつ増大させながら8回繰り返す(2行目と9行目とを参照)。
【0079】
次に、このループ処理において、1回目のループ処理においては、ループ変数iの値が0であるため、入力されたパスワードの1つ目(authData[0])と格納されているパスワードの1つ目(keyData[0])との排他的論理和演算をし、この結果を変数cmpに代入する(3行目参照)。この変数cmpの値は、入力されたパスワードの1つ目(authData[0])と格納されているパスワードの1つ目(keyData[0])とが一致する場合には0となり、一致しない場合には0以外となる。
【0080】
次に、変数cmpの値が1であるか否かを判定し(4行目参照)、変数cmpの値が0以外である場合には、仮変数tmpの値を55hに変更し(5行目参照)、ループ処理を終了する(6行目参照)。
【0081】
一方、変数cmpの値が0である場合には、仮変数tmpの値を、仮変数tmpの値と変数cmpの値とを排他的論理和演算した値に変更する(8行目参照)。なお、この仮変数tmpの値を、仮変数tmpの値と変数cmpの値とを排他的論理和演算した値に変更する場合、変数cmpの値は0であるので、仮変数tmpの値はAAhが維持される。次に、2回目のループ処理が1回目のループ処理と同様に実行される。
【0082】
以上より、図6(b)に示す認証方法では、入力されたパスワード(authData)と格納されているパスワード(keyData)とが8個全て一致している場合には、仮変数tmpの値はAAhに維持され、1つでも一致しない場合には、仮変数tmpの値は55hに変更される。
【0083】
以上、図6(b)を用いて説明した認証方法のように、認証フラグauthflagの値として、0と1とが順に交互になっており、かつ、全てのビットが互いにビット反転している2つの変数、たとえば、55hとAAhとを用いることにより、55hからAAhへの改竄、また、逆に、AAhから55hへの改竄が難しいため、認証フラグauthflagの値の改竄が困難となる効果を奏するとともに、上記に説明した電気的な改ざんに対して、耐性を有する効果を奏する。
【0084】
<CVを用いたForループの実行の保証>
次に、図7を用いて、CVを用いたForループの実行の保証について説明する。なお、ここではループ処理としてForループについて説明するが、Whileループなど、他のループについても同様である。
【0085】
<ループ処理:通常版>
まず、図7(a)に示すようなForループにおいては、Forループの実行中にバイパスされてしまい、しかるべき回数の処理が実行されないような誤動作が生じる可能性がある。
【0086】
たとえば、図7(a)では、8回のループ処理により(1行目と3行目参照)、処理Aを8回実行している(2行目参照)。しかしながら、1行目と3行目との処理、すなわち、8回のループ処理がバイパスされた場合には、処理Aが1回しか実行されなくなる。また、2行目のみの処理がバイパスされた場合には、1行目と3行目とによるループ処理は8回成されるものの、処理Aは1度も実行されないことになる。
【0087】
<ループ処理:セキュア版1>
この解決手段として、図7(b)に「セキュア版1」として示すように、ループ中にCVの演算処理を行い、ループ処理の終了後に、CVの値が、演算処理が実行された後に本来あるべきCVの値であるか否かをチェックすることで、Forループが実行されたことを保証することが可能である。
【0088】
たとえば、図7(b)に示すように、まず、currentCVの値をCV(0)に初期設定する(1行目参照)。次に、ループ処理により、3行目と4行目との処理を、ループ変数iの値を0から7に順に1つずつ増大させながら8回繰り返す(2行目と5行目とを参照)。
【0089】
1回目のループ処理、すわなち、ループ変数iの値が0の場合には、3行目の処理では、処理Aが実行される。次に、4行目の処理では、currentCVの値が、currentCVの値とCVM(i,i+1)とを排他的論理和演算した値、すなわち、CV(0)とCVM(0,1)とを排他的論理和演算した値に更新される。この4行目の処理において、CVM(0,1)により、currentCVの値が、CV(0)からCV(1)に更新される。
【0090】
2回目のループ処理、すわなち、ループ変数iの値が1の場合には、3行目の処理では、処理Aが実行される。次に、4行目の処理では、currentCVの値が、currentCVの値とCVM(1,2)とを排他的論理和演算した値に更新される。この4行目の処理において、CVM(1,2)により、currentCVの値がCV(1)からCV(2)に更新される。
【0091】
同様に、3回目のループ処理では、CVM(2,3)により、currentCVの値がCV(2)からCV(3)に更新される。また、4回目のループ処理では、CVM(3,4)により、currentCVの値がCV(3)からCV(4)に更新される。また、5回目のループ処理では、CVM(4,5)により、currentCVの値がCV(4)からCV(5)に更新される。また、6回目のループ処理では、CVM(5,6)により、currentCVの値がCV(5)からCV(6)に更新される。また、7回目のループ処理では、CVM(6,7)により、currentCVの値がCV(6)からCV(7)に更新される。また、8回目のループ処理では、CVM(7,8)により、currentCVの値がCV(7)からCV(8)に更新される。
【0092】
次に、8回のループ処理が終了した後、currentCVの値がCV(8)と一致するか否かを判定し、判定結果が、一致しない場合には異常と判定して処理を停止し、一致する場合にはその後の処理を続ける(6行目参照)。
【0093】
このように、Forループの実行にCVを用いた場合においても、CVの値がCVMにより順に更新されていくことにより、図4(b)を用いて説明したように、処理の実行、および、その順序を検証することが可能である。
【0094】
なお、上記に図7(b)を用いて説明した処理の検証においては、CVM(i,j)におけるiとjとの値を、ループ処理で算出される変数で指定している点が、図4(b)において説明した処理の検証と異なる。
【0095】
<ループ処理:セキュア版2>
なお、図7(c)に「セキュア版2」として示すように、ループ回数を可変にすることも可能である。図7(c)では、ループ処理の回数がn回(ここで、nは1以上の任意の整数)である場合について説明する。なお、ループ処理において、予め定められたループする回数の値を、ループ処理回数nとして説明する。
【0096】
たとえば、図7(c)に示すように、まず、currentCVの値をCV(0)に初期設定する(1行目参照)。次に、ループ処理で更新される最終的なcurrentCVをfinalCVとして、このfinalCVの値を、1行目で初期設定されたcurrentCVの値とループ処理回数nとに基いて算出する(2行目参照)。
【0097】
ここでは、ループ処理回数nについて、CVの種類の数である16に対する剰余を算出し、CV(0)であるcurrentCVを、CVM(0、(算出した剰余の値))と排他的論理和演算して算出する。これにより、finalCVとして、CV(算出した剰余の値)となる。
【0098】
このように、最終的なcurrentCVの値を、1行目で初期設定されたcurrentCVの値とループ処理回数nとに基いて算出することが可能な理由は、図7(b)で説明したループ処理と同様に、後述するこの図7(c)のループ処理でも、CV(0)に初期設定されたcurrentCVの値が、CVM(0,1)、CVM(1,2)、CVM(2,3)・・・・により、CV(1)、CV(2)、CV(3)・・・・と、順に更新されるからである。すなわち、ループ処理が実行される毎に、CVを識別する値(CV(i)のiの値)が、順に1つずつ増大していく。そのため、ループ処理の回数nにより、最終的なcurrentCVの値を、ループ処理を実行する前に算出することが可能である。
【0099】
次に、ループ処理により、4行目から6行目の処理を、ループ変数iの値を0からnに順に1つずつ増大させながらn回繰り返す(3行目と7行目とを参照)。
【0100】
1回目のループ処理、すわなち、ループ変数iの値が0の場合には、4行目の処理では、処理Aが実行される。次に、5行目の処理では、ループ変数iについて、CVの種類の数である16に対する剰余を算出し、算出した剰余の値を変数i0に代入する。この5行目の処理は、CVの種類の数が16であるため、ループ変数iが増大した場合に、たとえば、CV(15)の次に、CV(16)ではなく、CV(0)となるようにするためである。また、同様に、CVM(14,15)の次に、CVM(15,16)ではなく、CVM(15,0)となるようにするためである。なお、この1回目のループ処理では、ループ変数iの値が0であるため、変数i0の値は0となる。
【0101】
次に、6行目の処理では、currentCVの値が、currentCVの値とCVM(i0,i0+1)とを排他的論理和演算した値、すなわち、CV(0)とCVM(0,1)とを排他的論理和演算した値に更新される。この6行目の処理におけるCVM(0,1)により、currentCVの値が、CV(0)からCV(1)に更新される。
【0102】
2回目のループ処理、すわなち、ループ変数iの値が1の場合には、4行目の処理では、処理Aが実行される。次に、5行目の処理では、変数i0の値が1として算出される。次に、6行目の処理では、currentCVの値が、currentCVの値とCVM(1,2)とを排他的論理和演算した値に更新される。この6行目の処理におけるCVM(1,2)により、currentCVの値がCV(1)からCV(2)に更新される。
【0103】
同様に、3回目のループ処理では、CVM(2,3)により、currentCVの値がCV(2)からCV(3)に更新される。また、4回目のループ処理では、CVM(3,4)により、currentCVの値がCV(3)からCV(4)に更新される。
【0104】
以降、図7(b)で説明したループ処理と同様にCVの値が順に更新される。ただし、5行目の処理で、ループ変数iについて、CVの種類の数である16に対する剰余を算出し、算出した剰余の値を変数i0に代入する点が、図7(c)のループ処理と図7(b)のループ処理とでは異なる。そのため、たとえば、ループ回数iの値が15から16になった場合に、i0の値が15から0に戻る点が、図7(c)のループ処理と図7(b)のループ処理とでは異なる。
【0105】
その後、n回のループ処理が終了した後、currentCVの値がループ演算の前に算出したfinalCVの値と一致するか否かを判定し、判定結果が、一致しない場合には異常と判定して処理を停止し、一致する場合にはその後の処理を続ける(8行目参照)。
【0106】
このように、ループ回数を可変にした場合においても、ループ処理で更新される最終的なcurrentCV、すなわちfinalCVを、初期設定されたcurrentCVの値とループ処理回数nとに基いて算出することが可能であるため、図4(b)を用いて説明したループ処理と同様に、Forループの実行にCVを用いてループ処理における処理の実行、および、その順序を検証することが可能である。
【0107】
なお、上記に図7(b)と図7(c)とを用いて説明したループ処理においては、CVの識別情報(CV(i)におけるiの値)を、1つずつ増大するようにCVMを指定する識別情報(CVM(i、j)におけるiとjとの値)を算出したが、これに限られるものではなく、2つずつ増大させてもよいし、異なる方法で算出するようにしてもよい。たとえば、j=jmod16とする方法がある。
【0108】
ただし、ループ処理の1回目のCVM(i、j)におけるiの値は、初期設定で設定されたCV(i)の識別情報iの値と同じとなるようにする。また、2回目以降のCVM(i、j)におけるiの値は、1つ前のCVM(i、j)におけるjの値と同じとなるようにする。また、ループ処理の最後のCVM(i、j)におけるjの値は、比較する場合のCV(i)におけるiの値と同じとする。このようにCVM(i、j)のiとjとの値を設定することにより、または、算出されるように設定することにより、ループ処理が順に実行されたことを検証することが可能である。
【0109】
<CVを用いたモジュールの返却値への応用>
次に、図8を用いて、CVをモジュールの返却値に応用する場合について説明する。たとえば、比較や認証を実行するモジュールなどが、比較結果や認証結果を返却する場合には、一般に、正常終了を示す“0”や異常終了を示す“1”などの、1ビットの簡単な値を用いることがある(図8(a)参照)。たとえば、この図8(a)に示す例では、関数f1()は、返却値として1または0を返している。
【0110】
しかし、モジュールからの返却値が、メモリ上に展開された場合に、そのメモリ周辺をオール0やオール1にすることで、本来の返却値を改竄してしまうことで、ICカードなどに対して、誤動作を起こさせる可能性がある。すなわち、電気的な改竄に対する脆弱性を有している。
【0111】
この解決手段として、図8(b)に「セキュア版」として示すように、モジュールの返却値としての正常終了と異常終了とを示す値として、例えば、55hとAAh、または、66hと99hなどの値を用いる。つまり、正常終了を示す値と、異常終了を示す値とが、互いに完全にビット反転した値とする。これにより、ビット反転は難しいため、電気的な改竄に対する耐性を得ることが可能となる。
【0112】
なお、この55hとAAhとはCV(0)とCV(8)に対応し、また、66hと99hとはCV(5)とCV(13)に対応している。そのため返却値として、CVを用いることが可能である。
【0113】
また、可能であれば、モジュール内のCVの演算に、パラメータを含むようにすると、さらに、誤動作に対する強度が向上する(後述する<CVを用いたグローバル・スタンプ・ラリー>を参照)。
【0114】
<CVを用いたグローバル・スタンプ・ラリー>
次に、図9を用いて、グローバル・スタンプ・ラリーについて説明する。まず、本実施形態でいうグローバル・スタンプ・ラリーについて説明する。なお、ここでは、モジュールの階層構造として、最上位モジュール、Module_A、および、Module_Bとの3つの階層構造を有している場合について説明する。なお、この図9においては、後述するcurrentCVをcCV、currentCVaをcCVa、currentCVbをcCVbとして表記している。
【0115】
ここでは、最上位モジュールで扱うcurrentCVの値を、そのまま下層モジュールに対して渡していき、最終的に下層モジュールから最上位モジュールに処理が戻ってから、最上位モジュールにてCVの値を検証する。これにより、全ての階層モジュールにおいて、しかるべき動作が正しく実行されたことを保証することができる。これを、グローバル・スタンプ・ラリーと称する。
【0116】
なお、このグローバル・スタンプ・ラリーとは、モジュール間の各データの入出力において、このモジュール間の各データの入出力において予め設定されているCVMによりcurrentCVの値を順に変換する、すなわち、currentCVの値をCVMにより更新する。このcurrentCVの値をCVMにより更新することを、ここでは、currentCVにCVMのスタンプを押すと称して説明する。なお、このグローバル・スタンプ・ラリーでは、モジュール内の処理においても、currentCVをCVMで更新する。
【0117】
次に、グローバル・スタンプ・ラリーを導入するための基本ルールについて説明する。
・最上位モジュール(必ずしもmainである必要はない)で、currentCVの初期値を設定する。たとえば、図9(a)の1行目「currentCV=CV(0)」を参照。なお、このCV(0)は55hである。
【0118】
・最上位モジュールは、処理の最後に、モジュールから返却されたcurrentCVの値と、下位モジュールに渡したcurrentCVの値をビット反転した値(本来返却されるべきcurrentCVの値)との排他的論理和演算を行い、00hになっているか否かを判定することにより、下位モジュールに渡したcurrentCVの値と下位モジュールから返却されたcurrentCVの値とが反転の関係になっているか否かを確認する。たとえば、図9(a)の4行目「if(CV(10)^ret)」を参照。
【0119】
・各モジュール(最上位モジュールを含む)は、モジュールを呼び出す場合に、呼び出すモジュールに対して、currentCVの値をパラメータとして渡す(図9のステップS91、S92、S93、S94を参照)。
【0120】
・呼び出された各モジュール(最上位モジュールを含む)は、上位のモジュールから受け取った(または、上位モジュールが最上位モジュールである場合には、初期設定された)currentCVの値に対して、順にスタンプを押していき、モジュール内処理が終了する前に、必ず、currentCVの値がビット反転するようにし、上位モジュールに最後のCVを返却する。言い換えると、受け取った場合のcurrentCVの値と、返却するcurrentCVの値とが、互いにビット反転する関係になるように、スタンプラリーを予め設定しておく(たとえば、図9(c)のCVM(4,7)、CVM(7,8)、CVM(8,12)を参照)。
【0121】
なお、上記に説明したようにスタンプラリーを設定することにより、各モジュールにおいて、呼び出したモジュールの処理が終了した場合において、呼び出したモジュールに渡したCVの値と、呼び出したモジュールから受け取ったCVの値とは、互いにビット反転しているはずである。
【0122】
そこで、各モジュールは、たとえば、呼び出したモジュールが認証など重要なモジュールである場合には、必要に応じて、呼び出したモジュールに渡したcurrentCVの値と、呼び出したモジュールから受け取ったcurrentCVの値とが、互いにビット反転している関係にあるか否かを判定することにより、呼び出したモジュールの動作を検査する。
【0123】
各モジュールは、この判定結果が、呼び出したモジュールに渡したcurrentCVの値と、呼び出したモジュールから受け取ったcurrentCVの値とが、互いにビット反転している関係にない場合、つまり、検査NGの場合には、動作異常と判定して、予め定められた動作異常対処処理を実行する。
なお、呼び出されたモジュールは、返却値として、可能な限りCVを用いるようにする。
【0124】
<グローバル・スタンプ・ラリーの動作>
次に、図9の場合について、一例としてのグローバル・スタンプ・ラリーの動作について説明する。なお、ここでは、currentCVの値を更新する処理のみについて説明する。
まず、図9(a)の最上位モジュールにおいて、currentCVの値がCV(0)に初期設定される(図9(a)1行目参照)。次に、currentCVの値が、CVM(0,2)により、CV(0)からCV(2)に更新される(図9(a)2行目参照)。次に、Module_Aを、Module_A(currentCV)として呼び出すことにより、呼び出すModule_AにCV(2)であるcurrentCVを渡す(図9(a)3行目参照)(ステップS91)。
【0125】
次に、ステップS91で最上位モジュールに呼び出されたModule_Aは、渡されたCV(2)を、Module_A内のローカルな変数であるcurrentCVaとして受け取り、この受け取ったcurrentCVaを、CVM(2,4)により、CV(4)に更新する(図9(b)1行目参照)。次に、Module_Bを、Module_B(currentCVa)として呼び出すことにより、呼び出すModule_BにCV(4)であるcurrentCVaを渡す(図9(b)2行目参照)(ステップS92)。
【0126】
次に、ステップS92でModule_Aに呼び出されたModule_Bは、渡されたCV(4)を、Module_B内のローカルな変数であるcurrentCVbとして受け取り、この受け取ったcurrentCVbを、CVM(4,7)により、CV(7)に更新する(図9(c)1行目参照)。次に、CV(7)であるcurrentCVbを、CVM(7,8)により、CV(8)に更新する(図9(c)2行目参照)。次に、CV(8)であるcurrentCVbを、CVM(8,12)により、CV(12)に更新する(図9(c)3行目参照)。次に、CV(12)であるcurrentCVbを、自モジュールを呼び出したModule_Aに返却する(図9(c)4行目参照)(ステップS93)。
【0127】
ここで、ステップS92でModule_AがModule_Bに渡したcurrentCVaの値であるCV(4)と、ステップS93でModule_BがModule_Aに返却したcurrentCVbの値であるCV(12)とは、互いにビット反転の関係にある。
【0128】
次に、ステップS93でModule_BからCV(12)であるcurrentCVbの値を返却されたModule_Aは、返却されたcurrentCVbの値を、返却値を代入するための変数である返却値retに代入する(図9(b)2行目参照)。次に、返却値ret、すなわち、ステップS93でModule_Bから返却されたcurrentCVbの値と、Module_Bに渡したCV(4)とビット反転の関係にあるCV(12)とを排他的論理和演算することにより、返却値retとModule_Bに渡したCV(4)がビット反転の関係にあるかを判定する。判定値が00hにならない場合は、返却値が誤っているため、処理を中止する(図9(b)3行目参照)。
【0129】
この判定処理により、Module_Bにおいて、処理が正常な順序で実行され、かつ、処理がバイパスされていないことを判定できる。なお、処理が正常な順序で実行され、かつ、バイパスがされていない場合には、ステップS92でModule_AがModule_Bに渡したcurrentCVaの値であるCV(4)と、ステップS93でModule_BがModule_Aに返却したcurrentCVbの値であるCV(12)とは、互いにビット反転の関係にあるはずであることにより、この判定が可能である。
【0130】
次に、Module_Bに渡したcurrentCVaの値と、Module_Bからの返却値retの値と、CV(11)とFFhとを、排他的論理和演算した値で、currentCVaの値を更新する(図9(b)4行目参照)。ここでは、Module_Bに渡したcurrentCVaの値はCV(4)であり、Module_Bからの返却値retの値はCV(12)である。そのため、この演算は、CV(4)とCV(12)とCV(11)とFFhとを排他的論理和演算することになる。ここで、この排他的論理和演算した値はCV(11)となるため、currentCVaの値はCV(11)に更新される。
【0131】
なお、上記図9(b)4行目の処理において、Module_Bに渡したcurrentCVaの値とModule_Bからの返却値retの値とは、上記に説明したように、Module_Bで正常に処理が実行された場合には、互いにビット反転の関係にある。そのため、Module_Bに渡したcurrentCVaの値と、Module_Bからの返却値retの値と、CV(a)と、FFhとを、それぞれ排他的論理和演算した場合、その値はCV(a)となる。この識別変数aは、0から15の任意の整数である。
これは、Module_Bに渡したcurrentCVaの値とModule_Bからの返却値retとの排他的論理和演算した結果は、互いにビット反転した値同士を排他的論理和演算することからFFhとなり、このFFhに対して、更にFFhと排他的論理和演算することにより00hとなるためである。
【0132】
このように、検証をするための変数(この場合は、currentCV、currentCVaまたはcurrentCVb)の値を更新する演算に、モジュールからの返却値retの値を直接用いることにより、検証をするための変数の値にモジュールからの結果を反映させることが可能である。また、このようにモジュールからの返却値の値を反映した検証をするための変数の値を判定することにより、モジュールにおいて記述された順序通りに処理が実行されたか否かを検証することが可能となる。
【0133】
次に、CV(11)であるcurrentCVaの値を、CVM(11,10)により、CV(10)に更新する(図9(b)5行目参照)。次に、CV(10)であるcurrentCVaの値を、自モジュールを呼び出した最上位モジュールに返却する(図9(b)6行目参照)(ステップS94)。
【0134】
このステップS91とステップS94とにおいても、ステップS92とステップS93と同様に、ステップS91で最上位モジュールがModule_Aに渡したcurrentCVの値であるCV(2)と、ステップS94でModule_Aが最上位モジュールに返却したcurrentCVaの値であるCV(10)とは、互いにビット反転の関係にある。
【0135】
次に、ステップS94でModule_AからCV(10)であるcurrentCVの値を返却された最上位モジュールは、返却されたcurrentCVの値を、返却値を代入するための変数retに代入する(図9(a)3行目参照)。次に返却されたcurrentCVの値とModule_Aから返却されるべきcurrentCVの値であるCV(10)との排他的論理和演算を行い、00hになっているか否かを判定することにより、Module_Aに渡したCV(2)とModule_Bから返却されたCV(10)とがビット反転の関係になっているか否かを確認する(図9(a)4行目参照)。
【0136】
次に、currentCVの値と変数retの値とCV(7)とFFhとの排他的論理和演算を行い、currentCVの値とする(図9(a)5行目参照)。次に、currentCVの値を、CVM(7,8)により、CV(8)に更新する(図9(a)6行目参照)。次に、currentCVの値とCV(8)とが、互いにビット反転の関係にあるか否かを判定する(図9(a)7行目参照)。この判定結果が、ビット反転関係にない場合は、処理を中止し、ビット反転関係である場合は、その後の処理を継続する。
【0137】
以上のようにして、複数のモジュール間においても、CVを順に更新していくことにより、処理が順に実行されたことを検証することができ、また、処理がバイパスされていないことを検証することが可能である。
【0138】
以上説明したように、CVを用いることにより、次のような効果を奏する。
(1)バイパス検知、つまり、プログラムステップを飛ばして処理が行われてしまうことを検知することが可能である。
(2)改竄の検知、つまり、プログラム処理中のある値が改竄されてしまうことを検知することが可能である。
【0139】
(3)また、次のことにより、バイパス検知または改竄の検知のために追加される処理で必要となる演算時間を低減することが可能である。
・IF文を減らすこと。
・算術演算ではなく、XOR演算(排他的論理和演算)という論理演算を利用すること。一般的に、算術演算に対比して、論理演算の方が、演算時間が早い。また、本実施形態においては、変換テーブルを用いてXOR演算を実行するため、更に演算時間が早い。
・1バイト単位の変数エリアとワークエリアを2〜3バイト準備するだけでよいこと。
【0140】
次に、図10を用いて、一例としての上記に説明した本実施形態のICカードなどの情報処理装置1の構成について説明する。情報処理装置1は、検証メモリ部2、CVMテーブル3、情報処理部4、CV初期値設定部5、CV演算部6、CV判定部7、および、異常動作対処部8を有する。なお、CVMテーブル3は、変換前ビット列記憶部(ビット列記憶部)31と、変換後ビット列記憶部32と、変換テーブル記憶部(変換ビット列記憶部)33とを有する。なお、このCVMテーブル3において、変換前ビット列記憶部31と、変換後ビット列記憶部32と、変換テーブル記憶部33とは、図3に示すように、一体としたテーブルとしてもよい。また、後述するように変換前ビット列記憶部31と変換後ビット列記憶部32とには、同一の情報が記憶されるため、この変換前ビット列記憶部31と変換後ビット列記憶部32とを一体として1つの記憶部、たとえば、ビット列記憶部34としてもよい。
【0141】
変換前ビット列記憶部31には、少なくとも0と1とを含む2ビット長以上の第1の固定ビット長(たとえば、2ビット長)である複数の基本ビット列(たとえば、“01”と“10”)を組み合わせた第2の固定ビット長(たとえば、1バイト長)のビット列のデータ型を型Aとして、型Aのビット列の値であって、値が互いに異なるm個の値が、変換前ビット列を識別する変換前ビット列識別情報(識別子i(i=0,・・・,m−1))と関連付けて、型Aのビット列の配列X(i)として予め記憶されている(たとえば、図3のiとCV(i)とを参照)。
【0142】
ここで、第1の固定ビット長の値をL1とし、第2の固定ビット長の値をL2とし、基本ビット列の個数をU個とした場合には、変換前ビット列の個数mの値は、m=U(L2/L1)となる。なお、Uの値は最大ではU=2L1であるが、基本ビット列を、後述するように互いにビット反転した2つの基本ビット列とした場合には、U=2となる。たとえば、図3を用いて説明した基本ビット列と変換前ビット列との場合には、基本ビット列の個数が2個で、固定ビット長の値L1が2で、第2の固定ビット長の値L2が8であるため、変換前ビット列の個数mの値は、m=2(8/2)=24=16となる。
【0143】
変換後ビット列記憶部32には、基本ビット列を組み合わせた第2の固定ビット長の変数である変換後ビット列が、変換後ビット列を識別する変換後ビット列識別情報(識別子j(j=0,・・・,m−1))と関連付けて予め記憶されている(たとえば、図3のjとCV(j)とを参照)。よって、この変換後ビット列記憶部32には、変換前ビット列記憶部31と同一の情報が記憶されることになる。そこで、以降においては、変換前ビット列記憶部31と変換後ビット列記憶部32とを一体として、ビット列記憶部34として説明する。
【0144】
変換テーブル記憶部33には、変換前識別情報と変換後識別情報とに関連付けて、当該変換前識別情報で識別される変換前ビット列と排他的論理和演算することにより当該変換後識別情報で識別される変換後ビット列に変換させる変換ビット列が変換テーブルとして予め記憶されている(たとえば、図3のiとjとCVM(i,j)とを参照)。
すなわち、変換テーブル記憶部33には、型Aのビット列X(k)と排他的論理和演算することで型Aのビット列X(l)となるようなビット列の配列Z(k,l)(k,l=0,・・・,m−1)が変換ビット列として記憶されている。
【0145】
なお、この複数の基本ビット列は、互いにビット反転した2つの基本ビット列である(たとえば、“01”と“10”)。
【0146】
また、ビット列記憶部34に記憶されている変換前ビット列と変換後ビット列記憶部32に記憶されている変換後ビット列とは、少なくとも、互いにビット反転の関係にある変換前ビット列と変換後ビット列とを有している。
【0147】
なお、ビット列記憶部34には、複数の変換前ビット列と変換前ビット列識別情報とが関連付けて予め記憶されている。また、変換後ビット列記憶部32には、複数の変換後ビット列と変換後ビット列識別情報とが関連付けて予め記憶されている。また、変換テーブル記憶部33には、複数の変換前識別情報と複数の変換後識別情報とに関連付けて、複数の変換ビット列が変換テーブルとして予め記憶されている。
【0148】
また、ビット列記憶部34に関連付けて記憶されている複数の変換前ビット列と変換前ビット列識別情報との組み合わせと、変換後ビット列記憶部32に関連付けて記憶されている複数の変換後ビット列と変換後ビット列識別情報との組み合わせは、互いに一致するようにされている。
【0149】
検証メモリ部2には、検証用となる変数の値が記憶される。情報処理部4は、予め定められたプログラムの記述に基づいて順に情報処理を実行する。なお、情報処理装置1は、このプログラムを記憶するためのプログラム記憶部を内部に有している。また、情報処理部4は、ループ処理がループされる毎に算出される変数をループ変数として有している。
【0150】
また、情報処理部4は、後述する設定記述に基いて、変換前ビット列識別情報で識別される変換前ビット列をビット列記憶部34から読み出して、CV初期値設定部5を介して検証メモリ部2に記憶する。
また、情報処理部4は、CV演算部6により、検証メモリ部2から読み出した変数と変換ビット列とを排他的論理和演算して、検証メモリ部2に上書きする。
また、情報処理部4は、CV判定部7により、検証メモリ部2から読み出した変数の値に基いて、後述する検証演算記述による排他的論理和演算が実行されたか否かを判定する。
【0151】
また、情報処理部4は、CV判定部7による判定結果が、後述する検証演算記述による排他的論理和演算が実行されていない場合には、異常動作対処部8により、予め定められた異常動作対処を実行する。
【0152】
以降からの情報処理装置1の構成について説明においては、プログラム記憶部に記憶されているプログラムと、情報処理部4の動作についてのみ説明する。
【0153】
予め定められたプログラムには少なくとも、変換前ビット列識別情報で識別される変換前ビット列、すなわちビット列記憶部34に記憶されている型Aのある値を検証メモリ部2に記憶させることを示す記述である設定記述と、検査対象となる情報処理である検査対象情報処理を実行することを示す記述である情報処理記述と、検証メモリ部2に記憶されている変数を変換前識別情報と変換後識別情報とで識別される変換ビット列で、すなわち変換テーブル記憶部33より読み出した変換ビット列で排他的論理和演算した値を検証メモリ部2に上書きすることを示す記述である検証演算記述と、検証メモリ部2に記憶されている変数の値に基いて、検証演算記述による排他的論理和演算が実行されたか否かを判定することを示す記述である判定記述とが、予め記述されている。なお、このプログラムには、設定記述の後に情報処理記述が記述され、情報処理記述の後に検証演算記述が記述され、かつ、検証演算記述の後に判定記述が記述されるように予め記述されている。
【0154】
また、このプログラムには、情報処理記述およびその後に検証演算記述が記述されている記述を情報処理検証演算記述として、設定記述の後に、n個(nは任意の自然数)の情報処理検証演算記述が順に記述され、かつ、n個の情報処理検証演算記述の後に判定記述が記述されるように予め記述されている。
【0155】
この設定記述には、ビット列記憶部34に記憶されている型Aの値であるX(p0)(p0は、0〜m−1の間の任意の値の識別子)を検証メモリ部2に記憶させるように記述されている。また、n個の情報処理検証演算記述のうちi番目の記述の中の検証演算記述には、検証メモリ部2に記憶されている変数を、変換テーブル記憶部33より読み出した変換ビット列であるZ(pi−1,pi)(piは0〜m−1の間の任意の識別子)が示す値で排他的論理和演算し、検証メモリ部2に上書きするように予め記述されている。
【0156】
また、この判定記述には、検証メモリ部2に記憶されている変数が、X(p0)^Z(p0,p1)^・・・・^Z(pn−1,pn)(^は排他的論理和演算)の値となるX(pn)(pnは0〜m−1の間の任意の識別子)であって、ビット列記憶部34から読み出したX(pn)の値と一致するか否かを判断するように予め記述されている。
【0157】
この場合、情報処理部4は、設定記述に基いて、変換前ビット列識別情報で識別される変換前ビット列をビット列記憶部34から読み出して検証メモリ部2に記憶する。すなわち、情報処理部4は、設定記述に基いて、ビット列記憶部34より読み出した型Aのある値を検証メモリ部2に記憶する。
【0158】
次に、情報処理部4は、情報処理検証演算記述に含まれている情報処理記述に基いて、検査対象情報処理を実行し、情報処理検証演算記述に含まれている検証演算記述に基いて、検証メモリ部2から読み出した変数と、変換前識別情報と変換後識別情報とで識別される変換ビット列であって、変換テーブル記憶部33の変換テーブルから読み出した変換ビット列とを排他的論理和演算して検証メモリ部2に上書きする。
すなわち、情報処理部4は、情報処理検証演算記述に基づいて、検査対象情報処理を実行するとともに、検証メモリ部2から読み出した変数と、変換テーブル記憶部33から読み出した変換ビット列とを排他的論理和演算した値を検証メモリ部2に上書きする。
【0159】
次に、情報処理部4は、判定記述に基いて、検証メモリ部2から読み出した変数の値に基いて、検証演算記述による排他的論理和演算が実行されたか否かを判定する。
すなわち、情報処理部4は、判定記述に基づいて、検証メモリ部2から読み出した変数の値が、ビット列記憶部34から読み出した型Aのビット列と一致するか否かを判定することにより、検証演算記述による排他的論理和演算が実行されたか否かを判定する。
【0160】
なお、この判定記述には、検証メモリ部2に記憶されている変数と変換後ビット列識別情報で識別される変換後ビット列とが互いにビット反転の関係にあるか否かを判定することを示す記述が記述されている。
【0161】
この場合、情報処理部4は、この判定記述に基いて、検証メモリ部2から読み出した変数と、ビット列記憶部34から読み出した変換後ビット列識別情報で識別される変換後ビット列とが互いにビット反転の関係にあるか否かを判定する。
【0162】
すなわち、設定記述に基づいて検証メモリ部2に記憶された型Aの値と、判定記述に基づいてビット列記憶部34より読み出された型Aの値とは、互いにビット反転の関係にある。
【0163】
また、予め定められたプログラムには少なくとも、設定記述と、複数の情報処理検証演算記述と、判定記述とが、設定記述の後に複数の情報処理検証演算記述が順に記述され、複数の情報処理検証演算記述の後に判定記述が記述されるように予め記述されている。
【0164】
この場合、情報処理部4は、設定記述に基いて、変換前ビット列識別情報で識別される変換前ビット列をビット列記憶部34から読み出して検証メモリ部2に記憶する。次に、情報処理部4は、複数の情報処理検証演算記述に基いて、検査対象情報処理を実行するとともに、検証メモリ部2から読み出した変数と、変換前識別情報と変換後識別情報とで識別される変換ビット列であって、変換テーブル記憶部33の変換テーブルから読み出した変換ビット列とを排他的論理和演算して検証メモリ部2に順に上書きする。次に、情報処理部4は、判定記述に基いて、検証メモリ部2から読み出した変数と、ビット列記憶部34から読み出した変換後ビット列識別情報で識別される変換後ビット列とに基いて、複数の情報処理検証演算記述に含まれている検証演算記述による排他的論理和演算が順に実行されたか否かを判定する。
【0165】
なお、複数の情報処理検証演算記述のうち最初の情報処理検証演算記述に含まれている検証演算記述の記述において、設定記述に記述されている変換前ビット列識別情報が、検証メモリ部2に記憶されている変数と排他的論理和演算するための変換ビット列を指定するための変換前識別情報として記述されている。
【0166】
また、複数の情報処理検証演算記述のうち2番目以降の情報処理検証演算記述に含まれている検証演算記述の記述において、1つ前の情報処理検証演算記述に含まれている検証演算記述に記述されている変換後識別情報が、検証メモリ部2に記憶されている変数と排他的論理和演算するための変換ビット列を指定するための変換前識別情報として記述されている。
【0167】
また、複数の情報処理検証演算記述のうち最後の情報処理検証演算記述に含まれている検証演算記述の記述において、検証メモリ部2に記憶されている変数を判定するために判定記述に記述されている変換後ビット列識別情報が、検証メモリ部2に記憶されている変数と排他的論理和演算するための変換ビット列を指定するための変換後識別情報として記述されている。
【0168】
<CVを用いたForループの実行の保証>
ここで、情報処理記述の後に検証演算記述が記述されている記述を情報処理検証演算記述とする。また、予め定められたプログラムには少なくとも、設定記述と、ループ処理を実行することを示す記述ともに、該記述されているループ処理が実行される場合に、該実行されているループ処理内で情報処理検証演算記述を実行することを示す記述が記述されているループ処理記述と、判定記述とが、設定記述の後にループ処理記述が記述され、かつ、ループ処理記述の後に判定記述が記述されるように予め記述されている。
【0169】
この場合、情報処理部4は、設定記述に基いて、変換前ビット列識別情報で識別される変換前ビット列をビット列記憶部34から読み出して検証メモリ部2に記憶する。次に、情報処理部4は、ループ処理記述に基いてループ処理を実行するとともに、該実行しているループ処理内で情報処理検証演算記述に基いて、検査対象情報処理を実行するとともに、検証メモリ部2から読み出した変数と、変換前識別情報と変換後識別情報とで識別される変換ビット列であって、変換テーブル記憶部33の変換テーブルから読み出した変換ビット列とを排他的論理和演算して検証メモリ部2に順に上書きする。次に、情報処理部4は、判定記述に基いて、検証メモリ部2から読み出した変数と、ビット列記憶部34から読み出した変換後ビット列識別情報で識別される変換後ビット列とに基いて、ループ処理の実行において情報処理検証演算記述に含まれている検証演算記述による排他的論理和演算が順に実行されたか否かを判定する。
【0170】
また、ループ処理内で実行される情報処理検証演算記述に含まれている検証演算記述の記述において、検証メモリ部2に記憶されている変数と排他的論理和演算するための変換ビット列を指定するための変換前識別情報および変換前識別情報の値がループ変数に基いて算出されるような算出手順が記述されている。
【0171】
なお、この算出手順は、ループ処理が実行される場合に、情報処理検証演算記述に含まれている検証演算記述による排他的論理和演算が最初に実行される場合には、ループ変数に基いて算出される変換前識別情報の値が、設定記述に記述されている変換前ビット列識別情報の値となる、ように予め記述されている。
【0172】
また、この算出手順は、情報処理検証演算記述に含まれている検証演算記述による排他的論理和演算が2回目以降に実行される場合には、ループ変数に基いて算出される変換前識別情報の値が、1つ前に情報処理検証演算記述に含まれている検証演算記述による排他的論理和演算が実行された場合に算出された変換後識別情報の値となるように予め記述されている。
【0173】
また、この算出手順は、情報処理検証演算記述に含まれている検証演算記述による排他的論理和演算が最後に実行される場合には、ループ変数に基いて算出される変換後識別情報の値が、検証メモリ部2に記憶されている変数を判定するために判定記述に記述されている変換後ビット列識別情報の値となるように予め記述されている。
【0174】
また、ループ処理を実行する回数の値が予め定められており、検証メモリ部2に記憶されている変数を判定するために判定記述に記述されている変換後ビット列識別情報の値が、設定記述に記述されている変換前ビット列識別情報の値と、ループ処理を実行する回数の値とに基いて算出される。
【0175】
より具体的には、たとえば、予め定められたプログラムには、少なくとも、設定記述と、ループ処理を実行することを示す記述とともに、該記述されているループ処理が実行される場合に、該実行されているループ処理内で情報処理検証演算記述を実行する事を示す記述であるループ処理記述と、判定記述とが、設定記述の後にループ処理記述が記述され、かつ、ループ処理記述の後に判定記述が記述されるように予め記述されている。
【0176】
この設定記述には、値0の識別子で対応づけられるX(0)の値を検証メモリ部に記憶させるように記述されている。また、ループ処理記述中の検証演算記述には、検証メモリ部に記憶されている変数を、変換テーブル記憶部33より読み出した変換ビット列であるZ(i−1,i)(iはループ内i番目に処理される回数値)が示すビット列の値で排他的論理和演算し、検証メモリ部に上書きするように予め記述されている。また、判定記述には、検証メモリ部に記憶されている変数が、ビット列記憶部34から読み出したX(n)(n=1〜mであり、ループ回数)の値と一致するか否かを判断するように予め記述されている。
【0177】
この場合、情報処理部4は、設定記述に基づいて、ビット列記憶部34より読み出した型Aのある値を検証メモリ部に記憶し、情報処理検証演算記述に基づいて、検査対象情報処理を実行するとともに、検証メモリ部から読み出した変数と、変換テーブル記憶部33から読みだした変換ビット列とを排他的論理和演算した値を検証メモリ部に上書きし、判定記述に基づいて、検証メモリ部から読み出した変数の値が、ビット列記憶部34から読み出した型Aのビット列と一致するか否かを判定することにより、検証演算記述による排他的論理和演算が実行されたか否かを判定する。
【0178】
<CVを用いたモジュールの返却値への応用>
また、予め定められたプログラムには、下位モジュールを呼び出し、検証メモリ部2に記憶されている検証用となる変数を呼び出す下位モジュールに渡すとともに、呼び出された下位モジュールからの返却値を取得することを示す記述であるモジュール呼出記述と、モジュール呼出記述で呼び出した下位モジュールからの返却値が、予め定められたビット列であるか否かを検証することを示す返却値判定記述とが、モジュール呼出記述の後に返却値判定記述が記述されるように予め記述されている。
【0179】
この場合、情報処理部4は、モジュール呼出記述に基づいて、下位モジュールを呼び出し、検証メモリ部2に記憶されている検証用となる変数を呼び出す下位モジュールに渡すとともに、呼び出された下位モジュールからの返却値を取得し、返却値判定記述に基づいて、モジュール呼出記述で呼び出した下位モジュールからの返却値が、下位モジュールが記述順通りに実行された場合に返却されるビット列であるか否かを検証する。
【0180】
また、返却値判定記述には、検証メモリ部2に記憶されている検証用となる変数であって、呼び出すモジュールに渡した変数の値と、モジュール呼出記述で呼び出したモジュールからの返却値の値とが、互いにビット反転の関係にあることを検証することにより、モジュール呼出記述で呼び出したモジュールからの返却値の値を検証することを示す記述が記述されている。
【0181】
この場合、情報処理部4は、返却値判定記述に基づいて、検証メモリ部2に記憶されている検証用となる変数であって、呼び出すモジュールに渡した変数の値と、モジュール呼出記述で呼び出したモジュールからの返却値の値とが、互いにビット反転の関係にあることを検証することにより、モジュール呼出記述で呼び出したモジュールからの返却値の値を検証する。
【0182】
ところで、以降においては、情報処理装置1は、モジュール内検証メモリ部を有しているものとして説明する。このモジュール内検証メモリ部とは、検証メモリ部2と同様のメモリ部である。このようなモジュール内検証メモリ部を用いることにより、すなわち、モジュール内のローカル変数としての変数を用いることにより、モジュール間でプログラムの記述順の通りに処理が実行されたか否かの検証をすることが可能である。
なお、このようなモジュール内検証メモリ部を用いることなく、検証メモリ部2のみを用いても、モジュール間でプログラムの記述順の通りに処理が実行されたか否かの検証を同様に実行することは可能である。検証メモリ部2のみを用いる場合には、この検証メモリ部2には、たとえば、グローバル変数としての変数が記憶される。
【0183】
モジュール呼出し記述に基づいて呼出される下位モジュールのプログラムには、自モジュールを呼出した上位モジュールより渡された変数を、変換ビット列記憶部より読み出した変換ビット列で排他的論理和演算してモジュール内検証メモリ部に記憶する事を示す記述であるモジュール内設定記述と、自モジュール内における検査対象となる情報処理であるモジュール内検査対象情報処理を実行する事を示す記述であるモジュール内情報処理記述と、モジュール内検証メモリ部に記憶されている変数を変換ビット列記憶部より読み出した変換ビット列で排他的論理和演算した値をモジュール内検証メモリ部に上書きする事を示す記述であるモジュール内検証演算記述と、モジュール内検証メモリ部に記憶されている変数の値を、上位モジュールに返却値として返却することを示す返却記述とが記述されている。
なお、モジュール内情報処理記述およびその後にモジュール内検証演算記述が記述されている記述をモジュール内情報処理検証演算記述として、モジュール内設定記述の後にモジュール内情報処理検証演算記述が記述され、かつ、モジュール内情報処理検証演算記述の後に返却記述が記述されるように記述されている。
【0184】
この場合、情報処理部4は、モジュール内設定記述に基づいて、自モジュールを呼出した上位モジュールより渡された変数を変換ビット列記憶部33より読み出した変換ビット列で排他的論理和演算した値をモジュール内検証メモリ部に記憶し、モジュール内情報処理検証演算記述に基づいて、モジュール内検査対象情報処理を実行するとともに、モジュール内検証メモリ部から読み出した変数と、変換ビット列記憶部から読み出した変換ビット列とを排他的論理和演算した値をモジュール内検証メモリ部に上書きし、返却記述に基づいて、モジュール内検証メモリ部に記憶されている変数の値を、上位モジュールに返却値として返却する。
【0185】
なお、モジュール内設定記述に基づき、モジュール内検証メモリ部に記憶される上位モジュールより渡された変数と、返却記述に基づき、上位モジュールに返却される返却値とは、互いにビット反転の関係になるように予め設定されている。
【0186】
この場合、情報処理部4は、モジュール内検証演算記述および返却記述に基づいて、渡された検証用となる変数と互いにビット反転の関係にある返却値を返却する。
【0187】
なお、上記の<CVを用いたモジュールの返却値への応用>の説明においては、下位モジュールを呼び出す場合についてのみ説明したが、これに限られるものではなく、上位モジュールを呼び出す場合、または、階層関係にない任意のモジュールを呼び出す場合にも、同様の処理を実行することが可能である。
【0188】
<CVを内部変数としての利用する方法>
また、検査対象情報処理による情報処理をするプログラムの記述において、2値の値をとる2つの内部変数として、少なくとも0と1とを含む2ビット長以上の第3の固定ビット長である複数の基本ビット列を組み合わせた第4の固定ビット長の変数である2つの変数であって、互いにビット反転の関係にある2つの変数を用いる。
【0189】
<IF文の代わりに算術演算を利用する方法>
また、検査対象情報処理となる情報処理のプログラムの記述において、条件判断の処理がある場合には、条件判断の対象となる変数に基づいた算術演算により条件判断する記述が条件判断記述として予め記述されている。この場合、情報処理部4は、条件判断記述に基づいて、条件判断の対象となる変数に基づいた算術演算により条件判断する。
【0190】
以上図10を用いて説明した一例としての情報処理装置1の構成により、この情報処理装置1は、図4から図9を用いて説明した各処理を実行することが可能である。
【0191】
なお、上記に図1から図9を用いて説明した実施形態の説明においては、基本ビット列として、“01”と“10”などの2ビット固定長の場合について説明したが、基本ビット列は、このような2ビット固定長に限られるものではなく、たとえば、“0101”と“1010”との4ビット固定長であってもよい。または、同様に、基本ビット列として、8ビット固定長などであってもよい。
【0192】
また、本実施形態においては、全ビット反転する攻撃が技術的に難しいことを用いているため、この複数の基本ビット列は、互いにビット反転した2つの基本ビット列であることが望ましい。また、この基本ビット列においては、2ビット表現した場合に、0と1とが順に交互となっている方が望ましい。しかし、たとえば、基本ビット列として、“0110”と“1001”など、少なくとも0と1とを含む2ビット長以上であってもよい。
【0193】
また、上記に図1から図9を用いて説明した実施形態の説明においては、CVとして1バイト固定長(8ビット固定長)の場合について説明したが、これに限られるものではなく、16ビット固定長、32ビット固定長などであってもよい。なお、基本ビット列の固定ビット長、および、CVの固定ビット長は、演算に要する負荷や、演算に要する時間、内部のCVMテーブル3に予め保存することが必要となる情報の情報量、また、固定ビット長に依存するセキュリティの度合いにより、適宜設定されてもよい。
【0194】
なお、図4から図9を用いて説明した各処理においては、プログラム中に記述において、CVMを、CVM(i,j)としてiおよびjの識別情報で指定し、CVMテーブル3から識別情報iおよびjに対応するCVMの値を読み出すようにしていたが、これに限られるものではなく、CVM(i,j)の値そのものを、プログラム中に予め記述するようにしてもよい。
【0195】
なお、上記の説明においては、設定記述、情報処理記述、検証演算記述、および、判定記述が、プログラムの記述に予め記述されているとして説明したが、予め情報処理記述が記述されているプログラムに、設定記述、検証演算記述、および、判定記述を自動的に埋め込む記述埋込装置により、設定記述、情報処理記述、検証演算記述、および、判定記述が、プログラムの記述に記述されるようにしてもよい。
【0196】
なお、上記に説明した実施形態の説明においては、情報処理装置1としてICカードなどについて説明したが、これに限られるものではなく、情報処理装置1はパーソナルコンピュータまたは携帯電話などのコンピュータ装置であってもよい。
【0197】
また、上記に説明した実施形態の説明においては、1つの情報処理装置1におけるモジュール間の入出力にCVを用いる場合について説明したが、これに限られるものではなく、複数の装置間の入出力、例えば、通信機能を有する複数の通信装置間の通信において、その通信の送信および受信としての入出力に、上記実施形態に説明したCVを用いることも可能である。
【0198】
たとえば、図9を用いて説明したモジュール間のグローバル・スタンプ・ラリーにおいて、各モジュールを各通信装置とし、モジュール間のCVの受け渡しを、通信装置間の通信における送受信としてもよい。この場合にも、上記実施形態に説明したCVを用いることにより、モジュールの場合と同様に、各装置における処理の正常性を検査することが可能である。
【0199】
なお、上記の通信としては、有線、無線、接触型、または、非接触型の通信であってもよい。また、このような通信をする通信装置として、たとえば、ICカードとICカード読取装置とであってもよい。
【0200】
なお、情報処理装置1の検証メモリ部2またはCVMテーブル3は、ハードディスク装置や光磁気ディスク装置、フラッシュメモリ等の不揮発性のメモリや、CR−ROM等の読み出しのみが可能な記憶媒体、RAMのような揮発性のメモリ、あるいはこれらの組み合わせにより構成されるものとする。
【0201】
なお、図10における情報処理装置1は専用のハードウェアにより実現されるものであってもよく、また、メモリおよびマイクロプロセッサにより実現させるものであってもよい。
なお、この情報処理装置1は専用のハードウェアにより実現されるものであってもよく、また、この情報処理装置1はメモリおよびCPU(中央情報処理装置)により構成され、情報処理装置1の機能を実現するためのプログラムをメモリにロードして実行することによりその機能を実現させるものであってもよい。
【0202】
また、図10における情報処理装置1の機能を実現するためのプログラムをコンピュータ読み取り可能な記録媒体に記録して、この記録媒体に記録されたプログラムをコンピュータシステムに読み込ませ、実行することにより情報処理装置1の各機能による処理を行ってもよい。なお、ここでいう「コンピュータシステム」とは、OSや周辺機器等のハードウェアを含むものとする。
【0203】
また、「コンピュータシステム」は、WWWシステムを利用している場合であれば、ホームページ提供環境(あるいは表示環境)も含むものとする。
また、「コンピュータ読み取り可能な記録媒体」とは、フレキシブルディスク、光磁気ディスク、ROM、CD−ROM等の可搬媒体、コンピュータシステムに内蔵されるハードディスク等の記憶装置のことをいう。さらに「コンピュータ読み取り可能な記録媒体」とは、インターネット等のネットワークや電話回線等の通信回線を介してプログラムを送信する場合の通信線のように、短時間の間、動的にプログラムを保持するもの、その場合のサーバやクライアントとなるコンピュータシステム内部の揮発性メモリのように、一定時間プログラムを保持しているものも含むものとする。また上記プログラムは、前述した機能の一部を実現するためのものであっても良く、さらに前述した機能をコンピュータシステムにすでに記録されているプログラムとの組み合わせで実現できるものであっても良い。
【0204】
以上、この発明の実施形態を図面を参照して詳述してきたが、具体的な構成はこの実施形態に限られるものではなく、この発明の要旨を逸脱しない範囲の設計等も含まれる。
【図面の簡単な説明】
【0205】
【図1】“01”と“10”との2ビットの組み合わせのみを用いて、1バイトフォーマットを16種類で表現する表現形式を説明する表である。
【図2】図1の表におけるCVに対するCVMを説明する説明図である。
【図3】CV(i)とCV(j)とに対応するCVM(i,j)を示す表である。
【図4】CVを用いた基本的な検証の利用方法を説明する説明図である。
【図5】IF文の代わりに算術演算を利用する方法を説明する説明図である。
【図6】CVを内部変数としての利用する方法を説明する説明図である。
【図7】CVを用いたForループの実行の保証を説明する説明図である。
【図8】CVを用いたモジュールの返却値への応用を説明する説明図である。
【図9】CVを用いたグローバル・スタンプ・ラリーを説明する説明図である。
【図10】本発明の一実施形態による情報処理装置の構成を示すブロック図である。
【符号の説明】
【0206】
1…情報処理装置、2…検証メモリ部、3…CVMテーブル、4…情報処理部、5…CV初期値設定部、6…CV演算部、7…CV判定部、8…異常動作対処部、31…変換前ビット列記憶部、32…変換後ビット列記憶部、33…変換テーブル記憶部、34…ビット列記憶部
【特許請求の範囲】
【請求項1】
予め定められたプログラムの記述に基づいて順に情報処理を実行する情報処理部を有する情報処理装置であって、
検証用となる変数の値が記憶される検証メモリ部、を有し、
少なくとも0と1とを含む2ビット長以上の第1の固定ビット長である複数の基本ビット列を組み合わせた第2の固定ビット長のビット列のデータ型を型Aとし、
前記型Aのある値を前記検証メモリ部に記憶させることを示す記述を設定記述とし、
検査対象となる情報処理である検査対象情報処理を実行することを示す記述を情報処理記述とし、
前記検証メモリ部に記憶されている変数をあるビット列で排他的論理和演算して前記検証メモリ部に上書きすることを示す記述を検証演算記述とし、
前記検証メモリ部に記憶されている変数の値に基づいて前記検証演算記述による排他的論理和演算が実行されたか否かを示す記述を判定記述とし、
前記情報処理記述およびその後に前記検証演算記述が記述されている記述を情報処理検証演算記述として、
前記予め定められたプログラムには、
前記設定記述と、
複数のn個の前記情報処理検証演算記述と、
前記判定記述とが、
前記設定記述の後に前記n個の情報処理検証演算記述が順に記述され、かつ、前記n個の情報処理検証演算記述の後に前記判定記述が記述されるように予め記述されており、
前記情報処理部は、
前記設定記述に基づいて、前記型Aのあるビット列aを前記メモリ部に記憶し、
前記n個の情報処理検証演算記述に基づいて、前記検査対象情報処理を実行するとともに、前記検証メモリ部から読み出した前記変数と、前記変数と排他的論理和演算する事で前記型Aのあるビット列となるようなビット列bi(i=1〜n)とを排他的論理和演算して前記検証メモリ部に上書きすることをn回実行し、
前記判定記述により、前記検証メモリ部から読み出した変数の値が
検証値c=a^b1^b2^・・・・^bn(^は、排他的論理和演算)
と一致するか否かを判定する事により、
前記複数の前記情報処理検証演算記述に含まれている検証演算記述による排他的論理和演算が順に実行されたか否かを判定する、
ことを特徴とする情報処理装置。
【請求項2】
前記設定記述に基づき前記検証メモリ部に記憶されているビット列aと、
前記検証値cは、互いにビット反転の関係にある
ことを特徴とする請求項1に記載の情報処理装置。
【請求項3】
予め定められたプログラムの記述に基づいて順に情報処理を実行する情報処理部を有する情報処理装置であって、
少なくとも0と1とを含む2ビット長以上の第1の固定ビット長である複数の基本ビット列を組み合わせた第2の固定ビット長のビット列のデータ型を型Aとし、
前記型Aのビット列の値であって、値が互いに異なるm個の値を、識別子j(j=0,・・・,m−1)と対応づけて、前記型Aのビット列の配列X(j)として記憶するビット列記憶部と、
X(k)と排他的論理和演算することでX(l)となるようなビット列の配列Z(k,l)(k,l=0,・・・,m−1)を変換ビット列として記憶する変換ビット列記憶部と、
検証用となる変数の値を記憶する検証メモリ部と、を有し、
前記予め定められたプログラムは、
前記ビット列記憶部に記憶されている前記型Aのある値を前記検証メモリ部に記憶させる事を示す記述である設定記述と、
検査対象となる情報処理である検査対象情報処理を実行することを示す記述である情報処理記述と、
前記検証メモリ部に記憶されている変数を前記変換ビット列記憶部より読み出した変換ビット列で排他的論理和演算した値を前記検証メモリ部に上書きすることを示す記述である検証演算記述と、
前記検証メモリ部に記憶されている変数の値に基づいて前記検証演算記述による排他的論理和演算が実行されたか否かを示す記述である判定記述とを有し、
前記情報処理記述およびその後に前記検証演算記述が記述されている記述を情報処理検証演算記述として、
前記設定記述の後に、n個の前記情報処理検証演算記述が順に記述され、かつ、前記n個の情報処理検証演算記述の後に前記判定記述が記述されるように予め記述されており、
前記設定記述は、前記ビット列記憶部に記憶されている前記型Aの値であるX(p0)(p0は、0〜m−1の間の任意の値の識別子)を前記検証メモリ部に記憶させるように記述されており、
前記n個の情報処理検証演算記述のうちi番目の記述の中の検証演算記述には、前記検証メモリ部に記憶されている変数を、前記変換ビット列記憶部より読み出した変換ビット列であるZ(pi−1,pi)(piは0〜m−1の間の任意の識別子)が示す値で排他的論理和演算し、検証メモリ部に上書きするように予め記述されており、
前記判定記述には、前記検証メモリ部に記憶されている変数が、X(p0)^Z(p0,p1)^・・・・^Z(pn−1,pn)(^は排他的論理和演算)の値となるX(pn)(pnは0〜m−1の間の任意の識別子)であって、前記ビット列記憶部から読み出したX(pn)の値と一致するか否かを判断するように予め記述されており、
前記情報処理部は、
前記設定記述に基づいて、前記ビット列記憶部より読み出した前記型Aのある値を前記検証メモリ部に記憶し、
前記情報処理検証演算記述に基づいて、前記検査対象情報処理を実行するとともに、前記検証メモリ部から読み出した前記変数と、前記変換ビット列記憶部から読みだした変換ビット列とを排他的論理和演算した値を前記検証メモリ部に上書きし、
前記判定記述に基づいて、前記検証メモリ部から読み出した変数の値が、前記ビット列記憶部から読み出した前記型Aのビット列と一致するか否かを判定することにより、前記検証演算記述による排他的論理和演算が実行されたか否かを判定する
ことを特徴とする情報処理装置。
【請求項4】
前記設定記述に基づいて検証メモリ部に記憶された前記型Aの値と、
前記判定記述に基づいて前記ビット列記憶部より読み出された前記型Aの値とは、互いにビット反転の関係にある
ことを特徴とする請求項3記載の情報処理装置。
【請求項5】
前記予め定められたプログラムには、少なくとも
前記設定記述と、
ループ処理を実行することを示す記述とともに、該記述されているループ処理が実行される場合に、該実行されているループ処理内で前記情報処理検証演算記述を実行する事を示す記述であるループ処理記述と、
前記判定記述とが、
前記設定記述の後に前記ループ処理記述が記述され、かつ、前記ループ処理記述の後に前記判定記述が記述されるように予め記述されており、
前記設定記述には、値0の識別子で対応づけられるX(0)の値を前記検証メモリ部に記憶させるように記述されており、
前記ループ処理記述中の検証演算記述には、前記検証メモリ部に記憶されている変数を、前記変換ビット列記憶部より読み出した変換ビット列であるZ(i−1,i)(iはループ内i番目に処理される回数値)が示すビット列の値で排他的論理和演算し、前記検証メモリ部に上書きするように予め記述されており、
前記判定記述には、前記検証メモリ部に記憶されている変数が、前記ビット列記憶部から読み出したX(n)(n=1〜mであり、ループ回数)の値と一致するか否かを判断するように予め記述されており、
前記情報処理部は、
前記設定記述に基づいて、前記ビット列記憶部より読み出した前記型Aのある値を前記検証メモリ部に記憶し、
前記情報処理検証演算記述に基づいて、前記検査対象情報処理を実行するとともに、前記検証メモリ部から読み出した前記変数と、前記変換ビット列記憶部から読みだした変換ビット列とを排他的論理和演算した値を前記検証メモリ部に上書きし、
前記判定記述に基づいて、前記検証メモリ部から読み出した変数の値が、前記ビット列記憶部から読み出した前記型Aのビット列と一致するか否かを判定することにより、前記検証演算記述による排他的論理和演算が実行されたか否かを判定する
ことを特徴とする請求項3又は請求項4に記載の情報処理装置。
【請求項6】
前記予め定められたプログラムには、
下位モジュールを呼び出し、前記検証メモリ部に記憶されている変数を前記下位モジュールに渡すとともに、前記下位モジュールからの返却値を取得する記述であるモジュール呼び出し記述と、
前記モジュール呼び出し記述で呼び出した下位モジュールからの返却値が、前記下位モジュールが記述順通りに実行された場合に返却されるビット列であるか否かを検証することを示す返却値判定記述とが、
前記モジュール呼出記述の後に前記返却値判定記述が記述されるように予め記述されており、
前記情報処理部は、
前記モジュール呼出記述に基づいて下位モジュールを呼出し、前記検証メモリ部に記憶されている変数を前記下位モジュールに渡すとともに、前記下位モジュールからの返却値を取得し、
前記返却値判定記述に基づいて、前記モジュール呼出し記述で呼出した下位モジュールからの返却値が、前記下位モジュールが記述順通りに実行された場合に返却されるビット列であるか否かを検証する、
ことを特徴とする請求項3から請求項5のいずれかに記載の情報処理装置。
【請求項7】
前記情報処理装置は、
モジュール内検証メモリ部を有し、
前記モジュール呼出し記述に基づいて呼出される下位モジュールのプログラムは、
自モジュールを呼出した上位モジュールより渡された変数を、前記変換ビット列記憶部より読み出した変換ビット列で排他的論理和演算して前記モジュール内検証メモリ部に記憶する事を示す記述であるモジュール内設定記述と、
自モジュール内における検査対象となる情報処理であるモジュール内検査対象情報処理を実行する事を示す記述であるモジュール内情報処理記述と、
前記モジュール内検証メモリ部に記憶されている変数を前記変換ビット列記憶部より読み出した変換ビット列で排他的論理和演算した値を前記モジュール内検証メモリ部に上書きする事を示す記述であるモジュール内検証演算記述と、
前記モジュール内検証メモリ部に記憶されている変数の値を、前記上位モジュールに返却値として返却することを示す返却記述とを有し、
前記モジュール内情報処理記述およびその後に前記モジュール内検証演算記述が記述されている記述をモジュール内情報処理検証演算記述として、
前記モジュール内設定記述の後に前記モジュール内情報処理検証演算記述が記述され、かつ、前記モジュール内情報処理検証演算記述の後に返却記述が記述されるように記述されており、
前記情報処理部は、
前記モジュール内設定記述に基づいて、自モジュールを呼出した上位モジュールより渡された変数を前記変換ビット列記憶部より読み出した変換ビット列で排他的論理和演算した値を前記モジュール内検証メモリ部に記憶し、
前記モジュール内情報処理検証演算記述に基づいて、前記モジュール内検査対象情報処理を実行するとともに、前記モジュール内検証メモリ部から読み出した前記変数と、前記変換ビット列記憶部から読み出した変換ビット列とを排他的論理和演算した値を前記モジュール内検証メモリ部に上書きし、
前記返却記述に基づいて、前記モジュール内検証メモリ部に記憶されている変数の値を、前記上位モジュールに返却値として返却する、
ことを特徴とする請求項6に記載の情報処理装置。
【請求項8】
前記モジュール内設定記述に基づき、前記モジュール内検証メモリ部に記憶される前記上位モジュールより渡された変数と、
前記返却記述に基づき、前記上位モジュールに返却される返却値とは、互いにビット反転の関係になるように予め設定されている、
ことを特徴とする請求項7記載の情報処理装置。
【請求項9】
前記検査対象情報処理による情報処理をするプログラムの記述において、
2値の値をとる2つの内部変数として、少なくとも0と1とを含む2ビット長以上の第3の固定ビット長である複数の基本ビット列を組み合わせた第4の固定ビット長の変数である2つの変数であって、互いにビット反転の関係にある2つの変数を用いる、
ことを特徴とする請求項3から請求項8のいずれかに記載の情報処理装置。
【請求項10】
予め定められたプログラムの記述に基づいて順に情報処理を実行する情報処理部を有する情報処理装置であって、
少なくとも0と1とを含む2ビット長以上の第1の固定ビット長である複数の基本ビット列を組み合わせた第2の固定ビット長のビット列のデータ型を型Aとし、
前記型Aのある値を変換前ビット列として記憶する変換前ビット列記憶部と、
前記型Aのある値であって、前記変換前ビット列とは値が異なるある値を変換後ビット列として記憶する変換後ビット列記憶部と、
前記変換前ビット列と排他的論理和演算することにより前記変換後ビット列に変換させる変換ビット列を記憶する変換ビット列記憶部と、
検証用となる変数の値を記憶する検証メモリ部と、を有し、
前記予め定められたプログラムには少なくとも、
前記変換前ビット列記憶部に記憶されている変換前ビット列を読み出し前記検証メモリ部に記憶させる事を示す記述である設定記述と、
検査対象となる情報処理である検査対象情報処理を実行することを示す記述である情報処理記述と、
前記検証メモリ部に記憶されている変数を前記変換ビット列記憶部より読み出した変換ビット列で排他的論理和演算した値を前記検証メモリ部に上書きすることを示す記述である検証演算記述と、
前記検証メモリ部に記憶されている変数の値に基づいて前記検証演算記述による排他的論理和演算が実行されたか否かを示す記述である判定記述とが、
前記設定記述の後に前記情報処理記述が記述され、前記情報処理記述の後に検証演算記述が記述され、かつ、前記検証処理記述の後に前記判定記述が記述されるように予め記述されており、
前記情報処理部は、
前記設定記述に基づいて、変換前ビット列を前記変換前ビット列記憶部から読み出して前記検証メモリ部に記憶し、
前記情報処理記述に基づいて、前記検査対象情報処理を実行し、
前記検証演算記述に基づいて、前記検証メモリから読み出した変数と、前記変換ビット列記憶部から読み出した変換ビット列とを排他的論理和演算して前記検証メモリ部に上書きし、
前記判定記述により、前記検証メモリ部から読み出した変数の値が、前記変換後ビット列記憶部より読み出した前記変換後ビット列と一致するか否かを判定する事により、前記検証演算記述による排他的論理和演算が実行されたか否かを判定する
ことを特徴とする情報処理装置。
【請求項11】
前記設定記述に基づいて検証メモリ部に記憶された前記変換前ビット列と、
前記判定記述に基づいて前記変換後ビット列記憶部より読み出された前記変換後ビット列とは、互いにビット反転の関係にある
ことを特徴とする請求項10記載の情報処理装置。
【請求項12】
予め定められたプログラムの記述に基づいて順に情報処理を実行する情報処理部と、少なくとも0と1とを含む2ビット長以上の第1の固定ビット長である複数の基本ビット列を組み合わせた第2の固定ビット長のビット列のデータ型を型Aとして、前記型Aのビット列の値であって、値が互いに異なるm個の値を、識別子j(j=0,・・・,m−1)と対応づけて、前記型Aのビット列の配列X(j)として記憶するビット列記憶部と、X(k)と排他的論理和演算することでX(l)となるようなビット列の配列Z(k,l)(k,l=0,・・・,m−1)を変換ビット列として記憶する変換ビット列記憶部と、検証用となる変数の値を記憶する検証メモリ部と、を有し、前記予め定められたプログラムは、前記ビット列記憶部に記憶されている前記型Aのある値を前記検証メモリ部に記憶させる事を示す記述である設定記述と、検査対象となる情報処理である検査対象情報処理を実行することを示す記述である情報処理記述と、前記検証メモリ部に記憶されている変数を前記変換ビット列記憶部より読み出した変換ビット列で排他的論理和演算した値を前記検証メモリ部に上書きすることを示す記述である検証演算記述と、前記検証メモリ部に記憶されている変数の値に基づいて前記検証演算記述による排他的論理和演算が実行されたか否かを示す記述である判定記述とを有し、前記情報処理記述およびその後に前記検証演算記述が記述されている記述を情報処理検証演算記述として、前記設定記述の後に、n個の前記情報処理検証演算記述が順に記述され、かつ、前記n個の情報処理検証演算記述の後に前記判定記述が記述されるように予め記述されており、前記設定記述は、前記ビット列記憶部に記憶されている前記型Aの値であるX(p0)(p0は、0〜m−1の間の任意の値の識別子)を前記検証メモリ部に記憶させるように記述されており、前記n個の情報処理検証演算記述のうちi番目の記述の中の検証演算記述には、前記検証メモリ部に記憶されている変数を、前記変換ビット列記憶部より読み出した変換ビット列であるZ(pi−1,pi)(piは0〜m−1の間の任意の識別子)が示す値で排他的論理和演算し、検証メモリ部に上書きするように予め記述されており、前記判定記述には、前記検証メモリ部に記憶されている変数が、X(p0)^Z(p0,p1)^・・・・^Z(pn−1,pn)(^は排他的論理和演算)の値となるX(pn)(pnは0〜m−1の間の任意の識別子)であって、前記ビット列記憶部から読み出したX(pn)の値と一致するか否かを判断するように予め記述されている情報処理装置において用いられる情報処理であって、
前記情報処理部は、
前記設定記述に基づいて、前記ビット列記憶部より読み出した前記型Aのある値を前記検証メモリ部に記憶し、
前記情報処理検証演算記述に基づいて、前記検査対象情報処理を実行するとともに、前記検証メモリ部から読み出した前記変数と、前記変換ビット列記憶部から読みだした変換ビット列とを排他的論理和演算した値を前記検証メモリ部に上書きし、
前記判定記述に基づいて、前記検証メモリ部から読み出した変数の値が、前記ビット列記憶部から読み出した前記型Aのビット列と一致するか否かを判定することにより、前記検証演算記述による排他的論理和演算が実行されたか否かを判定する、
ことを特徴とする情報処理方法。
【請求項13】
予め定められたプログラムの記述に基づいて順に情報処理を実行する情報処理部と、少なくとも0と1とを含む2ビット長以上の第1の固定ビット長である複数の基本ビット列を組み合わせた第2の固定ビット長のビット列のデータ型を型Aとして、前記型Aのビット列の値であって、値が互いに異なるm個の値を、識別子j(j=0,・・・,m−1)と対応づけて、前記型Aのビット列の配列X(j)として記憶するビット列記憶部と、X(k)と排他的論理和演算することでX(l)となるようなビット列の配列Z(k,l)(k,l=0,・・・,m−1)を変換ビット列として記憶する変換ビット列記憶部と、検証用となる変数の値を記憶する検証メモリ部と、を有し、前記予め定められたプログラムは、前記ビット列記憶部に記憶されている前記型Aのある値を前記検証メモリ部に記憶させる事を示す記述である設定記述と、検査対象となる情報処理である検査対象情報処理を実行することを示す記述である情報処理記述と、前記検証メモリ部に記憶されている変数を前記変換ビット列記憶部より読み出した変換ビット列で排他的論理和演算した値を前記検証メモリ部に上書きすることを示す記述である検証演算記述と、前記検証メモリ部に記憶されている変数の値に基づいて前記検証演算記述による排他的論理和演算が実行されたか否かを示す記述である判定記述とを有し、前記情報処理記述およびその後に前記検証演算記述が記述されている記述を情報処理検証演算記述として、前記設定記述の後に、n個の前記情報処理検証演算記述が順に記述され、かつ、前記n個の情報処理検証演算記述の後に前記判定記述が記述されるように予め記述されており、前記設定記述は、前記ビット列記憶部に記憶されている前記型Aの値であるX(p0)(p0は、0〜m−1の間の任意の値の識別子)を前記検証メモリ部に記憶させるように記述されており、前記n個の情報処理検証演算記述のうちi番目の記述の中の検証演算記述には、前記検証メモリ部に記憶されている変数を、前記変換ビット列記憶部より読み出した変換ビット列であるZ(pi−1,pi)(piは0〜m−1の間の任意の識別子)が示す値で排他的論理和演算し、検証メモリ部に上書きするように予め記述されており、前記判定記述には、前記検証メモリ部に記憶されている変数が、X(p0)^Z(p0,p1)^・・・・^Z(pn−1,pn)(^は排他的論理和演算)の値となるX(pn)(pnは0〜m−1の間の任意の識別子)であって、前記ビット列記憶部から読み出したX(pn)の値と一致するか否かを判断するように予め記述されている情報処理装置としてのコンピュータに、
前記設定記述に基づいて、前記ビット列記憶部より読み出した前記型Aのある値を前記検証メモリ部に記憶する手順と、
前記情報処理検証演算記述に基づいて、前記検査対象情報処理を実行するとともに、前記検証メモリ部から読み出した前記変数と、前記変換ビット列記憶部から読みだした変換ビット列とを排他的論理和演算した値を前記検証メモリ部に上書きする手順と、
前記判定記述に基づいて、前記検証メモリ部から読み出した変数の値が、前記ビット列記憶部から読み出した前記型Aのビット列と一致するか否かを判定することにより、前記検証演算記述による排他的論理和演算が実行されたか否かを判定する手順と
を実行させるための情報処理プログラム。
【請求項1】
予め定められたプログラムの記述に基づいて順に情報処理を実行する情報処理部を有する情報処理装置であって、
検証用となる変数の値が記憶される検証メモリ部、を有し、
少なくとも0と1とを含む2ビット長以上の第1の固定ビット長である複数の基本ビット列を組み合わせた第2の固定ビット長のビット列のデータ型を型Aとし、
前記型Aのある値を前記検証メモリ部に記憶させることを示す記述を設定記述とし、
検査対象となる情報処理である検査対象情報処理を実行することを示す記述を情報処理記述とし、
前記検証メモリ部に記憶されている変数をあるビット列で排他的論理和演算して前記検証メモリ部に上書きすることを示す記述を検証演算記述とし、
前記検証メモリ部に記憶されている変数の値に基づいて前記検証演算記述による排他的論理和演算が実行されたか否かを示す記述を判定記述とし、
前記情報処理記述およびその後に前記検証演算記述が記述されている記述を情報処理検証演算記述として、
前記予め定められたプログラムには、
前記設定記述と、
複数のn個の前記情報処理検証演算記述と、
前記判定記述とが、
前記設定記述の後に前記n個の情報処理検証演算記述が順に記述され、かつ、前記n個の情報処理検証演算記述の後に前記判定記述が記述されるように予め記述されており、
前記情報処理部は、
前記設定記述に基づいて、前記型Aのあるビット列aを前記メモリ部に記憶し、
前記n個の情報処理検証演算記述に基づいて、前記検査対象情報処理を実行するとともに、前記検証メモリ部から読み出した前記変数と、前記変数と排他的論理和演算する事で前記型Aのあるビット列となるようなビット列bi(i=1〜n)とを排他的論理和演算して前記検証メモリ部に上書きすることをn回実行し、
前記判定記述により、前記検証メモリ部から読み出した変数の値が
検証値c=a^b1^b2^・・・・^bn(^は、排他的論理和演算)
と一致するか否かを判定する事により、
前記複数の前記情報処理検証演算記述に含まれている検証演算記述による排他的論理和演算が順に実行されたか否かを判定する、
ことを特徴とする情報処理装置。
【請求項2】
前記設定記述に基づき前記検証メモリ部に記憶されているビット列aと、
前記検証値cは、互いにビット反転の関係にある
ことを特徴とする請求項1に記載の情報処理装置。
【請求項3】
予め定められたプログラムの記述に基づいて順に情報処理を実行する情報処理部を有する情報処理装置であって、
少なくとも0と1とを含む2ビット長以上の第1の固定ビット長である複数の基本ビット列を組み合わせた第2の固定ビット長のビット列のデータ型を型Aとし、
前記型Aのビット列の値であって、値が互いに異なるm個の値を、識別子j(j=0,・・・,m−1)と対応づけて、前記型Aのビット列の配列X(j)として記憶するビット列記憶部と、
X(k)と排他的論理和演算することでX(l)となるようなビット列の配列Z(k,l)(k,l=0,・・・,m−1)を変換ビット列として記憶する変換ビット列記憶部と、
検証用となる変数の値を記憶する検証メモリ部と、を有し、
前記予め定められたプログラムは、
前記ビット列記憶部に記憶されている前記型Aのある値を前記検証メモリ部に記憶させる事を示す記述である設定記述と、
検査対象となる情報処理である検査対象情報処理を実行することを示す記述である情報処理記述と、
前記検証メモリ部に記憶されている変数を前記変換ビット列記憶部より読み出した変換ビット列で排他的論理和演算した値を前記検証メモリ部に上書きすることを示す記述である検証演算記述と、
前記検証メモリ部に記憶されている変数の値に基づいて前記検証演算記述による排他的論理和演算が実行されたか否かを示す記述である判定記述とを有し、
前記情報処理記述およびその後に前記検証演算記述が記述されている記述を情報処理検証演算記述として、
前記設定記述の後に、n個の前記情報処理検証演算記述が順に記述され、かつ、前記n個の情報処理検証演算記述の後に前記判定記述が記述されるように予め記述されており、
前記設定記述は、前記ビット列記憶部に記憶されている前記型Aの値であるX(p0)(p0は、0〜m−1の間の任意の値の識別子)を前記検証メモリ部に記憶させるように記述されており、
前記n個の情報処理検証演算記述のうちi番目の記述の中の検証演算記述には、前記検証メモリ部に記憶されている変数を、前記変換ビット列記憶部より読み出した変換ビット列であるZ(pi−1,pi)(piは0〜m−1の間の任意の識別子)が示す値で排他的論理和演算し、検証メモリ部に上書きするように予め記述されており、
前記判定記述には、前記検証メモリ部に記憶されている変数が、X(p0)^Z(p0,p1)^・・・・^Z(pn−1,pn)(^は排他的論理和演算)の値となるX(pn)(pnは0〜m−1の間の任意の識別子)であって、前記ビット列記憶部から読み出したX(pn)の値と一致するか否かを判断するように予め記述されており、
前記情報処理部は、
前記設定記述に基づいて、前記ビット列記憶部より読み出した前記型Aのある値を前記検証メモリ部に記憶し、
前記情報処理検証演算記述に基づいて、前記検査対象情報処理を実行するとともに、前記検証メモリ部から読み出した前記変数と、前記変換ビット列記憶部から読みだした変換ビット列とを排他的論理和演算した値を前記検証メモリ部に上書きし、
前記判定記述に基づいて、前記検証メモリ部から読み出した変数の値が、前記ビット列記憶部から読み出した前記型Aのビット列と一致するか否かを判定することにより、前記検証演算記述による排他的論理和演算が実行されたか否かを判定する
ことを特徴とする情報処理装置。
【請求項4】
前記設定記述に基づいて検証メモリ部に記憶された前記型Aの値と、
前記判定記述に基づいて前記ビット列記憶部より読み出された前記型Aの値とは、互いにビット反転の関係にある
ことを特徴とする請求項3記載の情報処理装置。
【請求項5】
前記予め定められたプログラムには、少なくとも
前記設定記述と、
ループ処理を実行することを示す記述とともに、該記述されているループ処理が実行される場合に、該実行されているループ処理内で前記情報処理検証演算記述を実行する事を示す記述であるループ処理記述と、
前記判定記述とが、
前記設定記述の後に前記ループ処理記述が記述され、かつ、前記ループ処理記述の後に前記判定記述が記述されるように予め記述されており、
前記設定記述には、値0の識別子で対応づけられるX(0)の値を前記検証メモリ部に記憶させるように記述されており、
前記ループ処理記述中の検証演算記述には、前記検証メモリ部に記憶されている変数を、前記変換ビット列記憶部より読み出した変換ビット列であるZ(i−1,i)(iはループ内i番目に処理される回数値)が示すビット列の値で排他的論理和演算し、前記検証メモリ部に上書きするように予め記述されており、
前記判定記述には、前記検証メモリ部に記憶されている変数が、前記ビット列記憶部から読み出したX(n)(n=1〜mであり、ループ回数)の値と一致するか否かを判断するように予め記述されており、
前記情報処理部は、
前記設定記述に基づいて、前記ビット列記憶部より読み出した前記型Aのある値を前記検証メモリ部に記憶し、
前記情報処理検証演算記述に基づいて、前記検査対象情報処理を実行するとともに、前記検証メモリ部から読み出した前記変数と、前記変換ビット列記憶部から読みだした変換ビット列とを排他的論理和演算した値を前記検証メモリ部に上書きし、
前記判定記述に基づいて、前記検証メモリ部から読み出した変数の値が、前記ビット列記憶部から読み出した前記型Aのビット列と一致するか否かを判定することにより、前記検証演算記述による排他的論理和演算が実行されたか否かを判定する
ことを特徴とする請求項3又は請求項4に記載の情報処理装置。
【請求項6】
前記予め定められたプログラムには、
下位モジュールを呼び出し、前記検証メモリ部に記憶されている変数を前記下位モジュールに渡すとともに、前記下位モジュールからの返却値を取得する記述であるモジュール呼び出し記述と、
前記モジュール呼び出し記述で呼び出した下位モジュールからの返却値が、前記下位モジュールが記述順通りに実行された場合に返却されるビット列であるか否かを検証することを示す返却値判定記述とが、
前記モジュール呼出記述の後に前記返却値判定記述が記述されるように予め記述されており、
前記情報処理部は、
前記モジュール呼出記述に基づいて下位モジュールを呼出し、前記検証メモリ部に記憶されている変数を前記下位モジュールに渡すとともに、前記下位モジュールからの返却値を取得し、
前記返却値判定記述に基づいて、前記モジュール呼出し記述で呼出した下位モジュールからの返却値が、前記下位モジュールが記述順通りに実行された場合に返却されるビット列であるか否かを検証する、
ことを特徴とする請求項3から請求項5のいずれかに記載の情報処理装置。
【請求項7】
前記情報処理装置は、
モジュール内検証メモリ部を有し、
前記モジュール呼出し記述に基づいて呼出される下位モジュールのプログラムは、
自モジュールを呼出した上位モジュールより渡された変数を、前記変換ビット列記憶部より読み出した変換ビット列で排他的論理和演算して前記モジュール内検証メモリ部に記憶する事を示す記述であるモジュール内設定記述と、
自モジュール内における検査対象となる情報処理であるモジュール内検査対象情報処理を実行する事を示す記述であるモジュール内情報処理記述と、
前記モジュール内検証メモリ部に記憶されている変数を前記変換ビット列記憶部より読み出した変換ビット列で排他的論理和演算した値を前記モジュール内検証メモリ部に上書きする事を示す記述であるモジュール内検証演算記述と、
前記モジュール内検証メモリ部に記憶されている変数の値を、前記上位モジュールに返却値として返却することを示す返却記述とを有し、
前記モジュール内情報処理記述およびその後に前記モジュール内検証演算記述が記述されている記述をモジュール内情報処理検証演算記述として、
前記モジュール内設定記述の後に前記モジュール内情報処理検証演算記述が記述され、かつ、前記モジュール内情報処理検証演算記述の後に返却記述が記述されるように記述されており、
前記情報処理部は、
前記モジュール内設定記述に基づいて、自モジュールを呼出した上位モジュールより渡された変数を前記変換ビット列記憶部より読み出した変換ビット列で排他的論理和演算した値を前記モジュール内検証メモリ部に記憶し、
前記モジュール内情報処理検証演算記述に基づいて、前記モジュール内検査対象情報処理を実行するとともに、前記モジュール内検証メモリ部から読み出した前記変数と、前記変換ビット列記憶部から読み出した変換ビット列とを排他的論理和演算した値を前記モジュール内検証メモリ部に上書きし、
前記返却記述に基づいて、前記モジュール内検証メモリ部に記憶されている変数の値を、前記上位モジュールに返却値として返却する、
ことを特徴とする請求項6に記載の情報処理装置。
【請求項8】
前記モジュール内設定記述に基づき、前記モジュール内検証メモリ部に記憶される前記上位モジュールより渡された変数と、
前記返却記述に基づき、前記上位モジュールに返却される返却値とは、互いにビット反転の関係になるように予め設定されている、
ことを特徴とする請求項7記載の情報処理装置。
【請求項9】
前記検査対象情報処理による情報処理をするプログラムの記述において、
2値の値をとる2つの内部変数として、少なくとも0と1とを含む2ビット長以上の第3の固定ビット長である複数の基本ビット列を組み合わせた第4の固定ビット長の変数である2つの変数であって、互いにビット反転の関係にある2つの変数を用いる、
ことを特徴とする請求項3から請求項8のいずれかに記載の情報処理装置。
【請求項10】
予め定められたプログラムの記述に基づいて順に情報処理を実行する情報処理部を有する情報処理装置であって、
少なくとも0と1とを含む2ビット長以上の第1の固定ビット長である複数の基本ビット列を組み合わせた第2の固定ビット長のビット列のデータ型を型Aとし、
前記型Aのある値を変換前ビット列として記憶する変換前ビット列記憶部と、
前記型Aのある値であって、前記変換前ビット列とは値が異なるある値を変換後ビット列として記憶する変換後ビット列記憶部と、
前記変換前ビット列と排他的論理和演算することにより前記変換後ビット列に変換させる変換ビット列を記憶する変換ビット列記憶部と、
検証用となる変数の値を記憶する検証メモリ部と、を有し、
前記予め定められたプログラムには少なくとも、
前記変換前ビット列記憶部に記憶されている変換前ビット列を読み出し前記検証メモリ部に記憶させる事を示す記述である設定記述と、
検査対象となる情報処理である検査対象情報処理を実行することを示す記述である情報処理記述と、
前記検証メモリ部に記憶されている変数を前記変換ビット列記憶部より読み出した変換ビット列で排他的論理和演算した値を前記検証メモリ部に上書きすることを示す記述である検証演算記述と、
前記検証メモリ部に記憶されている変数の値に基づいて前記検証演算記述による排他的論理和演算が実行されたか否かを示す記述である判定記述とが、
前記設定記述の後に前記情報処理記述が記述され、前記情報処理記述の後に検証演算記述が記述され、かつ、前記検証処理記述の後に前記判定記述が記述されるように予め記述されており、
前記情報処理部は、
前記設定記述に基づいて、変換前ビット列を前記変換前ビット列記憶部から読み出して前記検証メモリ部に記憶し、
前記情報処理記述に基づいて、前記検査対象情報処理を実行し、
前記検証演算記述に基づいて、前記検証メモリから読み出した変数と、前記変換ビット列記憶部から読み出した変換ビット列とを排他的論理和演算して前記検証メモリ部に上書きし、
前記判定記述により、前記検証メモリ部から読み出した変数の値が、前記変換後ビット列記憶部より読み出した前記変換後ビット列と一致するか否かを判定する事により、前記検証演算記述による排他的論理和演算が実行されたか否かを判定する
ことを特徴とする情報処理装置。
【請求項11】
前記設定記述に基づいて検証メモリ部に記憶された前記変換前ビット列と、
前記判定記述に基づいて前記変換後ビット列記憶部より読み出された前記変換後ビット列とは、互いにビット反転の関係にある
ことを特徴とする請求項10記載の情報処理装置。
【請求項12】
予め定められたプログラムの記述に基づいて順に情報処理を実行する情報処理部と、少なくとも0と1とを含む2ビット長以上の第1の固定ビット長である複数の基本ビット列を組み合わせた第2の固定ビット長のビット列のデータ型を型Aとして、前記型Aのビット列の値であって、値が互いに異なるm個の値を、識別子j(j=0,・・・,m−1)と対応づけて、前記型Aのビット列の配列X(j)として記憶するビット列記憶部と、X(k)と排他的論理和演算することでX(l)となるようなビット列の配列Z(k,l)(k,l=0,・・・,m−1)を変換ビット列として記憶する変換ビット列記憶部と、検証用となる変数の値を記憶する検証メモリ部と、を有し、前記予め定められたプログラムは、前記ビット列記憶部に記憶されている前記型Aのある値を前記検証メモリ部に記憶させる事を示す記述である設定記述と、検査対象となる情報処理である検査対象情報処理を実行することを示す記述である情報処理記述と、前記検証メモリ部に記憶されている変数を前記変換ビット列記憶部より読み出した変換ビット列で排他的論理和演算した値を前記検証メモリ部に上書きすることを示す記述である検証演算記述と、前記検証メモリ部に記憶されている変数の値に基づいて前記検証演算記述による排他的論理和演算が実行されたか否かを示す記述である判定記述とを有し、前記情報処理記述およびその後に前記検証演算記述が記述されている記述を情報処理検証演算記述として、前記設定記述の後に、n個の前記情報処理検証演算記述が順に記述され、かつ、前記n個の情報処理検証演算記述の後に前記判定記述が記述されるように予め記述されており、前記設定記述は、前記ビット列記憶部に記憶されている前記型Aの値であるX(p0)(p0は、0〜m−1の間の任意の値の識別子)を前記検証メモリ部に記憶させるように記述されており、前記n個の情報処理検証演算記述のうちi番目の記述の中の検証演算記述には、前記検証メモリ部に記憶されている変数を、前記変換ビット列記憶部より読み出した変換ビット列であるZ(pi−1,pi)(piは0〜m−1の間の任意の識別子)が示す値で排他的論理和演算し、検証メモリ部に上書きするように予め記述されており、前記判定記述には、前記検証メモリ部に記憶されている変数が、X(p0)^Z(p0,p1)^・・・・^Z(pn−1,pn)(^は排他的論理和演算)の値となるX(pn)(pnは0〜m−1の間の任意の識別子)であって、前記ビット列記憶部から読み出したX(pn)の値と一致するか否かを判断するように予め記述されている情報処理装置において用いられる情報処理であって、
前記情報処理部は、
前記設定記述に基づいて、前記ビット列記憶部より読み出した前記型Aのある値を前記検証メモリ部に記憶し、
前記情報処理検証演算記述に基づいて、前記検査対象情報処理を実行するとともに、前記検証メモリ部から読み出した前記変数と、前記変換ビット列記憶部から読みだした変換ビット列とを排他的論理和演算した値を前記検証メモリ部に上書きし、
前記判定記述に基づいて、前記検証メモリ部から読み出した変数の値が、前記ビット列記憶部から読み出した前記型Aのビット列と一致するか否かを判定することにより、前記検証演算記述による排他的論理和演算が実行されたか否かを判定する、
ことを特徴とする情報処理方法。
【請求項13】
予め定められたプログラムの記述に基づいて順に情報処理を実行する情報処理部と、少なくとも0と1とを含む2ビット長以上の第1の固定ビット長である複数の基本ビット列を組み合わせた第2の固定ビット長のビット列のデータ型を型Aとして、前記型Aのビット列の値であって、値が互いに異なるm個の値を、識別子j(j=0,・・・,m−1)と対応づけて、前記型Aのビット列の配列X(j)として記憶するビット列記憶部と、X(k)と排他的論理和演算することでX(l)となるようなビット列の配列Z(k,l)(k,l=0,・・・,m−1)を変換ビット列として記憶する変換ビット列記憶部と、検証用となる変数の値を記憶する検証メモリ部と、を有し、前記予め定められたプログラムは、前記ビット列記憶部に記憶されている前記型Aのある値を前記検証メモリ部に記憶させる事を示す記述である設定記述と、検査対象となる情報処理である検査対象情報処理を実行することを示す記述である情報処理記述と、前記検証メモリ部に記憶されている変数を前記変換ビット列記憶部より読み出した変換ビット列で排他的論理和演算した値を前記検証メモリ部に上書きすることを示す記述である検証演算記述と、前記検証メモリ部に記憶されている変数の値に基づいて前記検証演算記述による排他的論理和演算が実行されたか否かを示す記述である判定記述とを有し、前記情報処理記述およびその後に前記検証演算記述が記述されている記述を情報処理検証演算記述として、前記設定記述の後に、n個の前記情報処理検証演算記述が順に記述され、かつ、前記n個の情報処理検証演算記述の後に前記判定記述が記述されるように予め記述されており、前記設定記述は、前記ビット列記憶部に記憶されている前記型Aの値であるX(p0)(p0は、0〜m−1の間の任意の値の識別子)を前記検証メモリ部に記憶させるように記述されており、前記n個の情報処理検証演算記述のうちi番目の記述の中の検証演算記述には、前記検証メモリ部に記憶されている変数を、前記変換ビット列記憶部より読み出した変換ビット列であるZ(pi−1,pi)(piは0〜m−1の間の任意の識別子)が示す値で排他的論理和演算し、検証メモリ部に上書きするように予め記述されており、前記判定記述には、前記検証メモリ部に記憶されている変数が、X(p0)^Z(p0,p1)^・・・・^Z(pn−1,pn)(^は排他的論理和演算)の値となるX(pn)(pnは0〜m−1の間の任意の識別子)であって、前記ビット列記憶部から読み出したX(pn)の値と一致するか否かを判断するように予め記述されている情報処理装置としてのコンピュータに、
前記設定記述に基づいて、前記ビット列記憶部より読み出した前記型Aのある値を前記検証メモリ部に記憶する手順と、
前記情報処理検証演算記述に基づいて、前記検査対象情報処理を実行するとともに、前記検証メモリ部から読み出した前記変数と、前記変換ビット列記憶部から読みだした変換ビット列とを排他的論理和演算した値を前記検証メモリ部に上書きする手順と、
前記判定記述に基づいて、前記検証メモリ部から読み出した変数の値が、前記ビット列記憶部から読み出した前記型Aのビット列と一致するか否かを判定することにより、前記検証演算記述による排他的論理和演算が実行されたか否かを判定する手順と
を実行させるための情報処理プログラム。
【図1】
【図2】
【図3】
【図4】
【図5】
【図6】
【図7】
【図8】
【図9】
【図10】
【図2】
【図3】
【図4】
【図5】
【図6】
【図7】
【図8】
【図9】
【図10】
【公開番号】特開2009−245336(P2009−245336A)
【公開日】平成21年10月22日(2009.10.22)
【国際特許分類】
【出願番号】特願2008−93316(P2008−93316)
【出願日】平成20年3月31日(2008.3.31)
【出願人】(000102728)株式会社エヌ・ティ・ティ・データ (438)
【Fターム(参考)】
【公開日】平成21年10月22日(2009.10.22)
【国際特許分類】
【出願日】平成20年3月31日(2008.3.31)
【出願人】(000102728)株式会社エヌ・ティ・ティ・データ (438)
【Fターム(参考)】
[ Back to top ]