(57)【特許請求の範囲】
【請求項１】
第１の関数を用いた所定の処理の実行手順を示す実行処理手順情報を有するプログラムを受け付けるプログラム受付部と、
前記プログラム受付部により受け付けられたプログラムを記憶するプログラム記憶部と、
第１の関数の各入力変数及び各出力変数に代入されるデータが保護されたメモリ領域に記憶されるか又は非保護のメモリ領域に記憶させるかを示す保護属性情報を有する１以上の第１の関数型情報を記憶する第１の関数型記憶部と、
前記第１の関数型情報とプログラムに含まれる第１の関数の情報である第１の実関数情報に基づいて、第１の実関数情報に対応する第１の関数型情報である第１の実関数型情報を抽出する関数型抽出部と、
前記第１の実関数型情報を記憶する第２の関数型記憶部と、
第１の関数を用いた特定処理の実行手順を示す特定処理手順情報と、前記特定処理の手順が実行される場合に特定処理の手順で実行される第１の関数の関数型情報を代替できる情報である、１以上の第１の関数型情報とが対応付けられた代替関数型情報を記憶する第１の代替関数型記憶部と、 
前記第１の代替関数型情報と、前記第１の実関数情報に基づいて、第１の実関数情報に対応する代替関数型情報である第２の代替関数型情報を抽出する代替関数型抽出部と、
前記代替関数型抽出部により抽出された第２の代替関数型情報を記憶する第２の代替関数型記憶部と、
前記第２の代替関数型記憶部に記憶された第２の代替関数型情報を選択取得する選択部と、
前記選択部により選択された第２の代替関数型情報に対応付けられた特定処理手順情報が、前記プログラム記憶部に記憶されたプログラムが有する実行処理手順情報に含まれるか否かを判定する判定部と、
前記判定部の結果に応じて、前記選択部により選択された第２の代替関数型情報に対応付けられた第１の実関数型情報を用いて、第２の関数型記憶部に記憶される第１の実関数型情報を更新する関数型更新部と
プログラム記憶部に記憶されたプログラム中のすべての第１の実関数について、第１の実関数の全入出力変数の保護属性情報と、第２の関数型記憶部に記憶された第１の実関数型情報のいずれか１つに含まれる保護属性情報とが一致する場合に、一致した保護属性情報を各変数の保護属性情報に決定する保護属性決定手段と
を備えることを特徴とする情報処理装置。
【請求項２】
前記第１の関数は、セキュリティ関数であり、
前記セキュリティ関数は、計算量的一方向性の性質を有する処理を行う関数であるか、または入力変数の値の完全性の検証処理を行う関数であるか、または関数の入力変数および出力変数が異なる保護属性をとり得る関数であり、
前記計算量的一方向性の性質は、入力変数および出力変数の全体集合のある部分集合が存在して、その部分集合に属する変数の値から、部分集合に属さない変数の値を求めることが現実的な時間ではできない性質であり、
前記完全性は、値が改ざんされていないという性質である
を特徴とする請求項１記載の情報処理装置。
【請求項３】
前記プログラムは、さらに第２の関数を用いた所定の処理の実行手順を示す実行処理手順情報を有し、
前記第１の関数型記憶部は、更に、第２の関数の入力変数及び出力変数がすべて同じ保護属性となるよう規定された第２の関数型情報を、第２の関数毎に１つ以上記憶し、
前記関数型抽出部は、更に、前記第２の関数型情報と前記プログラムに含まれる第２の実関数情報に基づいて、第２の実関数情報に対応する第２の関数型情報である第２の実関数型情報を抽出し、
前記保護属性決定手段は、プログラム記憶部に記憶されたプログラム中のすべての第１の実関数および第２の実関数について、前記第１の実関数および第２の実関数の全入出力変数の保護属性情報と、第２の関数型記憶部に記憶された第１の実関数型情報および第２の実関数型情報のいずれか１つに含まれる保護属性とが一致する場合に、一致した保護属性情報を各変数の保護属性情報に決定する
ことを特徴とする請求項２に記載の情報処理装置。
【請求項４】
コンピュータに
第１の関数を用いた所定の処理の実行手順を示す実行処理手順情報を有するプログラムを受け付けるプログラム受付部と、
前記プログラム受付部により受け付けられたプログラムを記憶するプログラム記憶部と、
第１の関数の各入力変数及び各出力変数に代入されるデータが保護されたメモリ領域に記憶されるか又は非保護のメモリ領域に記憶させるかを示す保護属性情報を有する１以上の第１の関数型情報を記憶する第１の関数型記憶部と、
前記第１の関数型情報とプログラムに含まれる第１の関数の情報である第１の実関数情報に基づいて、第１の実関数情報に対応する第１の関数型情報である第１の実関数型情報を抽出する関数型抽出部と、
前記第１の実関数型情報を記憶する第２の関数型記憶部と、
第１の関数を用いた特定処理の実行手順を示す特定処理手順情報と、前記特定処理手順が実行される場合に特定処理手順で実行される第１の関数の関数型情報を代替できる情報である、１以上の関数型情報とが対応付けられた代替関数型情報を記憶する第１の代替関数型記憶部と、 
前記代替関数型情報と、前記第１の実関数情報に基づいて、第１の実関数情報に対応する代替関数型情報である第２の代替関数型情報を抽出する代替関数型抽出部と、
前記代替関数型抽出部により抽出された第２の代替関数型情報を記憶する第２の代替関数型記憶部と、
前記第２の代替関数型記憶部に記憶された第２の代替関数型情報を選択取得する選択部と、
前記選択部により選択された第２の代替関数型情報に対応付けられた特定処理手順情報が、前記プログラム記憶部に記憶されたプログラムが有する実行処理手順情報に含まれるか否かを判定する判定部と、
前記判定部の結果に応じて、前記選択部により選択された代替関数型情報に対応付けられた関数型情報を用いて、第２の関数型記憶部に記憶される第１の実関数型情報を更新する関数型更新部と、
プログラム記憶部に記憶されたプログラム中のすべての第１の実関数について、第１の実関数の全入出力変数の保護属性情報と、第２の関数型記憶部に記憶された第１の実関数型情報のいずれか１つに含まれる保護属性情報とが一致する場合に、一致した保護属性情報を各変数の保護属性情報に決定する保護属性決定部と
を実現させるための情報処理プログラム。
【請求項５】
前記第１の関数は、セキュリティ関数であり、
前記セキュリティ関数は、計算量的一方向性の性質を有する処理を行う関数であるか、または入力変数の値の完全性の検証処理を行う関数であるか、または関数の入力変数および出力変数が異なる保護属性をとり得る関数であり、
前記計算量的一方向性の性質は、入力変数および出力変数の全体集合のある部分集合が存在して、その部分集合に属する変数の値から、部分集合に属さない変数の値を求めることが現実的な時間ではできない性質であり、
前記完全性は、値が改ざんされていないという性質である
を特徴とする請求項４記載の情報処理プログラム。
【請求項６】
前記プログラムは、さらに第２の関数を用いた所定の処理の実行手順を示す実行処理手順情報を有し、
前記第１の関数型記憶部は、更に、第２の関数の入力変数及び出力変数がすべて同じ保護属性となるよう規定された第２の関数型情報を、第２の関数毎に１つ以上記憶し、
前記関数型抽出部は、更に、前記第２の関数型情報と前記プログラムに含まれる第２の実関数情報に基づいて、第２の実関数情報に対応する第２の関数型情報である第２の実関数型情報を抽出し、
前記保護属性決定手段は、プログラム記憶部に記憶されたプログラム中のすべての第１の実関数および第２の実関数について、前記第１の実関数および第２の実関数の全入出力変数の保護属性情報と、第２の関数型記憶部に記憶された第１の実関数型情報および第２の実関数型情報のいずれか１つに含まれる保護属性とが一致する場合に、一致した保護属性情報を各変数の保護属性情報に決定する
ことを特徴とする請求項５に記載の情報処理プログラム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明の実施形態は、プログラムの変数等の属性を決定する技術に関する。
【背景技術】
【０００２】
従来、セキュリティプロトコルの安全な実装のためには、プログラムの各変数に対してデータの保護の要否を適切に決定する必要がある。そのため、セキュリティプロトコルに含まれる暗号、署名、ハッシュ関数等のセキュリティ関数に注目した保護属性決定方式がある。この方式では、各セキュリティ関数について、計算量的一方向性と完全性の保証との有無に基づいて入出力変数の値を保護されたメモリ領域又は非保護のメモリ領域に記憶させることを要求する保護属性が定義されており、この条件からプログラムの各変数の保護属性を決定する。また、外部から送信された値もしくは外部と共有した値を暗号鍵として利用するようなセキュリティプロトコルについて、保護属性を決定している。
【先行技術文献】
【特許文献】
【０００３】
【特許文献１】特開２００４−２４０５３６号公報
【特許文献２】特開２００９−１２９２０６号公報
【非特許文献】
【０００４】
【非特許文献１】“Cryptographically-masked Flows”、 Askarov et．Al． 2006)
【非特許文献２】“敵対的なOSからソフトウェアを保護するプロセッサアーキテクチャ”、橋本他、情報処理学会論文誌、 Vol．45、No．SIG03
【発明の概要】
【発明が解決しようとする課題】
【０００５】
しかしながら、この方式では、変数の値がどの関数から出力され（いくつかの処理を経て）どの関数に入力されたかという処理手順（処理経路）情報は考慮していない。
【０００６】
本発明の一観点は、上述に鑑みてなされたものであって、セキュリティプロトコルに従ったプログラムの各変数に対して保護属性を適切に決定することが可能な情報処理装置、情報処理プログラムを提供することを目的とする。
【課題を解決するための手段】
【０００７】
上記目的を達成するために、本発明の一実施形態に係る情報処理装置は、第１の関数を用いた所定の処理の実行手順を示す実行処理手順情報を有するプログラムを受け付け、受け付けられたプログラムはプログラム記憶部に記憶する。情報処理装置の第１の関数型記憶部は、第１の関数の各入力変数及び各出力変数に代入されるデータが保護されたメモリ領域に記憶されるか又は非保護のメモリ領域に記憶されるかを示す保護属性情報を有する１以上の第１の関数型情報を記憶する。情報処理装置の関数型抽出部は、第１の関数型情報とプログラムに含まれる第１の関数の情報である第１の実関数情報に基づいて、第１の実関数情報に対応する第１の関数型情報である第１の実関数型情報を抽出する。情報処理装置の第２の関数型記憶部は、第１の実関数型情報を記憶し、第１の代替関数型記憶部は、第１の関数を用いた特定処理の実行手順を示す特定処理手順情報と、特定処理手順が実行される場合に特定処理手順で実行される第１の関数の関数型情報を代替できる情報である、１以上の第１の関数型情報とが対応付けられた代替関数型情報を記憶する。情報処理装置の代替関数型抽出部は、第１の代替関数型情報と、第１の実関数情報に基づいて、第１の実関数情報に対応する代替関数型情報である第２の代替関数型情報を抽出する。情報処理装置の第２の代替関数型記憶部は、代替関数型抽出部により抽出された第２の代替関数型情報を記憶し、選択部は、第２の代替関数型記憶部に記憶された第２の代替関数型情報を選択取得する。情報処理装置の判定部は、選択部により選択された第２の代替関数型情報に対応付けられた特定処理手順情報が、プログラム記憶部に記憶されたプログラムが有する実行処理手順情報に含まれるか否かを判定する。情報処理装置の関数型更新部は、判定部の結果に応じて、選択部により選択された第２の代替関数型情報に対応付けられた第１の実関数型情報を用いて、第２の関数型記憶部に記憶される第１の実関数型情報を更新する。情報処理装置の保護属性決定部は、プログラム記憶部に記憶されたプログラム中のすべての第１の実関数について、第１の実関数の全入出力変数の保護属性情報と、第２の関数型記憶部に記憶された第１の実関数型情報のいずれか１つに含まれる保護属性情報とが一致する場合に、一致した保護属性情報を各変数の保護属性情報に決定する。
【図面の簡単な説明】
【０００８】
【図１】第１の実施形態のターゲットシステムの構成の例を示す図。
【図２】第１の実施形態のセキュリティプロトコルのシーケンスの例を示す図。
【図３】第１の実施形態の情報処理装置１の構成の例を示す図。
【図４】第１の実施形態のターゲットプログラムの例を示す図。
【図５】第１の実施形態の保護属性定義情報の例を示す図。
【図６】第１の実施形態のセキュリティ関数の関数型情報を示す図。
【図７】第１の実施形態の開発の作業手順の例を示す図。
【図８】第１の実施形態の署名検証関数の処理手順および実装の例を示す図。
【図９】第１の実施形態の非セキュリティ関数の関数型情報を示す図。
【図１０】第１の実施形態のターゲットプログラムの実関数型情報の例を示す図。
【図１１】第１の実施形態の代替関数型情報の例を示す図。
【図１２】第１の実施形態の特定処理手順のデータフローの例を示す図。
【図１３】第１の実施形態のターゲットプログラムの代替実関数型情報の例を示す図。
【図１４】第１の実施形態のターゲットプログラムのデータフローの例を示す図。
【図１５】第１の実施形態のターゲットプログラムの部分データフローのテーブル表現の例を示す図。
【図１６】第１の実施形態の変数と保護属性の対応付けた情報の例を示す図。
【図１７】第１の実施形態の保護属性決定処理のフローの例を示す図。
【図１８】第１の実施形態の基本保護属性処理のフローの例を示す図。
【図１９】第１の実施形態の保護属性決定テーブルの例を示す図。
【図２０】第１の実施形態の保護属性の決定処理フローの例を示す図。
【図２１】第１の実施形態の更新された実関数型情報の例を示す図。
【図２２】第１の実施形態の実関数型情報更新後の初期状態の保護属性決定テーブルの例を示す図。
【図２３】第１の実施形態の保護属性決定テーブルの更新の例を示す図。
【図２４】第１の実施形態のスマートグリッドに適用した例を示す図。
【図２５】第２の実施形態の保護属性決定処理のプログラム開発フローの例を示す図。
【図２６】第２の実施形態のターゲットプログラムを書き換えた例を示す図。
【発明を実施するための形態】
【０００９】
以下に添付図面を参照して、本発明にかかる第１の実施形態を説明する。
【００１０】
（第１の実施形態）
（１）構成
まず、本実施形態にかかるセキュリティプロトコルに従ったプログラムが実行される、ターゲットシステム１０１について説明する。図１は、ターゲットシステム１０１の構成を示す図である。ターゲットシステム１０１は、ネットワーク１０２を介して外部装置１０３と接続されている。ターゲットシステム１０１は、プログラム実行装置２０１と、ＯＳ（Operating System）３０１とを備えている。
【００１１】
プログラム実行装置２０１は、命令実行部２１２と記憶部２１１を有する。
【００１２】
記憶部２１１は、データ記憶用メモリ領域を有する。データ記憶用メモリ領域は、非保護メモリ領域２１４と、保護メモリ領域２１５とを有している。非保護メモリ領域２１４は、アクセスに対して何等制限を設けていない非セキュアな記憶領域である。一方、保護メモリ領域２１５は、特定のプログラムやプロセス等からのアクセスに対してアクセス制限を設けたセキュアな記憶領域である。なお、非保護メモリ領域２１４と保護メモリ領域２１５とは、同一の記憶媒体に形成されている態様としてもよいし、個別の記憶媒体で形成される態様としてもよい。また、このような特定のプログラムやプロセスに対する排他的なアクセス制御の実現は、公知の技術を用いることが可能である。
【００１３】
命令実行部２１２は、プログラムの実行主体となるＣＰＵ（Central Processing Unit）等の制御部と、プログラム実行時に一時的にデータを記憶するためのレジスタ２１３を有している。命令実行部２１２は、入出力データをデータ記憶用メモリ領域のうち非保護メモリ領域２１４へのデータ読み書きを通じて行う。尚、プログラム実行装置２０１に入力されるデータについての書き込みとプログラム実行装置２０１から出力されるデータの読み出しを行うのはＯＳ３０１である。しかし、非保護メモリ領域２１４へのアクセスは必ずしもＯＳ３０１に限定せず、ＯＳ３０１管理下の周辺装置によるＤＭＡ（Direct Memory Access）転送等によるものも含まれる。
【００１４】
ＯＳ３０１は、ターゲットシステム１０１の基本ソフトウェアの実行主体となるＣＰＵ等の制御部であって、非保護メモリ領域２１４にアクセスを行い、入力データ（例えば、外部装置１０３からネットワーク１０２を通じて入力されたデータ）の書き込みと、出力データ（例えば、ネットワーク１０２を通じ外部装置１０３に出力するデータ）の読み出しを行う。このＯＳ３０１は、データ記憶用メモリ領域のうち、非保護メモリ領域２１４には任意のタイミング読み書きが可能であるが、保護メモリ領域２１５に対してはアクセスが制限され読み書きが禁止されるものとする。このような特定のプログラムあるいはプロセスに対してアクセスを制限する排他的アクセス機構は従来から知られている技術である。
【００１５】
注意すべきことは、プログラム実行装置２０１にとってＯＳ３０１は、入力データや出力データや非保護メモリ領域２１４に記憶されたデータに対する盗聴や改ざん(以下これらを総称して攻撃と呼ぶ)を行う可能性があることが本実施の形態における前提である。プログラム実行装置２０１がネットワーク１０２を介して外部装置１０３と通信を行うとき、ＯＳ３０１と非保護メモリ領域２１４とは盗聴やメッセージの改ざんがありうるという点で、ネットワーク１０２の延長と考えることができる。このようなシステムにおいて、プログラム実行装置２０１が行うデータ処理の安全性を確保するには、２種類のメモリ（非保護メモリ領域２１４及び保護メモリ領域２１５）へデータを適切に振り分けることが重要である。図１においては、ＯＳ３０１による盗聴や改ざんが禁止された範囲は命令実行部２１２と保護メモリ領域２１５とを含む範囲である。
【００１６】
尚、本実施形態では、プログラム実行装置２０１は命令の実行については安全であることを仮定する。これは命令及び関数呼び出しや復帰アドレス等が記憶されるメモリ領域（図示せず）を、従来知られた手法によってＯＳ３０１による攻撃から保護することで実現可能であるからである。しかし、それ以外の実現手段によりこのメモリ領域を保護するようにしても差し支えなく、ターゲットシステム１０１の構成は図１に示した形態に限定されるものではない。
【００１７】
また、プログラム実行装置２０１における命令実行部２１２の制御部と、ＯＳ３０１とは、同一の制御部としてもよいし、それぞれの用途に特化した個別の制御部としてもよい。また、非保護メモリ領域２１４と、保護メモリ領域２１５とを同一の記憶デバイス内に設けた態様としても良いし、それぞれを個別の記憶デバイスに設けた態様としても良い。
【００１８】
次に、本実施形態の説明に利用するセキュリティプロトコルのシーケンスについて図２を用いて説明する。図２では、図１に示す外部装置１０３で動作するシステムＢ２１０１と、図１に示すプログラム実行装置２０１により実現されるシステムＡ２２０１とがチャレンジアンドレスポンスプロトコルにより認証を行う例が示されている。ここで、システムＢ２１０１がＯＳを含むシステム全体を表すのに対し、本実施形態にかかる後述の保護属性決定処理が行われる対象となるシステムＡ２２０１は、プログラム実行装置（図１の２０１）に限定されていることに注意されたい。以下の説明ではシステムＡ２２０１の実装における安全性に注目した説明を行い、システムＢ２１０１の内部の動作についての説明は行わない。
【００１９】
まずセキュリティプロトコルの実行に先立って、システムＢ２１０１はシステムＡ２２０１の公開鍵（pkA）２１１３を予め取得しておく。システムＢ２１０１はCA (Certificate Authority)等が発行した証明書により公開鍵（pkA）２１１３の完全性を別途検証するが、図では省略されている。また、システムＡ２２０１を実現させるプログラム実行装置２０１（のデータ格納用メモリ領域）には、自身に割り当てられた秘密鍵（skA）２２１３が静的に予め埋め込まれる（記憶される）。
【００２０】
システムＢ２１０１は、乱数生成関数２１１１で乱数(rB)２１１２を生成し、システムＡ２２０１に送信する(２４０１)。同様に、システムＡ２２０１は、乱数生成関数２２１１で乱数(rA)２２１２を生成し、これをシステムＢ２１０１に送信する(２４０２)。さらにシステムＡ２２０１は、システムＡが生成した乱数(rA)２２１２、システムＢ２１０１から２４０１で送られてきた乱数（rB）、秘密鍵(skA)２２１３を署名生成関数２２１４に入力して署名(sign)２２１５を生成し、署名をシステムＢ２１０１に送信する（２４０３）。システムＢ２１０１は、システムＡ２２０１から２４０２で送られてきた乱数(rA)、自分で生成した乱数(rB)２１１２、システムＡ２２０１の公開鍵（pkA）２１１３、およびシステムＡ２２０１から２４０３で送られてきた署名(sign)を署名検証関数２１１４に入力し、署名検証を行う。 
次に、以上のようなターゲットシステム１０１において動作するプログラム実行装置２０１を例として、プログラムで用いる関数に対して保護属性を自動で決定する情報処理装置について説明する。まず、当該情報処理装置のハードウェア構成について説明する。本実施の形態の情報処理装置は、装置全体を制御するＣＰＵ（Central Processing Unit）等の制御装置と、各種データや各種プログラムを記憶するＲＯＭ（Read Only Memory）やＲＡＭ（Random Access Memory）等の記憶装置と、各種データや各種プログラムを記憶するＨＤＤ（Hard Disk Drive）やＣＤ（Compact Disk）ドライブ装置等の外部記憶装置と、これらを接続するバスとを備えており、通常のコンピュータを利用したハードウェア構成となっている。また、情報処理装置には、情報を表示する表示装置と、ユーザの指示入力を受け付けるキーボードやマウス等の入力装置と、外部装置の通信を制御する通信Ｉ／Ｆ（interface）とが有線又は無線により各々接続される。
【００２１】
このようなハードウェア構成において、情報処理装置の有するＣＰＵが記憶装置や外部記憶装置に記憶された各種プログラムを実行することにより実現される各種機能について説明する。
【００２２】
図３は、本実施形態にかかる情報処理装置１の構成の例を示す図である。情報処理装置１は、プログラム受付部２０、関数型抽出部２３、代替関数型抽出部２７、部分データフロー変換部２９、選択部３０、判定部３１、更新部３２、保護属性決定部３３、復元部３５と、プログラム記憶部２１、第１の関数型記憶部２２、第２の関数型記憶部２４、一時記憶部２５、第１の代替関数型記憶部２６、第２の代替関数型記憶部２８、保護属性決定テーブル記憶部３４とを有する。これらは、ＣＰＵのプログラム実行時にＲＡＭなどの記憶装置上に生成されるものである。また、情報処理装置１は、処理のターゲット（対象）となるプログラムであるターゲットプログラム１１を入力し（受け付け）、ターゲットプログラムに含まれる変数に関する保護属性決定結果１２を出力する。 また、保護属性定義情報が情報処理装置１の例えばＨＤＤなどの外部記憶装置（図示せず）に記憶されてもよい。
【００２３】
次に、情報処理装置１の構成の詳細を説明する。
【００２４】
プログラム受付部２０は、情報処理装置１の外部からターゲットプログラム１１を受け付ける。受け付けたターゲットプログラム１１を後述するプログラム記憶部２１に記憶させる。ターゲットプログラム１１は、変数や、関数を用いた所定の処理の実行手順が記述された情報であり、 例えばＣ言語のなどの人間可読な高級言語で記述されている。
【００２５】
プログラム記憶部２１は、ターゲットプログラム１１を記憶する。また、後述する部分データフロー変換部２９によりターゲットプログラム１１とそのターゲットプログラムの部分データフローを対応付けて記憶しても良い。図４は、取得されるターゲットプログラムの例を示す図であり、図２のプロトコルにおいてシステムＡ２２０１が実行するターゲットプログラムを示している。図４において、２行目は（初期）保護属性 confidential が与えられた変数宣言を表す。４〜５行目では出力のためのパラメータ（変数）が与えられている。７〜１１行目は作業変数の変数宣言を表す。１３〜２０行で処理の手順が記述される。具体的には、１３行目の乱数生成関数「PhysicalRandom」で乱数「rA」が生成され、それが14行目の出力関数「Output」でＯＳを経由して外部に出力される。また15行目の入力関数「Input」においてＯＳを経由して「buf」で確保された領域に外部入力が入力され、そのサイズが「size」に記憶される。そして16行目で「buf」に保存された外部入力が変数「rB」にコピーされる。18行目では、公開鍵署名生成関数「Sign2」に入力文「rA」「rB」と署名生成のための秘密鍵「skA」が入力され、入力文に対する署名「sign」が出力される。最後に20行目の出力関数「Output」によりＯＳ経由でデータを出力して、処理が完了する。
【００２６】
また、このターゲットプログラムでは多くの変数に対してフィールドの数や長さといったデータ型を省略しているが、実際はデータ型の定義並びにその一致が必要となる。しかし、保護属性とデータ型とは独立に考えることができるため、ここでは保護属性のみに注目して記載している。
【００２７】
ここで、２行目の変数には保護属性が付与されているが、それ以外の変数には保護属性が付与されていない。本実施の形態では、保護属性が付与されていない変数に対して、その保護属性を自動で決定する。また、図４のターゲットプログラムには現れていないが、（保護属性が付与されていない）定数も保護属性自動決定の対象である。以下では、保護属性決定対象となる変数、定数を、総称して変数と呼ぶ。
【００２８】
ここで、保護属性について詳細に説明する。保護属性は、情報が完全・正確であり、不慮の事故による欠落や攻撃者による改ざんがないことを意味する完全性と、権限を持つ人だけが情報にアクセスでき、権限の無い人が読み取れないことを意味する機密性の２つの性質で大きく分類される。さらにこれらは、完全性と機密性というセキュリティ要件について、それぞれメモリ領域における保護の有無と、性質保証の有無という２種類の観点で分類される。例えば、ある変数の値が機密性保護メモリ領域に現在記憶されているとしても、その値が過去に非保護メモリ領域に記憶されたことがあったり、将来非保護メモリ領域に記憶されたりするのであれば、その値が非保護メモリに記憶されたときにＯＳ３０１等の外部エンティティに盗聴される恐れがあるため、その値の機密性は保証されていないことになる。このように、本実施形態に係る保護属性は、完全性と機密性のそれぞれについて、メモリ上非保護（性質も未保証）、メモリ上保護しているが性質は未保証（未確認）、メモリ上保護していてかつ性質も保証あり（確認済）を区別できるように設定されている。
【００２９】
本実施形態では、この保護属性を示す情報を保護属性情報という。保護属性情報は、ある変数に代入されるデータが保護されたメモリ領域に記憶されるか、または保護されないメモリ領域に記憶されるかを示す情報である。
【００３０】
メモリ領域の保護については、アクセス制御や暗号化・改ざん検証などの保護手段によって達成される項目が異なる。たとえば実行対象のプログラム以外からのアクセスを完全に禁止するアクセス制御機構をそなえた保護メモリ領域２１５は、完全性と機密性とも保護ありとなる。ただし、全てのメモリ領域について当該実行対象のプログラム以外からのアクセスが禁止されてしまっている場合、ＯＳ３０１が提供する入出力サービスが一切利用できない。このため、図１に示すように、入力及び出力のために完全性及び機密性の保護機構が実現されない非保護メモリ領域２１４が設けられている。
【００３１】
尚、機密性の保護がメモリアクセス時のハードウェアによる暗号機構によって行われる場合は、機密性が保護されるが、完全性は保護されないメモリ領域がありえる。また、完全性の保護についてもそれがハードウェアによるＭＡＣ（Message Authentication Code）生成・検証機構で行われれば完全性が保護されるが、機密性は保護されないメモリ領域がありえる。もちろん、両方を組み合わせればアクセス制御と同様に完全性と機密性との両方をそなえた保護機構が実現可能である。本実施の形態にかかる構成においてはこれらの保護手段のどれについても適用可能である。
【００３２】
以降、完全性が必要な情報が不用意に非保護メモリ領域２１４に記憶され対象のプログラム外からの書き換えを受けることを「情報が汚染される」と表現する。
【００３３】
図５は本実施形態に係る保護属性定義情報１４の例を示す図である。「exposed」は、完全性も機密性も保護されていない非保護メモリ領域に記憶され、かつ完全性も機密性も保証されていない値が代入される変数を意味する保護属性である。「exposed」はＯＳ３０１が値を自由に読み書きできる変数であり、「exposed」が付与された変数を介して、ＯＳはプログラムの入出力を行うことができる。なお、以下の説明では保護された変数との違いを明確にするために保護属性「exposed」を明示しているが、既存のプログラムとの互換性を維持し、記述の煩雑さを避けるために保護属性「exposed」を省略しても差し支えない。
【００３４】
「fixed」は、少なくとも完全性が保護されたメモリ領域に記憶され、かつ完全性も機密性も保証（確認）されていない値が代入される変数を意味する保護属性である。「fixed」が付与された変数の値は通常機密保護されないメモリ領域に記憶されるため、この変数を介してＯＳがプログラムの出力を行うことができる。逆に、ＯＳ等の外部エンティティから値が参照されない場合は、変数の値を機密性が保護されたメモリに記憶しても差し支えない。
【００３５】
「verified」は、少なくとも完全性が保護されたメモリ領域に記憶され、かつ完全性は保証（確認）されているが機密性は保証（確認）されていない値が代入される変数を意味する保護属性である。「verified」が付与された変数の値は通常機密保護されないメモリ領域に記憶されるため、この変数を介してＯＳがプログラムの出力を行うことができる。逆に、ＯＳ等の外部エンティティから値が参照されない場合は、変数の値を機密性が保護されたメモリに記憶しても差し支えない。
【００３６】
「hidden」は、少なくとも機密性が保護されたメモリ領域に記憶され、かつ完全性も機密性も保証（確認）されていない値が代入される変数を意味する保護属性である。「hidden」が付与された変数は外部からの入力に用いられることはなく、その変数にＯＳが値を書き込む必要はないため、変数の値を完全性が保護されたメモリ領域に記憶しても問題ない。
【００３７】
「concealed」は、少なくとも機密性が保護されたメモリ領域に記憶され、かつ機密性は保証（確認）されているが完全性は保証（確認）されていない値が代入される変数を意味する保護属性である。「concealed」が付与された変数は外部からの入力に用いられることはなく、その変数にＯＳが値を書き込む必要はないため、変数の値を完全性が保護されたメモリ領域に記憶しても問題ない。
【００３８】
「confidential」は、機密性と完全性の両方が保護されたメモリ領域に記憶され、かつ機密性と完全性の両方が保証（確認）されている値が代入される変数を意味する保護属性である。
【００３９】
なお、図５における「完全性―保護」「機密性―保護」列の記号は、各保護属性が付与された変数の値が記憶されるメモリ領域における完全性・機密性それぞれの保護機能の有無を表している。「−」は、メモリ領域に保護機能がないことを意味しており、「＋」は、メモリ領域に保護機能があることを意味しており、「＋／−」はメモリ領域に保護機能があってもなくてもよいことを意味しており、「−（＋）」はメモリ領域に保護機能がないが、外部エンティティから値を参照されない場合は保護機能があってもよいことをそれぞれ意味している。
【００４０】
また、図５における「完全性―性質」「機密性―性質」列の記号は、各保護属性が付与された変数の値の完全性・機密性それぞれの性質が保証（確認）されているかを表している。「×」は性質が未保証であることを意味しており、「○」は、性質が保証されていることを意味している。
【００４１】
以上、説明した６種類の保護属性のうち、本質的に重要な保護属性は「ｅｘｐｏｓｅｄ
」、「ｖｅｒｉｆｉｅｄ」、「ｃｏｎｃｅａｌｅｄ」、「ｃｏｎｆｉｄｅｎｔｉａｌ」で
あり、「ｆｉｘｅｄ」、「ｈｉｄｄｅｎ」は補助的な保護属性となっている。
【００４２】
上記した保護属性は、一般的な言語における変数の型（フィールドの数や長さといったデータ型）とほぼ同じと考えてよく、同じ型の変数同士の演算は許されるが、異なる型の変数同士の演算は許されない。一方、これらを緩和するために、一般的な言語におけるデータ型ではデータ型変換（キャスト）を伴う代入が可能なことがある。すなわち、float x = (float)(int y) のように、int 型（整数型）の y の型を float 型（浮動小数点数型）に変換したものを x に代入するような操作である。保護属性においても、後述するように、一部の保護属性において保護属性変換を伴う代入が許されている。このような操作を行う場合、保護属性変換とデータ型変換を伴う代入において、保護属性変換ルールと、データ型変換ルールを共に守らなければ、代入を行うことはできない。本実施の形態では、データ型と保護属性のルールを独立してチェック可能である例を考え、以下では保護属性にのみ注目した説明を行う。
【００４３】
第１の関数型記憶部２２は、関数型の情報である関数型情報、つまり、セキュリティ関数の関数型の情報であるセキュリティ関数型情報および非セキュリティ関数の関数型の情報である非セキュリティ関数型情報を記憶する。
【００４４】
関数とは、プログラム中で意味や内容がまとまっている作業をひとつの手続きとしたものをいう。例えば、一般にサブルーチンと言われるものなどである。
【００４５】
具体的には、第１の関数型記憶部２２は、１以上のセキュリティ関数型情報と、セキュリティ関数の識別情報とが直接的または間接的に対応付けられた第１の関数型情報を記憶する。
【００４６】
セキュリティ関数型情報は、セキュリティ関数の各入力変数及び各出力変数に代入されるデータが保護されたメモリ領域に記憶されるか又は非保護のメモリ領域に記憶させるかを示す保護属性情報を有する。
【００４７】
また、非セキュリティ関数の各入力変数及び各出力変数に代入されるデータが保護されたメモリ領域に記憶されるか又は非保護のメモリ領域に記憶させるかを直接的または間接的に示す保護属性情報を有する１以上の非セキュリティ関数型情報と、非セキュリティ関数の識別情報とが対応付けられた第２の関数型情報を記憶してもよい。
【００４８】
本実施の形態において、関数はセキュリティ関数と非セキュリティ関数に分かれている。セキュリティ関数とは、計算量的一方向性（入出力変数全体集合のある部分集合が存在して、その部分集合に属する変数の値から、部分集合に属さない変数の値を求めることが現実的な時間ではできない）の性質を有する処理を行う関数であるか、または入力変数の値の完全性の検証処理を行う関数であるか、または関数の入力変数および出力変数が（既定された）異なる保護属性をとり得る関数である。
【００４９】
一方、非セキュリティ関数とは、関数の入力変数と出力変数がすべて同じ保護属性のみをとることができる関数である。そして、それぞれの関数について、入出力変数がどのような保護属性を取ることができるかを規定したものが関数型である。 
セキュリティ関数の関数型は、計算量的一方向性（入出力変数全体集合のある部分集合が存在して、その部分集合に属する変数の値から、部分集合に属さない変数の値を求めることが現実的な時間ではできない）の性質を有する処理を行う関数であるか、または入力変数の値の完全性の検証処理を行う関数であるか、許可された保護属性変換を行う関数であるか、に基づいて定義される。例えば、機密性について言えば、ある演算 y = f(x) について、y の値から x の値を求めることが現実的な時間ではできないという計算量的一方向性を持つならば、入力 x が機密性保証あり、出力 y が機密性保証なしという保護属性を許可することができ、これはセキュリティ関数となる。完全性についていえば、署名検証のような、入力の値に完全性があるかどうかを検証し、検証済みの値（値自体は入力と同じ）を出力する機能を持つ関数であれば、入力が完全性保証なし、出力が完全性保証ありという保護属性を許可することができ、これもセキュリティ関数である。
【００５０】
一方、計算量的一方向性が無ければ、例えば出力から入力を求められてしまうため、入力が機密性保証あり、出力が機密性保証なしという保護属性は許可できない。また、入力の完全性があるかどうかを検証する機能を持たない関数であれば、入力が完全性保証なし、出力が完全性保証ありという保護属性は許可できない。結果として、上記いずれの性質も持たず、入力と出力の保護属性が同じでなければならないような関数は、非セキュリティ関数となる。
【００５１】
この関数型で定義された保護属性によりプログラム中の変数に代入されるデータの記憶領域を制御することで、セキュリティ関数の入力変数に代入されるデータおよび出力変数に代入されるデータを適切に保護することができる。
【００５２】
セキュリティ関数型情報は、セキュリティ関数の変数の保護属性情報を有する。非セキュリティ関数型情報は、非セキュリティ関数の変数の保護属性情報を有する。
【００５３】
セキュリティ関数の例として、データ秘匿、データ完全性保証、エンティティ認証、データ認証などの情報セキュリティ機能を提供するプログラムで利用される、暗号方式をベースとした基本構成要素（暗号プリミティブ）を実現する関数が挙げられる。具体的な暗号プリミティブとしては、ハッシュ関数、一方向性関数、乱数生成関数、共通鍵暗号、MAC (Message Authentication Code)、公開鍵暗号、公開鍵署名などがある。ハッシュ関数、一方向性関数、乱数生成関数は１つのセキュリティ関数で実現されるが、共通鍵暗号および公開鍵暗号はそれぞれ３つのセキュリティ関数（鍵生成関数、暗号化関数、復号関数）で実現される。また、MACおよび公開鍵署名もそれぞれ３つの関数（鍵生成関数、MAC/署名生成関数、MAC/署名検証関数）で実現される。これらの関数は、入力変数及び出力変数の間の計算量的一方向性の性質を有する、あるいは完全性の検証を行う関数である。
【００５４】
図６は、セキュリティ関数毎に定義された関数型情報を示す図である。ここではセキュリティ関数として公開鍵暗号の暗号化関数と復号関数、共通鍵暗号の暗号化関数と復号関数、公開鍵署名（入力１文書、入力２文書）の署名生成関数と署名検証関数、MACのMAC生成関数とMAC検証関数、ハッシュ関数（1入力2出力、2入力1出力）、一方向性関数の一種であるKDF(Key Derivation Function、鍵導出関数)、乱数生成関数の各セキュリティプリミティブを実現する関数と、保護属性変換用のコピー関数を示した。特許請求の範囲の第１の関数は、本実施形態等のセキュリティ関数が対応し、第１の関数型情報は、本実施形態等のセキュリティ関数型情報が対応する。
【００５５】
セキュリティ関数には、関数の各入出力と、入出力変数がとる特定の保護属性とが対応付けられている。入出力変数は、入出力として実際に関数にとられる変数、すなわち関数に入力される値が代入される変数あるいは関数から出力される値が代入される変数である。各入力変数及び出力変数の保護属性は、セキュリティ関数が計算量的一方向性の性質を有するか、または関数が入力変数の値の完全性の検証処理を行うかに基づいて定義される。なお、関数の出力については、「func(input、 output)」のように変数の形になっている場合と、「output = func(input)」のように関数より返される値として扱われる場合との両方を含む。図６において、例えば、公開鍵暗号における暗号化関数を見てみると、セキュリティ関数名（セキュリティ関数の識別情報）はPKEncryptであり、関数は入出力として、第１変数、第２変数、第３変数の３つの入出力変数をとる。そしてそれらの意味は、第１変数が平文（暗号化されるメッセージ、入力）、第２変数が公開鍵（入力）、第３変数が暗号文（出力）となっている。そして、各行が１つの関数型を表し、公開鍵暗号における暗号化関数の関数型は多重定義記号A、Bの2種類定義されている。これは、この関数が使われる状況に応じて、いずれか一方の関数型が採用されることを意味する。このように、ひとつのセキュリティ関数に対して2つ以上の関数型が定義されることを（関数型の）多重定義と呼ぶ。この2つの関数型は以下のような考えで設計されている。 
まず公開鍵については、誰でもアクセスできるように機密性がないメモリ領域に記憶され、かつ公開鍵暗号化が正しく行われるために公開鍵の完全性が保証されなければならないため、A、Bいずれの定義でも verified でなければならない。
【００５６】
一方、暗号化する平文は外部エンティティから盗聴されない機密性が保証されたものでなければならないが、完全性については任意であるため、Aは機密性と完全性が保証されている場合を表す confidential、Bは機密性のみが保証されている場合を表す concealed となっている。
【００５７】
最後に暗号文については、暗号化されているため機密性を保護する必要ない。これは暗号化関数の計算量的一方向性からわかる。すなわち、平文から暗号文を計算することは容易だが、逆に暗号文から平文を求めることは現実的な時間では困難であるため、暗号文を機密保護メモリに記憶する必要はないということである。そして暗号文の完全性については、平文の完全性がそのまま出力の暗号文の完全性に引き継がれるため、Aは完全性のみが保証される verified、Bは完全性も機密性も保証されない exposed となる。
【００５８】
図６におけるその他のセキュリティ関数についても説明すると、公開鍵暗号の復号関数 SKDecrypt は、暗号文と秘密鍵を入力として取り、平文を出力する。秘密鍵は完全性と機密性が保証された confidential でなければならない。また、平文は機密性が保証されていなければならず、平文の完全性は暗号文の完全性を引き継ぐため、暗号文が verified かつ平文が confidential、または暗号文が exposed かつ平文が concealed となる。
【００５９】
共通鍵暗号における暗号化関数 CKEncrypt は、平文と秘密鍵を入力として取り、暗号文を生成する。また、復号関数 CKDecrypt は、暗号文と秘密鍵を入力として取り、平文を生成する。CKEncrypt、CKDecrypt の関数型は、それぞれ PKEncrypt、 SKDecrypt の関数型とほぼ同様である。違いは暗号化用の鍵が公開鍵ではなく秘密鍵となるため、CKEncrypt の入力である第２変数の保護属性が verified ではなく confidential でなければならないことである。
【００６０】
公開鍵署名(1文書)の署名生成関数(1文書) Sign および公開鍵署名(2文書)の署名生成関数(2文書) Sign2 は、入力文（署名対象のメッセージ）1つまたは2つと秘密鍵とを入力として取り、署名を生成する。入力文は（複数ある場合は共に）完全性が保証されていなければならないが機密性は任意である。また、秘密鍵は完全性と機密性が保証されていなければならない。署名の機密性及び完全性は、入力文の機密性及び完全性をそのまま引き継ぐ。MACのMAC生成関数 MACGen は、入力文と秘密鍵を入力として取り、MACを生成する。MACGen の関数型は、Sign の関数型とほぼ同様である。違いは MAC 生成用の鍵が公開鍵ではなく秘密鍵であるため、MACGen の入力である第２変数の保護属性が verified ではなく confidential でなければならないことである。
【００６１】
公開鍵署名(1文書)における署名検証関数(1文書) Verify は、入力文（署名対象のメッセージ）、入力文に対する入力署名、署名検証のための公開鍵を入力として取り、検証済みの出力文、検証済みの出力署名、検証に成功したか否かを表す検証結果（補助出力）を出力する。一般的な署名検証では、検証に成功したか否かの検証結果だけが出力されるが、本実施の形態における署名検証では、出力文および出力署名の変数が用意され、署名検証が成功したときに限り出力文および出力署名の各変数に、それぞれ（検証済みの）入力文および入力署名とまったく同じ値が格納される。
【００６２】
関数型については、公開鍵は完全性が保証されていなければならず、かつ誰でもアクセスできるように機密性の無いメモリ領域に記憶されなければならないため、その保護属性は verified である。入力文及び入力署名は完全性保証がなく、機密性は任意である。出力文および出力署名は、出力される場合は検証が成功したということなので、完全性保証ありとなる。また、機密性は入力文および入力署名のものをそれぞれ引き継ぐ。検証結果については、入力がすべて機密性保証無しのものであればだれでも計算ができるので機密性保証なしとなり、入力のうちひとつでも機密性保証ありのものがあれば結果も機密性保証ありとなる。
【００６３】
このように関数型を定義することで、署名検証前の完全性のない入力文及び入力署名と、検証後の完全性が保証された（入力文及び入力署名と同じ値である）出力文および出力署名を、セキュリティの観点で分離して扱うことができるようになる。例えば、完全性が保証された値が代入された変数を入力として取るセキュリティ関数の入力に対して、署名検証により出力された検証後の変数を入力すべきところを、誤って検証前の変数（この値は署名検証関数の実行後に改ざんされているかもしれない）を入力してしまうような誤りを排除できる。
【００６４】
公開鍵署名(2文書)における署名検証関数(2文書) Verify2 の関数型は、入力文と出力文がそれぞれ2つずつある以外は Verify と同様である。ただし多重定義C、 Dでは、入力文1は未検証だが、入力文2がすでに検証済みである場合を定義している。 MACのMAC検証関数 MACVerify は、入力文（MAC対象メッセージ）、入力文に対するMAC、検証のための秘密鍵を入力として取り、検証済みの出力文、検証済みのMAC、検証に成功したか否かを表す検証結果（補助出力）を出力する。関数型は Verify の関数型とほぼ同様である。違いは MAC 検証用の鍵が公開鍵ではなく秘密鍵であるため、MACVerify の入力である第２変数の保護属性が verified ではなく confidential でなければならないことである。
【００６５】
ハッシュ関数 Hash、Hash2 は、与えられた入力からハッシュ値とよばれる値を計算する関数で、Hash は1入力、Hash2 は2入力である。関数型の完全性と機密性は以下のような考え方で決定される。完全性については、(i1)入力の全てが完全性保証ありで、出力も完全性保証あり、または(i2)入力の少なくとも１つが完全性保証なしで、出力は完全性保証なしとなる。機密性については、(c1)入力の全てが機密性保証なしで、出力も機密性保証なし、(c2)入力の少なくとも１つが機密性保証ありで、出力も機密性保証あり、または(c3)入力の少なくとも１つが機密性保証ありで、出力は機密性保証なしとなる。(c3)が定義できるのは、ハッシュ関数が計算量的一方向性を有した関数であり、出力であるハッシュ値から入力（複数入力の場合はそのすべて）を求められないという性質を持つからである。
【００６６】
図６における関数型定義において、1入力1出力のハッシュ関数 Hash の多重定義 A は (i2)-(c1)の組み合わせで定義されるものであり、同様に B は(i1)-(c1)、C は(i2)-(c2)、D は(i2)-(c3)、E は(i1)-(c2)、F は(i1)-(c3)の組み合わせでそれぞれ定義されるものである。2入力2出力のハッシュ関数 Hash2 の多重定義についても同様である。
【００６７】
鍵導出関数 KDF は、入力から2つの出力を生成する関数であり、データ長が十分長い２つ以上の鍵データを（出力よりも短い長さの）入力から生成する場合などに用いられる関数である。この関数も一方向性を有しているため、関数型の定義は前述のハッシュ関数 Hash とほぼ同様である。異なる点は出力が2つあり、2つの出力の保護属性が同じである点のみである。
【００６８】
乱数生成関数 PhysicalRandom 乱数を生成する関数であり、入力は取らない。完全性のみ保証された乱数、機密性のみ保証された乱数、完全性と機密性の両方が保証された乱数の3種類が出力乱数の保護属性として定義されている。なお、生成した乱数は通常必ず完全性があるが、機密性のみ保証された値と演算するための乱数を用意するために、便宜上機密性のみ保証された乱数が定義される。
【００６９】
最後に、保護属性変換用のコピー関数は、入力変数の値を出力変数にコピーする（代入する）関数である。この関数は、本実施例における保護属性定義にあわせて、便宜上セキュリティ関数として用意されている。「hidden」、「concealed」、「confidential」の各保護属性が付与された変数の値は、他の保護属性が付与された変数に代入することはできない。完全性についてメモリ上保護され、かつ性質が保証された値を保持する保護属性「verified」が付与された変数は、その値を保護属性「fixed」、「exposed」が付与された変数に代入することは許されるが、「fixed」、「exposed」が付与された変数の値は（完全性が保証されていないため）保護属性「verified」が付与された変数へ代入することができない。また、保護属性「fixed」が付与された変数の値は「exposed」が付与された変数に代入でき、逆もまた行うことができる。「exposed」が付与された変数の値を「fixed」が付与された変数へ代入することは、プログラムの入力である「exposed」が付与された変数の値がその後外部エンティティにより改ざんされないように、「fixed」が付与された変数にコピーして扱う、といった使い方がありうる。
【００７０】
セキュリティ関数の開発、即ち、関数型の定義及び実装には、一般のアプリケーションプログラムの開発より慎重に行われなければならない。図７は、セキュリティ関数とアプリケーションプログラムの開発の作業手順を示す図である。セキュリティ関数の関数型および実装は、暗号プリミティブとプログラムとのメモリ管理の両方に精通したセキュリティ専門家である専門プログラマによって開発され（５０１）、動作の正しさだけでなく、その保護属性についても適切な定義がなされているか否かの十分な注意が必要である。その後、セキュリティ専門家により安全性が保証されたセキュリティ関数の関数型およびセキュリティ専門家によりセキュリティ関数内部の変数に対して適切な保護属性が付与された実装を利用して、一般のプログラマによりセキュリティ関数を利用したセキュリティプロトコルが実装される（５０２）。
【００７１】
図６に示すセキュリティ関数の関数型の定義は、標準的に要求される安全性を満たすものを基準として行っているが、セキュリティ関数の関数型は、ターゲットプログラムにおいて使用する暗号アルゴリズムなどによって変化する。その場合、セキュリティ専門家によるセキュリティ関数の追加・削除や、セキュリティ関数型定義の変更が必要となる。 
図７におけるセキュリティ関数の実装について、特に署名検証関数およびMAC検証関数について注意が必要である。図８は、本実施の形態における署名検証の手順および実装の一例を概念的に示す図である。前述の通り、本実施の形態における署名検証では、署名検証関数の入力文用の変数５２１と入力署名用の変数５２２にそれぞれ対応する出力文用の変数５２３および出力署名用の変数５２４が用意され、署名検証が成功したときに限り出力文および出力署名の各変数に、それぞれ（検証済みの）入力文および入力署名とまったく同じ値が代入される。この関数の実装例である図８では、まず入力文用の一時変数５２５と入力署名用の一時変数５２６を生成し、そこに入力文用の変数５２１と入力署名用の変数５２２の値をそれぞれコピーする。このとき、一時変数の値は完全性保護メモリに記憶されるため、コピー以降改ざんされることはない。そして、改ざんされないことが保証されたところで、一時変数の値について検証５２７を行い、検証に成功した場合のみ、出力文用の変数５２３と出力署名用の変数５２４に、入力文用の一時変数５２５と入力署名用の一時変数５２６の値をそれぞれコピーする。
【００７２】
この実装は、攻撃者が検証中に検証前の変数の値を書き換えることを防止する効果がある。例えば、検証５２７が成功したら入力文用の変数５２１および入力署名用の変数５２２の値をそれぞれ出力文用の変数５２３と出力署名用の変数５２４にそれぞれコピーするような実装としてしまうと、検証５２７が終わってからコピーが行われるまでの間に、攻撃者により入力文用の変数５２１および入力署名用の変数５２２の値が改ざんされてしまうかもしれない。すると、署名検証関数は、攻撃者によって改ざんされた値を検証済みの値として出力してしまうこととなる。図８のような実装を行えば、検証開始から出力変数への値のコピーまで改ざんが防止されるため、このような脆弱性を排除できる。なお、MAC検証関数も署名検証関数と同様な考え方で、検証に成功した時に限り入力と同じ値が代入された変数が出力される。
【００７３】
図９は、本実施の形態における非セキュリティ関数である入力関数「Input」及び出力関数「Output」の関数型を示す図である。非セキュリティ関数の関数型は、変数の保護属性が全て一致する。関数「Input」に入力される変数（入力変数）はＯＳによる書き込みがあるため入力変数は保護属性「exposed」が付与された変数に限定され、出力も保護属性「exposed」が付与された変数に限定される。ただし、前述したとおり、「exposed」と「fixed」は相互変換可能であるから、外部入力を「exposed」のメモリ領域で取り込み、それを改ざん保護機能のついた「fixed」のメモリ領域にコピーすることは可能である。また、関数「Output」により出力される変数（出力変数）はＯＳによる書き込み操作が不要なため、変数の保護属性が全て「exposed」、または全て「verified」と多重定義される。
【００７４】
特許請求の範囲の第２の関数は、本実施形態等の非セキュリティ関数が対応し、第２の関数型情報は、本実施形態の非セキュリティ関数型情報が対応する。
【００７５】
なお、関数型が定義されていない関数はすべて非セキュリティ関数とみなされ「入出力変数の保護属性がすべて同じであり、その保護属性は何でもよい」と多重定義されているとみなす。つまり、入出力変数の保護属性が、全て「confidential」、全て「concealed」、全て「verified」、全て「hidden」、全て「fixed」、全て「exposed」のいずれかでなければならないと多重定義されているとみなす。
【００７６】
関数型抽出部２３は、第１の関数型記憶部２２に記憶された第１の関数型情報とターゲットプログラムに含まれるセキュリティ関数の情報である実セキュリティ関数情報に基づいて、実セキュリティ関数情報に対応するセキュリティ関数型情報である実セキュリティ関数型情報を抽出する。
【００７７】
例えば、第１の関数型情報に含まれるセキュリティ関数の識別情報と実セキュリティ関数情報に含まれるセキュリティ関数の識別情報とが一致するセキュリティ関数のセキュリティ関数型情報を抽出する。
【００７８】
そして、抽出した第１の実関数型情報を後述する第２の関数型記憶部２４および一時記憶部２５に書き込む。
【００７９】
特許請求の範囲の第１の実関数は、本実施形態等の実セキュリティ関数が対応し、第１
の実関数型情報は、本実施形態等の実セキュリティ関数型情報が対応する。
【００８０】
また、第１の関数型記憶部２２に記憶された第２の関数型情報とターゲットプログラムに含まれる非セキュリティ関数の情報である実非セキュリティ関す情報に基づいて、実非セキュリティ関数情報に対応する非セキュリティ関数型情報である実非セキュリティ関数型情報を第２の関数型情報から抽出し、抽出した第２の実関数型情報を後述する第２の関数型記憶部２４および一時記憶部２５に書き込んでもよい。
【００８１】
特許請求の範囲の第２の実関数は、本実施形態等の実非セキュリティ関数が対応し、第２の実関数型情報は、本実施形態等の実非セキュリティ関数型情報が対応する。
【００８２】
なお、ターゲットプログラム中に、第１の関数型記憶部に対応する関数型が定義されていない関数があった場合、関数型抽出部２３は、その関数の関数型が「入出力変数の保護属性がすべて同じであり、その保護属性は何でもよい」と多重定義されているとみなし、相当する実非セキュリティ関数型情報を抽出（生成）してもよい。
【００８３】
第２の関数型記憶部２４は関数型抽出部２３で抽出された実関数型情報を記憶する。
【００８４】
実関数型情報は、関数の識別情報と、実関数の識別情報（複数回呼び出された関数を区別するための情報）とが対応付けられた情報である。
【００８５】
第２の関数型記憶部２４に記憶されるセキュリティ関数および非セキュリティ関数の実関数毎の関数型の情報（実関数型情報）の例として、図４で示したターゲットプログラムに対する実関数毎の関数型情報を図１０に示す。図１０の例では、セキュリティ関数の実関数型情報である実セキュリティ関数型情報は、セキュリティ関数の識別情報であるセキュリティ関数名と実関数の識別情報である符号（詳細は後述する）から決まる実セキュリティ関数名と、多重定義記号と、変数の意味毎に多重定義記号に対応した保護属性とが対応付けられた情報となっている。また、非セキュリティ関数の実関数型情報である実非セキュリティ関数型情報は、非セキュリティ関数の識別情報である非セキュリティ関数名と実関数の識別情報である符号から決まる実非セキュリティ関数名と、多重定義記号と、変数の意味毎に多重定義記号に対応した保護属性とが対応付けられた情報となっている。
【００８６】
実関数型情報において、セキュリティ関数および非セキュリティ関数は呼出し毎に区別され、例えば図１０における実セキュリティ関数名および実非セキュリティ関数名のように、呼び出し毎に異なる符号を用いて「#符号_関数名」と変換され記憶されている。これは関数型を実関数毎、すなわち、関数の呼出し毎に抽出し、それらを区別するためである。この例では、符号として図２で各関数に付与した番号を利用している。
【００８７】
この例では、セキュリティ関数の乱数生成関数「PhysicalRandom」と署名生成関数(2入力)「Sign」、非セキュリティ関数の入力関数「Input」と出力関数「Output」の実関数毎関数型が展開されており、特に出力関数「Output」は図４のターゲットプログラム中で2回呼び出されるため、それぞれの呼び出しが「#2402_Output」、「#2403_Output」と区別されている様子を示している。
【００８８】
一時記憶部２５は、関数型抽出部２３で抽出された実関数型情報を記憶する。なお、一時記憶部２５は、実セキュリティ関数型情報が記憶されれば十分であるが、実非セキュリティ関数型情報も記憶されても良い。
【００８９】
本実施形態においては、以上のようなセキュリティ関数および非セキュリティ関数における関数型（変数の保護属性）の制限を満たすようプログラムにおける変数の保護属性を決定することで、非セキュリティ関数において異なる保護属性を持つ変数が演算されることを防ぎ、そのような演算がセキュリティ関数のみで安全に行われることを保証する。
【００９０】
第１の代替関数型記憶部２６は、セキュリティ関数を用いた特定処理の実行手順を示す特定処理手順情報と、１以上の関数型情報とが対応付けられた代替関数型情報を記憶する。代替関数型情報に含まれる関数型情報は、特定処理手順が実行される場合に特定処理手順で実行されるセキュリティ関数の関数型情報を代替できるセキュリティ関数の情報であって、セキュリティ関数の識別情報を有する。
【００９１】
代替関数型抽出部２７は、代替関数型情報と、実セキュリティ関数情報に基づいて、実セキュリティ関数情報に対応する代替実関数型情報を抽出する。
【００９２】
例えば、第１の代替関数型記憶部２６に記憶されている代替関数型に対応付けられた特定処理手順情報に含まれるセキュリティ関数の識別情報と、第２の関数型記憶部２４に記憶されている第２の関数型情報に含まれる実セキュリティ関数情報に含まれるセキュリティ関数の識別情報とが一致する代替関数型情報を、第１の代替関数型記憶部２６から抽出する。
【００９３】
つまり、プログラム記憶部２１に記憶されたターゲットプログラムに含まれる実セキュリティ関数毎に、特定処理手順情報と実関数型情報の組からなる代替実関数型情報（特許請求の範囲の第２の代替関数型情報に対応）を抽出し、第２の代替関数型記憶部２８に記憶させる（書き込む）。
【００９４】
図１１は、本実施の形態に係る代替関数型情報（特定処理手順情報および関数型情報と対応付けられた情報）の例を示す図である。代替関数型情報は、各行（番号）において、第１列で示される特定処理手順情報において関数の入出力の関係で定義された特定処理の実行手順がプログラム中に存在する場合に限り、第２列で示されるセキュリティ関数に関する関数型情報を、特定処理手順に含まれる当該セキュリティ関数の関数型情報の代替として利用できることを示している。この代替関数型情報は、関数毎の関数型情報（第１の関数型情報）と同様、セキュリティ関数毎に定義される。この代替関数型情報を利用することにより、関数単体のみを考慮して保護属性が定義された関数型だけではプログラム中の変数の保護属性が決定できない場合に、複数の関数の入出力関係を考慮した保護属性決定を行うことが可能となる。
【００９５】
特定処理手順情報は、始点セキュリティ関数名およびその関数の特定出力と、終点セキュリティ関数名およびその関数の特定入力の組が１つ以上集まったものである。本実施形態では、関数の特定入力または特定出力を関数名および関数の入出力番号を用いて、「関数名_(#入出力番号)」の形で指定している。各組は、始点セキュリティ関数の特定出力が、終点セキュリティ関数の特定入力へ入力されることを意味している。例えば図１１の番号１の場合、始点セキュリティ関数の特定入力が「#PhysicalRandom(#1)」，終点セキュリティ関数の特定出力が「#Sign2(#1)」であるから、図６で定義された乱数生成関数「PhysicalRandom」の出力である第1変数（乱数）が、同じく図６で定義された署名生成関数(2文書)「Sign2」の第1変数（入力文1）として入力されるという特定処理手順を意味している。つまり，乱数生成関数の出力値（乱数）が署名生成関数の入力文1として入力されることを意味している．
代替関数型情報に対応付けられた関数型情報は、図６で示した関数型情報と同様なフォーマットで定義されるが、対になる特定処理手順がプログラム中に存在したときにのみ利用（代替）できる関数型である。例えば図１１の番号１の場合は、署名生成関数(2文書)「Sign2」の関数型を（対になる特定処理手順が存在した時に限り）代替できる関数型である。通常のSign2 の関数型は、図６で示したように、第2変数の入力文2には完全性が保証されているもの（「confidential」または「verified」）しか許可されなかった。しかし図１１の番号１の関数型では、第2変数の入力文2の保護属性は「concealed」または「exposed」であり、第2変数として完全性が保証されない値を入力することを許可している。
【００９６】
図１１の番号１の代替関数型情報は、『署名生成関数(2文書)「Sign2」の第1変数が乱数生成関数「PhysicalRandom」により生成された乱数を値として持つ変数である場合に限り、「Sign2」の第2変数が完全性保証無しのものであっても署名生成を許可する』と見ることができる。
【００９７】
ここでこの定義の意味を説明する。セキュリティの観点では、図６の定義のように、署名をつける文書にはすべて完全性がなければならない。しかし、チャレンジアンドレスポンスプロトコルと呼ばれるプロトコルでは、一時的に利用する（無意味な）文書に対して署名をつけることで、認証を行う。つまり、文書の一部に「乱数」を挿入することで、文書が無意味なものとなり、署名付き文書が悪用されることを防いでいる。
【００９８】
以上のような考え方から、チャレンジアンドレスポンスプロトコルを考慮すると、署名をしてもよい文書の条件は、すべてが完全性をもつか、すべては完全性を持たないが一部に完全性のある乱数を含む、と考えることができる。外部入力は改ざんされる恐れがあるため、完全性も保証できないし、乱数であるかどうかもわからない。そこで、システムＡが自分で生成した乱数が完全性のある乱数ということになる。
【００９９】
言い換えると、署名の入力に乱数生成関数で生成された値が入力されれば、署名生成を許可するということができる。つまり、上述のような特定処理手順（上述の例では、乱数生成関数の出力が、署名生成関数の入力に入力されること）を満たしたときに限り、入力に完全性がないものを含んでいても署名を生成するというセキュリティ関数の代替関数型情報を利用することができる。このような代替関数型情報を考慮することにより、特定処理手順を考慮した保護属性の決定が可能となる。
【０１００】
図１１の説明に戻る。番号2の定義は、番号1の定義における署名生成関数の特定入力(Sign2(#1))と完全性保証なしでもよい入力(Sign2(#2))を入れ替えたものである。 
番号3〜6の定義では、始点セキュリティ関数名および特定出力と、終点セキュリティ関数名及び特定入力の組が２つある。このように複数の組がある場合は、それらを全て満たさなければならない。
【０１０１】
番号3の定義は、乱数生成関数「PhysicalRandom」の出力である第1変数がハッシュ関数(1入力)「Hash」の第1変数として入力され、さらに同ハッシュ関数の出力である第2変数が署名生成関数(2文書)「Sign2」の第1変数として入力されるという特定処理手順が存在するときに限り、署名生成関数(2文書)「Sign2」の第2変数が（図６の関数型では完全性保証必須でなければならないのに対し）完全性保証なしでもよいとする関数型が利用できることを定義している。番号4の定義は、番号3の定義における署名生成関数の特定入力(Sign(#1))と完全性保証なしでもよい入力(Sign(#2))を入れ替えたものである。
【０１０２】
番号5の定義は、乱数生成関数「PhysicalRandom」の出力である第1変数がハッシュ関数(2入力)「Hash」の第1変数として入力され、さらに同ハッシュ関数の出力である第3変数が署名生成関数(1文書)「Sign」の第1変数として入力されるという特定処理手順が存在するときに限り、署名生成関数「Sign」の第1変数である入力が（図６の関数型では完全性保証必須でなければならないのに対し）完全性保証なしでもよいとする関数型が利用できることを定義している。番号6の定義は、番号5の定義におけるハッシュ関数(2入力)の特定入力(Hash2(#1))を、ハッシュ関数のもう一方の入力(Hash2(#2))に置き換えたものである。
【０１０３】
図１２は、図１１で定義した特定処理手順を含むデータフローの一例を図示したものである。図１２におけるカッコつきの数字は、図１１の番号に対応している。また、図１２における#つきの数字は、関数の入出力番号（例えば#1は、その関数における第１番目の入出力である）を表している。そして、図１２において太線で描かれた部分が図１１で定義された特定処理手順である。
【０１０４】
第２の代替関数型記憶部２８は、代替関数型抽出部２７により抽出された代替実関数型情報を記憶する。
【０１０５】
第２の代替関数型記憶部２８に記憶される代替実関数型情報の例として、図４で示したターゲットプログラムに対する代替実関数型情報を図１３に示す。この例は、図１１の代替関数型情報の番号１および２が、図４のターゲットプログラム中に存在する実セキュリティ関数「#2211_PhysicalRandom」と「#2214_Sign2」に対応付けて抽出され、第２の代替関数型記憶部２８に記憶されたものである。
【０１０６】
第２の代替関数型記憶部２８に記憶される代替実関数型情報は、セキュリティ関数の呼び出し毎に抽出されるため、特定処理手順情報および関数型情報中のセキュリティ関数名は、セキュリティ関数の識別情報であるセキュリティ関数名と実関数の識別情報である符号から決まる実セキュリティ関数名となっている。 しかもこのとき、第２の代替関数型記憶部２８に記憶される代替実関数型情報と、第２の関数型記憶部２４に記憶される実関数型情報は、同じ実セキュリティ関数に対して同じ符号を付与する。そのため、乱数生成関数「PhysicalRandom」の符号は2211、署名生成関数(2入力)「Sign2」の符号は2214と、図１０の符号と同じになっている。
【０１０７】
代替実関数型情報は、プログラムに含まれる関数の呼び出し毎に抽出されることに注意する。例えば、プログラム中に乱数生成関数「PhysicalRandom」が２回、２文書の署名生成関数「Sign2」が２回呼び出されていたとすると、図１１の番号１の代替関数型情報は実セキュリティ関数の組毎に抽出されるので、乱数生成関数２つと署名生成関数２つそれぞれの組み合わせで４つ抽出される。図１１の番号２の代替実関数型情報も同様に４つ抽出されるので、結果として合計８つの代替実関数型情報が抽出されることになる。
【０１０８】
部分データフロー変換部２９は、プログラム記憶部２１に記憶されたターゲットプログラムを部分データフローに変換し、プログラム記憶部２１に（ターゲットップログラムに加えて）記録する。
【０１０９】
この部分データフローは、プログラムを、プログラムにおける変数とプログラム中の各処理の入出力の繋がりを表すデータフローに変換し、さらにそのデータフローを部分データフロー、すなわち含まれる変数の保護属性が同じでなければならない単位に分割したものである。
【０１１０】
部分データフローの例を示す前に、図１４に図４に示したターゲットプログラムに対するデータフローを示す。このようなデータフローは、プログラムの構文解析をすることにより得ることができる。図２と略同様であるため、図２と同様の関数及び変数に対しては同一の符号を用いている。尚、システムＢ２１０１からの入力（図２の２４０１）については、入力関数「Input」２４０１として各々表している。また、乱数生成関数２２１１は、関数「PhysicalRandom」２２１１として表し、署名生成関数２２１４は、関数「Sign2」２２１４として表している。また、システムＡ２２０１からの出力（図２の２４０２、２４０３）については、出力関数「Output」２４０２、２４０３として表している。そして、非セキュリティ関数である関数「Input」２４０１へは、図１に示す外部装置１０３から変数（入力変数）が入力され、関数「Output」２４０２、２４０３から外部装置１０３へ変数（出力変数）が出力される。セキュリティに関連する保護情報は、当該ターゲットプログラムにより実現されるシステムＡ２２０１に割り当てられた秘密鍵（skA）２２１３であり、四角のシンボルで表されている。セキュリティ関数のうち、署名検証関数２２１４は山形のシンボルで表され、乱数生成関数２２１１はひし形のシンボルで表されている。
【０１１１】
本実施の形態においては、このデータフローを、実セキュリティ関数の入出力、実非セキュリティ関数の入出力、または終端変数を端点とする部分データフローに分割する。このように分割すると、各セキュリティ関数または非セキュリティ関数について、その入出力（変数）がすべて異なる部分データフローに含まれることになる。一方、関数以外の、代入や演算子による命令については、その命令に含まれる変数は必ず同じ部分データフローに含まれる。例えば a = b のような代入命令があった場合、a と b は同じ部分データフローに含まれる。後述する保護属性自動決定では、各部分データフローについて、同じ部分データフローに含まれる変数が同じ保護属性をとるように保護属性を決定する。例えば、図１４のDF1は、端点がそれぞれ乱数生成関数「#2211_PhysicalRandom」、出力関数「#2402_Output」、署名生成関数(2文書)「#2214_Sign2」である部分データフローである。そして、各関数において、部分データフローに属するそれぞれの入出力である「#2211_PhysicalRandom(#1)」「#2402_Output(#1)」「#2214_Sign2」およびその入出力として実際に代入される変数「rA」の保護属性が同じでなければならないことを意味している。図１４のDF3は、端点が署名生成関数(2文書)「#2214_Sign2」と入力関数「#2401_Input」である部分データフローであり、各関数の入出力「#2214_Sign2(#2)」、「#2401_Input(#1)」と、それぞれ実際に代入される変数「rB」、「buf」が同じ部分データフローに属している。ここで「rB」と「buf」が同じ部分データフローに属しているのは、これら2変数の間にはセキュリティ関数あるいは非セキュリティ関数による処理が挟まれていないためである。実際、図４のターゲットプログラムにおいてこれらの変数は「rB = buf」という代入の関係にあり、関数による処理は行われていない。また、図１４のデータフローでもこの2変数は矢印で直接つながっており、これは間に関数演算が挟まれていないことを意味している。図１４のDF5は、端点が署名生成関数(2文書)「#2214_Sign2」と、終端変数「skA」であるような部分データフロー
である。終端変数とは、どの関数にも入力されない、またはどの関数からも出力されない変数のことであり、図１４では「skA」のほかに、「rsize」、「size」、「sigsize」が終端変数である。
【０１１２】
プログラム記憶部２１に記憶される部分データフローは、図１４のようなグラフ表現でもよく、図１５のような同じ部分データフローに属する変数によるテーブル表現でも良い。本実施の形態の説明においては、図１５の部分データフロー表現を用いて説明を行う。
【０１１３】
選択部３０は、第２の代替関数型記憶部２８に記憶された第２の代替関数型情報を選択して取得する。例えば、選択部３０が、第２の代替関数型記憶部２８に記憶された代替実関数型情報のうち、未選択のものを１つ選択取得する。選択できた場合は選択した代替実関数型情報を判定部３１に送付する。選択できない場合（すべて選択したことがある、あるいは選択できるものがもともとない）は、図３には矢印は図示しないが、後述する保護属性決定部３３に、保護属性の決定は失敗した旨の通知をする。
【０１１４】
例えば第２の代替関数型記憶部２８に図１３の代替実関数型情報が記憶されていた場合、番号１、番号２、番号１と番号２の３通りの取得方法がありうる。
【０１１５】
判定部３１は、選択部３０が選択した代替実関数型情報を受け付け、受け付けた代替実関数型情報における特定処理手順がプログラム記憶部２１に記憶されたプログラム中に存在するかを判定する。具体的には、選択された特定処理手順に含まれる各始点実セキュリティ関数の特定出力と終点実セキュリティ関数の特定入力の組について、特定出力と特定入力が同じ部分データフローに含まれるかどうかを判定する。本実施形態において、判定部３１は、プログラム記憶部２１に記憶された部分データフローを利用して判定を行う。
【０１１６】
更新部３２は、判定部３１の判定結果に応じて、選択部３０が選択した代替実関数型情報に含まれる実関数型情報で、第２の関数型記憶部２４における実関数型情報を置き換える。
【０１１７】
保護属性決定部３３は、第２の関数型記憶部２４に記憶される実関数型情報に基づき、ターゲットプログラム１１における各変数の保護属性を決定し、保護属性決定結果１２を出力する。具体的には、プログラム記憶部に記憶されたターゲットプログラム中のすべての実セキュリティ関数について、実セキュリティ関数の全入出力変数の保護属性情報と、第２の関数型記憶部に記憶された実セキュリティ関数型情報のいずれか１つに含まれる保護属性情報とが一致する場合に、一致した保護属性情報を各変数の保護属性情報に決定する。
【０１１８】
つまり、プログラム記憶部に記憶されたターゲットプログラム中のすべての実セキュリティ関数および実非セキュリティ関数について、前記実セキュリティ関数および実非セキュリティ関数の入出力変数の保護属性情報が、実関数毎関数型情報に記憶された当該実セキュリティ関数および実非セキュリティ関数の実関数型情報のいずれか１つで規定された保護属性情報と一致するような、ターゲットプログラムに含まれる全変数の保護属性情報が存在する場合にはその保護属性情報を出力し、存在しなければエラーを出力する。また、選択部３０から保護属性の決定は失敗した旨の通知を受けた場合もエラーを出力する。本実施形態において、例えば、保護属性決定部３３は、プログラム記憶部２１に記憶された部分データフローを利用して保護属性決定を行う。保護属性決定に成功した場合は、保護属性決定結果１２はターゲットプログラムに存在する全ての変数とそれぞれに対する保護属性である。例えば、図４に示したターゲットプログラムに対する保護属性自動決定が成功した場合、図１６のように、図４のターゲットプログラムに含まれる全ての変数（図４の２〜１１行目で宣言された変数）と、各変数に対する保護属性が出力される。このとき保護属性自動決定５５の実行ログを含んでも良い。また、図１６の保護属性決定結果には、各関数において、多重定義されたうちのどの関数型情報が選択されたかという情報や、部分データフローあるいは後述する保護属性決定テーブルに含まれる、各実関数の入出力（図１５の例で言えば#2211_PhysicalRandom(#1)など）およびその保護属性情報を出力してもよい。一方、保護属性決定に失敗した場合、保護属性決定結果１２は保護属性決定失敗を意味する特殊なオブジェクトやエラーメッセージなどでもよく、保護属性決定部３３の実行ログなどでもよい。
【０１１９】
保護属性決定テーブル記憶部３４は、保護属性決定テーブルを記憶する。保護属性決定テーブルは、ターゲットプログラムの部分データフローに、各部分データフローの確定保護属性と、各変数がとりうる保護属性候補を追記したものである。
【０１２０】
実関数毎関数型復元部３５は、保護属性決定部３３の保護属性決定の成功または失敗に応じて、一時記憶部２５から取得した実関数型情報で、第２の関数型記憶部２４における実関数型情報を置き換える。
【０１２１】
本実施形態においては、関数単体のみを考慮して保護属性が定義された関数型だけではプログラム中の変数の保護属性が決定できない場合に、複数の関数の入出力関係（特定処理条件）を考慮した保護属性決定を行うことが可能となる。
【０１２２】
（２）動作
次に、本実施の形態にかかる情報処理装置１の行う保護属性決定処理の手順について図１７を用いて説明する。この保護属性決定処理では、情報処理装置１は、上述の保護属性の計算ルールや変数の代入ルール、セキュリティ関数及び非セキュリティ関数の入出力変数の関数型、及び特定処理手順の存在を考慮しながら、与えられたプログラムの各変数に対して保護属性を適切に付与する。
【０１２３】
まず、プログラム受付部２０が、プログラム記憶部２１にターゲットプログラム１１を取得する（ステップＳ１）。
【０１２４】
次に、関数型抽出部２３が、プログラム記憶部２１に記憶されたターゲットプログラム１１に含まれる実セキュリティ関数毎に、第１の関数型記憶部２２に記憶された対応する関数型情報（特許請求の範囲の第１の関数型情報）から実関数型情報（特許請求の範囲の第１の実関数型情報）を抽出し、抽出した実関数型情報を第２の関数型記憶部２４および一時記憶部２５に記憶させる（ステップＳ２）。
【０１２５】
そして、部分データフロー変換部２９が、プログラム記憶部２１に記憶されたターゲットプログラムを部分データフローに変換し、プログラム記憶部２１に（ターゲットップログラムに加えて）記憶させる（書き込む）（ステップＳ３）。
【０１２６】
例えば、図４のターゲットプログラム、図６の関数型情報を入力とした場合、第２の関数型記憶部２４には図１０の実関数型情報（特許請求の範囲の第１の実関数型情報）が記憶され、プログラム記憶部２１には、図４のターゲットプログラムと、図１５で示した部分データフローが記憶される。
【０１２７】
続いて、保護属性決定部３３が、第２の関数型記憶部２４に記憶された実関数型情報を用いて、プログラム記憶部２１に記憶されたターゲットプログラム１１における各変数の保護属性を（特定処理手順を考慮せずに）決定し（ステップＳ４：基本保護属性自動決定）、保護属性決定結果１２を出力する。
【０１２８】
この基本保護属性決定処理において、保護属性の決定に成功した場合（ステップＳ５：ＹＥＳ）情報処理装置１は処理を終了するが、保護属性の決定に失敗した場合（ステップＳ５：ＮＯ）、本実施の形態に係る特定処理手順を考慮した保護属性決定処理を行う（ステップＳ６）。この特定処理手順を考慮した保護属性決定処理において、保護属性の決定に成功した場合（ステップＳ７：ＹＥＳ）、情報処理装置１は処理を正常に終了し、保護属性の決定が失敗した場合（ステップＳ７：ＮＯ）異常であるとして処理を終了する。特定処理手順を考慮した保護属性決定処理の詳細については後述する。
【０１２９】
ここで、ステップＳ４の基本保護属性決定処理について図１８を用いて詳細に説明する。まず保護属性決定部３３は、ターゲットプログラム１１の宣言解析により、プログラム中の変数および定数に付与された初期保護属性情報を取得する（ステップＳ１０）。
【０１３０】
次に、保護属性決定部３３は、ステップＳ１０で取得した初期保護属性情報、ターゲットプログラム１１の部分データフローおよび第２の関数型記憶部２４に記憶された実関数型情報から、保護属性決定テーブル記憶部の保護属性決定テーブルを生成（初期化）する（ステップＳ１１）。保護属性決定テーブルは、ターゲットプログラムの部分データフローに、各部分データフローの確定保護属性情報と、各変数がとりうる保護属性候補情報を追記したものである。
【０１３１】
例えば、図４のターゲットプログラム、図１０の実関数型情報、図１５の部分データフローを入力としたときの保護属性決定テーブルは図１９のようになる。
【０１３２】
左２列は図１５の部分データフローとまったく同じである。確定保護属性情報は部分データフロー番号毎の確定した保護属性情報であるが、最初はすべて未決定であるため、すべて空欄の状態で生成される。保護属性候補情報は、関数の入出力部分（関数名が指定されていているもの）には実関数型情報で定義されたその入出力としてとられる変数の保護属性制約が、それ以外の変数部分（関数名が指定されていないもの）にはプログラム中に記載された初期保護属性が（存在すれば）記述される。例えば、部分データフロー番号１の関数入出力#2211_PhysicalRandom(#1)は、図１０の実関数型情報より、その保護属性がverifiedまたはconcealedまたはconfidentialと多重定義されているので、それらが書きこまれる（図１９における「/」はまたはを表す）。一方、部分データフロー番号５の関数入出力#2214_Sign2(#3)は、図１０の実関数型情報の多重定義A、 Bいずれにおいてもconfidentialと定義されているため、confidentialのみが書き込まれる。また、ステップＳ１０で取得した初期保護属性情報より、部分データフロー番号５の変数skAはconfidentialとなっている。保護属性候補情報が空欄となっている部分については制約が無い、すなわち「exposed/fixed/hidden/verified/concealed/confidential」と記録されているのと同じである。
【０１３３】
次に保護属性決定部３３は、保護属性情報が確定していない（確定保護属性情報が空欄の）部分データフローをひとつ選択する。（ステップＳ１２）
次に保護属性決定部３３は、選択した部分データフローの保護属性一致判定が可能かを判定する（ステップＳ１３）。一致判定が可能とは、選択した部分データフローに含まれる変数のうち、保護属性候補情報としてただ１つの保護属性情報が記録されたものが存在するかということである。図１９の例で言えば、保護属性候補情報としてただ１つの保護属性情報が記録された変数は #2401_Input(#1)、 #2401_Input(#2)、 skA、 #2214_Sign2(#3)である。
【０１３４】
もし判定結果がＹＥＳならば、保護属性決定部３３は、選択した部分データフローの保護属性を確定できるかを判定する（ステップＳ１４）。具体的には、選択した部分データフローに含まれる変数のうち、（ステップＳ１３で存在を確認した）保護属性候補情報としてただ１つの保護属性情報が記録された変数を１つ選択し、その変数の保護属性候補情報である（ただ１つの）保護属性情報 att が、選択した部分データフローに含まれる全ての変数の保護属性候補情報に含まれるかを調べる（ステップＳ１４）。含まれる場合は、全ての変数の保護属性を att に確定することができると判定される（ステップＳ１４：ＹＥＳ）。  確定できない場合は（ステップＳ１４：ＮＯ）、制約を満たすような保護属性の割り当てができないということになるため、失敗として保護属性決定処理を終了する。
【０１３５】
保護属性の確定ができる場合（ステップＳ１４：ＹＥＳ）、保護属性決定部３３は、選択した部分データフローの確定保護属性情報として、前ステップで確定した保護属性（ステップＳ１４の説明における保護属性情報 att）を保護属性決定テーブルの確定保護属性情報として書き込む（ステップＳ１５）。
【０１３６】
次に保護属性決定部３３は、確定保護属性情報の影響を保護属性決定テーブルの保護属性候補情報に反映させる（ステップＳ１６）。具体的には、選択した部分データフローに含まれ各実セキュリティ関数または非セキュリティ関数について、多重定義された実関数型情報のうち、選択した部分データフローに含まれる変数が選択した部分データフローの確定保護属性をとるものだけを選択し、選択した関数型により、保護属性決定テーブルにおける同セキュリティ関数または非セキュリティ関数の変数の保護属性候補情報を更新する。
【０１３７】
例えば、図１９において仮に部分データフロー番号１の確定保護属性がverifiedとなったとき、#2402_Output(#1)は verified に確定する。ここで図１０の実関数型情報を見てみると、#2402_Output の多重定義において、第１変数（#2402_Output(#1)）の保護属性は、多重定義Ａでは exposed、多重定義Ｂでは verified となっているため、多重定義Ｂしかとりえないことになる。すると、多重定義Ｂより、第２変数（#2402_Output(#2)）の保護属性は verified しかとりえないことになる。これにより、図１９の保護属性決定テーブルにおける部分データフロー番号２の#2402_Output(#2) の保護属性候補情報は、exposed / verified から verified に更新される。同様に、 #2211_PhysicalRandom(#1) 、#2214_Sign2(#1) の保護属性 が verified に確定することから、#2211_PhysicalRandom は多重定義Ｃ、 #2214_Sign2(#1)は多重定義Ｂが選択され、それに応じて#2214_Sign2(#2)、 #2214_Sign2(#4) の保護属性候補情報はそれぞれ#2214_Sign2の多重定義Ｂから verified、 verified に更新される。
【０１３８】
その後、保護属性決定部３３は、保護属性決定テーブルに保護属性が未確定の（確定保護属性が空欄の）部分データフローが存在するか否かを判定する（ステップＳ１７）。保護属性が未確定の部分データフローが存在しない場合（ステップＳ１７：ＮＯ）、保護属性の決定は成功となり、情報処理装置１は、保護属性決定テーブルから全ての変数と確定保護属性情報の組を抜き出して保護属性決定結果１２を生成し、それを出力して（ステップＳ１８）、処理を終了する。この場合、図１７では、ステップＳ５の判定結果が肯定的となり、情報処理装置１は処理を正常に終了する。一方、保護属性が未確定の部分データフローが存在する場合（ステップＳ１７：ＹＥＳ）、ステップＳ１２に戻り、情報処理装置１は上述の処理を繰り返す。このとき、過去にステップＳ１２で選択されステップＳ１３で一致判定不可能と判定された部分データフローであっても、ステップＳ１６において保護属性候補が絞られることにより、再度ステップＳ１２で選択された時にはステップＳ１３で一致判定可能となる場合がある。このような処理を繰り返すにつれ、保護属性決定テーブルにおける保護属性候補が順次絞られ、保護属性が確定していく。
【０１３９】
前述した部分データフローの分割の仕方により、セキュリティ関数以外の操作は、それぞれ分割された部分データフローに対応する（入出力変数が同じ部分データフローに属する）。上述の検査を行うことにより、セキュリティ関数以外では異なる保護属性が付与された変数の計算が行われないことが保証できるため、機密情報の攻撃者に対する間接的な漏れや、攻撃者により改変された情報によって保護対象の情報が汚染されることが防止できる。
【０１４０】
ステップＳ４で説明した基本保護属性決定処理では、多くのプログラムでその保護属性を自動で決定することが可能であるが、保護属性を自動で決定できない例も存在する。実際、図１９の保護属性決定テーブルでは部分データフロー番号「３」の部分データフローにおいて、入力関数「Input」の第１変数「#2401_Input(#1)」の保護属性候補情報は「exposed」である。しかし、「#2214_Sign2(#2)」の保護属性候補情報は「verified」または「confidential」である。よって、保護属性の一致が不可能である。
【０１４１】
本実施の形態では、特定処理手順を考慮することにより、このような事例に対して１つの解決策を与えている。図１７に示すように、ステップＳ４の基本保護属性決定処理で保護属性の決定に失敗した場合、情報処理装置１は、ステップＳ６で、特定処理手順を考慮した保護属性決定処理を行う。
【０１４２】
ここで、特定処理手順を考慮した保護属性の決定処理の詳細について図２０を用いて説明する。図２０は保護属性の決定処理のフローの例を示す図である。
【０１４３】
まず、代替関数型抽出部２７が、プログラム記憶部２１に記憶されたターゲットプログラムに含まれる実セキュリティ関数毎に、特定処理手順と実関数型の組からなる代替実関数型情報を第２の代替関数型記憶部２８に抽出する（ステップＳ３０）。
【０１４４】
例えばターゲットプログラムが図４、第１の代替関数型記憶部２６に記憶された代替関数型情報が図１１のとき、抽出される代替実関数型情報は図１３のようになる。
【０１４５】
次に、選択部３０が、第２の代替関数型記憶部２８に記憶された代替実関数型情報のうち、未選択のものを１つ選択取得する（ステップＳ３１）。選択できた場合（ステップＳ３２：ＹＥＳ）、ステップＳ３３に進むが、選択できない場合（すべて選択したことがある、あるいは選択できるものがもともとない）（ステップＳ３２：ＮＯ）、保護属性の決定は失敗する。ここでの失敗は、特定処理手順を考慮しても、セキュリティの観点から安全でないデータフローが存在するということを意味している。この場合、図１７のステップＳ７が否定的となり、異常であるとして情報処理装置１は処理を終了する。
【０１４６】
ステップＳ３２が真となった場合、判定部３１が、選択部３０が選択した代替実関数型情報における特定処理手順がプログラム記憶部２１に記憶された部分データフローに存在するかを判定する（ステップＳ３３）。具体的には、選択された特定処理手順に含まれる各始点実セキュリティ関数の特定出力と終点実セキュリティ関数の特定入力の組について、特定出力と特定入力が同じ部分データフローに含まれるかどうかを判定する。判定結果が真のとき（ステップＳ３３：ＹＥＳ）は、ステップＳ３４に進み、判定結果が偽のとき（ステップ３３：ＮＯ）は、ステップ３１に戻る。
【０１４７】
例えば部分データフローが図１５、代替実関数型情報が図１３のとき、ステップＳ３１で選択部３０は図１３の番号１、または２を選択する。ステップＳ３１で番号１が選択された場合、特定処理手順で示された「#2211_PhysicalRandom(#1)」と「#2214_Sign2(#1)」は共に図１５の部分データフローにおける部分データフロー「１」に含まれる。この特定処理手順には始点実セキュリティ関数の特定出力と終点実セキュリティ関数の特定入力の組が１つしかないため、ステップＳ３３での判定結果はＹＥＳとなる。また、ステップＳ３１で番号２が選択された場合、「#2211_PhysicalRandom(#1)」と「#2214_Sign2(#2)」が図１５において異なる部分データフローグラフに含まれているため、ステップＳ３３での判定結果はＮＯとなる。
【０１４８】
なお、図１１の３〜６番目のように始点関数の特定出力と終点関数の特定入力の組が複数存在する場合は、複数存在する組のそれぞれがいずれかの部分データフローグラフに含まれるかどうかを調べることになる（全ての組が同一の部分データフローに含まれる必要はない）。
【０１４９】
ステップＳ３３の判定結果が真のときは、更新部３２が、判定部３１が選択した実セキュリティ関数の代替実関数型情報に対応付けられた実関数型情報で、第２の関数型記憶部２４における同実セキュリティ関数の実関数型情報を置き換える（ステップＳ３４）。例えば上記の例で、ステップＳ３１で選択部３０が図１３の番号１を選択し、ステップＳ３３でＹＥＳと判定された場合、更新部３２は、図１３の番号１で指定される実関数型情報で、図１０の#2214_Sign2の実関数型情報を置き換えるため、結果は図２１のようになる。
【０１５０】
次いで、保護属性決定部３３が、ステップＳ３３で更新した第２の関数型記憶部２４に記憶された実関数型情報を用いて、プログラム記憶部２１に記憶されたターゲットプログラム１１における（特定処理手順を考慮した）各変数の保護属性決定を行い（ステップＳ３５）、保護属性決定結果１２を出力する。この基本保護属性決定処理において、保護属性の決定に成功した場合（ステップＳ３６：ＹＥＳ）情報処理装置１は処理を終了する。保護属性の決定に失敗した場合（ステップＳ３６：ＮＯ）、更新部３２は、ステップＳ３４で置き換えた実関数型情報を更新前の状態にもどす（ステップＳ３７）。具体的には、復元部３５が、一時記憶部２５から取得した実セキュリティ関数の実関数型情報で、第２の関数型記憶部２４における実関数型情報（実セキュリティ関数型情報）を置き換える。その後ステップＳ３１に戻る。
【０１５１】
例えば上記の例において、図２１のように更新された実関数型情報を使ってステップＳ３５の基本保護属性決定を行うと、初期状態（図１８におけるステップＳ１１終了後）の保護属性決定テーブルは図２２のようになり、部分データフロー番号３の保護属性候補情報が exposed で一致可能であることがわかる。実際この保護属性決定テーブルを用いて保護属性自動決定を行ったときの保護属性候補情報の変化は図２３のようになる。実際は保護属性決定テーブルの保護属性候補情報を随時更新していくが、この図では保護属性候補が絞られていく様子がわかるように、保護属性候補情報の変化の過程を示している。網掛けの部分は、その部分データフローがステップＳ１２で選択され、候補が複数あった変数の保護属性が太字の保護属性に確定したことを意味している。また、それ以外の部分データフローにおける太字は、選択された部分データフローの保護属性が確定したことにより、保護属性候補情報がステップＳ１６において派生的に限定されたことを示している。例えばフェーズ１では部分データフロー番号３の保護属性がexposedに確定し、#2214_Sign2(#2)の保護属性が verified に確定したことによって、#2214_Sign2(#1)、 #2214_Sign2(#4)の保護属性も（図２１の #2214_Sign2 の多重定義がＢに決定することより）それぞれ verified となっている。最終的に、すべての保護属性が決定し、保護属性決定部３３は、図１６に示す保護属性決定結果１２を出力する。
【０１５２】
以上のように、本実施形態においては、特定処理手順を考慮して、各変数に付与すべき保護属性情報を決定する。例えば、図４に示すターゲットプログラムの例の場合では、乱数生成関数の出力から署名生成関数の入力（の一方）への経路が存在する場合に限り、署名生成関数の入力（のもう一方）に完全性がない値が入力されたときの署名生成を許可するというルールを適用することで、各変数に適切な保護属性情報を付与することができる。
【０１５３】
また、保護属性自動決定では、セキュリティプロトコルの記述で用いる各変数に完全性や機密性に関する保護属性を付与し、非セキュリティ関数および代入などの演算による計算は同一の保護属性の変数間に限定する。これにより、保護データと非保護データとが分離される。更に、暗号化処理による保護属性の変換に対応するため、異なる保護属性間での計算を、セキュリティ関数によるものに限定し、計算の種別ごとに入力及び出力の保護属性を関数型情報により制限する。例えば、公開鍵暗号文復号関数においては、秘密鍵は機密性と完全性との両方が要求される。また、入力される暗号文は非保護データであるのに対して、復号された結果である出力は、機密性を有する保護データとなる。これにより、保護属性の変換が安全な計算のみに限定され、例えば特許文献１の技術のように保護データを誤って外部に出力してしまう恐れを排除して、保護属性の変換誤りを低減することができる。
【０１５４】
以上のように本実施の形態においては、(R1)異なる保護属性の計算を禁止する、(R2)一方向性計算での保護属性の変換及び入力及び出力の保護属性を限定する、という２つのルールをベースとし、更に、(R3) 特定処理手順を考慮して保護属性を決定することにより、各変数に対して保護属性を適切に付与することができる。従来技術では、特定処理手順に応じて関数型情報を動的に変化させることはできず、適切な保護属性を付与することができない。本実施の形態においては、特定処理手順に注目することで、保護属性を適切に付与することができる。このようなプロトコルには、例えば、インターネットにおける標準的なプロトコルである SSL/TLSや、映像コンテンツのコピープロテクト規格であるAACSにおけるドライブ認証プロトコルがあり、これらのプロトコルに本実施の形態の構成を適用することは有用である。
【０１５５】
以上のことから、保護メモリ領域及び非保護メモリ領域の２種類のメモリ領域にアクセス可能なプログラミングモデルにおいて、保護メモリ領域を活用した一般的なセキュリティプロトコルの安全な実装の支援することができる。つまり、本実施の形態においては、このようなプログラミングモデル上で、一般的なセキュリティプロトコルにおいて保護メモリ領域に記憶すべき保護データと非保護メモリ領域に記憶すべき非保護データとの分離を適切に行うために、データの流れ（データフロー）だけではなく、途中で行われる暗号化処理などの各処理およびその処理手順（処理経路）に注目して、各変数に対する保護属性を適切に決定している。この結果、これらの変数を保護属性に応じて保護メモリ領域又は非保護メモリ領域に適切に記憶させることができ、非保護メモリ領域を利用した外部からの入出力と内部に保持すべき変数に対する保護メモリ領域における保護とを両立させることができる。
【０１５６】
図２４は、本実施形態の発明をスマートグリッドに適用した例について示す図である。
【０１５７】
本実施の形態にかかるセキュリティプロトコルに従ったプログラムモジュールが実行されるターゲットシステム１０１として、スマートグリッド（次世代電力網）におけるスマートメータが考えられる。スマートグリッドとは、大規模発電や分散型発電などの電力の供給側と、住宅やオフィスなどの電力の需要側を結ぶ、電力と通信のネットワーク、あるいはこれを含んだシステム全体のことを指す。通信技術を利用した制御技術により、消費者の電力需要をリアルタイムで把握・予測しながら需要に応じて太陽光発電や蓄電池から電力を供給したり、家庭やビルで使用している機器の電源を制御したりすることで、電力の需要と供給のバランスを取ることが可能になり、電源と負荷双方を制御することが可能となる。また、スマートメータとは、通信機能つきの電力量計のこと、あるいはこれを含んだシステム全体の事を指す。以下では、スマートメータという言葉は前者をあらわすものとする。スマートグリッドおよびスマートメータの概念図を図２４の下部に示す。スマートメータ７０１は、住宅７０２あるいはオフィスなどにおいて家電７０３あるいはその他の電力を使用する機械等より使用された電気使用量などのデータを記録する。スマートメータ７０１は、電力網（スマートグリッド）７０４を介して、電力事業者７０５、制御・検針端末７０６、発電所７０７などとの双方向通信が可能である。スマートメータ７０１は、電力事業者７０５、制御・検針端末７０６、発電所７０７からのリクエストに応じて記録したデータを送信したり、家電７０３の制御を行ったりする。逆に、スマートメータ７０１から送信されたデータに従い、発電所７０７における電力供給量を制御するといったことも考えられる。
【０１５８】
スマートメータ７０１は、スマートグリッド７０４を介して、電力使用量などのプライバシー情報（機密情報）をスマートグリッド７０４経由で転送したり、制御・検針端末７０６あるいは他のスマートメータとの認証を行ったりするため、機密情報を扱うことになる。一方で、スマートグリッド７０４を介した外部との通信も必須である。そのため、スマートメータ７０１のファームウェアにおいて、セキュリティプロトコルを実行する必要があり、プロトコルに含まれる各データを適切に保護する必要がある。
【０１５９】
図２４の上部は、スマートメータ７０１の詳細について、図１に対応させて説明した図である。スマートメータ７０１（図１の１０１に対応）のファームウェア実行装置７０８（図１の２０１に対応）は、保護メモリ領域２１５、非保護メモリ領域２１４を持つ。例えば、プロセッサ内部のオンチップメモリと、プロセッサ外部のオフチップメモリをそれぞれ保護メモリ領域２１５と非保護メモリ領域２１４とみなすことができる。このとき、本実施の形態における情報処理装置１を利用することにより、スマートメータ７０１で実行されるセキュリティプロトコルを実現するファームウェア（プログラム）における（機密情報などを含む）変数の保護属性を適切に決定し、変数の値を適切に保護することが可能となる。特に、認証などにおいては、チャレンジアンドレスポンスプロトコルがよく利用されるため、本実施の形態における特定処理手順を考慮した保護属性自動決定により、従来の手法では判定ができなかったチャレンジアンドレスポンスプロトコルを実現するプログラムに対しても、各変数に対して適切な保護属性を決定することが可能となる。
【０１６０】
尚、上述の実施の形態においては、ステップＳ３１で唯１組の代替実関数型情報を選択しているため、実関数型情報の更新は唯１の代替実関数型情報を用いて行われる。これに限らず、一度に複数の代替実関数型情報を選択する、複数の特定処理手順を考慮した保護属性自動決定についても、上記の実施の形態から容易に類推できる。
【０１６１】
例えば、図２０において、ステップＳ３１で第２の代替関数型記憶部２８に記録された代替実関数型情報全体からなる集合の部分集合を１つ選択し、ステップＳ３３で当該部分集合に含まれるすべての代替実関数型情報に対応付けられた特定処理手順がプログラムに存在するかを判定し、ステップＳ３４で同部分集合に含まれる全ての代替実関数型情報（特許請求の範囲の第２の代替関数型情報に対応）に対応付けられた実関数型情報で、第２の関数型記憶部の実関数型情報（特許請求の範囲の第１の実関数型情報に対応）の更新を行い、ステップＳ３６で基本保護属性自動決定を行うことで、複数の特定処理手順を考慮した保護属性自動決定を行うことができる。また、これに限らず、実関数型情報の更新を再帰的に行ったり、必要な情報を管理しながら処理を繰り返し実行したりすることによっても、複数の特定処理手順を考慮した保護属性自動決定を行うことができる。
【０１６２】
本実施の形態によれば、セキュリティプロトコルに従ったプログラムの各変数に対して保護属性を適切に決定することが可能になる。
【０１６３】
上述の実施の形態においては、部分データフローを用いてステップＳ３３の特定処理手順の検出とステップＳ３５（あるいはステップＳ４）の保護属性自動決定を行ったが、必ずしも部分データフローを用いる必要はない。
【０１６４】
特定処理手順の検出は、特定処理手順を表すグラフ（例えば図１２のようなデータフロー）がターゲットプログラムのグラフ（例えば図１４のようなデータフロー）に存在するかどうかを、グラフマッチングなどのアルゴリズムを用いて行ってもよい。あるいは、ターゲットプログラムを直接解析して、特定処理手順における始点実セキュリティ関数の特定出力と、終点実セキュリティ関数の特定入力に共通に使われている変数があるかどうかを調べてもよい。
【０１６５】
保護属性自動決定について、上述の実施の形態では、代入や演算子による演算を部分データフローの端点とせず、それらの入出力を同じ部分データフローに所属させることで、それらの入出力保護属性が同じでなければならないという条件を定義していた。その代替として、代入や演算子を用いた命令についても、それらの呼び出し毎に、入出力が同じ保護属性をとらなければならないという実関数型情報を第２の関数型記憶部に記憶し、各実関数および代入や演算子による演算について、その入出力変数の保護属性が、対応する実関数型情報のいずれか１つで規定された保護属性と一致するようなターゲットプログラムに含まれる全変数の保護属性を決定してもよい。この決定は、（実関数型情報による）制約条件をみたす解（各変数の保護属性情報）を求める問題と考えられるため、一般的に知られる制約問題を解くアルゴリズムを用いてもよい。例えば、全変数の保護属性を適当に仮決定し、それが実関数型情報による制約条件を満たすかどうかを順次判定していってもよいし、バックトラックなどを用いて全変数の保護属性候補の選択を効率的に行ってもよい。
【０１６６】
（第２の実施形態）
次に、情報処理装置、プログラム開発システム、プログラム検証方法及びプログラムの第２の実施の形態について説明する。なお、上述の第１の実施の形態と共通する部分については、同一の符号を使用して説明したり、説明を省略したりする。
【０１６７】
本実施の形態における構成では、第１の実施の形態における構成に加え、前記保護属性決定手段が出力した保護属性を前記ターゲットプログラムにおける変数に定義する保護属性付与部と、当該ターゲットプログラムから、前記各変数の保護属性に応じて当該変数が格納されるメモリ領域を決定し、これらのメモリ領域を反映したコンピュータで実行可能な実行可能形式プログラムを生成するコンパイル部とを備える。 
本実施の形態においては、機械語プログラムの生成と開発とを行うシステムについて説明する。上述の第１の実施の形態における保護属性決定処理においては、ターゲットプログラムのプログラムリストを解析し、各変数に対して適切な保護属性を決定して付与した。しかし、この決定が適切に行われるためには、ターゲットプログラムのプログラムリストの記述において、セキュリティプロトコルにかかるデータフローが正しく記述されていることが前提である。当然セキュリティプロトコルの仕様自体が機密情報を不用意に漏らしてしまうような欠陥を持たないこともこれ以前の前提として含まれるが、セキュリティプロトコルの仕様自体の安全性検証についてはいくつかの手法が既に知られており、本実施の形態においては実装対象のセキュリティプロトコルが安全性について予め検証済みであることを前提とする。このような技術の例として、以下の参考文献「Reasoning About Belief in Cryptographic Protocols”Li Gong、Roger Needham、Raphael Yahalom 1990 IEEE Symposium on Security and Privacy、1990」に形式的手法を用いたプロトコル検証の例が開示されている。本実施の形態では実装対象のセキュリティプロトコルの仕様はこの参考文献の手法に限定せず、なんらかの安全性検証が予め行われていることを前提とする。
【０１６８】
さて、セキュリティプロトコルにかかるデータフローが正しく実装されているかを検証する場合、通常、ターゲットプログラムを実行して入力及び出力が仕様に正しく従うかを判定するいわゆる機能検証が用いられる。一方、本実施の形態においては、変数の保護属性を自動で決定することができるが、適切に保護属性が決定されるためには、プロトコルのデータフローが正しく実装されていることが前提である。よって、プログラマはまず第１段階でデータフローの誤りを排除し、第２段階で、本実施の形態にかかる情報処理装置１により保護属性を自動で決定する。
【０１６９】
図２５は、本実施の形態にかかる保護属性決定処理を適用したプログラム開発フローである。開発フローは大きく２つに分かれている。１つは、プログラマがデータフローの誤りを排除して機能検証を行うフェーズ１１００であり、当該データフローの各変数に対して情報処理装置１が保護属性を自動で決定して実行可能な形式のプログラムを自動的に生成するフェーズ１２００とである。フェーズ１１００では、プログラマは、セキュリティプロトコルにかかるプログラムの開発を開始して、データフローの正しさに注意してプログラムのプログラムリストを記述する(ステップＳ１１０１)。この段階では、プログラマは変数に対して保護属性を付与しないでプログラムのプログラムリストを記述する。ただし、プログラマはデータフローの実装において基本的な変数、例えば、自身の秘密鍵のような信頼の基点(Root of Trust)となる変数については、この時点で適切な保護属性を把握しておくことが一般的であると考えられる。
【０１７０】
次にプログラマはコンパイラで当該プログラムの実行形式を生成し(ステップＳ１１０２)、それを実行して、機能試験用の入力データに対して所望の出力データが得られるかの機能試験を行う(ステップＳ１１０３)。この機能試験に失敗した場合（ステップＳ１１０４：ＮＯ）、プログラマはデータフローの誤りを修正し(ステップＳ１１５１)、ステップＳ１１０２〜Ｓ１１０３でコンパイル及び機能試験を再度行い、機能試験の結果が正しくなるまで（ステップＳ１１０４：ＹＥＳ）ステップＳ１１５１、Ｓ１１０２〜Ｓ１１０３を繰り返す。機能試験用の適切な入力データが与えられていれば、この機能試験の結果が正しくなった段階ではデータフローの誤りは排除されているはずである。次にプログラマは、情報処理装置１に当該プログラムをターゲットプログラムとして入力して、上述の第１の実施の形態で説明した基本保護属性自動決定および特定処理手順を考慮した保護属性決定処理（図１７）を情報処理装置１に行わせる。情報処理装置１への入力として、プログラマがステップＳ１１０１の段階において把握している上述のRoot of Trustの保護属性をターゲットプログラム中の変数の初期値として与えることもある。そして、保護属性決定処理の結果、保護属性の決定に失敗した場合は（ステップＳ１２０２：ＮＯ）、セキュリティプロトコルの仕様に従ってデータフローが正しく記述されていても、プログラマが余分な変数やデータフローを実装のために付加してしまったため、機密情報を外部に出力したり漏洩したりしている、あるいは保護すべき変数を信用できない入力で汚染してしまうようなプログラムとなっていると考えられる。
【０１７１】
一方、保護属性の決定に成功した場合は（ステップＳ１２０２：ＹＥＳ）、情報処理装置１における保護属性付与部が、ターゲットプログラムのプログラムリストを書き換える。具体的には、保護属性付与部は、プログラムリストの各変数に対して自動で決定した保護属性をプログラムリストに付加する(ステップＳ１２０３)。図２６は、図４に示したターゲットプログラムに対してステップＳ１２０１の保護属性自動決定を行ったとき、出力される図１６の保護属性決定結果に従ってターゲットプログラムを書き換えた例を示す図である。同図においては、４、５行目のパラメータ（変数）、及び７〜１１行目の変数に保護属性が付加されていることが示されている。最後に、情報処理装置１におけるコンパイル部が、ステップＳ１２０３でプログラムリストを書き換えたプログラムをコンパイルする(ステップＳ１２０４)。この結果、保護属性に応じて変数の値を保護メモリ領域又は非保護メモリ領域に適切に記憶させることができる実行可能な形式のプログラムが生成される。
【０１７２】
以上のような構成によれば、セキュリティに詳しくないプログラマがセキュリティプロトコルにかかるプログラムを開発したとしても、情報処理装置１が各変数に対して適切な保護属性を自動で付与し、保護属性に応じて変数の値が適切なメモリに記憶される実行可能形式のプログラムを開発することが可能である。このため、セキュリティプロトコルにかかるプログラムの開発環境を向上させることができる。
【０１７３】
例えば、第１の実施の形態において図２４で示したスマートメータ７０１上で実行されるセキュリティプロトコルを実現するファームウェア（プログラム）において、本実施の形態によれば、プログラム中の変数の値を、スマートメータにおけるプロセッサ内部のオンチップメモリ（保護メモリ２１５）と、プロセッサ外部のオフチップメモリ（非保護メモリ２１４）に適切に格納して実行するファームウェア（プログラム）を生成することができる。
【０１７４】
上記までの実施形態にかかる発明は、例えば以下のような場面での適用が考えられる。
【０１７５】
近年、ＰＣ（Ｐｅｒｓｏｎａｌ  Ｃｏｍｐｕｔｅｒ）等の情報機器の普及に伴い、コンピュータセキュリティに対する意識が高まっている。このため、個人情報など、コンピュータ内部に保護すべきデータ（保護データ）をもつようなソフトウェアを安全に実行するためには、ソフトウェア内の保護データを外部に出力しないように、機密性を有する保護データと、外部に入出力するための非保護データとを分離して扱う必要がある。例えば、コンピュータ内に保護すべきデータがある場合、ＯＳ（Ｏｐｅｒａｔｉｎｇ  Ｓｙｓｔｅｍ）の特権モードと、通常モードとでユーザがアクセスできる領域を切り分けることで、不必要にデータが読み出されることを防止している。また、従来技術では、モードの切り替えによりメモリを保護するのではなく、セキュアメモリ空間のデータや命令を外部に読み出すことをできなくすることで、保護データの悪用を回避している。即ち、プロセッサがアクセスするメモリ空間にはセキュア空間と非セキュア空間とがあり、セキュア空間からレジスタに読み込んだ情報にはセキュアであることを示す一種のセキュリティタグが付与され、当該データを非セキュア空間へ書き出すことができない機構を設ける。このような機構により、セキュア空間の情報が非セキュア空間に漏れ出ることを防止する。
【０１７６】
セキュア空間と呼ばれているメモリ領域（保護メモリ領域）の実現方法としては、アクセス制御のみによるもののほか、従来技術の暗号機能とチップ内メモリのアクセス制御の組み合わせにより実現されるものもある。暗号機能との組み合わせにより保護が実現される場合、保護の概念は権限を持つ人だけが情報にアクセスでき、権限のない人が読み取れないという性質である機密性の保護と、情報が完全・正確であり、不慮の事故による欠落や攻撃者による改ざんがないという性質である完全性の保護との２種類に分離され、どちらか片方の保護のみが提供される場合がある。もちろん機密性と完全性との両方の保護を提供することも可能である。
【０１７７】
従来技術における方法は保護データと非保護データとを分離するためのメモリ領域をハードウェア的に提供するものであるが、これらを用いてセキュリティプロトコルを実装する場合を考えると、関数による計算において保護データと非保護データとの混在が必然となる。例えば、暗号化を行う関数の場合、保護データである秘密にやり取りしたいメッセージを秘密鍵で暗号化し、外部に出力可能な暗号文にしてから出力する。外部に出力可能にするとは、非保護データにする、すなわちそれを出力しても保護データや秘密鍵の情報が漏れない状態にするということである。
【０１７８】
従来技術における方法ではこのような場合例外的にセキュリティタグを解除し、保護データと非保護データとの混在を可能にする機構を前提としている。しかし、この機構の誤用を防止できない恐れがある。即ち、セキュリティタグを誤って解除してしまうことで、保護データを誤って外部に出力してしまうような可能性がある。
【０１７９】
従来技術では、プログラム内部に保護レベルの異なるデータとプログラムの部分とが存在するとき、Information Flow Analysisと呼ばれる方法により、高レベルのデータの情報が低レベルの部分に漏れ出すことを防止しながら、セキュリティレベルの異なるプログラム部分間のデータ交換を行うものである。具体的には、セキュリティレベル間のデータ移動における型検査と、高レベルのデータを低レベルに落とす際プログラマに特殊操作を明示的に強制もしくは暗号化操作を適用している。尚、低レベルから高レベルへの変換は無条件で可能である。この方法では、暗号化操作によるセキュリティレベルの変換を用いることで、暗号化処理における保護データと非保護データとの混在を可能としている。しかし、従来技術では、保護データを出力するための暗号鍵はプログラムが静的に保持するもの及び静的に保持するものの派生値に限定される。そのため、外部から送信された値もしくは外部と共有した値を暗号鍵として利用することは禁止されている。このような暗号鍵の利用方法はセキュリティプロトコルではよくあるため、従来技術の技術をセキュリティプロトコル一般に適用することは困難である。従って、セキュリティプロトコルの安全な実装のために、プログラムの各変数に対してデータの保護の要否を適切に決定することが望まれていた。
【０１８０】
このような課題に対して、従来技術では、セキュリティプロトコルに含まれる暗号、署名、ハッシュ関数等のセキュリティ関数に注目した保護属性決定方式がある。従来技術では、各セキュリティ関数について、計算量的一方向性と完全性の保証との有無に基づいて変数の値を保護されたメモリ領域又は非保護のメモリ領域に記憶させることを要求する保護属性が定義されており、この条件からプログラムの各変数の保護属性を決定する。従来技術では、外部から送信された値もしくは外部と共有した値を暗号鍵として利用するようなセキュリティプロトコルについて、保護属性を適切に決定する方法があった。
【０１８１】
従来技術では、関数ごとに定義された入出力保護属性条件を比較しながら保護属性を決定するが、変数の値がどの関数から出力され（いくつかの処理を経て）どの関数に入力されたかという処理手順（経路）情報は考慮していない。
【０１８２】
例えば、ある変数の保護属性を決定する場合、その変数の経路情報に注目しないと、保護属性が適切に決定できない場合が存在する。例えば、ＳＳＬ（Ｓｅｃｕｒｅ  Ｓｏｃｋｅｔ  Ｌａｙｅｒ）等に含まれ、認証プロトコルで頻繁に用いられるチャレンジアンドレスポンスプロトコルでは、完全性のある乱数と完全性のない外部入力に対して署名をつけるといった処理が行われる。このとき、前者の入力は完全性を持つだけでは不十分であり「乱数」である必要がある。従来技術では、完全性がある乱数と完全性がある定数は同様に扱われてしまうため、乱数のときに署名を許可し、定数の時に許可しないといった保護属性の決定を行うことができない。
【０１８３】
同様に、別のチャレンジアンドレスポンスプロトコルでは、完全性のある乱数と完全性のない外部入力をハッシュ関数に通した値に署名をするようなものも存在する。この場合も、ハッシュ値に完全性のある「乱数」が含まれることが署名許可の条件と考えられるが、従来技術の方式では、ハッシュ値に完全性のある乱数が含まれるかどうかという情報を用いることができないため、適切な保護属性自動決定を行うことができない。
【０１８４】
本発明の一観点は、上述に鑑みてなされたものであって、セキュリティプロトコルに従ったプログラムの各変数に対して保護属性を適切に決定することが可能になる。
【０１８５】
尚、フェーズ１２００のうち、ステップＳ１２０１〜Ｓ１２０２を情報処理装置１が行い、ステップＳ１２０３以降の処理についてはプログラマが行うようにしても良い。
【０１８６】
なお、本発明は前記実施形態そのままに限定されるものではなく、実施段階ではその要旨を逸脱しない範囲で構成要素を変形して具体化できる。また、前記実施形態に開示されている複数の構成要素の適宜な組み合わせにより、種々の発明を形成できる。例えば、実施形態に示す全構成要素から幾つかの構成要素を削除してもよい。さらに、異なる実施形態にわたる構成要素を適宜組み合わせてもよい。
【０１８７】
なお、上記各実施形態に記載した手法は、コンピュータに実行させることのできるプログラムとして、磁気ディスク（フロッピー（登録商標）ディスク、ハードディスクなど）、光ディスク（ＣＤ−ＲＯＭ、ＤＶＤなど）、光磁気ディスク（ＭＯ）、半導体メモリなどの記憶媒体に格納して頒布することもできる。
【０１８８】
また、この記憶媒体としては、プログラムを記憶でき、かつコンピュータが読み取り可能な記憶媒体であれば、その記憶形式は何れの形態であっても良い。
【０１８９】
また、記憶媒体からコンピュータにインストールされたプログラムの指示に基づきコンピュータ上で稼働しているＯＳ（オペレーティングシステム）や、データベース管理ソフト、ネットワークソフト等のＭＷ（ミドルウェア）等が本実施形態を実現するための各処理の一部を実行しても良い。
【０１９０】
さらに、本発明における記憶媒体は、コンピュータと独立した媒体に限らず、ＬＡＮやインターネット等により伝送されたプログラムをダウンロードして記憶または一時記憶した記憶媒体も含まれる。
【０１９１】
また、記憶媒体は１つに限らず、複数の媒体から本実施形態における処理が実行される場合も本発明における記憶媒体に含まれ、媒体構成は何れの構成であっても良い。
【０１９２】
尚、本発明におけるコンピュータは、記憶媒体に記憶されたプログラムに基づき、本実施形態における各処理を実行するものであって、パソコン等の１つからなる装置、複数の装置がネットワーク接続されたシステム等の何れの構成であっても良い。
【０１９３】
また、本発明におけるコンピュータとは、パソコンに限らず、情報処理機器に含まれる演算処理装置、マイコン等も含み、プログラムによって本発明の機能を実現することが可能な機器、装置を総称している。
【０１９４】
本発明のいくつかの実施形態を説明したが、これらの実施形態は、例として提示したものであり、発明の範囲を限定することは意図していない。これら新規な実施形態は、その他の様々な形態で実施されることが可能であり、発明の要旨を逸脱しない範囲で、種々の省略、置き換え、変更を行うことができる。これら実施形態やその変形は、発明の範囲や要旨に含まれるとともに、特許請求の範囲に記載された発明とその均等の範囲に含まれる。
【符号の説明】
【０１９５】
１・・・情報処理装置
１１・・・ターゲットプログラム
１２・・・保護属性決定結果
２０・・・プログラム受付部
２１・・・プログラム記憶部
２２・・・第１の関数型記憶部
２３・・・関数型抽出部
２４・・・第２の関数型記憶部
２５・・・一時記憶部
２６・・・第１の代替関数型記憶部
２７・・・代替関数型抽出部
２８・・・第２の代替関数型記憶部
２９・・・部分データフロー変換部
３０・・・選択部
３１・・・判定部
３２・・・更新部
３３・・・保護属性決定部
３４・・・保護属性決定テーブル記憶部
３５・・・復元部
【図１】
0005171907.tif 000002
【図２】
0005171907.tif 000003
【図３】
0005171907.tif 000004
【図４】
0005171907.tif 000005
【図５】
0005171907.tif 000006
【図６】
0005171907.tif 000007
【図７】
0005171907.tif 000008
【図８】
0005171907.tif 000009
【図９】
0005171907.tif 000010
【図１０】
0005171907.tif 000011
【図１１】
0005171907.tif 000012
【図１２】
0005171907.tif 000013
【図１３】
0005171907.tif 000014
【図１４】
0005171907.tif 000015
【図１５】
0005171907.tif 000016
【図１６】
0005171907.tif 000017
【図１７】
0005171907.tif 000018
【図１８】
0005171907.tif 000019
【図１９】
0005171907.tif 000020
【図２０】
0005171907.tif 000021
【図２１】
0005171907.tif 000022
【図２２】
0005171907.tif 000023
【図２３】
0005171907.tif 000024
【図２４】
0005171907.tif 000025
【図２５】
0005171907.tif 000026
【図２６】
0005171907.tif 000027