(57)【特許請求の範囲】
【請求項１】
保護すべきデータの入出力に係る引数毎に、当該引数の値を保護されたメモリ領域又は非保護のメモリ領域に格納することを要求する保護属性を規定したセキュリティ関数の型を複数記憶する第１記憶手段と、
前記データの格納領域を表す変数の前記保護属性が記述されるとともに、前記第１記憶手段に記憶されたセキュリティ関数のうち何れか又は全てを用いて所定の処理の実行手順が記述されたプログラムリストを記憶する第２記憶手段と、
前記変数の保護属性に基づいて、前記プログラムリストに記述されたセキュリティ関数の入出力に係る実引数の保護属性を特定する特定手段と、
前記特定手段により特定されたセキュリティ関数の入出力に係る全ての実引数の保護属性が、当該セキュリティ関数に対応する前記第１記憶手段に記憶されたセキュリティ関数の型の保護属性と一致するか否かを判定する判定手段と、
前記判定手段による判定の結果、不一致が確認された場合にその旨を示したエラー情報を出力する出力手段と、
を備えたことを特徴とする情報処理装置。
【請求項２】
前記データの入出力に係る引数の全てについて、前記保護属性が同一となるよう定義された非セキュリティ関数の型を複数記憶する第３記憶手段をさらに備え、
前記特定手段は、前記プログラムリストに記述された前記変数の保護属性に基づいて、当該プログラムリストに記述された非セキュリティ関数の入出力に係る実引数の保護属性を特定し、
前記判定手段は、前記特定手段により特定された非セキュリティ関数の入出力に係る全ての実引数の保護属性が、当該非セキュリティ関数に対応する前記第３記憶手段に記憶された非セキュリティ関数の型の入出力に係る引数の保護属性と一致するか否かを判定することを特徴とする請求項１に記載の情報処理装置。
【請求項３】
前記保護属性は、前記保護の仕方として、保護を行わない非保護、機密性のみを保護する機密性保護、完全性のみを保護する完全性保護、機密性及び完全性を保護する機密完全性保護の何れかを定義することが可能であることを特徴とする請求項１又は２に記載の情報処理装置。
【請求項４】
前記第１記憶手段は、入出力に係る引数の保護属性が異なり、且つ、同一のセキュリティ関数名で多重定義されたセキュリティ関数の型を記憶し、
前記プログラムリストに記述された処置の実行手順を複数の部分処理に分割する第１分割手段と、
前記第１分割手段により分割された複数の部分処理から、検証対象となる部分処理を順選択する選択手段と、
前記検証対象の部分処理がセキュリティ関数か否かを判定する第２判定手段と、
を更に備え、
前記特定手段は、前記第２判定手段によりセキュリティ関数と判定された場合、前記検証対象の実引数の保護属性に基づいて、当該検証対象に対応するセキュリティ関数の型を前記多重定義されたセキュリティ関数の型から特定し、
前記判定手段は、前記特定手段によりセキュリティ関数の型が特定された場合に、前記検証対象に係る全ての実引数の保護属性と仮引数の保護属性とが一致すると判定することを特徴とする請求項１又は２に記載の情報処理装置。
【請求項５】
前記プログラムリストに記述された処理の実行手順から、当該各処理でのデータの入出力の関係を示したデータフローグラフを生成するデータフローグラフ生成手段と、
前記データフローグラフに含まれた前記セキュリティ関数へのデータの入出力関係に基づいて、当該データフローグラフを複数の部分データフローに分割する第２分割手段と、
を更に備え、
前記判定手段は、前記第２分割手段により分割された部分データフロー毎に前記保護属性の一致判定を行うことを特徴とする請求項１又は２に記載の情報処装置。
【請求項６】
前記部分データフローを構成する要素のうち、保護属性が確定済みの要素から保護属性が未確定の要素の保護属性を順次確定する第１確定手段を更に備え、
前記判定手段は、全ての前記要素の保護属性が確定済みとなった部分データフロー毎に前記保護属性の一致判定を行うことを特徴とする請求項５に記載の情報処装置。
【請求項７】
前記判定手段による判定の結果、全ての保護属性の一致が確認されたプログラムリストをコンパイルし、当該プログラムリストからコンピュータで実行可能な実行可能形式プログラムを生成するコンパイル手段を更に備えたことを特徴とする請求項１〜６の何れか一項に記載の情報処理装置。
【請求項８】
前記コンパイル手段は、前記各変数の保護属性に応じて当該変数が格納されるメモリ領域を決定し、これらのメモリ領域を反映した前記実行可能形式プログラムを生成することを特徴とする請求項７に記載の情報処理装置。
【請求項９】
前記プログラムリストは、前記保護属性が定義済みの第１変数群と、前記保護属性が未定義の第２変数群とを含み、
前記プログラムリストに記述された前記第１変数群の保護属性と、前記セキュリティ関数の入出力に係る実引数の保護属性と、前記第１記憶手段に記憶された各セキュリティ関数の入出力に係る引数の保護属性と、に基づいて、前記第２変数群の保護属性を順次確定する第２確定手段を更に備えたことを特徴とする請求項１又は２に記載の情報処理装置。
【請求項１０】
前記セキュリティ関数は、一方向関数であることを特徴とする請求項１に記載の情報処理装置。
【請求項１１】
前記セキュリティ関数は、公開鍵認証方式による暗号化、復号、公開鍵認証方式による署名の生成、検証の何れか又は全てに係る一方向関数であることを特徴とする請求項１０に記載の情報処理装置。
【請求項１２】
前記セキュリティ関数は、共通鍵認証方式による暗号化、復号、共通鍵認証方式による署名の生成、検証の何れか又は全てに係る一方向関数であることを特徴とする請求項１０に記載の情報処理装置。
【請求項１３】
情報処理装置で行われるプログラム検証方法であって、
前記情報処理装置は、
保護すべきデータの入出力に係る引数毎に、当該引数の値を保護されたメモリ領域又は非保護のメモリ領域に格納することを要求する保護属性を規定したセキュリティ関数の型を複数記憶する第１記憶手段と、
前記データの格納領域を表す変数の前記保護属性が記述されるとともに、前記第１記憶手段に記憶されたセキュリティ関数のうち何れか又は全てを用いて所定の処理の実行手順が記述されたプログラムリストを記憶する第２記憶手段と、
を備え、
特定手段が、前記変数の保護属性に基づいて、前記プログラムリストに記述されたセキュリティ関数の入出力に係る実引数の保護属性を特定する特定ステップと、
判定手段が、前記特定ステップで特定されたセキュリティ関数の入出力に係る全ての実引数の保護属性が、当該セキュリティ関数に対応する前記第１記憶手段に記憶されたセキュリティ関数の型の保護属性と一致するか否かを判定する判定ステップと、
出力手段が、前記判定ステップによる判定の結果不一致が確認された場合、その旨を示したエラー情報を出力する出力ステップと、
を含むことを特徴とするプログラム検証方法。
【請求項１４】
プログラムリストの検証を行うコンピュータを、
保護すべきデータの入出力に係る引数毎に、当該引数の値を保護されたメモリ領域又は非保護のメモリ領域に格納することを要求する保護属性を規定したセキュリティ関数の型を複数記憶する第１記憶手段と、
前記データの格納領域を表す変数の前記保護属性が記述されるとともに、前記第１記憶手段に記憶されたセキュリティ関数のうち何れか又は全てを用いて所定の処理の実行手順が記述されたプログラムリストを記憶する第２記憶手段と、
前記変数の保護属性に基づいて、前記プログラムリストに記述されたセキュリティ関数の入出力に係る実引数の保護属性を特定する特定手段と、
前記特定手段により特定されたセキュリティ関数の入出力に係る全ての実引数の保護属性が、当該セキュリティ関数に対応する前記第１記憶手段に記憶されたセキュリティ関数の型の保護属性と一致するか否かを判定する判定手段と、
前記判定手段による判定の結果、不一致が確認された場合にその旨を示したエラー情報を出力する出力手段と、
して機能させることを特徴とするプログラム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、コンピュータで実行可能なプログラムの開発やプログラムリストの検証を行う情報処理装置、プログラム検証方法及びプログラムに関する。
【背景技術】
【０００２】
近年、ＰＣ（Ｐｅｒｓｏｎａｌ  Ｃｏｍｐｕｔｅｒ）等の情報機器の普及に伴い、コンピュータセキュリティに対する意識が高まっている。例えば、コンピュータ内に保護すべきデータがある場合、ＯＳ（Ｏｐｅｒａｔｉｎｇ  Ｓｙｓｔｅｍ）の特権モードと、通常モードとでユーザがアクセスできる領域を切り分けることで、不必要にデータが読み出されることを防止している。また、特許文献１には、読み書き可能な通常のメモリ空間と、読み出しを禁止したセキュアメモリ空間（保護メモリ領域）とを設け、この保護メモリ領域に記憶したデータや命令が外部に読み出されることを防止する技術が開示されている。また、保護メモリ領域の実現方法として、暗号機能とチップ内メモリのアクセス制御の組み合わせにより実現する技術が非特許文献１に開示されている。このように、アクセス制御と暗号機能との組み合わせにより保護が実現される場合、保護の概念は秘密を守るための機密性の保護と、改ざんを防止する完全性の保護との何れか又は両方の保護を提供することが可能となっている。
【０００３】
また、非特許文献２には、Ｉｎｆｏｒｍａｔｉｏｎ  Ｆｌｏｗ  Ａｎａｌｙｓｙｓと呼ばれるプログラム内部にセキュリティレベルの異なるデータとプログラム部分が存在するとき、高レベルのデータの情報が低レベルの部分に漏れ出すことの防止と、それらレベルの異なるプログラム部分間のデータ交換の両立を図るため、レベル間のデータ移動における型検査と、高レベルデータを低レベルに落とす際にプログラマに明示的に特定操作を強制若しくは暗号化操作を適用することで解決する技術が開示されている。
【０００４】
【特許文献１】特開２００４−２４０５３６号公報
【非特許文献１】“敵対的なＯＳからソフトウェアを保護するプロセッサアーキテクチャ”、橋本他、情報処理学会論文誌、Ｖｏｌ．４５、Ｎｏ．ＳＩＧ０３
【非特許文献２】“Ｃｒｙｐｔｇｒａｐｈｉｃａｌｌｙ−ｍａｓｋｅｄ  Ｆｌｏｗｓ”、Ａｓｋａｒｏｖ  ｅｔ．ａｌ．２００６
【発明の開示】
【発明が解決しようとする課題】
【０００５】
しかしながら、上述した従来技術では、機密性及び／又は完全性の保護を実現した保護メモリ領域をハードウェア的に提供することは可能であるが、データ処理を行うプログラム自体に過った処理内容が記述されているような場合、本来保護すべきデータが保護メモリ領域に格納されない場合がある。この場合、データが漏洩や改ざん等の攻撃に曝される可能性がある。
【０００６】
本発明は、上記に鑑みてなされたものであって、プログラムリストに記述された保護すべきデータの保護の仕方を検証することが可能な情報処理装置、プログラム検証方法及びプログラムを提供することを目的とする。
【課題を解決するための手段】
【０００７】
上述した課題を解決し、目的を達成するために、本発明は、保護すべきデータの入出力に係る引数毎に、当該引数の値を保護されたメモリ領域又は非保護のメモリ領域に格納することを要求する保護属性を規定したセキュリティ関数の型を複数記憶する第１記憶手段と、前記データの格納領域を表す変数の前記保護属性が記述されるとともに、前記第１記憶手段に記憶されたセキュリティ関数のうち何れか又は全てを用いて所定の処理の実行手順が記述されたプログラムリストを記憶する第２記憶手段と、前記変数の保護属性に基づいて、前記プログラムリストに記述されたセキュリティ関数の入出力に係る実引数の保護属性を特定する特定手段と、前記特定手段により特定されたセキュリティ関数の入出力に係る全ての実引数の保護属性が、当該セキュリティ関数に対応する前記第１記憶手段に記憶されたセキュリティ関数の型の保護属性と一致するか否かを判定する判定手段と、前記判定手段による判定の結果、不一致が確認された場合にその旨を示したエラー情報を出力する出力手段と、を備えたことを特徴とする。
【０００８】
また、本発明は、情報処理装置で行われるプログラム検証方法であって、前記情報処理装置は、保護すべきデータの入出力に係る引数毎に、当該引数の値を保護されたメモリ領域又は非保護のメモリ領域に格納することを要求する保護属性を規定したセキュリティ関数の型を複数記憶する第１記憶手段と、前記データの格納領域を表す変数の前記保護属性が記述されるとともに、前記第１記憶手段に記憶されたセキュリティ関数のうち何れか又は全てを用いて所定の処理の実行手順が記述されたプログラムリストを記憶する第２記憶手段と、を備え、特定手段が、前記変数の保護属性に基づいて、前記プログラムリストに記述されたセキュリティ関数の入出力に係る実引数の保護属性を特定する特定ステップと、判定手段が、前記特定ステップで特定されたセキュリティ関数の入出力に係る全ての実引数の保護属性が、当該セキュリティ関数に対応する前記第１記憶手段に記憶されたセキュリティ関数の型の保護属性と一致するか否かを判定する判定ステップと、出力手段が、前記判定ステップによる判定の結果不一致が確認された場合、その旨を示したエラー情報を出力する出力ステップと、を含むことを特徴とする。
【０００９】
また、本発明は、プログラムリストの検証を行うコンピュータを、保護すべきデータの入出力に係る引数毎に、当該引数の値を保護されたメモリ領域又は非保護のメモリ領域に格納することを要求する保護属性を規定したセキュリティ関数の型を複数記憶する第１記憶手段と、前記データの格納領域を表す変数の前記保護属性が記述されるとともに、前記第１記憶手段に記憶されたセキュリティ関数のうち何れか又は全てを用いて所定の処理の実行手順が記述されたプログラムリストを記憶する第２記憶手段と、前記変数の保護属性に基づいて、前記プログラムリストに記述されたセキュリティ関数の入出力に係る実引数の保護属性を特定する特定手段と、前記特定手段により特定されたセキュリティ関数の入出力に係る全ての実引数の保護属性が、当該セキュリティ関数に対応する前記第１記憶手段に記憶されたセキュリティ関数の型の保護属性と一致するか否かを判定する判定手段と、前記判定手段による判定の結果、不一致が確認された場合にその旨を示したエラー情報を出力する出力手段と、して機能させることを特徴とする。
【発明の効果】
【００１０】
本発明によれば、プログラムリストに記述されたセキュリティ関数の入出力に係る引数の保護属性が、本来規定されたとおりの保護属性と一致するか否かを判定し、不一致が確認された場合その旨を示したエラー情報を出力するため、プログラムリストに記述された保護すべきデータの保護の仕方の正当性を事前に検証することができる。
【発明を実施するための最良の形態】
【００１１】
以下、添付図面を参照して、本発明に係る情報処理装置、方法及びプログラムの最良な実施形態を詳細に説明する。なお、以下では本発明に係る情報処理装置、方法及びプログラムを、コンピュータが実行可能なプログラムの開発を行うプログラム開発装置３００に適用した例について説明するが、この例に限らないものとする。
【００１２】
まず、図１を参照して、プログラム開発装置３００で開発したプログラムが実行される、ターゲットシステム１００の仕様について説明する。図１は、ターゲットシステム１００のソフトウェア構成を示したブロック図である。図１に示したように、ターゲットシステム１００は、プログラムの実行主体であるプログラム実行モジュール１１と、ＯＳ１４とを備えている。
【００１３】
プログラム実行モジュール１１は、命令実行部１２と、データ格納用メモリ領域１３とを有している。ここで、命令実行部１２は、プログラムの実行主体となるＣＰＵ（Ｃｅｎｔｒａｌ  Ｐｒｏｃｅｓｓｉｎｇ  Ｕｎｉｔ）等の制御部であって、プログラム実行時に一時的にデータを格納するためのレジスタ１２１を有している。命令実行部１２は、データの入出力をデータ格納用メモリ領域１３へのデータ読み書きを通じて行う。
【００１４】
データ格納用メモリ領域１３は、非保護メモリ領域１３１と、保護メモリ領域１３２とを有している。非保護メモリ領域１３１は、アクセスに対して何等制限を設けていない非セキュアな記憶領域である。一方、保護メモリ領域１３２は、特定のプログラムやプロセス等からのアクセスに対してアクセス制限を設けたセキュアな記憶領域である。なお、非保護メモリ領域１３１と保護メモリ領域１３２とは、同一の記憶媒体に形成されている態様としてもよいし、個別の記憶媒体で形成される態様としてもよい。また、このような特定のプログラムやプロセスに対する排他的なアクセス制御の実現は、公知の技術を用いることが可能である。
【００１５】
ＯＳ１４は、命令実行部１５と、ＯＳ専用データ格納領域１６とを有している。ここで、命令実行部１５は、ターゲットシステム１００の基本ソフトウェアの実行主体となるＣＰＵ等の制御部であって、基本ソフトウェア実行時に一時的にデータを格納するためのレジスタ１５１を有している。また、ＯＳ専用データ格納領域１６は、命令実行部１５専用の記憶領域である。
【００１６】
ＯＳ１４は、データ格納用メモリ領域１３にアクセスを行い、入力データ（例えば、外部装置２００からネットワークＮを通じて入力されたデータ）の書き込みと、出力データ（例えば、ネットワークＮを通じ外部装置２００に出力するデータ）の読み出しを行う。ここで、ＯＳ１４は、データ格納用メモリ領域１３のうち、非保護メモリ領域１３１には任意のタイミング読み書きが可能であるが、保護メモリ領域１３２に対しては上述したアクセス制御により読み書きが禁止されているものとする。なお、データ格納用メモリ領域１３（非保護メモリ領域１３１）へのアクセスはＯＳ１４に限定されるものではなく、ＯＳ１４管理下の周辺装置によるＤＭＡ（Ｄｉｒｅｃｔ  Ｍｅｍｏｒｙ  Ａｃｃｅｓｓ）転送等によるものも含まれるものとする。
【００１７】
なお、プログラム実行モジュール１１の命令実行部１２と、ＯＳ１４の命令実行部１５とを同一の制御部としてもよいし、夫々の用途に特化した個別の制御部としてもよい。また、非保護メモリ領域１３１と、保護メモリ領域１３２と、ＯＳ専用データ格納領域１６とを同一の記憶デバイス内に設けた態様としてもよいし、夫々を個別の記憶デバイスに設けた態様としてもよい。以下、図２、図３を参照して、ターゲットシステム１００のハードウェア構成例について説明する。
【００１８】
図２は、ターゲットシステム１００のハードウェア構成の一例を模式的に示した図である。この構成では、単一のＣＰＵ４１と、単一の記憶デバイスであるメモリ４２とを備えており、各部はバス４３により接続されている。ここで、ＣＰＵ４１は、上述した命令実行部１２及び命令実行部１５の機能を担う制御部であって、保護メモリ領域１３２へのアクセス制御機能を有するものとする。また、メモリ４２には、非保護メモリ領域１３１、保護メモリ領域１３２及びＯＳ専用データ格納領域１６の夫々に応じた記憶領域が予め確保されている。この構成において、保護メモリ領域１３２への読み書きをＣＰＵ４１のアクセス制御機能により管理することで、図１に示したターゲットシステム１００の仕様を実現することができる。
【００１９】
また、図３は、ターゲットシステム１００のハードウェア構成の他の例を模式的に示した図である。この構成では、二つのＣＰＵ５１（ＣＰＵ１）、５２（ＣＰＵ２）と、単一の記憶デバイスであるメモリ５３とを備えており、各部はバス５４により接続されている。ここで、ＣＰＵ５１は、命令実行部１２の機能を担う制御部であって、内蔵する内部メモリに保護メモリ領域１３２が確保されている。ＣＰＵ５２は、上述した命令実行部１５の機能、即ち基本ソフトウェアの実行を担う制御部であって、内蔵する内部メモリにＯＳ専用データ格納領域１６が確保されている。また、メモリ５３には、非保護メモリ領域１３１が確保されている。この構成において、保護メモリ領域１３２への読み書きをＣＰＵ５１のアクセス制御機能により管理することで、図１に示したターゲットシステム１００の仕様を実現することができる。
【００２０】
上述した図１の仕様では、外部装置２００のユーザからＯＳ１４を介して、非保護メモリ領域１３１に格納されたデータの盗聴や改ざん等（以下、これらを総称して「攻撃」という）が行われる可能性がある。そのため、本実施形態では、保護すべきデータが非保護メモリ領域１３１に格納されることがないよう、プログラム作成時に検証を行うことで、不用意にデータが非保護メモリ領域１３１に格納されてしまうことを防止することが可能なプログラム開発装置３００について説明する。以下、プログラム開発装置３００について説明する。
【００２１】
図４は、プログラム開発装置３００のハードウェア構成を示した図である。ここで、プログラム開発装置３００は、ターゲットシステム１００で実行されるプログラム（実行可能形式プログラム）の開発を行う開発装置であって、ＰＣ等の情報処理装置である。
【００２２】
図４に示したように、プログラム開発装置３００は、ＣＰＵ３１と、操作部３２と、表示部３３と、ＲＯＭ（Ｒｅａｄ  Ｏｎｌｙ  Ｍｅｍｏｒｙ）３４と、ＲＡＭ（Ｒａｎｄｏｍ  Ａｃｃｅｓｓ  Ｍｅｍｏｒｙ）３５と、記憶部３６とを備え、各部はバス３７により接続されている。
【００２３】
ＣＰＵ３１は、ＲＡＭ３５の所定領域を作業領域として、ＲＯＭ３４又は記憶部３６に予め記憶された各種制御プログラムとの協働により各種処理を実行し、プログラム開発装置３００を構成する各部の動作を統括的に制御する。
【００２４】
また、ＣＰＵ３１は、ＲＯＭ３４又は記憶部３６に予め記憶された所定のプログラムとの協働により、後述する各機能部の機能を実現させる。なお、各機能部の動作については後述する。
【００２５】
操作部３２は、キーボードやマウス等の入力デバイスを備え、ユーザから操作入力された情報を指示信号として受け付け、その指示信号をＣＰＵ３１に出力する。
【００２６】
表示部３３は、ＬＣＤ（Liquid  Crystal  Display）等の表示デバイスにより構成され、ＣＰＵ３１からの表示信号に基づいて、各種情報を表示する。なお、表示部３３は、操作部３２と一体的にタッチパネルを構成する態様としてもよい。
【００２７】
ＲＯＭ３４は、プログラム開発装置３００の制御にかかるプログラムや各種設定情報等を書き換え不可能に記憶する。
【００２８】
ＲＡＭ３５は、プログラム開発装置３００の主記憶装置であって、ＣＰＵ３１の作業エリアとして機能し、バッファ等の役割を果たす。
【００２９】
記憶部３６は、磁気的又は光学的に記録可能な記憶媒体を有し、プログラム開発装置３００の制御にかかるプログラムや各種設定情報等を書き換え可能に記憶する。また、記憶部３６は、後述する代入時変換ルール（図７参照）やセキュリティ関数リスト（図８参照）、非セキュリティ関数リスト（図１０−１、１０−２参照）等を記憶している。
【００３０】
次に、プログラム開発装置３００で開発するプログラムの実装環境について説明しながら、記憶部３６に記憶される各種の情報について説明する。まず、以下の実装環境説明で用いられるセキュリティ処理の表記を説明する。Ｅ＿Ｋｘ［Ｃｏｎｔｅｎｔ］は、鍵ＫｘによりＣｏｎｔｅｎｔを暗号化した結果の暗号文を意味する。暗号化には公開鍵方式、共通鍵方式の種別があるが、鍵Ｋｘの種別によって定まる。また、ｃｅｒｔ［Ｔｅｘｔ］は、署名対象Ｔｅｘｔに対して生成された署名を意味する。｜｜記号はビット連接を意味する。
【００３１】
図５は、プログラム開発装置３００で開発するプログラムの具体的な実装環境の一例を示した図である。同図では、実装環境の一例として、プログラム実行モジュール１１０とシステム２１０との間でハイブリッド暗号を利用したセキュリティプロトコルにより、メッセージ転送を行う態様を示している。なお、実際にはプログラム実行モジュール１１０にて実行されるプログラム（実行可能形式プログラム）の生成を、プログラム開発装置３００にて行う。
【００３２】
図５において、プログラム実行モジュール１１０は、図１に示したターゲットシステム１００のプログラム実行モジュール１１に対応するものである。また、システム２１０は、図１で示した外部装置２００に対応するものである。ＣＡ２２０は、プログラム実行モジュール１１０とシステム２１０との間の認証で必要な、公開鍵（ＫｐＣＡ）と鍵証明書を発行する認証局（Ｃｅｒｔｉｆｉｃａｔｅ  Ａｕｔｈｏｒｉｔｙ）である。
【００３３】
なお、ＣＡ２２０から、プログラム実行モジュール１１０、システム２１０の夫々にＣＡ２２０の公開鍵ＫｐＣＡが予め配布されているものとし、この公開鍵ＫｐＣＡの正当性（完全性）は予め保証されているものとする。また、ＣＡ２２０は、ＣＡ２２０自身の秘密鍵を用いて、システム２１０の公開鍵ＫｐＡについての公開鍵証明書ＫｐＡ｜｜ｃｅｒｔ［ＫｐＡ］を事前に発行し、これをシステム２１０に予め配布しているものとする。なお、公開鍵証明書ＫｐＡ｜｜ｃｅｒｔ［ＫｐＡ］には、システム２１０の公開鍵ＫｐＡが含まれているものとする。
【００３４】
また、プログラム実行モジュール１１０は、プログラム実行モジュール１１０自身の秘密鍵ＫｓＢと、転送対象となるメッセージＭｓｇと、ＣＡ２２０から配布された公開鍵ＫｐＣＡとを保持しているものとする。ＫｐＣＡをプログラム実行モジュールが保持する手段として、命令実行部１２に示したレジスタ１２１または図示しない記憶デバイスのような手段を用いることができる。また、システム２１０は、システム２１０自身の秘密鍵ＫｓＡと、自身の公開鍵ＫｐＡと、ＣＡ２２０により発行された公開鍵証明書ＫｐＡ｜｜ｃｅｒｔ［ＫｐＡ］と、ＣＡ２２０から配布された公開鍵ＫｐＣＡとを、図示しない記憶デバイスに保持しているものとする。
【００３５】
以下、図５に示した実装環境について説明する。なお、以下の説明では、プログラムの実装対象となるプログラム実行モジュール１１０の動作に注目した説明を行い、システム２１０の動作の説明は適宜省略する。
【００３６】
まず、システム２１０から、システム２１０自身の公開鍵照明書 ＫｐＡ｜｜ｃｅｒｔ［ＫｐＡ］ が送付されると（Ｄ１）、プログラム実行モジュール１１０では、ＣＡ２２０の公開鍵ＫｐＣＡにより公開鍵照明書ＫｐＡ｜｜ｃｅｒｔ［ＫｐＡ］を検証し、公開鍵照明書ＫｐＡ｜｜ｃｅｒｔ［ＫｐＡ］に含まれたシステム２１０の公開鍵ＫｐＡの完全性を確認する（Ｄ２）。
【００３７】
また、システム２１０では、メッセージ転送用の一時鍵（共通鍵）Ｋｃを生成すると、自身の秘密鍵ＫｓＡによる署名Ｓｉｇ（＝ｃｅｒｔ［Ｋｃ］）を生成し、これをプログラム実行モジュール１１０の公開鍵ＫｐＢで暗号化したデータＥ＿ＫｐＢ［Ｓｉｇ］をプログラム実行モジュール１１０に送付する（Ｄ３）。この際、プログラム実行モジュール１１０の公開鍵ＫｐＢについて、公開鍵ＫｐＡと同様の検証処理が予め行われているものとするが、その説明は省略する。
【００３８】
一方、プログラム実行モジュール１１０は、データＥ＿ＫｐＢ［Ｓｉｇ］を受信すると、自身の秘密鍵ＫｓＢにより公開鍵アルゴリズムによる復号を行う（Ｄ４）。次に、プログラム実行モジュール１１０は、Ｄ２の公開鍵署名検証で完全性を確認した公開鍵ＫｐＡにより署名検証を行うことで（Ｄ５）、共通鍵Ｋｃを取得する。ここで、共通鍵Ｋｃは、プログラム実行モジュール１１０自身の秘密鍵による復号及び正当性が確認された公開鍵ＫｐＡによる署名検証により、機密性、完全性が裏付けられているため、ネットワークを通じてメッセージＭｓｇをシステム２１０に送付するための共通鍵暗号の鍵として用いることができる。
【００３９】
続いて、プログラム実行モジュール１１０は、メッセージＭｓｇを共通鍵Ｋｃにより共通鍵暗号化を行い（Ｄ６）、生成された暗号文をシステム２１０に送付する（Ｄ７）。この暗号文を受信したシステム２１０では、保持していた共通鍵Ｋｃにより暗号文が復号され、元のメッセージＭｓｇが取り出される（Ｄ８）。
【００４０】
図６は、図５の実装環境に基づいて定義された、プログラム作成時に用いられる変数及び関数引数（以下、総称して「変数」という）の保護属性の一覧を示した図である。図６に示したように、本実施形態では、保護の仕方を表す保護レベルに応じて６種類の属性（保護属性）が与えられる。各保護属性は、完全性と機密性というセキュリティ要件について、夫々メモリ領域における保護手段の有無と、意味上の確認の有無という直行する２種類の性質を有している。
【００４１】
ここで「完全性（Ｉｎｔｅｇｒｉｔｙ）」とは、情報の正確さ及び完全さを保護する特性を意味し、外部からの改ざんを保護することを要件とするものである。また、「機密性（ｃｏｎｆｉｄｅｎｔｉａｌｉｔｙ）」とは、認可されていないエンティティ又はプロセスに対して、情報を使用不可又は非公開にする特性を意味し、特定のエンティティ又はプロセスに対してのみアクセスを許可することを要件とするものである。
【００４２】
メモリ領域の保護手段については、ターゲットシステムが備えるアクセス制御や暗号化・改ざん検証等の保護手段に依存して、達成される項目が異なる場合がある。例えば、プログラム実行モジュール１１０以外からのアクセスを完全に禁止するアクセス制御機構を備えたメモリ領域（例えば、図１の保護メモリ領域１３２）では、完全性、機密性とも保護されることになる。但し、全てのメモリ領域についてプログラム実行モジュール１１０以外からのアクセスが禁止されてしまった場合、ＯＳが提供する入出力サービスが一切利用できない。そのため、入出力の為に完全性及び機密性の保護機能が設けられないメモリ領域（非保護メモリ領域１３１）が必ず用意されなければならない。
【００４３】
なお、メモリ領域の保護がメモリアクセス時のハードウェアによる暗号化によって行われる場合には、機密性のみが保護されたメモリ領域となり得る。また、完全性についてもそれがハードウェアによる検証機構で行われれば、完全性のみが保護されたメモリ領域となり得る。もちろん、両者を組み合わせればアクセス制御と同様に、完全性と機密性の両方を備えた保護機構が実現可能である。
【００４４】
意味上の確認とは、その変数に格納される値について、完全性、機密性の何れか或いは両方の確認の有無を表す。例えば、ある変数を格納する保護メモリ領域に完全性・機密性の保護がなされていたとしても、その変数に非保護のメモリ領域から取得した値が代入されるとすれば、その変数に格納される値そのものは、保護メモリ領域に格納される以前のいずれかの時点で改ざんや盗聴がなされている虞がある。そのため、たとえ保護メモリ領域に割り当てられた変数であっても、その値を完全性・機密性が保証されたものとみなすことはできない。つまり、代入先の値自体は完全性が保証されたものであったとしても、代入元の変数Ｘの格納領域が完全性保護がなされていなければ、再度Ｘを参照したとき、その値が別の値に書き換えられてしまっている可能性があるため、当然完全性が保証されたものとして扱うことはできない。
【００４５】
つまり、ある変数の値について完全性・機密性が保証されるには、適切な保護メモリ領域への格納領域割り当てと意味上の確認の両方がなされている必要がある。図６に示した６種類の保護属性は、このような考えに基づいて設計されており、非保護メモリ領域１３１に格納されることを要求する保護属性（ｅｘｐｏｓｅｄ）と、保護メモリ領域１３２に格納されることを要求する保護属性（ｆｉｘｅｄ、ｖｅｒｉｆｉｅｄ、ｈｉｄｄｅｎ、ｃｏｎｃｅａｌｅｄ、ｃｏｎｆｉｄｅｎｔｉａｌ）とに大別される。以下、各保護属性について説明する。
【００４６】
「ｅｘｐｏｓｅｄ」属性は、入出力変数のために設けられたものであって、完全性・機密性ともに保護されていないメモリ領域に保持される変数に対して付与される保護属性である。つまり、「ｅｘｐｏｓｅｄ」属性は完全性・機密性ともに保護されていないメモリ領域（非保護メモリ領域１３１）に保持される変数に与えられるものであるため、ＯＳ等の外部エンティティは「ｅｘｐｏｓｅｄ」属性の変数を自由に読み書きできる。
【００４７】
「ｅｘｐｏｓｅｄ」属性が付与された変数を保持するメモリ領域には保護機能がないため、意味上においてもその値の機密性・完全性はまったく保証されない。仮にそれまで秘匿保護された領域に保持された機密値があったとしても、いったんそれが「ｅｘｐｏｓｅｄ」属性の変数にコピーされた瞬間に、コピー元の変数に格納されている値も含めてその機密性が損なわれてしまうからである。なお、以下の説明では他の保護変数との差異を明確にするため、セキュリティの向上に直接関係しない「ｅｘｐｏｓｅｄ」属性を明示しているが、既存プログラムとの互換性を維持し記述の煩雑さを避けるためプログラム記述においては「ｅｘｐｏｓｅｄ」属性を省略することとしてもよい。
【００４８】
「ｆｉｘｅｄ」属性は、改ざん防止されたメモリ領域に格納されるが、意味上の完全性・機密性は確認されていない値を保持する変数に対して付与される保護属性である。「ｆｉｘｅｄ」属性の変数は、例外的に「ｅｘｐｏｓｅｄ」属性の変数と相互に変換が可能であるものとする。例えば、「ｅｘｐｏｓｅｄ」属性をもつ複数ワードにまたがるデータ構造を参照するとき、参照途中に改ざん攻撃を受けてしまう可能性がある。特に値の完全性検証中にこのような攻撃が行われると検証の意味がなくなってしまう。このような危険を排除したい場合、一度それらのデータ構造全体を「ｆｉｘｅｄ」属性の変数にコピーしたうえで検証を行うことにより検証途中のデータの改ざんを防止することができる。
【００４９】
より具体的には、次の３つの変数宣言と検証関数ＰｕｂｌｉｃＶｅｒｉｆｙＲＳＡの呼び出しにおいて、上記脆弱性の潜在的な例を見ることができる。
verified  PubCert_RSA  Cert_Accept_A
const  verified  PubKey_RSA  PubKey＿CA
exposed  PubCert_RSA  Cand_Input
PublicVerifyRSA(Cand_Input,PubKey_Ca,Cert_Accept_A)
【００５０】
上記の例では、ＰｕｂｌｉｃＶｅｒｉｆｙＲＳＡの第１引数Ｃａｎｄ＿Ｉｎｐｕｔには、「ｅｘｐｏｓｅｄ」属性が与えられている。したがって、Ｃａｎｄ＿Ｉｎｐｕｔの値は、プログラム外部から任意のタイミングで書き換えられてしまう可能性がある。
【００５１】
ここで、関数の第１引数Ｃａｎｄ＿Ｉｎｐｕｔを構成する各ワードの読み込みが、関数の処理においてただ一度だけ行われるのであれば、書き換えがあったとしてもそれはプログラムの処理外、例えば、ネットワークにおけるメッセージ改ざんと等価と見なせるので検証処理の安全性には影響しない。しかし、Ｃａｎｄ＿Ｉｎｐｕｔの値が、関数内で繰り返し参照されるとき、プログラムの動作タイミングを知ることのできる攻撃者が繰り返し参照が行われる度に異なる値が読み込まれるよう改ざんを行った場合、これはネットワーク上のメッセージ改ざんと等価とみなすことはできない。これは、暗号処理にとって「故障攻撃（ｆａｕｌｔ  ａｔｔａｃｋ）」と呼ばれる、より対策が困難な攻撃となる。
【００５２】
そのため、変数の値が繰り返し参照される場合には、「ｅｘｐｏｓｅｄ」属性をもつ変数の値を一度「ｆｉｘｅｄ」属性を持つ変数にコピーしておけば、複数回の参照があったとしても外部から値が書き換えられる可能性を排除することができる。
【００５３】
「ｖｅｒｉｆｉｅｄ」属性は、改ざん防止されたメモリ領域に格納され、意味上の値の完全性保証があって機密性のない変数に対して付与される保護属性である。「ｖｅｒｉｆｉｅｄ」属性を持つ変数への代入は同一属性の変数の演算結果に限定されるが、「ｖｅｒｉｆｉｅｄ」属性を持つ変数の値を「ｅｘｐｏｓｅｄ」属性や「ｆｉｘｅｄ」属性の変数に代入することは常に許可されるものとする。当該変数を介した出力処理を行わない場合、メモリ領域には秘匿保護がなされていてもよい。
【００５４】
「ｈｉｄｄｅｎ」属性は、機密保護された領域に格納され、且つ、意味上の機密性・完全性が不十分な変数に対して付与される保護属性である。「ｆｉｘｅｄ」属性との違いは、「ｈｉｄｄｅｎ」属性を持つ変数は「ｅｘｐｏｓｅｄ」属性、「ｆｉｘｅｄ」属性との間の代入が禁止される点と入出力は行わない点にある。
【００５５】
「ｃｏｎｃｅａｌｅｄ」属性は、機密保護された領域に格納され、且つ、意味上の機密性はあるが完全性がない変数に対して付与される保護属性である。
【００５６】
また、「ｃｏｎｆｉｄｅｎｔｉａｌ」属性は機密保護、且つ、改ざん保護された領域に格納され、意味上の機密性、完全性がともに確認された変数に対して付与される保護属性である。
【００５７】
なお、図６において、各保護属性に対応付けた「改ざん防止（メモリ上）」列の「−」は、その保護属性の変数が格納されるメモリ領域に改ざん防止機能が不要であることを意味しており、「＋」は、その保護属性の変数が格納されるメモリ領域に改ざん防止機能が必須であることを意味しており、「±」は、メモリ領域の改ざん防止機能の有無は任意であることを意味している。
【００５８】
また、図６において、各保護属性に対応付けた「秘匿（メモリ上）」列の「−」は、その保護属性の変数が格納されるメモリ領域に秘匿機能が不要であることを意味している。また、「＋」は、その保護属性の変数が格納されるメモリ領域に秘匿機能が必須であることを意味しており、「±」は、メモリ領域の秘匿機能の有無は任意であることを意味している。
【００５９】
また、図６において、各保護属性に対応付けた「完全性確認（意味上）」列の「×」は、その保護属性の変数の完全性確認が必須であることを意味しており、「○」は、その保護属性の変数の完全性確認が不要であることを意味している。
【００６０】
さらに、図６において、各保護属性に対応付けた「機密性（意味上）」列の「×」は、その保護属性の変数の機密性確認が必須であることを意味しており、「○」は、その保護属性の変数の機密性確認が不要であることを意味している。
【００６１】
以上、説明した６種類の保護属性のうち、本質的に重要な保護属性は「ｅｘｐｏｓｅｄ」、「ｖｅｒｉｆｉｅｄ」、「ｃｏｎｃｅａｌｅｄ」、「ｃｏｎｆｉｄｅｎｔｉａｌ」で、「ｆｉｘｅｄ」、「ｈｉｄｄｅｎ」は補助的な保護属性となっている。
【００６２】
上記した保護属性は、言語における変数の型とほぼ同じといってよいが、一般の言語において型はフィールドの数や長さといったデータ型を意味する場合が多い。以下の例では保護属性の型については厳密な一致を要求するが、データ型については説明を簡単にするため厳密な制約を設けていない。本実施形態では、データ型の整合性は副次的なため、セキュリティ向上に係る属性に関しては保護属性という用語を用いている。なお、保護属性をデータ型にまとめた態様としてもよい。
【００６３】
図７は、上述した各保護変数を持つ変数間の代入の可否を示した図である。同図に示したように、機密性を持つ「ｈｉｄｄｅｎ」属性、「ｃｏｎｃｅａｌｅｄ」属性、「ｃｏｎｆｉｄｅｎｔｉａｌ」属性を持つ変数は、同じ保護属性を持つ変数以外の相互変換・代入は一切許可されない。また、完全性についてメモリ保護と意味上の確認の両方を持つ「ｖｅｒｉｆｉｅｄ」属性を持つ変数は、その値を「ｅｘｐｏｓｅｄ」属性、「ｆｉｘｅｄ」属性の変数に代入することは許されるが、これら変数からの代入は許可されていない。また、「ｆｉｘｅｄ」属性、「ｅｘｐｏｓｅｄ」属性の変数間の代入は自由に行うことができる。なお、図７に示した代入時変換ルールは、記憶部３６に予め記憶されているものとする。
【００６４】
次に、プログラム開発装置３００でのプログラム作成時に用いられるセキュリティ関数について説明する。ここで、「セキュリティ関数」とは、暗号化や復号、署名検証といった計算量的一方向性の性質を備えた、所謂セキュリティプリミティブを実現する関数を意味している。
【００６５】
図８は、図５に示した実装環境に応じて定義されたセキュリティ関数の型の一覧を示した図である。同図に示したように、セキュリティ関数は、公開鍵暗号（暗号化、復号）用と、公開鍵署名（生成、検証）用と、共通鍵暗号（暗号化、復号）用と、共通鍵署名（生成、検証）用と、乱数発生用との５種類に大別される。ここで、乱数発生用を除いたセキュリティ関数については、中分類として、暗号化と復号、又は、署名生成と検証のように対となる操作（メソッド）が定義されており、この操作毎にセキュリティ関数（セキュリティ関数名）が定義されている。なお、乱数発生用については中分類として物理乱数が定義されており、この物理乱数については補助分類として三つのセキュリティ関数（物理乱数Ａ、Ｂ、Ｃ）が定義されている。
【００６６】
例えば、公開鍵暗号化については、後述する入力・出力の保護属性が異なる二つのセキュリティ関数（ＰｕｂｌｉｃＥｎｃｒｙｐｔＸＸＸ）が定義されている。ここで、補助分類には、これらのセキュリティ関数を一意に識別するための名称が夫々定義されている。なお、セキュリティ関数名の末尾３桁（ＸＸＸ又はＹＹＹ）には任意の文字列（例えば、暗号復号方式名称）を設定することが可能であるものとする。また、セキュリティ関数名は図８の例に限定されず、任意の関数名を与えることが可能である。また、図８では、同一の操作内容に対応するセキュリティ関数全てを同名とした例を示したが、互いに異なる名称を付与する態様としてもよい。この場合、後述する多重定義は発生しないことになる。
【００６７】
図８において「入力」の列には、各セキュリティ関数に引数として入力されるデータの「種別」と、そのデータの「保護属性」とが定義されている。例えば、公開鍵暗号化に係るセキュリティ関数に平文が入力される場合には、その平文が「ｃｏｎｆｉｄｅｎｔｉａｌ」属性又は「ｃｏｎｃｅａｌｅｄ」属性であることが定義されている。
【００６８】
また、図８において「鍵値（特殊入力）」の列には、各セキュリティ関数に引数として入力されるデータの特例として、そのデータの「種別」が公開鍵又は秘密鍵である場合の「保護属性」が定義されている。例えば、公開鍵暗号化に係るセキュリティ関数に公開鍵が入力される場合には、その公開鍵が「ｖｅｒｉｆｉｅｄ」属性であることが定義されている。
【００６９】
また、図８において「出力」の列には、各セキュリティ関数によるデータ処理の結果として出力されるデータの「種別」と、そのデータの「保護属性」とが定義されている。例えば、公開鍵暗号化に係るセキュリティ関数から出力される暗号文は、「ｖｅｒｉｆｉｅｄ」属性又は「ｅｘｐｏｓｅｄ」属性であることが定義されている。
【００７０】
ここで、公開鍵、共通鍵に関するセキュリティ関数に着目すると、同一操作内容であっても、入力されるデータ及び／又は出力されるデータの保護属性に応じて、同名のセキュリティ関数が多重に定義（多重定義）されていることが分かる。
【００７１】
さらに、図８において「補助出力」の列には、セキュリティ関数によるデータ処理の結果として補助的に出力されるデータの「種別」と、そのデータの「保護属性」とが定義されている。具体的には、公開鍵による署名の検証結果、共通鍵による署名の検証結果に要求される保護属性が定義されている。
【００７２】
なお、物理乱数に対応するセキュリティ関数（ＰｓｅｕｄｏＲａｎｄｏｍ）については、データの入力が行われることなく、乱数を出力（生成）することを示しており、その乱数の保護属性が「ｃｏｎｆｉｄｅｎｃｉａｌ」属性、「ｃｏｎｃｅａｌｅｄ」属性又は「ｖｅｒｉｆｉｅｄ」属性の何れかであることが定義されている。
【００７３】
本実施形態では、データの入出力に際して保護属性が異なるセキュリティ関数は、必ず暗号化、復号や署名生成、検証のような計算に際して一方向性を持つセキュリティプリミティブの機能を有するもの、即ち一方向性関数に限定する。ここで、「データの入出力に際して保護属性が異なるセキュリティ関数」とは、入力と出力で保護属性が異なるセキュリティ関数を意味しており、例えば、平文の入力として「ｃｏｎｆｉｄｅｎｔｉａｌ」属性と、公開鍵の入力として「ｖｅｒｉｆｉｅｄ」属性とが与えられた場合、出力が「ｖｅｒｉｆｉｅｄ」属性となるようなセキュリティ関数である。機密保護された変数の演算結果が非保護の変数に代入され、非保護変数が外部出力されたとき、元の機密保護された変数の情報が漏れてしまう場合がある。このような演算を無制限に行わせず、暗号化などの処理に限定することがこの仕組みの目的である。
【００７４】
また、本実施形態において、ある関数の入出力引数がすべて同じ保護属性の場合には、その関数はセキュリティ関数でないものと見なす。具体的には、たとえ演算内容が暗号演算であっても、入出力間で保護属性の異なる変数がひとつもなければ、その関数はセキュリティ関数ではないと定義する。さらに、関数が多重定義されていても夫々の定義において全ての引数の保護属性が一致した場合、この関数はセキュリティ関数ではないものと見なす。この場合、計算量的一方向性を持つ必要はない。なお、セキュリティ関数は必ず計算量的一方向性を持つ必要があるが、一方向性関数を必ずセキュリティ関数として定義する必要はない。
【００７５】
図９は、上述したセキュリティ関数の一つである、公開鍵署名検証関数を説明するための図である。なお、ここでは、ＲＳＡ署名方式の公開鍵署名検証関数（後述するＰｕｂｌｉｃＶｅｒｉｆｙＲＳＡ）を前提として説明するが、この署名方式に限らないものとする。
【００７６】
一般に署名検証では、署名検証鍵により署名から復号化したハッシュ値と、検証前メッセージオブジェクトから計算したハッシュ値とを比較し、この結果が一致したか否かを示す情報（０／１）だけが出力される。これに対し、図９で示した公開鍵署名検証関数では、出力となる検証済みメッセージオブジェクトの保護属性（ｖｅｒｉｆｉｅｄ／ｃｏｎｆｉｄｅｎｔｉａｌ）に応じたメモリ領域上に変数領域が確保されようになっている。ここで、両ハッシュ値が一致した場合のみ検証対象の変数からコピーされた値（検証前メッセージオブジェクト）が、保護属性に応じて新しく確保された変数に出力されることになる。なお、両ハッシュ値が一致しない場合には、コピーした検証前メッセージオブジェクトを破棄するものとしている。
【００７７】
これは、検証前の変数が非保護メモリ領域１３１に確保されている場合、即ち、「ｅｘｐｏｓｅｄ」属性の場合、攻撃者が検証中または検証後すぐに検証前の変数を書き換えることが可能であるため、予め検証対象の値を保護メモリ領域１３２にコピーして書き換えが行われることを防止することを意図したものである。また、検証前の変数と検証後の変数とは同じ値を保持するため、誤って使用すると機能上プログラムは動作してしまうという脆弱性を抱えているが、検証後の出力は検証前の入力とは異なる保護属性が与えているため、検証後に誤って検証前の変数を使用してしまうことを防止することができる。このように、セキュリティ関数での演算時において、保護属性に応じたメモリ領域を確保することで、データのセキュリティを向上させることができる。
【００７８】
次に、プログラム開発装置３００でのプログラム開発時に用いる上述したセキュリティ関数以外の非セキュリティ関数について説明する。
【００７９】
図１０−１、１０−２は、非セキュリティ関数の一例を示した図である。図１０−１に示したように、ＯＳを介した入出力を扱う非セキュリティ関数として入出力に係る「Ｉｎｐｕｔ」、「Ｏｕｔｐｕｔ」が用意されている。ここで、「Ｉｎｐｕｔ」は、ＯＳによる書き込みがあるため、入力変数は「ｅｘｐｏｓｅｄ」属性のみに限定される。また、「Ｏｕｔｐｕｔ」の出力引数はＯＳによる書き込み操作が不要なため、「ｅｘｐｏｓｅｄ」、「ｖｅｒｉｆｉｅｄ」の両方の保護属性が多重定義される。この他、ＯＳと双方向のデータのやりとりを行ういわゆるサービス関数は全て「ｅｘｐｏｓｅｄ」属性のみを扱うものとする。
【００８０】
また、図１０−２に示したように、データ形式変換用の非セキュリティ関数として「Ｅｘｔｒａｃｔ」、「Ｃｏｎｃａｔ」が用意されている。これらの関数はソフトウェアモジュール内に閉じたデータ形式の変換や演算を行うだけでＯＳを介したデータ入出力は行わない。このような非セキュリティ関数は、全ての入出力引数の保護属性が同一であるという条件の下で引数に保護変数をとることができる。ただしセキュリティ関数のように入出力に異なる保護属性を持つ変数が混在することは許されず、ひとつの関数内では全ての引数についてただひとつの保護属性をとるものとする。例えば、「Ｅｘｔｒａｃｔ」と同じ機能をもつ関数をｖｅｒｉｆｉｅｄ用、ｃｏｎｃｅａｌｅｄ用、ｃｏｎｆｉｄｅｎｔｉａｌ用とそれぞれ異なる名前で定義してもよいし、上述のように関数多重定義(ｏｖｅｒｌｏａｄ)によりそれぞれの保護属性に対応する機能を提供してもよい。
【００８１】
以下、図７に示した代入時変換ルール、図８に示したセキュリティ関数の一覧、図１０−１、１０−２に示した非セキュリティ関数の一覧を総称して「セキュリティ関数セット」という。
【００８２】
次に、図１１を参照して、セキュリティ関数及び非セキュリティ関数を用いて上記セキュリティプロトコルにおける、プログラム実行モジュール１１０側での処理内容を記述したプログラムリストの一例（以下、疑似プログラムリストという）を示す。なお、疑似プログラムリストは、ＲＡＭ３５や記憶部３６に記憶される等、ＣＰＵ３１が参照可能な記憶領域に保持されているものとする。
【００８３】
同図において、２〜４行目は、初期値が与えられた変数宣言を表している。また、６〜１１行目は、データ形式変換用のパラメータを表しており、１４〜２５行目は作業変数の変数宣言を表している。この変数宣言及びパラメータ宣言で保護属性が定義されている。
【００８４】
２９〜５２行目には、セキュリティプロトコルにおける、プログラム実行モジュール１１０側での具体的な処理の内容が記述されている。ここで注意が必要なのは暗号化された出力データがプログラム実行モジュール１１０外に開示されるタイミングである。直感的には５２行目のＯｕｔｐｕｔ関数が呼ばれたタイミングでＯＳに出力データが開示されたように感じられるが、この行の処理では出力データの存在とバッファ上のアドレスとがＯＳに通知されているにすぎない。もし、出力用の非保護メモリ領域を定期的に監視している攻撃者がいた場合、その攻撃者が出力データを観測できるようになるのは保護領域に格納された暗号化データＥｎｃＴｘｔが非保護領域にコピーされた時点、即ち５０行目のＣｏｎｃａｔ関数が呼ばれた時点と考えるのが安全側に立った考え方である。
【００８５】
なお、以下に説明する実施形態では、図１１に示した疑似プログラムに基づいて説明を行うが、変数宣言や処理の内容はこの例に限らないものとする。また、疑似プログラムの作成はプログラム開発装置３００で行われるものとしてもよいし、他の装置で行われるものとしてもよい。
【００８６】
［第１の実施形態］
次に、第１の実施形態に係るプログラム開発装置３００の機能的構成について説明する。図１２は、第１の実施形態に係るプログラム開発装置３００の機能的構成を示したブロック図である。同図に示したように、本実施形態のプログラム開発装置３００は、ＣＰＵ３１と、ＲＯＭ３４又は記憶部３６に記憶された所定のプログラムとの協働により実現される機能部として、関数セット読出部３１１と、プログラムリスト解析部３１２と、処理内容分割部３１３と、属性定義検証部３１４とを備えている。
【００８７】
関数セット読出部３１１は、記憶部３６に記憶されたセキュリティ関数セット（代入時変換ルール、セキュリティ関数リスト及び非セキュリティ関数リスト）の読み出しを行う。
【００８８】
プログラムリスト解析部３１２は、記憶部３６等に保持された検証対象のプログラムリストを参照し、当該プログラムリストに記述された宣言部分を解析することで、変数やパラメータに与えられた保護属性を取得する。
【００８９】
処理内容分割部３１３は、記憶部３６等に保持された検証対象のプログラムリストを参照し、当該プログラムリストに記述された一連の処理（例えば、図１１の２９〜５２行目）を分割し、複数の部分処理を生成する。ここで、分割の単位は任意に設定することが可能であるものとする。例えば、分割の単位を最も小さくした場合、個別の数式論理演算や代入、関数呼び出し単位となるが、複数の演算や代入が含まれる式を単位としてもよい。
【００９０】
なお、分割において分割単位毎にデータフロー上関係のある処理のみが含まれものとし、データフロー上関係のない複数の処理が同一の部分処理として分割されることはないものとする。例えば、Ａ＝Ｂ；Ｃ＝Ｄといった操作をまとめて一つの分割単位とすることは不適切で、Ａ＝ＢとＣ＝Ｄとで夫々分割されることになる。これにより、セキュリティ関数及び多重定義された関数の夫々を後述する検証対象として取り扱うことができる。
【００９１】
属性定義検証部３１４は、処理内容分割部３１３で分割された各部分処理を検証対象とし、この検証対象での実引数の保護属性が、セキュリティ関数セットに定義された保護属性と一致するか否かを判定し、判定結果が不一致の場合、その不一致となった箇所を指示するエラー情報を出力する。
【００９２】
以下、本実施形態に係るプログラム開発装置３００の動作について説明する。なお、以下では図１０−１、１０−２に示した非セキュリティ関数の定義に加え、図１３に示したセキュリティ関数の定義をセキュリティ関数セットとして用いるものとする。
【００９３】
ここで、図１３に示したセキュリティ関数について説明する。図１３は、図８と同様セキュリティ関数の型を示したものであって、図１１の疑似プログラムリストに記載された各セキュリティ関数の型を定義するものとなっている。ここで「ＰｕｂｌｉｃＤｅｃｒｙｐｔＲＳＡ」は、ＲＳＡ方式の公開鍵復号を行う公開鍵復号関数であって、同関数名の「ＰｕｂｌｉｃＤｅｃｒｙｐｔＲＳＡ」が二つ定義されている。これら二つの「ＰｕｂｌｉｃＤｅｃｒｙｐｔＲＳＡ」は、入出力にかかる保護属性は異なっているが、関数名が同名称であることから互いに多重定義の関係にある。なお、両関数の関数名が異なる場合には、多重定義とならないことは上述した通りである。また、保護属性が同じであったとしても、関数名が異なる場合には多重定義とならない。
【００９４】
「ＰｕｂｌｉｃＶｅｒｉｆｙＲＳＡ」は、ＲＳＡ方式の公開鍵署名検証を行う公開鍵署名検証関数であって、同関数名の「ＰｕｂｌｉｃＶｅｒｉｆｙＲＳＡ」が二つ定義されている。これら二つの「ＰｕｂｌｉｃＶｅｒｉｆｙＲＳＡ」は、入出力にかかる保護属性は異なっているが、関数名が同名称であることから互いに多重定義の関係にある。また、「ＣｏｍｍｏｎＥｎｃｒｙｐｔＡＥＳ」は、ＡＥＳ方式の共通鍵暗号化を行う共通鍵暗号化関数であって、同関数名の「ＣｏｍｍｏｎＥｎｃｒｙｐｔＡＥＳ」が二つ定義されている。これら二つの「ＰｕｂｌｉｃＶｅｒｉｆｙＲＳＡ」は、上述した「ＰｕｂｌｉｃＤｅｃｒｙｐｔＲＳＡ」、「ＰｕｂｌｉｃＶｅｒｉｆｙＲＳＡ」と同様、入出力にかかる保護属性は異なっているが、関数名が同名称であることから互いに多重定義の関係にある。
【００９５】
以下、図１３に示したセキュリティ関数の定義を用いて説明を行うが、適用においてはこの例に限らず、他のセキュリティ関数が追加されたものを用いることとしてもよい。但し、上述したようにセキュリティ関数は一方向性演算に基づいたものであることが好ましく、この制約を満たさない任意の演算がセキュリティ関数として定義されることはないものとする。
【００９６】
図１４は、プログラムリストの検証に係る処理の概略手順を示したフローチャートである。なお、本手順は、プログラムリストの検証にかかる基本的な処理の手順を示したものであって、セキュリティ関数が多重定義されていない場合には、本手順をそのまま適用することができる。なお、セキュリティ関数が多重定義された場合の処理の手順については後述する。
【００９７】
まず、関数セット読出部３１１は、記憶部３６に記憶されたセキュリティ関数セットを読み出す（ステップＳ１１）。
【００９８】
続いて、属性定義検証部３１４は、検証対象のプログラムリスト中に含まれる変数間の演算・代入や関数呼び出しにおける実引数の保護属性において、セキュリティ関数セットで定義された各セキュリティ関数での引数の保護属性と一致しない部分を検出する（ステップＳ１２）。
【００９９】
具体的に、属性定義検証部３１４は、各変数に定義された保護属性に基づいて、セキュリティ関数の入出力に係る実引数の保護属性や非セキュリティ関数の入出力に係る実引数の保護属性を特定する。また、セキュリティ関数の入出力に係る実引数の保護属性が、当該セキュリティ関数名に対応するセキュリティ関数リストでのセキュリティ関数の型の引数の保護属性と一致するか否かを判定する。なお、非セキュリティ関数における保護属性の変換が、代入時変換ルールで規定された保護属性の変換則に適合するか否か判定を併せて行う態様としてもよい。
【０１００】
ステップＳ１２において、属性定義検証部３１４が、保護属性は全て一致と判定した場合（ステップＳ１３；Ｙｅｓ）、本処理を終了する。一方、属性定義検証部３１４が、不一致部分を検出した場合（ステップＳ１３；Ｎｏ）、この保護属性が不一致の箇所を報知するエラー情報を出力した後（ステップＳ１４）、本処理を終了する。
【０１０１】
変数間の直接演算における保護属性の一致検査は、単純な一致比較により実現できるが、多重定義を含む場合には少し複雑な手順が必要となる。つまり、プログラムリスト中に記述されたセキュリティ関数が多重定義されている場合、何れの関数に準じたものかを入出力に係る引数の保護属性の組み合わせから特定する必要がある。
【０１０２】
図１５に、多重定義を考慮した保護属性検証処理の手順を示した詳細なフローチャートを示す。まず、関数セット読出部３１１は、記憶部３６に記憶されたセキュリティ関数セットを読み出す（ステップＳ２１）。
【０１０３】
次いで、プログラムリスト解析部３１２は、検証対象のプログラムリストを参照し、当該プログラムリスト中に記述された宣言部分を解析することで変数やパラメータに与えられた保護属性を取得する（ステップＳ２２）。
【０１０４】
続いて、処理内容分割部３１３は、検証対象のプログラムリストを参照し、当該プログラムリストに記述された一連の処理を所定の単位で分割する（ステップＳ２３）。属性定義検証部３１４は、ステップＳ２３で分割された複数の部分処理から、検証対象として一つの部分処理を選択すると（ステップＳ２４）、この検証対象とステップＳ２１で読み出されたセキュリティ関数リストの各セキュリティ関数名と比較することで、検証対象がセキュリティ関数か否かを判定する（ステップＳ２５）。
【０１０５】
ステップＳ２５において、検証対象をセキュリティ関数と判定した場合（ステップＳ２５；Ｙｅｓ）、属性定義検証部３１４は、各変数に定義された保護属性に基づいて、セキュリティ関数の入出力に係る実引数の保護属性、非セキュリティ関数の入出力に係る実引数の保護属性を特定した後、この実引数の保護属性に対応するセキュリティ関数を、当該関数について多重定義されたセキュリティ関数の型から特定する（ステップＳ２６）。
【０１０６】
ここで、ステップＳ２６の処理について例を参照しながら説明する。図１３に示したセキュリティ関数の定義では、公開鍵署名検証にセキュリティ関数が多重定義（公開鍵暗号化Ａ、Ｂ）されている。ここで、署名入力と出力文の保護属性は２つの場合で異なるが、検証用公開鍵の保護属性は何れの場合も「ｖeｒｉｆｉｅｄ」属性となっている。
【０１０７】
一方、図１１に示した疑似プログラム３２行目の公開鍵検証用のセキュリティ関数（ＰｕｂｌｉｃＶｅｒｉｆｙＲＳＡ）において、実引数となる「ＰｕｂＫｅｙ＿ＣＡ」の保護属性は「ｖｅｒｉｆｉｅｄ」属性となっており（２行目で宣言）、仮引数と一致している。また、多重定義に依存する署名入力と出力文とにあたる実引数「Ｃａｎｄ＿Ｉｎｐｕｔ」、「Ｃｅｒｔ＿Ａｃｃｅｐｔ」の保護属性は夫々「ｅｘｐｏｓｅｄ」属性、「ｖｅｒｉｆｉｅｄ」属性となっている（１８、１９行目で宣言）。属性定義検証部３１４は、これら入出力にかかる保護属性から、疑似プログラム３２行目のセキュリティ関数が図１３に示したセキュリティ関数の定義における公開鍵署名検証Ｂの定義に一致すると判断し、公開鍵署名検証Ｂと特定する。
【０１０８】
このように、属性定義検証部３１４は、ステップＳ２６において、プログラムリストの宣言部分に定義された各変数の属性に基づいて、当該プログラムリストに含まれたセキュリティ関数に係る引数の保護属性が、セキュリティ関数リストに含まれたセキュリティ関数の型の何れかの定義と一致するか否かを判定する。
【０１０９】
ステップＳ２６の処理の結果、属性定義検証部３１４が、検証対象のセキュリティ関数がセキュリティ関数セットに定義されたセキュリティ関数の型と一致すると判定した場合には（ステップＳ２８；Ｙｅｓ）、ステップＳ２９の処理に移行する。また、ステップＳ２６の処理の結果、属性定義検証部３１４が、検証対象のセキュリティ関数がセキュリティ関数セットに定義されたセキュリティ関数の型と一致しないと判定した場合には（ステップＳ２８；Ｎｏ）、ステップＳ３０の処理に移行する。
【０１１０】
一方、ステップＳ２５において、検証対象が演算式や非セキュリティ関数等のセキュリティ関数以外と判定した場合（ステップＳ２５；Ｎｏ）、属性定義検証部３１４は、この検証対象に係る全ての演算、非セキュリティ関数呼び出しの実引数が、セキュリティ関数セット（代入時変換ルール、非セキュリティ関数リスト）に定義されたとおり、同一の保護属性を有するか否かを判定する（ステップＳ２７）。
【０１１１】
ステップＳ２７の処理の結果、属性定義検証部３１４が、検証対象に含まれる全ての演算に関わる変数および定数と、非セキュリティ関数呼び出しの実引数が同一の保護属性を有すると判定した場合（ステップＳ２８；Ｙｅｓ）、ステップＳ２９の処理に移行する。また、ステップＳ２７の処理の結果、属性定義検証部３１４が、検証対象に含まれる全ての演算に関わる変数および定数と、非セキュリティ関数呼び出しの実引数が同一の保護属性を有さないと判定した場合には（ステップＳ２８；Ｎｏ）、ステップＳ３０の処理に移行する。
【０１１２】
ステップＳ２９では、属性定義検証部３１４が、ステップＳ２３で分割された全ての部分処理を検証対象としたか否かを判定し、未処理の部分処理が存在すると判定した場合（ステップＳ２９；Ｎｏ）、ステップＳ２４に再び戻り、未処理の部分処理を検証対象として選択する。また、ステップＳ２９において、全ての部分処理を処理対象としたと判定した場合には（ステップＳ２９；Ｙｅｓ）、本処理を終了する。
【０１１３】
また、ステップＳ３０では、属性定義検証部３１４が、ステップＳ２８で保護属性が不一致と判定された箇所を報知するエラー情報を出力した後（ステップＳ３０）、本処理を終了する。
【０１１４】
ここで、保護属性検証処理による誤り検出の効果を確認するため、プログラマが秘密鍵「ＰｒｖＫｅｙ＿Ｂ」に誤った保護属性を与えた場合を考える。仮に秘密鍵に「ｅｘｐｏｓｅｄ」属性を与えた場合、その変数は非保護メモリ領域に配置されるためメモリを参照できる攻撃者は自由にその内容を閲覧、改ざんできてしまう。また、「ｖｅｒｉｆｉｅｄ」属性、「ｃｏｎｃｅａｌｅｄ」属性であっても、保護メモリ領域が「ｖｅｒｉｆｉｅｄ」属性用で且つ完全性保護に用いられる場合や「ｃｏｎｃｅａｌｅｄ」属性用で且つ機密性保護に用いられる場合には、機密性又は完全性が損なわれる虞がある。
【０１１５】
保護属性検証処理により保護属性の誤りが検出可能であることを、図１１の擬似プログラムリストから作成した図１６の表を用いて説明する。ここで、図１６は、図１５の保護属性検証処理を用いて導出された保護属性と誤り検出結果とを示した図である。同図において、各行が疑似プログラムリスト中に定義された変数またはパラメータに対応しており、「定義」の列はその変数又はパラメータが定義されたプログラム行(Ｌ２は２行目を表す)を示している。続く列において「変数名」、「備考」、「保護属性」、「意味」を夫々示している。
【０１１６】
さらに、続く列にはプログラムリスト中において、「定義」及び「変数名」に示した行の変数又はパラメータの「保護属性」を夫々「ｅｘｐｏｓｅｄ」属性、「ｖｅｒｉｆｉｅｄ」属性、「ｃｏｎｃｅａｌｅｄ」属性、「ｃｏｎｆｉｄｅｎｔｉａｌ」属性に書き換えた場合での保護属性検証処理の検査結果を示している。なお、「ｆｉｘｅｄ」、「ｈｉｄｄｅｎ」の２属性については本プログラムで使用していないため省略している。
【０１１７】
同図から明らかなように、例えばプログラムリスト中の３行目で定義された「ＰｒｖＫｅｙ＿Ｂ」の保護属性を夫々「ｅｘｐｏｓｅｄ」属性、「ｖｅｒｉｆｉｅｄ」属性、「ｃｏｎｃｅａｌｅｄ」属性としたときは検査結果がエラーとなり、正規の「ｃｏｎｆｉｄｅｎｔｉａｌ」としたときのみ検査に成功することを意味している。続く「エラー行」の列には、検査失敗が検出されたプログラム行、即ち、ステップＳ３１の処理で保護属性の不一致箇所が報知されるエラー情報が示されている。
【０１１８】
「ＰｒｖＫｅｙ＿Ｂ」以外の変数でも同様の結果が得られており、各変数に与える保護属性がプロトコルの検討により正しく与えられていれば、１個の変数の保護属性を誤って与えたとしても、その誤りを検出することが可能である。もし秘密鍵に「ｅｘｐｏｓｅｄ」属性が誤って与えられ、その誤りが見逃された場合、秘密鍵が非保護のメモリ領域に配置されることになるため、機密情報が漏洩する原因となる。しかしながら、上記した保護属性検証処理の適用により、プログラマが単純ミスにより一つの変数の保護属性を誤って記述してしまったとしても、その誤りを未然に検出して情報漏洩等の不具合を回避することができる。
【０１１９】
以上のように、本実施形態のプログラム開発装置３００によれば、プログラムリストに記述されたセキュリティ関数の入出力に係る引数の保護属性が、本来規定されたとおりの保護属性と一致するか否かを判定し、不一致が確認された場合その旨を示したエラー情報を出力するため、プログラムリストに記述された保護すべきデータの保護の仕方の正当性を検証することができる。
【０１２０】
なお、上述した保護属性検証処理の手順はバッファオーバーフロー等の脆弱性を排除することが目的ではないため、適用にあたっては既存の脆弱性を排除するための技術を併用することが好ましい。特に、未初期化の変数の使用はプロトコルの健全性にとって危険であるが、上記手順には含まれないため別途対策を行うことが好ましい。
【０１２１】
［第２の実施形態］
第１の実施形態では、プログラムリストに記述された一連の処理をセキュリティ関数に基づいて分割した部分処理単位で行う態様を説明したが、他の方法で行うことも可能である。第２の実施形態では、プログラムリスト中のデータの流れを表すデータフロー図をセキュリティ関数に基づいて分割し、これら分割した部分データフロー単位で保護属性の誤り解析を行う態様を説明する。なお、第１の実施形態のプログラム開発装置と同様の要素については、同じ符号を付与しその説明を省略する。
【０１２２】
図１７は、第２の実施形態に係るプログラム開発装置３００の機能的構成を示したブロック図である。同図に示したように、本実施形態のプログラム開発装置３００は、ＣＰＵ３１と、ＲＯＭ３４又は記憶部３６に記憶された所定のプログラムとの協働により実現される機能部として、関数セット読出部３１１と、プログラムリスト解析部３１２と、データフロー生成部３１５と、データフロー分割部３１６と、属性定義検証部３１７とを備えている。
【０１２３】
データフロー生成部３１５は、プログラムリスト解析部３１２による解析結果に基づいて、プログラムリストに記述された各処理でのデータの流れを表したデータフロー図を生成する。
【０１２４】
図１８は、データフロー生成部３１５により生成されたデータフローグラフの一例を示した図であって、図１１に示した疑似プログラムリストで実行される処理のデータフローを表している。同図において、Ｉｎｐｕｔ及びＯｕｔｐｕｔの非セキュリティ関数により行われる外部入力・出力は、図中左側Ｄ１１、Ｄ１３、Ｄ１７で表されている。これらは、図５に示したＤ１、Ｄ３、Ｄ７の動作に夫々対応するものである。
【０１２５】
Ｉｎｐｕｔ及びＯｕｔｐｕｔ以外の非セキュリティ関数は、図中６角形（亀甲型）のシンボルで表されている。また、セキュリティに関連した定数（機密値）及びビットフィールドやサイズを示すパラメータは、四角形（矩形）のシンボルで表されている。なお、図中「ＫｐＣＡ」、「ＫｓＢ」、「Ｍｓｇ（ＳｅｃｒｅｔＭｅｓｓａｇｅ）」は、図５に示した同名のデータと対応するものである。
【０１２６】
セキュリティ関数のうち、公開鍵署名に係るＤ１２、Ｄ１５は６角形（矢尻型）のシンボルで表されており、公開鍵復号および共通鍵暗号化に係るＤ１４、Ｄ１６は５角形のシンボルで表されている。なお、Ｄ１２、Ｄ１４、Ｄ１５、Ｄ１６は、図５に示したＤ２、Ｄ４、Ｄ５、Ｄ６に夫々対応するものである。
【０１２７】
図１７に戻り、データフロー分割部３１６は、データフロー生成部３１５により生成されたデータフローグラフをセキュリティ関数の入出力単位で分割し、複数の部分データフローを生成すると、これら各部分データフローを構成する要素（構成要素）を対応する属性情報とともにデータフローテーブルに登録する。また、データフロー分割部３１６は、後述する保護属性検証処理において逐次決定される実引数を保持するための関数多重定義テーブルを生成する。
【０１２８】
以下、図１８、１９を参照して、データフロー分割部３１６の動作について説明する。図１８に示した一繋がりのフローグラフをセキュリティ関数の入出力単位で分割した場合、図１９の表（データフローテーブル）に示した１０個の部分フローグラフに分割することができる。ここで、各部分フローグラフの端点は、入力、出力、初期値（非保護、保護）、セキュリティ関数の引数の５項目のうち必ず何れかとなっている。
【０１２９】
図１９では、図１８に示した入出力、セキュリティ関数、入出力関数についてはその符号を「＃符号＿変数名」の形で表している。特に、関数の場合「＃符号＿変数名（＃引数の符号）」として引数を表記している。これは各引数の保護属性の違いを明確化するためである。また、入出力関数も引数の符号を同様に記載しているが、これもどの変数がプログラムに対する明示的な入力であり、どの変数が出力であるかを明示するためである。変数レベルでプログラムの入出力を見たとき、単なる入力だけの操作であっても、ＯＳ１４に対して入力バッファのサイズやパラメータなどの暗黙の出力がなければ操作は行えない。入力の関数であっても一部の変数については出力操作が行われており、引数の明示はこの区別を厳密に行うためのものである。
【０１３０】
一方、ビットフィールド操作関数の「Ｅｘｔｒａｃｔ」、「Ｃｏｎｃａｔ」関数は、ＯＳシステムコールを呼ばない当該プログラム内部に閉じた操作のため、図１９では引数を省略して記載している。本プログラムでは使用されていないが、演算子形式で記述される演算についても同様に扱うことができる。
【０１３１】
分割された部分データフローについて具体的に説明する。図１９において、部分データフロー番号１では、Ｉｎｐｕｔ関数Ｄ１１の第１引数からはじまり、入力操作の実行により変数ｂｕｆに代入されたＰａｒａｍ１が、非セキュリティ関数Ｅｘｔｒａｃｔに入力される。定数Ｐａｒａｍ１により指定されたビットフィールドが取り出され、変数Ｃａｎｄ＿Ｉｎｐｕｔに代入される。続いてＣａｎｄ＿Ｉｎｐｕｔは、Ｐｕｂｌｉｃ＿Ｖｅｒｉｆｙ＿ＲＳＡ（＃１）で表されるＰｕｂｌｉｃＶｅｒｉｆｙＲＳＡ関数Ｄ１２の第１引数として入力される。ＰｕｂｌｉｃＶｅｒｉｆｙＲＳＡ関数Ｄ１２はセキュリティ関数なので、ここで区切られている。
【０１３２】
また、部分データフロー番号２では、初期値である公開鍵ＫｐＣＡがそのまま＃Ｄ１２＿ＰｕｂｌｉｃＶｅｒｉｆｙＲＳＡ（＃２）の引数として代入されており、構成要素が２個の部分データフローとなっている。
【０１３３】
部分データフロー番号３では、ＰｕｂｌｉｃＶｅｒｉｆｙＲＳＡ関数Ｄ１２の出力である第３引数が、変数Ｃｅｒｔ＿Ａｃｃｅｐｔ＿Ａに代入され、定数Ｐａｒａｍ２に基づいてＥｘｔｒａｃｔ関数により所定のビットフィールドが取り出され、ＰｕｂＫｅｙ＿Ａに代入され、ＰｕｂｌｉｃＶｅｒｉｆｙＲＳＡ関数Ｄ１５の第２引数として入力される。
【０１３４】
このように、データフロー分割部３１６は、データフロー生成部３１５により生成されたデータフローグラフをセキュリティ関数の入出力関係に基づいて分割し、複数の部分フローグラフを生成する。
【０１３５】
属性定義検証部３１７は、データフロー分割部３１６で分割された各部分データフローを順次検証対象とし、この検証対象での実引数の保護属性が、セキュリティ関数セットに定義された保護属性と一致するか否かを判定し、一致しないと判定した場合、その不一致となった箇所を指示するエラー情報を出力する。
【０１３６】
以下、図２０、２１を参照して、第２の実施形態に係るプログラム開発装置の動作について説明する。はじめに、図２０のフローチャートを用いて、セキュリティ関数が多重定義をもたないものとした場合の概略手順を説明した後、図２１のフローチャートを用いて、セキュリティ関数が多重定義を有する場合の手順を詳細に説明する。
【０１３７】
図２０は、本実施形態に係る保護属性検証処理の概略手順を示したフローチャートである。まず、関数セット読出部３１１は、記憶部３６に記憶されたセキュリティ関数セットを読み出す（ステップＳ４１）。次いで、プログラムリスト解析部３１２は、検証対象のプログラムリストを参照し、当該プログラムリスト中に記述された宣言部分を解析することで変数やパラメータに与えられた保護属性を取得する（ステップＳ４２）。
【０１３８】
続いて、データフロー生成部３１５は、検証対象のプログラムリストを参照し、当該プログラムリストに記述された処理のデータフローグラフを生成する（ステップＳ４３）。次いで、データフロー分割部３１６は、このデータフローグラフをセキュリティ関数の入出力関係に基づいて分割すると（ステップＳ４４）、分割した各部分データフローをデータフローテーブルに登録するとともに、ステップＳ４２で取得された保護属性に基づいて、各部分データフローの構成要素に保護属性を対応付けて登録する（ステップＳ４５）。
【０１３９】
属性定義検証部３１７は、データフローテーブルに登録された一の部分データフローを検証対象とすると（ステップＳ４６）、検証対象を構成する構成要素の保護属性がセキュリティ関数セットに定義された保護属性に一致するか否かを判定する（ステップＳ４７）。なお、ステップＳ４７での保護属性の一致判定は、上述した属性定義検証部３１４での動作と同様であるため説明は省略する。
【０１４０】
具体的に、属性定義検証部３１７は、構成要素として含まれた各変数に定義された保護属性に基づいて、セキュリティ関数の入出力に係る実引数の保護属性や非セキュリティ関数の入出力に係る実引数の保護属性を特定する。また、セキュリティ関数の入出力に係る実引数の保護属性が、当該セキュリティ関数名に対応するセキュリティ関数リストでのセキュリティ関数の型の引数の保護属性と一致するか否かを判定する。なお、非セキュリティ関数における保護属性の変換が、図７に示した代入時変換ルールで規定された保護属性の変換則に適合するか否かの判定を併せて行う態様としてもよい。
【０１４１】
ステップＳ４７の処理の結果、全ての構成要素の保護属性がセキュリティ関数セットに定義された保護属性と一致すると判定した場合には（ステップＳ４８；Ｙｅｓ）、属性定義検証部３１７は、データフローテーブルから検証対象の部分データフローを削除した後（ステップＳ４９）、当該データフローテーブルが空か否かを判定する（ステップＳ５０）。
【０１４２】
ステップＳ５０において、データフローテーブルが空でないと判定した場合（ステップＳ５０；Ｎｏ）、属性定義検証部３１７は、ステップＳ４６の処理へと再び戻り、データフローテーブルに登録された一の部分データフローを検証対象に決定する。また、ステップＳ５０において、データフローテーブルが空と判定した場合には（ステップＳ５０；Ｙｅｓ）、本処理は終了する。
【０１４３】
一方、ステップＳ４７の処理の結果、セキュリティ関数セットで定義された保護属性と一致しない構成要素が存在すると判定した場合には（ステップＳ４８；Ｎｏ）、属性定義検証部３１７は、この保護属性が不一致の箇所を報知するエラー情報を出力した後（ステップＳ５１）、本処理を終了する。
【０１４４】
なお、上記の処理では、セキュリティ関数以外についての保護属性の検証は、夫々分割された部分データフローで行われることになる。これにより、セキュリティ関数以外では異なる保護属性を持つ変数・定数間の演算が行われないことを確認することができるため、機密データの漏洩や攻撃者により改変されたデータによって保護対象のデータが汚染されることを防止することができる。
【０１４５】
例えば、ＡＮＤ演算によりビットフィールドをマスクした後シフトしてフォーマット変換を行うビットフィールド演算において、パラメータを攻撃者が自由に操作できる場合を考える。当該プログラム内で既に検証済みのデジタル証明書から公開鍵を取り出すときにこのような攻撃が行われてしまうと、本来の公開鍵以外のフィールドを公開鍵として利用させることが可能となる。これが有効な攻撃になるかどうかは証明書の形式等、個々のプロトコルに依存するが、一般にプロトコル設計において検証処理完了後に上記のような攻撃が行われることが想定されていない以上、攻撃の排除がプログラムの実装レベルにおいて行われなければならない。上述した保護属性検証処理は、このような攻撃の排除をプログラムの実装レベルにおいて行うものであって、プログラマの負荷を軽減しつつその実現手段を提供するものである。
【０１４６】
次に、図２１のフローチャートを参照して、セキュリティ関数が多重定義を有する場合の保護属性検証処理の手順について説明する。なお、本処理において、ステップＳ６１〜Ｓ６５の処理は、図２０のステップＳ４１〜Ｓ４５の処理と同様であるため、その説明は省略する。
【０１４７】
ステップＳ６６において、データフロー分割部３１６は、検証対象のプログラムリスト中に含まれた各関数のうち、多重定義を持つ関数の呼び出し毎に、後述する処理で決定した実引数の保護属性を保持するための関数多重定義テーブルを生成する（ステップＳ６６）。ここで、注意すべき点は、関数多重定義テーブルへのエントリは、多重定義関数の各々の呼び出し毎に登録されることであり、多重定義関数の種別毎に登録されるのではないことである。例えば、図１１に示した疑似プログラムリストでは、３２行目と４３行目で「ＰｕｂｌｉｃＶｅｒｉｆｙＲＳＡ」関数が２回呼び出されているが、この場合、この呼び出し数に対応して関数多重定義テーブルに２個登録されることになる。
【０１４８】
初期状態ではデータフローテーブルは上述と同様、全ての部分データフローが格納される。関数多重定義テーブルには、Ｄ１２、Ｄ１４、Ｄ１５、Ｄ１６の各セキュリティ関数と、入出力関数を除く非セキュリティ関数が格納される。セキュリティ関数の引数の保護属性は、引数毎に異なるが、非セキュリティ関数では全て同一の保護属性をとる。セキュリティ関数の実引数には鍵値のように保護属性があらかじめ決定されているものとそうでないものとがある。入出力関数の保護属性は必ず「ｅｘｐｏｓｅｄ」、「ｆｉｘｅｄ」、「ｖｅｒｉｆｉｅｄ」の何れかに限定される。
【０１４９】
続くステップＳ６７において、属性定義検証部３１７は、データフローテーブルに登録された部分データフローの一つを検証対象とすると（ステップＳ６７）、セキュリティ関数セットに定義された保護属性に基づいて、検証対象を構成する構成要素（セキュリティ関数）の保護属性の一致判定が可能か否かを判定する（ステップＳ６８）。
【０１５０】
以下、ステップＳ６８の処理について説明する。図１８に示したデータフローグラフでは、関数に渡される引数は全て明示的に保護属性が宣言された変数が使われている。この場合には、他の構成要素と変数の保護属性が一致するか否かを判定することが可能である。
【０１５１】
例えば、図１９のデータフローテーブルにおいて、部分データフロー番号１ではセキュリティ関数の仮引数＃Ｄ１２＿ＰｕｂｌｉｃＶｅｒｉｆｙＲＳＡ（＃１）は、多重定義を持つため保護属性は一意に決まらない。だが、明示的に保護属性「ｅｘｐｏｓｅｄ」が宣言された変数Ｃａｎｄ＿Ｉｎｐｕｔが実引数として仮引数に代入されているため、上記変数の保護属性「ｅｘｐｏｓｅｄ」との一致を調べることで当該部分データフロー内の保護属性が一致しているか否かの判定が可能となる。上記にあてはまらない多重定義を持つ関数のみで構成されている等、部分データフロー内で上記判定が不可能、即ち、保護属性が一致するか否かを判定することが不可能な場合については後述する。
【０１５２】
ステップＳ６８において、検証対象を構成する構成要素の保護属性の一致判定が可能と判定した場合（ステップＳ６８；Ｙｅｓ）、属性定義検証部３１７は、検証対象を構成する構成要素のうち、一意決定済みの構成要素について保護属性がセキュリティ関数リスト中の定義に一致するか否かを判定する（ステップＳ６９）。ここで「一意決定済みの構成要素」とは、明示的に保護属性が与えられた変数か、他の部分データフローの解析における関数の多重定義解決により、保護属性が決定された仮引数を意味する。なお、ステップＳ６９の判定処理は、上述したステップＳ２６の判定処理と同様であるため、説明は省略する。
【０１５３】
部分データフローに未決定の多重定義関数の引数が存在する場合は、他の部分データフローの処理等より既に決定済みの保護属性が、未決定の多重定義関数の引数の保護属性候補と一致するか否かが判定される。このようにして部分データフロー中の全ての構成要素について保護属性が一意決定される。以下、このように決定された保護属性を当該部分データフローの確定保護属性という。
【０１５４】
例えば、上記の＃Ｄ１２＿ＰｕｂｌｉｃＶｅｒｉｆｙＲＳＡ（＃１）の場合、ＰｕｂｌｉｃＶｅｒｉｆｙＲＳＡ関数Ｄ１２の第１引数に「ｅｘｐｏｓｅｄ」属性が定義されており、部分データフローには他の未決定な多重定義関数引数がないため、セキュリティ関数リスト中の定義との一致判定を行うことが可能である。
【０１５５】
ステップＳ６９の処理の結果、何れか一つでも不一致があった場合（ステップＳ７０；Ｎｏ）、属性定義検証部３１７は、この保護属性が不一致の箇所を報知するエラー情報を出力した後（ステップＳ７１）、本処理を終了する。
【０１５６】
一方、ステップＳ６９の処理の結果、全ての構成要素で保護属性が一致した場合（ステップＳ７０；Ｙｅｓ）、属性定義検証部３１７は、検証対象の部分データフローに含まれた未決定の多重定義関数の引数について、多重定義関数テーブルの対応フィールドに確定保護属性を登録する（ステップＳ７２）。ここで、一つの引数の保護属性が一意決定されたことで、その関数の多重定義に基づいて他の引数の保護属性が派生的に一意決定できるような場合（これは、部分データフローの確定保護属性とは必ずしも一致しない場合がある）には、その引数に対応するデータフローテーブルのフィールドに、派生的に一意決定した保護属性を登録するものとする。
【０１５７】
例えば、図１９の部分データフロー番号１の場合、確定保護属性の登録として、関数多重定義テーブルの＃Ｄ１２＿ＰｕｂｌｉｃＶｅｒｉｆｙＲＳＡ（＃１）に対応するフィールドに「ｅｘｐｏｓｅｄ」属性が登録される。また、ＰｕｂｌｉｃＶｅｒｉｆｙＲＳＡ関数Ｄ１２の多重定義から、＃３引数の保護属性が「ｖｅｒｉｆｉｅｄ」に一意決定され、＃Ｄ１２＿ＰｕｂｌｉｃＶｅｒｉｆｙＲＳＡ（＃３）に対応するフィールドに登録されることで、この引数の保護属性が一意決定済みとなる。
【０１５８】
続く、ステップＳ７２において、属性定義検証部３１７は、データフローテーブルから検証対象の部分データフローを削除した後（ステップＳ７３）、当該データフローテーブルが空か否かを判定することで、全ての部分データフローを検証対象としたか否かを判定する（ステップＳ７４）。
【０１５９】
ステップＳ７４において、データフローテーブルが空でないと判定した場合（ステップＳ７４；Ｎｏ）、属性定義検証部３１７は、ステップＳ６６の処理へと再び戻り、データフローテーブルに登録された一の部分データフローを検証対象に決定する。また、ステップＳ７４において、データフローテーブルが空と判定した場合には（ステップＳ７４；Ｙｅｓ）、本処理は終了する。
【０１６０】
なお、ステップＳ６８において、検証対象を構成する構成要素の保護属性の一致判定が不可能と判定した場合（ステップＳ６８；Ｎｏ）、属性定義検証部３１７は、ステップＳ６７の処理へと再び戻り、データフローテーブルに登録された他の部分データフローを検証対象とする。その後、他の部分データフローについてステップＳ６９以下の処理が順次行われ、その処理結果に伴い関数多重定義テーブルが更新されて行くことで、関連する関数の引数の保護属性が一意決定されることになる。つまり、処理が進むにつれ関数多重定義テーブルの未決定状態の引数のフィールドは一意決定済みのものが増加し、全ての部分データフローの検査が完了するまでに全てのフィールドが一意決定済みとなる。
【０１６１】
なお、図１１の疑似プログラムリストでは上記のケースは発生しないが、図２２に示したプログラムリストの断片では決定不可能な部分データフローが存在する。以下、図２２を参照して、保護属性の一致判定が不可能な場合について説明する。
【０１６２】
図２２は、属性定義検証部３１７の動作を説明するための図であって、所定のプログラムリストの一部分を示している。同図において、ＰｈｙｓｉｃａｌＲａｎｄｏｍ関数は引数をとらない乱数発生関数であり、「ｃｏｎｆｉｄｅｎｔｉａｌ」、「ｃｏｎｃｅａｌｅｄ」、「ｖｅｒｉｆｉｅｄ」の３種類の戻り値が多重定義されているものとする。
【０１６３】
ＣｏｍｍｏｎＫｅｙＥｎｃｒｙｐｔ関数の第１引数として、ＰｈｙｓｉｃａｌＲａｎｄｏｍ関数が直接呼び出されており、このプログラム片を分割した部分データフローには、ＰｈｙｓｉｃａｌＲａｎｄｏｍ関数の戻り値と、ＣｏｍｍｏｎＫｅｙＥｎｃｒｙｐｔ関数の第１引数とが構成要素として含まれる。これらはどちらも多重定義されているため、単独での一致判定は不可能である。
【０１６４】
そこで、ＣｏｍｍｏｎＫｅｙＥｎｃｒｙｐｔの第３引数を含む部分データフローを解析すると、変数Ｏｍｓｇが「ｅｘｐｏｓｅｄ」属性と定義されているため、ＣｏｍｍｏｎＫｅｙＥｎｃｒｙｐｔの第１引数の保護属性は、図１３におけるＣｏｍｍｏｎＥｎｃｒｙｐｔＡＥＳの型から、「ｃｏｎｓｅａｌｅｄ」に一意決定される。その結果、ＰｈｙｓｉｃａｌＲａｎｄｏｍ関数の戻り値の保護属性は、「ｃｏｎｃｅａｌｅｄ」に一意決定することができる。
【０１６５】
以上のように、本実施形態のプログラム開発装置３００によれば、プログラムリストに記述されたセキュリティ関数の入出力に係る引数の保護属性が、本来規定されたとおりの保護属性と一致するか否かを判定し、不一致が確認された場合その旨を示したエラー情報を出力するため、プログラムリストに記述された保護すべきデータの保護の仕方の正当性を検証することができる。
【０１６６】
なお、関数戻り値の多重定義は、Ｃ＋＋やＪａｖａのような既存言語には存在しないが、ＨＡＳＫＥＬのような一部の言語に含まれる仕様である。本実施形態では、図１１に示したような擬似的な言語仕様に適用した場合を説明したが、これに限らず、言語仕様に応じて保護属性を拡張することで、広い範囲の言語仕様に適用させることが可能である。
【０１６７】
［第３の実施形態］
第３の実施形態では、上述した属性定義検証をプログラムリストのコンパイラ動作時に実行する態様について説明する。なお、第１、第２の実施形態のプログラム開発装置と同様の要素については、同じ符号を付与しその説明を省略する。
【０１６８】
図２３は、第３の実施形態に係るプログラム開発装置３００の機能的構成を示したブロック図である。同図に示したように、本実施形態のプログラム開発装置３００は、ＣＰＵ３１と、ＲＯＭ３４又は記憶部３６に記憶された所定のプログラムとの協働により実現される機能部として、関数セット読出部３１１と、プログラムリスト解析部３１２と、処理内容分割部３１３と、属性定義検証部３１４と、コンパイラ部３１８とを備えている。
【０１６９】
コンパイラ部３１８は、プログラムリストのコンパイルを行い、コンピュータが実行することが可能なプログラム（以下、実行可能形式プログラムという）を生成するコンパイラである。なお、コンパイラ部３１８は、ユーザから操作部３２等を介して入力される選択指示に応じ、機能検証モード又は保護属性検証モードに切り替えてコンパイルを実行するものとする。
【０１７０】
ここで、「機能検証モード」とは、保護属性を無視してコンパイルを実行することを意味する。機能検証モードが選択された場合、コンパイラ部３１８は、セキュリティ関数の処理実体であるライブラリ関数とのリンクを行い、実行可能形式プログラムを生成する。また、「保護属性検証モード」とは、プログラムリストに対し上述した属性検証処理を行った後、コンパイルを実行することを意味する。保護属性検証モードが選択された場合、コンパイラ部３１８は、プログラムリスト中の保護属性の整合性を確認した後、セキュリティ関数の処理実体であるライブラリ関数とのリンクを行い、実行可能形式プログラムを生成する。
【０１７１】
以下、図２４を参照して、第３の実施形態に係るプログラム開発装置の動作について説明する。まず、コンパイラ部３１８は、コンパイルの実行モードが機能検証モード、保護属性検証モードの何れが選択されたかを判定する（ステップＳ８１）。ここで、機能検証モードが選択されたと判定した場合（ステップＳ８１；Ｎｏ）、コンパイラ部３１８は、プログラムリストに対し保護属性を無視したコンパイルを行うことで機械語命令列を生成し（ステップＳ８２）、セキュリティ関数の処理実体であるライブラリ関数とのリンクを行うことで、実行可能形式プログラムを生成する（ステップＳ８９）。
【０１７２】
一方、ステップＳ８１において、保護属性検証モードが選択されたと判定した場合（ステップＳ８１；Ｙｅｓ）、関数セット読出部３１１が、記憶部３６に記憶されたセキュリティ関数セットを読み込むと（ステップＳ８３）、プログラムリスト解析部３１２、処理内容分割部３１３及び属性定義検証部３１４はコンパイル対象のプログラムリストに対し、保護属性検証処理を実行する（ステップＳ８４）。なお、ステップＳ８４の保護属性検証処理は、図１４で説明したステップＳ１２〜Ｓ１４の処理又は図１５で説明したステップＳ２２〜Ｓ３０の処理と同様であるため、その説明は省略する。
【０１７３】
続いて、コンパイラ部３１８は、ステップＳ８４の処理により出力されるエラー情報に基づいて、コンパイル対象のプログラムリスト中にふくまれた演算、セキュリティ関数及び非セキュリティ関数呼び出しに係る全ての保護属性が、セキュリティ関数セットに定義された保護属性に一致したか否かを判定する（ステップＳ８５）。
【０１７４】
ステップＳ８５において、保護属性の不一致が確認された場合、即ち、ステップＳ８４の処理でエラー情報が出力された場合（ステップＳ８５；Ｎｏ）、コンパイラ部３１８は、出力されたエラー情報を表示部３３等に表示することで出力した後（ステップＳ８６）、本処理を終了する。
【０１７５】
一方、ステップＳ８５において、全ての保護属性の一致が確認された場合、即ち、ステップＳ８４の処理でエラー情報が出力されなかった場合（ステップＳ８５；Ｙｅｓ）、コンパイラ部３１８は、各変数の保護属性に応じてその変数を確保する格納領域（保護メモリ領域又は非保護メモリ領域）を決定する（ステップＳ８７）。
【０１７６】
具体的に、変数の保護属性が「ｅｘｐｏｓｅｄ」の場合には、その変数の格納領域を非保護メモリ領域１３１に決定する。また、変数の保護属性が「ｆｉｘｅｄ」、「ｖｅｒｉｆｉｅｄ」、「ｈｉｄｄｅｎ」、「ｃｏｎｃｅａｌｅｄ」、「ｃｏｎｆｉｄｅｎｔｉａｌ」の場合には、その変数の格納領域を保護メモリ領域１３２に決定する。なお、ここでは、保護メモリ領域１３２が、図６に示した４つの保護種別（改ざん防止、秘匿、完全性確認、機密性）の全ての機能を有するものとしている。各保護種別のうち、何れかに特化した格納領域を夫々有するような場合には、保護属性に応じた格納領域に各変数のメモリ領域が確保される態様としてもよい。
【０１７７】
続いて、コンパイラ部３１８は、ステップＳ８７で決定した格納領域を反映した機械語命令列を生成し（ステップＳ８８）、セキュリティ関数の処理実体であるライブラリ関数とのリンクを行うことで、実行可能形式プログラムを生成する（ステップＳ８９）。
【０１７８】
以上のように、本実施形態のプログラム開発装置３００によれば、プログラムリストに記述されたセキュリティ関数の入出力に係る引数の保護属性が、本来規定されたとおりの保護属性と一致するか否かを判定し、不一致が確認された場合その旨を示したエラー情報を出力するため、プログラムリストに記述された保護すべきデータの保護の仕方の正当性をコンパイル時に検証することができる。
【０１７９】
また、機能検証モードと保護属性検証モードとを切り替えてコンパイルを行えるよう構成することで、データフロー全体に係る検査と、保護属性定義の正当性に係る検査とを切り替えて実行することができるため、開発時の便宜を図ることができる。
【０１８０】
上述した第１、第２の実施形態に開示の保護属性の検証手法、および後述する第４の実施形態に開示の保護属性の自動決定手法は、対象とするプログラムが正しくセキュリティプロトコルを実装していることを前提としている。セキュリティプログラムが誤って実装され、誤ったデータフローを対象として検査を行った場合には変数に適切な保護属性が与えられない。したがって、セキュリティプロトコルが正しく実装されていることを検証する有力な手段はそのプログラムを動作させ、テスト入力に対して正しい出力が得られるかを確認する機能検証である。つまり、本実施形態は保護属性の検証に先だって機能検証を容易に行う手段を提供するものである。
【０１８１】
なお、本実施形態では、第１の実施形態に基づいた構成としたが、これに限らず、第２の実施形態に基づいた構成としてもよい。具体的には、処理内容分割部３１３と、属性定義検証部３１４とに替えて、データフロー生成部３１５、データフロー分割部３１６、属性定義検証部３１７を備え、図２０で説明したステップＳ４２〜Ｓ５１又は図２１で説明したステップＳ６２〜Ｓ７４の処理をステップＳ８４で行うことで適用することができる。
【０１８２】
また、上記実施形態では、変数の保護属性は静的に決定されている。このようにして得られた保護属性にしたがって保護領域と非保護領域に適切に変数の格納領域を割り当てることで、安全なプログラムを作ることができるのはこれまでに説明したとおりである。ここで注意が必要なのは、保護属性の決定は静的に行われるが、変数の格納領域割り当ては必ずしも静的に行われる必要はないことである。
【０１８３】
保護属性にもとづく変数領域の割り当てを実現するとき、もっとも簡単な方法はコンパイル時に静的にメモリアドレスを決定してしまうことだが、この方法ではプログラム実行の柔軟さが損なわれメモリ利用効率が悪化する場合がある。Ｃ＋＋のようにクラスに対してコンストラクタが定義され、そこでメモリ確保が行われるようなプログラムでは、コンストラクタが当該変数の保護属性に基づくメモリ確保を行うことで安全性と柔軟性を両立させることができることを付記する。
【０１８４】
［第４の実施形態］
上述した第３の実施形態では、コンパイル時に保護属性の整合性を検証する態様を説明した。この場合、プログラムリスト中に記述される全ての変数の保護属性は、プログラマから明示的に与えられたものとなっている。第４の実施形態では、プログラマから一部の定数にのみ明示的に保護属性が与えられた場合に、他の変数の保護属性を自動的に決定することが可能な態様について説明する。なお、上述した第１、第２の実施形態のプログラム開発装置と同様の要素については、同じ符号を付与しその説明を省略する。
【０１８５】
図２５は、第４の実施形態に係るプログラム開発装置の機能的構成を示した図である。同図に示したように、本実施形態のプログラム開発装置３００は、ＣＰＵ３１と、ＲＯＭ３４又は記憶部３６に記憶された所定のプログラムとの協働により実現される機能部として、関数セット読出部３１１と、プログラムリスト解析部３１２と、データフロー生成部３１５と、データフロー分割部３１９と、属性定義検証部３２０とを備えている。
【０１８６】
データフロー分割部３１９は、データフロー分割部３１６と同様の機能を有するとともに、プログラムリストに含まれた各変数、パラメータについて、一意決定された保護属性を保持するためのオブジェクト保護属性テーブルを生成する。
【０１８７】
属性定義検証部３２０は、属性定義検証部３１７と同様の機能を有するとともに、後述する保護属性決定処理において逐次決定される各変数、パラメータの保護属性をオブジェクト保護属性テーブルに登録する。
【０１８８】
以下、図２６を参照して、第４の実施形態に係るプログラム開発装置の動作について説明する。図２６は、保護属性決定処理の手順を示したフローチャートである。なお、本処理において、ステップＳ９１〜Ｓ９５の処理は、図２１のステップＳ６１〜Ｓ６５の処理と同様であるため、その説明は省略する。
【０１８９】
ステップＳ９６において、データフロー分割部３１９は、上述した関数多重定義テーブルを生成するとともに、プログラムリストに含まれた各変数、パラメータについて、一意決定される保護属性を保持するためのオブジェクト保護属性テーブルを生成する（ステップＳ９６）。
【０１９０】
次いで、属性定義検証部３２０は、データフローテーブルに登録された一の部分データフローを検証対象とすると（ステップＳ９７）、セキュリティ関数セットに定義された保護属性に基づいて、検証対象を構成する構成要素の保護属性の一致判定が可能か否かを判定する（ステップＳ９８）。ここで、検証対象を構成する構成要素の保護属性の一致判定が不可能と判定した場合（ステップＳ９８；Ｎｏ）、属性定義検証部３２０は、ステップＳ９７の処理へと再び戻り、データフローテーブルに登録された他の部分データフローを検証対象とする。
【０１９１】
一方、ステップＳ９８において、検証対象を構成する構成要素の保護属性の一致判定が可能と判定した場合（ステップＳ９８；Ｙｅｓ）、属性定義検証部３２０は、検証対象を構成する構成要素のうち、一意決定済みの構成要素について保護属性がセキュリティ関数リスト中の定義に一致するか否かを判定する（ステップＳ９９）。
【０１９２】
ステップＳ９９の処理の結果、何れか一つでも不一致があった場合（ステップＳ１００；Ｎｏ）、属性定義検証部３２０は、保護属性が不一致となった箇所を表示部３３に表示させた後（ステップＳ１０１）、本処理を終了する。
【０１９３】
一方、ステップＳ９９の処理の結果、全ての構成要素で保護属性が一致した場合（ステップＳ１００；Ｙｅｓ）、属性定義検証部３２０は、検証対象の部分データフローに含まれた未決定の多重定義関数の引数について、多重定義関数テーブル及びオブジェクト保護属性テーブルの対応フィールドに確定保護属性を登録する（ステップＳ１０２）。ここで、一つの引数の保護属性が一意決定されたことで、その関数の多重定義に基づいて他の引数の保護属性が派生的に一意決定できるような場合（これは、部分データフローの確定保護属性とは必ずしも一致しない）には、その引数の対応フィールドに派生的に一意決定した保護属性を登録するものとする。
【０１９４】
次いで、属性定義検証部３２０は、データフローテーブルから検証対象の部分データフローを削除した後（ステップＳ１０３）、当該データフローテーブルが空か否かを判定することで、全ての部分データフローを検証対象としたか否かを判定する（ステップＳ１０４）。
【０１９５】
ステップＳ１０４において、データフローテーブルが空でないと判定した場合（ステップＳ１０４；Ｎｏ）、属性定義検証部３２０は、ステップＳ９７の処理へと再び戻り、データフローテーブルに登録された一の部分データフローを検証対象に決定する。また、ステップＳ１０４において、データフローテーブルが空と判定した場合には（ステップＳ１０４；Ｙｅｓ）、本処理を終了する。
【０１９６】
なお、正常に終了した際には（ステップＳ１０４；Ｙｅｓ）、多重定義関数テーブル及びオブジェクト保護属性テーブルを出力する態様としてもよい。
【０１９７】
以下、上述した保護属性決定処理の動作例について説明する。なお、以下では検証対象のプログラムリストとして、図２７の疑似プログラムリストが用いられるものとする。ここで、図２７は、図１１に示した疑似プログラムリストの６行目〜１１行目のパラメータ、１４行目から２５行目の変数の保護属性を未決定としたものとなっている。
【０１９８】
図２８−１、図２８−２、図２８−３は、上述した保護属性決定処理の実行により、図２７の疑似プログラムリストに含まれた変数、パラメータの変数属性が逐次決定されていく過程を示した図である。ここで、各行は部分データフロー番号毎に纏められた各初期化定数、変数及び仮引数に対応している。図２８−１、図２８−２、図２８−３において、左の列から「部分データフロー番号」、「初期化定数、変数および仮引数名」、各パラメータ及び変数の初期状態における保護属性を表した「初期保護属性」が夫々示されている。なお、各保護属性において空欄は未決定の状態であることを意味している。
【０１９９】
次の列からは自動決定手順の進行、即ち各検証対象に対するステップＳ９７〜Ｓ１０４のループ処理を表している。ここで「決定対象＝Ｘ」のＸは、保護属性の決定を試みた部分データフロー番号、即ち、検証対象の部分データフローを意味している。各手順において「前」と示したものは、検証対象の部分データフロー自身の構成要素の保護属性を決定する段階を意味している。また、「後」と示したものは、検証対象の部分データフローでの保護属性の決定に伴い、他の部分データフローにおいて派生的に保護属性を決定する段階を意味している。なお、保護属性名の右端に示した丸印は、今回の手順により決定された保護属性を明示するものである。
【０２００】
例えば、部分データフロー番号１の場合、「決定対象＝１前」において、Ｉｎｐｕｔ関数の保護属性が「ｅｘｐｏｓｅｄ」に限定されている。これは、他の変数の定義と矛盾しないため、他の変数の保護属性は全て「ｅｘｐｏｓｅｄ」属性と決定され、この結果がオブジェクト保護属性テーブルに登録されている。また、多重定義された関数＃Ｄ１２＿ＰｕｂｌｉｃＶｅｒｉｆｙＲＳＡ（＃１）も「ｅｘｐｏｓｅｄ」属性と決定され、この結果が関数多重定義テーブルに書き込まれる。
【０２０１】
「決定対象＝１後」では、更新された関数多重定義テーブルに基づき、部分データフロー番号３の＃Ｄ１２＿ＰｕｂｌｉｃＶｅｒｉｆｙＲＳＡ（＃３）の保護属性が「ｖｅｒｉｆｉｅｄ」に一意決定されることになるため、この結果がオブジェクト保護属性テーブルに登録されている。また、部分データフロー番号４のｂｕｆ変数の保護属性が「ｅｘｐｏｓｅｄ」に一意決定されることになるため、この結果がオブジェクト保護属性テーブルに登録されている。以下同様の処理を繰り返すことにより、全ての変数の保護属性を矛盾なく自動決定することができる。この場合、どの部分データフローから自動決定の手順を開始しても同じ結果が得られる。
【０２０２】
以上のように、本実施形態のプログラム開発装置によれば、プログラムリストにおいて、一部の初期値に関してのみセキュリティプロトコル仕様に基づいて保護属性を明示的に与えておけば、他の作業変数の保護属性を自動的に決定することができるため、プログラム開発時の負荷を軽減することができるとともに、プログラムの開発を効率化することができる。
【０２０３】
なお、本実施形態の構成を上述した第１〜３の実施形態のプログラム開発装置３００に適用する態様としてもよい。特に、第３の実施形態のプログラム開発装置３００に適用することで、プログラム開発から実行可能形式プログラムまでの一連の工程にかかる負荷を、軽減することができる。
【０２０４】
以上、第１〜４の実施形態について説明したが、本発明はこれらに限定されるものではなく、本発明の主旨を逸脱しない範囲での種々の変更、置換、追加などが可能である。
【０２０５】
例えば、上記各実施形態の処理にかかるプログラムを、コンピュータで読み取り可能な記憶媒体として提供することも可能である。記憶媒体としては、磁気ディスク、光ディスク（ＣＤ−ＲＯＭ、ＣＤ−Ｒ、ＤＶＤ等）、光磁気ディスク（ＭＯ等）、半導体メモリ等、プログラムを記憶でき、且つ、コンピュータが読み取り可能な記憶媒体であれば、その記憶形式は何れの形態であってもよい。
【０２０６】
また、上記各実施形態の処理にかかるプログラムを、インターネット等のネットワークに接続されたコンピュータ上に格納し、ネットワーク経由でダウンロードさせることにより提供するように構成しても良い。
【図面の簡単な説明】
【０２０７】
【図１】ターゲットシステムのソフトウェア構成を示した図である。
【図２】ターゲットシステムのハードウェア構成の一例を示した図である。
【図３】ターゲットシステムのハードウェア構成の一例を示した図である。
【図４】プログラム開発装置のハードウェア構成を示した図である。
【図５】セキュリティプロトコルの一例を示した図である。
【図６】保護属性の一覧を示した図である。
【図７】保護属性間の相互代入可否の一覧を示した図である。
【図８】セキュリティ関数の定義の一例を示した図である。
【図９】署名検証用関数の構成を示した図である。
【図１０−１】非セキュリティ関数の定義の一例を示した図である。
【図１０−２】非セキュリティ関数の定義の一例を示した図である。
【図１１】プログラムリストの一例を示した図である。
【図１２】第１の実施形態に係るプログラム開発装置の機能的構成を示した図である。
【図１３】セキュリティ関数の定義の一例を示した図である。
【図１４】第１の実施形態に係る保護属性検証処理の概要を示したフローチャートである。
【図１５】第１の実施形態に係る保護属性検証処理の詳細を示したフローチャートである。
【図１６】第１の実施形態に係る変数の保護属性と誤り検出結果を示した図である。
【図１７】第２の実施形態に係るプログラム開発装置の機能的構成を示した図である。
【図１８】データフローグラフの一例を示した図である。
【図１９】部分データフローの一例を示した図である。
【図２０】第２の実施形態に係る保護属性検証処理の概要を示したフローチャートである。
【図２１】第２の実施形態に係る保護属性検証処理の詳細を示したフローチャートである。
【図２２】プログラムリストの一例を示した図である。
【図２３】第３の実施形態に係るプログラム開発装置の機能的構成を示した図である。
【図２４】第３の実施形態に係るコンパイラ動作の一例を示したフローチャートである。
【図２５】第４の実施形態に係るプログラム開発装置の機能的構成を示した図である。
【図２６】第４の実施形態に係る保護属性決定処理を示したフローチャートである。
【図２７】プログラムリストの一例を示した図である。
【図２８−１】保護属性決定処理の結果を示した図である。
【図２８−２】保護属性決定処理の結果を示した図である。
【図２８−３】保護属性決定処理の結果を示した図である。
【符号の説明】
【０２０８】
１００  ターゲットシステム
１１    プログラム実行モジュール
１１０  プログラム実行モジュール
１２    命令実行部
１２１  レジスタ
１３    データ格納用メモリ領域
１３１  非保護メモリ領域
１３２  保護メモリ領域
１４    ＯＳ
１５    命令実行部
１５１  レジスタ
１６    ＯＳ専用データ格納領域
２００  外部装置
２１０  システム
２２０  ＣＡ
３００  プログラム開発装置
３１    ＣＰＵ
３２    操作部
３３    表示部
３４    ＲＯＭ
３５    ＲＡＭ
３６    記憶部
３１１  関数セット読出部
３１２  プログラムリスト解析部
３１３  処理内容分割部
３１４  属性定義検証部
３１５  データフロー生成部
３１６  データフロー分割部
３１７  属性定義検証部
３１８  コンパイラ部
３１９  データフロー分割部
３２０  属性定義検証部
４１    ＣＰＵ
４２    メモリ
５１    ＣＰＵ
５２    ＣＰＵ
５３    メモリ
【図１】
0004976991.tif 000002
【図２】
0004976991.tif 000003
【図３】
0004976991.tif 000004
【図４】
0004976991.tif 000005
【図５】
0004976991.tif 000006
【図６】
0004976991.tif 000007
【図７】
0004976991.tif 000008
【図８】
0004976991.tif 000009
【図９】
0004976991.tif 000010
【図１０−１】
0004976991.tif 000011
【図１０−２】
0004976991.tif 000012
【図１１】
0004976991.tif 000013
【図１２】
0004976991.tif 000014
【図１３】
0004976991.tif 000015
【図１４】
0004976991.tif 000016
【図１５】
0004976991.tif 000017
【図１６】
0004976991.tif 000018
【図１７】
0004976991.tif 000019
【図１８】
0004976991.tif 000020
【図１９】
0004976991.tif 000021
【図２０】
0004976991.tif 000022
【図２１】
0004976991.tif 000023
【図２２】
0004976991.tif 000024
【図２３】
0004976991.tif 000025
【図２４】
0004976991.tif 000026
【図２５】
0004976991.tif 000027
【図２６】
0004976991.tif 000028
【図２７】
0004976991.tif 000029
【図２８−１】
0004976991.tif 000030
【図２８−２】
0004976991.tif 000031
【図２８−３】
0004976991.tif 000032